CnC_Remastered_Collection

Command and Conquer: Red Alert
Log | Files | Refs | README | LICENSE

IDATA.CPP (67799B)


      1 //
      2 // Copyright 2020 Electronic Arts Inc.
      3 //
      4 // TiberianDawn.DLL and RedAlert.dll and corresponding source code is free 
      5 // software: you can redistribute it and/or modify it under the terms of 
      6 // the GNU General Public License as published by the Free Software Foundation, 
      7 // either version 3 of the License, or (at your option) any later version.
      8 
      9 // TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed 
     10 // in the hope that it will be useful, but with permitted additional restrictions 
     11 // under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT 
     12 // distributed with this program. You should have received a copy of the 
     13 // GNU General Public License along with permitted additional restrictions 
     14 // with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
     15 
     16 /* $Header: /CounterStrike/IDATA.CPP 3     3/16/97 10:16p Joe_b $ */
     17 /***********************************************************************************************
     18  ***              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               ***
     19  ***********************************************************************************************
     20  *                                                                                             *
     21  *                 Project Name : Command & Conquer                                            *
     22  *                                                                                             *
     23  *                    File Name : IDATA.CPP                                                    *
     24  *                                                                                             *
     25  *                   Programmer : Joe L. Bostic                                                *
     26  *                                                                                             *
     27  *                   Start Date : August 15, 1994                                              *
     28  *                                                                                             *
     29  *                  Last Update : July 19, 1996 [JLB]                                          *
     30  *                                                                                             *
     31  *---------------------------------------------------------------------------------------------*
     32  * Functions:                                                                                  *
     33  *   InfantryTypeClass::As_Reference -- Fetches a reference to the infantry type specified.    *
     34  *   InfantryTypeClass::Create_And_Place -- Creates and places infantry object onto the map.   *
     35  *   InfantryTypeClass::Create_One_Of -- Creates an infantry object.                           *
     36  *   InfantryTypeClass::Display -- Displays a generic infantry object.                         *
     37  *   InfantryTypeClass::From_Name -- Converts an ASCII name into an infantry type number.      *
     38  *   InfantryTypeClass::Full_Name -- Fetches the full name text number.                        *
     39  *   InfantryTypeClass::Get_Cameo_Data -- Fetches the small cameo shape for sidebar strip.     *
     40  *   InfantryTypeClass::InfantryTypeClass -- Constructor for infantry type class objects.      *
     41  *   InfantryTypeClass::Init_Heap -- Initialize the infantry type class heap.                  *
     42  *   InfantryTypeClass::Occupy_List -- Returns with default infantry occupation list.          *
     43  *   InfantryTypeClass::One_Time -- Performs any one time processing for infantry system.      *
     44  *   InfantryTypeClass::Prep_For_Add -- Prepares the scenario editor for adding of infantry obj*
     45  *   InfantryTypeClass::Read_INI -- Fetches infantry override values from the INI database.    *
     46  *   InfantryTypeClass::operator delete -- Frees an infantry type class object.                *
     47  *   InfantryTypeClass::operator new -- Allocate an infanty type class object.                 *
     48  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
     49 
     50 #include	"function.h"
     51 #include	"type.h"
     52 
     53 static DoInfoStruct DogDoControls[DO_COUNT] = {
     54 	{0,	1,	1},					// DO_STAND_READY
     55 	{0,	1,	1},					// DO_STAND_GUARD
     56 	{0,	1,	1},					// DO_PRONE			// NA
     57 	{8,	6,	6},					// DO_WALK
     58 	{104,	14,14},					// DO_FIRE_WEAPON
     59 	{0,	0,	0},					// DO_LIE_DOWN		// NA
     60 	{56,	6,	6},					// DO_CRAWL
     61 	{0,	0,	0},					// DO_GET_UP
     62 	{104,	14,14},					// DO_FIRE_PRONE
     63 	{216,	18,0},					// DO_IDLE1
     64 	{216,	18,0},					// DO_IDLE2
     65 	{235,	7,	0},					// DO_GUN_DEATH
     66 	{242,	9,	0},					// DO_EXPLOSION_DEATH
     67 	{242,	9,	0},					// DO_EXPLOSION2_DEATH
     68 	{242,	9, 0},					// DO_GRENADE_DEATH
     69 	{251,	14,0},					// DO_FIRE_DEATH
     70 	{0,	1,	0},					// DO_GESTURE1
     71 	{0,	1,	0},					// DO_SALUTE1
     72 	{0,	1,	0},					// DO_GESTURE2
     73 	{0,	1,	0},					// DO_SALUTE2
     74 	{106,	12,14},					//	DO_DOG_MAUL
     75 };
     76 
     77 
     78 //
     79 // For the virtual do controls, we are using the TD infantry asset animation frame numbers, take out the -94 frame offsets that were added in RA
     80 //
     81 
     82 static DoInfoStruct E1DoControlsVirtual[DO_COUNT] = {
     83 	{0,	1,	1},					// DO_STAND_READY
     84 	{8,	1,	1},					// DO_STAND_GUARD
     85 	{192,	1,	8},					// DO_PRONE
     86 	{16,	6,	6},					// DO_WALK
     87 	{64,	8,	8},					// DO_FIRE_WEAPON
     88 	{128,	2,	2},					// DO_LIE_DOWN
     89 	{144,	4,	4},					// DO_CRAWL
     90 	{176,	2,	2},					// DO_GET_UP
     91 	{192,	6,	8},					// DO_FIRE_PRONE
     92 	{256,	16,0},					// DO_IDLE1
     93 	{272,	16,0},					// DO_IDLE2
     94 	{382,	8,	0},					// DO_GUN_DEATH
     95 	{398,	8,	0},					// DO_EXPLOSION_DEATH
     96 	{398,	8,	0},					// DO_EXPLOSION2_DEATH
     97 	{406,	12,0},					// DO_GRENADE_DEATH
     98 	{418,	18,0},					// DO_FIRE_DEATH
     99 	{436,	3,	3},					// DO_GESTURE1
    100 	{460,	3,	3},					// DO_SALUTE1
    101 	{484,	3,	3},					// DO_GESTURE2
    102 	{508,	3,	3},					// DO_SALUTE2
    103 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    104 };
    105 
    106 static DoInfoStruct E2DoControlsVirtual[DO_COUNT] = {
    107 	{0,	1,	1},					// DO_STAND_READY
    108 	{8,	1,	1},					// DO_STAND_GUARD
    109 	{288,	1,	12},					// DO_PRONE
    110 	{16,	6,	6},					// DO_WALK
    111 	{64,	20,20},					// DO_FIRE_WEAPON
    112 	{224,	2,	2},					// DO_LIE_DOWN
    113 	{240,	4,	4},					// DO_CRAWL
    114 	{272,	2,	2},					// DO_GET_UP
    115 	{288,	8,	12},					// DO_FIRE_PRONE
    116 	{384,	16,0},					// DO_IDLE1
    117 	{400,	16,0},					// DO_IDLE2
    118 	{510,	8,	0},					// DO_GUN_DEATH
    119 	{526,	8,	0},					// DO_EXPLOSION_DEATH
    120 	{526,	8,	0},					// DO_EXPLOSION2_DEATH
    121 	{534,	12,0},					// DO_GRENADE_DEATH
    122 	{546,	18,0},					// DO_FIRE_DEATH
    123 	{564,	3,	3},					// DO_GESTURE1
    124 	{588,	3,	3},					// DO_SALUTE1
    125 	{612,	3,	3},					// DO_GESTURE2
    126 	{636,	3,	3},					// DO_SALUTE2
    127 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    128 };
    129 
    130 static DoInfoStruct E3DoControlsVirtual[DO_COUNT] = {
    131 	{0,	1,	1},					// DO_STAND_READY
    132 	{8,	1,	1},					// DO_STAND_GUARD
    133 	{192,	1,10},					// DO_PRONE
    134 	{16,	6,	6},					// DO_WALK
    135 	{64,	8,	8},					// DO_FIRE_WEAPON
    136 	{128,	2,	2},					// DO_LIE_DOWN
    137 	{144,	4,	4},					// DO_CRAWL
    138 	{176,	2,	2},					// DO_GET_UP
    139 	{192,	10,10},					// DO_FIRE_PRONE
    140 	{272,	16,0},					// DO_IDLE1
    141 	{288,	16,0},					// DO_IDLE2
    142 	{398,	8,	0},					// DO_GUN_DEATH
    143 	{414,	8,	0},					// DO_EXPLOSION_DEATH
    144 	{414,	8,	0},					// DO_EXPLOSION2_DEATH
    145 	{422,	12,0},					// DO_GRENADE_DEATH
    146 	{434,	18,0},					// DO_FIRE_DEATH
    147 	{452,	3,	3},					// DO_GESTURE1
    148 	{476,	3,	3},					// DO_SALUTE1
    149 	{500,	3,	3},					// DO_GESTURE2
    150 	{524,	3,	3},					// DO_SALUTE2
    151 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    152 };
    153 
    154 static DoInfoStruct E4DoControlsVirtual[DO_COUNT] = {
    155 	{0,	1,	1},					// DO_STAND_READY
    156 	{8,	1,	1},					// DO_STAND_GUARD
    157 	{256,	1,16},					// DO_PRONE
    158 	{16,	6,	6},					// DO_WALK
    159 	{64,	16,16},					// DO_FIRE_WEAPON
    160 	{192,	2,	2},					// DO_LIE_DOWN
    161 	{208,	4,	4},					// DO_CRAWL
    162 	{240,	2,	2},					// DO_GET_UP
    163 	{256,	16,16},					// DO_FIRE_PRONE
    164 	{384,	16,0},					// DO_IDLE1
    165 	{400,	16,0},					// DO_IDLE2
    166 	{510,	8,	0},					// DO_GUN_DEATH
    167 	{526,	8,	0},					// DO_EXPLOSION_DEATH
    168 	{526,	8,	0},					// DO_EXPLOSION2_DEATH
    169 	{534,	12,0},					// DO_GRENADE_DEATH
    170 	{546,	18,0},					// DO_FIRE_DEATH
    171 	{564,	3,	3},					// DO_GESTURE1
    172 	{588,	3,	3},					// DO_SALUTE1
    173 	{612,	3,	3},					// DO_GESTURE2
    174 	{636,	3,	3},					// DO_SALUTE2
    175 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    176 };
    177 
    178 
    179 
    180 static DoInfoStruct E1DoControls[DO_COUNT] = {
    181 	{0,	1,	1},					// DO_STAND_READY
    182 	{8,	1,	1},					// DO_STAND_GUARD
    183 	{192,	1,	8},					// DO_PRONE
    184 	{16,	6,	6},					// DO_WALK
    185 	{64,	8,	8},					// DO_FIRE_WEAPON
    186 	{128,	2,	2},					// DO_LIE_DOWN
    187 	{144,	4,	4},					// DO_CRAWL
    188 	{176,	2,	2},					// DO_GET_UP
    189 	{192,	6,	8},					// DO_FIRE_PRONE
    190 	{256,	16,0},					// DO_IDLE1
    191 	{272,	16,0},					// DO_IDLE2
    192 	{382-94,	8,	0},				// DO_GUN_DEATH
    193 	{398-94,	8,	0},				// DO_EXPLOSION_DEATH
    194 	{398-94,	8,	0},				// DO_EXPLOSION2_DEATH
    195 	{406-94,	12,0},				// DO_GRENADE_DEATH
    196 	{418-94,	18,0},				// DO_FIRE_DEATH
    197 	{436-94,	3,	3},				// DO_GESTURE1
    198 	{460-94,	3,	3},				// DO_SALUTE1
    199 	{484-94,	3,	3},				// DO_GESTURE2
    200 	{508-94,	3,	3},				// DO_SALUTE2
    201 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    202 };
    203 
    204 static DoInfoStruct E2DoControls[DO_COUNT] = {
    205 	{0,	1,	1},					// DO_STAND_READY
    206 	{8,	1,	1},					// DO_STAND_GUARD
    207 	{288,	1,	12},					// DO_PRONE
    208 	{16,	6,	6},					// DO_WALK
    209 	{64,	20,20},					// DO_FIRE_WEAPON
    210 	{224,	2,	2},					// DO_LIE_DOWN
    211 	{240,	4,	4},					// DO_CRAWL
    212 	{272,	2,	2},					// DO_GET_UP
    213 	{288,	8,	12},					// DO_FIRE_PRONE
    214 	{384,	16,0},					// DO_IDLE1
    215 	{400,	16,0},					// DO_IDLE2
    216 	{510-94,	8,	0},				// DO_GUN_DEATH
    217 	{526-94,	8,	0},				// DO_EXPLOSION_DEATH
    218 	{526-94,	8,	0},				// DO_EXPLOSION2_DEATH
    219 	{534-94,	12,0},				// DO_GRENADE_DEATH
    220 	{546-94,	18,0},				// DO_FIRE_DEATH
    221 	{564-94,	3,	3},				// DO_GESTURE1
    222 	{588-94,	3,	3},				// DO_SALUTE1
    223 	{612-94,	3,	3},				// DO_GESTURE2
    224 	{636-94,	3,	3},				// DO_SALUTE2
    225 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    226 };
    227 
    228 static DoInfoStruct E3DoControls[DO_COUNT] = {
    229 	{0,	1,	1},					// DO_STAND_READY
    230 	{8,	1,	1},					// DO_STAND_GUARD
    231 	{192,	1,10},					// DO_PRONE
    232 	{16,	6,	6},					// DO_WALK
    233 	{64,	8,	8},					// DO_FIRE_WEAPON
    234 	{128,	2,	2},					// DO_LIE_DOWN
    235 	{144,	4,	4},					// DO_CRAWL
    236 	{176,	2,	2},					// DO_GET_UP
    237 	{192,	10,10},					// DO_FIRE_PRONE
    238 	{272,	16,0},					// DO_IDLE1
    239 	{288,	16,0},					// DO_IDLE2
    240 	{398-94,	8,	0},				// DO_GUN_DEATH
    241 	{414-94,	8,	0},				// DO_EXPLOSION_DEATH
    242 	{414-94,	8,	0},				// DO_EXPLOSION2_DEATH
    243 	{422-94,	12,0},				// DO_GRENADE_DEATH
    244 	{434-94,	18,0},				// DO_FIRE_DEATH
    245 	{452-94,	3,	3},				// DO_GESTURE1
    246 	{476-94,	3,	3},				// DO_SALUTE1
    247 	{500-94,	3,	3},				// DO_GESTURE2
    248 	{524-94,	3,	3},				// DO_SALUTE2
    249 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    250 };
    251 
    252 static DoInfoStruct E4DoControls[DO_COUNT] = {
    253 	{0,	1,	1},					// DO_STAND_READY
    254 	{8,	1,	1},					// DO_STAND_GUARD
    255 	{256,	1,16},					// DO_PRONE
    256 	{16,	6,	6},					// DO_WALK
    257 	{64,	16,16},					// DO_FIRE_WEAPON
    258 	{192,	2,	2},					// DO_LIE_DOWN
    259 	{208,	4,	4},					// DO_CRAWL
    260 	{240,	2,	2},					// DO_GET_UP
    261 	{256,	16,16},					// DO_FIRE_PRONE
    262 	{384,	16,0},					// DO_IDLE1
    263 	{400,	16,0},					// DO_IDLE2
    264 	{510-94,	8,	0},				// DO_GUN_DEATH
    265 	{526-94,	8,	0},				// DO_EXPLOSION_DEATH
    266 	{526-94,	8,	0},				// DO_EXPLOSION2_DEATH
    267 	{534-94,	12,0},				// DO_GRENADE_DEATH
    268 	{546-94,	18,0},				// DO_FIRE_DEATH
    269 	{564-94,	3,	3},				// DO_GESTURE1
    270 	{588-94,	3,	3},				// DO_SALUTE1
    271 	{612-94,	3,	3},				// DO_GESTURE2
    272 	{636-94,	3,	3},				// DO_SALUTE2
    273 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    274 };
    275 
    276 
    277 static DoInfoStruct E6DoControls[DO_COUNT] = {
    278 	{0,	1,	1},					// DO_STAND_READY
    279 	{8,	1,	1},					// DO_STAND_GUARD
    280 	{82,	1,	4},					// DO_PRONE
    281 	{16,	6,	6},					// DO_WALK
    282 	{0,	0,	0},					// DO_FIRE_WEAPON
    283 	{67,	2,	2},					// DO_LIE_DOWN
    284 	{82,	4,	4},					// DO_CRAWL
    285 	{114,	2,	2},					// DO_GET_UP
    286 	{0,	0,	0},					// DO_FIRE_PRONE
    287 	{130,	16,0},					// DO_IDLE1
    288 	{130,	16,0},					// DO_IDLE2
    289 	{146,	8,	0},					// DO_GUN_DEATH
    290 	{154,	8,	0},					// DO_EXPLOSION_DEATH
    291 	{162,	8,	0},					// DO_EXPLOSION2_DEATH
    292 	{170,	12,0},					// DO_GRENADE_DEATH
    293 	{182,	18,0},					// DO_FIRE_DEATH
    294 	{200,	3,	3},					// DO_GESTURE1
    295 	{224,	3,	3},					// DO_SALUTE1
    296 	{200,	3,	3},					// DO_GESTURE2
    297 	{224,	3,	3},					// DO_SALUTE2
    298 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    299 };
    300 
    301 static DoInfoStruct E7DoControls[DO_COUNT] = {
    302 	{0,	1,	1},					// DO_STAND_READY
    303 	{0,	1,	1},					// DO_STAND_GUARD
    304 	{128,	1,	4},					// DO_PRONE
    305 	{8,	6,	6},					// DO_WALK
    306 	{56,	7,	7},					// DO_FIRE_WEAPON
    307 	{113,	2,	2},					// DO_LIE_DOWN
    308 	{128,	4,	4},					// DO_CRAWL
    309 	{161,	2,	2},					// DO_GET_UP
    310 	{176,	7,	7},					// DO_FIRE_PRONE
    311 	{232,	17,0},					// DO_IDLE1
    312 	{249,	13,0},					// DO_IDLE2
    313 	{262,	8,	0},					// DO_GUN_DEATH
    314 	{270,	8,	0},					// DO_EXPLOSION_DEATH
    315 	{278,	8,	0},					// DO_EXPLOSION2_DEATH
    316 	{286,	12,0},					// DO_GRENADE_DEATH
    317 	{298,	18,0},					// DO_FIRE_DEATH
    318 	{0,	1,	0},					// DO_GESTURE1
    319 	{0,	1,	0},					// DO_SALUTE1
    320 	{0,	1,	0},					// DO_GESTURE2
    321 	{0,	1,	0},					// DO_SALUTE2
    322 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    323 };
    324 
    325 //Spy
    326 static DoInfoStruct SpyDoControls[DO_COUNT] = {
    327 	{0,	1,	1},					// DO_STAND_READY
    328 	{8,	1,	1},					// DO_STAND_GUARD
    329 	{144,	1,	4},					// DO_PRONE
    330 	{16,	6,	6},					// DO_WALK
    331 	{64,	8,	8},					// DO_FIRE_WEAPON
    332 	{128,	2,	2},					// DO_LIE_DOWN
    333 	{144,	4,	4},					// DO_CRAWL
    334 	{176,	2,	2},					// DO_GET_UP
    335 	{192,	8,	8},					// DO_FIRE_PRONE
    336 	{256,	14,0},					// DO_IDLE1
    337 	{270,	18,0},					// DO_IDLE2
    338 	{288,	8,	0},					// DO_GUN_DEATH
    339 	{296,	8,	0},					// DO_EXPLOSION_DEATH
    340 	{304,	8,	0},					// DO_EXPLOSION2_DEATH
    341 	{312,	12,0},					// DO_GRENADE_DEATH
    342 	{324,	18,0},					// DO_FIRE_DEATH
    343 	{0,	1,	0},					// DO_GESTURE1
    344 	{0,	1,	0},					// DO_SALUTE1
    345 	{0,	1,	0},					// DO_GESTURE2
    346 	{0,	1,	0},					// DO_SALUTE2
    347 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    348 };
    349 
    350 static DoInfoStruct E9DoControls[DO_COUNT] = {
    351 	{0,	1,	1},					// DO_STAND_READY
    352 	{8,	1,	1},					// DO_STAND_GUARD
    353 	{72,	1,	4},					// DO_PRONE
    354 	{8,	6,	6},					// DO_WALK
    355 	{0,	0,	0},					// DO_FIRE_WEAPON
    356 	{56,	2,	2},					// DO_LIE_DOWN
    357 	{72,	4,	4},					// DO_CRAWL
    358 	{108,	2,	2},					// DO_GET_UP
    359 	{0,	0,	0},					// DO_FIRE_PRONE
    360 	{120,	19,0},					// DO_IDLE1
    361 	{120,	19,0},					// DO_IDLE2
    362 	{139,	8,	0},					// DO_GUN_DEATH
    363 	{147,	8,	0},					// DO_EXPLOSION_DEATH
    364 	{155,	8,	0},					// DO_EXPLOSION2_DEATH
    365 	{163,	12,0},					// DO_GRENADE_DEATH
    366 	{175,	18,0},					// DO_FIRE_DEATH
    367 	{0,	1,	0},					// DO_GESTURE1
    368 	{0,	1,	0},					// DO_SALUTE1
    369 	{0,	1,	0},					// DO_GESTURE2
    370 	{0,	1,	0},					// DO_SALUTE2
    371 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    372 };
    373 
    374 static DoInfoStruct MedicDoControls[DO_COUNT] = {
    375 	{0,	1,	1},					// DO_STAND_READY
    376 	{0,	1,	1},					// DO_STAND_GUARD
    377 	{130,	1,	4},					// DO_PRONE
    378 	{8,	6,	6},					// DO_WALK
    379 	{56,	28,0},					// DO_FIRE_WEAPON
    380 	{114,	2,	2},					// DO_LIE_DOWN
    381 	{130,	4,	4},					// DO_CRAWL
    382 	{162,	2,	2},					// DO_GET_UP
    383 	{56,	28,0},					// DO_FIRE_PRONE
    384 	{178,	15,0},					// DO_IDLE1
    385 	{178,	15,0},					// DO_IDLE2
    386 	{193,	8,	0},					// DO_GUN_DEATH
    387 	{210,	8,	0},					// DO_EXPLOSION_DEATH
    388 	{202,	8,	0},					// DO_EXPLOSION2_DEATH
    389 	{217,	12,0},					// DO_GRENADE_DEATH
    390 	{229,	18,0},					// DO_FIRE_DEATH
    391 	{0,	1,	0},					// DO_GESTURE1
    392 	{0,	1,	0},					// DO_SALUTE1
    393 	{0,	1,	0},					// DO_GESTURE2
    394 	{0,	1,	0},					// DO_SALUTE2
    395 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    396 };
    397 
    398 static DoInfoStruct GeneralDoControls[DO_COUNT] = {
    399 	{0,	1,	1},					// DO_STAND_READY
    400 	{0,	1,	1},					// DO_STAND_GUARD
    401 	{104,	1,	4},					// DO_PRONE
    402 	{8,	6,	6},					// DO_WALK
    403 	{56,	4,	4},					// DO_FIRE_WEAPON
    404 	{88,	2,	2},					// DO_LIE_DOWN
    405 	{104,	4,	4},					// DO_CRAWL
    406 	{136,	2,	2},					// DO_GET_UP
    407 	{152,	4,	4},					// DO_FIRE_PRONE
    408 	{184,	26,0},					// DO_IDLE1
    409 	{184,	26,0},					// DO_IDLE2
    410 	{210,	8,	0},					// DO_GUN_DEATH
    411 	{226,	8,	0},					// DO_EXPLOSION_DEATH
    412 	{218,	8,	0},					// DO_EXPLOSION2_DEATH
    413 	{234,	12,0},					// DO_GRENADE_DEATH
    414 	{246,	18,0},					// DO_FIRE_DEATH
    415 	{0,	1,	0},					// DO_GESTURE1
    416 	{0,	1,	0},					// DO_SALUTE1
    417 	{0,	1,	0},					// DO_GESTURE2
    418 	{0,	1,	0},					// DO_SALUTE2
    419 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    420 };
    421 
    422 static DoInfoStruct CivilianDoControls[DO_COUNT] = {
    423 	{0,	1,	1},					// DO_STAND_READY
    424 	{0,	1,	1},					// DO_STAND_GUARD
    425 	{0,	1,	1},					// DO_PRONE				// N/A
    426 	{56, 	6,	6},					// DO_WALK
    427 	{205-85,	4, 4},				// DO_FIRE_WEAPON
    428 	{0, 	1,	1},					// DO_LIE_DOWN			// N/A
    429 	{8, 	6,	6},					// DO_CRAWL
    430 	{0, 	1,	1},					// DO_GET_UP			// N/A
    431 	{205-85,	4,	4},				// DO_FIRE_PRONE
    432 	{189-85,	10,0},				// DO_IDLE1
    433 	{199-85,	6,	0},				// DO_IDLE2
    434 	{152,	8,	0},					// DO_GUN_DEATH
    435 	{160,	8,	0},					// DO_EXPLOSION_DEATH
    436 	{160,	8,	0},					// DO_EXPLOSION2_DEATH
    437 	{168,	12,0},					// DO_GRENADE_DEATH
    438 	{180,	18,0},					// DO_FIRE_DEATH
    439 	{0, 	1,	0},					// DO_GESTURE1			// N/A
    440 	{0, 	1,	0},					// DO_SALUTE1			// N/A
    441 	{0, 	1,	0},					// DO_GESTURE2			// N/A
    442 	{0, 	1,	0},					// DO_SALUTE2			// N/A
    443 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    444 };
    445 
    446 static DoInfoStruct CivilianDoControlsVirtual[DO_COUNT] = {
    447 	{0,			1,	1},				// DO_STAND_READY
    448 	{0,			1,	1},				// DO_STAND_GUARD
    449 	{0,			1,	1},				// DO_PRONE				// N/A
    450 	{56, 		6,	6},				// DO_WALK
    451 	{205,		4, 4},				// DO_FIRE_WEAPON
    452 	{0, 		1,	1},				// DO_LIE_DOWN			// N/A
    453 	{8, 		6,	6},				// DO_CRAWL
    454 	{0, 		1,	1},				// DO_GET_UP			// N/A
    455 	{205,		4,	4},				// DO_FIRE_PRONE
    456 	{189,		10,0},				// DO_IDLE1
    457 	{199,		6,	0},				// DO_IDLE2
    458 	{329,		8,	0},				// DO_GUN_DEATH
    459 	{337,		8,	0},				// DO_EXPLOSION_DEATH
    460 	{337,		8,	0},				// DO_EXPLOSION2_DEATH
    461 	{345,		12,0},				// DO_GRENADE_DEATH
    462 	{357,		18,0},				// DO_FIRE_DEATH
    463 	{0, 		1,	0},				// DO_GESTURE1			// N/A
    464 	{0, 		1,	0},				// DO_SALUTE1			// N/A
    465 	{0, 		1,	0},				// DO_GESTURE2			// N/A
    466 	{0, 		1,	0},				// DO_SALUTE2			// N/A
    467 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    468 };
    469 
    470 static DoInfoStruct EinsteinDoControls[DO_COUNT] = {
    471 	{0,	1,	1},					// DO_STAND_READY
    472 	{0,	1,	1},					// DO_STAND_GUARD
    473 	{0,	1,	1},					// DO_PRONE				// N/A
    474 	{56, 	6,	6},					// DO_WALK
    475 	{205-92,	4, 4},				// DO_FIRE_WEAPON
    476 	{0, 	1,	1},					// DO_LIE_DOWN			// N/A
    477 	{8, 	6,	6},					// DO_CRAWL
    478 	{0, 	1,	1},					// DO_GET_UP			// N/A
    479 	{0,	0,	0},					// DO_FIRE_PRONE
    480 	{104,	16,0},					// DO_IDLE1
    481 	{104,	16,0},					// DO_IDLE2
    482 	{212-92,	8,	0},				// DO_GUN_DEATH
    483 	{220-92,	8,	0},				// DO_EXPLOSION_DEATH
    484 	{228-92,	12,0},				// DO_EXPLOSION2_DEATH
    485 	{228-92,	12,0},				// DO_GRENADE_DEATH
    486 	{240-92,	17,0},				// DO_FIRE_DEATH
    487 	{0, 	1,	0},					// DO_GESTURE1			// N/A
    488 	{0, 	1,	0},					// DO_SALUTE1			// N/A
    489 	{0, 	1,	0},					// DO_GESTURE2			// N/A
    490 	{0, 	1,	0},					// DO_SALUTE2			// N/A
    491 	{0,	0, 0},					//	DO_DOG_MAUL			// N/A
    492 };
    493 
    494 // Attack dogs
    495 static InfantryTypeClass const Dog(
    496 	INFANTRY_DOG,				// Infantry type number.
    497 	TXT_GUARD_DOG,				// Translate name number for infantry type.
    498 	"DOG",						// INI name for infantry.
    499 	0x0015,						//	Vertical offset.
    500 	0x0010,						// Primary weapon offset along turret centerline.
    501 	false,						// Is this a female type?
    502 	false,						// Has crawling animation frames?
    503 	false,						// Is this a civilian?
    504 	false,						// Does this unit use the override remap table?
    505 	false,						// Always use the given name for the infantry?
    506 	false,						// Theater specific graphic image?
    507 	PIP_FULL,					// Transport pip shape/color to use.
    508 	DogDoControls,
    509 	DogDoControls,
    510 	1,								// Frame of projectile launch.
    511 	1,								// Frame of projectile launch while prone.
    512 	0								// pointer to override remap table
    513 );
    514 
    515 // Minigunners
    516 static InfantryTypeClass const E1(
    517 	INFANTRY_E1,				// Infantry type number.
    518 	TXT_E1,						// Translate name number for infantry type.
    519 	"E1",							// INI name for infantry.
    520 	0x0035,						//	Vertical offset.
    521 	0x0010,						// Primary weapon offset along turret centerline.
    522 	false,						// Is this a female type?
    523 	true,							// Has crawling animation frames?
    524 	false,						// Is this a civilian?
    525 	false,						// Does this unit use the override remap table?
    526 	false,						// Always use the given name for the infantry?
    527 	false,						// Theater specific graphic image?
    528 	PIP_FULL,					// Transport pip shape/color to use.
    529 	E1DoControls,
    530 	E1DoControlsVirtual,
    531 	2,								// Frame of projectile launch.
    532 	2,								// Frame of projectile launch while prone.
    533 	0								// pointer to override remap table
    534 );
    535 
    536 // Grenadiers
    537 static InfantryTypeClass const E2(
    538 	INFANTRY_E2,				// Infantry type number.
    539 	TXT_E2,						// Translate name number for infantry type.
    540 	"E2",							// INI name for infantry.
    541 	0x0035,						//	Vertical offset.
    542 	0x0010,						// Primary weapon offset along turret centerline.
    543 	false,						// Is this a female type?
    544 	true,							// Has crawling animation frames?
    545 	false,						// Is this a civilian?
    546 	false,						// Does this unit use the override remap table?
    547 	false,						// Always use the given name for the infantry?
    548 	false,						// Theater specific graphic image?
    549 	PIP_FULL,					// Transport pip shape/color to use.
    550 	E2DoControls,
    551 	E2DoControlsVirtual,
    552 	14,							// Frame of projectile launch.
    553 	6,								// Frame of projectile launch while prone.
    554 	0								// pointer to override remap table
    555 );
    556 
    557 // Bazooka
    558 static InfantryTypeClass const E3(
    559 	INFANTRY_E3,				// Infantry type number.
    560 	TXT_E3,						// Translate name number for infantry type.
    561 	"E3",							// INI name for infantry.
    562 	0x0035,						//	Vertical offset.
    563 	0x0010,						// Primary weapon offset along turret centerline.
    564 	false,						// Is this a female type?
    565 	true,							// Has crawling animation frames?
    566 	false,						// Is this a civilian?
    567 	false,						// Does this unit use the override remap table?
    568 	false,						// Always use the given name for the infantry?
    569 	false,						// Theater specific graphic image?
    570 	PIP_FULL,					// Transport pip shape/color to use.
    571 	E3DoControls,
    572 	E3DoControlsVirtual,
    573 	3,								// Frame of projectile launch.
    574 	3,								// Frame of projectile launch while prone.
    575 	0								// pointer to override remap table
    576 );
    577 
    578 // Flamethrower
    579 static InfantryTypeClass const E4(
    580 	INFANTRY_E4,				// Infantry type number.
    581 	TXT_E4,						// Translate name number for infantry type.
    582 	"E4",							// INI name for infantry.
    583 	0x0035,						//	Vertical offset.
    584 	0x0010,						// Primary weapon offset along turret centerline.
    585 	false,						// Is this a female type?
    586 	true,							// Has crawling animation frames?
    587 	false,						// Is this a civilian?
    588 	false,						// Does this unit use the override remap table?
    589 	false,						// Always use the given name for the infantry?
    590 	false,						// Theater specific graphic image?
    591 	PIP_FULL,					// Transport pip shape/color to use.
    592 	E4DoControls,
    593 	E4DoControlsVirtual,
    594 	2,								// Frame of projectile launch.
    595 	0,								// Frame of projectile launch while prone.
    596 	0								// pointer to override remap table
    597 );
    598 
    599 // Renovator
    600 static InfantryTypeClass const E6(
    601 	INFANTRY_RENOVATOR,				// Infantry type number.
    602 	TXT_E6,						// Translate name number for infantry type.
    603 	"E6",							// INI name for infantry.
    604 	0x0035,						//	Vertical offset.
    605 	0x0010,						// Primary weapon offset along turret centerline.
    606 	false,						// Is this a female type?
    607 	false,						// Has crawling animation frames?
    608 	false,						// Is this a civilian?
    609 	false,						// Does this unit use the override remap table?
    610 	false,						// Always use the given name for the infantry?
    611 	false,						// Theater specific graphic image?
    612 	PIP_ENGINEER,				// Transport pip shape/color to use.
    613 	E6DoControls,
    614 	E6DoControls,
    615 	3,								// Frame of projectile launch.
    616 	3,								// Frame of projectile launch while prone.
    617 	0								// pointer to override remap table
    618 );
    619 
    620 // Spy
    621 static InfantryTypeClass const E8(
    622 	INFANTRY_SPY,				// Infantry type number.
    623 	TXT_E8,						// Translate name number for infantry type.
    624 	"SPY",						// INI name for infantry.
    625 	0x0035,						//	Vertical offset.
    626 	0x0010,						// Primary weapon offset along turret centerline.
    627 	false,						// Is this a female type?
    628 	false,						// Has crawling animation frames?
    629 	false,						// Is this a civilian?
    630 	false,						// Does this unit use the override remap table?
    631 	false,						// Always use the given name for the infantry?
    632 	false,						// Theater specific graphic image?
    633 	PIP_ENGINEER,				// Transport pip shape/color to use.
    634 	SpyDoControls,
    635 	SpyDoControls,
    636 	3,								// Frame of projectile launch.
    637 	3,								// Frame of projectile launch while prone.
    638 	0								// pointer to override remap table
    639 );
    640 
    641 // Thief
    642 static InfantryTypeClass const E9(
    643 	INFANTRY_THIEF,				// Infantry type number.
    644 	TXT_THIEF,					// Translate name number for infantry type.
    645 	"THF",						// INI name for infantry.
    646 	0x0035,						//	Vertical offset.
    647 	0x0010,						// Primary weapon offset along turret centerline.
    648 	false,						// Is this a female type?
    649 	false,						// Has crawling animation frames?
    650 	false,						// Is this a civilian?
    651 	false,						// Does this unit use the override remap table?
    652 	false,						// Always use the given name for the infantry?
    653 	false,						// Theater specific graphic image?
    654 	PIP_ENGINEER,				// Transport pip shape/color to use.
    655 	E9DoControls,
    656 	E9DoControls,
    657 	3,								// Frame of projectile launch.
    658 	3,								// Frame of projectile launch while prone.
    659 	0								// pointer to override remap table
    660 );
    661 
    662 // Tanya
    663 static InfantryTypeClass const E7(
    664 	INFANTRY_TANYA,			// Infantry type number.
    665 	TXT_E7,						// Translate name number for infantry type.
    666 	"E7",							// INI name for infantry.
    667 	0x0035,						//	Vertical offset.
    668 	0x0010,						// Primary weapon offset along turret centerline.
    669 	false,						// Is this a female type?
    670 	true,							// Has crawling animation frames?
    671 	false,						// Is this a civilian?
    672 	false,						// Does this unit use the override remap table?
    673 	false,						// Always use the given name for the infantry?
    674 	false,						// Theater specific graphic image?
    675 	PIP_COMMANDO,				// Transport pip shape/color to use.
    676 	E7DoControls,
    677 	E7DoControls,
    678 	2,								// Frame of projectile launch.
    679 	2,								// Frame of projectile launch while prone.
    680 	0								// pointer to override remap table
    681 );
    682 
    683 static InfantryTypeClass const Medic(
    684 	INFANTRY_MEDIC,			// Infantry type number.
    685 	TXT_MEDIC,					// Translate name number for infantry type.
    686 	"MEDI",						// INI name for infantry.
    687 	0x0035,						//	Vertical offset.
    688 	0x0010,						// Primary weapon offset along turret centerline.
    689 	false,						// Is this a female type?
    690 	true,							// Has crawling animation frames?
    691 	false,						// Is this a civilian?
    692 	false,						// Does this unit use the override remap table?
    693 	false,						// Always use the given name for the infantry?
    694 	false,						// Theater specific graphic image?
    695 	PIP_ENGINEER,				// Transport pip shape/color to use.
    696 	MedicDoControls,
    697 	MedicDoControls,
    698 	25,							// Frame of projectile launch.
    699 	25,							// Frame of projectile launch while prone.
    700 	0								// pointer to override remap table
    701 );
    702 
    703 static InfantryTypeClass const General(
    704 	INFANTRY_GENERAL,			// Infantry type number.
    705 	TXT_GENERAL,				// Translate name number for infantry type.
    706 	"GNRL",						// INI name for infantry.
    707 	0x0035,						//	Vertical offset.
    708 	0x0010,						// Primary weapon offset along turret centerline.
    709 	false,						// Is this a female type?
    710 	true,							// Has crawling animation frames?
    711 	false,						// Is this a civilian?
    712 	false,						// Does this unit use the override remap table?
    713 	false,						// Always use the given name for the infantry?
    714 	false,						// Theater specific graphic image?
    715 	PIP_ENGINEER,				// Transport pip shape/color to use.
    716 	GeneralDoControls,
    717 	GeneralDoControls,
    718 	2,								// Frame of projectile launch.
    719 	2,								// Frame of projectile launch while prone.
    720 	0								// pointer to override remap table
    721 );
    722 
    723 // Civilians
    724 static InfantryTypeClass const C1(
    725 	INFANTRY_C1,				// Infantry type number.
    726 	TXT_C1,						// Translate name number for infantry type.
    727 	"C1",							// INI name for infantry.
    728 	0x0035,						//	Vertical offset.
    729 	0x0010,						// Primary weapon offset along turret centerline.
    730 	false,						// Is this a female type?
    731 	false,						// Has crawling animation frames?
    732 	true,							// Is this a civilian?
    733 	false,						// Does this unit use the override remap table?
    734 	true,							// Always use the given name for the infantry?
    735 	false,						// Theater specific graphic image?
    736 	PIP_CIVILIAN,				// Transport pip shape/color to use.
    737 	CivilianDoControls,
    738 	CivilianDoControlsVirtual,
    739 	2,								// Frame of projectile launch.
    740 	0,								// Frame of projectile launch while prone.
    741 	0								// pointer to override remap table
    742 );
    743 
    744 static InfantryTypeClass const C2(
    745 	INFANTRY_C2,				// Infantry type number.
    746 	TXT_C2,						// Translate name number for infantry type.
    747 	"C2",							// INI name for infantry.
    748 	0x0035,						//	Vertical offset.
    749 	0x0010,						// Primary weapon offset along turret centerline.
    750 	false,						// Is this a female type?
    751 	false,						// Has crawling animation frames?
    752 	true,							// Is this a civilian?
    753 	true,							// Does this unit use the override remap table?
    754 	true,							// Always use the given name for the infantry?
    755 	false,						// Theater specific graphic image?
    756 	PIP_CIVILIAN,				// Transport pip shape/color to use.
    757 	CivilianDoControls,
    758 	CivilianDoControlsVirtual,
    759 	2,								// Frame of projectile launch.
    760 	0,								// Frame of projectile launch while prone.
    761 	RemapCiv2						// pointer to override remap table
    762 );
    763 
    764 static InfantryTypeClass const C3(
    765 	INFANTRY_C3,				// Infantry type number.
    766 	TXT_C3,						// Translate name number for infantry type.
    767 	"C3",							// INI name for infantry.
    768 	0x0035,						//	Vertical offset.
    769 	0x0010,						// Primary weapon offset along turret centerline.
    770 	true,							// Is this a female type?
    771 	false,						// Has crawling animation frames?
    772 	true,							// Is this a civilian?
    773 	false,						// Does this unit use the override remap table?
    774 	true,							// Always use the given name for the infantry?
    775 	false,						// Theater specific graphic image?
    776 	PIP_CIVILIAN,				// Transport pip shape/color to use.
    777 	CivilianDoControls,
    778 	CivilianDoControlsVirtual,
    779 	2,								// Frame of projectile launch.
    780 	0,								// Frame of projectile launch while prone.
    781 	0								// pointer to override remap table
    782 );
    783 
    784 static InfantryTypeClass const C4(
    785 	INFANTRY_C4,				// Infantry type number.
    786 	TXT_C4,						// Translate name number for infantry type.
    787 	"C4",							// INI name for infantry.
    788 	0x0035,						//	Vertical offset.
    789 	0x0010,						// Primary weapon offset along turret centerline.
    790 	true,							// Is this a female type?
    791 	false,						// Has crawling animation frames?
    792 	true,							// Is this a civilian?
    793 	true,							// Does this unit use the override remap table?
    794 	true,							// Always use the given name for the infantry?
    795 	false,						// Theater specific graphic image?
    796 	PIP_CIVILIAN,				// Transport pip shape/color to use.
    797 	CivilianDoControls,
    798 	CivilianDoControlsVirtual,
    799 	2,								// Frame of projectile launch.
    800 	0,								// Frame of projectile launch while prone.
    801 	RemapCiv4						// pointer to override remap table
    802 );
    803 
    804 static InfantryTypeClass const C5(
    805 	INFANTRY_C5,				// Infantry type number.
    806 	TXT_C5,						// Translate name number for infantry type.
    807 	"C5",							// INI name for infantry.
    808 	0x0035,						//	Vertical offset.
    809 	0x0010,						// Primary weapon offset along turret centerline.
    810 	false,						// Is this a female type?
    811 	false,						// Has crawling animation frames?
    812 	true,							// Is this a civilian?
    813 	true,							// Does this unit use the override remap table?
    814 	true,							// Always use the given name for the infantry?
    815 	false,						// Theater specific graphic image?
    816 	PIP_CIVILIAN,				// Transport pip shape/color to use.
    817 	CivilianDoControls,
    818 	CivilianDoControlsVirtual,
    819 	2,								// Frame of projectile launch.
    820 	0,								// Frame of projectile launch while prone.
    821 	RemapCiv5						// pointer to override remap table
    822 );
    823 
    824 static InfantryTypeClass const C6(
    825 	INFANTRY_C6,				// Infantry type number.
    826 	TXT_C6,						// Translate name number for infantry type.
    827 	"C6",							// INI name for infantry.
    828 	0x0035,						//	Vertical offset.
    829 	0x0010,						// Primary weapon offset along turret centerline.
    830 	false,						// Is this a female type?
    831 	false,						// Has crawling animation frames?
    832 	true,							// Is this a civilian?
    833 	true,							// Does this unit use the override remap table?
    834 	true,							// Always use the given name for the infantry?
    835 	false,						// Theater specific graphic image?
    836 	PIP_CIVILIAN,				// Transport pip shape/color to use.
    837 	CivilianDoControls,
    838 	CivilianDoControlsVirtual,
    839 	2,								// Frame of projectile launch.
    840 	0,								// Frame of projectile launch while prone.
    841 	RemapCiv6						// pointer to override remap table
    842 );
    843 
    844 static InfantryTypeClass const C7(
    845 	INFANTRY_C7,				// Infantry type number.
    846 	TXT_C7,						// Translate name number for infantry type.
    847 	"C7",							// INI name for infantry.
    848 	0x0035,						//	Vertical offset.
    849 	0x0010,						// Primary weapon offset along turret centerline.
    850 	false,						// Is this a female type?
    851 	false,						// Has crawling animation frames?
    852 	true,							// Is this a civilian?
    853 	true,							// Does this unit use the override remap table?
    854 	true,							// Always use the given name for the infantry?
    855 	false,						// Theater specific graphic image?
    856 	PIP_CIVILIAN,				// Transport pip shape/color to use.
    857 	CivilianDoControls,
    858 	CivilianDoControlsVirtual,
    859 	2,								// Frame of projectile launch.
    860 	0,								// Frame of projectile launch while prone.
    861 	RemapCiv7						// pointer to override remap table
    862 );
    863 
    864 static InfantryTypeClass const C8(
    865 	INFANTRY_C8,				// Infantry type number.
    866 	TXT_C8,						// Translate name number for infantry type.
    867 	"C8",							// INI name for infantry.
    868 	0x0035,						//	Vertical offset.
    869 	0x0010,						// Primary weapon offset along turret centerline.
    870 	false,						// Is this a female type?
    871 	false,						// Has crawling animation frames?
    872 	true,							// Is this a civilian?
    873 	true,							// Does this unit use the override remap table?
    874 	true,							// Always use the given name for the infantry?
    875 	false,						// Theater specific graphic image?
    876 	PIP_CIVILIAN,				// Transport pip shape/color to use.
    877 	CivilianDoControls,
    878 	CivilianDoControlsVirtual,
    879 	2,								// Frame of projectile launch.
    880 	0,								// Frame of projectile launch while prone.
    881 	RemapCiv8						// pointer to override remap table
    882 );
    883 
    884 static InfantryTypeClass const C9(
    885 	INFANTRY_C9,				// Infantry type number.
    886 	TXT_C9,						// Translate name number for infantry type.
    887 	"C9",							// INI name for infantry.
    888 	0x0035,						//	Vertical offset.
    889 	0x0010,						// Primary weapon offset along turret centerline.
    890 	false,						// Is this a female type?
    891 	false,						// Has crawling animation frames?
    892 	true,							// Is this a civilian?
    893 	true,							// Does this unit use the override remap table?
    894 	true,							// Always use the given name for the infantry?
    895 	false,						// Theater specific graphic image?
    896 	PIP_CIVILIAN,				// Transport pip shape/color to use.
    897 	CivilianDoControls,
    898 	CivilianDoControlsVirtual,
    899 	2,								// Frame of projectile launch.
    900 	0,								// Frame of projectile launch while prone.
    901 	RemapCiv9						// pointer to override remap table
    902 );
    903 
    904 // Nikoomba
    905 static InfantryTypeClass const C10(
    906 	INFANTRY_C10,				// Infantry type number.
    907 	TXT_C10,						// Translate name number for infantry type.
    908 	"C10",						// INI name for infantry.
    909 	0x0035,						//	Vertical offset.
    910 	0x0010,						// Primary weapon offset along turret centerline.
    911 	false,						// Is this a female type?
    912 	false,						// Has crawling animation frames?
    913 	true,							// Is this a civilian?
    914 	true,							// Does this unit use the override remap table?
    915 	true,							// Always use the given name for the infantry?
    916 	false,						// Theater specific graphic image?
    917 	PIP_ENGINEER,				// Transport pip shape/color to use.
    918 	CivilianDoControls,
    919 	CivilianDoControlsVirtual,
    920 	2,								// Frame of projectile launch.
    921 	0,								// Frame of projectile launch while prone.
    922 	RemapCiv10						// pointer to override remap table
    923 );
    924 
    925 static InfantryTypeClass const Einstein(
    926 	INFANTRY_EINSTEIN,		// Infantry type number.
    927 	TXT_EINSTEIN,				// Translate name number for infantry type.
    928 	"EINSTEIN",					// INI name for infantry.
    929 	0x0035,						//	Vertical offset.
    930 	0x0010,						// Primary weapon offset along turret centerline.
    931 	false,						// Is this a female type?
    932 	false,						// Has crawling animation frames?
    933 	true,							// Is this a civilian?
    934 	false,						// Does this unit use the override remap table?
    935 	true,							// Always use the given name for the infantry?
    936 	false,						// Theater specific graphic image?
    937 	PIP_ENGINEER,				// Transport pip shape/color to use.
    938 	EinsteinDoControls,
    939 	EinsteinDoControls,
    940 	0,								// Frame of projectile launch.
    941 	0,								// Frame of projectile launch while prone.
    942 	0								// pointer to override remap table
    943 );
    944 
    945 static InfantryTypeClass const Delphi(
    946 	INFANTRY_DELPHI,			// Infantry type number.
    947 	TXT_DELPHI,					// Translate name number for infantry type.
    948 	"DELPHI",					// INI name for infantry.
    949 	0x0035,						//	Vertical offset.
    950 	0x0010,						// Primary weapon offset along turret centerline.
    951 	false,						// Is this a female type?
    952 	false,						// Has crawling animation frames?
    953 	true,							// Is this a civilian?
    954 	false,						// Does this unit use the override remap table?
    955 	true,							// Always use the given name for the infantry?
    956 	false,						// Theater specific graphic image?
    957 	PIP_ENGINEER,				// Transport pip shape/color to use.
    958 	CivilianDoControls,
    959 	CivilianDoControlsVirtual,
    960 	2,								// Frame of projectile launch.
    961 	0,								// Frame of projectile launch while prone.
    962 	0								// pointer to override remap table
    963 );
    964 
    965 static InfantryTypeClass const DrChan(
    966 	INFANTRY_CHAN,				// Infantry type number.
    967 	TXT_CHAN,					// Translate name number for infantry type.
    968 	"CHAN",						// INI name for infantry.
    969 	0x0035,						//	Vertical offset.
    970 	0x0010,						// Primary weapon offset along turret centerline.
    971 	false,						// Is this a female type?
    972 	false,						// Has crawling animation frames?
    973 	true,							// Is this a civilian?
    974 	false,						// Does this unit use the override remap table?
    975 	true,							// Always use the given name for the infantry?
    976 	false,						// Theater specific graphic image?
    977 	PIP_ENGINEER,				// Transport pip shape/color to use.
    978 	EinsteinDoControls,
    979 	EinsteinDoControls,
    980 	2,								// Frame of projectile launch.
    981 	0,								// Frame of projectile launch while prone.
    982 	0								// pointer to override remap table
    983 );
    984 
    985 #ifdef FIXIT_CSII	//	checked - ajw 9/28/98
    986 
    987 // Shock Trooper
    988 static InfantryTypeClass const ShockTrooper(
    989 	INFANTRY_SHOCK,			// Infantry type number.
    990 	TXT_SHOCKTROOPER,			// Translate name number for infantry type.
    991 	"SHOK",						// INI name for infantry.
    992 	-0x0010,					//	Vertical offset.
    993 	0x0038,						// Primary weapon offset along turret centerline.
    994 	false,						// Is this a female type?
    995 	true,							// Has crawling animation frames?
    996 	false,						// Is this a civilian?
    997 	false,						// Does this unit use the override remap table?
    998 	false,						// Always use the given name for the infantry?
    999 	false,						// Theater specific graphic image?
   1000 	PIP_FULL,					// Transport pip shape/color to use.
   1001 	E4DoControls,
   1002 	E4DoControls,
   1003 	2,								// Frame of projectile launch.
   1004 	0,								// Frame of projectile launch while prone.
   1005 	0,								// pointer to override remap table
   1006 	0x0018						//	Horizontal offset.
   1007 );
   1008 
   1009 
   1010 static InfantryTypeClass const Mechanic(
   1011 	INFANTRY_MECHANIC,		// Infantry type number.
   1012 	TXT_MECHANIC,					// Translate name number for infantry type.
   1013 	"MECH",						// INI name for infantry.
   1014 	0x0035,						//	Vertical offset.
   1015 	0x0010,						// Primary weapon offset along turret centerline.
   1016 	false,						// Is this a female type?
   1017 	true,							// Has crawling animation frames?
   1018 	false,						// Is this a civilian?
   1019 	false,						// Does this unit use the override remap table?
   1020 	false,						// Always use the given name for the infantry?
   1021 	false,						// Theater specific graphic image?
   1022 	PIP_ENGINEER,				// Transport pip shape/color to use.
   1023 	MedicDoControls,
   1024 	MedicDoControls,
   1025 	25,							// Frame of projectile launch.
   1026 	25,							// Frame of projectile launch while prone.
   1027 	0								// pointer to override remap table
   1028 );
   1029 #endif
   1030 
   1031 /***********************************************************************************************
   1032  * InfantryTypeClass::InfantryTypeClass -- Constructor for infantry type class objects.        *
   1033  *                                                                                             *
   1034  *    This routine will construct the infantry type objects. It is use to create the static    *
   1035  *    infantry types that are used to give each of the infantry objects their characteristics. *
   1036  *                                                                                             *
   1037  * INPUT:   see below...                                                                       *
   1038  *                                                                                             *
   1039  * OUTPUT:  none                                                                               *
   1040  *                                                                                             *
   1041  * WARNINGS:   none                                                                            *
   1042  *                                                                                             *
   1043  * HISTORY:                                                                                    *
   1044  *   09/24/1994 JLB : Created.                                                                 *
   1045  *   02/16/1996 JLB : Greatly simplified.                                                      *
   1046  *=============================================================================================*/
   1047 InfantryTypeClass::InfantryTypeClass (
   1048 						InfantryType type,
   1049 						int name,
   1050 						char const * ininame,
   1051 						int verticaloffset,
   1052 						int primaryoffset,
   1053 						bool is_female,
   1054 						bool is_crawling,
   1055 						bool is_civilian,
   1056 						bool is_remap_override,
   1057 						bool is_nominal,
   1058 						bool is_theater,
   1059 						PipEnum pip,
   1060 						DoInfoStruct const * control,
   1061 						DoInfoStruct const * virtual_control,
   1062 						int firelaunch,
   1063 						int pronelaunch,
   1064 						unsigned char const * override_remap,
   1065 						int horizontaloffset)
   1066 	: TechnoTypeClass(RTTI_INFANTRYTYPE,
   1067 							int(type),
   1068 							name,
   1069 							ininame,
   1070 							REMAP_NORMAL,
   1071 							verticaloffset,
   1072 							primaryoffset,
   1073 							0x0000,
   1074 							0x0000,
   1075 							0x0000,
   1076 							is_nominal,
   1077 							true,
   1078 							true,
   1079 							true,
   1080 							false,
   1081 							false,
   1082 							is_theater,
   1083 							false,
   1084 							true,
   1085 							true,
   1086 							8,
   1087 							SPEED_FOOT,
   1088 							horizontaloffset),
   1089 	IsFemale(is_female),
   1090 	IsCrawling(is_crawling),
   1091 	IsCapture(false),
   1092 	IsFraidyCat(false),
   1093 	IsCivilian(is_civilian),
   1094 	IsBomber(false),
   1095 	IsDog(false),
   1096 	IsRemapOverride(is_remap_override),
   1097 	Type(type),
   1098 	Pip(pip),
   1099 	DoControls(control),
   1100 	DoControlsVirtual(virtual_control),
   1101 	FireLaunch(firelaunch),
   1102 	ProneLaunch(pronelaunch),
   1103 	OverrideRemap(override_remap)
   1104 {
   1105 	/*
   1106 	**	Forced infantry overrides from the default.
   1107 	*/
   1108 	IsCrushable = true;
   1109 	IsScanner = true;
   1110 	IsRepairable = false;
   1111 	IsCrew = false;
   1112 	Speed = SPEED_FOOT;
   1113 }
   1114 
   1115 
   1116 /***********************************************************************************************
   1117  * InfantryTypeClass::operator new -- Allocate an infanty type class object.                   *
   1118  *                                                                                             *
   1119  *    This will allocate an infantry type class object from the special memory pool of that    *
   1120  *    purpose.                                                                                 *
   1121  *                                                                                             *
   1122  * INPUT:   none                                                                               *
   1123  *                                                                                             *
   1124  * OUTPUT:  Returns with a pointer to the infantry type class object allocated. If there was   *
   1125  *          insufficient memory to fulfill the request, then NULL is returned.                 *
   1126  *                                                                                             *
   1127  * WARNINGS:   none                                                                            *
   1128  *                                                                                             *
   1129  * HISTORY:                                                                                    *
   1130  *   07/11/1996 JLB : Created.                                                                 *
   1131  *=============================================================================================*/
   1132 void * InfantryTypeClass::operator new(size_t)
   1133 {
   1134 	return(InfantryTypes.Alloc());
   1135 }
   1136 
   1137 
   1138 /***********************************************************************************************
   1139  * InfantryTypeClass::operator delete -- Frees an infantry type class object.                  *
   1140  *                                                                                             *
   1141  *    This will return a previously allocated infantry type class object back to the memory    *
   1142  *    pool from whence it came.                                                                *
   1143  *                                                                                             *
   1144  * INPUT:   pointer  -- The pointer to the infantry type class object to free.                 *
   1145  *                                                                                             *
   1146  * OUTPUT:  none                                                                               *
   1147  *                                                                                             *
   1148  * WARNINGS:   none                                                                            *
   1149  *                                                                                             *
   1150  * HISTORY:                                                                                    *
   1151  *   07/11/1996 JLB : Created.                                                                 *
   1152  *=============================================================================================*/
   1153 void InfantryTypeClass::operator delete(void * pointer)
   1154 {
   1155 	InfantryTypes.Free((InfantryTypeClass *)pointer);
   1156 }
   1157 
   1158 
   1159 /***********************************************************************************************
   1160  * InfantryTypeClass::Init_Heap -- Initialize the infantry type class heap.                    *
   1161  *                                                                                             *
   1162  *    This will pre-allocate all known infantry types.                                         *
   1163  *                                                                                             *
   1164  * INPUT:   none                                                                               *
   1165  *                                                                                             *
   1166  * OUTPUT:  none                                                                               *
   1167  *                                                                                             *
   1168  * WARNINGS:   Call this routine once and before the rules.ini file is processed.              *
   1169  *                                                                                             *
   1170  * HISTORY:                                                                                    *
   1171  *   07/11/1996 JLB : Created.                                                                 *
   1172  *=============================================================================================*/
   1173 void InfantryTypeClass::Init_Heap(void)
   1174 {
   1175 	/*
   1176 	**	These infantry type class objects must be allocated in the exact order that they
   1177 	**	are specified in the InfantryType enumeration. This is necessary because the heap
   1178 	**	allocation block index serves double duty as the type number index.
   1179 	*/
   1180 	new InfantryTypeClass(E1);
   1181 	new InfantryTypeClass(E2);
   1182 	new InfantryTypeClass(E3);
   1183 	new InfantryTypeClass(E4);
   1184 	new InfantryTypeClass(E6);
   1185 	new InfantryTypeClass(E7);
   1186 	new InfantryTypeClass(E8);
   1187 	new InfantryTypeClass(E9);
   1188 	new InfantryTypeClass(Medic);
   1189 	new InfantryTypeClass(General);
   1190 	new InfantryTypeClass(Dog);
   1191 	new InfantryTypeClass(C1);
   1192 	new InfantryTypeClass(C2);
   1193 	new InfantryTypeClass(C3);
   1194 	new InfantryTypeClass(C4);
   1195 	new InfantryTypeClass(C5);
   1196 	new InfantryTypeClass(C6);
   1197 	new InfantryTypeClass(C7);
   1198 	new InfantryTypeClass(C8);
   1199 	new InfantryTypeClass(C9);
   1200 	new InfantryTypeClass(C10);
   1201 	new InfantryTypeClass(Einstein);
   1202 	new InfantryTypeClass(Delphi);
   1203 	new InfantryTypeClass(DrChan);
   1204 #ifdef FIXIT_CSII	//	checked - ajw 9/28/98
   1205 	new InfantryTypeClass(ShockTrooper);
   1206 	new InfantryTypeClass(Mechanic);
   1207 #endif
   1208 }
   1209 
   1210 
   1211 /***********************************************************************************************
   1212  * InfantryTypeClass::Create_One_Of -- Creates an infantry object.                             *
   1213  *                                                                                             *
   1214  *    This creates an infantry object, but does not attempt to place it on the map. It is      *
   1215  *    typically used by the scenario editor when an object is needed, but the location has     *
   1216  *    not yet been specified for where it should appear on the map.                            *
   1217  *                                                                                             *
   1218  * INPUT:   house -- The owner of the infantry object.                                         *
   1219  *                                                                                             *
   1220  * OUTPUT:  Returns with a pointer to the created infantry object. If an object could not be   *
   1221  *          created, then NULL is returned.                                                    *
   1222  *                                                                                             *
   1223  * WARNINGS:   none                                                                            *
   1224  *                                                                                             *
   1225  * HISTORY:                                                                                    *
   1226  *   09/24/1994 JLB : Created.                                                                 *
   1227  *=============================================================================================*/
   1228 ObjectClass * InfantryTypeClass::Create_One_Of(HouseClass * house) const
   1229 {
   1230 	return(new InfantryClass(Type, house->Class->House));
   1231 }
   1232 
   1233 
   1234 /***********************************************************************************************
   1235  * InfantryTypeClass::Create_And_Place -- Creates and places infantry object onto the map.     *
   1236  *                                                                                             *
   1237  *    This routine is used by the scenario editor to create and place an infantry object onto  *
   1238  *    the map at the location specified.                                                       *
   1239  *                                                                                             *
   1240  * INPUT:   cell     -- The cell location to place the infantry object at.                     *
   1241  *                                                                                             *
   1242  *          house    -- The owner of the infantry object.                                      *
   1243  *                                                                                             *
   1244  * OUTPUT:  bool; Was the infantry object successfully created and placed at the location      *
   1245  *                specified?                                                                   *
   1246  *                                                                                             *
   1247  * WARNINGS:   none                                                                            *
   1248  *                                                                                             *
   1249  * HISTORY:                                                                                    *
   1250  *   09/24/1994 JLB : Created.                                                                 *
   1251  *=============================================================================================*/
   1252 bool InfantryTypeClass::Create_And_Place(CELL cell, HousesType house) const
   1253 {
   1254 	InfantryClass * i = new InfantryClass(Type, house);
   1255 	if (i != NULL) {
   1256 		COORDINATE coord = Map[cell].Closest_Free_Spot(Cell_Coord(cell));
   1257 		if (coord) {
   1258 			return(i->Unlimbo(coord, DIR_E));
   1259 		} else {
   1260 			delete i;
   1261 		}
   1262 	}
   1263 	return(false);
   1264 }
   1265 
   1266 
   1267 /***********************************************************************************************
   1268  * InfantryTypeClass::Occupy_List -- Returns with default infantry occupation list.            *
   1269  *                                                                                             *
   1270  *    This routine will return with a cell offset occupation list for a generic infantry       *
   1271  *    object. This is typically just a single cell since infantry are never bigger than one    *
   1272  *    cell and this routine presumes the infantry is located in the center of the cell.        *
   1273  *                                                                                             *
   1274  * INPUT:   placement   -- Is this for placement legality checking only? The normal condition  *
   1275  *                         is for marking occupation flags.                                    *
   1276  *                                                                                             *
   1277  * OUTPUT:  Returns with a cell offset list for the infantry object as if it were located      *
   1278  *          in the center of a cell.                                                           *
   1279  *                                                                                             *
   1280  * WARNINGS:   none                                                                            *
   1281  *                                                                                             *
   1282  * HISTORY:                                                                                    *
   1283  *   09/24/1994 JLB : Created.                                                                 *
   1284  *=============================================================================================*/
   1285 short const * InfantryTypeClass::Occupy_List(bool) const
   1286 {
   1287 	static short const _list[] = {0, REFRESH_EOL};
   1288 
   1289 	return(&_list[0]);
   1290 }
   1291 
   1292 
   1293 #ifdef SCENARIO_EDITOR
   1294 /***********************************************************************************************
   1295  * InfantryTypeClass::Display -- Displays a generic infantry object.                           *
   1296  *                                                                                             *
   1297  *    This routine is used by the scenario editor to display a generic representation of the   *
   1298  *    infantry object for the scenario editor. It simply draws a single (nice profile) view    *
   1299  *    of the infantry type.                                                                    *
   1300  *                                                                                             *
   1301  * INPUT:   x,y      -- The display coordinates to render the infantry object at.              *
   1302  *                                                                                             *
   1303  *          window   -- The window that the display coordinates are relative to.               *
   1304  *                                                                                             *
   1305  *          house    -- The house colors to use when rendering this infantry object.           *
   1306  *                                                                                             *
   1307  * OUTPUT:  none                                                                               *
   1308  *                                                                                             *
   1309  * WARNINGS:   none                                                                            *
   1310  *                                                                                             *
   1311  * HISTORY:                                                                                    *
   1312  *   09/24/1994 JLB : Created.                                                                 *
   1313  *=============================================================================================*/
   1314 void InfantryTypeClass::Display(int x, int y, WindowNumberType window, HousesType house) const
   1315 {
   1316 	if (house != HOUSE_NONE) {
   1317 
   1318 		int shape = 0;
   1319 		void const * ptr = Get_Cameo_Data();
   1320 		if (ptr == NULL) {
   1321 			ptr = Get_Image_Data();
   1322 			shape = 2;
   1323 		}
   1324 
   1325 		CC_Draw_Shape(ptr, shape, x, y, window, SHAPE_NORMAL|SHAPE_CENTER|SHAPE_WIN_REL);
   1326 	}
   1327 }
   1328 
   1329 
   1330 /***********************************************************************************************
   1331  * InfantryTypeClass::Prep_For_Add -- Prepares the scenario editor for adding of infantry object.*
   1332  *                                                                                             *
   1333  *    This routine will prepare the scenario editor so that the infantry objects appear on     *
   1334  *    the object list.                                                                         *
   1335  *                                                                                             *
   1336  * INPUT:   none                                                                               *
   1337  *                                                                                             *
   1338  * OUTPUT:  none                                                                               *
   1339  *                                                                                             *
   1340  * WARNINGS:   none                                                                            *
   1341  *                                                                                             *
   1342  * HISTORY:                                                                                    *
   1343  *   09/24/1994 JLB : Created.                                                                 *
   1344  *=============================================================================================*/
   1345 void InfantryTypeClass::Prep_For_Add(void)
   1346 {
   1347 	for (InfantryType index = INFANTRY_FIRST; index < INFANTRY_COUNT; index++) {
   1348 		Map.Add_To_List(&As_Reference(index));
   1349 	}
   1350 }
   1351 #endif
   1352 
   1353 
   1354 /***********************************************************************************************
   1355  * InfantryTypeClass::From_Name -- Converts an ASCII name into an infantry type number.        *
   1356  *                                                                                             *
   1357  *    This routine is used to convert the infantry ASCII name as specified into an infantry    *
   1358  *    type number. This is called from the INI reader routine in the process if creating the   *
   1359  *    infantry objects needed for the scenario.                                                *
   1360  *                                                                                             *
   1361  * INPUT:   name  -- The ASCII name to convert into an infantry type number.                   *
   1362  *                                                                                             *
   1363  * OUTPUT:  Returns with the infantry type number that corresponds to the infantry ASCII name  *
   1364  *          specified. If no match could be found, then INFANTRY_NONE is returned.             *
   1365  *                                                                                             *
   1366  * WARNINGS:   none                                                                            *
   1367  *                                                                                             *
   1368  * HISTORY:                                                                                    *
   1369  *   09/24/1994 JLB : Created.                                                                 *
   1370  *=============================================================================================*/
   1371 InfantryType InfantryTypeClass::From_Name(char const * name)
   1372 {
   1373 	if (name != NULL) {
   1374 		for (InfantryType classid = INFANTRY_FIRST; classid < INFANTRY_COUNT; classid++) {
   1375 			if (stricmp(As_Reference(classid).IniName, name) == 0) {
   1376 				return(classid);
   1377 			}
   1378 		}
   1379 	}
   1380 	return(INFANTRY_NONE);
   1381 }
   1382 
   1383 
   1384 /***********************************************************************************************
   1385  * InfantryTypeClass::One_Time -- Performs any one time processing for infantry system.        *
   1386  *                                                                                             *
   1387  *    This routine will perform one time processing for the infantry type system. This is      *
   1388  *    generally restricted to loading of the infantry shape data.                              *
   1389  *                                                                                             *
   1390  * INPUT:   none                                                                               *
   1391  *                                                                                             *
   1392  * OUTPUT:  none                                                                               *
   1393  *                                                                                             *
   1394  * WARNINGS:   none                                                                            *
   1395  *                                                                                             *
   1396  * HISTORY:                                                                                    *
   1397  *   09/24/1994 JLB : Created.                                                                 *
   1398  *=============================================================================================*/
   1399 void InfantryTypeClass::One_Time(void)
   1400 {
   1401 	for (InfantryType index = INFANTRY_FIRST; index < INFANTRY_COUNT; index++) {
   1402 		char fullname[_MAX_FNAME+_MAX_EXT];
   1403 		InfantryTypeClass	const * uclass;
   1404 		CCFileClass	file;
   1405 
   1406 		uclass = &As_Reference(index);
   1407 
   1408 		/*
   1409 		**	Generic shape for all houses load method.
   1410 		*/
   1411 		_makepath(fullname, NULL, NULL, uclass->Graphic_Name(), ".SHP");
   1412 
   1413 		#ifndef NDEBUG
   1414 			RawFileClass sfile(fullname);
   1415 			if (sfile.Is_Available()) {
   1416 				((void const *&)uclass->ImageData) = Load_Alloc_Data(sfile);
   1417 			} else {
   1418 				((void const *&)uclass->ImageData) = MFCD::Retrieve(fullname);
   1419 			}
   1420 		#else
   1421 			((void const *&)uclass->ImageData) = MFCD::Retrieve(fullname);
   1422 		#endif
   1423 
   1424 		/*
   1425 		**	The small build image icon sized shapes are always generic.
   1426 		*/
   1427 		char buffer[_MAX_FNAME];
   1428 		sprintf(buffer, "%.4sICON", uclass->Graphic_Name());
   1429 		_makepath(fullname, NULL, NULL, buffer, ".SHP");
   1430 
   1431 		#ifndef NDEBUG
   1432 			RawFileClass ifile(fullname);
   1433 			if (ifile.Is_Available()) {
   1434 				((void const *&)uclass->CameoData) = Load_Alloc_Data(ifile);
   1435 			} else {
   1436 				((void const *&)uclass->CameoData) = MFCD::Retrieve(fullname);
   1437 			}
   1438 		#else
   1439 			((void const *&)uclass->CameoData) = MFCD::Retrieve(fullname);
   1440 		#endif
   1441 	}
   1442 }
   1443 
   1444 
   1445 /***********************************************************************************************
   1446  * InfantryTypeClass::Full_Name -- Fetches the full name text number.                          *
   1447  *                                                                                             *
   1448  *    This routine will fetch the full name text number for this infantry type. It examines    *
   1449  *    the special custom name flag to determine whether the custom name or the generic name    *
   1450  *    is to be used.                                                                           *
   1451  *                                                                                             *
   1452  * INPUT:   none                                                                               *
   1453  *                                                                                             *
   1454  * OUTPUT:  Returns with text number for the name to give this infantry type object.           *
   1455  *                                                                                             *
   1456  * WARNINGS:   none                                                                            *
   1457  *                                                                                             *
   1458  * HISTORY:                                                                                    *
   1459  *   06/29/1995 JLB : Created.                                                                 *
   1460  *=============================================================================================*/
   1461 int InfantryTypeClass::Full_Name(void) const
   1462 {
   1463 	if (Debug_Map || !IsNominal || Rule.IsNamed || Type == INFANTRY_C10 || Type == INFANTRY_DELPHI || Type == INFANTRY_EINSTEIN) {
   1464 		return(TechnoTypeClass::Full_Name());
   1465 	}
   1466 	return(TXT_CIVILIAN);
   1467 }
   1468 
   1469 
   1470 /***********************************************************************************************
   1471  * InfantryTypeClass::As_Reference -- Fetches a reference to the infantry type specified.      *
   1472  *                                                                                             *
   1473  *    Use this routine to convert an infantry type number into a reference to the infantry     *
   1474  *    type class object it represents.                                                         *
   1475  *                                                                                             *
   1476  * INPUT:   type  -- The infantry type number to convert into a infantry type class object.    *
   1477  *                                                                                             *
   1478  * OUTPUT:  Returns with a reference to the infantry type class object specified.              *
   1479  *                                                                                             *
   1480  * WARNINGS:   Be sure that the type parameter is legal, otherwise the results are undefined.  *
   1481  *                                                                                             *
   1482  * HISTORY:                                                                                    *
   1483  *   07/11/1996 JLB : Created.                                                                 *
   1484  *=============================================================================================*/
   1485 InfantryTypeClass & InfantryTypeClass::As_Reference(InfantryType type)
   1486 {
   1487 	return(*InfantryTypes.Ptr(type));
   1488 }
   1489 
   1490 
   1491 /***********************************************************************************************
   1492  * InfantryTypeClass::Read_INI -- Fetches infantry override values from the INI database.      *
   1493  *                                                                                             *
   1494  *    This routine will retrieve the override values for this infantry type class object from  *
   1495  *    the INI database specified.                                                              *
   1496  *                                                                                             *
   1497  * INPUT:   ini   -- Reference to the INI database to retrieve the data from.                  *
   1498  *                                                                                             *
   1499  * OUTPUT:  bool; Was the infantry section for this type found and data retrieved from it?     *
   1500  *                                                                                             *
   1501  * WARNINGS:   none                                                                            *
   1502  *                                                                                             *
   1503  * HISTORY:                                                                                    *
   1504  *   07/19/1996 JLB : Created.                                                                 *
   1505  *=============================================================================================*/
   1506 bool InfantryTypeClass::Read_INI(CCINIClass & ini)
   1507 {
   1508 	if (TechnoTypeClass::Read_INI(ini)) {
   1509 		IsFraidyCat = ini.Get_Bool(Name(), "Fraidycat", IsFraidyCat);
   1510 		IsCapture = ini.Get_Bool(Name(), "Infiltrate", IsCapture);
   1511 		IsBomber = ini.Get_Bool(Name(), "C4", IsBomber);
   1512 		IsDog = ini.Get_Bool(Name(), "IsCanine", IsDog);
   1513 		if (IsBomber) IsCapture = true;
   1514 		if (IsDog) IsLeader = false;
   1515 		return(true);
   1516 	}
   1517 	return(false);
   1518 }
   1519 
   1520 
   1521 void InfantryTypeClass::Dimensions(int & width, int & height) const
   1522 {
   1523 #ifdef WIN32
   1524 	width = 14;
   1525 	height = 20;
   1526 #else
   1527 	width = 12;
   1528 	height = 16;
   1529 #endif
   1530 }