1375 lines
68 KiB
C++
1375 lines
68 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: /CounterStrike/UDATA.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 : UDATA.CPP *
|
||
|
* *
|
||
|
* Programmer : Joe L. Bostic *
|
||
|
* *
|
||
|
* Start Date : September 10, 1993 *
|
||
|
* *
|
||
|
* Last Update : July 19, 1996 [JLB] *
|
||
|
* *
|
||
|
*---------------------------------------------------------------------------------------------*
|
||
|
* Functions: *
|
||
|
* UnitTypeClass::As_Reference -- Fetches a reference to the unit type class specified. *
|
||
|
* UnitTypeClass::Create_And_Place -- Creates and places a unit object onto the map. *
|
||
|
* UnitTypeClass::Create_One_Of -- Creates a unit in limbo. *
|
||
|
* UnitTypeClass::Dimensions -- Determines the unit's pixel dimensions. *
|
||
|
* UnitTypeClass::Display -- Displays a generic unit shape. *
|
||
|
* UnitTypeClass::From_Name -- Fetch class pointer from specified name. *
|
||
|
* UnitTypeClass::Init_Heap -- Initialize the unit type class heap. *
|
||
|
* UnitTypeClass::Max_Pips -- Fetches the maximum pips allowed for this unit. *
|
||
|
* UnitTypeClass::One_Time -- Performs one time processing for unit type class objects. *
|
||
|
* UnitTypeClass::Prep_For_Add -- Prepares scenario editor to add unit. *
|
||
|
* UnitTypeClass::Read_INI -- Fetch the unit type data from the INI database. *
|
||
|
* UnitTypeClass::Turret_Adjust -- Turret adjustment routine for MLRS and MSAM units. *
|
||
|
* UnitTypeClass::UnitTypeClass -- Constructor for unit types. *
|
||
|
* UnitTypeClass::operator delete -- Return a unit type class object back to the pool. *
|
||
|
* UnitTypeClass::operator new -- Allocates an object from the unit type class heap. *
|
||
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
||
|
|
||
|
#include "function.h"
|
||
|
|
||
|
/*
|
||
|
** This is the list of animation stages to use when the harvester
|
||
|
** is to dump its load into the refinery. The offsets are based from the
|
||
|
** start of the dump animation.
|
||
|
*/
|
||
|
const int UnitTypeClass::Harvester_Dump_List[22] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,6,5,4,3,2,1,0};
|
||
|
const int UnitTypeClass::Harvester_Load_List[9] = {0, 1, 2, 3, 4, 5, 6, 7, 0};
|
||
|
const int UnitTypeClass::Harvester_Load_Count = 8;
|
||
|
|
||
|
|
||
|
// V2 rocket launcher
|
||
|
static UnitTypeClass const UnitV2Launcher(
|
||
|
UNIT_V2_LAUNCHER,
|
||
|
TXT_V2_LAUNCHER, // NAME: Text name of this unit type.
|
||
|
"V2RL", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
true, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Light tank
|
||
|
static UnitTypeClass const UnitLTank(
|
||
|
UNIT_LTANK,
|
||
|
TXT_LTANK, // NAME: Text name of this unit type.
|
||
|
"1TNK", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0020, // Vertical offset.
|
||
|
0x00C0, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
true, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
true, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
false, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Heavy tank
|
||
|
static UnitTypeClass const UnitMTank(
|
||
|
UNIT_MTANK,
|
||
|
TXT_MTANK, // NAME: Text name of this unit type.
|
||
|
"3TNK", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0040, // Vertical offset.
|
||
|
0x0080, // Primary weapon offset along turret centerline.
|
||
|
0x0018, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0080, // Secondary weapon offset along turret centerline.
|
||
|
0x0018, // Secondary weapon lateral offset along turret centerling.
|
||
|
true, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
true, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Medium tank
|
||
|
static UnitTypeClass const UnitMTank2(
|
||
|
UNIT_MTANK2,
|
||
|
TXT_MTANK2, // NAME: Text name of this unit type.
|
||
|
"2TNK", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0030, // Vertical offset.
|
||
|
0x00C0, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x00C0, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
true, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
true, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Mastadon tank
|
||
|
static UnitTypeClass const UnitHTank(
|
||
|
UNIT_HTANK,
|
||
|
TXT_HTANK, // NAME: Text name of this unit type.
|
||
|
"4TNK", // NAME: Text name of this unit type.
|
||
|
ANIM_ART_EXP1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0020, // Vertical offset.
|
||
|
0x00C0, // Primary weapon offset along turret centerline.
|
||
|
0x0028, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0008, // Secondary weapon offset along turret centerline.
|
||
|
0x0040, // Secondary weapon lateral offset along turret centerling.
|
||
|
true, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
true, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Mobile Radar Jammer
|
||
|
static UnitTypeClass const UnitMRJammer(
|
||
|
UNIT_MRJ,
|
||
|
TXT_MRJ, // NAME: Text name of this unit type.
|
||
|
"MRJ", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
false, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
true, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
true, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
false, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
true, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Mobile Gap Generator
|
||
|
static UnitTypeClass const UnitMGG(
|
||
|
UNIT_MGG,
|
||
|
TXT_MGG, // NAME: Text name of this unit type.
|
||
|
"MGG", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
false, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
true, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
true, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Artillery
|
||
|
static UnitTypeClass const UnitArty(
|
||
|
UNIT_ARTY,
|
||
|
TXT_ARTY, // NAME: Text name of this unit type.
|
||
|
"ARTY", // NAME: Text name of this unit type.
|
||
|
ANIM_ART_EXP1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0040, // Vertical offset.
|
||
|
0x0060, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
true, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
false, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
false, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Harvester
|
||
|
static UnitTypeClass const UnitHarvester(
|
||
|
UNIT_HARVESTER,
|
||
|
TXT_HARVESTER, // NAME: Text name of this unit type.
|
||
|
"HARV", // NAME: Text name of this unit type.
|
||
|
ANIM_FBALL1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_ALTERNATE, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
true, // Can this be a goodie surprise from a crate?
|
||
|
true, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
true, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HARVEST // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Mobile construction vehicle
|
||
|
static UnitTypeClass const UnitMCV(
|
||
|
UNIT_MCV,
|
||
|
TXT_MCV, // NAME: Text name of this unit type.
|
||
|
"MCV", // NAME: Text name of this unit type.
|
||
|
ANIM_FBALL1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_ALTERNATE, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
true, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Jeep (hummer)
|
||
|
static UnitTypeClass const UnitJeep(
|
||
|
UNIT_JEEP,
|
||
|
TXT_JEEP, // NAME: Text name of this unit type.
|
||
|
"JEEP", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0030, // Vertical offset.
|
||
|
0x0030, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0030, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
true, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
false, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
true, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
false, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Armored personnel carrier
|
||
|
static UnitTypeClass const UnitAPC(
|
||
|
UNIT_APC,
|
||
|
TXT_APC, // NAME: Text name of this unit type.
|
||
|
"APC", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0030, // Vertical offset.
|
||
|
0x0030, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0030, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
true, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
false, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Mine laying truck
|
||
|
static UnitTypeClass const UnitMineLayer(
|
||
|
UNIT_MINELAYER,
|
||
|
TXT_MINE_LAYER, // NAME: Text name of this unit type.
|
||
|
"MNLY", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
true, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
false, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Convoy Truck
|
||
|
static UnitTypeClass const UnitConvoyTruck(
|
||
|
UNIT_TRUCK,
|
||
|
TXT_TRUCK, // NAME: Text name of this unit type.
|
||
|
"TRUK", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
false, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
false, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
false, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_GUARD // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
#ifdef FIXIT_ANTS
|
||
|
/*
|
||
|
[ANT]
|
||
|
Name=Warrior Ant
|
||
|
Primary=Mandible
|
||
|
Strength=150
|
||
|
Armor=light
|
||
|
TechLevel=-1
|
||
|
Sight=2
|
||
|
Speed=5
|
||
|
Cost=700
|
||
|
Points=40
|
||
|
ROT=5
|
||
|
Tracked=yes
|
||
|
Crewed=no
|
||
|
NoMovingFire=yes
|
||
|
|
||
|
; Ant mandible
|
||
|
[Mandible]
|
||
|
Damage=50
|
||
|
ROF=5
|
||
|
Range=1.5
|
||
|
Projectile=Invisible
|
||
|
Speed=100
|
||
|
Warhead=HollowPoint
|
||
|
Report=none
|
||
|
|
||
|
|
||
|
*/
|
||
|
|
||
|
// Warrior ant
|
||
|
static UnitTypeClass const UnitAnt1(
|
||
|
UNIT_ANT1,
|
||
|
TXT_NONE, // NAME: Text name of this unit type.
|
||
|
"ANT1", // NAME: Text name of this unit type.
|
||
|
ANIM_ANT1_DEATH, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
false, // Can this be a goodie surprise from a crate?
|
||
|
true, // Always use the given name for the vehicle?
|
||
|
false, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
true, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
8, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
static UnitTypeClass const UnitAnt2(
|
||
|
UNIT_ANT2,
|
||
|
TXT_NONE, // NAME: Text name of this unit type.
|
||
|
"ANT2", // NAME: Text name of this unit type.
|
||
|
ANIM_ANT2_DEATH, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
false, // Can this be a goodie surprise from a crate?
|
||
|
true, // Always use the given name for the vehicle?
|
||
|
false, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
true, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
8, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
static UnitTypeClass const UnitAnt3(
|
||
|
UNIT_ANT3,
|
||
|
TXT_NONE, // NAME: Text name of this unit type.
|
||
|
"ANT3", // NAME: Text name of this unit type.
|
||
|
ANIM_ANT3_DEATH, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
false, // Can this be a goodie surprise from a crate?
|
||
|
true, // Always use the given name for the vehicle?
|
||
|
false, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
true, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
8, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
#endif
|
||
|
|
||
|
#ifdef FIXIT_CSII // checked - ajw 9/28/98
|
||
|
// Chrono Tank
|
||
|
static UnitTypeClass const UnitChrono(
|
||
|
UNIT_CHRONOTANK,
|
||
|
TXT_CHRONOTANK, // NAME: Text name of this unit type.
|
||
|
"CTNK", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
false, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// Tesla Tank
|
||
|
static UnitTypeClass const UnitTesla(
|
||
|
UNIT_TESLATANK,
|
||
|
TXT_TESLATANK, // NAME: Text name of this unit type.
|
||
|
"TTNK", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
false, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
true, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
true, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
true, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
// M.A.D. Tank
|
||
|
static UnitTypeClass const UnitMAD(
|
||
|
UNIT_MAD,
|
||
|
TXT_MAD, // NAME: Text name of this unit type.
|
||
|
"QTNK", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
false, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
|
||
|
// Demolition Truck
|
||
|
static UnitTypeClass const UnitDemoTruck(
|
||
|
UNIT_DEMOTRUCK,
|
||
|
TXT_DEMOTRUCK, // NAME: Text name of this unit type.
|
||
|
"DTRK", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0000, // Vertical offset.
|
||
|
0x0000, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0000, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
false, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
false, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
false, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
false, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_GUARD // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
#ifdef FIXIT_PHASETRANSPORT // checked - ajw 9/28/98
|
||
|
static UnitTypeClass const UnitPhase(
|
||
|
UNIT_PHASE,
|
||
|
TXT_PHASETRANSPORT, // NAME: Text name of this unit type.
|
||
|
"STNK", // NAME: Text name of this unit type.
|
||
|
ANIM_FRAG1, // EXPLOSION: Type of explosion when destroyed.
|
||
|
REMAP_NORMAL, // Sidebar remap logic.
|
||
|
0x0030, // Vertical offset.
|
||
|
0x0030, // Primary weapon offset along turret centerline.
|
||
|
0x0000, // Primary weapon lateral offset along turret centerline.
|
||
|
0x0030, // Secondary weapon offset along turret centerline.
|
||
|
0x0000, // Secondary weapon lateral offset along turret centerling.
|
||
|
false, // Can this be a goodie surprise from a crate?
|
||
|
false, // Always use the given name for the vehicle?
|
||
|
true, // Can this unit squash infantry?
|
||
|
false, // Does this unit harvest Tiberium?
|
||
|
false, // Is invisible to radar?
|
||
|
false, // Is it insignificant (won't be announced)?
|
||
|
true, // Is it equipped with a combat turret?
|
||
|
false, // Does it have a rotating radar dish?
|
||
|
false, // Is there an associated firing animation?
|
||
|
false, // Must the turret be in a locked down position while moving?
|
||
|
true,// false, // Is this a gigundo-rotund-enormous unit?
|
||
|
false, // Does the unit have a constant animation?
|
||
|
false, // Is the unit capable of jamming radar?
|
||
|
false, // Is the unit a mobile gap generator?
|
||
|
32, // Rotation stages.
|
||
|
0, // Turret center offset along body centerline.
|
||
|
MISSION_HUNT // ORDERS: Default order to give new unit.
|
||
|
);
|
||
|
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::UnitTypeClass -- Constructor for unit types. *
|
||
|
* *
|
||
|
* This is the constructor for the unit types. It is used to initialize the unit type class *
|
||
|
* structure. The unit type class is used to control the behavior of the various types *
|
||
|
* of units in the game. This constructor is called for every unique unit type as it *
|
||
|
* exists in the array of unit types. *
|
||
|
* *
|
||
|
* INPUT: bla bla bla... see below *
|
||
|
* *
|
||
|
* OUTPUT: none *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 06/20/1994 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
UnitTypeClass::UnitTypeClass(
|
||
|
UnitType type,
|
||
|
int name,
|
||
|
char const * ininame,
|
||
|
AnimType exp,
|
||
|
RemapType remap,
|
||
|
int verticaloffset,
|
||
|
int primaryoffset,
|
||
|
int primarylateral,
|
||
|
int secondaryoffset,
|
||
|
int secondarylateral,
|
||
|
bool is_goodie,
|
||
|
bool is_nominal,
|
||
|
bool is_crusher,
|
||
|
bool is_harvest,
|
||
|
bool is_stealthy,
|
||
|
bool is_insignificant,
|
||
|
bool is_turret_equipped,
|
||
|
bool is_radar_equipped,
|
||
|
bool is_fire_anim,
|
||
|
bool is_lock_turret,
|
||
|
bool is_gigundo,
|
||
|
bool is_animating,
|
||
|
bool is_jammer,
|
||
|
bool is_gapper,
|
||
|
int rotation,
|
||
|
int toffset,
|
||
|
MissionType order) :
|
||
|
TechnoTypeClass(RTTI_UNITTYPE,
|
||
|
int(type),
|
||
|
name,
|
||
|
ininame,
|
||
|
remap,
|
||
|
verticaloffset,
|
||
|
primaryoffset,
|
||
|
primarylateral,
|
||
|
secondaryoffset,
|
||
|
secondarylateral,
|
||
|
is_nominal,
|
||
|
is_stealthy,
|
||
|
true,
|
||
|
true,
|
||
|
is_insignificant,
|
||
|
false,
|
||
|
false,
|
||
|
is_turret_equipped,
|
||
|
true,
|
||
|
true,
|
||
|
rotation,
|
||
|
SPEED_TRACK),
|
||
|
IsCrateGoodie(is_goodie),
|
||
|
IsCrusher(is_crusher),
|
||
|
IsToHarvest(is_harvest),
|
||
|
IsRadarEquipped(is_radar_equipped),
|
||
|
IsFireAnim(is_fire_anim),
|
||
|
IsLockTurret(is_lock_turret),
|
||
|
IsGigundo(is_gigundo),
|
||
|
IsAnimating(is_animating),
|
||
|
IsJammer(is_jammer),
|
||
|
IsGapper(is_gapper),
|
||
|
IsNoFireWhileMoving(false),
|
||
|
Type(type),
|
||
|
TurretOffset(toffset),
|
||
|
Mission(order),
|
||
|
Explosion(exp),
|
||
|
MaxSize(0)
|
||
|
{
|
||
|
/*
|
||
|
** Forced unit overrides form the default.
|
||
|
*/
|
||
|
Speed = SPEED_WHEEL;
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::operator new -- Allocates an object from the unit type class heap. *
|
||
|
* *
|
||
|
* Use this routine to allocate a unit type class object from the special heap that is *
|
||
|
* maintained for this purpose. *
|
||
|
* *
|
||
|
* INPUT: none *
|
||
|
* *
|
||
|
* OUTPUT: Returns with a pointer to the newly allocated unit type class object. If there is *
|
||
|
* no more room to allocate another unit type class object, then NULL will be *
|
||
|
* returned. *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 07/09/1996 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
void * UnitTypeClass::operator new(size_t)
|
||
|
{
|
||
|
return(UnitTypes.Alloc());
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::operator delete -- Return a unit type class object back to the pool. *
|
||
|
* *
|
||
|
* This will return a previously allocated unit to the memory pool from whence it came. *
|
||
|
* *
|
||
|
* INPUT: pointer -- A Pointer to the unit type class object to return to the memory pool. *
|
||
|
* *
|
||
|
* OUTPUT: none *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 07/09/1996 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
void UnitTypeClass::operator delete(void * pointer)
|
||
|
{
|
||
|
UnitTypes.Free((UnitTypeClass *)pointer);
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::Init_Heap -- Initialize the unit type class heap. *
|
||
|
* *
|
||
|
* This initializes the unit type class heap by pre-allocated all the known unit types. *
|
||
|
* *
|
||
|
* INPUT: none *
|
||
|
* *
|
||
|
* OUTPUT: none *
|
||
|
* *
|
||
|
* WARNINGS: Only call this once and call it before processing the rules.ini file. *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 07/09/1996 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
void UnitTypeClass::Init_Heap(void)
|
||
|
{
|
||
|
/*
|
||
|
** These unit type class objects must be allocated in the exact order that they
|
||
|
** are specified in the UnitType enumeration. This is necessary because the heap
|
||
|
** allocation block index serves double duty as the type number index.
|
||
|
*/
|
||
|
new UnitTypeClass(UnitHTank); // UNIT_HTANK
|
||
|
new UnitTypeClass(UnitMTank); // UNIT_MTANK
|
||
|
new UnitTypeClass(UnitMTank2); // UNIT_MTANK2
|
||
|
new UnitTypeClass(UnitLTank); // UNIT_LTANK
|
||
|
new UnitTypeClass(UnitAPC); // UNIT_APC
|
||
|
new UnitTypeClass(UnitMineLayer); // UNIT_MINELAYER
|
||
|
new UnitTypeClass(UnitJeep); // UNIT_JEEP
|
||
|
new UnitTypeClass(UnitHarvester); // UNIT_HARVESTER
|
||
|
new UnitTypeClass(UnitArty); // UNIT_ARTY
|
||
|
new UnitTypeClass(UnitMRJammer); // UNIT_MRJ
|
||
|
new UnitTypeClass(UnitMGG); // UNIT_MGG
|
||
|
new UnitTypeClass(UnitMCV); // UNIT_MCV
|
||
|
new UnitTypeClass(UnitV2Launcher); // UNIT_V2_LAUNCHER
|
||
|
new UnitTypeClass(UnitConvoyTruck); // UNIT_TRUCK
|
||
|
#ifdef FIXIT_ANTS
|
||
|
new UnitTypeClass(UnitAnt1); // UNIT_ANT1
|
||
|
new UnitTypeClass(UnitAnt2); // UNIT_ANT2
|
||
|
new UnitTypeClass(UnitAnt3); // UNIT_ANT3
|
||
|
#endif
|
||
|
|
||
|
#ifdef FIXIT_CSII // checked - ajw 9/28/98
|
||
|
new UnitTypeClass(UnitChrono); // UNIT_CHRONOTANK
|
||
|
new UnitTypeClass(UnitTesla); // UNIT_TESLATANK
|
||
|
new UnitTypeClass(UnitMAD); // UNIT_MAD
|
||
|
new UnitTypeClass(UnitDemoTruck); // UNIT_DEMOTRUCK
|
||
|
#ifdef FIXIT_PHASETRANSPORT // checked - ajw 9/28/98
|
||
|
new UnitTypeClass(UnitPhase); // UNIT_PHASETRANSPORT
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::From_Name -- Fetch class pointer from specified name. *
|
||
|
* *
|
||
|
* This routine converts an ASCII representation of a unit class and *
|
||
|
* converts it into a real unit class number. *
|
||
|
* *
|
||
|
* INPUT: name -- ASCII name representing a unit class. *
|
||
|
* *
|
||
|
* OUTPUT: Returns with the actual unit class number that the string *
|
||
|
* represents. *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 10/07/1992 JLB : Created. *
|
||
|
* 05/02/1994 JLB : Converted to member function. *
|
||
|
*=============================================================================================*/
|
||
|
UnitType UnitTypeClass::From_Name(char const * name)
|
||
|
{
|
||
|
if (name != NULL) {
|
||
|
for (UnitType classid = UNIT_FIRST; classid < UNIT_COUNT; classid++) {
|
||
|
if (stricmp(As_Reference(classid).IniName, name) == 0) {
|
||
|
return(classid);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return(UNIT_NONE);
|
||
|
}
|
||
|
|
||
|
|
||
|
#ifdef SCENARIO_EDITOR
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::Display -- Displays a generic unit shape. *
|
||
|
* *
|
||
|
* This routine displays a generic representation of a unit of this *
|
||
|
* type. Typically, it is used when adding objects to the game map. *
|
||
|
* *
|
||
|
* INPUT: x,y -- Coordinate to render the unit shape. *
|
||
|
* *
|
||
|
* window-- Window to render within. *
|
||
|
* *
|
||
|
* house -- House to render the unit colors. *
|
||
|
* *
|
||
|
* OUTPUT: none *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 05/14/1994 JLB : Created. *
|
||
|
* 11/08/1994 JLB : Handles chunky type vehicles now. *
|
||
|
*=============================================================================================*/
|
||
|
void UnitTypeClass::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 = Rotation/6;
|
||
|
}
|
||
|
CC_Draw_Shape(ptr, shape, x, y, window, SHAPE_CENTER|SHAPE_WIN_REL);
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::Prep_For_Add -- Prepares scenario editor to add unit. *
|
||
|
* *
|
||
|
* This routine is used to prepare the generic object adder dialog *
|
||
|
* box so that it will be able to add a unit object. *
|
||
|
* *
|
||
|
* INPUT: none *
|
||
|
* *
|
||
|
* OUTPUT: none *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 05/23/1994 JLB : Created. *
|
||
|
* 06/04/1994 JLB : Uses map editing interface functions. *
|
||
|
*=============================================================================================*/
|
||
|
void UnitTypeClass::Prep_For_Add(void)
|
||
|
{
|
||
|
for (UnitType index = UNIT_FIRST; index < UNIT_COUNT; index++) {
|
||
|
if (As_Reference(index).Get_Image_Data() != NULL) {
|
||
|
Map.Add_To_List(&As_Reference(index));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::One_Time -- Performs one time processing for unit type class objects. *
|
||
|
* *
|
||
|
* This routine is used to perform the action necessary only once for the unit type class. *
|
||
|
* It loads unit shapes and brain files. This routine should only be called once. *
|
||
|
* *
|
||
|
* INPUT: none *
|
||
|
* *
|
||
|
* OUTPUT: none *
|
||
|
* *
|
||
|
* WARNINGS: Only call this routine once. *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 05/28/1994 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
void UnitTypeClass::One_Time(void)
|
||
|
{
|
||
|
for (UnitType index = UNIT_FIRST; index < UNIT_COUNT; index++) {
|
||
|
char fullname[_MAX_FNAME+_MAX_EXT];
|
||
|
char buffer[_MAX_FNAME];
|
||
|
UnitTypeClass const & uclass = As_Reference(index);
|
||
|
CCFileClass file;
|
||
|
|
||
|
void const * ptr; // Shape pointer and set pointer.
|
||
|
|
||
|
int largest = 0;
|
||
|
// if (uclass.Level != -1) {
|
||
|
// if (uclass.IsBuildable) {
|
||
|
|
||
|
/*
|
||
|
** Fetch the supporting data files for the unit.
|
||
|
*/
|
||
|
sprintf(buffer, "%sICON", uclass.Graphic_Name());
|
||
|
_makepath(fullname, NULL, NULL, buffer, ".SHP");
|
||
|
#ifndef NDEBUG
|
||
|
RawFileClass datafile(fullname);
|
||
|
if (datafile.Is_Available()) {
|
||
|
((void const *&)uclass.CameoData) = Load_Alloc_Data(datafile);
|
||
|
} else {
|
||
|
((void const *&)uclass.CameoData) = MFCD::Retrieve(fullname);
|
||
|
}
|
||
|
#else
|
||
|
((void const *&)uclass.CameoData) = MFCD::Retrieve(fullname);
|
||
|
#endif
|
||
|
// }
|
||
|
|
||
|
/*
|
||
|
** Fetch a pointer to the unit's shape data.
|
||
|
*/
|
||
|
_makepath(fullname, NULL, NULL, uclass.Graphic_Name(), ".SHP");
|
||
|
#ifndef NDEBUG
|
||
|
RawFileClass shpfile(fullname);
|
||
|
if (shpfile.Is_Available()) {
|
||
|
ptr = Load_Alloc_Data(shpfile);
|
||
|
} else {
|
||
|
ptr = MFCD::Retrieve(fullname);
|
||
|
}
|
||
|
#else
|
||
|
ptr = MFCD::Retrieve(fullname);
|
||
|
#endif
|
||
|
|
||
|
((void const *&)uclass.ImageData) = ptr;
|
||
|
if (ptr != NULL) {
|
||
|
|
||
|
largest = max(largest, (int)Get_Build_Frame_Width(ptr));
|
||
|
largest = max(largest, (int)Get_Build_Frame_Height(ptr));
|
||
|
}
|
||
|
|
||
|
((int &)uclass.MaxSize) = max(largest, 8);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
** Load any custom shapes at this time.
|
||
|
*/
|
||
|
if (WakeShapes == NULL) {
|
||
|
WakeShapes = MFCD::Retrieve("WAKE.SHP");
|
||
|
}
|
||
|
if (TurretShapes == NULL) {
|
||
|
TurretShapes = MFCD::Retrieve("TURR.SHP");
|
||
|
}
|
||
|
if (SamShapes == NULL) {
|
||
|
SamShapes = MFCD::Retrieve("SSAM.SHP");
|
||
|
}
|
||
|
if (MGunShapes == NULL) {
|
||
|
MGunShapes = MFCD::Retrieve("MGUN.SHP");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::Create_And_Place -- Creates and places a unit object onto the map. *
|
||
|
* *
|
||
|
* This routine is used by the scenario editor to create and place a unit object of this *
|
||
|
* type onto the map. *
|
||
|
* *
|
||
|
* INPUT: cell -- The cell that the unit is to be placed into. *
|
||
|
* *
|
||
|
* house -- The house that the unit belongs to. *
|
||
|
* *
|
||
|
* OUTPUT: bool; Was the unit created and placed successfully? *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 05/28/1994 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
bool UnitTypeClass::Create_And_Place(CELL cell, HousesType house) const
|
||
|
{
|
||
|
UnitClass * unit = new UnitClass(Type, house);
|
||
|
if (unit != NULL) {
|
||
|
return(unit->Unlimbo(Cell_Coord(cell), Random_Pick(DIR_N, DIR_MAX)));
|
||
|
}
|
||
|
return(false);
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::Create_One_Of -- Creates a unit in limbo. *
|
||
|
* *
|
||
|
* This function creates a unit of this type and keeps it in limbo. A pointer to the *
|
||
|
* created unit object is returned. It is presumed that this object will later be *
|
||
|
* unlimboed at the correct time and place. *
|
||
|
* *
|
||
|
* INPUT: house -- Pointer to the house that is to own the unit. *
|
||
|
* *
|
||
|
* OUTPUT: Returns with a pointer to the created unit object. If the unit object *
|
||
|
* could not be created, then NULL is returned. *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 06/07/1994 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
ObjectClass * UnitTypeClass::Create_One_Of(HouseClass * house) const
|
||
|
{
|
||
|
return(new UnitClass(Type, house->Class->House));
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::As_Reference -- Fetches a reference to the unit type class specified. *
|
||
|
* *
|
||
|
* Use this routine to return a reference to the UnitTypeClass object as indicated by *
|
||
|
* the unit type number specified. *
|
||
|
* *
|
||
|
* INPUT: type -- The unit type number to convert into a UnitTypeClass object reference. *
|
||
|
* *
|
||
|
* OUTPUT: Returns with a reference to the unit type class object specified. *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 01/23/1995 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
UnitTypeClass & UnitTypeClass::As_Reference(UnitType type)
|
||
|
{
|
||
|
return(*UnitTypes.Ptr(type));
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::Dimensions -- Determines the unit's pixel dimensions. *
|
||
|
* *
|
||
|
* This routine will fill in the width and height for this unit type. This width and *
|
||
|
* height are used to render the selection rectangle and the positioning of the health *
|
||
|
* bargraph. *
|
||
|
* *
|
||
|
* INPUT: width -- Reference to the width of the unit (to be filled in). *
|
||
|
* *
|
||
|
* height -- Reference to the height of the unit (to be filled in). *
|
||
|
* *
|
||
|
* OUTPUT: none *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 01/23/1995 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
void UnitTypeClass::Dimensions(int &width, int &height) const
|
||
|
{
|
||
|
width = MaxSize-(MaxSize/4);
|
||
|
width = min(width, 48);
|
||
|
height = MaxSize-(MaxSize/4);
|
||
|
height = min(height, 48);
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::Max_Pips -- Fetches the maximum pips allowed for this unit. *
|
||
|
* *
|
||
|
* This routine will determine the number of pips (maximum) allowed for this unit type. *
|
||
|
* Typically, this is the number of passengers allowed, but for harvesters, it is the *
|
||
|
* number of credits it holds divided by 100. *
|
||
|
* *
|
||
|
* INPUT: none *
|
||
|
* *
|
||
|
* OUTPUT: Returns with the maximum number of pips allowed for this unit type. *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 06/26/1995 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
int UnitTypeClass::Max_Pips(void) const
|
||
|
{
|
||
|
if (Type == UNIT_HARVESTER) {
|
||
|
return(7);
|
||
|
}
|
||
|
|
||
|
if (Type == UNIT_MINELAYER) {
|
||
|
return(MaxAmmo);
|
||
|
}
|
||
|
return(Max_Passengers());
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::Turret_Adjust -- Turret adjustment routine for MLRS and MSAM units. *
|
||
|
* *
|
||
|
* This routine adjusts the pixel coordinates specified to account for the displacement of *
|
||
|
* the turret on the MLRS and MSAM vehicles. *
|
||
|
* *
|
||
|
* INPUT: dir -- The direction of the body of the vehicle. *
|
||
|
* *
|
||
|
* x,y -- References to the turret center pixel position. These will be modified as *
|
||
|
* necessary. *
|
||
|
* *
|
||
|
* OUTPUT: none *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 05/08/1995 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
void UnitTypeClass::Turret_Adjust(DirType dir, int &x, int &y) const
|
||
|
{
|
||
|
static struct {
|
||
|
signed char X,Y;
|
||
|
} _adjust[32] = {
|
||
|
{1,2}, // N
|
||
|
{-1,1},
|
||
|
{-2,0},
|
||
|
{-3,0},
|
||
|
{-3,1}, // NW
|
||
|
{-4,-1},
|
||
|
{-4,-1},
|
||
|
{-5,-2},
|
||
|
{-5,-3}, // W
|
||
|
{-5,-3},
|
||
|
{-3,-3},
|
||
|
{-3,-4},
|
||
|
{-3,-4}, // SW
|
||
|
{-3,-5},
|
||
|
{-2,-5},
|
||
|
{-1,-5},
|
||
|
{0,-5}, // S
|
||
|
{1,-6},
|
||
|
{2,-5},
|
||
|
{3,-5},
|
||
|
{4,-5}, // SE
|
||
|
{6,-4},
|
||
|
{6,-3},
|
||
|
{6,-3},
|
||
|
{6,-3}, // E
|
||
|
{5,-1},
|
||
|
{5,-1},
|
||
|
{4,0},
|
||
|
{3,0}, // NE
|
||
|
{2,0},
|
||
|
{2,1},
|
||
|
{1,2}
|
||
|
};
|
||
|
|
||
|
int index = 0;
|
||
|
switch (Type) {
|
||
|
case UNIT_JEEP:
|
||
|
y -= 4;
|
||
|
break;
|
||
|
|
||
|
case UNIT_MGG:
|
||
|
index = Dir_To_32(dir);
|
||
|
x += _adjust[index].X;
|
||
|
y += _adjust[index].Y;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/***********************************************************************************************
|
||
|
* UnitTypeClass::Read_INI -- Fetch the unit type data from the INI database. *
|
||
|
* *
|
||
|
* This routine will find the section in the INI database for this unit type object and *
|
||
|
* then fill in the override values specified. *
|
||
|
* *
|
||
|
* INPUT: ini -- Reference to the INI database that will be examined. *
|
||
|
* *
|
||
|
* OUTPUT: bool; Was the section for this unit found in the database and the data extracted? *
|
||
|
* *
|
||
|
* WARNINGS: none *
|
||
|
* *
|
||
|
* HISTORY: *
|
||
|
* 07/19/1996 JLB : Created. *
|
||
|
*=============================================================================================*/
|
||
|
bool UnitTypeClass::Read_INI(CCINIClass & ini)
|
||
|
{
|
||
|
if (TechnoTypeClass::Read_INI(ini)) {
|
||
|
IsNoFireWhileMoving = ini.Get_Bool(IniName, "NoMovingFire", IsNoFireWhileMoving);
|
||
|
Speed = ini.Get_Bool(IniName, "Tracked", (Speed == SPEED_TRACK)) ? SPEED_TRACK : SPEED_WHEEL;
|
||
|
|
||
|
/*
|
||
|
** If this unit can drive over walls, then mark it as recognizing the crusher zone.
|
||
|
*/
|
||
|
if (MZone < MZONE_CRUSHER && IsCrusher) {
|
||
|
MZone = MZONE_CRUSHER;
|
||
|
}
|
||
|
return(true);
|
||
|
}
|
||
|
return(false);
|
||
|
}
|