From ea28cb59c101496408e08b15fc67315e24e61808 Mon Sep 17 00:00:00 2001 From: OmniBlade Date: Fri, 14 Oct 2022 13:33:40 +0100 Subject: [PATCH] [TD] Adds support for [Recharge] section of rules.ini. Also adds support for loading rules from scenario ini files. --- tiberiandawn/house.cpp | 6 ++--- tiberiandawn/rules.cpp | 42 +++++++++++++++++++++++++++++++ tiberiandawn/rules.h | 6 +++++ tiberiandawn/saveload.cpp | 35 ++++++++++++++++++++++++++ tiberiandawn/scenarioini.cpp | 48 ++++++++++++++++++++++++++++++++++++ 5 files changed, 134 insertions(+), 3 deletions(-) diff --git a/tiberiandawn/house.cpp b/tiberiandawn/house.cpp index 1115d860..a575920b 100644 --- a/tiberiandawn/house.cpp +++ b/tiberiandawn/house.cpp @@ -353,9 +353,9 @@ void HouseClass::operator delete(void* ptr) *=============================================================================================*/ HouseClass::HouseClass(HousesType house) : Class(&HouseTypeClass::As_Reference(house)) - , IonCannon(ION_CANNON_GONE_TIME, VOX_ION_READY, VOX_ION_CHARGING, VOX_ION_CHARGING, VOX_NO_POWER) - , AirStrike(AIR_CANNON_GONE_TIME, VOX_AIRSTRIKE_READY, VOX_NONE, VOX_NOT_READY, VOX_NOT_READY) - , NukeStrike(NUKE_GONE_TIME, VOX_NUKE_AVAILABLE, VOX_NONE, VOX_NOT_READY, VOX_NO_POWER) + , IonCannon(TICKS_PER_MINUTE * Rule.IonTime, VOX_ION_READY, VOX_ION_CHARGING, VOX_ION_CHARGING, VOX_NO_POWER) + , AirStrike(TICKS_PER_MINUTE * Rule.AirStrikeTime, VOX_AIRSTRIKE_READY, VOX_NONE, VOX_NOT_READY, VOX_NOT_READY) + , NukeStrike(TICKS_PER_MINUTE * Rule.NukeTime, VOX_NUKE_AVAILABLE, VOX_NONE, VOX_NOT_READY, VOX_NO_POWER) , AircraftTotals() , InfantryTotals() , UnitTotals() diff --git a/tiberiandawn/rules.cpp b/tiberiandawn/rules.cpp index 96e30e09..9826123d 100644 --- a/tiberiandawn/rules.cpp +++ b/tiberiandawn/rules.cpp @@ -132,6 +132,9 @@ RulesClass::RulesClass(void) , AllowSuperWeapons(true) , IsThreePoint(false) , IsBoxing(false) + , NukeTime(14) + , IonTime(10) + , AirStrikeTime(8) { #ifndef REMASTER_BUILD @@ -267,6 +270,7 @@ static void Difficulty_Put(CCINIClass& ini, DifficultyClass& diff, char const* s bool RulesClass::Process(CCINIClass& ini) { General(ini); + Recharge(ini); AI(ini); IQ(ini); Difficulty(ini); @@ -291,6 +295,7 @@ bool RulesClass::Process(CCINIClass& ini) bool RulesClass::Export(CCINIClass& ini) { Export_General(ini); + Export_Recharge(ini); Export_AI(ini); Export_IQ(ini); Export_Difficulty(ini); @@ -337,6 +342,43 @@ bool RulesClass::General(CCINIClass& ini) return (false); } +/*********************************************************************************************** + * RulesClass::Recharge -- Process the super weapon recharge statistics. * + * * + * Use this to set the recharge times for the various super weapons available. * + * * + * INPUT: ini -- Reference to the database. * + * * + * OUTPUT: bool; Was the recharge section found and processed? * + * * + * WARNINGS: none * + * * + * HISTORY: * + * 08/08/1996 JLB : Created. * + *=============================================================================================*/ +bool RulesClass::Recharge(CCINIClass& ini) +{ + static char const* const RECHARGE = "Recharge"; + if (ini.Is_Present(RECHARGE)) { + AirStrikeTime = ini.Get_Fixed(RECHARGE, "AirStrike", AirStrikeTime); + IonTime = ini.Get_Fixed(RECHARGE, "IonCannon", IonTime); + NukeTime = ini.Get_Fixed(RECHARGE, "Nuke", NukeTime); + return (true); + } + return (false); +} + +bool RulesClass::Export_Recharge(CCINIClass& ini) +{ + static char const RECHARGE[] = "Recharge"; + + ini.Put_Fixed(RECHARGE, "AirStrike", AirStrikeTime); + ini.Put_Fixed(RECHARGE, "IonCannon", IonTime); + ini.Put_Fixed(RECHARGE, "Nuke", NukeTime); + + return (true); +} + /*********************************************************************************************** * RulesClass::General -- Process the general main game rules. * * * diff --git a/tiberiandawn/rules.h b/tiberiandawn/rules.h index aad3a6bc..0ee8ddd6 100644 --- a/tiberiandawn/rules.h +++ b/tiberiandawn/rules.h @@ -67,11 +67,13 @@ class RulesClass bool Process(CCINIClass& file); bool General(CCINIClass& ini); + bool Recharge(CCINIClass& ini); bool AI(CCINIClass& ini); bool IQ(CCINIClass& ini); bool Difficulty(CCINIClass& ini); bool Export(CCINIClass& file); bool Export_General(CCINIClass& ini); + bool Export_Recharge(CCINIClass& ini); bool Export_AI(CCINIClass& ini); bool Export_IQ(CCINIClass& ini); bool Export_Difficulty(CCINIClass& ini); @@ -340,6 +342,10 @@ class RulesClass ** this flag is true. */ bool IsBoxing; + + fixed NukeTime; + fixed IonTime; + fixed AirStrikeTime; }; bool Is_MCV_Deploy(); diff --git a/tiberiandawn/saveload.cpp b/tiberiandawn/saveload.cpp index 12c562d8..0db689f8 100644 --- a/tiberiandawn/saveload.cpp +++ b/tiberiandawn/saveload.cpp @@ -527,6 +527,41 @@ bool Load_Game(const char* file_name) #endif Call_Back(); + + /* + ** Rescan the scenario file for any rules updates. + */ + CCINIClass ini; + CCFileClass scenarioFile(Scen.ScenarioName); + int result = ini.Load(scenarioFile, true); + + /* + ** Reset the rules values to their initial settings. + */ + Rule.General(RuleINI); + Rule.Recharge(RuleINI); + Rule.AI(RuleINI); + // Rule.Powerups(RuleINI); + // Rule.Land_Types(RuleINI); + // Rule.Themes(RuleINI); + Rule.IQ(RuleINI); + // Rule.Objects(RuleINI); + Rule.Difficulty(RuleINI); + + /* + ** Override any rules values specified in this + ** particular scenario file. + */ + Rule.General(ini); + Rule.Recharge(ini); + Rule.AI(ini); + // Rule.Powerups(RuleINI); + // Rule.Land_Types(RuleINI); + // Rule.Themes(RuleINI); + Rule.IQ(ini); + // Rule.Objects(RuleINI); + Rule.Difficulty(ini); + return (true); } diff --git a/tiberiandawn/scenarioini.cpp b/tiberiandawn/scenarioini.cpp index 8e906f46..5c15c508 100644 --- a/tiberiandawn/scenarioini.cpp +++ b/tiberiandawn/scenarioini.cpp @@ -277,6 +277,30 @@ bool Read_Scenario_Ini(char* root, bool fresh) GlyphX_Debug_Print(fname); } + Rule.General(RuleINI); + Rule.Recharge(RuleINI); + Rule.AI(RuleINI); + // Rule.Powerups(RuleINI); + // Rule.Land_Types(RuleINI); + // Rule.Themes(RuleINI); + Rule.IQ(RuleINI); + // Rule.Objects(RuleINI); + Rule.Difficulty(RuleINI); + + /* + ** Override any rules values specified in this + ** particular scenario file. + */ + Rule.General(ini); + Rule.Recharge(ini); + Rule.AI(ini); + // Rule.Powerups(RuleINI); + // Rule.Land_Types(RuleINI); + // Rule.Themes(RuleINI); + Rule.IQ(ini); + // Rule.Objects(RuleINI); + Rule.Difficulty(ini); + /* ** Init the Scenario CRC value */ @@ -693,6 +717,30 @@ bool Read_Scenario_Ini_File(char* scenario_file_name, char* bin_file_name, const GlyphX_Debug_Print(scenario_file_name); } + Rule.General(RuleINI); + Rule.Recharge(RuleINI); + Rule.AI(RuleINI); + // Rule.Powerups(RuleINI); + // Rule.Land_Types(RuleINI); + // Rule.Themes(RuleINI); + Rule.IQ(RuleINI); + // Rule.Objects(RuleINI); + Rule.Difficulty(RuleINI); + + /* + ** Override any rules values specified in this + ** particular scenario file. + */ + Rule.General(ini); + Rule.Recharge(ini); + Rule.AI(ini); + // Rule.Powerups(RuleINI); + // Rule.Land_Types(RuleINI); + // Rule.Themes(RuleINI); + Rule.IQ(ini); + // Rule.Objects(RuleINI); + Rule.Difficulty(ini); + /* ** Init the Scenario CRC value */