// // 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/AADATA.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 : AADATA.CPP * * * * Programmer : Joe L. Bostic * * * * Start Date : July 22, 1994 * * * * Last Update : July 9, 1996 [JLB] * * * *---------------------------------------------------------------------------------------------* * Functions: * * AircraftTypeClass::AircraftTypeClass -- Constructor for aircraft objects. * * AircraftTypeClass::As_Reference -- Given an aircraft type, find the matching type object. * * AircraftTypeClass::Create_And_Place -- Creates and places aircraft using normal game syste* * AircraftTypeClass::Create_One_Of -- Creates an aircraft object of the appropriate type. * * AircraftTypeClass::Dimensions -- Fetches the graphic dimensions of the aircraft type. * * AircraftTypeClass::Display -- Displays a generic version of the aircraft type. * * AircraftTypeClass::From_Name -- Converts an ASCII name into an aircraft type number. * * AircraftTypeClass::Init_Heap -- Initialize the aircraft type class heap. * * AircraftTypeClass::Max_Pips -- Fetches the maximum number of pips allowed. * * AircraftTypeClass::Occupy_List -- Returns with occupation list for landed aircraft. * * AircraftTypeClass::One_Time -- Performs one time initialization of the aircraft type class* * AircraftTypeClass::Overlap_List -- Determines the overlap list for a landed aircraft. * * AircraftTypeClass::Prep_For_Add -- Prepares the scenario editor for adding an aircraft obj* * AircraftTypeClass::operator delete -- Returns aircraft type to special memory pool. * * AircraftTypeClass::operator new -- Allocates an aircraft type object from special pool. * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #include "function.h" void const * AircraftTypeClass::LRotorData = NULL; void const * AircraftTypeClass::RRotorData = NULL; // Badger bomber static AircraftTypeClass const BadgerPlane( AIRCRAFT_BADGER, // What kind of aircraft is this. TXT_BADGER, // Translated text number for aircraft. "BADR", // INI name of aircraft. 0x0000, // Vertical offset. 0x0000, // Primary weapon offset along turret centerline. 0x0000, // Primary weapon lateral offset along turret centerline. true, // Fixed wing aircraft? false, // Equipped with a rotor? false, // Custom rotor sets for each facing? false, // Can this aircraft land on clear terrain? true, // Is it invisible on radar? false, // Can the player select it so as to give it orders? true, // Can it be assigned as a target for attack. false, // Is it insignificant (won't be announced)? false, // Is it immune to normal combat damage? STRUCT_NONE, // Preferred landing building. 0xFF, // Landing speed 16, // Number of rotation stages. MISSION_HUNT // Default mission for aircraft. ); // Photo recon plane. static AircraftTypeClass const U2Plane( AIRCRAFT_U2, // What kind of aircraft is this. TXT_U2, // Translated text number for aircraft. "U2", // INI name of aircraft. 0x0000, // Vertical offset. 0x0000, // Primary weapon offset along turret centerline. 0x0000, // Primary weapon lateral offset along turret centerline. true, // Fixed wing aircraft? false, // Equipped with a rotor? false, // Custom rotor sets for each facing? false, // Can this aircraft land on clear terrain? true, // Is it invisible on radar? false, // Can the player select it so as to give it orders? true, // Can it be assigned as a target for attack. false, // Is it insignificant (won't be announced)? false, // Is it immune to normal combat damage? STRUCT_NONE, // Preferred landing building. 0xFF, // Landing speed 16, // Number of rotation stages. MISSION_HUNT // Default mission for aircraft. ); // Mig attack aircraft. static AircraftTypeClass const MigPlane( AIRCRAFT_MIG, // What kind of aircraft is this. TXT_MIG, // Translated text number for aircraft. "MIG", // INI name of aircraft. 0x0000, // Vertical offset. 0x0020, // Primary weapon offset along turret centerline. 0x0020, // Primary weapon lateral offset along turret centerline. true, // Fixed wing aircraft? false, // Equipped with a rotor? false, // Custom rotor sets for each facing? false, // Can this aircraft land on clear terrain? true, // Is it invisible on radar? true, // Can the player select it so as to give it orders? true, // Can it be assigned as a target for attack. false, // Is it insignificant (won't be announced)? false, // Is it immune to normal combat damage? STRUCT_AIRSTRIP, // Preferred landing building. 0xC0, // Landing speed 16, // Number of rotation stages. MISSION_HUNT // Default mission for aircraft. ); // Yak attack aircraft. static AircraftTypeClass const YakPlane( AIRCRAFT_YAK, // What kind of aircraft is this. TXT_YAK, // Translated text number for aircraft. "YAK", // INI name of aircraft. 0x0000, // Vertical offset. 0x0020, // Primary weapon offset along turret centerline. 0x0020, // Primary weapon lateral offset along turret centerline. true, // Fixed wing aircraft? false, // Equipped with a rotor? false, // Custom rotor sets for each facing? false, // Can this aircraft land on clear terrain? true, // Is it invisible on radar? true, // Can the player select it so as to give it orders? true, // Can it be assigned as a target for attack. false, // Is it insignificant (won't be announced)? false, // Is it immune to normal combat damage? STRUCT_AIRSTRIP, // Preferred landing building. 0xFF, // Landing speed 16, // Number of rotation stages. MISSION_HUNT // Default mission for aircraft. ); // Transport helicopter. static AircraftTypeClass const TransportHeli( AIRCRAFT_TRANSPORT, // What kind of aircraft is this. TXT_TRANS, // Translated text number for aircraft. "TRAN", // INI name of aircraft. 0x0000, // Vertical offset. 0x0000, // Primary weapon offset along turret centerline. 0x0000, // Primary weapon lateral offset along turret centerline. false, // Fixed wing aircraft? true, // Equipped with a rotor? true, // Custom rotor sets for each facing? true, // Can this aircraft land on clear terrain? true, // Is it invisible on radar? true, // Can the player select it so as to give it orders? true, // Can it be assigned as a target for attack. false, // Is it insignificant (won't be announced)? false, // Is it immune to normal combat damage? STRUCT_NONE, // Preferred landing building. 0xFF, // Landing speed 32, // Number of rotation stages. MISSION_HUNT // Default mission for aircraft. ); // Longbow attack helicopter static AircraftTypeClass const AttackHeli( AIRCRAFT_LONGBOW, // What kind of aircraft is this. TXT_HELI, // Translated text number for aircraft. "HELI", // INI name of aircraft. 0x0000, // Vertical offset. 0x0040, // Primary weapon offset along turret centerline. 0x0000, // Primary weapon lateral offset along turret centerline. false, // Fixed wing aircraft? true, // Equipped with a rotor? false, // Custom rotor sets for each facing? false, // Can this aircraft land on clear terrain? true, // Is it invisible on radar? true, // Can the player select it so as to give it orders? true, // Can it be assigned as a target for attack. false, // Is it insignificant (won't be announced)? false, // Is it immune to normal combat damage? STRUCT_HELIPAD, // Preferred landing building. 0xFF, // Landing speed 32, // Number of rotation stages. MISSION_HUNT // Default mission for aircraft. ); // Hind static AircraftTypeClass const OrcaHeli( AIRCRAFT_HIND, // What kind of aircraft is this. TXT_ORCA, // Translated text number for aircraft. "HIND", // INI name of aircraft. 0x0000, // Vertical offset. 0x0040, // Primary weapon offset along turret centerline. 0x0000, // Primary weapon lateral offset along turret centerline. false, // Fixed wing aircraft? true, // Equipped with a rotor? false, // Custom rotor sets for each facing? false, // Can this aircraft land on clear terrain? true, // Is it invisible on radar? true, // Can the player select it so as to give it orders? true, // Can it be assigned as a target for attack. false, // Is it insignificant (won't be announced)? false, // Is it immune to normal combat damage? STRUCT_HELIPAD, // Preferred landing building. 0xFF, // Landing speed 32, // Number of rotation stages. MISSION_HUNT // Default mission for aircraft. ); /*********************************************************************************************** * AircraftTypeClass::AircraftTypeClass -- Constructor for aircraft objects. * * * * This is the constructor for the aircraft object. * * * * INPUT: see below... * * * * OUTPUT: none * * * * WARNINGS: none * * * * HISTORY: * * 07/26/1994 JLB : Created. * *=============================================================================================*/ AircraftTypeClass::AircraftTypeClass( AircraftType airtype, int name, char const * ininame, int verticaloffset, int primaryoffset, int primarylateral, bool is_fixedwing, bool is_rotorequipped, bool is_rotorcustom, bool is_landable, bool is_stealthy, bool is_selectable, bool is_legal_target, bool is_insignificant, bool is_immune, StructType building, int landingspeed, int rotation, MissionType deforder ) : TechnoTypeClass(RTTI_AIRCRAFTTYPE, int(airtype), name, ininame, REMAP_NORMAL, verticaloffset, primaryoffset, primarylateral, primaryoffset, primarylateral, false, is_stealthy, is_selectable, is_legal_target, is_insignificant, is_immune, false, false, true, true, rotation, SPEED_WINGED), IsFixedWing(is_fixedwing), IsLandable(is_landable), IsRotorEquipped(is_rotorequipped), IsRotorCustom(is_rotorcustom), Type(airtype), Mission(deforder), Building(building), LandingSpeed(landingspeed) { /* ** Forced aircraft overrides from the default. */ Speed = SPEED_WINGED; } /*********************************************************************************************** * AircraftTypeClass::operator new -- Allocates an aircraft type object from special pool. * * * * This will allocate an aircraft type class object from the memory pool of that purpose. * * * * INPUT: none * * * * OUTPUT: Returns with a pointer to the newly allocated aircraft type class object. If there * * was insufficient memory to fulfill the request, then NULL is returned. * * * * WARNINGS: none * * * * HISTORY: * * 07/09/1996 JLB : Created. * *=============================================================================================*/ void * AircraftTypeClass::operator new(size_t) { return(AircraftTypes.Alloc()); } /*********************************************************************************************** * AircraftTypeClass::operator delete -- Returns aircraft type to special memory pool. * * * * This will return the aircraft type class object back to the special memory pool that * * it was allocated from. * * * * INPUT: pointer -- Pointer to the aircraft type class object to delete. * * * * OUTPUT: none * * * * WARNINGS: none * * * * HISTORY: * * 07/09/1996 JLB : Created. * *=============================================================================================*/ void AircraftTypeClass::operator delete(void * pointer) { AircraftTypes.Free((AircraftTypeClass *)pointer); } /*********************************************************************************************** * AircraftTypeClass::Init_Heap -- Initialize the aircraft type class heap. * * * * This will initialize the aircraft type class heap by pre-allocating all known aircraft * * types. It should be called once and before the rules.ini file is processed. * * * * INPUT: none * * * * OUTPUT: none * * * * WARNINGS: none * * * * HISTORY: * * 07/09/1996 JLB : Created. * *=============================================================================================*/ void AircraftTypeClass::Init_Heap(void) { /* ** These aircraft type class objects must be allocated in the exact order that they ** are specified in the AircraftSmen enumeration. This is necessary because the heap ** allocation block index serves double duty as the type number index. */ new AircraftTypeClass(TransportHeli); new AircraftTypeClass(BadgerPlane); new AircraftTypeClass(U2Plane); new AircraftTypeClass(MigPlane); new AircraftTypeClass(YakPlane); new AircraftTypeClass(AttackHeli); new AircraftTypeClass(OrcaHeli); } /*********************************************************************************************** * AircraftTypeClass::From_Name -- Converts an ASCII name into an aircraft type number. * * * * This routine is used to convert an ASCII representation of an aircraft into the * * matching aircraft type number. This is used by the scenario INI reader code. * * * * INPUT: name -- Pointer to ASCII name to translate. * * * * OUTPUT: Returns the aircraft type number that matches the ASCII name provided. If no * * match could be found, then AIRCRAFT_NONE is returned. * * * * WARNINGS: none * * * * HISTORY: * * 07/26/1994 JLB : Created. * *=============================================================================================*/ AircraftType AircraftTypeClass::From_Name(char const * name) { if (name != NULL) { for (int classid = AIRCRAFT_FIRST; classid < AIRCRAFT_COUNT; classid++) { if (stricmp(As_Reference((AircraftType)classid).IniName, name) == 0) { return(AircraftType)classid; } } } return(AIRCRAFT_NONE); } /*********************************************************************************************** * AircraftTypeClass::One_Time -- Performs one time initialization of the aircraft type class. * * * * This routine is used to perform the onetime initialization of the aircraft type. This * * includes primarily the shape and other graphic data loading. * * * * INPUT: none * * * * OUTPUT: none * * * * WARNINGS: This goes to disk and also must only be called ONCE. * * * * HISTORY: * * 07/26/1994 JLB : Created. * *=============================================================================================*/ void AircraftTypeClass::One_Time(void) { for (int index = AIRCRAFT_FIRST; index < AIRCRAFT_COUNT; index++) { char fullname[_MAX_FNAME+_MAX_EXT]; AircraftTypeClass const & uclass = As_Reference((AircraftType)index); /* ** Fetch the supporting data files for the unit. */ char buffer[_MAX_FNAME]; sprintf(buffer, "%sICON", uclass.Graphic_Name()); _makepath(fullname, NULL, NULL, buffer, ".SHP"); ((void const *&)uclass.CameoData) = MFCD::Retrieve(fullname); /* ** Generic shape for all houses load method. */ _makepath(fullname, NULL, NULL, uclass.Graphic_Name(), ".SHP"); ((void const *&)uclass.ImageData) = MFCD::Retrieve(fullname); } LRotorData = MFCD::Retrieve("LROTOR.SHP"); RRotorData = MFCD::Retrieve("RROTOR.SHP"); } /*********************************************************************************************** * AircraftTypeClass::Create_One_Of -- Creates an aircraft object of the appropriate type. * * * * This routine is used to create an aircraft object that matches the aircraft type. It * * serves as a shortcut to creating an object using the "new" operator and "if" checks. * * * * INPUT: house -- The house owner of the aircraft that is to be created. * * * * OUTPUT: Returns with a pointer to the aircraft created. If the aircraft could not be * * created, then a NULL is returned. * * * * WARNINGS: none * * * * HISTORY: * * 07/26/1994 JLB : Created. * *=============================================================================================*/ ObjectClass * AircraftTypeClass::Create_One_Of(HouseClass * house) const { return(new AircraftClass(Type, house->Class->House)); } #ifdef SCENARIO_EDITOR /*********************************************************************************************** * AircraftTypeClass::Prep_For_Add -- Prepares the scenario editor for adding an aircraft objec* * * * This routine is used by the scenario editor to prepare for the adding operation. It * * builds a list of pointers to object types that can be added. * * * * INPUT: none * * * * OUTPUT: none * * * * WARNINGS: none * * * * HISTORY: * * 07/26/1994 JLB : Created. * *=============================================================================================*/ void AircraftTypeClass::Prep_For_Add(void) { for (AircraftType index = AIRCRAFT_FIRST; index < AIRCRAFT_COUNT; index++) { if (As_Reference(index).Get_Image_Data()) { Map.Add_To_List(&As_Reference(index)); } } } /*********************************************************************************************** * AircraftTypeClass::Display -- Displays a generic version of the aircraft type. * * * * This routine is used by the scenario editor to display a generic version of the object * * type. This is displayed in the object selection dialog box. * * * * INPUT: x,y -- The coordinates to draw the aircraft at (centered). * * * * window -- The window to base the coordinates upon. * * * * house -- The owner of this generic aircraft. * * * * OUTPUT: none * * * * WARNINGS: none * * * * HISTORY: * * 07/26/1994 JLB : Created. * *=============================================================================================*/ void AircraftTypeClass::Display(int x, int y, WindowNumberType window, HousesType ) const { int shape = 0; void const * ptr = Get_Cameo_Data(); if (ptr == NULL) { ptr = Get_Image_Data(); shape = 5; } CC_Draw_Shape(ptr, shape, x, y, window, SHAPE_CENTER|SHAPE_WIN_REL); } #endif /*********************************************************************************************** * AircraftTypeClass::Occupy_List -- Returns with occupation list for landed aircraft. * * * * This determines the occupation list for the aircraft (if it was landed). * * * * INPUT: placement -- Is this for placement legality checking only? The normal condition * * is for marking occupation flags. * * * * OUTPUT: Returns with a pointer to a cell offset occupation list for the aircraft. * * * * WARNINGS: This occupation list is only valid if the aircraft is landed. * * * * HISTORY: * * 07/26/1994 JLB : Created. * *=============================================================================================*/ short const * AircraftTypeClass::Occupy_List(bool) const { static short const _list[] = {0, REFRESH_EOL}; return(_list); } /*********************************************************************************************** * AircraftTypeClass::Overlap_List -- Determines the overlap list for a landed aircraft. * * * * This routine figures out the overlap list for the aircraft as if it were landed. * * * * INPUT: none * * * * OUTPUT: Returns with the cell offset overlap list for the aircraft. * * * * WARNINGS: This overlap list is only valid when the aircraft is landed. * * * * HISTORY: * * 07/26/1994 JLB : Created. * *=============================================================================================*/ short const * AircraftTypeClass::Overlap_List(void) const { static short const _list[] = {-(MAP_CELL_W-1), -MAP_CELL_W, -(MAP_CELL_W+1), -1, 1, (MAP_CELL_W-1), MAP_CELL_W, (MAP_CELL_W+1), REFRESH_EOL}; return(_list); } /*********************************************************************************************** * AircraftTypeClass::Max_Pips -- Fetches the maximum number of pips allowed. * * * * Use this routine to retrieve the maximum pip count allowed for this aircraft. This is * * the maximum number of passengers. * * * * INPUT: none * * * * OUTPUT: Returns with the maximum number of pips for this aircraft. * * * * WARNINGS: none * * * * HISTORY: * * 06/26/1995 JLB : Created. * *=============================================================================================*/ int AircraftTypeClass::Max_Pips(void) const { if (PrimaryWeapon != NULL) { // Camera weapon (ex. on the Spy plane) doesn't display any pips if (!PrimaryWeapon->IsCamera) { return(5); } } return(Max_Passengers()); } /*********************************************************************************************** * AircraftTypeClass::Create_And_Place -- Creates and places aircraft using normal game system * * * * This routine is used to create and place an aircraft through the normal game system. * * Since creation of aircraft in this fashion is prohibited, this routine does nothing. * * * * INPUT: na * * * * OUTPUT: Always returns a failure code (false). * * * * WARNINGS: none * * * * HISTORY: * * 08/07/1995 JLB : Created. * *=============================================================================================*/ bool AircraftTypeClass::Create_And_Place(CELL, HousesType) const { return(false); } /*********************************************************************************************** * AircraftTypeClass::Dimensions -- Fetches the graphic dimensions of the aircraft type. * * * * This routine will fetch the pixel dimensions of this aircraft type. These dimensions * * are used to control map refresh and select box rendering. * * * * INPUT: width -- Reference to variable that will be filled in with aircraft width. * * * * height -- Reference to variable that will be filled in with aircraft height. * * * * OUTPUT: none * * * * WARNINGS: none * * * * HISTORY: * * 08/07/1995 JLB : Created. * *=============================================================================================*/ void AircraftTypeClass::Dimensions(int &width, int &height) const { if (Type == AIRCRAFT_BADGER) { width = 56; height = 56; } else { width = 21; height = 20; } } /*********************************************************************************************** * AircraftTypeClass::As_Reference -- Given an aircraft type, find the matching type object. * * * * This routine is used to fetch a reference to the aircraft type class object that matches * * the aircraft type specified. * * * * INPUT: aircraft -- The aircraft type to fetch a reference to the type class object of. * * * * OUTPUT: Returns with a reference to the type class object of this aircraft type. * * * * WARNINGS: Be sure that the aircraft type specified is legal. Illegal values will result * * in undefined behavior. * * * * HISTORY: * * 07/09/1996 JLB : Created. * *=============================================================================================*/ AircraftTypeClass & AircraftTypeClass::As_Reference(AircraftType aircraft) { return(*AircraftTypes.Ptr(aircraft)); }