CnC_Remastered_Collection/REDALERT/HDATA.CPP
PG-SteveT 03416d24e1 Initial Source Code commit
Initial commit of original Tiberian Dawn and Red Alert source code converted to build as DLLs, and compatible with the release version of Command & Conquer Remastered.
2020-05-27 12:16:20 -07:00

524 lines
26 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/HDATA.CPP 1 3/03/97 10:24a 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 : HDATA.CPP *
* *
* Programmer : Joe L. Bostic *
* *
* Start Date : May 22, 1994 *
* *
* Last Update : September 4, 1996 [JLB] *
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* HouseTypeClass::As_Reference -- Fetches a reference to the house specified. *
* HouseTypeClass::From_Name -- Fetch house pointer from its name. *
* HouseTypeClass::HouseTypeClass -- Constructor for house type objects. *
* HouseTypeClass::Init_Heap -- Allocate all heap objects for the house types. *
* HouseTypeClass::One_Time -- One-time initialization *
* HouseTypeClass::Read_INI -- Fetch the house control values from ini database. *
* HouseTypeClass::Remap_Table -- Fetches the remap table for this house. *
* HouseTypeClass::operator delete -- Returns a house type object back to the heap. *
* HouseTypeClass::operator new -- Allocates a house type class object from special heap. *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "function.h"
static HouseTypeClass const HouseEngland(
HOUSE_ENGLAND,
"England", // NAME: House name.
TXT_ENGLAND, // FULLNAME: Translated house name.
"ENG", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_GREEN, // Remap color ID number.
'E' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseGermany(
HOUSE_GERMANY,
"Germany", // NAME: House name.
TXT_GERMANY, // FULLNAME: Translated house name.
"GER", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_GREY, // Remap color ID number.
'G' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseFrance(
HOUSE_FRANCE,
"France", // NAME: House name.
TXT_FRANCE, // FULLNAME: Translated house name.
"FRA", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_BLUE, // Remap color ID number.
'F' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseUkraine(
HOUSE_UKRAINE,
"Ukraine", // NAME: House name.
TXT_UKRAINE, // FULLNAME: Translated house name.
"UKA", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_ORANGE, // Remap color ID number.
'K' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseUSSR(
HOUSE_USSR,
"USSR", // NAME: House name.
TXT_USSR, // FULLNAME: Translated house name.
"RED", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_RED, // Remap color ID number.
'U' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseGreece(
HOUSE_GREECE,
"Greece", // NAME: House name.
TXT_GREECE, // FULLNAME: Translated house name.
"GRE", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_LTBLUE, // Remap color ID number.
'G' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseTurkey(
HOUSE_TURKEY,
"Turkey", // NAME: House name.
TXT_TURKEY, // FULLNAME: Translated house name.
"TRK", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_BROWN, // Remap color ID number.
'T' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseSpain(
HOUSE_SPAIN,
"Spain", // NAME: House name.
TXT_SPAIN, // FULLNAME: Translated house name.
"SPN", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_GOLD, // Remap color ID number.
'S' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseGood(
HOUSE_GOOD,
"GoodGuy", // NAME: House name.
TXT_GOODGUY, // FULLNAME: Translated house name.
"GDI", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_LTBLUE, // Remap color ID number.
'G' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseBad(
HOUSE_BAD,
"BadGuy", // NAME: House name.
TXT_BADGUY, // FULLNAME: Translated house name.
"NOD", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_RED, // Remap color ID number.
'B' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseCivilian(
HOUSE_NEUTRAL,
"Neutral", // NAME: House name.
TXT_CIVILIAN, // FULLNAME: Translated house name.
"CIV", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_GOLD, // Remap color ID number.
'C' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseJP(
HOUSE_JP,
"Special", // NAME: House name.
TXT_JP, // FULLNAME: Translated house name.
"JP", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_GOLD, // Remap color ID number.
'J' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseMulti1(
HOUSE_MULTI1,
"Multi1", // NAME: House name.
TXT_CIVILIAN, // FULLNAME: Translated house name.
"MP1", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_GOLD, // Remap color ID number.
'M' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseMulti2(
HOUSE_MULTI2,
"Multi2", // NAME: House name.
TXT_CIVILIAN, // FULLNAME: Translated house name.
"MP2", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_LTBLUE, // Remap color ID number.
'M' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseMulti3(
HOUSE_MULTI3,
"Multi3", // NAME: House name.
TXT_CIVILIAN, // FULLNAME: Translated house name.
"MP3", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_RED, // Remap color ID number.
'M' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseMulti4(
HOUSE_MULTI4,
"Multi4", // NAME: House name.
TXT_CIVILIAN, // FULLNAME: Translated house name.
"MP4", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_GREEN, // Remap color ID number.
'M' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseMulti5(
HOUSE_MULTI5,
"Multi5", // NAME: House name.
TXT_CIVILIAN, // FULLNAME: Translated house name.
"MP5", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_ORANGE, // Remap color ID number.
'M' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseMulti6(
HOUSE_MULTI6,
"Multi6", // NAME: House name.
TXT_CIVILIAN, // FULLNAME: Translated house name.
"MP6", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_GREY, // Remap color ID number.
'M' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseMulti7(
HOUSE_MULTI7,
"Multi7", // NAME: House name.
TXT_CIVILIAN, // FULLNAME: Translated house name.
"MP7", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_BLUE, // Remap color ID number.
'M' // VOICE: Voice prefix character.
);
static HouseTypeClass const HouseMulti8(
HOUSE_MULTI8,
"Multi8", // NAME: House name.
TXT_CIVILIAN, // FULLNAME: Translated house name.
"MP8", // SUFFIX: House file suffix.
0, // LEMON: Lemon vehicle frequency.
PCOLOR_BROWN, // Remap color ID number.
'M' // VOICE: Voice prefix character.
);
#ifdef OBSOLETE
HouseTypeClass const * const HouseTypeClass::Pointers[HOUSE_COUNT] = {
&HouseSpain,
&HouseGreece,
&HouseUSSR,
&HouseEngland,
&HouseUkraine,
&HouseGermany,
&HouseFrance,
&HouseTurkey,
&HouseGood,
&HouseBad,
&HouseCivilian,
&HouseJP,
&HouseMulti1,
&HouseMulti2,
&HouseMulti3,
&HouseMulti4,
&HouseMulti5,
&HouseMulti6,
&HouseMulti7,
&HouseMulti8,
};
#endif
/***********************************************************************************************
* HouseTypeClass::HouseTypeClass -- Constructor for house type objects. *
* *
* This is the constructor for house type objects. This object holds the constant data *
* for the house type. *
* *
* INPUT: see below... *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 06/21/1994 JLB : Created. *
*=============================================================================================*/
HouseTypeClass::HouseTypeClass(
HousesType house,
char const * ini,
int fullname,
char const * ext,
int lemon,
PlayerColorType remapcolor,
char prefix) :
AbstractTypeClass(RTTI_HOUSETYPE, house, fullname, ini),
// RTTI(RTTI_HOUSETYPE),
// ID(house),
House(house),
// IniName(ini),
// FullName(fullname),
Lemon(lemon),
RemapColor(remapcolor),
Prefix(prefix),
FirepowerBias(1),
GroundspeedBias(1),
AirspeedBias(1),
ArmorBias(1),
ROFBias(1),
CostBias(1),
BuildSpeedBias(1)
{
strncpy(Suffix, ext, 3);
Suffix[3] = '\0';
}
/***********************************************************************************************
* HouseTypeClass::operator new -- Allocates a house type class object from special heap. *
* *
* This will allocate a house type object from the special heap that is used to maintain *
* objects of this type. *
* *
* INPUT: none *
* *
* OUTPUT: Returns a pointer to the newly allocated house type object. *
* *
* WARNINGS: If there is insufficient room, this routine may return NULL. *
* *
* HISTORY: *
* 09/04/1996 JLB : Created. *
*=============================================================================================*/
void * HouseTypeClass::operator new(size_t)
{
return(HouseTypes.Alloc());
}
/***********************************************************************************************
* HouseTypeClass::operator delete -- Returns a house type object back to the heap. *
* *
* This will return the house type object specified back into the special heap that *
* is used to maintain house type objects. *
* *
* INPUT: ptr -- Pointer to the house type object to delete. *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 09/04/1996 JLB : Created. *
*=============================================================================================*/
void HouseTypeClass::operator delete(void * ptr)
{
HouseTypes.Free((HouseTypeClass *)ptr);
}
/***********************************************************************************************
* HouseTypeClass::Init_Heap -- Allocate all heap objects for the house types. *
* *
* This will preallocate all the house types. They must be allocated in a particular order. *
* *
* INPUT: none *
* *
* OUTPUT: none *
* *
* WARNINGS: This routine should be called only once at the beginning of the game. *
* *
* HISTORY: *
* 09/04/1996 JLB : Created. *
*=============================================================================================*/
void HouseTypeClass::Init_Heap(void)
{
/*
** These house type class objects must be allocated in the exact order that they
** are specified in the HousesType enumeration. This is necessary because the heap
** allocation block index serves double duty as the type number index.
*/
new HouseTypeClass(HouseSpain);
new HouseTypeClass(HouseGreece);
new HouseTypeClass(HouseUSSR);
new HouseTypeClass(HouseEngland);
new HouseTypeClass(HouseUkraine);
new HouseTypeClass(HouseGermany);
new HouseTypeClass(HouseFrance);
new HouseTypeClass(HouseTurkey);
new HouseTypeClass(HouseGood);
new HouseTypeClass(HouseBad);
new HouseTypeClass(HouseCivilian);
new HouseTypeClass(HouseJP);
new HouseTypeClass(HouseMulti1);
new HouseTypeClass(HouseMulti2);
new HouseTypeClass(HouseMulti3);
new HouseTypeClass(HouseMulti4);
new HouseTypeClass(HouseMulti5);
new HouseTypeClass(HouseMulti6);
new HouseTypeClass(HouseMulti7);
new HouseTypeClass(HouseMulti8);
}
/***********************************************************************************************
* HouseTypeClass::From_Name -- Fetch house pointer from its name. *
* *
* This routine will convert the ASCII house name specified into a *
* real house number. Typically, this is used when processing a *
* scenario INI file. *
* *
* INPUT: name -- ASCII name of house to process. *
* *
* OUTPUT: Returns with actual house number represented by the ASCII *
* name specified. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 10/07/1992 JLB : Created. *
* 05/21/1994 JLB : Converted to member function. *
*=============================================================================================*/
HousesType HouseTypeClass::From_Name(char const * name)
{
if (name != NULL) {
for (HousesType house = HOUSE_FIRST; house < HOUSE_COUNT; house++) {
if (stricmp(As_Reference(house).IniName, name) == 0) {
// if (stricmp(Pointers[house]->IniName, name) == 0) {
return(house);
}
}
}
return(HOUSE_NONE);
}
/***********************************************************************************************
* HouseTypeClass::One_Time -- One-time initialization *
* *
* INPUT: none *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 05/21/1994 JLB : Converted to member function. *
* 06/19/1996 JLB : Converted to regular heap class management. *
*=============================================================================================*/
void HouseTypeClass::One_Time(void)
{
}
/***********************************************************************************************
* HouseTypeClass::As_Reference -- Fetches a reference to the house specified. *
* *
* Use this routine to fetch a reference to the house number specified. *
* *
* INPUT: house -- The house number (HousesType) to look up. *
* *
* OUTPUT: Returns with a reference to the HouseTypeClass object that matches the house *
* number specified. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 01/23/1995 JLB : Created. *
*=============================================================================================*/
HouseTypeClass & HouseTypeClass::As_Reference(HousesType house)
{
return(*HouseTypes.Ptr(house));
}
/***********************************************************************************************
* HouseTypeClass::Remap_Table -- Fetches the remap table for this house. *
* *
* Use this routine to fetch the remap table assigned to this house. The remap table is *
* what gives the house's units/buildings their distinctive color. *
* *
* INPUT: none *
* *
* OUTPUT: Returns with a pointer to the remap table to use for this house. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 06/03/1996 JLB : Created. *
*=============================================================================================*/
unsigned char const * HouseTypeClass::Remap_Table(void) const
{
return(ColorRemaps[RemapColor].RemapTable);
}
/***********************************************************************************************
* HouseTypeClass::Read_INI -- Fetch the house control values from ini database. *
* *
* This routine will fetch the rules controllable values for the house type from the *
* INI database specified. *
* *
* INPUT: ini -- Reference to the INI database to fetch the house control values from. *
* *
* OUTPUT: bool; Was the house section found and processed? *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 09/04/1996 JLB : Created. *
*=============================================================================================*/
bool HouseTypeClass::Read_INI(CCINIClass & ini)
{
if (ini.Is_Present(Name())) {
FirepowerBias = ini.Get_Fixed(Name(), "Firepower", FirepowerBias);
GroundspeedBias = ini.Get_Fixed(Name(), "Groundspeed", GroundspeedBias);
AirspeedBias = ini.Get_Fixed(Name(), "Airspeed", AirspeedBias);
ArmorBias = ini.Get_Fixed(Name(), "Armor", ArmorBias);
ROFBias = ini.Get_Fixed(Name(), "ROF", ROFBias);
CostBias = ini.Get_Fixed(Name(), "Cost", CostBias);
BuildSpeedBias = ini.Get_Fixed(Name(), "BuildTime", BuildSpeedBias);
return(true);
}
return(false);
}