CnC_Remastered_Collection/REDALERT/IDATA.CPP

1530 lines
66 KiB
C++

//
// Copyright 2020 Electronic Arts Inc.
//
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is free
// software: you can redistribute it and/or modify it under the terms of
// the GNU General Public License as published by the Free Software Foundation,
// either version 3 of the License, or (at your option) any later version.
// TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
// in the hope that it will be useful, but with permitted additional restrictions
// under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
// distributed with this program. You should have received a copy of the
// GNU General Public License along with permitted additional restrictions
// with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
/* $Header: /CounterStrike/IDATA.CPP 3 3/16/97 10:16p Joe_b $ */
/***********************************************************************************************
*** 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 : July 19, 1996 [JLB] *
* *
*---------------------------------------------------------------------------------------------*
* Functions: *
* InfantryTypeClass::As_Reference -- Fetches a reference to the infantry type specified. *
* 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::Init_Heap -- Initialize the infantry type class heap. *
* 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 obj*
* InfantryTypeClass::Read_INI -- Fetches infantry override values from the INI database. *
* InfantryTypeClass::operator delete -- Frees an infantry type class object. *
* InfantryTypeClass::operator new -- Allocate an infanty type class object. *
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include "function.h"
#include "type.h"
static DoInfoStruct DogDoControls[DO_COUNT] = {
{0, 1, 1}, // DO_STAND_READY
{0, 1, 1}, // DO_STAND_GUARD
{0, 1, 1}, // DO_PRONE // NA
{8, 6, 6}, // DO_WALK
{104, 14,14}, // DO_FIRE_WEAPON
{0, 0, 0}, // DO_LIE_DOWN // NA
{56, 6, 6}, // DO_CRAWL
{0, 0, 0}, // DO_GET_UP
{104, 14,14}, // DO_FIRE_PRONE
{216, 18,0}, // DO_IDLE1
{216, 18,0}, // DO_IDLE2
{235, 7, 0}, // DO_GUN_DEATH
{242, 9, 0}, // DO_EXPLOSION_DEATH
{242, 9, 0}, // DO_EXPLOSION2_DEATH
{242, 9, 0}, // DO_GRENADE_DEATH
{251, 14,0}, // DO_FIRE_DEATH
{0, 1, 0}, // DO_GESTURE1
{0, 1, 0}, // DO_SALUTE1
{0, 1, 0}, // DO_GESTURE2
{0, 1, 0}, // DO_SALUTE2
{106, 12,14}, // DO_DOG_MAUL
};
//
// 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
//
static DoInfoStruct E1DoControlsVirtual[DO_COUNT] = {
{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
{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, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct E2DoControlsVirtual[DO_COUNT] = {
{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
{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, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct E3DoControlsVirtual[DO_COUNT] = {
{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
{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, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct E4DoControlsVirtual[DO_COUNT] = {
{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
{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, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct E1DoControls[DO_COUNT] = {
{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
{382-94, 8, 0}, // DO_GUN_DEATH
{398-94, 8, 0}, // DO_EXPLOSION_DEATH
{398-94, 8, 0}, // DO_EXPLOSION2_DEATH
{406-94, 12,0}, // DO_GRENADE_DEATH
{418-94, 18,0}, // DO_FIRE_DEATH
{436-94, 3, 3}, // DO_GESTURE1
{460-94, 3, 3}, // DO_SALUTE1
{484-94, 3, 3}, // DO_GESTURE2
{508-94, 3, 3}, // DO_SALUTE2
{0, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct E2DoControls[DO_COUNT] = {
{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
{510-94, 8, 0}, // DO_GUN_DEATH
{526-94, 8, 0}, // DO_EXPLOSION_DEATH
{526-94, 8, 0}, // DO_EXPLOSION2_DEATH
{534-94, 12,0}, // DO_GRENADE_DEATH
{546-94, 18,0}, // DO_FIRE_DEATH
{564-94, 3, 3}, // DO_GESTURE1
{588-94, 3, 3}, // DO_SALUTE1
{612-94, 3, 3}, // DO_GESTURE2
{636-94, 3, 3}, // DO_SALUTE2
{0, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct E3DoControls[DO_COUNT] = {
{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
{398-94, 8, 0}, // DO_GUN_DEATH
{414-94, 8, 0}, // DO_EXPLOSION_DEATH
{414-94, 8, 0}, // DO_EXPLOSION2_DEATH
{422-94, 12,0}, // DO_GRENADE_DEATH
{434-94, 18,0}, // DO_FIRE_DEATH
{452-94, 3, 3}, // DO_GESTURE1
{476-94, 3, 3}, // DO_SALUTE1
{500-94, 3, 3}, // DO_GESTURE2
{524-94, 3, 3}, // DO_SALUTE2
{0, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct E4DoControls[DO_COUNT] = {
{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
{510-94, 8, 0}, // DO_GUN_DEATH
{526-94, 8, 0}, // DO_EXPLOSION_DEATH
{526-94, 8, 0}, // DO_EXPLOSION2_DEATH
{534-94, 12,0}, // DO_GRENADE_DEATH
{546-94, 18,0}, // DO_FIRE_DEATH
{564-94, 3, 3}, // DO_GESTURE1
{588-94, 3, 3}, // DO_SALUTE1
{612-94, 3, 3}, // DO_GESTURE2
{636-94, 3, 3}, // DO_SALUTE2
{0, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct E6DoControls[DO_COUNT] = {
{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
{130, 16,0}, // DO_IDLE2
{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, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct E7DoControls[DO_COUNT] = {
{0, 1, 1}, // DO_STAND_READY
{0, 1, 1}, // DO_STAND_GUARD
{128, 1, 4}, // DO_PRONE
{8, 6, 6}, // DO_WALK
{56, 7, 7}, // DO_FIRE_WEAPON
{113, 2, 2}, // DO_LIE_DOWN
{128, 4, 4}, // DO_CRAWL
{161, 2, 2}, // DO_GET_UP
{176, 7, 7}, // DO_FIRE_PRONE
{232, 17,0}, // DO_IDLE1
{249, 13,0}, // DO_IDLE2
{262, 8, 0}, // DO_GUN_DEATH
{270, 8, 0}, // DO_EXPLOSION_DEATH
{278, 8, 0}, // DO_EXPLOSION2_DEATH
{286, 12,0}, // DO_GRENADE_DEATH
{298, 18,0}, // DO_FIRE_DEATH
{0, 1, 0}, // DO_GESTURE1
{0, 1, 0}, // DO_SALUTE1
{0, 1, 0}, // DO_GESTURE2
{0, 1, 0}, // DO_SALUTE2
{0, 0, 0}, // DO_DOG_MAUL // N/A
};
//Spy
static DoInfoStruct SpyDoControls[DO_COUNT] = {
{0, 1, 1}, // DO_STAND_READY
{8, 1, 1}, // DO_STAND_GUARD
{144, 1, 4}, // 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, 8, 8}, // DO_FIRE_PRONE
{256, 14,0}, // DO_IDLE1
{270, 18,0}, // DO_IDLE2
{288, 8, 0}, // DO_GUN_DEATH
{296, 8, 0}, // DO_EXPLOSION_DEATH
{304, 8, 0}, // DO_EXPLOSION2_DEATH
{312, 12,0}, // DO_GRENADE_DEATH
{324, 18,0}, // DO_FIRE_DEATH
{0, 1, 0}, // DO_GESTURE1
{0, 1, 0}, // DO_SALUTE1
{0, 1, 0}, // DO_GESTURE2
{0, 1, 0}, // DO_SALUTE2
{0, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct E9DoControls[DO_COUNT] = {
{0, 1, 1}, // DO_STAND_READY
{8, 1, 1}, // DO_STAND_GUARD
{72, 1, 4}, // DO_PRONE
{8, 6, 6}, // DO_WALK
{0, 0, 0}, // DO_FIRE_WEAPON
{56, 2, 2}, // DO_LIE_DOWN
{72, 4, 4}, // DO_CRAWL
{108, 2, 2}, // DO_GET_UP
{0, 0, 0}, // DO_FIRE_PRONE
{120, 19,0}, // DO_IDLE1
{120, 19,0}, // DO_IDLE2
{139, 8, 0}, // DO_GUN_DEATH
{147, 8, 0}, // DO_EXPLOSION_DEATH
{155, 8, 0}, // DO_EXPLOSION2_DEATH
{163, 12,0}, // DO_GRENADE_DEATH
{175, 18,0}, // DO_FIRE_DEATH
{0, 1, 0}, // DO_GESTURE1
{0, 1, 0}, // DO_SALUTE1
{0, 1, 0}, // DO_GESTURE2
{0, 1, 0}, // DO_SALUTE2
{0, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct MedicDoControls[DO_COUNT] = {
{0, 1, 1}, // DO_STAND_READY
{0, 1, 1}, // DO_STAND_GUARD
{130, 1, 4}, // DO_PRONE
{8, 6, 6}, // DO_WALK
{56, 28,0}, // DO_FIRE_WEAPON
{114, 2, 2}, // DO_LIE_DOWN
{130, 4, 4}, // DO_CRAWL
{162, 2, 2}, // DO_GET_UP
{56, 28,0}, // DO_FIRE_PRONE
{178, 15,0}, // DO_IDLE1
{178, 15,0}, // DO_IDLE2
{193, 8, 0}, // DO_GUN_DEATH
{210, 8, 0}, // DO_EXPLOSION_DEATH
{202, 8, 0}, // DO_EXPLOSION2_DEATH
{217, 12,0}, // DO_GRENADE_DEATH
{229, 18,0}, // DO_FIRE_DEATH
{0, 1, 0}, // DO_GESTURE1
{0, 1, 0}, // DO_SALUTE1
{0, 1, 0}, // DO_GESTURE2
{0, 1, 0}, // DO_SALUTE2
{0, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct GeneralDoControls[DO_COUNT] = {
{0, 1, 1}, // DO_STAND_READY
{0, 1, 1}, // DO_STAND_GUARD
{104, 1, 4}, // DO_PRONE
{8, 6, 6}, // DO_WALK
{56, 4, 4}, // DO_FIRE_WEAPON
{88, 2, 2}, // DO_LIE_DOWN
{104, 4, 4}, // DO_CRAWL
{136, 2, 2}, // DO_GET_UP
{152, 4, 4}, // DO_FIRE_PRONE
{184, 26,0}, // DO_IDLE1
{184, 26,0}, // DO_IDLE2
{210, 8, 0}, // DO_GUN_DEATH
{226, 8, 0}, // DO_EXPLOSION_DEATH
{218, 8, 0}, // DO_EXPLOSION2_DEATH
{234, 12,0}, // DO_GRENADE_DEATH
{246, 18,0}, // DO_FIRE_DEATH
{0, 1, 0}, // DO_GESTURE1
{0, 1, 0}, // DO_SALUTE1
{0, 1, 0}, // DO_GESTURE2
{0, 1, 0}, // DO_SALUTE2
{0, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct CivilianDoControls[DO_COUNT] = {
{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-85, 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-85, 4, 4}, // DO_FIRE_PRONE
{189-85, 10,0}, // DO_IDLE1
{199-85, 6, 0}, // DO_IDLE2
{152, 8, 0}, // DO_GUN_DEATH
{160, 8, 0}, // DO_EXPLOSION_DEATH
{160, 8, 0}, // DO_EXPLOSION2_DEATH
{168, 12,0}, // DO_GRENADE_DEATH
{180, 18,0}, // DO_FIRE_DEATH
{0, 1, 0}, // DO_GESTURE1 // N/A
{0, 1, 0}, // DO_SALUTE1 // N/A
{0, 1, 0}, // DO_GESTURE2 // N/A
{0, 1, 0}, // DO_SALUTE2 // N/A
{0, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct CivilianDoControlsVirtual[DO_COUNT] = {
{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
{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, 1, 0}, // DO_GESTURE1 // N/A
{0, 1, 0}, // DO_SALUTE1 // N/A
{0, 1, 0}, // DO_GESTURE2 // N/A
{0, 1, 0}, // DO_SALUTE2 // N/A
{0, 0, 0}, // DO_DOG_MAUL // N/A
};
static DoInfoStruct EinsteinDoControls[DO_COUNT] = {
{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-92, 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
{104, 16,0}, // DO_IDLE2
{212-92, 8, 0}, // DO_GUN_DEATH
{220-92, 8, 0}, // DO_EXPLOSION_DEATH
{228-92, 12,0}, // DO_EXPLOSION2_DEATH
{228-92, 12,0}, // DO_GRENADE_DEATH
{240-92, 17,0}, // DO_FIRE_DEATH
{0, 1, 0}, // DO_GESTURE1 // N/A
{0, 1, 0}, // DO_SALUTE1 // N/A
{0, 1, 0}, // DO_GESTURE2 // N/A
{0, 1, 0}, // DO_SALUTE2 // N/A
{0, 0, 0}, // DO_DOG_MAUL // N/A
};
// Attack dogs
static InfantryTypeClass const Dog(
INFANTRY_DOG, // Infantry type number.
TXT_GUARD_DOG, // Translate name number for infantry type.
"DOG", // INI name for infantry.
0x0015, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
false, // Is this a civilian?
false, // Does this unit use the override remap table?
false, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_FULL, // Transport pip shape/color to use.
DogDoControls,
DogDoControls,
1, // Frame of projectile launch.
1, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
// Minigunners
static InfantryTypeClass const E1(
INFANTRY_E1, // Infantry type number.
TXT_E1, // Translate name number for infantry type.
"E1", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
true, // Has crawling animation frames?
false, // Is this a civilian?
false, // Does this unit use the override remap table?
false, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_FULL, // Transport pip shape/color to use.
E1DoControls,
E1DoControlsVirtual,
2, // Frame of projectile launch.
2, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
// Grenadiers
static InfantryTypeClass const E2(
INFANTRY_E2, // Infantry type number.
TXT_E2, // Translate name number for infantry type.
"E2", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
true, // Has crawling animation frames?
false, // Is this a civilian?
false, // Does this unit use the override remap table?
false, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_FULL, // Transport pip shape/color to use.
E2DoControls,
E2DoControlsVirtual,
14, // Frame of projectile launch.
6, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
// Bazooka
static InfantryTypeClass const E3(
INFANTRY_E3, // Infantry type number.
TXT_E3, // Translate name number for infantry type.
"E3", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
true, // Has crawling animation frames?
false, // Is this a civilian?
false, // Does this unit use the override remap table?
false, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_FULL, // Transport pip shape/color to use.
E3DoControls,
E3DoControlsVirtual,
3, // Frame of projectile launch.
3, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
// Flamethrower
static InfantryTypeClass const E4(
INFANTRY_E4, // Infantry type number.
TXT_E4, // Translate name number for infantry type.
"E4", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
true, // Has crawling animation frames?
false, // Is this a civilian?
false, // Does this unit use the override remap table?
false, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_FULL, // Transport pip shape/color to use.
E4DoControls,
E4DoControlsVirtual,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
// Renovator
static InfantryTypeClass const E6(
INFANTRY_RENOVATOR, // Infantry type number.
TXT_E6, // Translate name number for infantry type.
"E6", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
false, // Is this a civilian?
false, // Does this unit use the override remap table?
false, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_ENGINEER, // Transport pip shape/color to use.
E6DoControls,
E6DoControls,
3, // Frame of projectile launch.
3, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
// Spy
static InfantryTypeClass const E8(
INFANTRY_SPY, // Infantry type number.
TXT_E8, // Translate name number for infantry type.
"SPY", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
false, // Is this a civilian?
false, // Does this unit use the override remap table?
false, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_ENGINEER, // Transport pip shape/color to use.
SpyDoControls,
SpyDoControls,
3, // Frame of projectile launch.
3, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
// Thief
static InfantryTypeClass const E9(
INFANTRY_THIEF, // Infantry type number.
TXT_THIEF, // Translate name number for infantry type.
"THF", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
false, // Is this a civilian?
false, // Does this unit use the override remap table?
false, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_ENGINEER, // Transport pip shape/color to use.
E9DoControls,
E9DoControls,
3, // Frame of projectile launch.
3, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
// Tanya
static InfantryTypeClass const E7(
INFANTRY_TANYA, // Infantry type number.
TXT_E7, // Translate name number for infantry type.
"E7", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
true, // Has crawling animation frames?
false, // Is this a civilian?
false, // Does this unit use the override remap table?
false, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_COMMANDO, // Transport pip shape/color to use.
E7DoControls,
E7DoControls,
2, // Frame of projectile launch.
2, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
static InfantryTypeClass const Medic(
INFANTRY_MEDIC, // Infantry type number.
TXT_MEDIC, // Translate name number for infantry type.
"MEDI", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
true, // Has crawling animation frames?
false, // Is this a civilian?
false, // Does this unit use the override remap table?
false, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_ENGINEER, // Transport pip shape/color to use.
MedicDoControls,
MedicDoControls,
25, // Frame of projectile launch.
25, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
static InfantryTypeClass const General(
INFANTRY_GENERAL, // Infantry type number.
TXT_GENERAL, // Translate name number for infantry type.
"GNRL", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
true, // Has crawling animation frames?
false, // Is this a civilian?
false, // Does this unit use the override remap table?
false, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_ENGINEER, // Transport pip shape/color to use.
GeneralDoControls,
GeneralDoControls,
2, // Frame of projectile launch.
2, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
// Civilians
static InfantryTypeClass const C1(
INFANTRY_C1, // Infantry type number.
TXT_C1, // Translate name number for infantry type.
"C1", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
true, // Is this a civilian?
false, // Does this unit use the override remap table?
true, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_CIVILIAN, // Transport pip shape/color to use.
CivilianDoControls,
CivilianDoControlsVirtual,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
static InfantryTypeClass const C2(
INFANTRY_C2, // Infantry type number.
TXT_C2, // Translate name number for infantry type.
"C2", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
true, // Is this a civilian?
true, // Does this unit use the override remap table?
true, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_CIVILIAN, // Transport pip shape/color to use.
CivilianDoControls,
CivilianDoControlsVirtual,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
RemapCiv2 // pointer to override remap table
);
static InfantryTypeClass const C3(
INFANTRY_C3, // Infantry type number.
TXT_C3, // Translate name number for infantry type.
"C3", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
true, // Is this a female type?
false, // Has crawling animation frames?
true, // Is this a civilian?
false, // Does this unit use the override remap table?
true, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_CIVILIAN, // Transport pip shape/color to use.
CivilianDoControls,
CivilianDoControlsVirtual,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
static InfantryTypeClass const C4(
INFANTRY_C4, // Infantry type number.
TXT_C4, // Translate name number for infantry type.
"C4", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
true, // Is this a female type?
false, // Has crawling animation frames?
true, // Is this a civilian?
true, // Does this unit use the override remap table?
true, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_CIVILIAN, // Transport pip shape/color to use.
CivilianDoControls,
CivilianDoControlsVirtual,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
RemapCiv4 // pointer to override remap table
);
static InfantryTypeClass const C5(
INFANTRY_C5, // Infantry type number.
TXT_C5, // Translate name number for infantry type.
"C5", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
true, // Is this a civilian?
true, // Does this unit use the override remap table?
true, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_CIVILIAN, // Transport pip shape/color to use.
CivilianDoControls,
CivilianDoControlsVirtual,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
RemapCiv5 // pointer to override remap table
);
static InfantryTypeClass const C6(
INFANTRY_C6, // Infantry type number.
TXT_C6, // Translate name number for infantry type.
"C6", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
true, // Is this a civilian?
true, // Does this unit use the override remap table?
true, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_CIVILIAN, // Transport pip shape/color to use.
CivilianDoControls,
CivilianDoControlsVirtual,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
RemapCiv6 // pointer to override remap table
);
static InfantryTypeClass const C7(
INFANTRY_C7, // Infantry type number.
TXT_C7, // Translate name number for infantry type.
"C7", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
true, // Is this a civilian?
true, // Does this unit use the override remap table?
true, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_CIVILIAN, // Transport pip shape/color to use.
CivilianDoControls,
CivilianDoControlsVirtual,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
RemapCiv7 // pointer to override remap table
);
static InfantryTypeClass const C8(
INFANTRY_C8, // Infantry type number.
TXT_C8, // Translate name number for infantry type.
"C8", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
true, // Is this a civilian?
true, // Does this unit use the override remap table?
true, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_CIVILIAN, // Transport pip shape/color to use.
CivilianDoControls,
CivilianDoControlsVirtual,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
RemapCiv8 // pointer to override remap table
);
static InfantryTypeClass const C9(
INFANTRY_C9, // Infantry type number.
TXT_C9, // Translate name number for infantry type.
"C9", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
true, // Is this a civilian?
true, // Does this unit use the override remap table?
true, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_CIVILIAN, // Transport pip shape/color to use.
CivilianDoControls,
CivilianDoControlsVirtual,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
RemapCiv9 // pointer to override remap table
);
// Nikoomba
static InfantryTypeClass const C10(
INFANTRY_C10, // Infantry type number.
TXT_C10, // Translate name number for infantry type.
"C10", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
true, // Is this a civilian?
true, // Does this unit use the override remap table?
true, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_ENGINEER, // Transport pip shape/color to use.
CivilianDoControls,
CivilianDoControlsVirtual,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
RemapCiv10 // pointer to override remap table
);
static InfantryTypeClass const Einstein(
INFANTRY_EINSTEIN, // Infantry type number.
TXT_EINSTEIN, // Translate name number for infantry type.
"EINSTEIN", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
true, // Is this a civilian?
false, // Does this unit use the override remap table?
true, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_ENGINEER, // Transport pip shape/color to use.
EinsteinDoControls,
EinsteinDoControls,
0, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
static InfantryTypeClass const Delphi(
INFANTRY_DELPHI, // Infantry type number.
TXT_DELPHI, // Translate name number for infantry type.
"DELPHI", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
true, // Is this a civilian?
false, // Does this unit use the override remap table?
true, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_ENGINEER, // Transport pip shape/color to use.
CivilianDoControls,
CivilianDoControlsVirtual,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
static InfantryTypeClass const DrChan(
INFANTRY_CHAN, // Infantry type number.
TXT_CHAN, // Translate name number for infantry type.
"CHAN", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
false, // Has crawling animation frames?
true, // Is this a civilian?
false, // Does this unit use the override remap table?
true, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_ENGINEER, // Transport pip shape/color to use.
EinsteinDoControls,
EinsteinDoControls,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
#ifdef FIXIT_CSII // checked - ajw 9/28/98
// Shock Trooper
static InfantryTypeClass const ShockTrooper(
INFANTRY_SHOCK, // Infantry type number.
TXT_SHOCKTROOPER, // Translate name number for infantry type.
"SHOK", // INI name for infantry.
-0x0010, // Vertical offset.
0x0038, // Primary weapon offset along turret centerline.
false, // Is this a female type?
true, // Has crawling animation frames?
false, // Is this a civilian?
false, // Does this unit use the override remap table?
false, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_FULL, // Transport pip shape/color to use.
E4DoControls,
E4DoControls,
2, // Frame of projectile launch.
0, // Frame of projectile launch while prone.
0, // pointer to override remap table
0x0018 // Horizontal offset.
);
static InfantryTypeClass const Mechanic(
INFANTRY_MECHANIC, // Infantry type number.
TXT_MECHANIC, // Translate name number for infantry type.
"MECH", // INI name for infantry.
0x0035, // Vertical offset.
0x0010, // Primary weapon offset along turret centerline.
false, // Is this a female type?
true, // Has crawling animation frames?
false, // Is this a civilian?
false, // Does this unit use the override remap table?
false, // Always use the given name for the infantry?
false, // Theater specific graphic image?
PIP_ENGINEER, // Transport pip shape/color to use.
MedicDoControls,
MedicDoControls,
25, // Frame of projectile launch.
25, // Frame of projectile launch while prone.
0 // pointer to override remap table
);
#endif
/***********************************************************************************************
* 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. *
* 02/16/1996 JLB : Greatly simplified. *
*=============================================================================================*/
InfantryTypeClass::InfantryTypeClass (
InfantryType type,
int name,
char const * ininame,
int verticaloffset,
int primaryoffset,
bool is_female,
bool is_crawling,
bool is_civilian,
bool is_remap_override,
bool is_nominal,
bool is_theater,
PipEnum pip,
DoInfoStruct const * control,
DoInfoStruct const * virtual_control,
int firelaunch,
int pronelaunch,
unsigned char const * override_remap,
int horizontaloffset)
: TechnoTypeClass(RTTI_INFANTRYTYPE,
int(type),
name,
ininame,
REMAP_NORMAL,
verticaloffset,
primaryoffset,
0x0000,
0x0000,
0x0000,
is_nominal,
true,
true,
true,
false,
false,
is_theater,
false,
true,
true,
8,
SPEED_FOOT,
horizontaloffset),
IsFemale(is_female),
IsCrawling(is_crawling),
IsCapture(false),
IsFraidyCat(false),
IsCivilian(is_civilian),
IsBomber(false),
IsDog(false),
IsRemapOverride(is_remap_override),
Type(type),
Pip(pip),
DoControls(control),
DoControlsVirtual(virtual_control),
FireLaunch(firelaunch),
ProneLaunch(pronelaunch),
OverrideRemap(override_remap)
{
/*
** Forced infantry overrides from the default.
*/
IsCrushable = true;
IsScanner = true;
IsRepairable = false;
IsCrew = false;
Speed = SPEED_FOOT;
}
/***********************************************************************************************
* InfantryTypeClass::operator new -- Allocate an infanty type class object. *
* *
* This will allocate an infantry type class object from the special memory pool of that *
* purpose. *
* *
* INPUT: none *
* *
* OUTPUT: Returns with a pointer to the infantry type class object allocated. If there was *
* insufficient memory to fulfill the request, then NULL is returned. *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/11/1996 JLB : Created. *
*=============================================================================================*/
void * InfantryTypeClass::operator new(size_t)
{
return(InfantryTypes.Alloc());
}
/***********************************************************************************************
* InfantryTypeClass::operator delete -- Frees an infantry type class object. *
* *
* This will return a previously allocated infantry type class object back to the memory *
* pool from whence it came. *
* *
* INPUT: pointer -- The pointer to the infantry type class object to free. *
* *
* OUTPUT: none *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/11/1996 JLB : Created. *
*=============================================================================================*/
void InfantryTypeClass::operator delete(void * pointer)
{
InfantryTypes.Free((InfantryTypeClass *)pointer);
}
/***********************************************************************************************
* InfantryTypeClass::Init_Heap -- Initialize the infantry type class heap. *
* *
* This will pre-allocate all known infantry types. *
* *
* INPUT: none *
* *
* OUTPUT: none *
* *
* WARNINGS: Call this routine once and before the rules.ini file is processed. *
* *
* HISTORY: *
* 07/11/1996 JLB : Created. *
*=============================================================================================*/
void InfantryTypeClass::Init_Heap(void)
{
/*
** These infantry type class objects must be allocated in the exact order that they
** are specified in the InfantryType enumeration. This is necessary because the heap
** allocation block index serves double duty as the type number index.
*/
new InfantryTypeClass(E1);
new InfantryTypeClass(E2);
new InfantryTypeClass(E3);
new InfantryTypeClass(E4);
new InfantryTypeClass(E6);
new InfantryTypeClass(E7);
new InfantryTypeClass(E8);
new InfantryTypeClass(E9);
new InfantryTypeClass(Medic);
new InfantryTypeClass(General);
new InfantryTypeClass(Dog);
new InfantryTypeClass(C1);
new InfantryTypeClass(C2);
new InfantryTypeClass(C3);
new InfantryTypeClass(C4);
new InfantryTypeClass(C5);
new InfantryTypeClass(C6);
new InfantryTypeClass(C7);
new InfantryTypeClass(C8);
new InfantryTypeClass(C9);
new InfantryTypeClass(C10);
new InfantryTypeClass(Einstein);
new InfantryTypeClass(Delphi);
new InfantryTypeClass(DrChan);
#ifdef FIXIT_CSII // checked - ajw 9/28/98
new InfantryTypeClass(ShockTrooper);
new InfantryTypeClass(Mechanic);
#endif
}
/***********************************************************************************************
* 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 != NULL) {
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 == NULL) {
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 != NULL) {
for (InfantryType classid = INFANTRY_FIRST; classid < INFANTRY_COUNT; classid++) {
if (stricmp(As_Reference(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)
{
for (InfantryType 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->Graphic_Name(), ".SHP");
#ifndef NDEBUG
RawFileClass sfile(fullname);
if (sfile.Is_Available()) {
((void const *&)uclass->ImageData) = Load_Alloc_Data(sfile);
} else {
((void const *&)uclass->ImageData) = MFCD::Retrieve(fullname);
}
#else
((void const *&)uclass->ImageData) = MFCD::Retrieve(fullname);
#endif
/*
** The small build image icon sized shapes are always generic.
*/
char buffer[_MAX_FNAME];
sprintf(buffer, "%.4sICON", uclass->Graphic_Name());
_makepath(fullname, NULL, NULL, buffer, ".SHP");
#ifndef NDEBUG
RawFileClass ifile(fullname);
if (ifile.Is_Available()) {
((void const *&)uclass->CameoData) = Load_Alloc_Data(ifile);
} else {
((void const *&)uclass->CameoData) = MFCD::Retrieve(fullname);
}
#else
((void const *&)uclass->CameoData) = MFCD::Retrieve(fullname);
#endif
}
}
/***********************************************************************************************
* 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 || Rule.IsNamed || Type == INFANTRY_C10 || Type == INFANTRY_DELPHI || Type == INFANTRY_EINSTEIN) {
return(TechnoTypeClass::Full_Name());
}
return(TXT_CIVILIAN);
}
/***********************************************************************************************
* InfantryTypeClass::As_Reference -- Fetches a reference to the infantry type specified. *
* *
* Use this routine to convert an infantry type number into a reference to the infantry *
* type class object it represents. *
* *
* INPUT: type -- The infantry type number to convert into a infantry type class object. *
* *
* OUTPUT: Returns with a reference to the infantry type class object specified. *
* *
* WARNINGS: Be sure that the type parameter is legal, otherwise the results are undefined. *
* *
* HISTORY: *
* 07/11/1996 JLB : Created. *
*=============================================================================================*/
InfantryTypeClass & InfantryTypeClass::As_Reference(InfantryType type)
{
return(*InfantryTypes.Ptr(type));
}
/***********************************************************************************************
* InfantryTypeClass::Read_INI -- Fetches infantry override values from the INI database. *
* *
* This routine will retrieve the override values for this infantry type class object from *
* the INI database specified. *
* *
* INPUT: ini -- Reference to the INI database to retrieve the data from. *
* *
* OUTPUT: bool; Was the infantry section for this type found and data retrieved from it? *
* *
* WARNINGS: none *
* *
* HISTORY: *
* 07/19/1996 JLB : Created. *
*=============================================================================================*/
bool InfantryTypeClass::Read_INI(CCINIClass & ini)
{
if (TechnoTypeClass::Read_INI(ini)) {
IsFraidyCat = ini.Get_Bool(Name(), "Fraidycat", IsFraidyCat);
IsCapture = ini.Get_Bool(Name(), "Infiltrate", IsCapture);
IsBomber = ini.Get_Bool(Name(), "C4", IsBomber);
IsDog = ini.Get_Bool(Name(), "IsCanine", IsDog);
if (IsBomber) IsCapture = true;
if (IsDog) IsLeader = false;
return(true);
}
return(false);
}
void InfantryTypeClass::Dimensions(int & width, int & height) const
{
#ifdef WIN32
width = 14;
height = 20;
#else
width = 12;
height = 16;
#endif
}