CnC_Remastered_Collection/TIBERIANDAWN/FUNCTION.H

983 lines
37 KiB
C++
Raw Permalink Normal View History

//
// 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\function.h_v 2.21 16 Oct 1995 16:46:44 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 : FUNCTION.H *
* *
* Programmer : Joe L. Bostic *
* *
* Start Date : May 27, 1994 *
* *
* Last Update : May 27, 1994 [JLB] *
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#ifndef FUNCTION_H
#define FUNCTION_H
#ifdef NEVER
Map (screen) class heirarchy.
MapeditClass (most derived class) -- scenario editor
<EFBFBD>
MouseClass -- handles mouse animation and display control
<EFBFBD>
ScrollClass -- map scroll handler
<EFBFBD>
HelpClass -- pop-up help text handler
<EFBFBD>
TabClass -- file folder tab screen mode control dispatcher
<EFBFBD>
SidebarClass -- displays and controls construction list sidebar
<EFBFBD>
PowerClass -- display power production/consumption bargraph
<EFBFBD>
RadarClass -- displays and controls radar map
<EFBFBD>
DisplayClass -- general tactical map display handler
<EFBFBD>
MapClass -- general tactical map data handler
<EFBFBD>
GScreenClass (pure virtual base class) -- generic screen control
AbstractClass
<EFBFBD>
<EFBFBD>
<EFBFBD>
<EFBFBD>
ObjectClass
<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
AnimClass <EFBFBD> TemplateClass <EFBFBD> <EFBFBD><EFBFBD> FuseClass <EFBFBD> TerrainClass
<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD> FlyClass <EFBFBD>
<EFBFBD> <EFBFBD> BulletClass <EFBFBD>
OverlayClass MissionClass SmudgeClass
<EFBFBD>
RadioClass
<EFBFBD>
<EFBFBD><EFBFBD> CrewClass
<EFBFBD><EFBFBD> FlasherClass
<EFBFBD><EFBFBD> StageClass
<EFBFBD><EFBFBD> CargoClass
TechnoClass
<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
FootClass BuildingClass
<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
DriveClass InfantryClass <EFBFBD><EFBFBD> FlyClass
<EFBFBD> AircraftClass
TurretClass
<EFBFBD>
TarComClass
<EFBFBD>
UnitClass
AbstractTypeClass
<EFBFBD>
ObjectTypeClass
<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
TechnoTypeClass <EFBFBD> <EFBFBD> <EFBFBD>
<EFBFBD> BulletTypeClass <EFBFBD> <EFBFBD>
<EFBFBD> TemplateTypeClass <EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ TerrainTypeClass
<EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
UnitTypeClass <EFBFBD> BuildingTypeClass <EFBFBD>
<EFBFBD> InfantryTypeClass
AircraftTypeClass
#endif
/*
** The "bool" integral type was defined by the C++ comittee in
** November of '94. Until the compiler supports this, use the following
** definition.
*/
#if (0)
#ifndef TRUE_FALSE_DEFINED
enum {false=0,true=1};
typedef int bool;
#define TRUE_FALSE_DEFINED
#endif //TRUE_FALSE_DEFINED
#endif
//#define _WIN32
//#define WIN32 =1 //_LEAN_AND_MEAN
#include <windows.h>
/**********************************************************************
** If the following define is enabled, then the memory checking code
** will be disabled.
*/
#define NOMEMCHECK
#include "watcom.h"
#define FILE_H
#define WWMEM_H
#include "compat.h"
#include "rawfile.h"
#include "wwlib32.h"
#include "jshell.h"
// Should be part of WWLIB.H. This is used in JSHELL.CPP.
typedef struct {
unsigned char SourceColor;
unsigned char DestColor;
unsigned char Fading;
unsigned char reserved;
} TLucentType;
// Don't complain if these headers aren't referenced.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
//#include <mem.h>
//#include <dos.h>
#include <direct.h>
#include <stdarg.h>
#include <ctype.h>
#include <assert.h>
#include <process.h>
//#include <new.h>
/*
** VQ player specific includes.
*/
//#include <vqa32\vqaplay.h>
//#include <vqa32\vqafile.h>
extern bool GameActive;
extern long LParam;
#include "vector.h"
#include "heap.h"
#include "ccfile.h"
#include "monoc.h"
#include "conquer.h"
//#include "debug.h"
#include "special.h"
#include "defines.h"
/*
** Greenleaf specific includes.
*/
//#include <modem.h>
//#include <fast.h>
extern long Frame;
inline CELL Coord_XCell(COORDINATE coord) {return (CELL)(*(((unsigned char*)&coord)+1));}
inline CELL Coord_YCell(COORDINATE coord) {return (CELL)(*(((unsigned char*)&coord)+3));}
//inline CELL Coord_Cell(COORD coord){return (CELL)(((*(((unsigned short *)&coord)+1) & 0xFF00) >> 2) | *(((unsigned char *)&coord)+1));}
#if (0)
__cdecl CELL Coord_Cell(COORDINATE coord);
#pragma aux Coord_Cell parm [eax] \
modify [ebx] \
value [ax] = \
"mov ebx,eax" \
"shr eax,010h" \
"xor al,al" \
"shr eax,2" \
"or al,bh"
#endif
CELL __cdecl Coord_Cell(COORDINATE coord);
#include "rules.h"
#include "utracker.h"
#include "facing.h"
#include "ftimer.h"
#include "theme.h"
#include "link.h"
#include "gadget.h"
#include "control.h"
#include "toggle.h"
#include "checkbox.h"
#include "shapebtn.h"
#include "textbtn.h"
#include "slider.h"
#include "list.h"
#include "cheklist.h"
#include "colrlist.h"
#include "edit.h"
#include "gauge.h"
#include "msgbox.h"
#include "dial8.h"
#include "txtlabel.h"
#include "super.h"
#include "house.h"
#include "gscreen.h"
#include "map.h"
#include "display.h"
#include "radar.h"
#include "power.h"
#include "sidebar.h"
#include "tab.h"
#include "help.h"
#include "mouse.h"
//#include "mapedit.h"
#include "help.h"
#include "target.h"
#include "theme.h"
#include "team.h" // Team objects.
#include "teamtype.h" // Team type objects.
#include "trigger.h" // Trigger event objects.
#include "mapedit.h" // ???
#include "abstract.h"
#include "object.h"
#include "mission.h"
#include "door.h"
#include "bullet.h" // Bullet objects.
#include "terrain.h" // Terrain objects.
#include "anim.h" // Animation objects.
#include "template.h" // Icon template objects.
#include "overlay.h" // Overlay objects.
#include "smudge.h" // Stains on the terrain objects.
#include "aircraft.h" // Aircraft objects.
#include "unit.h" // Ground unit objects.
#include "infantry.h" // Infantry objects.
#include "credits.h" // Credit counter class.
#include "score.h" // Scoring system class.
#include "factory.h" // Production manager class.
#include "intro.h"
#include "ending.h"
#include "logic.h"
#include "queue.h"
#include "event.h"
#include "base.h" // defines the AI's pre-built base
#include "ipxmgr.h"
#include "combuf.h"
#include "connect.h"
#include "connmgr.h"
#include "noseqcon.h"
#include "msglist.h"
//#include "nullconn.h"
//#include "nullmgr.h"
//#include "phone.h"
#include "loaddlg.h"
#include "ipxaddr.h"
#include "FACINGFF.h"
/****************************************************************************
** This is a "node", used for the lists of available games & players. The
** 'Game' structure is used for games; the 'Player' structure for players.
*/
typedef struct NodeNameTag {
char Name[MPLAYER_NAME_MAX];
IPXAddressClass Address;
union {
struct {
int Version;
unsigned char IsOpen;
unsigned long LastTime;
} Game;
struct {
HousesType House;
unsigned char Color;
} Player;
};
} NodeNameType;
#include "externs.h"
extern int Get_CD_Drive(void);
extern void Fatal(char const *message, ...);
/*
** ANIM.CPP
*/
void Shorten_Attached_Anims(ObjectClass * obj);
/*
** AUDIO.CPP
*/
int Sound_Effect(VocType voc, VolType volume, int variation=1, signed short panvalue=0);
// void Speak(VoxType voice); // MBL 02.06.2020
void Speak(VoxType voice, HouseClass *house=NULL, COORDINATE coord=0);
void Speak_AI(void);
void Stop_Speaking(void);
void Sound_Effect(VocType voc, COORDINATE coord=NULL, int variation=1);
bool Is_Speaking(void);
/*
** COMBAT.CPP
*/
int Modify_Damage(int damage, WarheadType warhead, ArmorType armor, int distance);
void Explosion_Damage(COORDINATE coord, unsigned strength, TechnoClass * source, WarheadType warhead);
/*
** CONQUER.CPP
*/
void Center_About_Objects(void);
bool Force_CD_Available(int cd);
void Handle_View(int view, int action=0);
void Handle_Team(int team, int action=0);
TechnoTypeClass const * Fetch_Techno_Type(RTTIType type, int id);
char const * Fading_Table_Name(char const * base, TheaterType theater);
void Unselect_All(void);
void Unselect_All_Except(ObjectClass* object);
void Play_Movie(char const * name, ThemeType theme=THEME_NONE, bool clrscrn=true);
bool Main_Loop();
TheaterType Theater_From_Name(char const *name);
//DirType Rotation_Calc(DirType current, DirType desired, int rate);
void Main_Game(int argc, char *argv[]);
long VQ_Call_Back(unsigned char * buffer=NULL, long frame=0);
void Call_Back(void);
char const *Language_Name(char const *basename);
SourceType Source_From_Name(char const *name);
char const *Name_From_Source(SourceType source);
FacingType KN_To_Facing(int input);
void const *Get_Radar_Icon(void const *shapefile, int shapenum, int frames, int zoomfactor);
void CC_Draw_Shape(void const * shapefile, int shapenum, int x, int y, WindowNumberType window, ShapeFlags_Type flags, void const * fadingdata=0, void const * ghostdata=0);
// Added for draw intercept. ST - 1/17/2019 12:31PM
void CC_Draw_Shape(ObjectClass *object, void const * shapefile, int shapenum, int x, int y, WindowNumberType window, ShapeFlags_Type flags, void const * fadingdata=0, void const * ghostdata=0, int scale=0x100, int width=0, int height=0);
void CC_Draw_Shape(ObjectClass *object, const char *shape_file_name, void const * shapefile, int shapenum, int x, int y, WindowNumberType window, ShapeFlags_Type flags, void const * fadingdata = 0, void const * ghostdata = 0, char override_owner = HOUSE_NONE);
// Added for pip draw intercept - SKY
void CC_Draw_Pip(ObjectClass *object, void const * shapefile, int shapenum, int x, int y, WindowNumberType window, ShapeFlags_Type flags, void const * fadingdata=0, void const * ghostdata=0);
// Added for line draw intercept (ex. Obelisk laser) - SKY
void CC_Draw_Line(int x, int y, int x1, int y1, unsigned char color, int frame, WindowNumberType window);
void Go_Editor(bool flag);
//long MixFileHandler(VQAHandle *vqa, long action, void *buffer, long nbytes);
char *CC_Get_Shape_Filename(void const *shapeptr );
void CC_Add_Shape_To_Global(void const *shapeptr, char *filename, char code );
void Bubba_Print(char *format,...);
void Heap_Dump_Check( char *string );
void Dump_Heap_Pointers( void );
unsigned long Disk_Space_Available(void);
void Validate_Error(char *name);
void const * Hires_Retrieve(char *name);
int Get_Resolution_Factor(void);
void Shake_The_Screen(int shakes, HousesType house = HOUSE_NONE);
/*
** INTERPAL.CPP
*/
#define SIZE_OF_PALETTE 256
extern "C" unsigned char *InterpolationPalette;
extern BOOL InterpolationPaletteChanged;
extern void Interpolate_2X_Scale( GraphicBufferClass *source, GraphicViewPortClass *dest ,char const *palette_file_name);
void Read_Interpolation_Palette (char const *palette_file_name);
void Write_Interpolation_Palette (char const *palette_file_name);
void Increase_Palette_Luminance(unsigned char *InterpolationPalette , int RedPercentage ,int GreenPercentage ,int BluePercentage ,int cap);
extern "C"{
extern unsigned char PaletteInterpolationTable[SIZE_OF_PALETTE][SIZE_OF_PALETTE];
extern unsigned char *InterpolationPalette;
void __cdecl Asm_Create_Palette_Interpolation_Table(void);
}
/*
** COORD.CPP
*/
void Move_Point(short &x, short &y, register DirType dir, unsigned short distance);
COORDINATE Adjacent_Cell(COORDINATE coord, FacingType dir);
COORDINATE Coord_Move(COORDINATE start, DirType facing, unsigned short distance);
COORDINATE Coord_Scatter(COORDINATE coord, unsigned distance, bool lock=false);
DirType Direction(CELL cell1, CELL cell2);
DirType Direction(COORDINATE coord1, COORDINATE coord2);
DirType Direction256(COORDINATE coord1, COORDINATE coord2);
DirType Direction8(COORDINATE coord1, COORDINATE coord2);
int Distance(CELL coord1, CELL coord2);
int Distance(COORDINATE coord1, COORDINATE coord2);
short const * Coord_Spillage_List(COORDINATE coord, int maxsize);
//void Move_Point(unsigned short &x, unsigned short &y, DirType dir, unsigned short distance);
/*
** COORDA.CPP
*/
//extern "C" {
//unsigned Cardinal_To_Fixed(unsigned base, unsigned cardinal);
//unsigned Fixed_To_Cardinal(unsigned base, unsigned fixed);
//}
/*
** DEBUG.CPP
*/
void Log_Event(char const *text, ...);
void Debug_Key(unsigned input);
void Self_Regulate(void);
/*
** DIALOG.CPP
*/
int Format_Window_String(char * string, int maxlinelen, int & width, int & height);
extern void Dialog_Box(int x, int y, int w, int h);
void Conquer_Clip_Text_Print(char const *, unsigned x, unsigned y, unsigned fore, unsigned back=(unsigned)TBLACK, TextPrintType flag=TPF_8POINT|TPF_DROPSHADOW, unsigned width=-1, int const * tabs=0);
void Draw_Box(int x, int y, int w, int h, BoxStyleEnum up, bool filled);
int __cdecl Dialog_Message(char *errormsg, ...);
void Window_Box(WindowNumberType window, BoxStyleEnum style);
void Fancy_Text_Print(char const *text, unsigned x, unsigned y, unsigned fore, unsigned back, TextPrintType flag, ...);
void Fancy_Text_Print(int text, unsigned x, unsigned y, unsigned fore, unsigned back, TextPrintType flag, ...);
void Simple_Text_Print(char const *text, unsigned x, unsigned y, unsigned fore, unsigned back, TextPrintType flag);
/*
** DISPLAY.CPP
*/
ObjectClass* Best_Object_With_Action(DynamicVectorClass<ObjectClass*>& objects, ObjectClass* object);
ObjectClass* Best_Object_With_Action(DynamicVectorClass<ObjectClass*>& objects, CELL cell);
ActionType Best_Object_Action(DynamicVectorClass<ObjectClass*>& objects, ObjectClass* object);
ActionType Best_Object_Action(DynamicVectorClass<ObjectClass*>& objects, CELL cell);
ObjectClass* Best_Object_With_Action(ObjectClass* object);
ObjectClass* Best_Object_With_Action(CELL cell);
ActionType Best_Object_Action(ObjectClass* object);
ActionType Best_Object_Action(CELL cell);
/*
** ENDING.CPP
*/
void GDI_Ending(void);
void Nod_Ending(void);
/*
** EXPAND.CPP
*/
bool Expansion_Present(void);
bool Expansion_Dialog(void);
bool Bonus_Dialog(void);
/*
** FINDPATH.CPP
*/
//PathType * Find_Path(CELL source, CELL dest, FacingType *final_moves, int maxlen, int (*callback)(CELL, FacingType), int threshhold);
int Optimize_Moves(PathType *path, int (*callback)(CELL, FacingType), int threshhold);
/*
** GOPTIONS.CPP
*/
void Draw_Caption(int text, int x, int y, int w);
/*
** INI.CPP
*/
void Set_Scenario_Name(char *buf, int scenario, ScenarioPlayerType player, ScenarioDirType dir = SCEN_DIR_NONE, ScenarioVarType var = SCEN_VAR_NONE);
void Write_Scenario_Ini(char *root);
bool Read_Scenario_Ini(char *root, bool fresh=true);
bool Read_Scenario_Ini_File(char *scenario_file_name, char* bin_file_name, const char* root, bool fresh);
int Scan_Place_Object(ObjectClass *obj, CELL cell);
/*
** INIT.CPP
*/
void Uninit_Game(void);
long Obfuscate(char const * string);
void Anim_Init(void);
bool Init_Game(int argc, char *argv[]);
bool Select_Game(bool fade = false);
bool Parse_Command_Line(int argc, char *argv[]);
void Parse_INI_File(void);
int Version_Number(void);
void Save_Recording_Values(void);
void Load_Recording_Values(void);
/*
** JSHELL.CPP
*/
void * Small_Icon(void const * iconptr, int iconnum);
void Set_Window(int window, int x, int y, int w, int h);
void * Load_Alloc_Data(FileClass &file);
long Load_Uncompress(FileClass &file, BuffType &uncomp_buff, BuffType &dest_buff, void *reserved_data);
long Translucent_Table_Size(int count);
void *Build_Translucent_Table(void const *palette, TLucentType const *control, int count, void *buffer);
void *Conquer_Build_Translucent_Table(void const *palette, TLucentType const *control, int count, void *buffer);
/*
** KEYFBUFF.ASM
*/
#ifdef __cplusplus
extern "C" {
#endif
long __cdecl Buffer_Frame_To_Page(int x, int y, int w, int h, void *Buffer, GraphicViewPortClass &view, int flags, ...);
#ifdef __cplusplus
}
#endif
/*
** KEYFRAME.CPP
*/
int Get_Last_Frame_Length(void);
unsigned long Build_Frame(void const *dataptr, unsigned short framenumber, void *buffptr);
unsigned short Get_Build_Frame_Count(void const *dataptr);
unsigned short Get_Build_Frame_X(void const *dataptr);
unsigned short Get_Build_Frame_Y(void const *dataptr);
unsigned short Get_Build_Frame_Width(void const *dataptr);
unsigned short Get_Build_Frame_Height(void const *dataptr);
bool Get_Build_Frame_Palette(void const *dataptr, void *palette);
/*
** MAP.CPP
*/
int Terrain_Cost(CELL cell, FacingType facing);
int Coord_Spillage_Number(COORDINATE coord, int maxsize);
/*
** MENUS.CPP
*/
void Setup_Menu(int menu, char const *text[], unsigned long field, int index, int skip);
int Check_Menu(int menu, char const *text[], char *selection, long field, int index);
int Do_Menu(char const **strings, bool blue);
extern int UnknownKey;
int Main_Menu(unsigned long timeout);
/*
** MPLAYER.CPP
*/
GameType Select_MPlayer_Game (void);
void Read_MultiPlayer_Settings (void);
void Write_MultiPlayer_Settings (void);
void Read_Scenario_Descriptions (void);
void Free_Scenario_Descriptions(void);
void Computer_Message(void);
int Surrender_Dialog(void);
/*
** NETDLG.CPP
*/
bool Init_Network (void);
void Shutdown_Network (void);
bool Remote_Connect (void);
void Destroy_Connection(int id, int error);
bool Process_Global_Packet(GlobalPacketType *packet, IPXAddressClass *address);
unsigned long Compute_Name_CRC(char *name);
void Net_Reconnect_Dialog(int reconn, int fresh, int oldest_index, unsigned long timeval);
/*
** NULLDLG.CPP
*/
int Init_Null_Modem( SerialSettingsType *settings );
void Shutdown_Modem( void );
void Modem_Signoff( void );
int Test_Null_Modem( void );
int Reconnect_Modem( void );
void Destroy_Null_Connection(int id, int error);
GameType Select_Serial_Dialog( void );
int Com_Scenario_Dialog(void);
int Com_Show_Scenario_Dialog(void);
void Smart_Printf( char *format, ... );
void Hex_Dump_Data( char *buffer, int length );
void itoh( int i, char *s);
/*
** PROFILE.CPP
*/
int WWGetPrivateProfileInt(char const *section, char const *entry, int def, char *profile);
bool WWWritePrivateProfileInt(char const *section, char const *entry, int value, char *profile);
bool WWWritePrivateProfileString(char const *section, char const *entry, char const *string, char *profile);
char * WWGetPrivateProfileString(char const *section, char const *entry, char const *def, char *retbuffer, int retlen, char *profile);
unsigned WWGetPrivateProfileHex (char const *section, char const *entry, char *profile);
/*
** QUEUE.CPP
*/
bool Queue_Target(TARGET whom, TARGET target);
bool Queue_Destination(TARGET whom, TARGET target);
bool Queue_Mission(TARGET whom, MissionType mission);
bool Queue_Mission(TARGET whom, MissionType mission, TARGET target, TARGET destination);
bool Queue_Options(void);
bool Queue_Exit(void);
void Queue_AI(void);
void Add_CRC(unsigned long *crc, unsigned long val);
/*
** RAND.CPP
*/
int Sim_IRandom(int minval, int maxval);
int Sim_Random(void);
/*
** REINF.CPP
*/
bool Do_Reinforcements(TeamTypeClass *team);
bool Create_Special_Reinforcement(HouseClass * house, TechnoTypeClass const * type, TechnoTypeClass const * another, TeamMissionType mission = TMISSION_NONE, int argument =0);
int Create_Air_Reinforcement(HouseClass *house, AircraftType air, int number, MissionType mission, TARGET tarcom, TARGET navcom);
/*
** SAVELOAD.CPP
*/
bool Load_Misc_Values(FileClass &file);
bool Save_Misc_Values(FileClass &file);
bool Get_Savefile_Info(int id, char *buf, unsigned *scenp, HousesType *housep);
bool Load_Game(int id);
bool Load_Game(const char *file_name);
//bool Read_Object (void *ptr, int base_size, int class_size, FileClass & file, void * vtable); // Original Read_Object prototype. ST - 9/17/2019 12:50PM
bool Read_Object(void *ptr, int class_size, FileClass & file, bool has_vtable);
bool Save_Game(int id,char *descr);
bool Save_Game(const char *file_name, const char *descr);
bool Write_Object (void *ptr, int class_size, FileClass & file);
TARGET TechnoType_To_Target(TechnoTypeClass const * ptr);
TechnoTypeClass const * Target_To_TechnoType(TARGET target);
void * Get_VTable(void *ptr, int base_size);
void Code_All_Pointers(void);
void Decode_All_Pointers(void);
void Dump(void);
void Set_VTable(void *ptr, int base_size, void *vtable);
/*
** SCENARIO.CPP
*/
bool End_Game(void);
bool Read_Scenario(char *root);
bool Start_Scenario(char *root, bool briefing=true);
void Set_Scenario_Difficulty(int difficulty);
HousesType Select_House(void);
void Clear_Scenario(void);
void Do_Briefing(char const * text);
void Do_Lose(void);
void Do_Win(void);
void Do_Restart(void);
void Fill_In_Data(void);
bool Restate_Mission(char const * name, int button1, int button2);
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-23 04:43:21 +12:00
void Fixup_Scenario(void);
/*
** SCORE.CPP
*/
void Map_Selection(void);
void Bit_It_In_Scale(int x, int y, int w, int h, GraphicBufferClass *src, GraphicBufferClass *dest, GraphicViewPortClass *seen , int delay=0, int dagger=0);
void Bit_It_In(int x, int y, int w, int h, GraphicBufferClass *src, GraphicBufferClass *dest, int delay=0, int dagger=0);
void Call_Back_Delay(int time);
int Alloc_Object(ScoreAnimClass *obj);
extern GraphicBufferClass *PseudoSeenBuff;
void Window_Dialog_Box(HANDLE hinst, LPCTSTR lpszTemplate, HWND hwndOwner, DLGPROC dlgprc);
/*
** SPECIAL.CPP
*/
void Special_Dialog(void);
/*
** SUPPORT.ASM
*/
#ifdef __cplusplus
extern "C" {
#endif
void __cdecl Remove_From_List(void **list, int *index, void * ptr);
void * __cdecl Conquer_Build_Fading_Table(void const *palette, void *dest, int color, int frac);
void __cdecl Fat_Put_Pixel(int x, int y, int color, int size, GraphicViewPortClass &);
void __cdecl strtrim(char *buffer);
long __cdecl Get_EAX( void );
#ifdef __cplusplus
}
#endif
/*
** TARCOM.CPP
*/
/*
** TARGET.CPP
*/
COORDINATE As_Movement_Coord(TARGET target);
AircraftClass * As_Aircraft(TARGET target, bool check_active = true);
AnimClass * As_Animation(TARGET target, bool check_active = true);
BuildingClass * As_Building(TARGET target, bool check_active = true);
BulletClass * As_Bullet(TARGET target, bool check_active = true);
CELL As_Cell(TARGET target);
COORDINATE As_Coord(TARGET target);
InfantryClass * As_Infantry(TARGET target, bool check_active = true);
TeamClass * As_Team(TARGET target, bool check_active = true);
TeamTypeClass * As_TeamType(TARGET target);
TechnoClass * As_Techno(TARGET target, bool check_active = true);
//TerrainClass * As_Terrain(TARGET target);
TriggerClass * As_Trigger(TARGET target, bool check_active = true);
UnitClass * As_Unit(TARGET target, bool check_active = true);
bool Target_Legal(TARGET target);
ObjectClass * As_Object(TARGET target, bool check_active = true);
/*
** ULOGIC.CPP
*/
int Terrain_Cost(CELL cell, FacingType facing);
/*
** Inline miscellaneous functions.
*/
#define XYP_COORD(x,y) (unsigned long)(((x)*ICON_LEPTON_W)/CELL_PIXEL_W + ((((y)*ICON_LEPTON_H)/CELL_PIXEL_H)<<16))
inline FacingType Dir_Facing(DirType facing) {return (FacingType)(((unsigned char)(facing+0x10)&0xFF)>>5);}
inline DirType Facing_Dir(FacingType facing) {return (DirType)((int)facing << 5);}
inline int Cell_To_Lepton(int cell) {return cell<<8;}
inline int Lepton_To_Cell(int lepton) {return ((unsigned)(lepton + 0x0080))>>8;}
inline CELL XY_Cell(int x, int y) {return ((CELL)(((y)<<6)|(x)));}
inline COORDINATE XY_Coord(int x, int y) {return ((COORDINATE)MAKE_LONG(y, x));}
inline int Coord_X(COORDINATE coord) {return (short)(LOW_WORD(coord));}
inline int Coord_Y(COORDINATE coord) {return (short)(HIGH_WORD(coord));}
inline int Cell_X(CELL cell) {return (int)(((unsigned)cell) & 0x3F);}
inline int Cell_Y(CELL cell) {return (int)(((unsigned)cell) >> 6);}
inline int Dir_Diff(DirType dir1, DirType dir2) {return (int)(*((signed char*)&dir2) - *((signed char*)&dir1));}
inline CELL Coord_XLepton(COORDINATE coord) {return (CELL)(*((unsigned char*)&coord));}
inline CELL Coord_YLepton(COORDINATE coord) {return (CELL)(*(((unsigned char*)&coord)+2));}
//inline COORD CellXY_Coord(unsigned x, unsigned y) {return (COORD)(MAKE_LONG(y<<8, x<<8));}
inline COORDINATE Coord_Add(COORDINATE coord1, COORDINATE coord2) {return (COORDINATE)MAKE_LONG((*((short*)(&coord1)+1) + *((short*)(&coord2)+1)), (*((short*)(&coord1)) + *((short*)(&coord2))));}
inline COORDINATE Coord_Sub(COORDINATE coord1, COORDINATE coord2) {return (COORDINATE)MAKE_LONG((*((short*)(&coord1)+1) - *((short*)(&coord2)+1)), (*((short*)(&coord1)) - *((short*)(&coord2))));}
inline COORDINATE Coord_Snap(COORDINATE coord) {return (COORDINATE)MAKE_LONG((((*(((unsigned short *)&coord)+1))&0xFF00)|0x80), (((*((unsigned short *)&coord))&0xFF00)|0x80));}
inline COORDINATE Coord_Mid(COORDINATE coord1, COORDINATE coord2) {return (COORDINATE)MAKE_LONG((*((unsigned short *)(&coord1)+1) + *((unsigned short *)(&coord2)+1))>>1, (*((unsigned short *)(&coord1)) + *((unsigned short *)(&coord2)))>>1);}
inline COORDINATE Cell_Coord(CELL cell) {return (COORDINATE) MAKE_LONG( (((cell & 0x0FC0)<<2)|0x80), ((((cell & 0x003F)<<1)+1)<<7) );}
inline COORDINATE XYPixel_Coord(int x, int y) {return ((COORDINATE)MAKE_LONG((int)(((long)y*(long)ICON_LEPTON_H)/(long)ICON_PIXEL_H)/*+LEPTON_OFFSET_Y*/, (int)(((long)x*(long)ICON_LEPTON_W)/(long)ICON_PIXEL_W)/*+LEPTON_OFFSET_X*/));}
//inline int Facing_To_16(int facing) {return Facing16[facing];}
inline int Facing_To_32(DirType facing) {return Facing32[facing];}
inline DirType Direction256(COORDINATE coord1, COORDINATE coord2) {return ((DirType)Desired_Facing256(Coord_X(coord1), Coord_Y(coord1), Coord_X(coord2), Coord_Y(coord2)));}
inline DirType Direction(COORDINATE coord1, COORDINATE coord2) {return ((DirType)Desired_Facing256(Coord_X(coord1), Coord_Y(coord1), Coord_X(coord2), Coord_Y(coord2)));}
inline DirType Direction8(COORDINATE coord1, COORDINATE coord2) {return ((DirType)Desired_Facing8(Coord_X(coord1), Coord_Y(coord1), Coord_X(coord2), Coord_Y(coord2)));}
//inline int Direction16(COORDINATE coord1, COORD coord2) {return (Desired_Facing16(Coord_X(coord1), Coord_Y(coord1), Coord_X(coord2), Coord_Y(coord2)));}
inline DirType Direction(CELL cell1, CELL cell2) {return (DirType)(Desired_Facing8(Cell_X(cell1), Cell_Y(cell1), Cell_X(cell2), Cell_Y(cell2)));}
inline COORDINATE Adjacent_Cell(COORDINATE coord, FacingType dir) {return (Coord_Snap(Coord_Add(AdjacentCoord[dir & 0x07], coord)));}
inline COORDINATE Adjacent_Cell(COORDINATE coord, DirType dir) {return Adjacent_Cell(coord, Dir_Facing(dir));}
inline CELL Adjacent_Cell(CELL cell, FacingType dir) {return (CELL)(cell + AdjacentCell[dir]);}
inline CELL Adjacent_Cell(CELL cell, DirType dir) {return (CELL)(cell + AdjacentCell[Dir_Facing(dir)]);}
inline int Lepton_To_Pixel(int lepton) {return ((lepton * ICON_PIXEL_W) + (ICON_LEPTON_W / 2) - ((lepton < 0) ? (ICON_LEPTON_W - 1) : 0)) / ICON_LEPTON_W;}
inline int Pixel_To_Lepton(int pixel) {return ((pixel * ICON_LEPTON_W) + (ICON_PIXEL_W / 2) - ((pixel < 0) ? (ICON_PIXEL_W - 1) : 0)) / ICON_PIXEL_W;}
//inline FacingType Facing_To_8(DirType facing) {return (FacingType)(((unsigned char)(facing|0x10))>>5);}
inline COORDINATE XYP_Coord(int x,int y) {return XY_Coord(Pixel_To_Lepton(x), Pixel_To_Lepton(y));};
inline char const * Text_String(int string) {return(Extract_String(SystemStrings, string));};
//
// We need to know when the visible page changes
// ST - 1/4/2019 10:31AM
//
void Blit_Hid_Page_To_Seen_Buff(void);
extern bool RunningAsDLL;
template<class T> inline T Random_Picky(T a, T b, char *sfile, int line)
{
sfile = sfile;
line = line;
return (T)IRandom((int)a, (int)b); //, sfile, line);
};
#define Random_Pick(low, high) Random_Picky ( (low), (high), __FILE__, __LINE__)
template<class T> inline T Sim_Random_Pick(T a, T b)
{
return (T)Sim_IRandom((int)a, (int)b);
};
#ifdef CHEAT_KEYS
#define Check_Ptr(ptr,file,line) \
{ \
if (!ptr) { \
Mono_Clear_Screen(); \
Mono_Printf("NULL Pointer, Module:%s, line:%d!\n",file,line); \
Prog_End(); \
exit(EXIT_SUCCESS); \
} \
}
#else
#define Check_Ptr(ptr,file,line)
#endif
/*
** These routines are for coding & decoding multiplayer ID's
*/
inline PlayerColorType MPlayerID_To_ColorIndex(unsigned short id) {return (PlayerColorType)(id >> 4);}
inline HousesType MPlayerID_To_HousesType(unsigned short id) {return ((HousesType)(id & 0x000f)); }
inline unsigned short Build_MPlayerID(int c_idx, HousesType htype) { return ((c_idx << 4) | htype); }
//
// True if we are the currently in focus windows app
//
extern bool GameInFocus;
extern int ScreenWidth;
extern int ScreenHeight;
extern "C" void ModeX_Blit (GraphicBufferClass *source);
extern void Colour_Debug (int call_number);
extern unsigned char *InterpolatedPalettes[100];
extern BOOL PalettesRead;
extern unsigned PaletteCounter;
extern "C"{
extern unsigned char PaletteInterpolationTable[SIZE_OF_PALETTE][SIZE_OF_PALETTE];
extern unsigned char *InterpolationPalette;
}
extern void Free_Interpolated_Palettes(void);
extern int Load_Interpolated_Palettes(char const *filename, BOOL add=FALSE);
#define CELL_BLIT_ONLY 1
#define CELL_DRAW_ONLY 2
/***********************************************************************************************
* Distance -- Determines the lepton distance between two coordinates. *
* *
* This routine is used to determine the distance between two coordinates. It uses the *
* Dragon Strike method of distance determination and thus it is very fast. *
* *
* INPUT: coord1 -- First coordinate. *
* *
* coord2 -- Second coordinate. *
* *
* OUTPUT: Returns the lepton distance between the two coordinates. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 05/27/1994 JLB : Created. *
*=============================================================================================*/
int Distance_Coord(COORDINATE coord1, COORDINATE coord2);
#if (0)
#pragma aux Distance_Coord parm [eax] [ebx] \
modify [edx ebx] \
value [eax] = \
"mov dx,ax" \
"sub dx,bx" \
"jg okx" \
"neg dx" \
"okx:" \
"shr eax,16" \
"shr ebx,16" \
"sub ax,bx" \
"jg oky" \
"neg ax" \
"oky:" \
"cmp ax,dx" \
"jg ok" \
"xchg ax,dx" \
"ok:" \
"shr dx,1" \
"add ax,dx"
#endif
inline int Distance(COORDINATE coord1, COORDINATE coord2)
{
#ifdef NEVER
int diff1, diff2;
diff1 = Coord_Y(coord1) - Coord_Y(coord2);
if (diff1 < 0) diff1 = -diff1;
diff2 = Coord_X(coord1) - Coord_X(coord2);
if (diff2 < 0) diff2 = -diff2;
if (diff1 > diff2) {
return(diff1 + (diff2>>1));
}
return(diff2 + (diff1>>1));
#else
return(Distance_Coord(coord1, coord2));
#endif
}
/***********************************************************************************************
* Distance -- Determines the cell distance between two cells. *
* *
* Use this routine to determine the distance between the two cells specified. The distance *
* is returned in cells. *
* *
* INPUT: cell1, cell2 -- The two cells to determine the distance between. *
* *
* OUTPUT: Returns with the distance between the two cells in units of cell size. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 12/23/1994 JLB : Created. *
*=============================================================================================*/
inline int Distance(CELL coord1, CELL coord2)
{
int diff1, diff2;
diff1 = Cell_Y(coord1) - Cell_Y(coord2);
if (diff1 < 0) diff1 = -diff1;
diff2 = Cell_X(coord1) - Cell_X(coord2);
if (diff2 < 0) diff2 = -diff2;
if (diff1 > diff2) {
return(diff1 + (diff2>>1));
}
return(diff2 + (diff1>>1));
}
/***********************************************************************************************
* CellClass::Cell_Number -- Returns the cell ID number for this cell object. *
* *
* Call this routine if you wish to determine what the cell number ID is for the currrent *
* cell object. This ID number is the index number into the cell array. *
* *
* INPUT: none *
* *
* OUTPUT: Returns with the cell number for this cell object. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 03/19/1995 JLB : Created. *
*=============================================================================================*/
inline CELL CellClass::Cell_Number(void) const
{
return(Map.ID(this));
}
#if(0)
#ifndef NOMEMCHECK
#define NO_INTERCEPT
#include "memcheck.h"
#endif
#endif
void WWDOS_Shutdown(void);
#endif
/*
** Debug output. ST - 6/27/2019 10:00PM
*/
void GlyphX_Debug_Print(const char *debug_text);
/*
** Achievement event. ST - 11/11/2019 11:39AM
*/
void On_Achievement_Event(const HouseClass* player_ptr, const char *achievement_type, const char *achievement_reason);