CnC_Remastered_Collection/TIBERIANDAWN/GLOBALS.CPP
PG-SteveT fd05be35c1 September 16th patch update
DLL version incremented
Beacon functionality added
Support for loading screen match preview display
Placeholder handling of new key-bindable mod commands
2020-09-16 10:03:04 -07:00

1052 lines
33 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: F:\projects\c&c\vcs\code\globals.cpv 2.17 16 Oct 1995 16:52:22 JOE_BOSTIC $ */
/***********************************************************************************************
*** 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"
#ifdef JAPANESE
bool ForceEnglish = false;
#endif
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;
int In_Debugger = 0;
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_Instant_Build = false;
bool Debug_Force_Crash = false;
TFixedIHeapClass<UnitClass> Units;
TFixedIHeapClass<FactoryClass> Factories;
TFixedIHeapClass<TerrainClass> Terrains;
TFixedIHeapClass<TemplateClass> Templates;
TFixedIHeapClass<SmudgeClass> Smudges;
TFixedIHeapClass<OverlayClass> Overlays;
TFixedIHeapClass<InfantryClass> Infantry;
TFixedIHeapClass<BulletClass> Bullets;
TFixedIHeapClass<BuildingClass> Buildings;
TFixedIHeapClass<AnimClass> Anims;
TFixedIHeapClass<AircraftClass> Aircraft;
TFixedIHeapClass<TriggerClass> Triggers;
TFixedIHeapClass<TeamTypeClass> TeamTypes;
TFixedIHeapClass<TeamClass> Teams;
TFixedIHeapClass<HouseClass> Houses;
#ifdef PATCH
/***************************************************************************
** Compatibility with version 1.07 flag.
*/
bool IsV107 = false;
char OverridePath[128]=".";
#endif
/***************************************************************************
** This tracks all selected objects per house (for this map).
*/
SelectedObjectsType CurrentObject;
/***************************************************************************
** This holds the custom version text that is fetched from the version
** text file. This version is displayed on the options dialog.
*/
char VersionText[16];
/***************************************************************************
** This is the VQ animation controller structure. It is filled in by reading
** the PLAYER.INI and overridden through program control.
*/
//PG_TO_FIX
//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 = true; // 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.
*/
char IntroMovie[_MAX_FNAME+_MAX_EXT];
char BriefMovie[_MAX_FNAME+_MAX_EXT];
char WinMovie[_MAX_FNAME+_MAX_EXT];
char WinMovie2[_MAX_FNAME + _MAX_EXT];
char WinMovie3[_MAX_FNAME + _MAX_EXT];
char WinMovie4[_MAX_FNAME + _MAX_EXT];
char LoseMovie[_MAX_FNAME+_MAX_EXT];
char ActionMovie[_MAX_FNAME+_MAX_EXT];
char MovieThemeName[_MAX_FNAME + _MAX_EXT];
char BriefingText[512];
ThemeType TransitTheme = THEME_NONE;
/***************************************************************************
** This records the view hotspots for the player. These are the cell numbers
** of the upper left corner for the view position.
*/
CELL Views[4];
/***************************************************************************
** 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 supressed
** when a large group of infantry is given the movement order.
*/
bool AllowVoice = true;
/***************************************************************************
** This counts the number of crates on the map. When this value reaches zero,
** then a timer is started that will control crate creation.
*/
int CrateCount;
TCountDownTimerClass CrateTimer;
bool CrateMaker = false;
/***************************************************************************
** 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;
/***************************************************************************
** 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;
/***************************************************************************
** This is a special scenario count down value. End of game condition will
** not be checked until this value reaches zero.
*/
int EndCountDown;
/***************************************************************************
** When the player sabotages a building (scenario #6 GDI only) then when
** the next scenario starts, that building will already be destroyed.
*/
StructType SabotagedType;
/***************************************************************************
** If the Nod temple was destroyed by the ion cannon, then this flag will
** be set to true.
*/
bool TempleIoned = false;
/***************************************************************************
** This is the monochrome debug page array. The various monochrome data
** screens are located here.
*/
MonoClass MonoArray[MonoClass::MAX_MONO_PAGES];
int MonoPage; // The current page.
/***************************************************************************
** This is true if the game is the currently in focus windows app
**
*/
bool GameInFocus = true;
/***************************************************************************
** This holds the theater specific mixfiles.
*/
MixFileClass *TheaterData = NULL;
MixFileClass *TheaterIcons = NULL;
MixFileClass *LowTheaterData;
MixFileClass *MoviesMix = 0;
MixFileClass *GeneralMix = 0;
MixFileClass *ScoreMix = 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;
/***************************************************************************
** These are the bits that are set when the appropriate tutor message
** has been displayed. Once the message has been displayed, it will not be
** displayed again.
*/
long TutorFlags[2];
/**************************************************************************
** This class records the special command override options that C&C
** supports.
*/
SpecialClass Special;
/***************************************************************************
** General rules that control the game.
*/
RulesClass Rule;
/***************************************************************************
** This is the scenario data for the currently loaded scenario.
** These variables should all be set together.
*/
HousesType Whom; // Initial command line house choice.
unsigned Scenario; // Scenario #
ScenarioPlayerType ScenPlayer; // GDI, NOD, 2-Player, Multi-Player
ScenarioDirType ScenDir; // East/West
ScenarioVarType ScenVar; // variation A/B/C
char ScenarioName[_MAX_FNAME+_MAX_EXT]; // name of scenario
int CarryOverMoney; // Carry over money from last scenario.
int CarryOverPercent; // Carry over money percentage control.
int CarryOverCap; // Maxmimum carry over money allowed.
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.
*/
unsigned BuildLevel = 3; // Buildable level (1 = simplest)
/***************************************************************************
** 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;
/***************************************************************************
** The various tutor and dialog messages are located in the data block
** referenced by this pointer.
*/
char const * SystemStrings;
/***************************************************************************
** 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 *Green12FontPtr; // Green font for pressed in tabs
void const *Green12GradFontPtr; // Graduated green font for tabs
void const *MapFontPtr; // Standard very small font.
void const *Font3Ptr; // Standard very small font.
void const *Font6Ptr; // Standard small font.
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.
*/
unsigned char *GamePalette;
unsigned char *BlackPalette;
unsigned char *WhitePalette;
unsigned char *OriginalPalette;
unsigned char *Palette;
/***************************************************************************
** 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 * 8)> DoList;
/***************************************************************************
** These are arrays/lists of trigger pointers for each cell & the houses.
*/
DynamicVectorClass<TriggerClass *> CellTriggers;
DynamicVectorClass<TriggerClass *> HouseTriggers[HOUSE_COUNT];
/***************************************************************************
** This is an array of waypoints; each waypoint corresponds to a letter of
** the alphabet, and points to a cell number. -1 means unassigned.
** The CellClass has a bit that tells if that cell has a waypoint attached to
** it; the only way to find which waypoint it is, is to scan this array. This
** shouldn't be needed often; usually, you know the waypoint & you want the CELL.
*/
CELL Waypoint[WAYPT_COUNT];
/***************************************************************************
** This is the list of BuildingTypes that define the AI's base.
*/
BaseClass Base;
/***************************************************************************
** This value tells what type of multiplayer game we're playing.
*/
GameType GameToPlay = GAME_NORMAL;
/***************************************************************************
** This is the current communications protocol
*/
CommProtocolType CommProtocol;
/***************************************************************************
** These values are used for recording & playing back a game.
*/
CCFileClass RecordFile ("RECORD.BIN");
int RecordGame = 0; // 1 = record a game
int SuperRecord = 0; // 1 = reopen record file with every write
int PlaybackGame= 0; // 1 = play back a game
int AllowAttract = 0; // 1 = allow attract mode
/***************************************************************************
** This is the null modem manager class. Declaring this class doesn't
** perform any allocations;
** the class itself is ?? bytes.
*/
#if (0) //PG_TO_FIX
bool ModemService = true; // When false disable servicing modem.
NullModemClass NullModem (
16, // number of send entries
64, // number of receive entries
// sizeof (EventClass) * MAX_EVENTS, // maxlen of entry buffer
(200 / sizeof(EventClass) ) * sizeof(EventClass) + sizeof( CommHeaderType ),
0x1234); // Magic number must have each digit unique
// and different from the queue magic number
DynamicVectorClass <PhoneEntryClass *> PhoneBook;
int CurPhoneIdx; // current phonebook index, for dialing
DynamicVectorClass <char *> InitStrings;
SerialSettingsType SerialDefaults; // serial port default settings
//ModemGameType ModemGameToPlay; // type of modem play Dialer, answerer, null
char *DialMethodCheck[ DIAL_METHODS ] = {
"T",
"P"
};
char *CallWaitStrings[ CALL_WAIT_STRINGS_NUM ] = {
"*70,",
"70#,",
"1170,",
"CUSTOM - "
};
#endif
ModemGameType ModemGameToPlay; // type of modem play Dialer, answerer, null
/***************************************************************************
** Index into scenario description list box
*/
int ScenarioIdx;
/***************************************************************************
** This array of flags tells if the given colors have been used, or are
*/
int ColorUsed[MAX_MPLAYER_COLORS];
/***************************************************************************
** This string stores the player's name.
*/
char MPlayerName[MPLAYER_NAME_MAX];
/***************************************************************************
** This is the array of remap colors. Each player in a network game is
** assigned one of these colors. The 'G' is for graphics drawing; the 'T'
** is for text printing (indicates a remap table for the font to use).
*/
int MPlayerGColors[MAX_MPLAYER_COLORS] = {
5, // Yellow
127, // Red
135, // BlueGreen
26, // Orange
4, // Green
202 // Blue-Grey
};
int MPlayerTColors[MAX_MPLAYER_COLORS] = {
CC_GDI_COLOR, // Yellow
CC_NOD_COLOR, // Red
CC_BLUE_GREEN, // BlueGreen
CC_ORANGE, // Orange //26
CC_GREEN, // Green
CC_BLUE_GREY, // Blue
};
/***************************************************************************
** This is a list of all the names of the multiplayer scenarios that use
** bases (production), and those that don't. There is a list for
** descriptions, and another for actual filenames.
*/
char MPlayerDescriptions[100][40];
DynamicVectorClass <char *> MPlayerScenarios;
DynamicVectorClass <int> MPlayerFilenum;
/***************************************************************************
** This value determines the max allowable # of players.
*/
int MPlayerMax = 6;
/***************************************************************************
** Multiplayer game options
*/
int MPlayerPrefColor; // preferred color index for this player
int MPlayerColorIdx; // actual color index of this player
HousesType MPlayerHouse; // House of this player (GDI/NOD)
unsigned char MPlayerLocalID; // ID of this player
int MPlayerCount; // # of human players in this game
int MPlayerBases; // 1 = bases are on for this scenario
int MPlayerCredits; // # credits everyone gets
int MPlayerTiberium; // 1 = tiberium enabled for this scenario
int MPlayerGoodies; // 1 = goodies enabled for this scenario
int MPlayerGhosts; // 1 = houses with no players will still play
int MPlayerSolo = 0; // 1 = allows a single-player net game
int MPlayerUnitCount = 10; // # units for non-base multiplayer scenarios
/*---------------------------------------------------------------------------
Min & Max unit count values; index0 = bases OFF, index1 = bases ON
---------------------------------------------------------------------------*/
int MPlayerCountMin[2] = {1,0};
int MPlayerCountMax[2] = {50,12};
/*---------------------------------------------------------------------------
MPlayerMaxAhead is the number of frames ahead of this one to execute a given
packet. It's set by the RESPONSE_TIME event.
---------------------------------------------------------------------------*/
unsigned long MPlayerMaxAhead = 3;
/*---------------------------------------------------------------------------
'FrameSendRate' is the # frames between data packets
'FrameRateDelay' is the time ticks to wait between frames, for smoothing.
---------------------------------------------------------------------------*/
unsigned long FrameSendRate;
/***************************************************************************
** Multiplayer ID's, stored in order of event execution.
** Format:
** bits 0-3: the "preferred" house of the player (GDI/NOD)
** bits 4-7: the player's Color Index
** These values are used as the IPX connection ID's.
*/
unsigned char MPlayerID [MAX_PLAYERS];
/***************************************************************************
** This array stores the actual HousesType for all players (MULT1, etc).
*/
HousesType MPlayerHouses [MAX_PLAYERS];
/***************************************************************************
** This array stores the names of all players in a multiplayer game.
*/
char MPlayerNames [MAX_PLAYERS][MPLAYER_NAME_MAX];
/***************************************************************************
** This is a list of the messages received from / sent to other players,
** the address to send to (IPX only), and the last message received or
** sent (for the computer's messages).
*/
MessageListClass Messages;
IPXAddressClass MessageAddress;
char LastMessage[MAX_MESSAGE_LENGTH];
/***************************************************************************
** If this flag is set, computer AI will blitz the humans all at once;
** otherwise, the computer units trickle gradually out.
*/
int MPlayerBlitz = 0;
/***************************************************************************
** If this flag is set, we can move around the map, but we can't do anything.
** It means we've been defeated, but we're still allowed to watch the action.
*/
int MPlayerObiWan = 0;
/***************************************************************************
** These variables keep track of the multiplayer game scores.
*/
MPlayerScoreType MPlayerScore[MAX_MULTI_NAMES];
int MPlayerGamesPlayed; // # games played this run
int MPlayerNumScores; // # active entries in MPlayerScore
int MPlayerWinner; // index of winner of last game
int MPlayerCurGame; // index of current game being played
//
// This array stores the processing time required by all multiplayer systems.
// The values are stored in the same order as the 'MPlayerID' array.
//
int TheirProcessTime[MAX_PLAYERS - 1];
int DesiredFrameRate;
/***************************************************************************
** These values are used purely for the Mono debug display. They show the
** names of the Global Channel packet types, and the event types.
*/
char *GlobalPacketNames[] = {
"Game?",
"Game!",
"Player?",
"Player!",
"Join?",
"Join!",
"Reject",
"GameOptions",
"Sign Off",
"GO!",
"Message",
"Ping"
};
// yeah, there's 100 empty names here, because the SerialCommandType starts at 100.
char *SerialPacketNames[] = {
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"CONNECT",
"GAME_OPTIONS",
"SIGN_OFF",
"GO",
"MESSAGE",
"TIMING",
"SCORE_SCREEN",
"LAST_COMMAND",
};
/***************************************************************************
** These variables are just to help find sync bugs.
*/
long TrapFrame = 0x7fffffff; // frame to start trapping object values at
RTTIType TrapObjType = RTTI_NONE; // type of object to trap
TrapObjectType TrapObject = {NULL}; // ptr to object being trapped
COORDINATE TrapCoord = 0; // COORD of object to trap
void *TrapThis = NULL; // 'this' ptr of object to trap
CellClass *TrapCell = NULL; // for trapping a cell
int TrapCheckHeap = 0; // start checking the Heap
/***************************************************************************
** 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 (
sizeof (GlobalPacketType), // 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_CONQUER); // Product ID #
//#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
/***************************************************************************
** This is the user-specified IPX address of a desired game owner machine.
** Use this to cross a bridge. Only the 1st 4 numbers in the address are
** used; the rest are set to ff's, for broadcasting. 'IsBridge' is set
** if this address should be used.
*/
int IsBridge = 0;
IPXAddressClass BridgeNet;
/***************************************************************************
** This flag is true if the user has requested that this game be "secret"
** (The game will not appear to other systems just starting up.)
*/
bool NetStealth = false;
/***************************************************************************
** If this flag is true, the user won't receive messages from any player
** other than those in his own game. It defaults to protected mode.
*/
bool NetProtect = true;
/***************************************************************************
** This flag indicates whether the game is "open" or not to other network players.
*/
bool NetOpen = false;
/***************************************************************************
** This string stores the game's network name.
** GameName does not include the "'s Game"; comparing GameName to
** PlayerName can determine if this player is the originator of the game.
*/
char MPlayerGameName[MPLAYER_NAME_MAX];
/***************************************************************************
** These variables are for servicing the Global Channel.
*/
GlobalPacketType GPacket; // Global Channel packet
int GPacketlen; // length of incoming packet
IPXAddressClass GAddress; // address of sender
unsigned short GProductID; // sender's Product ID
/***************************************************************************
** This is the "meta-packet"; it's a bunch of events lumped together.
** The packet's size is IPX's max size (546), rounded down to accommodate
** the max number of events possible.
*/
char *MetaPacket = 0;
int MetaSize = ((546 - sizeof(CommHeaderType)) / sizeof(EventClass) ) * sizeof(EventClass);
/***************************************************************************
** This is the random-number seed; it's synchronized between systems for
** multiplayer games.
*/
int Seed = 0;
long *RandSeedPtr;
/***************************************************************************
** If this value is non-zero, use it as the random # seed instead; this should
** help reproduce some bugs.
*/
int CustomSeed = 0;
int WindowList[][8] = {
/* 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,200,WHITE,BLACK,0,0}, /* screen window */
{1,75,38,100,WHITE,BLACK,0,0}, /* DOS Error window */
// Tactical map.
{0, 0, 40, 200, WHITE,LTGREY,0,0},
// Initial menu window.
{12, 199-42, 16, 42, LTGREY, DKGREY, 0, 0},
// Sidebar clipping window.
{0,0,0,0,0,0,0,0},
// Scenario editor window.
{5, 30, 30, 140, 0, 0, 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},
};
GraphicBufferClass VisiblePage;
GraphicBufferClass HiddenPage;
GraphicViewPortClass SeenBuff(&VisiblePage, 0,0,1536,1536);
GraphicBufferClass ModeXBuff;
GraphicViewPortClass HidPage(&HiddenPage, 0,0, 1536,1536);
GraphicBufferClass SysMemPage(DEFAULT_SCREEN_WIDTH, 200, (void*)NULL);
int SoundOn;
CountDownTimerClass FrameTimer(BT_SYSTEM, 0L);
CountDownTimerClass DebugTimer(BT_SYSTEM, 0L);
CountDownTimerClass CountDownTimer(BT_SYSTEM, 0L);
NewConfigType NewConfig;
/***************************************************************************
** This timer measures how long (in ticks) it takes to process the game's
** logic, with no packet processing or artificial delays.
*/
TimerClass ProcessTimer;
int ProcessTicks; // accumulated ticks
int ProcessFrames; // # frames used to measure 'ProcessTicks'
/***************************************************************************
** This flag is for popping up dialogs that call the main loop.
*/
SpecialDialogType SpecialDialog = SDLG_NONE;
/*
** This flags if used to tell can enter cell that we are in a find path
** check and thus should not uncloak units via Can_Enter_Cell.
*/
//bool IsFindPath = false;
/***************************************************************************
** Globals for the network Dialogs.
*/
/*
** List of all games out there, & the address of the game's owner
*/
DynamicVectorClass <NodeNameType *> Games;
/*
** List of names & addresses of all the players in the game I'm joining.
** This is the really critical list, since it's used to form connections with
** all other players in my game. It's updated when I get a response to my
** outgoing query, or when I get a query from another system in my game asking
** who I am. This double-insurance means that if any system knows about me,
** I know about them too. The only catch is that if the game is started very,
** very soon after a player joins, not everyone may know about him; to prevent
** this, a timer restriction is put on the New Game dialog's GO button.
*/
DynamicVectorClass <NodeNameType *> Players;
char *DebugFname; // for stoopid debugging purposes
int DebugLine; // for stoopid debugging purposes
#ifdef DEMO
int RequiredCD = -2;
#else
int RequiredCD = -1;
#endif
int MouseInstalled;
/*
** Certain options must be enabled by both a command-line option, and an
** an entry in an INI file. If this flag is 'true', those options have been
** enabled by the INI file.
*/
int AreThingiesEnabled = false;
/*
** Pointer to windows timer object
**
**
*/
WinTimerClass *WindowsTimer=NULL;
/*
** Command line arguments
**
**
*/
char * Argv[20]; //Pointers to command line arguments
int Argc; //Command line argument count
WWKeyboardClass Kbd;
int ScreenWidth=1536;
int ScreenHeight=1536;
WWMouseClass *WWMouse = NULL;
HANDLE hInstance;
int AllDone;
BOOL InMovie = FALSE; //Are we currently playing a VQ movie?
bool MMXAvailable = false; //Does this CPU support MMX extensions?
//GetCDClass CDList;
bool GameStatisticsPacketSent;
bool ConnectionLost;
TheaterType LastTheater = THEATER_NONE;
bool RunningAsDLL = false;