CnC_Remastered_Collection/TIBERIANDAWN/IDATA.CPP

2153 lines
80 KiB
C++
Raw Normal View History

//
// 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: F:\projects\c&c\vcs\code\idata.cpv 2.12 02 Aug 1995 17:00:30 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 : IDATA.CPP *
* *
* Programmer : Joe L. Bostic *
* *
* Start Date : August 15, 1994 *
* *
* Last Update : June 29, 1995 [JLB] *
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* InfantryTypeClass::Create_And_Place -- Creates and places infantry object onto the map. *
* InfantryTypeClass::Create_One_Of -- Creates an infantry object. *
* InfantryTypeClass::Display -- Displays a generic infantry object. *
* InfantryTypeClass::From_Name -- Converts an ASCII name into an infantry type number. *
* InfantryTypeClass::Full_Name -- Fetches the full name text number. *
* InfantryTypeClass::Get_Cameo_Data -- Fetches the small cameo shape for sidebar strip. *
* InfantryTypeClass::InfantryTypeClass -- Constructor for infantry type class objects. *
* InfantryTypeClass::Occupy_List -- Returns with default infantry occupation list. *
* InfantryTypeClass::One_Time -- Performs any one time processing for infantry system. *
* InfantryTypeClass::Prep_For_Add -- Prepares the scenario editor for adding of infantry object.*
* InfantryTypeClass::Who_Can_Build_Me -- Determines what can build the infantry object. *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "function.h"
#include "type.h"
/*
* There were too many parameters for the InfantryTypeClass constructor so I have
* created a table of Do Controls for each unit type and I am passing a pointer
* to the table to the constructor instead of passing each value as it was before.
*
* If this offends anyones C++ sensibilities then please feel free to implement a
* more elegant oop solution.
*
* Steve T. 10/3/95 10:13AM
*
*/
// Minigunners
int MiniGunnerDos [DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
8, 1, 1, // DO_STAND_GUARD
192, 1, 8, // DO_PRONE
16, 6, 6, // DO_WALK
64, 8, 8, // DO_FIRE_WEAPON
128, 2, 2, // DO_LIE_DOWN
144, 4, 4, // DO_CRAWL
176, 2, 2, // DO_GET_UP
192, 6, 8, // DO_FIRE_PRONE
256, 16,0, // DO_IDLE1
272, 16,0, // DO_IDLE2
288, 13,0, // DO_ON_GUARD
292, 10,0, // DO_FIGHT_READY
301, 2, 0, // DO_PUNCH
303, 6, 0, // DO_KICK
309, 2, 0, // DO_PUNCH_HIT1
311, 4, 0, // DO_PUNCH_HIT2
315, 5, 0, // DO_PUNCH_DEATH
319, 2, 0, // DO_KICK_HIT1
321, 4, 0, // DO_KICK_HIT2
325, 5, 0, // DO_KICK_DEATH
330, 5, 0, // DO_READY_WEAPON
382, 8, 0, // DO_GUN_DEATH
398, 8, 0, // DO_EXPLOSION_DEATH
398, 8, 0, // DO_EXPLOSION2_DEATH
406, 12,0, // DO_GRENADE_DEATH
418, 18,0, // DO_FIRE_DEATH
436, 3, 3, // DO_GESTURE1
460, 3, 3, // DO_SALUTE1
484, 3, 3, // DO_GESTURE2
508, 3, 3, // DO_SALUTE2
0, 1, 1, // DO_PULL_GUN // N/A
0, 1, 1, // DO_PLEAD // N/A
0, 1, 1 // DO_PLEAD_DEATH // N/A
};
static InfantryTypeClass const E1(
INFANTRY_E1, // Infantry type number.
TXT_E1, // Translate name number for infantry type.
"E1", // INI name for infantry.
1, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
true, // Is a leader type?
true, // Has crawling animation frames?
false, // Is this a civlian?
false, // Always use the given name for the infantry?
false, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
-1, // Number of shots it has (default).
&MiniGunnerDos[0][0], // Ptr to minigunner 'DO' table above
2, // Frame of projectile launch.
2, // Frame of projectile launch while prone.
50, // Strength of infantry (in damage points).
1, // Sight range.
100, // Cost of infantry (in credits).
1, // Scenario when they first appear.
80,10, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD, // Who can own this infantry unit.
WEAPON_M16,WEAPON_NONE,
MPH_SLOW // Maximum speed of infantry.
);
// Grenadiers
int GrenadierDos [DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
8, 1, 1, // DO_STAND_GUARD
288, 1, 12, // DO_PRONE
16, 6, 6, // DO_WALK
64, 20,20, // DO_FIRE_WEAPON
224, 2, 2, // DO_LIE_DOWN
240, 4, 4, // DO_CRAWL
272, 2, 2, // DO_GET_UP
288, 8, 12, // DO_FIRE_PRONE
384, 16,0, // DO_IDLE1
400, 16,0, // DO_IDLE2
416, 13,0, // DO_ON_GUARD
420, 10,0, // DO_FIGHT_READY
429, 2, 0, // DO_PUNCH
431, 6, 0, // DO_KICK
437, 2, 0, // DO_PUNCH_HIT1
439, 4, 0, // DO_PUNCH_HIT2
443, 4, 0, // DO_PUNCH_DEATH
447, 2, 0, // DO_KICK_HIT1
449, 4, 0, // DO_KICK_HIT2
453, 5, 0, // DO_KICK_DEATH
458, 5, 0, // DO_READY_WEAPON
510, 8, 0, // DO_GUN_DEATH
526, 8, 0, // DO_EXPLOSION_DEATH
526, 8, 0, // DO_EXPLOSION2_DEATH
534, 12,0, // DO_GRENADE_DEATH
546, 18,0, // DO_FIRE_DEATH
564, 3, 3, // DO_GESTURE1
588, 3, 3, // DO_SALUTE1
612, 3, 3, // DO_GESTURE2
636, 3, 3, // DO_SALUTE2
0, 1, 1, // DO_PULL_GUN // N/A
0, 1, 1, // DO_PLEAD // N/A
0, 1, 1 // DO_PLEAD_DEATH // N/A
};
static InfantryTypeClass const E2(
INFANTRY_E2, // Infantry type number.
TXT_E2, // Translate name number for infantry type.
"E2", // INI name for infantry.
1, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
true, // Is a leader type?
true, // Has crawling animation frames?
false, // Is this a civlian?
false, // Always use the given name for the infantry?
false, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
-1, // Number of shots it has (default).
&GrenadierDos[0][0], // Ptr to grenadier DO table (above)
14, // Frame of projectile launch.
6, // Frame of projectile launch while prone.
50, // Strength of infantry (in damage points).
1, // Sight range.
160, // Cost of infantry (in credits).
3, // Scenario when they first appear.
80,10, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD, // Who can own this infantry unit.
WEAPON_GRENADE,WEAPON_NONE,
MPH_SLOW_ISH // Maximum speed of infantry.
);
// Bazooka
int BazookaDos [DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
8, 1, 1, // DO_STAND_GUARD
192, 1,10, // DO_PRONE
16, 6, 6, // DO_WALK
64, 8, 8, // DO_FIRE_WEAPON
128, 2, 2, // DO_LIE_DOWN
144, 4, 4, // DO_CRAWL
176, 2, 2, // DO_GET_UP
192, 10,10, // DO_FIRE_PRONE
272, 16,0, // DO_IDLE1
288, 16,0, // DO_IDLE2
304, 13,0, // DO_ON_GUARD
308, 10,0, // DO_FIGHT_READY
307, 2, 0, // DO_PUNCH
319, 6, 0, // DO_KICK
325, 2, 0, // DO_PUNCH_HIT1
327, 4, 0, // DO_PUNCH_HIT2
331, 4, 0, // DO_PUNCH_DEATH
335, 2, 0, // DO_KICK_HIT1
337, 4, 0, // DO_KICK_HIT2
341, 5, 0, // DO_KICK_DEATH
346, 5, 0, // DO_READY_WEAPON
398, 8, 0, // DO_GUN_DEATH
414, 8, 0, // DO_EXPLOSION_DEATH
414, 8, 0, // DO_EXPLOSION2_DEATH
422, 12,0, // DO_GRENADE_DEATH
434, 18,0, // DO_FIRE_DEATH
452, 3, 3, // DO_GESTURE1
476, 3, 3, // DO_SALUTE1
500, 3, 3, // DO_GESTURE2
524, 3, 3, // DO_SALUTE2
0, 1, 1, // DO_PULL_GUN // N/A
0, 1, 1, // DO_PLEAD // N/A
0, 1, 1 // DO_PLEAD_DEATH // N/A
};
static InfantryTypeClass const E3(
INFANTRY_E3, // Infantry type number.
TXT_E3, // Translate name number for infantry type.
"E3", // INI name for infantry.
2, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
true, // Is a leader type?
true, // Has crawling animation frames?
false, // Is this a civlian?
false, // Always use the given name for the infantry?
false, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
-1, // Number of shots it has (default).
&BazookaDos[0][0], // Ptr to DO table (above)
3, // Frame of projectile launch.
3, // Frame of projectile launch while prone.
25, // Strength of infantry (in damage points).
2, // Sight range.
300, // Cost of infantry (in credits).
3, // Scenario when they first appear.
80,10, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD, // Who can own this infantry unit.
WEAPON_DRAGON,WEAPON_NONE,
MPH_KINDA_SLOW // Maximum speed of infantry.
);
// Flamethrower
int FlamethrowerDos [DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
8, 1, 1, // DO_STAND_GUARD
256, 1,16, // DO_PRONE
16, 6, 6, // DO_WALK
64, 16,16, // DO_FIRE_WEAPON
192, 2, 2, // DO_LIE_DOWN
208, 4, 4, // DO_CRAWL
240, 2, 2, // DO_GET_UP
256, 16,16, // DO_FIRE_PRONE
384, 16,0, // DO_IDLE1
400, 16,0, // DO_IDLE2
416, 13,0, // DO_ON_GUARD
420, 10,0, // DO_FIGHT_READY
429, 2, 0, // DO_PUNCH
431, 6, 0, // DO_KICK
437, 2, 0, // DO_PUNCH_HIT1
439, 4, 0, // DO_PUNCH_HIT2
443, 4, 0, // DO_PUNCH_DEATH
447, 2, 0, // DO_KICK_HIT1
449, 4, 0, // DO_KICK_HIT2
453, 5, 0, // DO_KICK_DEATH
458, 5, 0, // DO_READY_WEAPON
510, 8, 0, // DO_GUN_DEATH
526, 8, 0, // DO_EXPLOSION_DEATH
526, 8, 0, // DO_EXPLOSION2_DEATH
534, 12,0, // DO_GRENADE_DEATH
546, 18,0, // DO_FIRE_DEATH
564, 3, 3, // DO_GESTURE1
588, 3, 3, // DO_SALUTE1
612, 3, 3, // DO_GESTURE2
636, 3, 3, // DO_SALUTE2
0, 1, 1, // DO_PULL_GUN // N/A
0, 1, 1, // DO_PLEAD // N/A
0, 1, 1 // DO_PLEAD_DEATH // N/A
};
static InfantryTypeClass const E4(
INFANTRY_E4, // Infantry type number.
TXT_E4, // Translate name number for infantry type.
"E4", // INI name for infantry.
1, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
true, // Is a leader type?
true, // Has crawling animation frames?
false, // Is this a civlian?
false, // Always use the given name for the infantry?
false, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
-1, // Number of shots it has (default).
&FlamethrowerDos[0][0], // ptr to DO table (above)
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
70, // Strength of infantry (in damage points).
1, // Sight range.
200, // Cost of infantry (in credits).
5, // Scenario when they first appear.
80,10, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_BAD, // Who can own this infantry unit.
WEAPON_FLAMETHROWER,WEAPON_NONE,
MPH_SLOW_ISH
);
// Chemwarrior
int ChemwarriorDos [DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
8, 1, 1, // DO_STAND_GUARD
256, 1,16, // DO_PRONE
16, 6, 6, // DO_WALK
64, 16,16, // DO_FIRE_WEAPON
192, 2, 2, // DO_LIE_DOWN
208, 4, 4, // DO_CRAWL
240, 2, 2, // DO_GET_UP
256, 16,16, // DO_FIRE_PRONE
384, 16,0, // DO_IDLE1
400, 16,0, // DO_IDLE2
416, 13,0, // DO_ON_GUARD
420, 10,0, // DO_FIGHT_READY
429, 2, 0, // DO_PUNCH
431, 6, 0, // DO_KICK
437, 2, 0, // DO_PUNCH_HIT1
439, 4, 0, // DO_PUNCH_HIT2
443, 4, 0, // DO_PUNCH_DEATH
447, 2, 0, // DO_KICK_HIT1
449, 4, 0, // DO_KICK_HIT2
453, 5, 0, // DO_KICK_DEATH
458, 5, 0, // DO_READY_WEAPON
510, 8, 0, // DO_GUN_DEATH
526, 8, 0, // DO_EXPLOSION_DEATH
526, 8, 0, // DO_EXPLOSION2_DEATH
534, 12,0, // DO_GRENADE_DEATH
546, 18,0, // DO_FIRE_DEATH
564, 3, 3, // DO_GESTURE1
588, 3, 3, // DO_SALUTE1
612, 3, 3, // DO_GESTURE2
636, 3, 3, // DO_SALUTE2
0, 1, 1, // DO_PULL_GUN // N/A
0, 1, 1, // DO_PLEAD // N/A
0, 1, 1 // DO_PLEAD_DEATH // N/A
};
static InfantryTypeClass const E5(
INFANTRY_E5, // Infantry type number.
TXT_E5, // Translate name number for infantry type.
"E5", // INI name for infantry.
7, // Build level.
STRUCTF_EYE, // Building prerequisite.
false, // Is this a female type?
true, // Is a leader type?
true, // Has crawling animation frames?
false, // Is this a civlian?
false, // Always use the given name for the infantry?
false, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
-1, // Number of shots it has (default).
&ChemwarriorDos[0][0], // ptr to DO table
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
70, // Strength of infantry (in damage points).
1, // Sight range.
300, // Cost of infantry (in credits).
98, // Scenario when they first appear.
80,10, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
// HOUSEF_GOOD|
HOUSEF_BAD, // Who can own this infantry unit.
WEAPON_CHEMSPRAY,WEAPON_NONE,
MPH_SLOW
);
// Engineer
int EngineerDos[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
8, 1, 1, // DO_STAND_GUARD
82, 1, 4, // DO_PRONE
16, 6, 6, // DO_WALK
0, 0, 0, // DO_FIRE_WEAPON
67, 2, 2, // DO_LIE_DOWN
82, 4, 4, // DO_CRAWL
114, 2, 2, // DO_GET_UP
0, 0, 0, // DO_FIRE_PRONE
130, 16,0, // DO_IDLE1
0, 0, 0, // DO_IDLE2
0, 0, 0, // DO_ON_GUARD
0, 0, 0, // DO_FIGHT_READY
0, 0, 0, // DO_PUNCH
0, 0, 0, // DO_KICK
0, 0, 0, // DO_PUNCH_HIT1
0, 0, 0, // DO_PUNCH_HIT2
0, 0, 0, // DO_PUNCH_DEATH
0, 0, 0, // DO_KICK_HIT1
0, 0, 0, // DO_KICK_HIT2
0, 0, 0, // DO_KICK_DEATH
0, 0, 0, // DO_READY_WEAPON
146, 8, 0, // DO_GUN_DEATH
154, 8, 0, // DO_EXPLOSION_DEATH
162, 8, 0, // DO_EXPLOSION2_DEATH
170, 12,0, // DO_GRENADE_DEATH
182, 18,0, // DO_FIRE_DEATH
200, 3, 3, // DO_GESTURE1
224, 3, 3, // DO_SALUTE1
200, 3, 3, // DO_GESTURE2
224, 3, 3, // DO_SALUTE2
0, 1, 1, // DO_PULL_GUN // N/A
0, 1, 1, // DO_PLEAD // N/A
0, 1, 1 // DO_PLEAD_DEATH // N/A
};
static InfantryTypeClass const E7(
INFANTRY_E7, // Infantry type number.
TXT_E7, // Translate name number for infantry type.
"E6", // INI name for infantry.
3, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
false, // Is a leader type?
false, // Has crawling animation frames?
false, // Is this a civlian?
false, // Always use the given name for the infantry?
false, // Is this a "fraidycat" run-away type infantry?
true, // Can this infantry type capture a building?
false, // Theater specific graphic image?
-1, // Number of shots it has (default).
&EngineerDos[0][0], // ptr to DO table
3, // Frame of projectile launch.
3, // Frame of projectile launch while prone.
25, // Strength of infantry (in damage points).
2, // Sight range.
500, // Cost of infantry (in credits).
2, // Scenario when they first appear.
80,75, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_BAD|
HOUSEF_GOOD, // Who can own this infantry unit.
WEAPON_NONE,WEAPON_NONE,
MPH_SLOW // Maximum speed of infantry.
);
// Commandos
int CommandoDos[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
8, 1, 1, // DO_STAND_GUARD
160, 1, 4, // DO_PRONE
16, 6, 6, // DO_WALK
64, 4, 4, // DO_FIRE_WEAPON
96, 2, 2, // DO_LIE_DOWN
112, 4, 4, // DO_CRAWL
144, 2, 2, // DO_GET_UP
160, 4, 4, // DO_FIRE_PRONE
192, 16,0, // DO_IDLE1
208, 16,0, // DO_IDLE2
224, 13,0, // DO_ON_GUARD
228, 9, 0, // DO_FIGHT_READY
237, 2, 0, // DO_PUNCH
239, 6, 0, // DO_KICK
245, 2, 0, // DO_PUNCH_HIT1
247, 4, 0, // DO_PUNCH_HIT2
251, 4, 0, // DO_PUNCH_DEATH
255, 2, 0, // DO_KICK_HIT1
257, 4, 0, // DO_KICK_HIT2
261, 5, 0, // DO_KICK_DEATH
266, 5, 0, // DO_READY_WEAPON
318, 8, 0, // DO_GUN_DEATH
334, 8, 0, // DO_EXPLOSION_DEATH
334, 8, 0, // DO_EXPLOSION2_DEATH
342, 12,0, // DO_GRENADE_DEATH
354, 18,0, // DO_FIRE_DEATH
372, 3, 3, // DO_GESTURE1
396, 3, 3, // DO_SALUTE1
420, 3, 3, // DO_GESTURE2
444, 3, 3, // DO_SALUTE2
0, 1, 1, // DO_PULL_GUN // N/A
0, 1, 1, // DO_PLEAD // N/A
0, 1, 1 // DO_PLEAD_DEATH // N/A
};
static InfantryTypeClass const Commando(
INFANTRY_RAMBO, // Infantry type number.
TXT_RAMBO, // Translate name number for infantry type.
"RMBO", // INI name for infantry.
7, // Build level.
STRUCTF_EYE, // Building prerequisite.
false, // Is this a female type?
true, // Is a leader type?
true, // Has crawling animation frames?
false, // Is this a civlian?
false, // Always use the given name for the infantry?
false, // Is this a "fraidycat" run-away type infantry?
Command & Conquer Remastered post-launch patch Improvements to harvester resource finding logic. Don't allow the Advanced Comm Center to be capturable in skirmish or multiplayer. Increased failed pathfinding fudge factor. Buildings accept the Guard command if they can attack. Don't allow force capturing of ally structures. Fixes for laser Orcas in S3cr3t M1ss10n. Properly restore them after save. Reset Orcas after loads. Fixed flag animation rendering in CTF. Potentially fix a crash if aircraft are destroyed outside the map bounds. Fixed legacy Obelisk line rendering. Fix out-of-bounds crash in TD; issue was already fixed in RA. Disable capture flag on Commandos. Drop the flag when entering the limbo state. Fixed end game race condition, winning team ID is always sent before individual player win/lose messages. Fixed Chan spawn on SCB10EA. Don't show enter cursor for enemy units on refineries and repair pads. Changing right-click support for first put building on hold, and then subsequenct right-clicks to decrement that queue count for 1x or 5x; Then, 1x or 5x Left click will resume from hold. Don't debug reveal legacy rendering when a player is defeated. Fixed crash when loading saves of custom campaign maps. Reset harvester archived target when given a direct harvest order. Prevent NOD cargo planes from being force attacked. Fixed unit selection on load. Migrated queued repair pad functionality from RA to TD. Randomly animate infantry in area guard mode. Fixed crash accessing inactive objects. Added some walls in SCG08EB to prevent civilians from killing themselves. TD + RA: Audio: Overiding "Our base is under attack" cooldown timing from legacy from 2 minutes to 30 seconds, so it will be heard 4x as often. Fixed adjacent cell out-of-bounds crash issues. Kill player on disconnect Fixed and improved build time calculations to be consistent between TD and RA. Don't show health bars for cloaked Stealth Tanks in the legacy renderer. Fix selection of individual control groups after mixed selection. More adjustments to SCG08EB; switch C7 to C5, and add civilian AI to avoid Tiberium. Extra safety checks for units that have no weapons and aircraft that can't hunt. Fix loading of multiple infantry onto an APC. Additional safety checks for invalid coordinates. Prevent units from being instantly repaired. Fix map passability. Fail Allied mission 5B if the spy re-boards the starting transport (matches 5A and 5C behavior). Fixed multiplayer formation move causing units to move at light speed. Ignore movement destination checks if a unit is part of a mission-driven team. Fix buffer overrun crash. Ignore mines when determining win conditions. Fixed river passability in Blue Lakes.
2020-06-23 04:43:21 +12:00
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
-1, // Number of shots it has (default).
&CommandoDos[0][0], // ptr to DO table
2, // Frame of projectile launch.
2, // Frame of projectile launch while prone.
80, // Strength of infantry (in damage points).
5, // Sight range.
1000, // Cost of infantry (in credits).
98, // Scenario when they first appear.
80,75, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD, // Who can own this infantry unit.
WEAPON_RIFLE,WEAPON_NONE,
MPH_SLOW_ISH // Maximum speed of infantry.
);
// Civilians
int CivilianDos1[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
0, 1, 1, // DO_STAND_GUARD
0, 1, 1, // DO_PRONE // N/A
56, 6, 6, // DO_WALK
205, 4, 4, // DO_FIRE_WEAPON
0, 1, 1, // DO_LIE_DOWN // N/A
8, 6, 6, // DO_CRAWL
0, 1, 1, // DO_GET_UP // N/A
205, 4, 4, // DO_FIRE_PRONE
189, 10,0, // DO_IDLE1
199, 6, 0, // DO_IDLE2
104, 3, 0, // DO_ON_GUARD
107, 7, 0, // DO_FIGHT_READY
114, 2, 0, // DO_PUNCH
116, 6, 0, // DO_KICK
122, 2, 0, // DO_PUNCH_HIT1
124, 4, 0, // DO_PUNCH_HIT2
128, 4, 0, // DO_PUNCH_DEATH
133, 2, 0, // DO_KICK_HIT1
135, 4, 0, // DO_KICK_HIT2
139, 5, 0, // DO_KICK_DEATH
144, 3, 0, // DO_READY_WEAPON
329, 8, 0, // DO_GUN_DEATH
337, 8, 0, // DO_EXPLOSION_DEATH
337, 8, 0, // DO_EXPLOSION2_DEATH
345, 12,0, // DO_GRENADE_DEATH
357, 18,0, // DO_FIRE_DEATH
0, 0, 0, // DO_GESTURE1 // N/A
0, 0, 0, // DO_SALUTE1 // N/A
0, 0, 0, // DO_GESTURE2 // N/A
0, 0, 0, // DO_SALUTE2 // N/A
199, 6, 0, // DO_PULL_GUN
237, 40,0, // DO_PLEAD
277, 6, 0 // DO_PLEAD_DEATH
};
static InfantryTypeClass const C1(
INFANTRY_C1, // Infantry type number.
TXT_C1, // Translate name number for infantry type.
"C1", // INI name for infantry.
99, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
true, // Is a leader type?
false, // Has crawling animation frames?
true, // Is this a civlian?
true, // Always use the given name for the infantry?
true, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
10, // Number of shots it has (default).
&CivilianDos1[0][0], // ptr to DO table
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
25, // Strength of infantry (in damage points).
0, // Sight range.
10, // Cost of infantry (in credits).
99, // Scenario when they first appear.
0,1, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD|
HOUSEF_NEUTRAL, // Who can own this infantry unit.
WEAPON_PISTOL,WEAPON_NONE,
MPH_SLOW_ISH
);
int CivilianDos2[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
0, 1, 1, // DO_STAND_GUARD
0, 1, 1, // DO_PRONE // N/A
56, 6, 6, // DO_WALK
205, 4, 4, // DO_FIRE_WEAPON
0, 1, 1, // DO_LIE_DOWN // N/A
8, 6, 6, // DO_CRAWL
0, 1, 1, // DO_GET_UP // N/A
205, 4, 4, // DO_FIRE_PRONE
189, 10,0, // DO_IDLE1
199, 6, 0, // DO_IDLE2
104, 3, 0, // DO_ON_GUARD
107, 7, 0, // DO_FIGHT_READY
114, 2, 0, // DO_PUNCH
116, 6, 0, // DO_KICK
122, 2, 0, // DO_PUNCH_HIT1
124, 4, 0, // DO_PUNCH_HIT2
128, 4, 0, // DO_PUNCH_DEATH
133, 2, 0, // DO_KICK_HIT1
135, 4, 0, // DO_KICK_HIT2
139, 5, 0, // DO_KICK_DEATH
144, 3, 0, // DO_READY_WEAPON
329, 8, 0, // DO_GUN_DEATH
337, 8, 0, // DO_EXPLOSION_DEATH
337, 8, 0, // DO_EXPLOSION2_DEATH
345, 12,0, // DO_GRENADE_DEATH
357, 18,0, // DO_FIRE_DEATH
0, 0, 0, // DO_GESTURE1 // N/A
0, 0, 0, // DO_SALUTE1 // N/A
0, 0, 0, // DO_GESTURE2 // N/A
0, 0, 0, // DO_SALUTE2 // N/A
199, 6, 0, // DO_PULL_GUN
237, 40,0, // DO_PLEAD
277, 6, 0 // DO_PLEAD_DEATH
};
static InfantryTypeClass const C2(
INFANTRY_C2, // Infantry type number.
TXT_C2, // Translate name number for infantry type.
"C2", // INI name for infantry.
99, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
false, // Is a leader type?
false, // Has crawling animation frames?
true, // Is this a civlian?
true, // Always use the given name for the infantry?
true, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
0, // Number of shots it has (default).
&CivilianDos2[0][0], // ptr to DO table
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
5, // Strength of infantry (in damage points).
0, // Sight range.
10, // Cost of infantry (in credits).
99, // Scenario when they first appear.
0,1, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD|
HOUSEF_NEUTRAL, // Who can own this infantry unit.
WEAPON_NONE,WEAPON_NONE,
MPH_SLOW_ISH
);
int CivilianDos3[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
0, 1, 1, // DO_STAND_GUARD
0, 1, 1, // DO_PRONE // N/A
56, 6, 6, // DO_WALK
205, 4, 4, // DO_FIRE_WEAPON
0, 1, 1, // DO_LIE_DOWN // N/A
8, 6, 6, // DO_CRAWL
0, 1, 1, // DO_GET_UP // N/A
205, 4, 4, // DO_FIRE_PRONE
189, 10,0, // DO_IDLE1
199, 6, 0, // DO_IDLE2
104, 3, 0, // DO_ON_GUARD
107, 7, 0, // DO_FIGHT_READY
114, 2, 0, // DO_PUNCH
116, 6, 0, // DO_KICK
122, 2, 0, // DO_PUNCH_HIT1
124, 4, 0, // DO_PUNCH_HIT2
128, 4, 0, // DO_PUNCH_DEATH
133, 2, 0, // DO_KICK_HIT1
135, 4, 0, // DO_KICK_HIT2
139, 5, 0, // DO_KICK_DEATH
144, 3, 0, // DO_READY_WEAPON
329, 8, 0, // DO_GUN_DEATH
337, 8, 0, // DO_EXPLOSION_DEATH
337, 8, 0, // DO_EXPLOSION2_DEATH
345, 12,0, // DO_GRENADE_DEATH
357, 18,0, // DO_FIRE_DEATH
0, 0, 0, // DO_GESTURE1 // N/A
0, 0, 0, // DO_SALUTE1 // N/A
0, 0, 0, // DO_GESTURE2 // N/A
0, 0, 0, // DO_SALUTE2 // N/A
199, 6, 0, // DO_PULL_GUN
237, 40,0, // DO_PLEAD
277, 6, 0 // DO_PLEAD_DEATH
};
static InfantryTypeClass const C3(
INFANTRY_C3, // Infantry type number.
TXT_C3, // Translate name number for infantry type.
"C3", // INI name for infantry.
99, // Build level.
STRUCTF_NONE, // Building prerequisite.
true, // Is this a female type?
false, // Is a leader type?
false, // Has crawling animation frames?
true, // Is this a civlian?
true, // Always use the given name for the infantry?
true, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
0, // Number of shots it has (default).
&CivilianDos3[0][0], // ptr to DO table
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
5, // Strength of infantry (in damage points).
0, // Sight range.
10, // Cost of infantry (in credits).
99, // Scenario when they first appear.
0,1, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD|
HOUSEF_NEUTRAL, // Who can own this infantry unit.
WEAPON_NONE,WEAPON_NONE,
MPH_SLOW_ISH
);
int CivilianDos4[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
0, 1, 1, // DO_STAND_GUARD
0, 1, 1, // DO_PRONE // N/A
56, 6, 6, // DO_WALK
205, 4, 4, // DO_FIRE_WEAPON
0, 1, 1, // DO_LIE_DOWN // N/A
8, 6, 6, // DO_CRAWL
0, 1, 1, // DO_GET_UP // N/A
205, 4, 4, // DO_FIRE_PRONE
189, 10,0, // DO_IDLE1
199, 6, 0, // DO_IDLE2
104, 3, 0, // DO_ON_GUARD
107, 7, 0, // DO_FIGHT_READY
114, 2, 0, // DO_PUNCH
116, 6, 0, // DO_KICK
122, 2, 0, // DO_PUNCH_HIT1
124, 4, 0, // DO_PUNCH_HIT2
128, 4, 0, // DO_PUNCH_DEATH
133, 2, 0, // DO_KICK_HIT1
135, 4, 0, // DO_KICK_HIT2
139, 5, 0, // DO_KICK_DEATH
144, 3, 0, // DO_READY_WEAPON
329, 8, 0, // DO_GUN_DEATH
337, 8, 0, // DO_EXPLOSION_DEATH
337, 8, 0, // DO_EXPLOSION2_DEATH
345, 12,0, // DO_GRENADE_DEATH
357, 18,0, // DO_FIRE_DEATH
0, 0, 0, // DO_GESTURE1 // N/A
0, 0, 0, // DO_SALUTE1 // N/A
0, 0, 0, // DO_GESTURE2 // N/A
0, 0, 0, // DO_SALUTE2 // N/A
199, 6, 0, // DO_PULL_GUN
237, 40,0, // DO_PLEAD
277, 6, 0, // DO_PLEAD_DEATH
};
static InfantryTypeClass const C4(
INFANTRY_C4, // Infantry type number.
TXT_C4, // Translate name number for infantry type.
"C4", // INI name for infantry.
99, // Build level.
STRUCTF_NONE, // Building prerequisite.
true, // Is this a female type?
false, // Is a leader type?
false, // Has crawling animation frames?
true, // Is this a civlian?
true, // Always use the given name for the infantry?
true, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
0, // Number of shots it has (default).
&CivilianDos4[0][0], // ptr to DO table
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
5, // Strength of infantry (in damage points).
0, // Sight range.
10, // Cost of infantry (in credits).
99, // Scenario when they first appear.
0,1, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD|
HOUSEF_NEUTRAL, // Who can own this infantry unit.
WEAPON_NONE,WEAPON_NONE,
MPH_SLOW_ISH
);
int CivilianDos5[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
0, 1, 1, // DO_STAND_GUARD
0, 1, 1, // DO_PRONE // N/A
56, 6, 6, // DO_WALK
205, 4, 4, // DO_FIRE_WEAPON
0, 1, 1, // DO_LIE_DOWN // N/A
8, 6, 6, // DO_CRAWL
0, 1, 1, // DO_GET_UP // N/A
205, 4, 4, // DO_FIRE_PRONE
189, 10,0, // DO_IDLE1
199, 6, 0, // DO_IDLE2
104, 3, 0, // DO_ON_GUARD
107, 7, 0, // DO_FIGHT_READY
114, 2, 0, // DO_PUNCH
116, 6, 0, // DO_KICK
122, 2, 0, // DO_PUNCH_HIT1
124, 4, 0, // DO_PUNCH_HIT2
128, 4, 0, // DO_PUNCH_DEATH
133, 2, 0, // DO_KICK_HIT1
135, 4, 0, // DO_KICK_HIT2
139, 5, 0, // DO_KICK_DEATH
144, 3, 0, // DO_READY_WEAPON
329, 8, 0, // DO_GUN_DEATH
337, 8, 0, // DO_EXPLOSION_DEATH
337, 8, 0, // DO_EXPLOSION2_DEATH
345, 12,0, // DO_GRENADE_DEATH
357, 18,0, // DO_FIRE_DEATH
0, 0, 0, // DO_GESTURE1 // N/A
0, 0, 0, // DO_SALUTE1 // N/A
0, 0, 0, // DO_GESTURE2 // N/A
0, 0, 0, // DO_SALUTE2 // N/A
199, 6, 0, // DO_PULL_GUN
237, 40,0, // DO_PLEAD
277, 6, 0 // DO_PLEAD_DEATH
};
static InfantryTypeClass const C5(
INFANTRY_C5, // Infantry type number.
TXT_C5, // Translate name number for infantry type.
"C5", // INI name for infantry.
99, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
false, // Is a leader type?
false, // Has crawling animation frames?
true, // Is this a civlian?
true, // Always use the given name for the infantry?
true, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
0, // Number of shots it has (default).
&CivilianDos5[0][0], // ptr to DO table
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
5, // Strength of infantry (in damage points).
0, // Sight range.
10, // Cost of infantry (in credits).
99, // Scenario when they first appear.
0,1, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD|
HOUSEF_NEUTRAL, // Who can own this infantry unit.
WEAPON_NONE,WEAPON_NONE,
MPH_SLOW_ISH
);
int CivilianDos6[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
0, 1, 1, // DO_STAND_GUARD
0, 1, 1, // DO_PRONE // N/A
56, 6, 6, // DO_WALK
205, 4, 4, // DO_FIRE_WEAPON
0, 1, 1, // DO_LIE_DOWN // N/A
8, 6, 6, // DO_CRAWL
0, 1, 1, // DO_GET_UP // N/A
205, 4, 4, // DO_FIRE_PRONE
189, 10,0, // DO_IDLE1
199, 6, 0, // DO_IDLE2
104, 3, 0, // DO_ON_GUARD
107, 7, 0, // DO_FIGHT_READY
114, 2, 0, // DO_PUNCH
116, 6, 0, // DO_KICK
122, 2, 0, // DO_PUNCH_HIT1
124, 4, 0, // DO_PUNCH_HIT2
128, 4, 0, // DO_PUNCH_DEATH
133, 2, 0, // DO_KICK_HIT1
135, 4, 0, // DO_KICK_HIT2
139, 5, 0, // DO_KICK_DEATH
144, 3, 0, // DO_READY_WEAPON
329, 8, 0, // DO_GUN_DEATH
337, 8, 0, // DO_EXPLOSION_DEATH
337, 8, 0, // DO_EXPLOSION2_DEATH
345, 12,0, // DO_GRENADE_DEATH
357, 18,0, // DO_FIRE_DEATH
0, 0, 0, // DO_GESTURE1 // N/A
0, 0, 0, // DO_SALUTE1 // N/A
0, 0, 0, // DO_GESTURE2 // N/A
0, 0, 0, // DO_SALUTE2 // N/A
199, 6, 0, // DO_PULL_GUN
237, 40,0, // DO_PLEAD
277, 6, 0 // DO_PLEAD_DEATH
};
static InfantryTypeClass const C6(
INFANTRY_C6, // Infantry type number.
TXT_C6, // Translate name number for infantry type.
"C6", // INI name for infantry.
99, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
false, // Is a leader type?
false, // Has crawling animation frames?
true, // Is this a civlian?
true, // Always use the given name for the infantry?
true, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
0, // Number of shots it has (default).
&CivilianDos6[0][0], // ptr to DO table
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
5, // Strength of infantry (in damage points).
0, // Sight range.
10, // Cost of infantry (in credits).
99, // Scenario when they first appear.
0,1, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD|
HOUSEF_NEUTRAL, // Who can own this infantry unit.
WEAPON_NONE,WEAPON_NONE,
MPH_SLOW_ISH
);
int CivilianDos7[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
0, 1, 1, // DO_STAND_GUARD
0, 1, 1, // DO_PRONE // N/A
56, 6, 6, // DO_WALK
205, 4, 4, // DO_FIRE_WEAPON
0, 1, 1, // DO_LIE_DOWN // N/A
8, 6, 6, // DO_CRAWL
0, 1, 1, // DO_GET_UP // N/A
205, 4, 4, // DO_FIRE_PRONE
189, 10,0, // DO_IDLE1
199, 6, 0, // DO_IDLE2
104, 3, 0, // DO_ON_GUARD
107, 7, 0, // DO_FIGHT_READY
114, 2, 0, // DO_PUNCH
116, 6, 0, // DO_KICK
122, 2, 0, // DO_PUNCH_HIT1
124, 4, 0, // DO_PUNCH_HIT2
128, 4, 0, // DO_PUNCH_DEATH
133, 2, 0, // DO_KICK_HIT1
135, 4, 0, // DO_KICK_HIT2
139, 5, 0, // DO_KICK_DEATH
144, 3, 0, // DO_READY_WEAPON
329, 8, 0, // DO_GUN_DEATH
337, 8, 0, // DO_EXPLOSION_DEATH
337, 8, 0, // DO_EXPLOSION2_DEATH
345, 12,0, // DO_GRENADE_DEATH
357, 18,0, // DO_FIRE_DEATH
0, 0, 0, // DO_GESTURE1 // N/A
0, 0, 0, // DO_SALUTE1 // N/A
0, 0, 0, // DO_GESTURE2 // N/A
0, 0, 0, // DO_SALUTE2 // N/A
199, 6, 0, // DO_PULL_GUN
237, 40,0, // DO_PLEAD
277, 6, 0 // DO_PLEAD_DEATH
};
static InfantryTypeClass const C7(
INFANTRY_C7, // Infantry type number.
TXT_C7, // Translate name number for infantry type.
"C7", // INI name for infantry.
99, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
true, // Is a leader type?
false, // Has crawling animation frames?
true, // Is this a civlian?
true, // Always use the given name for the infantry?
true, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
10, // Number of shots it has (default).
&CivilianDos7[0][0], // ptr to DO table
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
5, // Strength of infantry (in damage points).
0, // Sight range.
10, // Cost of infantry (in credits).
99, // Scenario when they first appear.
0,1, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD|
HOUSEF_NEUTRAL, // Who can own this infantry unit.
WEAPON_PISTOL,WEAPON_NONE,
MPH_SLOW_ISH
);
int CivilianDos8[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
0, 1, 1, // DO_STAND_GUARD
0, 1, 1, // DO_PRONE // N/A
56, 6, 6, // DO_WALK
205, 4, 4, // DO_FIRE_WEAPON
0, 1, 1, // DO_LIE_DOWN // N/A
8, 6, 6, // DO_CRAWL
0, 1, 1, // DO_GET_UP // N/A
205, 4, 4, // DO_FIRE_PRONE
189, 10,0, // DO_IDLE1
199, 6, 0, // DO_IDLE2
104, 3, 0, // DO_ON_GUARD
107, 7, 0, // DO_FIGHT_READY
114, 2, 0, // DO_PUNCH
116, 6, 0, // DO_KICK
122, 2, 0, // DO_PUNCH_HIT1
124, 4, 0, // DO_PUNCH_HIT2
128, 4, 0, // DO_PUNCH_DEATH
133, 2, 0, // DO_KICK_HIT1
135, 4, 0, // DO_KICK_HIT2
139, 5, 0, // DO_KICK_DEATH
144, 3, 0, // DO_READY_WEAPON
329, 8, 0, // DO_GUN_DEATH
337, 8, 0, // DO_EXPLOSION_DEATH
337, 8, 0, // DO_EXPLOSION2_DEATH
345, 12,0, // DO_GRENADE_DEATH
357, 18,0, // DO_FIRE_DEATH
0, 0, 0, // DO_GESTURE1 // N/A
0, 0, 0, // DO_SALUTE1 // N/A
0, 0, 0, // DO_GESTURE2 // N/A
0, 0, 0, // DO_SALUTE2 // N/A
199, 6, 0, // DO_PULL_GUN
237, 40,0, // DO_PLEAD
277, 6, 0 // DO_PLEAD_DEATH
};
static InfantryTypeClass const C8(
INFANTRY_C8, // Infantry type number.
TXT_C8, // Translate name number for infantry type.
"C8", // INI name for infantry.
99, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
false, // Is a leader type?
false, // Has crawling animation frames?
true, // Is this a civlian?
true, // Always use the given name for the infantry?
true, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
0, // Number of shots it has (default).
&CivilianDos8[0][0], // ptr to DO table
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
5, // Strength of infantry (in damage points).
0, // Sight range.
10, // Cost of infantry (in credits).
99, // Scenario when they first appear.
0,1, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD|
HOUSEF_NEUTRAL, // Who can own this infantry unit.
WEAPON_NONE,WEAPON_NONE,
MPH_SLOW_ISH
);
int CivilianDos9[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
0, 1, 1, // DO_STAND_GUARD
0, 1, 1, // DO_PRONE // N/A
56, 6, 6, // DO_WALK
205, 4, 4, // DO_FIRE_WEAPON
0, 1, 1, // DO_LIE_DOWN // N/A
8, 6, 6, // DO_CRAWL
0, 1, 1, // DO_GET_UP // N/A
205, 4, 4, // DO_FIRE_PRONE
189, 10,0, // DO_IDLE1
199, 6, 0, // DO_IDLE2
104, 3, 0, // DO_ON_GUARD
107, 7, 0, // DO_FIGHT_READY
114, 2, 0, // DO_PUNCH
116, 6, 0, // DO_KICK
122, 2, 0, // DO_PUNCH_HIT1
124, 4, 0, // DO_PUNCH_HIT2
128, 4, 0, // DO_PUNCH_DEATH
133, 2, 0, // DO_KICK_HIT1
135, 4, 0, // DO_KICK_HIT2
139, 5, 0, // DO_KICK_DEATH
144, 3, 0, // DO_READY_WEAPON
329, 8, 0, // DO_GUN_DEATH
337, 8, 0, // DO_EXPLOSION_DEATH
337, 8, 0, // DO_EXPLOSION2_DEATH
345, 12,0, // DO_GRENADE_DEATH
357, 18,0, // DO_FIRE_DEATH
0, 0, 0, // DO_GESTURE1 // N/A
0, 0, 0, // DO_SALUTE1 // N/A
0, 0, 0, // DO_GESTURE2 // N/A
0, 0, 0, // DO_SALUTE2 // N/A
199, 6, 0, // DO_PULL_GUN
237, 40,0, // DO_PLEAD
277, 6, 0 // DO_PLEAD_DEATH
};
static InfantryTypeClass const C9(
INFANTRY_C9, // Infantry type number.
TXT_C9, // Translate name number for infantry type.
"C9", // INI name for infantry.
99, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
false, // Is a leader type?
false, // Has crawling animation frames?
true, // Is this a civlian?
true, // Always use the given name for the infantry?
true, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
0, // Number of shots it has (default).
&CivilianDos9[0][0], // ptr to DO table
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
5, // Strength of infantry (in damage points).
0, // Sight range.
10, // Cost of infantry (in credits).
99, // Scenario when they first appear.
0,1, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD|
HOUSEF_NEUTRAL, // Who can own this infantry unit.
WEAPON_NONE,WEAPON_NONE,
MPH_SLOW_ISH
);
int NikoombaDos[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
0, 1, 1, // DO_STAND_GUARD
0, 1, 1, // DO_PRONE // N/A
56, 6, 6, // DO_WALK
205, 4, 4, // DO_FIRE_WEAPON
0, 1, 1, // DO_LIE_DOWN // N/A
8, 6, 6, // DO_CRAWL
0, 1, 1, // DO_GET_UP // N/A
205, 4, 4, // DO_FIRE_PRONE
189, 10,0, // DO_IDLE1
199, 6, 0, // DO_IDLE2
104, 3, 0, // DO_ON_GUARD
107, 7, 0, // DO_FIGHT_READY
114, 2, 0, // DO_PUNCH
116, 6, 0, // DO_KICK
122, 2, 0, // DO_PUNCH_HIT1
124, 4, 0, // DO_PUNCH_HIT2
128, 4, 0, // DO_PUNCH_DEATH
133, 2, 0, // DO_KICK_HIT1
135, 4, 0, // DO_KICK_HIT2
139, 5, 0, // DO_KICK_DEATH
144, 3, 0, // DO_READY_WEAPON
329, 8, 0, // DO_GUN_DEATH
337, 8, 0, // DO_EXPLOSION_DEATH
337, 8, 0, // DO_EXPLOSION2_DEATH
345, 12,0, // DO_GRENADE_DEATH
357, 18,0, // DO_FIRE_DEATH
0, 0, 0, // DO_GESTURE1 // N/A
0, 0, 0, // DO_SALUTE1 // N/A
0, 0, 0, // DO_GESTURE2 // N/A
0, 0, 0, // DO_SALUTE2 // N/A
199, 6, 0, // DO_PULL_GUN
237, 40,0, // DO_PLEAD
277, 6, 0, // DO_PLEAD_DEATH
};
// Nikoomba
static InfantryTypeClass const C10(
INFANTRY_C10, // Infantry type number.
TXT_C10, // Translate name number for infantry type.
"C10", // INI name for infantry.
99, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
false, // Is a leader type?
false, // Has crawling animation frames?
true, // Is this a civlian?
true, // Always use the given name for the infantry?
true, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
0, // Number of shots it has (default).
&NikoombaDos[0][0], // ptr to DO table
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
50, // Strength of infantry (in damage points).
0, // Sight range.
10, // Cost of infantry (in credits).
99, // Scenario when they first appear.
0,1, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD|
HOUSEF_NEUTRAL, // Who can own this infantry unit.
WEAPON_NONE,WEAPON_NONE,
MPH_SLOW_ISH
);
int MoebiusDos[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
0, 1, 1, // DO_STAND_GUARD
0, 1, 1, // DO_PRONE // N/A
56, 6, 6, // DO_WALK
205, 4, 4, // DO_FIRE_WEAPON
0, 1, 1, // DO_LIE_DOWN // N/A
8, 6, 6, // DO_CRAWL
0, 1, 1, // DO_GET_UP // N/A
0, 0, 0, // DO_FIRE_PRONE
104, 16,0, // DO_IDLE1
120, 20,0, // DO_IDLE2
0, 0, 0, // DO_ON_GUARD
0, 0, 0, // DO_FIGHT_READY
0, 0, 0, // DO_PUNCH
0, 0, 0, // DO_KICK
0, 0, 0, // DO_PUNCH_HIT1
0, 0, 0, // DO_PUNCH_HIT2
0, 0, 0, // DO_PUNCH_DEATH
0, 0, 0, // DO_KICK_HIT1
0, 0, 0, // DO_KICK_HIT2
0, 0, 0, // DO_KICK_DEATH
0, 0, 0, // DO_READY_WEAPON
212, 8, 0, // DO_GUN_DEATH
220, 8, 0, // DO_EXPLOSION_DEATH
228, 12,0, // DO_EXPLOSION2_DEATH
228, 12,0, // DO_GRENADE_DEATH
240, 18,0, // DO_FIRE_DEATH
0, 0, 0, // DO_GESTURE1 // N/A
0, 0, 0, // DO_SALUTE1 // N/A
0, 0, 0, // DO_GESTURE2 // N/A
0, 0, 0, // DO_SALUTE2 // N/A
0, 0, 0, // DO_PULL_GUN
120, 31,0, // DO_PLEAD
151, 14,0 // DO_PLEAD_DEATH
};
static InfantryTypeClass const Moebius(
INFANTRY_MOEBIUS, // Infantry type number.
TXT_MOEBIUS, // Translate name number for infantry type.
"MOEBIUS", // INI name for infantry.
99, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
false, // Is a leader type?
false, // Has crawling animation frames?
true, // Is this a civlian?
true, // Always use the given name for the infantry?
true, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
0, // Number of shots it has (default).
&MoebiusDos[0][0], // ptr to DO table
0, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
50, // Strength of infantry (in damage points).
0, // Sight range.
10, // Cost of infantry (in credits).
99, // Scenario when they first appear.
0,10, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_BAD|
HOUSEF_NEUTRAL, // Who can own this infantry unit.
WEAPON_NONE,WEAPON_NONE,
MPH_SLOW_ISH
);
int DelphiDos[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
0, 1, 1, // DO_STAND_GUARD
0, 1, 1, // DO_PRONE // N/A
56, 6, 6, // DO_WALK
205, 4, 4, // DO_FIRE_WEAPON
0, 1, 1, // DO_LIE_DOWN // N/A
8, 6, 6, // DO_CRAWL
0, 1, 1, // DO_GET_UP // N/A
205, 4, 4, // DO_FIRE_PRONE
189, 10,0, // DO_IDLE1
199, 6, 0, // DO_IDLE2
104, 3, 0, // DO_ON_GUARD
107, 7, 0, // DO_FIGHT_READY
114, 2, 0, // DO_PUNCH
116, 6, 0, // DO_KICK
122, 2, 0, // DO_PUNCH_HIT1
124, 4, 0, // DO_PUNCH_HIT2
128, 4, 0, // DO_PUNCH_DEATH
133, 2, 0, // DO_KICK_HIT1
135, 4, 0, // DO_KICK_HIT2
139, 5, 0, // DO_KICK_DEATH
144, 3, 0, // DO_READY_WEAPON
329, 8, 0, // DO_GUN_DEATH
337, 8, 0, // DO_EXPLOSION_DEATH
337, 8, 0, // DO_EXPLOSION2_DEATH
345, 12,0, // DO_GRENADE_DEATH
357, 18,0, // DO_FIRE_DEATH
0, 0, 0, // DO_GESTURE1 // N/A
0, 0, 0, // DO_SALUTE1 // N/A
0, 0, 0, // DO_GESTURE2 // N/A
0, 0, 0, // DO_SALUTE2 // N/A
199, 6, 0, // DO_PULL_GUN
237, 40,0, // DO_PLEAD
277, 6, 0, // DO_PLEAD_DEATH
};
static InfantryTypeClass const Delphi(
INFANTRY_DELPHI, // Infantry type number.
TXT_DELPHI, // Translate name number for infantry type.
"DELPHI", // INI name for infantry.
99, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
false, // Is a leader type?
false, // Has crawling animation frames?
true, // Is this a civlian?
true, // Always use the given name for the infantry?
true, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
10, // Number of shots it has (default).
&DelphiDos[0][0], // ptr to DO table
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
25, // Strength of infantry (in damage points).
0, // Sight range.
10, // Cost of infantry (in credits).
99, // Scenario when they first appear.
0,0, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_NEUTRAL, // Who can own this infantry unit.
WEAPON_PISTOL,WEAPON_NONE,
MPH_SLOW_ISH
);
int DrChanDos[DO_COUNT][3]={
0, 1, 1, // DO_STAND_READY
0, 1, 1, // DO_STAND_GUARD
0, 1, 1, // DO_PRONE // N/A
56, 6, 6, // DO_WALK
205, 4, 4, // DO_FIRE_WEAPON
0, 1, 1, // DO_LIE_DOWN // N/A
8, 6, 6, // DO_CRAWL
0, 1, 1, // DO_GET_UP // N/A
0, 0, 0, // DO_FIRE_PRONE
104, 16,0, // DO_IDLE1
120, 20,0, // DO_IDLE2
0, 0, 0, // DO_ON_GUARD
0, 0, 0, // DO_FIGHT_READY
0, 0, 0, // DO_PUNCH
0, 0, 0, // DO_KICK
0, 0, 0, // DO_PUNCH_HIT1
0, 0, 0, // DO_PUNCH_HIT2
0, 0, 0, // DO_PUNCH_DEATH
0, 0, 0, // DO_KICK_HIT1
0, 0, 0, // DO_KICK_HIT2
0, 0, 0, // DO_KICK_DEATH
0, 0, 0, // DO_READY_WEAPON
212, 8, 0, // DO_GUN_DEATH
220, 8, 0, // DO_EXPLOSION_DEATH
228, 12,0, // DO_EXPLOSION2_DEATH
228, 12,0, // DO_GRENADE_DEATH
240, 18,0, // DO_FIRE_DEATH
0, 0, 0, // DO_GESTURE1 // N/A
0, 0, 0, // DO_SALUTE1 // N/A
0, 0, 0, // DO_GESTURE2 // N/A
0, 0, 0, // DO_SALUTE2 // N/A
0, 0, 0, // DO_PULL_GUN
120, 31,0, // DO_PLEAD
151, 14,0 // DO_PLEAD_DEATH
};
static InfantryTypeClass const DrChan(
INFANTRY_CHAN, // Infantry type number.
TXT_CHAN, // Translate name number for infantry type.
"CHAN", // INI name for infantry.
99, // Build level.
STRUCTF_NONE, // Building prerequisite.
false, // Is this a female type?
false, // Is a leader type?
false, // Has crawling animation frames?
true, // Is this a civlian?
true, // Always use the given name for the infantry?
true, // Is this a "fraidycat" run-away type infantry?
false, // Can this infantry type capture a building?
false, // Theater specific graphic image?
10, // Number of shots it has (default).
&DrChanDos[0][0], // ptr to DO table
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
25, // Strength of infantry (in damage points).
0, // Sight range.
10, // Cost of infantry (in credits).
99, // Scenario when they first appear.
0,1, // Risk/Reward of this infantry unit.
HOUSEF_MULTI1|
HOUSEF_MULTI2|
HOUSEF_MULTI3|
HOUSEF_MULTI4|
HOUSEF_MULTI5|
HOUSEF_MULTI6|
HOUSEF_JP|
HOUSEF_GOOD|
HOUSEF_NEUTRAL, // Who can own this infantry unit.
WEAPON_NONE,WEAPON_NONE,
MPH_SLOW_ISH
);
/*
** This is the array of pointers to the static data associated with each
** infantry type.
*/
InfantryTypeClass const * const InfantryTypeClass::Pointers[INFANTRY_COUNT] = {
&E1,
&E2,
&E3,
&E4,
&E5,
// &E6,
&E7,
&Commando,
&C1,
&C2,
&C3,
&C4,
&C5,
&C6,
&C7,
&C8,
&C9,
&C10,
&Moebius,
&Delphi,
&DrChan
};
/***********************************************************************************************
* InfantryTypeClass::InfantryTypeClass -- Constructor for infantry type class objects. *
* *
* This routine will construct the infantry type objects. It is use to create the static *
* infantry types that are used to give each of the infantry objects their characteristics. *
* *
* INPUT: see below... *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 09/24/1994 JLB : Created. *
*=============================================================================================*/
InfantryTypeClass::InfantryTypeClass (
InfantryType type, int name, char const *ininame,
unsigned char level, long pre,
bool is_female,
bool is_leader,
bool is_crawling,
bool is_civilian,
bool is_nominal,
bool is_fraidycat,
bool is_capture,
bool is_theater,
int ammo,
int *do_table,
int firelaunch, int pronelaunch,
unsigned short strength, int sightrange,
int cost, int scenario, int risk, int reward, int ownable,
WeaponType primary, WeaponType secondary,
MPHType maxspeed)
: TechnoTypeClass(name, ininame, level, pre,
is_leader, true, is_nominal, false, false, true, true, true, true, false, false,
is_theater, false, false, false, true, false,
ammo, strength, maxspeed, sightrange, cost,
scenario, risk, reward, ownable,
primary, secondary,
ARMOR_NONE)
{
IsFemale = is_female;
IsCrawling = is_crawling;
IsCapture = is_capture;
IsFraidyCat = is_fraidycat;
IsCivilian = is_civilian;
Command & Conquer Remastered post-launch patch Improvements to harvester resource finding logic. Don't allow the Advanced Comm Center to be capturable in skirmish or multiplayer. Increased failed pathfinding fudge factor. Buildings accept the Guard command if they can attack. Don't allow force capturing of ally structures. Fixes for laser Orcas in S3cr3t M1ss10n. Properly restore them after save. Reset Orcas after loads. Fixed flag animation rendering in CTF. Potentially fix a crash if aircraft are destroyed outside the map bounds. Fixed legacy Obelisk line rendering. Fix out-of-bounds crash in TD; issue was already fixed in RA. Disable capture flag on Commandos. Drop the flag when entering the limbo state. Fixed end game race condition, winning team ID is always sent before individual player win/lose messages. Fixed Chan spawn on SCB10EA. Don't show enter cursor for enemy units on refineries and repair pads. Changing right-click support for first put building on hold, and then subsequenct right-clicks to decrement that queue count for 1x or 5x; Then, 1x or 5x Left click will resume from hold. Don't debug reveal legacy rendering when a player is defeated. Fixed crash when loading saves of custom campaign maps. Reset harvester archived target when given a direct harvest order. Prevent NOD cargo planes from being force attacked. Fixed unit selection on load. Migrated queued repair pad functionality from RA to TD. Randomly animate infantry in area guard mode. Fixed crash accessing inactive objects. Added some walls in SCG08EB to prevent civilians from killing themselves. TD + RA: Audio: Overiding "Our base is under attack" cooldown timing from legacy from 2 minutes to 30 seconds, so it will be heard 4x as often. Fixed adjacent cell out-of-bounds crash issues. Kill player on disconnect Fixed and improved build time calculations to be consistent between TD and RA. Don't show health bars for cloaked Stealth Tanks in the legacy renderer. Fix selection of individual control groups after mixed selection. More adjustments to SCG08EB; switch C7 to C5, and add civilian AI to avoid Tiberium. Extra safety checks for units that have no weapons and aircraft that can't hunt. Fix loading of multiple infantry onto an APC. Additional safety checks for invalid coordinates. Prevent units from being instantly repaired. Fix map passability. Fail Allied mission 5B if the spy re-boards the starting transport (matches 5A and 5C behavior). Fixed multiplayer formation move causing units to move at light speed. Ignore movement destination checks if a unit is part of a mission-driven team. Fix buffer overrun crash. Ignore mines when determining win conditions. Fixed river passability in Blue Lakes.
2020-06-23 04:43:21 +12:00
IsAvoidingTiberium = false;
Type = type;
FireLaunch = firelaunch;
ProneLaunch = pronelaunch;
/*
** Set the animation sequence custom values.
*/
for ( int i=0 ; i<DO_COUNT ; i++ ){
DoControls[i].Frame = *do_table++;
DoControls[i].Count = *do_table++;
DoControls[i].Jump = *do_table++;
}
#ifdef cuts //ST - 10/3/95 10:09AM
DoControls[DO_STAND_READY].Frame = dostandready;
DoControls[DO_STAND_READY].Count = dostandreadyframe;
DoControls[DO_STAND_READY].Jump = dostandreadyjump;
DoControls[DO_STAND_GUARD].Frame = dostandguard;
DoControls[DO_STAND_GUARD].Count = dostandguardframe;
DoControls[DO_STAND_GUARD].Jump = dostandguardjump;
DoControls[DO_PRONE].Frame = doprone;
DoControls[DO_PRONE].Count = doproneframe;
DoControls[DO_PRONE].Jump = dopronejump;
DoControls[DO_WALK].Frame = dowalk;
DoControls[DO_WALK].Count = dowalkframe;
DoControls[DO_WALK].Jump = dowalkjump;
DoControls[DO_FIRE_WEAPON].Frame = dofireweapon;
DoControls[DO_FIRE_WEAPON].Count = dofireweaponframe;
DoControls[DO_FIRE_WEAPON].Jump = dofireweaponjump;
DoControls[DO_LIE_DOWN].Frame = doliedown;
DoControls[DO_LIE_DOWN].Count = doliedownframe;
DoControls[DO_LIE_DOWN].Jump = doliedownjump;
DoControls[DO_CRAWL].Frame = docrawl;
DoControls[DO_CRAWL].Count = docrawlframe;
DoControls[DO_CRAWL].Jump = docrawljump;
DoControls[DO_GET_UP].Frame = dogetup;
DoControls[DO_GET_UP].Count = dogetupframe;
DoControls[DO_GET_UP].Jump = dogetupjump;
DoControls[DO_FIRE_PRONE].Frame = dofireprone;
DoControls[DO_FIRE_PRONE].Count = dofireproneframe;
DoControls[DO_FIRE_PRONE].Jump = dofirepronejump;
DoControls[DO_IDLE1].Frame = doidle1;
DoControls[DO_IDLE1].Count = doidle1frame;
DoControls[DO_IDLE1].Jump = doidle1jump;
DoControls[DO_IDLE2].Frame = doidle2;
DoControls[DO_IDLE2].Count = doidle2frame;
DoControls[DO_IDLE2].Jump = doidle2jump;
DoControls[DO_ON_GUARD].Frame = doonguard;
DoControls[DO_ON_GUARD].Count = doonguardframe;
DoControls[DO_ON_GUARD].Jump = doonguardjump;
DoControls[DO_FIGHT_READY].Frame = dofightready;
DoControls[DO_FIGHT_READY].Count = dofightreadyframe;
DoControls[DO_FIGHT_READY].Jump = dofightreadyjump;
DoControls[DO_PUNCH].Frame = dopunch;
DoControls[DO_PUNCH].Count = dopunchframe;
DoControls[DO_PUNCH].Jump = dopunchjump;
DoControls[DO_KICK].Frame = dokick;
DoControls[DO_KICK].Count = dokickframe;
DoControls[DO_KICK].Jump = dokickjump;
DoControls[DO_PUNCH_HIT1].Frame = dopunchhit1;
DoControls[DO_PUNCH_HIT1].Count = dopunchhit1frame;
DoControls[DO_PUNCH_HIT1].Jump = dopunchhit1jump;
DoControls[DO_PUNCH_HIT2].Frame = dopunchhit2;
DoControls[DO_PUNCH_HIT2].Count = dopunchhit2frame;
DoControls[DO_PUNCH_HIT2].Jump = dopunchhit2jump;
DoControls[DO_PUNCH_DEATH].Frame = dopunchdeath;
DoControls[DO_PUNCH_DEATH].Count = dopunchdeathframe;
DoControls[DO_PUNCH_DEATH].Jump = dopunchdeathjump;
DoControls[DO_KICK_HIT1].Frame = dokickhit1;
DoControls[DO_KICK_HIT1].Count = dokickhit1frame;
DoControls[DO_KICK_HIT1].Jump = dokickhit1jump;
DoControls[DO_KICK_HIT2].Frame = dokickhit2;
DoControls[DO_KICK_HIT2].Count = dokickhit2frame;
DoControls[DO_KICK_HIT2].Jump = dokickhit2jump;
DoControls[DO_KICK_DEATH].Frame = dokickdeath;
DoControls[DO_KICK_DEATH].Count = dokickdeathframe;
DoControls[DO_KICK_DEATH].Jump = dokickdeathjump;
DoControls[DO_READY_WEAPON].Frame = doreadyweapon;
DoControls[DO_READY_WEAPON].Count = doreadyweaponframe;
DoControls[DO_READY_WEAPON].Jump = doreadyweaponjump;
DoControls[DO_GUN_DEATH].Frame = dogundeath;
DoControls[DO_GUN_DEATH].Count = dogundeathframe;
DoControls[DO_GUN_DEATH].Jump = dogundeathjump;
DoControls[DO_EXPLOSION_DEATH].Frame = doexplosiondeath;
DoControls[DO_EXPLOSION_DEATH].Count = doexplosiondeathframe;
DoControls[DO_EXPLOSION_DEATH].Jump = doexplosiondeathjump;
DoControls[DO_EXPLOSION2_DEATH].Frame = doexplosion2death;
DoControls[DO_EXPLOSION2_DEATH].Count = doexplosion2deathframe;
DoControls[DO_EXPLOSION2_DEATH].Jump = doexplosion2deathjump;
DoControls[DO_GRENADE_DEATH].Frame = dogrenadedeath;
DoControls[DO_GRENADE_DEATH].Count = dogrenadedeathframe;
DoControls[DO_GRENADE_DEATH].Jump = dogrenadedeathjump;
DoControls[DO_FIRE_DEATH].Frame = dofiredeath;
DoControls[DO_FIRE_DEATH].Count = dofiredeathframe;
DoControls[DO_FIRE_DEATH].Jump = dofiredeathjump;
DoControls[DO_GESTURE1].Frame = dogesture1;
DoControls[DO_GESTURE1].Count = dogesture1frame;
DoControls[DO_GESTURE1].Jump = dogesture1jump;
DoControls[DO_SALUTE1].Frame = dosalute1;
DoControls[DO_SALUTE1].Count = dosalute1frame;
DoControls[DO_SALUTE1].Jump = dosalute1jump;
DoControls[DO_GESTURE2].Frame = dogesture2;
DoControls[DO_GESTURE2].Count = dogesture2frame;
DoControls[DO_GESTURE2].Jump = dogesture2jump;
DoControls[DO_SALUTE2].Frame = dosalute2;
DoControls[DO_SALUTE2].Count = dosalute2frame;
DoControls[DO_SALUTE2].Jump = dosalute2jump;
DoControls[DO_PULL_GUN].Frame = dopullgun;
DoControls[DO_PULL_GUN].Count = dopullgunframe;
DoControls[DO_PULL_GUN].Jump = dopullgunjump;
DoControls[DO_PLEAD].Frame = doplead;
DoControls[DO_PLEAD].Count = dopleadframe;
DoControls[DO_PLEAD].Jump = dopleadjump;
DoControls[DO_PLEAD_DEATH].Frame = dopleaddeath;
DoControls[DO_PLEAD_DEATH].Count = dopleaddeathframe;
DoControls[DO_PLEAD_DEATH].Jump = dopleaddeathjump;
#endif //cuts
}
/***********************************************************************************************
* InfantryTypeClass::Create_One_Of -- Creates an infantry object. *
* *
* This creates an infantry object, but does not attempt to place it on the map. It is *
* typically used by the scenario editor when an object is needed, but the location has *
* not yet been specified for where it should appear on the map. *
* *
* INPUT: house -- The owner of the infantry object. *
* *
* OUTPUT: Returns with a pointer to the created infantry object. If an object could not be *
* created, then NULL is returned. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 09/24/1994 JLB : Created. *
*=============================================================================================*/
ObjectClass * InfantryTypeClass::Create_One_Of(HouseClass * house) const
{
return(new InfantryClass(Type, house->Class->House));
}
/***********************************************************************************************
* InfantryTypeClass::Create_And_Place -- Creates and places infantry object onto the map. *
* *
* This routine is used by the scenario editor to create and place an infantry object onto *
* the map at the location specified. *
* *
* INPUT: cell -- The cell location to place the infantry object at. *
* *
* house -- The owner of the infantry object. *
* *
* OUTPUT: bool; Was the infantry object successfully created and placed at the location *
* specified? *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 09/24/1994 JLB : Created. *
*=============================================================================================*/
bool InfantryTypeClass::Create_And_Place(CELL cell, HousesType house) const
{
InfantryClass * i = new InfantryClass(Type, house);
if (i) {
COORDINATE coord = Map[cell].Closest_Free_Spot(Cell_Coord(cell));
if (coord) {
return(i->Unlimbo(coord, DIR_E));
} else {
delete i;
}
}
return(false);
}
/***********************************************************************************************
* InfantryTypeClass::Occupy_List -- Returns with default infantry occupation list. *
* *
* This routine will return with a cell offset occupation list for a generic infantry *
* object. This is typically just a single cell since infantry are never bigger than one *
* cell and this routine presumes the infantry is located in the center of the cell. *
* *
* INPUT: placement -- Is this for placement legality checking only? The normal condition *
* is for marking occupation flags. *
* *
* OUTPUT: Returns with a cell offset list for the infantry object as if it were located *
* in the center of a cell. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 09/24/1994 JLB : Created. *
*=============================================================================================*/
short const * InfantryTypeClass::Occupy_List(bool) const
{
static short const _list[] = {0, REFRESH_EOL};
return(&_list[0]);
}
#ifdef SCENARIO_EDITOR
/***********************************************************************************************
* InfantryTypeClass::Display -- Displays a generic infantry object. *
* *
* This routine is used by the scenario editor to display a generic representation of the *
* infantry object for the scenario editor. It simply draws a single (nice profile) view *
* of the infantry type. *
* *
* INPUT: x,y -- The display coordinates to render the infantry object at. *
* *
* window -- The window that the display coordinates are relative to. *
* *
* house -- The house colors to use when rendering this infantry object. *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 09/24/1994 JLB : Created. *
*=============================================================================================*/
void InfantryTypeClass::Display(int x, int y, WindowNumberType window, HousesType house) const
{
if (house != HOUSE_NONE) {
int shape = 0;
void const * ptr = Get_Cameo_Data();
if (!ptr) {
ptr = Get_Image_Data();
shape = 2;
}
CC_Draw_Shape(ptr, shape, x, y, window, SHAPE_NORMAL|SHAPE_CENTER|SHAPE_WIN_REL);
}
}
/***********************************************************************************************
* InfantryTypeClass::Prep_For_Add -- Prepares the scenario editor for adding of infantry object.*
* *
* This routine will prepare the scenario editor so that the infantry objects appear on *
* the object list. *
* *
* INPUT: none *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 09/24/1994 JLB : Created. *
*=============================================================================================*/
void InfantryTypeClass::Prep_For_Add(void)
{
for (InfantryType index = INFANTRY_FIRST; index < INFANTRY_COUNT; index++) {
Map.Add_To_List(&As_Reference(index));
}
}
#endif
/***********************************************************************************************
* InfantryTypeClass::From_Name -- Converts an ASCII name into an infantry type number. *
* *
* This routine is used to convert the infantry ASCII name as specified into an infantry *
* type number. This is called from the INI reader routine in the process if creating the *
* infantry objects needed for the scenario. *
* *
* INPUT: name -- The ASCII name to convert into an infantry type number. *
* *
* OUTPUT: Returns with the infantry type number that corresponds to the infantry ASCII name *
* specified. If no match could be found, then INFANTRY_NONE is returned. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 09/24/1994 JLB : Created. *
*=============================================================================================*/
InfantryType InfantryTypeClass::From_Name(char const *name)
{
if (name) {
for (InfantryType classid = INFANTRY_FIRST; classid < INFANTRY_COUNT; classid++) {
if (stricmp(Pointers[classid]->IniName, name) == 0) {
return(classid);
}
}
}
return(INFANTRY_NONE);
}
/***********************************************************************************************
* InfantryTypeClass::One_Time -- Performs any one time processing for infantry system. *
* *
* This routine will perform one time processing for the infantry type system. This is *
* generally restricted to loading of the infantry shape data. *
* *
* INPUT: none *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 09/24/1994 JLB : Created. *
*=============================================================================================*/
void InfantryTypeClass::One_Time(void)
{
InfantryType index;
for (index = INFANTRY_FIRST; index < INFANTRY_COUNT; index++) {
char fullname[_MAX_FNAME+_MAX_EXT];
InfantryTypeClass const *uclass;
CCFileClass file;
uclass = &As_Reference(index);
/*
** Generic shape for all houses load method.
*/
_makepath(fullname, NULL, NULL, uclass->IniName, ".SHP");
((void const *&)uclass->ImageData) = MixFileClass::Retrieve(fullname);
/*
** The small build image icon sized shapes are always generic.
*/
char buffer[_MAX_FNAME];
if ( Get_Resolution_Factor() ) {
sprintf(buffer, "%.4sICNH", uclass->IniName);
} else {
sprintf(buffer, "%.4sICON", uclass->IniName);
}
_makepath(fullname, NULL, NULL, buffer, ".SHP");
((void const *&)uclass->CameoData) = MixFileClass::Retrieve(fullname);
}
}
/***********************************************************************************************
* ITC::Init -- load up terrain set dependant sidebar icons *
* *
* *
* *
* INPUT: theater type *
* *
* OUTPUT: Nothing *
* *
* WARNINGS: None *
* *
* HISTORY: *
* 4/25/96 0:33AM ST : Created *
*=============================================================================================*/
void InfantryTypeClass::Init(TheaterType theater)
{
if ( Get_Resolution_Factor() ) {
if (theater != LastTheater){
InfantryType index;
char buffer[_MAX_FNAME];
char fullname[_MAX_FNAME+_MAX_EXT];
void const * cameo_ptr;
for (index = INFANTRY_FIRST; index < INFANTRY_COUNT; index++) {
InfantryTypeClass const *uclass;
CCFileClass file;
uclass = &As_Reference(index);
((void const *&)uclass->CameoData) = NULL;
sprintf(buffer, "%.4sICNH", uclass->IniName);
_makepath (fullname, NULL, NULL, buffer, Theaters[theater].Suffix);
cameo_ptr = MixFileClass::Retrieve(fullname);
if (cameo_ptr){
((void const *&)uclass->CameoData) = cameo_ptr;
}
}
}
}
}
/***********************************************************************************************
* InfantryTypeClass::Who_Can_Build_Me -- Determines what can build the infantry object. *
* *
* Use this routine to determine what building can produce the infantry object. This is *
* typically used to maintain the construction list sidebar. *
* *
* INPUT: intheory -- If no regard is to be given to whether the construction building is *
* currently busy, then this flag should be true. In such a case, only *
* the existance of the building is sufficient to achieve success. *
* *
* legal -- Should building prerequisite legality checks be performed as well? *
* For building placements, this is usually false. For sidebar button *
* adding, this is usually true. *
* *
* house -- The house of the infantry to be produced. Only construction buildings *
* of the same house are considered. *
* *
* OUTPUT: Returns with a pointer to the object (building) that can produce the infantry *
* type. If there are no available buildings then the return value is NULL. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 11/29/1994 JLB : Created. *
*=============================================================================================*/
BuildingClass * InfantryTypeClass::Who_Can_Build_Me(bool intheory, bool legal, HousesType house) const
{
BuildingClass * anybuilding = NULL;
for (int index = 0; index < Buildings.Count(); index++) {
BuildingClass * building = Buildings.Ptr(index);
if (building &&
!building->IsInLimbo &&
building->House->Class->House == house &&
building->Mission != MISSION_DECONSTRUCTION &&
building->Class->ToBuild == RTTI_INFANTRYTYPE &&
((1L << building->ActLike) & Ownable) &&
(!legal || building->House->Can_Build(Type, building->ActLike)) &&
(intheory || !building->In_Radio_Contact())) {
anybuilding = building;
if (building->IsLeader) return(building);
}
}
return(anybuilding);
}
/***********************************************************************************************
* InfantryTypeClass::Full_Name -- Fetches the full name text number. *
* *
* This routine will fetch the full name text number for this infantry type. It examines *
* the special custom name flag to determine whether the custom name or the generic name *
* is to be used. *
* *
* INPUT: none *
* *
* OUTPUT: Returns with text number for the name to give this infantry type object. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 06/29/1995 JLB : Created. *
*=============================================================================================*/
int InfantryTypeClass::Full_Name(void) const
{
if (Debug_Map || !IsNominal || Special.IsNamed || Type == INFANTRY_C10 || Type == INFANTRY_DELPHI || Type == INFANTRY_MOEBIUS) {
return(TechnoTypeClass::Full_Name());
}
return(TXT_CIVILIAN);
}