| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 |
- /*
- ** Command & Conquer Red Alert(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 <http://www.gnu.org/licenses/>.
- */
- /* $Header: /CounterStrike/WEAPON.CPP 1 3/03/97 10:26a 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 : WEAPON.CPP *
- * *
- * Programmer : Joe L. Bostic *
- * *
- * Start Date : 05/20/96 *
- * *
- * Last Update : September 9, 1996 [JLB] *
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * Armor_From_Name -- Convert ASCII name into armor type number. *
- * WeaponTypeClass::As_Pointer -- Give a weapon type ID, fetch pointer to weapon type object.*
- * WeaponTypeClass::Read_INI -- Fetch the weapon data from the INI database. *
- * WeaponTypeClass::WeaponTypeClass -- Default constructor for weapon type objects. *
- * WeaponTypeClass::operator delete -- Returns weapon type object back to special heap. *
- * WeaponTypeClass::operator new -- Allocates a weapon type object form the special heap. *
- * WeaponTypeClass::~WeaponTypeClass -- Destructor for weapon type class objects. *
- * Weapon_From_Name -- Conver ASCII name to weapon type ID number. *
- * WeaponTypeClass::Allowed_Threats -- Determine what threats this weapon can address. *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #include "function.h"
- /***************************************************************************
- ** These are the various weapons and their characteristics.
- */
- TFixedIHeapClass<WeaponTypeClass> Weapons;
- /***********************************************************************************************
- * WeaponTypeClass::WeaponTypeClass -- Default constructor for weapon type objects. *
- * *
- * This default constructor will initialize all the values of the weapon to the default *
- * state. Thus, if any of these settings are not specifically overridden by the rules.ini *
- * file, they will remain this value in the game. *
- * *
- * INPUT: none *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 07/17/1996 JLB : Created. *
- *=============================================================================================*/
- WeaponTypeClass::WeaponTypeClass(char const * name) :
- ID(Weapons.ID(this)),
- IniName(name),
- IsSupressed(false),
- IsCamera(false),
- IsElectric(false),
- Burst(1),
- Bullet(NULL),
- Attack(0),
- MaxSpeed(MPH_IMMOBILE),
- WarheadPtr(NULL),
- ROF(0),
- Range(0),
- Sound(VOC_NONE),
- Anim(ANIM_NONE)
- {
- }
- /***********************************************************************************************
- * WeaponTypeClass::~WeaponTypeClass -- Destructor for weapon type class objects. *
- * *
- * This destructor really doesn't do anything but set the pointers to NULL. This is a *
- * general purposes safety tactic but is otherwise useless. *
- * *
- * INPUT: none *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 07/17/1996 JLB : Created. *
- *=============================================================================================*/
- WeaponTypeClass::~WeaponTypeClass(void)
- {
- IniName = NULL;
- Bullet = NULL;
- WarheadPtr = NULL;
- }
- /***********************************************************************************************
- * WeaponTypeClass::operator new -- Allocates a weapon type object form the special heap. *
- * *
- * This will allocate a weapon type object from a special heap that has been set up for *
- * that purpose. *
- * *
- * INPUT: none *
- * *
- * OUTPUT: Returns with a pointer to the weapon type object allocated. If there was *
- * insufficient memory available, NULL is returned. *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 07/17/1996 JLB : Created. *
- *=============================================================================================*/
- void * WeaponTypeClass::operator new(size_t)
- {
- return(Weapons.Alloc());
- }
- /***********************************************************************************************
- * WeaponTypeClass::operator delete -- Returns weapon type object back to special heap. *
- * *
- * This routine will return the weapon type object back to the heap so that the memory *
- * can be reused for subsiquent allocations of weapon type objects. *
- * *
- * INPUT: pointer -- Pointer to the weapon type object to return to the special heap. *
- * *
- * OUTPUT: none *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 07/17/1996 JLB : Created. *
- *=============================================================================================*/
- void WeaponTypeClass::operator delete(void * pointer)
- {
- Weapons.Free((WeaponTypeClass *)pointer);
- }
- /***********************************************************************************************
- * WeaponTypeClass::As_Pointer -- Give a weapon type ID, fetch pointer to weapon type object. *
- * *
- * This routine will conver the weapon type ID specified into a pointer to the weapon type *
- * object it represents. *
- * *
- * INPUT: weapon -- The weapon type object ID to convert to a pointer. *
- * *
- * OUTPUT: Returns with a pointer to the weapon type class object that is represented by the *
- * weapon ID number specified. If no match could be found, then NULL is returned. *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 07/17/1996 JLB : Created. *
- *=============================================================================================*/
- WeaponTypeClass * WeaponTypeClass::As_Pointer(WeaponType weapon)
- {
- if (weapon != WEAPON_NONE) {
- return(Weapons.Ptr(weapon));
- // for (int index = 0; index < Weapons.Count(); index++) {
- // WeaponTypeClass * ptr = Weapons.Ptr(index);
- // if (ptr->ID == weapon) {
- // return(ptr);
- // }
- // }
- }
- return(NULL);
- }
- /***********************************************************************************************
- * WeaponTypeClass::Read_INI -- Fetch the weapon data from the INI database. *
- * *
- * This routine will fetch the weapon data for this weapon type object from the INI *
- * database specified. *
- * *
- * INPUT: ini -- Reference to the INI database that the weapon data will be fetched *
- * from. *
- * *
- * OUTPUT: bool; Was this weapon type described in the database and the values retrieved? *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 07/19/1996 JLB : Created. *
- *=============================================================================================*/
- bool WeaponTypeClass::Read_INI(CCINIClass & ini)
- {
- if (ini.Is_Present(Name())) {
- IsSupressed = ini.Get_Bool(Name(), "Supress", IsSupressed);
- Burst = ini.Get_Int(Name(), "Burst", Burst);
- Attack = ini.Get_Int(Name(), "Damage", Attack);
- MaxSpeed = ini.Get_MPHType(Name(), "Speed", MaxSpeed);
- ROF = ini.Get_Int(Name(), "ROF", ROF);
- Range = ini.Get_Lepton(Name(), "Range", Range);
- Sound = ini.Get_VocType(Name(), "Report", Sound);
- Anim = ini.Get_AnimType(Name(), "Anim", Anim);
- IsCamera = ini.Get_Bool(Name(), "Camera", IsCamera);
- IsElectric = ini.Get_Bool(Name(), "Charges", IsElectric);
- IsTurboBoosted = ini.Get_Bool(Name(), "TurboBoost", IsTurboBoosted);
- WarheadType wtype = (WarheadPtr != NULL) ? WarheadType(WarheadPtr->ID) : WARHEAD_NONE;
- wtype = ini.Get_WarheadType(Name(), "Warhead", wtype);
- if (wtype != WARHEAD_NONE) {
- WarheadPtr = WarheadTypeClass::As_Pointer(wtype);
- // WarheadPtr = &Warheads[wtype];
- } else {
- WarheadPtr = NULL;
- }
- BulletType btype = (Bullet != NULL) ? BulletType(Bullet->ID) : BULLET_NONE;
- btype = ini.Get_BulletType(Name(), "Projectile", btype);
- if (btype != BULLET_NONE) {
- Bullet = &BulletTypeClass::As_Reference(btype);
- } else {
- Bullet = NULL;
- }
- return(true);
- }
- return(false);
- }
- /***********************************************************************************************
- * Weapon_From_Name -- Conver ASCII name to weapon type ID number. *
- * *
- * This will find the weapon whos name matches that specified and then it will return the *
- * weapon ID number associated with it. *
- * *
- * INPUT: name -- Pointer to the ASCII name of the weapon type. *
- * *
- * OUTPUT: Returns with the weapon type ID number that matches the name specified. If no *
- * match could be found, then WEAPON_NONE is returned. *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 07/17/1996 JLB : Created. *
- *=============================================================================================*/
- WeaponType Weapon_From_Name(char const * name)
- {
- if (!name) return(WEAPON_NONE);
- for (int index = 0; index < Weapons.Count(); index++) {
- if (stricmp(Weapons.Ptr(index)->Name(), name) == 0) {
- return(WeaponType(Weapons.Ptr(index)->ID));
- }
- }
- return(WEAPON_NONE);
- }
- /***********************************************************************************************
- * Armor_From_Name -- Convert ASCII name into armor type number. *
- * *
- * This will find the armor type that matches the ASCII name specified and then will return *
- * the armor ID number of it. *
- * *
- * INPUT: name -- Pointer to the ASCII name of the armor to find. *
- * *
- * OUTPUT: Returns with the armor ID number of the armor that matches the name specified. If *
- * no match could be found, then ARMOR_NONE is returned. *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 07/17/1996 JLB : Created. *
- *=============================================================================================*/
- ArmorType Armor_From_Name(char const * name)
- {
- if (!name) return(ARMOR_NONE);
- for (ArmorType index = ARMOR_FIRST; index < ARMOR_COUNT; index++) {
- if (stricmp(ArmorName[index], name) == 0) {
- return(index);
- }
- }
- return(ARMOR_NONE);
- }
- /***********************************************************************************************
- * WeaponTypeClass::Allowed_Threats -- Determine what threats this weapon can address. *
- * *
- * This routine will examine the capabilities of this weapon and return with the threat *
- * types that it can address. *
- * *
- * INPUT: none *
- * *
- * OUTPUT: Returns with the threat types that this weapon can address. *
- * *
- * WARNINGS: none *
- * *
- * HISTORY: *
- * 09/09/1996 JLB : Created. *
- *=============================================================================================*/
- ThreatType WeaponTypeClass::Allowed_Threats(void) const
- {
- ThreatType threat = THREAT_NORMAL;
- if (Bullet->IsAntiAircraft) {
- threat = threat | THREAT_AIR;
- }
- if (Bullet->IsAntiGround) {
- threat = threat | THREAT_INFANTRY|THREAT_VEHICLES|THREAT_BOATS|THREAT_BUILDINGS;
- }
- return(threat);
- }
- bool WeaponTypeClass::Is_Wall_Destroyer(void) const
- {
- if (WarheadPtr != NULL && WarheadPtr->IsWallDestroyer) {
- return(true);
- }
- return(false);
- }
|