/* ** Command & Conquer Generals Zero Hour(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program 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. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ //////////////////////////////////////////////////////////////////////////////// // // // (c) 2001-2003 Electronic Arts Inc. // // // //////////////////////////////////////////////////////////////////////////////// // FILE: Armor.h ///////////////////////////////////////////////////////////////////////////////// // Author: Steven Johnson, March 2002 // Desc: Damage Multiplier Descriptions /////////////////////////////////////////////////////////////////////////////////////////////////// #pragma once #ifndef _Armor_H_ #define _Armor_H_ // INCLUDES /////////////////////////////////////////////////////////////////////////////////////// #include "Common/NameKeyGenerator.h" #include "Common/STLTypedefs.h" #include "GameLogic/Damage.h" // FORWARD REFERENCES ///////////////////////////////////////////////////////////////////////////// class ArmorStore; //------------------------------------------------------------------------------------------------- /** An Armor encapsulates the a particular type of actual modifier to damage taken, in order to simulate different materials, and to help make game balance easier to adjust. */ //------------------------------------------------------------------------------------------------- class ArmorTemplate { public: ArmorTemplate(); void clear(); /** This is the real "meat" of the class: given a damage type and amount, adjust the damage and return the amount that should be dealt. */ Real adjustDamage(DamageType t, Real damage) const; static void parseArmorCoefficients( INI* ini, void *instance, void* /* store */, const void* userData ); protected: private: Real m_damageCoefficient[DAMAGE_NUM_TYPES]; ///< modifiers to damage }; //------------------------------------------------------------------------------------------------- class Armor { public: inline Armor(const ArmorTemplate* tmpl = NULL) : m_template(tmpl) { } inline Real adjustDamage(DamageType t, Real damage) const { return m_template ? m_template->adjustDamage(t, damage) : damage; } inline void clear() { m_template = NULL; } private: const ArmorTemplate* m_template; ///< the kind of armor this is }; //------------------------------------------------------------------------------------------------ /** Interface class for TheArmorStore, which is just a convenient place for us to * store each Armor we read from INI together in a list, with some access * methods for finding Armors */ //------------------------------------------------------------------------------------------------- class ArmorStore : public SubsystemInterface { public: ArmorStore(); ~ArmorStore(); void init() { } void reset() { } void update() { } /** Find the Armor with the given name. If no such Armor exists, return null. */ const ArmorTemplate* findArmorTemplate(AsciiString name) const; inline Armor makeArmor(const ArmorTemplate *tmpl) const { return Armor(tmpl); // my, that was easy } static void parseArmorDefinition(INI* ini); private: typedef std::hash_map< NameKeyType, ArmorTemplate, rts::hash, rts::equal_to > ArmorTemplateMap; ArmorTemplateMap m_armorTemplates; }; // EXTERNALS ////////////////////////////////////////////////////////////////////////////////////// extern ArmorStore *TheArmorStore; #endif // _Armor_H_