CnC_Remastered_Collection/TIBERIANDAWN/HOUSE.H

899 lines
29 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\house.h_v 2.21 16 Oct 1995 16:46:14 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 : HOUSE.H *
* *
* Programmer : Joe L. Bostic *
* *
* Start Date : May 21, 1994 *
* *
* Last Update : May 21, 1994 [JLB] *
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#ifndef HOUSE_H
#define HOUSE_H
#include "type.h"
#include "region.h"
#include "vector.h"
#include "COORDA.h"
#include "Credits.h"
//extern "C" {
//unsigned Cardinal_To_Fixed(unsigned base, unsigned cardinal);
//}
class TriggerClass;
#ifdef USE_RA_AI
class FootClass; // ST - 7/17/2019 11:54AM
class FactoryClass; // ST - 7/17/2019 11:54AM
#endif // USE_RA_AI
/****************************************************************************
** Player control structure. Each player (computer or human) has one of
** these structures associated. These are located in a global array.
*/
//#define REBUILD_MAX 5 // Maximum number of structures to rebuild.
class HouseClass {
public:
/*
** Pointer to the HouseTypeClass that this house is "owned" by.
** All constant data for a house type is stored in that class.
*/
HouseTypeClass const * const Class;
/*
** Override handicap control values.
*/
float FirepowerBias;
float GroundspeedBias;
float AirspeedBias;
float ArmorBias;
float ROFBias;
float CostBias;
float BuildSpeedBias;
float RepairDelay;
float BuildDelay;
/*
** This is the house type that this house object should act like. This
** value controls production choices and radar cover plate imagery.
*/
HousesType ActLike;
/*
** Is this player active? Usually that answer is true, but for civilians, it
** might possibly be false.
*/
unsigned IsActive:1;
/*
** If this house is controlled by the player, then this flag will be true. The
** computer controls all other active houses.
*/
unsigned IsHuman:1;
unsigned WasHuman:1;
/*
** When the computer becomes alerted to the presence of the player's forces, it
** begins production and attack logic. This flag is set to true if the human
** player has been discovered by the computer.
*/
unsigned IsStarted:1;
/*
** When alerted, the house will create teams of the special "auto" type and
** will generate appropriate units to fill those team types.
*/
unsigned IsAlerted:1;
/*
** If the house has been discovered, then this flag will be set
** to true. However, the trigger even associated with discovery
** will only be executed during the next house AI process.
*/
unsigned IsDiscovered:1;
/*
** If Tiberium storage is maxed out, then this flag will be set. At some point
** the player is told of this fact and then this flag is cleared. This allows the
** player to be told, but only occationally rather than continuously.
*/
unsigned IsMaxedOut:1;
/*
** If this house is played by a human in a multiplayer game, this flag
** keeps track of whether this house has been defeated or not.
*/
unsigned IsDefeated:1;
/*
** These flags are used in conjunction with the BorrowedTime timer. When
** that timer expires and one of these flags are set, then that event is
** applied to the house. This allows a dramatic pause between the event
** trigger and the result.
*/
unsigned IsToDie:1;
unsigned IsToWin:1;
unsigned IsToLose:1;
/*
** This flag is set when a transport carrying a civilian has been
** successfully evacuated. It is presumed that a possible trigger
** event will be sprung by this event.
*/
unsigned IsCivEvacuated:1;
/*
** If potentially something changed that might affect the sidebar list of
** buildable objects, then this flag indicates that at the first LEGAL opportunity,
** the sidebar will be recalculated.
*/
unsigned IsRecalcNeeded:1;
/*
** If the map has been completely revealed to the player, then this flag
** will be set to true. By examining this flag, a second "reveal all map"
** crate won't be given to the player.
*/
unsigned IsVisionary:1;
/*
** If a trigger has indicated that the airstrike option should appear, this flag
** will be set to true. It is up to the normal house AI processing to actually
** add the airstrike to the sidebar.
*/
unsigned IsAirstrikePending:1;
/*
** This records the existance of the three nuke weapon pieces.
*/
unsigned NukePieces:3;
/*
** This flag indicates that a free harvester is pending and will be
** created when the FreeHarvester timer expires.
*/
unsigned IsFreeHarvester:1;
TCountDownTimerClass FreeHarvester;
/*
** These super weapon control objects are used to control the recharge
** and availability of these special weapons to this house.
*/
SuperClass IonCannon;
SuperClass AirStrike;
SuperClass NukeStrike;
/*
** This is a record of the last building that was built. For buildings that
** were built as a part of scenario creation, it will be the last one
** discovered.
*/
StructType JustBuilt;
/*
** This records the number of triggers associated with this house that are
** blocking a win condition. A win will only occur if all the blocking
** triggers have been deleted.
*/
int Blockage;
/*
** This timer controls the computer auto-attack logic. When this timer expires
** and the house has been alerted, then it will create a set of attack
** teams.
*/
TCountDownTimerClass AlertTime;
/*
** This timer is used to handle the delay between some catastrophic
** event trigger and when it is actually carried out.
*/
TCountDownTimerClass BorrowedTime;
/*
** This is the last working scan bits for buildings. If a building is
** active and owned by this house, it will have a bit set in this element
** that corresponds to the building type number. Since this value is
** accumulated over time, the "New" element contains the under-construction
** version.
*/
unsigned long BScan;
unsigned long ActiveBScan;
unsigned long NewBScan;
unsigned long NewActiveBScan;
#ifdef USE_RA_AI
unsigned long OldBScan;
#endif
/*
** This is the last working scan bits for units. For every existing unit
** type owned by this house, a corresponding bit is set in this element. As
** the scan bits are being constructed, they are built into the "New" element
** and then duplicated into the regular element at the end of every logic cycle.
*/
unsigned long UScan;
unsigned long ActiveUScan;
unsigned long NewUScan;
unsigned long NewActiveUScan;
/*
** Infantry type existence bits. Similar to unit and building bits.
*/
unsigned long IScan;
unsigned long ActiveIScan;
unsigned long NewIScan;
unsigned long NewActiveIScan;
/*
** Aircraft type existence bits. Similar to unit and building buts.
*/
unsigned long AScan;
unsigned long ActiveAScan;
unsigned long NewAScan;
unsigned long NewActiveAScan;
/*
** Record of gains and losses for this house during the course of the
** scenario.
*/
unsigned CreditsSpent;
unsigned HarvestedCredits;
/*
** This is the running count of the number of units owned by this house. This
** value is used to keep track of ownership limits.
*/
unsigned CurUnits;
unsigned CurBuildings;
#ifdef USE_RA_AI
unsigned CurInfantry; // Added from RA for AI. ST - 7/17/2019 12:03PM
unsigned CurAircraft; // Added from RA for AI. ST - 7/17/2019 12:03PM
#endif //USE_RA_AI
/*
** This is the maximum number allowed to be built by this house. The
** value depends on the scenario being played.
*/
unsigned MaxUnit;
unsigned MaxBuilding;
#ifdef USE_RA_AI
unsigned MaxInfantry; // Added from RA for AI. ST - 7/19/2019 4:31PM
unsigned MaxAircraft; // Added from RA for AI. ST - 7/19/2019 4:31PM
#endif //USE_RA_AI
/*
** This is the running total of the number of credits this house has accumulated.
*/
long Tiberium;
long Credits;
long InitialCredits;
long Capacity;
/*
** Did this house lose via resignation?
*/
unsigned Resigned:1;
/*
** Did this house lose because the player quit?
*/
unsigned IGaveUp:1;
/*
** Stuff to keep track of the total number of units built by this house.
*/
UnitTrackerClass *AircraftTotals;
UnitTrackerClass *InfantryTotals;
UnitTrackerClass *UnitTotals;
UnitTrackerClass *BuildingTotals;
/*
** Total number of units destroyed by this house
*/
UnitTrackerClass *DestroyedAircraft;
UnitTrackerClass *DestroyedInfantry;
UnitTrackerClass *DestroyedUnits;
UnitTrackerClass *DestroyedBuildings;
/*
** Total number of enemy buildings captured by this house
*/
UnitTrackerClass *CapturedBuildings;
/*
** Total number of crates found by this house
*/
UnitTrackerClass *TotalCrates;
/*
** Records the number of infantry and vehicle factories active. This value is
** used to regulate the speed of production.
*/
int AircraftFactories;
int InfantryFactories;
int UnitFactories;
int BuildingFactories;
int SpecialFactories;
/*
** This is the accumulation of the total power and drain factors. From these
** values a ratio can be derived. This ratio is used to control the rate
** of building decay.
*/
int Power; // Current power output.
int Drain; // Power consumption.
/*
** For generic (unspecified) reinforcements, they arrive by a common method. This
** specifies which method is to be used.
*/
SourceType Edge;
/*
** For human controlled houses, only one type of unit can be produced
** at any one instant. These factory objects control this production.
*/
int AircraftFactory;
int InfantryFactory;
int UnitFactory;
int BuildingFactory;
int SpecialFactory;
/*
** For human controlled houses, the current state of the radar map
*/
RadarEnum Radar;
/*
** This target value specifies where the flag is located. It might be a cell
** or it might be an object.
*/
TARGET FlagLocation;
/*
** This is the flag-home-cell for this house. This is where we must bring
** another house's flag back to, to defeat that house.
*/
CELL FlagHome;
/*
** For multiplayer games, each house instance has a remap table; the table
** in the HousesTypeClass isn't used. This variable is set to the remap
** table for the color the player wants to play.
*/
unsigned char const * RemapTable;
PlayerColorType RemapColor;
char Name[MPLAYER_NAME_MAX];
/*
** For multiplayer games, each house needs to keep track of how many
** objects of each other house they've killed.
*/
unsigned UnitsKilled[HOUSE_COUNT];
unsigned UnitsLost;
unsigned BuildingsKilled[HOUSE_COUNT];
unsigned BuildingsLost;
/*
** For multiplayer games, this keeps track of the last house to destroy
** one of my units.
*/
HousesType WhoLastHurtMe;
/*
** Start location (waypoint index) passed in from GlyphX
*/
int StartLocationOverride;
/*---------------------------------------------------------------------
** Constructors, Destructors, and overloaded operators.
*/
static void * operator new(size_t size);
static void operator delete(void *ptr);
HouseClass(void) : Class(0) {};
HouseClass(HousesType house);
~HouseClass(void);
operator HousesType(void) const;
/*---------------------------------------------------------------------
** Member function prototypes.
*/
ProdFailType Begin_Production(RTTIType type, int id);
ProdFailType Suspend_Production(RTTIType type);
ProdFailType Abandon_Production(RTTIType type);
bool Place_Object(RTTIType type, CELL cell);
bool Manual_Place(BuildingClass * builder, BuildingClass * object);
void Special_Weapon_AI(SpecialWeaponType id);
bool Place_Special_Blast(SpecialWeaponType id, CELL cell);
bool Flag_Attach(CELL cell, bool set_home = false);
bool Flag_Attach(UnitClass * object, bool set_home = false);
bool Flag_Remove(TARGET target, bool set_home = false);
void Init_Data(PlayerColorType color, HousesType house, int credits);
void Sell_Wall(CELL cell);
bool Flag_To_Die(void);
bool Flag_To_Win(void);
bool Flag_To_Lose(void);
void Make_Ally(HousesType house);
void Make_Ally(ObjectClass * object) {if (object) Make_Ally(object->Owner());};
void Make_Enemy(HousesType house);
void Make_Enemy(ObjectClass * object) {if (object) Make_Enemy(object->Owner());};
bool Is_Ally(HousesType house) const;
bool Is_Ally(HouseClass const * house) const;
bool Is_Ally(ObjectClass const * object) const;
#ifdef CHEAT_KEYS
void Debug_Dump(MonoClass *mono) const;
#endif
void AI(void);
bool Can_Build(StructType structure, HousesType house) const;
bool Can_Build(InfantryType infantry, HousesType house) const;
bool Can_Build(UnitType unit, HousesType) const;
bool Can_Build(AircraftType aircraft, HousesType house) const;
bool Can_Build(TechnoTypeClass const * type, HousesType house) const;
unsigned char const * Remap_Table(bool blushing=false, bool unit=false) const;
TechnoTypeClass const * Suggest_New_Object(RTTIType objectype) const;
bool Does_Enemy_Building_Exist(StructType) const;
void Harvested(unsigned tiberium);
long Available_Money(void) const;
void Spend_Money(unsigned money);
void Refund_Money(unsigned money);
void Attacked(BuildingClass* source);
#ifndef USE_RA_AI
void Adjust_Power(int adjust) {Power += adjust;}; // Replaced by function from RA. ST - 7/17/2019 11:51AM
void Adjust_Drain(int adjust) {Drain += adjust;}; // Replaced by function from RA. ST - 7/17/2019 11:51AM
#endif
int Adjust_Capacity(int adjust, bool inanger=false);
int Power_Fraction(void) const;
int Tiberium_Fraction(void) {return (!Tiberium) ? 0 : Cardinal_To_Fixed(Capacity, Tiberium);};
void Begin_Production(void) {IsStarted = true;};
TeamTypeClass const * Suggested_New_Team(bool alertcheck = false);
void Adjust_Threat(int region, int threat);
static void Init(void);
static void One_Time(void);
static HouseClass * As_Pointer(HousesType house);
/*
** File I/O.
*/
static void Read_INI(char *buffer);
static void Write_INI(char *buffer);
static void Read_Flag_INI(char *buffer);
static void Write_Flag_INI(char *buffer);
bool Load(FileClass & file);
bool Save(FileClass & file);
void Code_Pointers(void);
void Decode_Pointers(void);
/*
** Dee-buggin' support.
*/
int Validate(void) const;
/*
** Special house actions.
*/
// void Init_Ion_Cannon(bool first_time, bool one_time_effect = false);
// void Init_Air_Strike(bool first_time, bool one_time_effect = false);
// void Init_Nuke_Bomb(bool first_time, bool one_time_effect = false);
// void Remove_Ion_Cannon(void);
// void Remove_Air_Strike(void);
// void Remove_Nuke_Bomb(void);
void Detach(TARGET target, bool all);
void Add_Nuke_Piece(int piece=-1);
// void Make_Air_Strike_Available(bool present, bool one_time_effect = false);
bool Has_Nuke_Device(void);
/*
** New default win mode to avoid griefing. ST - 1/31/2020 3:33PM
*/
void Check_Pertinent_Structures(void);
void Init_Unit_Trackers(void);
void Free_Unit_Trackers(void);
#ifdef USE_RA_AI
/*
** AI Functions imported from RA
*/
//TechnoTypeClass const * Suggest_New_Object(RTTIType objectype, bool kennel=false) const;
BuildingTypeClass const * Suggest_New_Building(void) const;
void Recalc_Center(void);
//void Harvested(unsigned tiberium);
void Stole(unsigned worth);
//long Available_Money(void) const;
//void Spend_Money(unsigned money);
//void Refund_Money(unsigned money);
//void Attacked(void);
void Adjust_Power(int adjust);
void Adjust_Drain(int adjust);
//int Adjust_Capacity(int adjust, bool inanger=false);
//fixed Power_Fraction(void) const;
//fixed Tiberium_Fraction(void) const;
//void Begin_Production(void) {IsStarted = true;};
//TeamTypeClass const * Suggested_New_Team(bool alertcheck = false);
//void Adjust_Threat(int region, int threat);
void Tracking_Remove(TechnoClass const * techno);
void Tracking_Add(TechnoClass const * techno);
void Active_Remove(TechnoClass const * techno);
void Active_Add(TechnoClass const * techno);
UrgencyType Check_Attack(void) const;
UrgencyType Check_Build_Power(void) const;
UrgencyType Check_Build_Defense(void) const;
UrgencyType Check_Build_Offense(void) const;
UrgencyType Check_Build_Income(void) const;
UrgencyType Check_Fire_Sale(void) const;
UrgencyType Check_Build_Engineer(void) const;
UrgencyType Check_Raise_Money(void) const;
UrgencyType Check_Raise_Power(void) const;
UrgencyType Check_Lower_Power(void) const;
bool AI_Attack(UrgencyType urgency);
bool AI_Build_Power(UrgencyType urgency) const;
bool AI_Build_Defense(UrgencyType urgency) const;
bool AI_Build_Offense(UrgencyType urgency) const;
bool AI_Build_Income(UrgencyType urgency) const;
bool AI_Fire_Sale(UrgencyType urgency);
bool AI_Build_Engineer(UrgencyType urgency) const;
bool AI_Raise_Money(UrgencyType urgency) const;
bool AI_Raise_Power(UrgencyType urgency) const;
bool AI_Lower_Power(UrgencyType urgency) const;
bool Can_Make_Money(void) const {
return(Available_Money() > 300 || (BScan & STRUCTF_REFINERY));
};
int Expert_AI(void);
COORDINATE Find_Build_Location(BuildingClass * building) const;
BuildingClass * Find_Building(StructType type, ZoneType zone=ZONE_NONE) const;
int AI_Building(void);
int AI_Unit(void);
int AI_Vessel(void);
int AI_Infantry(void);
int AI_Aircraft(void);
void Production_Begun(TechnoClass const * rtti);
int * Factory_Counter(RTTIType rtti);
int Factory_Count(RTTIType rtti) const;
CELL Where_To_Go(FootClass const * object) const;
CELL Zone_Cell(ZoneType zone) const;
ZoneType Which_Zone(COORDINATE coord) const;
ZoneType Which_Zone(ObjectClass const * object) const;
ZoneType Which_Zone(CELL cell) const;
DiffType Assign_Handicap(DiffType handicap);
TARGET Find_Juicy_Target(COORDINATE coord) const;
int Get_Quantity(AircraftType aircraft);
int Get_Quantity(StructType building);
FactoryClass * Fetch_Factory(RTTIType rtti) const;
void Set_Factory(RTTIType rtti, FactoryClass * factory);
bool Fire_Sale(void);
bool Is_Hack_Prevented(RTTIType rtti, int value) const;
bool Is_No_YakMig(void) const;
CELL Random_Cell_In_Zone(ZoneType zone) const;
static void Computer_Paranoid(void);
bool Is_Allowed_To_Ally(HousesType house) const;
void Do_All_To_Hunt(void) const;
void Super_Weapon_Handler(void);
CELL Find_Cell_In_Zone(TechnoClass const * techno, ZoneType zone) const;
// Added so the ally flags could be sent to client machines - 09 / 12 / 2019 JAS
unsigned Get_Ally_Flags();
static void Recalc_Attributes(void);
#endif //USE_RA_AI
/*
** This vector holds the recorded status of the map regions. It is through
** this region information that team paths are calculated.
*/
RegionClass Regions[MAP_TOTAL_REGIONS];
#ifdef OBSOLETE
/*
** This count down timer class handles decrements and then changes
** the ion cannon state. If the Ion cannon was out of range it is
** now in range. If the Ion cannon was in range it will toggle out
** of range.
*/
TCountDownTimerClass IonControl;
int IonOldStage;
TCountDownTimerClass AirControl;
int AirOldStage;
TCountDownTimerClass NukeControl;
int NukeOldStage;
#endif
/*
** This timer is for multiplayer mode; for a computer-controlled house,
** it determines how long until this player "blitzes" the hapless humans.
*/
TCountDownTimerClass BlitzTime;
/*
** This count down timer class decrements and then changes
** the Atomic Bomb state.
*/
CELL NukeDest;
/*
** Per-house credits class to track the visible credits state for each house. Redundant in the original game, but needed
** to preserve the exact credits count behavior in the GlyphX client. ST - 10/16/2019 2:31PM
*/
CreditClass VisibleCredits;
bool DebugUnlockBuildables;
/*
** This routine completely removes this house & all its objects from the game.
*/
void Clobber_All(void);
/*
** This routine blows up everything in this house. Fun!
*/
void Blowup_All(void);
/*
** This routine gets called in multiplayer games when every unit, building,
** and infantry for a house is destroyed.
*/
void MPlayer_Defeated(void);
/*
** Screen shake timer.
*/
TCountDownTimerClass ScreenShakeTime;
private:
void Silo_Redraw_Check(long oldtib, long oldcap);
/*
** This is a bit field record of all the other houses that are allies with
** this house. It is presumed that any house that isn't an ally, is therefore
** an enemy. A house is always considered allied with itself.
*/
unsigned Allies;
/*
** This is the standard delay time between announcements concerning the
** state of the base or other intermittent house related events.
*/
enum SpeakDelayEnum {
SPEAK_DELAY=TICKS_PER_MINUTE*2,
TEAM_DELAY=TICKS_PER_MINUTE/10,
DAMAGE_DELAY=TICKS_PER_MINUTE
};
/*
** General low-power related damaged is doled out whenever this timer
** expires.
*/
TCountDownTimerClass DamageTime;
/*
** Team creation is done whenever this timer expires.
*/
TCountDownTimerClass TeamTime;
/*
** This controls the rate that the trigger time logic is processed.
*/
TCountDownTimerClass TriggerTime;
/*
** At various times, the computer may announce the player's condition. The following
** variables are used as countdown timers so that these announcements are paced
** far enough appart to reduce annoyance.
*/
TCountDownTimerClass SpeakAttackDelay;
TCountDownTimerClass SpeakPowerDelay;
TCountDownTimerClass SpeakMoneyDelay;
TCountDownTimerClass SpeakMaxedDelay;
#ifdef USE_RA_AI
/***************************************************************************************
**
** AI data imported from RA. ST - 7/17/2019 11:35AM
**
**
*/
public:
/*
** This records information about the location and size of
** the base.
*/
COORDINATE Center; // Center of the base.
int Radius; // Average building distance from center (leptons).
struct {
int AirDefense;
int ArmorDefense;
int InfantryDefense;
} ZoneInfo[ZONE_COUNT];
/*
** This records information about the last time a building of this
** side was attacked. This information is used to determine proper
** response.
*/
int LATime; // Time of attack.
RTTIType LAType; // Type of attacker.
ZoneType LAZone; // Last zone that was attacked.
HousesType LAEnemy; // Owner of attacker.
/*
** This target value is the building that must be captured as soon as possible.
** Typically, this will be one of the buildings of this house that has been
** captured and needs to be recaptured.
*/
TARGET ToCapture;
/*
** This value shows who is spying on this house's radar facilities.
** This is used for the other side to be able to update their radar
** map based on the cells that this house's units reveal.
*/
int RadarSpied;
/*
** Running score, based on units destroyed and units lost.
*/
int PointTotal;
/*
** This is the targeting directions for when this house gets a
** special weapon.
*/
//QuarryType PreferredTarget;
private:
/*
** Tracks number of each building type owned by this house. Even if the
** building is in construction, it will be reflected in this total.
*/
int BQuantity[STRUCT_COUNT];
int UQuantity[UNIT_COUNT];
int IQuantity[INFANTRY_COUNT];
int AQuantity[AIRCRAFT_COUNT];
/*
** This timer keeps track of when an all out attack should be performed.
** When this timer expires, send most of this house's units in an
** attack.
*/
/////CDTimerClass<FrameTimerClass> Attack;
TCountDownTimerClass Attack;
public:
/*
** This records the overriding enemy that the computer will try to
** destroy. Typically, this is the last house to attack, but can be
** influenced by nearness.
*/
HousesType Enemy;
/*
** The house expert system is regulated by this timer. Each computer controlled
** house will process the Expert System AI at intermittent intervals. Not only will
** this distribute the overhead more evenly, but will add variety to play.
*/
/////CDTimerClass<FrameTimerClass> AITimer;
TCountDownTimerClass AITimer;
/*
** For the moebius effect, this is a pointer to the unit that we
** selected to teleport. Only one teleporter should be active per house.
*/
//TARGET UnitToTeleport;
/*
** This elaborates the suggested objects to construct. When the specified object
** is constructed, then this corresponding value will be reset to nill state. The
** expert system decides what should be produced, and then records the
** recommendation in these variables.
*/
StructType BuildStructure;
UnitType BuildUnit;
InfantryType BuildInfantry;
AircraftType BuildAircraft;
//VesselType BuildVessel;
/*
** This records the current state of the base. This state is used to control
** what action the base will perform and directly affects production and
** unit disposition. The state will change according to time and combat
** events.
*/
StateType State;
/*
** If automatic base building is on, then this flag will be set to true.
*/
unsigned IsBaseBuilding:1;
/*
** This flag is set to true when the house has determined that
** there is insufficient Tiberium to keep the harvesters busy.
** In such a case, the further refinery/harvester production
** should cease. This is one of the first signs that the endgame
** has begun.
*/
unsigned IsTiberiumShort:1;
/*
** If this computer controlled house has reason to be mad at humans,
** then this flag will be true. Such a condition prevents alliances with
** a human and encourages the computers players to ally amongst themselves.
*/
unsigned IsParanoid:1;
/*
** This value indicates the degree of smartness to assign to this house.
** A value is zero is presumed for human controlled houses.
*/
int IQ;
/*
** This is the handicap (difficulty level) assigned to this house.
*/
DiffType Difficulty;
/*
** This structure is used to record a build request as determined by
** the house AI processing. Higher priority build requests take precidence.
*/
struct BuildChoiceClass {
static void * operator new(size_t, void * ptr) {return(ptr);};
UrgencyType Urgency; // The urgency of the build request.
StructType Structure; // The type of building to produce.
BuildChoiceClass(UrgencyType u, StructType s) : Urgency(u), Structure(s) {};
int Save(FileClass &) const {return(true);};
int Load(FileClass &) {return(true);};
void Code_Pointers(void) {};
void Decode_Pointers(void) {};
};
static TFixedIHeapClass<BuildChoiceClass> BuildChoice;
#endif // USE_RA_AI
/*
** Some additional padding in case we need to add data to the class and maintain backwards compatibility for save/load
*/
unsigned char SaveLoadPadding[256];
};
#endif