CnC_Remastered_Collection/REDALERT/GLOBALS.CPP
PG-SteveT fc5cd5a775 Command & Conquer Remastered post-launch patch
Improvements to harvester resource finding logic.

Don't allow the Advanced Comm Center to be capturable in skirmish or multiplayer.

Increased failed pathfinding fudge factor.

Buildings accept the Guard command if they can attack.

Don't allow force capturing of ally structures.

Fixes for laser Orcas in S3cr3t M1ss10n. Properly restore them after save. Reset Orcas after loads.

Fixed flag animation rendering in CTF.

Potentially fix a crash if aircraft are destroyed outside the map bounds.

Fixed legacy Obelisk line rendering.

Fix out-of-bounds crash in TD; issue was already fixed in RA.

Disable capture flag on Commandos.

Drop the flag when entering the limbo state.

Fixed end game race condition, winning team ID is always sent before individual player win/lose messages.

Fixed Chan spawn on SCB10EA.

Don't show enter cursor for enemy units on refineries and repair pads.

Changing right-click support for first put building on hold, and then subsequenct right-clicks to decrement that queue count for 1x or 5x; Then, 1x or 5x Left click will resume from hold.

Don't debug reveal legacy rendering when a player is defeated.

Fixed crash when loading saves of custom campaign maps.

Reset harvester archived target when given a direct harvest order.

Prevent NOD cargo planes from being force attacked.

Fixed unit selection on load.

Migrated queued repair pad functionality from RA to TD.

Randomly animate infantry in area guard mode.

Fixed crash accessing inactive objects.

Added some walls in SCG08EB to prevent civilians from killing themselves.

TD + RA: Audio: Overiding "Our base is under attack" cooldown timing from legacy from 2 minutes to 30 seconds, so it will be heard 4x as often.

Fixed adjacent cell out-of-bounds crash issues.

Kill player on disconnect

Fixed and improved build time calculations to be consistent between TD and RA.

Don't show health bars for cloaked Stealth Tanks in the legacy renderer.

Fix selection of individual control groups after mixed selection.

More adjustments to SCG08EB; switch C7 to C5, and add civilian AI to avoid Tiberium.

Extra safety checks for units that have no weapons and aircraft that can't hunt.

Fix loading of multiple infantry onto an APC.

Additional safety checks for invalid coordinates.

Prevent units from being instantly repaired.

Fix map passability.

Fail Allied mission 5B if the spy re-boards the starting transport (matches 5A and 5C behavior).

Fixed multiplayer formation move causing units to move at light speed.

Ignore movement destination checks if a unit is part of a mission-driven team.

Fix buffer overrun crash.

Ignore mines when determining win conditions.

Fixed river passability in Blue Lakes.
2020-06-22 09:43:21 -07:00

819 lines
28 KiB
C++

//
// Copyright 2020 Electronic Arts Inc.
//
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is free
// software: you can redistribute it and/or modify it under the terms of
// the GNU General Public License as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version.
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
// in the hope that it will be useful, but with permitted additional restrictions
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
// distributed with this program. You should have received a copy of the
// GNU General Public License along with permitted additional restrictions
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
/* $Header: /counterstrike/GLOBALS.CPP 2 3/10/97 6:22p Steve_tall $ */
/***********************************************************************************************
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
***********************************************************************************************
* *
* Project Name : Command & Conquer *
* *
* File Name : GLOBALS.CPP *
* *
* Programmer : Joe L. Bostic *
* *
* Start Date : September 10, 1993 *
* *
* Last Update : September 10, 1993 [JLB] *
* *
*---------------------------------------------------------------------------------------------*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "function.h"
bool IsVQ640 = false;
unsigned long GameVersion = 0;
bool Debug_MotionCapture = false;
bool Debug_Rotate = false; // Rotation algorithm control.
bool Debug_Quiet = false;
bool Debug_Cheat = false;
bool Debug_Remap = false;
bool Debug_Icon = false;
bool Debug_Flag = false;
bool Debug_Lose = false;
bool Debug_Win = false;
bool Debug_Map = false; // true = map editor mode
bool Debug_Passable = false; // true = show passable/impassable terrain
bool Debug_Unshroud = false; // true = hide the shroud
bool Debug_Threat = false;
bool Debug_Find_Path = false;
bool Debug_Check_Map = false; // true = validate the map each frame
bool Debug_Playtest = false;
bool Debug_Heap_Dump = false; // true = print the Heap Dump
bool Debug_Smart_Print = false; // true = print everything that calls Smart_Printf
bool Debug_Trap_Check_Heap = false; // true = check the Heap
bool Debug_Modem_Dump = false; // true = print the Modem Stuff
bool Debug_Print_Events = false; // true = print event & packet processing
bool Debug_Force_Crash = false;
TFixedIHeapClass<AircraftClass> Aircraft;
TFixedIHeapClass<AnimClass> Anims;
TFixedIHeapClass<BuildingClass> Buildings;
TFixedIHeapClass<BulletClass> Bullets;
TFixedIHeapClass<FactoryClass> Factories;
TFixedIHeapClass<HouseClass> Houses;
TFixedIHeapClass<InfantryClass> Infantry;
TFixedIHeapClass<OverlayClass> Overlays;
TFixedIHeapClass<SmudgeClass> Smudges;
TFixedIHeapClass<TeamClass> Teams;
TFixedIHeapClass<TeamTypeClass> TeamTypes;
TFixedIHeapClass<TemplateClass> Templates;
TFixedIHeapClass<TerrainClass> Terrains;
TFixedIHeapClass<TriggerClass> Triggers;
TFixedIHeapClass<UnitClass> Units;
TFixedIHeapClass<VesselClass> Vessels;
TFixedIHeapClass<TriggerTypeClass> TriggerTypes;
TFixedIHeapClass<HouseTypeClass> HouseTypes;
TFixedIHeapClass<BuildingTypeClass> BuildingTypes;
TFixedIHeapClass<AircraftTypeClass> AircraftTypes;
TFixedIHeapClass<InfantryTypeClass> InfantryTypes;
TFixedIHeapClass<BulletTypeClass> BulletTypes;
TFixedIHeapClass<AnimTypeClass> AnimTypes;
TFixedIHeapClass<UnitTypeClass> UnitTypes;
TFixedIHeapClass<VesselTypeClass> VesselTypes;
TFixedIHeapClass<TemplateTypeClass> TemplateTypes;
TFixedIHeapClass<TerrainTypeClass> TerrainTypes;
TFixedIHeapClass<OverlayTypeClass> OverlayTypes;
TFixedIHeapClass<SmudgeTypeClass> SmudgeTypes;
/*
** These are the instantiate static heap pointers for the various
** CCPtr class objects that are allowed to exist. If the linker generates
** an error about a missing heap pointer, then this indicates that CCPtr objects
** for that type are not allowed. For every case of a TFixedIHeap manager of
** game objects, then a CCPtr can be instantiated for it.
*/
#if (0) //Moved to runtime initialization. ST - 5/20/2019
template<> FixedIHeapClass * CCPtr<AircraftClass>::Heap = &Aircraft;
template<> FixedIHeapClass * CCPtr<AnimClass>::Heap = &Anims;
template<> FixedIHeapClass * CCPtr<BuildingClass>::Heap = &Buildings;
template<> FixedIHeapClass * CCPtr<BulletClass>::Heap = &Bullets;
template<> FixedIHeapClass * CCPtr<FactoryClass>::Heap = &Factories;
template<> FixedIHeapClass * CCPtr<HouseClass>::Heap = &Houses;
template<> FixedIHeapClass * CCPtr<InfantryClass>::Heap = &Infantry;
template<> FixedIHeapClass * CCPtr<OverlayClass>::Heap = &Overlays;
template<> FixedIHeapClass * CCPtr<SmudgeClass>::Heap = &Smudges;
template<> FixedIHeapClass * CCPtr<TeamClass>::Heap = &Teams;
template<> FixedIHeapClass * CCPtr<TeamTypeClass>::Heap = &TeamTypes;
template<> FixedIHeapClass * CCPtr<TemplateClass>::Heap = &Templates;
template<> FixedIHeapClass * CCPtr<TerrainClass>::Heap = &Terrains;
template<> FixedIHeapClass * CCPtr<TriggerClass>::Heap = &Triggers;
template<> FixedIHeapClass * CCPtr<TriggerTypeClass>::Heap = &TriggerTypes;
template<> FixedIHeapClass * CCPtr<HouseTypeClass>::Heap = &HouseTypes;
template<> FixedIHeapClass * CCPtr<BuildingTypeClass>::Heap = &BuildingTypes;
template<> FixedIHeapClass * CCPtr<AircraftTypeClass>::Heap = &AircraftTypes;
template<> FixedIHeapClass * CCPtr<InfantryTypeClass>::Heap = &InfantryTypes;
template<> FixedIHeapClass * CCPtr<BulletTypeClass>::Heap = &BulletTypes;
template<> FixedIHeapClass * CCPtr<AnimTypeClass>::Heap = &AnimTypes;
template<> FixedIHeapClass * CCPtr<UnitTypeClass>::Heap = &UnitTypes;
template<> FixedIHeapClass * CCPtr<VesselTypeClass>::Heap = &VesselTypes;
template<> FixedIHeapClass * CCPtr<TemplateTypeClass>::Heap = &TemplateTypes;
template<> FixedIHeapClass * CCPtr<TerrainTypeClass>::Heap = &TerrainTypes;
template<> FixedIHeapClass * CCPtr<OverlayTypeClass>::Heap = &OverlayTypes;
template<> FixedIHeapClass * CCPtr<SmudgeTypeClass>::Heap = &SmudgeTypes;
#endif
/* These variables are used to keep track of the slowest speed of a team */
TeamFormDataStruct TeamFormData[HOUSE_COUNT];
bool FormMove;
SpeedType FormSpeed;
MPHType FormMaxSpeed;
char _staging_buffer[32000];
/*
** Global flag for the life of Tanya. If this flag is set, she is
** no longer available.
*/
bool IsTanyaDead;
bool SaveTanya;
#ifdef FIXIT_ANTS
bool AntsEnabled = false;
#endif
#ifdef FIXIT_CSII // checked - ajw 9/28/98
bool NewUnitsEnabled = false;
bool SecretUnitsEnabled = false;
int MTankDistance = 15;
bool OverrideNewUnitsEnabled = false; // ST - 12/13/2019 12:21PM
#ifdef FIXIT_CARRIER // checked - ajw 9/28/98
int CarrierLaunchDelay = 60;
#endif
#endif
int NewINIFormat = 0;
bool TimeQuake;
#ifdef FIXIT_CSII // checked - ajw 9/28/98
bool PendingTimeQuake;
TARGET TimeQuakeCenter;
fixed QuakeUnitDamage=0x300;
fixed QuakeBuildingDamage=0x300;
int QuakeInfantryDamage=25;
int QuakeDelay;
fixed ChronoTankDuration=0x300; // chrono override for chrono tanks
#ifdef FIXIT_ENGINEER // checked - ajw 9/28/98
fixed EngineerDamage=0x55; // Amount of damage an engineer does
fixed EngineerCaptureLevel=0x40; // Building damage level before engineer can capture
#endif
#endif
#ifdef WIN32
unsigned short Hard_Error_Occured = 0;
WWMouseClass * WWMouse = NULL;
GraphicBufferClass SysMemPage(DEFAULT_SCREEN_WIDTH, 200, (void*)NULL);
WinTimerClass * WindowsTimer=NULL;
int ScreenWidth=3072;
int ScreenHeight=3072;
GraphicBufferClass ModeXBuff;
bool InMovie = FALSE; //Are we currently playing a VQ movie?
HANDLE hInstance;
int AllDone;
/***************************************************************************
** This is true if the game is the currently in focus windows app
**
*/
bool GameInFocus = false;
#endif
/***************************************************************************
** Encryption keys.
*/
PKey FastKey;
#ifdef CHEAT_KEYS
PKey SlowKey;
#endif
#ifdef FIXIT_NAME_OVERRIDE
/***************************************************************************
** This is where the name overrides for the units will reside.
*/
char const * NameOverride[25];
int NameIDOverride[25];
#endif
/***************************************************************************
** These are the mission control structures. They hold the information about
** how the missions should behave in the system.
*/
MissionControlClass MissionControl[MISSION_COUNT];
/***************************************************************************
** There are various tutorial messages that can appear in the game. These
** are called upon by number and pointed to by this array.
*/
char const * TutorialText[225];
/***************************************************************************
** This holds the rules database. The rules database won't change during the
** program's run, but may need to be referenced intermitently.
*/
CCINIClass RuleINI;
#ifdef FIXIT_CSII // checked - ajw 9/28/98
CCINIClass AftermathINI;
#endif
/***************************************************************************
** This points to the benchmark objects that are allocated only if the
** machine is running on a Pentium and this is a debug version.
*/
//Benchmark * Benches;
/***************************************************************************
** General rules that control the game.
*/
RulesClass Rule;
/***************************************************************************
** All keyboard input is routed through the object pointed to by this
** keyboard class pointer.
*/
KeyboardClass * Keyboard;
/***************************************************************************
** Remap control array. This is used to hold the remap
** tables for the various possible player colors, and the color schemes
** for dialogs.
*/
RemapControlType ColorRemaps[PCOLOR_COUNT];
/*
** Special remap scheme for font that hs to print over metallic tabs
*/
RemapControlType MetalScheme;
/*
** This remap table is for special purposes. It consists of dark grey shades,
** and is used for dimming things out.
*/
RemapControlType GreyScheme;
/***************************************************************************
** This is the source of the random numbers used in the game. This controls
** the game logic and thus must be in sync with any networked machines.
*/
RandomClass NonCriticalRandomNumber;
RandomStraw CryptRandom;
/***************************************************************************
** This tracks all selected objects per house (for this map).
*/
SelectedObjectsType CurrentObject;
/***************************************************************************
** This is the game version.
*/
//PG VersionClass VerNum;
/***************************************************************************
** This is the VQ animation controller structure. It is filled in by reading
** the PLAYER.INI and overridden through program control.
*/
//VQAConfig AnimControl;
int PreserveVQAScreen; // Used for screen mode transition control.
bool BreakoutAllowed = true; // "true" if aborting of movies is allowed.
bool Brokeout; // Was the movie broken out of?
bool SlowPalette = false; // Slow palette flag set?
/***************************************************************************
** These are the movie names to use for mission briefing, winning, and losing
** sequences. They are read from the INI file.
*/
ScenarioClass Scen;
/***************************************************************************
** This is the pending speech sample to play. This sample will be played
** at the first opportunity.
*/
VoxType SpeakQueue = VOX_NONE;
/***************************************************************************
** This records if the score (music) file is present. If not, then much of
** the streaming score system can be disabled.
*/
bool ScoresPresent;
/***************************************************************************
** This flag will control whether there is a response from game units.
** By carefully controlling this global, multiple responses are suppressed
** when a large group of infantry is given the movement order.
*/
bool AllowVoice = true;
/***************************************************************************
** This is the current frame number. This number is guaranteed to count
** upward at the rate of one per game logic process. The target rate is 15
** per second. This value is saved and restored with the saved game.
*/
long Frame = 0;
/***************************************************************************
** These globals are constantly monitored to determine if the player
** has won or lost. They get set according to the trigger events associated
** with the scenario.
*/
bool PlayerWins;
bool PlayerLoses;
bool PlayerRestarts;
/*
** This flag is set if the player neither wins nor loses; it's mostly for
** multiplayer mode.
*/
bool PlayerAborts;
/***************************************************************************
** This is the pointer for the speech staging buffer. This buffer is used
** to hold the currently speaking voice data. Since only one speech sample
** is played at a time, this buffer is only as big as the largest speech
** sample that can be played.
*/
void * SpeechBuffer[2];
VoxType SpeechRecord[2];
/***************************************************************************
** The theater specific mixfiles are cached into the buffer pointed to by
** this global.
*/
Buffer * TheaterBuffer;
/***************************************************************************
** This is a running accumulation of the number of ticks that were unused.
** This accumulates into a useful value that contributes to a
** histogram of game performance.
*/
long SpareTicks;
long PathCount; // Number of findpaths called.
long CellCount; // Number of cells redrawn.
long TargetScan; // Number of target scans.
long SidebarRedraws; // Number of sidebar redraws.
/***************************************************************************
** This is the monochrome debug page array. The various monochrome data
** screens are located here.
*/
MonoClass MonoArray[DMONO_COUNT];
DMonoType MonoPage = DMONO_STRESS; // The current page.
/***************************************************************************
** This holds the theater specific mixfiles.
*/
MFCD * TheaterData = 0;
MFCD * MoviesMix = 0;
MFCD * GeneralMix = 0;
MFCD * ScoreMix = 0;
MFCD * MainMix = 0;
MFCD * ConquerMix = 0;
/***************************************************************************
** This is the options control class. The options control such things as
** game speed, visual controls, and other user settings.
*/
GameOptionsClass Options;
/***************************************************************************
** Logic processing is controlled by this element. It handles both graphic
** and AI logic.
*/
LogicClass Logic;
/***************************************************************************
** This handles the background music.
*/
ThemeClass Theme;
/***************************************************************************
** This is the main control class for the map.
*/
#ifdef SCENARIO_EDITOR
MapEditClass Map;
#else
MouseClass Map;
#endif
/**************************************************************************
** The running game score is handled by this class (and member functions).
*/
ScoreClass Score;
/***************************************************************************
** The running credit display is controlled by this class (and member
** functions.
*/
CreditClass CreditDisplay;
/**************************************************************************
** This class records the special command override options that C&C
** supports.
*/
SpecialClass Special;
bool PassedProximity; // used in display.cpp
/***************************************************************************
** This is the scenario data for the currently loaded scenario.
** These variables should all be set together.
*/
HousesType Whom; // Initial command line house choice.
int ScenarioInit;
bool SpecialFlag = false;
/***************************************************************************
** This value tells the sidebar what items it's allowed to add. The
** lower the value, the simpler the sidebar will be. This value is the
** displayed value for tech level in the multiplay dialogs. It remaps to
** the in-game rules.ini tech levels.
*/
int BuildLevel = 10; // Buildable level (1 = simplest)
/***************************************************************************
** The various tutor and dialog messages are located in the data block
** referenced by this pointer.
*/
char const * SystemStrings;
char const * DebugStrings;
/***************************************************************************
** The game plays as long as this var is true.
*/
bool GameActive;
/***************************************************************************
** This is a scratch variable that is used to when a reference is needed to
** a long, but the value wasn't supplied to a function. This is used
** specifically for the default reference value. As such, it is not stable.
*/
long LParam;
#ifdef SCENARIO_EDITOR
/***************************************************************************
** The currently-selected cell for the Scenario Editor
*/
CELL CurrentCell = 0;
#endif
/***************************************************************************
** Most of the text in the game will use the six point font. These are the
** pointers to the fonts. If it is NULL, then the font hasn't been loaded
** yet.
*/
void const * Metal12FontPtr; //Font for use on in-game tabs in hires
void const * MapFontPtr; // Standard very small font.
void const * TypeFontPtr; // Teletype font for mission briefings.
void const * Font3Ptr; // Standard very small font.
void const * Font6Ptr; // Standard small font.
void const * EditorFont; // Font used for scenario editor.
void const * Font8Ptr; // 8 point proportional.
void const * FontLEDPtr; // LED fixed point font.
void const * VCRFontPtr; // VCR font pointer.
void const * ScoreFontPtr; // font for score & map selection screens
void const * GradFont6Ptr; // gradient 6 point font pointer.
/***************************************************************************
** This is the house that the human player is currently playing.
*/
HouseClass * PlayerPtr;
/***************************************************************************
** Special palettes for MCGA mode goes here. These palette buffers are used
** for pictures that do not use the game palette or are used for fading to
** black.
*/
PaletteClass CCPalette;
PaletteClass GamePalette;
//PaletteClass InGamePalette;
PaletteClass BlackPalette(RGBClass(0, 0, 0));
PaletteClass WhitePalette(RGBClass(RGBClass::MAX_VALUE, RGBClass::MAX_VALUE, RGBClass::MAX_VALUE));
PaletteClass OriginalPalette;
PaletteClass ScorePalette;
/***************************************************************************
** These are the event queues. One is for holding events until they are ready to be
** sent to the remote computer for processing. The other list is for incoming events
** that need to be executed when the correct frame has been reached.
*/
QueueClass<EventClass, MAX_EVENTS> OutList;
QueueClass<EventClass, (MAX_EVENTS * 64)> DoList;
#ifdef MIRROR_QUEUE
QueueClass<EventClass, (MAX_EVENTS * 64)> MirrorList;
#endif
/***************************************************************************
** These are arrays/lists of trigger pointers for each cell & the houses.
*/
DynamicVectorClass<TriggerClass *> HouseTriggers[HOUSE_COUNT];
DynamicVectorClass<TriggerClass *> MapTriggers;
int MapTriggerID;
DynamicVectorClass<TriggerClass *> LogicTriggers;
int LogicTriggerID;
/***************************************************************************
** This is the list of BuildingTypes that define the AI's base.
*/
BaseClass Base;
/***************************************************************************
** This is the list of carry over objects. These objects are part of the
** pseudo saved game that might be carried along with the current saved
** game.
*/
CarryoverClass * Carryover;
/***************************************************************************
** This value is computed every time a new scenario is loaded; it's a
** CRC of the INI and binary map files.
*/
unsigned long ScenarioCRC;
/***************************************************************************
** This class manages data specific to multiplayer games.
*/
SessionClass Session;
#if(TIMING_FIX)
//
// These values store the min & max frame #'s for when MaxAhead >>increases<<.
// If MaxAhead increases, and the other systems free-run to the new MaxAhead
// value, they may miss an event generated after the MaxAhead event was sent,
// but before it executed, since it will have been scheduled with the older,
// shorter MaxAhead value. This will cause a Packet_Received_Too_Late error.
// The frames from the point where the new MaxAhead takes effect, up to that
// frame Plus the new MaxAhead, represent a "period of vulnerability"; any
// events received that are scheduled to execute during this period should
// be re-scheduled for after that period.
//
int NewMaxAheadFrame1;
int NewMaxAheadFrame2;
#endif
#ifdef FIXIT_VERSION_3
bool bAftermathMultiplayer; // Is multiplayer game being played with Aftermath rules?
#else
unsigned long PlayingAgainstVersion; // Negotiated version number
bool Version107InMix; // Is there a v1.07 in the game
#endif
/***************************************************************************
** This is the null modem manager class. Declaring this class doesn't
** perform any allocations;
*/
#if (0)
NullModemClass NullModem (
16, // number of send entries
16, // number of receive entries
(MAX_SERIAL_PACKET_SIZE / sizeof(EventClass) ) * sizeof(EventClass) + sizeof( CommHeaderType ),
0x1234); // Magic number must have each digit unique
// and different from the queue magic number
#endif
/***************************************************************************
** This is the network IPX manager class. It handles multiple remote
** connections. Declaring this class doesn't perform any allocations;
** the class itself is 140 bytes.
*/
//IPXManagerClass Ipx (
// MAX (sizeof (GlobalPacketType), sizeof(RemoteFileTransferType)), // size of Global Channel packets
// ((546 - sizeof(CommHeaderType)) / sizeof(EventClass) ) * sizeof(EventClass),
// 10, // # entries in Global Queue
// 8, // # entries in Private Queues
// VIRGIN_SOCKET, // Socket ID #
// IPXGlobalConnClass::COMMAND_AND_CONQUER0);// Product ID #
IPXManagerClass Ipx (
MAX (sizeof (GlobalPacketType), sizeof(RemoteFileTransferType)), // size of Global Channel packets
((546 - sizeof(CommHeaderType)) / sizeof(EventClass) ) * sizeof(EventClass),
160, // # entries in Global Queue
32, // # entries in Private Queues
VIRGIN_SOCKET, // Socket ID #
IPXGlobalConnClass::COMMAND_AND_CONQUER0);// Product ID #
#if(TEN)
/***************************************************************************
** This is the connection manager for Ten. Special Ten notes:
** - TEN connection ID's are equal to the HousesType for that player.
** - The TEN internal player ID is used to determine the player's color.
** - Ten's broadcast destination address -1
*/
TenConnManClass *Ten = NULL;
#endif
#if(MPATH)
/***************************************************************************
** This is the connection manager for Ten. Special Ten notes:
** - MPATH connection ID's are equal to the HousesType for that player.
** - The player's color is read from the OPTIONS.INI file
** - MPath's broadcast destination address is 0
*/
MPlayerManClass *MPath = NULL;
#endif
/***************************************************************************
** This is the random-number seed; it's synchronized between systems for
** multiplayer games.
*/
int Seed = 0;
/***************************************************************************
** If this value is non-zero, use it as the random # seed instead; this should
** help reproduce some bugs.
*/
int CustomSeed = 0;
int WindowList[][9] = {
/* xbyte, ypixel, bytewid, pixelht, cursor color, bkgd color, cursor x, cursor y */
/* do not change the first 2 entries!! they are necc. to the system */
{0,0,40*8*RESFACTOR,200*RESFACTOR,WHITE,BLACK,0,0}, /* screen window */
{1*8,75,38*8,100,WHITE,BLACK,0,0}, /* DOS Error window */
// Tactical map.
{0, 0, 40*8*RESFACTOR, 200*RESFACTOR, WHITE,LTGREY,0,0},
// Initial menu window.
{12*8, 199-42, 16*8, 42, LTGREY, DKGREY, 0, 0},
// Sidebar clipping window.
{0,0,0,0,0,0,0,0},
// Scenario editor window.
{5*8, 30, 30*8, 140, 0, 0, 0, 0},
// Partial object draw sub-window.
{0,0,0,0,WHITE,BLACK,0,0},
// Custom window.
{0, 0, 0, 0, 0, 0, 0, 0},
// Virtual window for external rendering. ST - 1/15/2019 3:02PM
{0, 0, 0, 0, 0, 0, 0, 0}
};
/* X,Y,Item Width,Items High,Selected,Norm Color,Sel Color,zero */
int MenuList[][8]={
{1, 3, 12, 3, 0, WHITE, PINK, 0},
};
#ifdef WIN32
GraphicBufferClass VisiblePage;
GraphicBufferClass HiddenPage;
GraphicViewPortClass SeenBuff(&VisiblePage, 0, 0, 3072, 3072);
GraphicViewPortClass HidPage(&HiddenPage, 0, 0, 3072, 3072);
#else
GraphicBufferClass HidPage(DEFAULT_SCREEN_WIDTH, 201, (void*)NULL);
GraphicBufferClass SeenBuff(320, 200, (void *)0xA0000L);
VideoBufferClass SeenPage;
GraphicBufferClass & VisiblePage = SeenBuff;
#endif
#ifdef WIN32
#else
#endif
int SoundOn;
CDTimerClass<SystemTimerClass> FrameTimer;
CDTimerClass<SystemTimerClass> CountDownTimer;
NewConfigType NewConfig;
TheaterType LastTheater = THEATER_NONE; //Lets us know when theater type changes.
/***************************************************************************
** This flag is for popping up dialogs that call the main loop.
*/
SpecialDialogType SpecialDialog = SDLG_NONE;
int RequiredCD = -1;
int CurrentCD = -1;
int MouseInstalled;
//
// Variables for helping track how much time goes bye in routines
//
int LogLevel = 0;
unsigned long LogLevelTime[ MAX_LOG_LEVEL ] = { 0 };
unsigned long LogLastTime = 0;
bool LogDump_Print = false; // true = print the Log time Stuff
/***************************************************************************
** Tick Count global timer object.
*/
TTimerClass<SystemTimerClass> TickCount = 0;
/***************************************************************************
** Win32 specific globals
*/
#ifdef WIN32
bool InDebugger = false;
int ReadyToQuit = 0;
#else
bool IsTheaterShape = false; // must be defined only if not Win32
#endif //WIN32
//PG GetCDClass CDList;
int UnitBuildPenalty = 100;
#ifdef MPEGMOVIE // Denzil 6/15/98
#ifdef MCIMPEG
#include "mcimovie.h"
MCIMovie* MciMovie = NULL;
#endif
#include "mpgset.h"
MPGSettings* MpgSettings = NULL;
#endif
#ifdef FIXIT_VERSION_3 // For endgame auto-sonar pulse.
bool bAutoSonarPulse = false;
#endif
bool MMXAvailable = false;
// ST - 5/14/2019
bool RunningAsDLL = false;
bool RunningFromEditor = false;