007/tools/aiParse.c

7720 lines
249 KiB
C

// gcc -o build/aiparse tools/aiParse.c
// ./build/aiparse
//#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#define _LANGUAGE_C
#define TARGET_N64
#include "../include/PR/ultratypes.h"
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wint-conversion"
#pragma GCC diagnostic ignored "-Wincompatible-pointer-types"
#pragma GCC diagnostic ignored "-Wformat="
//odd, I though this would differ on L-Endian
// Ahh, figured it out, this "makes" a number and the cpu stores it in a reg in its own endianness
# define CharArrayTo16(val, index) ( val[index + 1] | val[index] << 8)
# define CharArrayTo24(val, index) ( val[index + 1] << 8 | val[index + 2] | val[index] << 16)
# define CharArrayTo32(val, index) (val[index + 1] << 16 | val[index + 2] << 8 | val[index + 3] | val[index] << 24)
#define ntohl(var) CharArrayTo32(((unsigned char *)(&(var))), 0)
#define ntohs(var) CharArrayTo16(((unsigned char *)(&(var))), 0)
#define btol(var) *(unsigned int *)&(var) = ntohl(var)
#define btos(var) *(unsigned int *)&(var) = ntohs(var)
#define isNotBoundPad(pad) pad < 10000
#define getBoundPadNum(pad) pad - 10000
#define setBoundPadNum(pad) pad + 10000
#define M_TAU_F 6.2831855f
#define ByteToRadian(Byte) ((Byte * M_TAU_F) * (1.0f / 256.0f))
#define RadToDeg(RAD) (float)((RAD) / M_TAU_F * 360.0f)
#define TARGET_BOND 0x0001 /* Set target to bond (ignores target argument)*/
#define TARGET_FRONT_OF_CHR 0x0002 /* Set target to front of chr*/
#define TARGET_CHR 0x0004 /* Set target type to chr_num*/
#define TARGET_PAD 0x0008 /* Set target type to pad*/
#define TARGET_COMPASS 0x0010 /* Set target to compass direction (hex) N: 0000 E: C000 S: 8000: W: 4000*/
#define TARGET_AIM_ONLY 0x0020 /* Aim at target instead of firing*/
#define TARGET_DONTTURN 0x0040 /* Limits target to 180 degrees in front of guard (cannot be used with TARGET_BOND flag)*/
char *HITTARGET_ToString[] = {
"HIT_NULL_PART", /* Null part, no reaction - 1x damage*/
"HIT_LEFT_FOOT", /* Left foot - 1x damage*/
"HIT_LEFT_LEG", /* Left leg - 1x damage*/
"HIT_LEFT_THIGH", /* Left thigh - 1x damage*/
"HIT_RIGHT_FOOT", /* Right foot - 1x damage*/
"HIT_RIGHT_LEG", /* Right leg - 1x damage*/
"HIT_RIGHT_THIGH", /* Right thigh - 1x damage*/
"HIT_PELVIS", /* Pelvis - 1x damage*/
"HIT_HEAD", /* Head - 4x damage*/
"HIT_LEFT_HAND", /* Left hand - 1x damage*/
"HIT_LEFT_ARM", /* Left arm - 1x damage*/
"HIT_LEFT_SHOULDER", /* Left shoulder - 1x damage*/
"HIT_RIGHT_HAND", /* Right hand - 1x damage*/
"HIT_RIGHT_ARM", /* Right arm - 1x damage*/
"HIT_RIGHT_SHOULDER", /* Right shoulder - 1x damage*/
"HIT_CHEST",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
"28",
"29",
"30",
"31",
"32",
"33",
"34",
"35",
"36",
"37",
"38",
"39",
"40",
"41",
"42",
"43",
"44",
"45",
"46",
"47",
"48",
"49",
"50",
"51",
"52",
"53",
"54",
"55",
"56",
"57",
"58",
"59",
"60",
"61",
"62",
"63",
"64",
"65",
"66",
"67",
"68",
"69",
"70",
"71",
"72",
"73",
"74",
"75",
"76",
"77",
"78",
"79",
"80",
"81",
"82",
"83",
"84",
"85",
"86",
"87",
"88",
"89",
"90",
"91",
"92",
"93",
"94",
"95",
"96",
"97",
"98",
"99",
"HIT_GUN", /* GUN - 0x damage*/
"101",
"102",
"103",
"104",
"105",
"106",
"107",
"108",
"109",
"HIT_HAT", /* HAT - 0x damage*/
"111",
"112",
"113",
"114",
"115",
"116",
"117",
"118",
"119",
"120",
"121",
"122",
"123",
"124",
"125",
"126",
"127",
"128",
"129",
"130",
"131",
"132",
"133",
"134",
"135",
"136",
"137",
"138",
"139",
"140",
"141",
"142",
"143",
"144",
"145",
"146",
"147",
"148",
"149",
"150",
"151",
"152",
"153",
"154",
"155",
"156",
"157",
"158",
"159",
"160",
"161",
"162",
"163",
"164",
"165",
"166",
"167",
"168",
"169",
"170",
"171",
"172",
"173",
"174",
"175",
"176",
"177",
"178",
"179",
"180",
"181",
"182",
"183",
"184",
"185",
"186",
"187",
"188",
"189",
"190",
"191",
"192",
"193",
"194",
"195",
"196",
"197",
"198",
"199",
"HIT_GENERAL",
"HIT_GENERALHALF"};
// command 68 - door states
char *DOORSTATE_ToString[] = {
" AI_DOOR_STATE_CLOSED", /* Closed*/
" AI_DOOR_STATE_OPEN", /* Opened*/
" AI_DOOR_STATE_CLOSING", /* Closing*/
" AI_DOOR_STATE_OPENING" /* Opening*/};
// command D7 - hud flags
#define HUD_HIDE_ALL 0x00 /* Hide all*/
#define HUD_SHOW_TEXT_TOP 0x01 /* Don't hide top text*/
#define HUD_SHOW_TEXT_BOTTOM 0x02 /* Don't hide bottom text*/
#define HUD_SHOW_HUD_COUNTDOWN 0x04 /* Don't hide hud countdown*/
/* special chr num IDs */
#define CHR_BOND_CINEMA -8 /* only works when bond has a third person model (intro/exit cutscene) */
#define CHR_CLONE -7
#define CHR_SEE_SHOT -6 /* stored as chr->chrseeshot */
#define CHR_SEE_DIE -5 /* stored as chr->chrseedie */
#define CHR_PRESET -4 /* stored as chr->chrpreset1 */
#define CHR_SELF -3
/* private chr ID, cannot be accessed with ai commands */
#define CHR_OBJECTIVE -2 /* objective ai list chr ID */
#define CHR_FREE -1 /* chr IDs when free'd (killed or removed from level) */
char *CHR_ToString[] = {
"",
"CHR_FREE",
"CHR_OBJECTIVE",
"CHR_SELF",
"CHR_PRESET",
"CHR_SEE_DIE",
"CHR_SEE_SHOT",
"CHR_CLONE",
"CHR_BOND_CINEMA"
};
#define CHR_SPAWN_NUM_START 5000 /* default chr num for spawned guards with ai command BD/BE */
#define CHR_CLONED_NUM_START 10000 /* default chr num for cloned guards with ai command C1 */
/* Special ID for selecting PadPreset in AI list */
#define PAD_PRESET1 9000 /* stored as chr->padpreset1 */
#define isGlobalAIListID(ID) ((ID) <= 1024)
#define isBGAIListID(ID) ((ID) >= 4096)
#define isChrAIListID(ID) (!isGlobalAIListID(ID) && !isBGAIListID(ID))
#define setGlobalAIListID(ID) ((ID) + 0)
#define setChrAIListID(ID) ((ID) + 1025)
#define setBGAIListID(ID) ((ID) + 4096)
#define getGlobalAIListID(ID) ((ID)-0)
#define getChrAIListID(ID) ((ID)-1025)
#define getBGAIListID(ID) ((ID)-4096)
char *ANIMATIONS_ToString[] = {
"ANIM_idle",
"ANIM_fire_standing",
"ANIM_fire_standing_fast",
"ANIM_fire_hip",
"ANIM_fire_shoulder_left",
"ANIM_fire_turn_right1",
"ANIM_fire_turn_right2",
"ANIM_fire_kneel_right_leg",
"ANIM_fire_kneel_left_leg",
"ANIM_fire_kneel_left",
"ANIM_fire_kneel_right",
"ANIM_fire_roll_left",
"ANIM_fire_roll_right1",
"ANIM_fire_roll_left_fast",
"ANIM_hit_left_shoulder",
"ANIM_hit_right_shoulder",
"ANIM_hit_left_arm",
"ANIM_hit_right_arm",
"ANIM_hit_left_hand",
"ANIM_hit_right_hand",
"ANIM_hit_left_leg",
"ANIM_hit_right_leg",
"ANIM_death_genitalia", /* Thank you Mr. Botwood", here is your award */
"ANIM_hit_neck",
"ANIM_death_neck",
"ANIM_death_stagger_back_to_wall",
"ANIM_death_forward_face_down",
"ANIM_death_forward_spin_face_up",
"ANIM_death_backward_fall_face_up1",
"ANIM_death_backward_spin_face_down_right",
"ANIM_death_backward_spin_face_up_right",
"ANIM_death_backward_spin_face_down_left",
"ANIM_death_backward_spin_face_up_left",
"ANIM_death_forward_face_down_hard",
"ANIM_death_forward_face_down_soft",
"ANIM_death_fetal_position_right",
"ANIM_death_fetal_position_left",
"ANIM_death_backward_fall_face_up2",
"ANIM_side_step_left",
"ANIM_fire_roll_right2",
"ANIM_walking",
"ANIM_sprinting",
"ANIM_running",
"ANIM_bond_eye_walk",
"ANIM_bond_eye_fire",
"ANIM_bond_watch",
"ANIM_surrendering_armed",
"ANIM_surrendering_armed_drop_weapon",
"ANIM_fire_walking",
"ANIM_fire_running",
"ANIM_null50", /* invalid slot */
"ANIM_null51", /* invalid slot */
"ANIM_fire_jump_to_side_left",
"ANIM_fire_jump_to_side_right",
"ANIM_hit_butt_long",
"ANIM_hit_butt_short",
"ANIM_death_head",
"ANIM_death_left_leg",
"ANIM_slide_right",
"ANIM_slide_left",
"ANIM_jump_backwards",
"ANIM_extending_left_hand",
"ANIM_fire_throw_grenade",
"ANIM_spotting_bond", /* used by chr ai command guard_points_at_bond */
"ANIM_look_around", /* used by chr ai command GUARD_ANIM_LOOKS_AROUND_SELF */
"ANIM_fire_standing_one_handed_weapon",
"ANIM_fire_standing_draw_one_handed_weapon_fast",
"ANIM_fire_standing_draw_one_handed_weapon_slow",
"ANIM_fire_hip_one_handed_weapon_fast",
"ANIM_fire_hip_one_handed_weapon_slow",
"ANIM_fire_hip_forward_one_handed_weapon",
"ANIM_fire_standing_right_one_handed_weapon",
"ANIM_fire_step_right_one_handed_weapon",
"ANIM_fire_standing_left_one_handed_weapon_slow",
"ANIM_fire_standing_left_one_handed_weapon_fast",
"ANIM_fire_kneel_forward_one_handed_weapon_slow",
"ANIM_fire_kneel_forward_one_handed_weapon_fast",
"ANIM_fire_kneel_right_one_handed_weapon_slow",
"ANIM_fire_kneel_right_one_handed_weapon_fast",
"ANIM_fire_kneel_left_one_handed_weapon_slow",
"ANIM_fire_kneel_left_one_handed_weapon_fast",
"ANIM_fire_kneel_left_one_handed_weapon",
"ANIM_aim_walking_one_handed_weapon",
"ANIM_aim_walking_left_one_handed_weapon",
"ANIM_aim_walking_right_one_handed_weapon",
"ANIM_aim_running_one_handed_weapon",
"ANIM_aim_running_right_one_handed_weapon",
"ANIM_aim_running_left_one_handed_weapon",
"ANIM_aim_sprinting_one_handed_weapon",
"ANIM_running_one_handed_weapon",
"ANIM_sprinting_one_handed_weapon",
"ANIM_null91", /* invalid slot */
"ANIM_null92", /* invalid slot */
"ANIM_null93", /* invalid slot */
"ANIM_null94", /* invalid slot */
"ANIM_null95", /* invalid slot */
"ANIM_null96", /* invalid slot */
"ANIM_draw_one_handed_weapon_and_look_around",
"ANIM_draw_one_handed_weapon_and_stand_up",
"ANIM_aim_one_handed_weapon_left_right",
"ANIM_cock_one_handed_weapon_and_turn_around",
"ANIM_holster_one_handed_weapon_and_cross_arms",
"ANIM_cock_one_handed_weapon_turn_around_and_stand_up",
"ANIM_draw_one_handed_weapon_and_turn_around",
"ANIM_step_foward_and_hold_one_handed_weapon",
"ANIM_holster_one_handed_weapon_and_adjust_suit",
"ANIM_idle_unarmed",
"ANIM_walking_unarmed",
"ANIM_fire_walking_dual_wield",
"ANIM_fire_walking_dual_wield_hands_crossed",
"ANIM_fire_running_dual_wield",
"ANIM_fire_running_dual_wield_hands_crossed",
"ANIM_fire_sprinting_dual_wield",
"ANIM_fire_sprinting_dual_wield_hands_crossed",
"ANIM_walking_female",
"ANIM_running_female",
"ANIM_fire_kneel_dual_wield",
"ANIM_fire_kneel_dual_wield_left",
"ANIM_fire_kneel_dual_wield_right",
"ANIM_fire_kneel_dual_wield_hands_crossed",
"ANIM_fire_kneel_dual_wield_hands_crossed_left",
"ANIM_fire_kneel_dual_wield_hands_crossed_right",
"ANIM_fire_standing_dual_wield",
"ANIM_fire_standing_dual_wield_left",
"ANIM_fire_standing_dual_wield_right",
"ANIM_fire_standing_dual_wield_hands_crossed_left",
"ANIM_fire_standing_dual_wield_hands_crossed_right",
"ANIM_fire_standing_aiming_down_sights",
"ANIM_fire_kneel_aiming_down_sights",
"ANIM_hit_taser", /* unused tazer boy hit reaction */
"ANIM_death_explosion_forward",
"ANIM_death_explosion_left1",
"ANIM_death_explosion_back_left",
"ANIM_death_explosion_back1",
"ANIM_death_explosion_right",
"ANIM_death_explosion_forward_right1",
"ANIM_death_explosion_back2",
"ANIM_death_explosion_forward_roll",
"ANIM_death_explosion_forward_face_down",
"ANIM_death_explosion_left2",
"ANIM_death_explosion_forward_right2",
"ANIM_death_explosion_forward_right2_alt", /* copy of right2 with different fall */
"ANIM_death_explosion_forward_right3",
"ANIM_null143", /* invalid slot */
"ANIM_null144", /* invalid slot */
"ANIM_null145", /* invalid slot */
"ANIM_null146", /* invalid slot */
"ANIM_running_hands_up",
"ANIM_sprinting_hands_up",
"ANIM_aim_and_blow_one_handed_weapon",
"ANIM_aim_one_handed_weapon_left",
"ANIM_aim_one_handed_weapon_right",
"ANIM_conversation",
"ANIM_drop_weapon_and_show_fight_stance", /* orthodox stance woo */
"ANIM_yawning",
"ANIM_swatting_flies",
"ANIM_scratching_leg",
"ANIM_scratching_butt",
"ANIM_adjusting_crotch",
"ANIM_sneeze",
"ANIM_conversation_cleaned", /* cleaned up copy of "ANIM_conversation (compare left wrist) */
"ANIM_conversation_listener",
"ANIM_startled_and_looking_around",
"ANIM_laughing_in_disbelief",
"ANIM_surrendering_unarmed",
"ANIM_coughing_standing",
"ANIM_coughing_kneel1",
"ANIM_coughing_kneel2",
"ANIM_standing_up",
"ANIM_null169", /* invalid slot */
"ANIM_dancing",
"ANIM_dancing_one_handed_weapon",
"ANIM_keyboard_right_hand1",
"ANIM_keyboard_right_hand2",
"ANIM_keyboard_left_hand",
"ANIM_keyboard_right_hand_tapping",
"ANIM_bond_eye_fire_alt", /* unused */
"ANIM_dam_jump",
"ANIM_surface_vent_jump",
"ANIM_cradle_jump",
"ANIM_cradle_fall",
"ANIM_credits_bond_kissing",
"ANIM_credits_natalya_kissing"};
char *AIRCRAFT_ANIMATION_ToString[] = {
"AIRCRAFT_ANIMATION_helicopter_cradle",
"AIRCRAFT_ANIMATION_plane_runway",
"AIRCRAFT_ANIMATION_helicopter_takeoff"};
// Add 1 to ID for correct string
char *DIFFICULTY_ToString[] = {
"DIFFICULTY_MULTI", //-1
"DIFFICULTY_AGENT",
"DIFFICULTY_SECRET",
"DIFFICULTY_00",
"DIFFICULTY_007",
};
char *ITEM_IDS_ToString[] = {
"ITEM_UNARMED",
"ITEM_FIST",
"ITEM_KNIFE",
"ITEM_THROWKNIFE",
"ITEM_WPPK",
"ITEM_WPPKSIL",
"ITEM_TT33",
"ITEM_SKORPION",
"ITEM_AK47",
"ITEM_UZI",
"ITEM_MP5K",
"ITEM_MP5KSIL",
"ITEM_SPECTRE",
"ITEM_M16",
"ITEM_FNP90",
"ITEM_SHOTGUN",
"ITEM_AUTOSHOT",
"ITEM_SNIPERRIFLE",
"ITEM_RUGER",
"ITEM_GOLDENGUN",
"ITEM_SILVERWPPK",
"ITEM_GOLDWPPK",
"ITEM_LASER",
"ITEM_WATCHLASER",
"ITEM_GRENADELAUNCH",
"ITEM_ROCKETLAUNCH",
"ITEM_GRENADE",
"ITEM_TIMEDMINE",
"ITEM_PROXIMITYMINE",
"ITEM_REMOTEMINE",
"ITEM_TRIGGER",
"ITEM_TASER",
"ITEM_TANKSHELLS",
"ITEM_BOMBCASE",
"ITEM_PLASTIQUE",
"ITEM_FLAREPISTOL",
"ITEM_PITONGUN",
"ITEM_BUNGEE",
"ITEM_DOORDECODER",
"ITEM_BOMBDEFUSER",
"ITEM_CAMERA",
"ITEM_LOCKEXPLODER",
"ITEM_DOOREXPLODER",
"ITEM_BRIEFCASE",
"ITEM_WEAPONCASE",
"ITEM_SAFECRACKERCASE",
"ITEM_KEYANALYSERCASE",
"ITEM_BUG",
"ITEM_MICROCAMERA",
"ITEM_BUGDETECTOR",
"ITEM_EXPLOSIVEFLOPPY",
"ITEM_POLARIZEDGLASSES",
"ITEM_DARKGLASSES",
"ITEM_CREDITCARD",
"ITEM_GASKEYRING",
"ITEM_DATATHIEF",
"ITEM_WATCHIDENTIFIER",
"ITEM_WATCHCOMMUNICATOR",
"ITEM_WATCHGEIGERCOUNTER",
"ITEM_WATCHMAGNETREPEL",
"ITEM_WATCHMAGNETATTRACT",
"ITEM_GOLDENEYEKEY",
"ITEM_BLACKBOX",
"ITEM_CIRCUITBOARD",
"ITEM_CLIPBOARD",
"ITEM_STAFFLIST",
"ITEM_DOSSIERRED",
"ITEM_PLANS",
"ITEM_SPYFILE",
"ITEM_BLUEPRINTS",
"ITEM_MAP",
"ITEM_AUDIOTAPE",
"ITEM_VIDEOTAPE",
"ITEM_DATTAPE",
"ITEM_SPOOLTAPE",
"ITEM_MICROFILM",
"ITEM_MICROCODE",
"ITEM_LECTRE",
"ITEM_MONEY",
"ITEM_GOLDBAR",
"ITEM_HEROIN",
"ITEM_KEYCARD",
"ITEM_KEYYALE",
"ITEM_KEYBOLT",
"ITEM_SUIT_LF_HAND",
"ITEM_JOYPAD",
"ITEM_NULL86",
"ITEM_NULL87",
"ITEM_TOKEN",
"ITEM_IDS_MAX"};
char *PROPDEF_TYPE_ToString[] = {
"PROPDEF_NOTHING",
"PROPDEF_DOOR",
"PROPDEF_DOOR_SCALE",
"PROPDEF_PROP",
"PROPDEF_KEY",
"PROPDEF_ALARM",
"PROPDEF_CCTV",
"PROPDEF_MAGAZINE",
"PROPDEF_COLLECTABLE",
"PROPDEF_GUARD",
"PROPDEF_MONITOR",
"PROPDEF_MULTI_MONITOR",
"PROPDEF_RACK",
"PROPDEF_AUTOGUN",
"PROPDEF_LINK",
"PROPDEF_DEBRIS",
"PROPDEF_UNK16",
"PROPDEF_HAT",
"PROPDEF_GUARD_ATTRIBUTE",
"PROPDEF_SWITCH",
"PROPDEF_AMMO",
"PROPDEF_ARMOUR",
"PROPDEF_TAG",
"PROPDEF_OBJECTIVE_START",
"PROPDEF_OBJECTIVE_END",
"PROPDEF_OBJECTIVE_DESTROY_OBJECT",
"PROPDEF_OBJECTIVE_COMPLETE_CONDITION",
"PROPDEF_OBJECTIVE_FAIL_CONDITION",
"PROPDEF_OBJECTIVE_COLLECT_OBJECT",
"PROPDEF_OBJECTIVE_DEPOSIT_OBJECT",
"PROPDEF_OBJECTIVE_PHOTOGRAPH",
"PROPDEF_OBJECTIVE_NULL",
"PROPDEF_OBJECTIVE_ENTER_ROOM",
"PROPDEF_OBJECTIVE_DEPOSIT_OBJECT_IN_ROOM",
"PROPDEF_OBJECTIVE_COPY_ITEM",
"PROPDEF_WATCH_MENU_OBJECTIVE_TEXT",
"PROPDEF_GAS_RELEASING",
"PROPDEF_RENAME",
"PROPDEF_LOCK_DOOR",
"PROPDEF_VEHICHLE",
"PROPDEF_AIRCRAFT",
"PROPDEF_UNK41",
"PROPDEF_GLASS",
"PROPDEF_SAFE",
"PROPDEF_SAFE_ITEM",
"PROPDEF_TANK",
"PROPDEF_CAMERAPOS", // canonical name
"PROPDEF_TINTED_GLASS",
"PROPDEF_END",
};
char *PROP_ToString[] = {
"PROP_ALARM1", /* Beta Alarm / Default Multi Weapon */
"PROP_ALARM2", /* Alarm */
"PROP_EXPLOSIONBIT", /* White Pyramid (Explosion Bit) */
"PROP_AMMO_CRATE1", /* Ammo Crate (Brown w/ Edge Brace", 6x240 Black) */
"PROP_AMMO_CRATE2", /* Ammo Crate (Brown w/ Center Brace", 12x8 Black) */
"PROP_AMMO_CRATE3", /* Ammo Crate (Green w/ Center Brace", 12x8 Brown) */
"PROP_AMMO_CRATE4", /* Ammo Crate (Green w/ Edge Brace", 6x8 White) */
"PROP_AMMO_CRATE5", /* Ammo Crate (Green w/ Double Brace", 24x60 Black) */
"PROP_BIN1", /* Rusted Trash Bin */
"PROP_BLOTTER1", /* Desk Blotter */
"PROP_BOOK1", /* Red Book */
"PROP_BOOKSHELF1", /* Bookshelf */
"PROP_BRIDGE_CONSOLE1A", /* Bridge Console w/ Monitor", Navigation + Keyboard 1A */
"PROP_BRIDGE_CONSOLE1B", /* Bridge Console w/ Navigation 1B */
"PROP_BRIDGE_CONSOLE2A", /* Bridge Console w/ Navigation", Monitor + Keyboard 2A */
"PROP_BRIDGE_CONSOLE2B", /* Bridge Console w/ Various Controls 2B */
"PROP_BRIDGE_CONSOLE3A", /* Bridge Console w/ Monitor", Navigation + Keyboard 3A */
"PROP_BRIDGE_CONSOLE3B", /* Bridge Console w/ Monitor", Keyboard + Navigation 3B */
"PROP_CARD_BOX1", /* Cardboard Box", Kapto|Enb */
"PROP_CARD_BOX2", /* Cardboard Box", Red Arrow", Bahko */
"PROP_CARD_BOX3", /* Cardboard Box", Scrawled Text", Bahah */
"PROP_CARD_BOX4_LG", /* Cardboard Box", Three Seams */
"PROP_CARD_BOX5_LG", /* Cardboard Box", Two Seams", Bahah */
"PROP_CARD_BOX6_LG", /* Cardboard Box", Bahko */
"PROP_CCTV", /* Surveillance Camera */
"PROP_CONSOLE1", /* Double Screen Consoles w/ Keyboards */
"PROP_CONSOLE2", /* Double Screen Consoles w/ Left Keyboard */
"PROP_CONSOLE3", /* Double Screen Consoles w/ Right Keyboard */
"PROP_CONSOLE_SEVA", /* Console w/ Keyboard */
"PROP_CONSOLE_SEVB", /* Console w/ Monitor + Keyboard */
"PROP_CONSOLE_SEVC", /* Console w/ Switches */
"PROP_CONSOLE_SEVD", /* Console w/ Five Gauges */
"PROP_CONSOLE_SEV2A", /* Console w/ Four Faders */
"PROP_CONSOLE_SEV2B", /* Console w/ Monitor", Keyboard + Switches */
"PROP_CONSOLE_SEV2C", /* Console w/ Three Gauges */
"PROP_CONSOLE_SEV2D", /* Console w/ Pressure Gauge */
"PROP_CONSOLE_SEV_GEA", /* Console w/ GoldenEye Key Slot */
"PROP_CONSOLE_SEV_GEB", /* Console w/ Faders + Pressure Gauge */
"PROP_DESK1", /* Desk w/ Kickplate */
"PROP_DESK2", /* Desk */
"PROP_DESK_LAMP2", /* Desk Lamp */
"PROP_DISC_READER", /* External Hard Drive */
"PROP_DISK_DRIVE1", /* Floppy Disc Drive */
"PROP_FILING_CABINET1", /* Filing Cabinet */
"PROP_JERRY_CAN1", /* Jerrycan (Fuel Container) */
"PROP_KEYBOARD1", /* Computer Keyboard */
"PROP_KIT_UNITS1", /* Kitchen Cabinets */
"PROP_LETTER_TRAY1", /* Letter Tray */
"PROP_MAINFRAME1", /* Mainframe", Basic */
"PROP_MAINFRAME2", /* Mainframe", Advanced */
"PROP_METAL_CHAIR1", /* Chair (Metal) */
"PROP_METAL_CRATE1", /* Metal Crate", 6 Top Corner */
"PROP_METAL_CRATE2", /* Metal Crate", 6 Bottom Corner */
"PROP_METAL_CRATE3", /* Metal Crate", Toxic Materials */
"PROP_METAL_CRATE4", /* Metal Crate", Double Stripe - Class D1 Hazard */
"PROP_MISSILE_RACK", /* Naval Harpoon Missile in Containment Rack */
"PROP_MISSILE_RACK2", /* Naval Harpoon Missiles in Containment Racks x4 */
"PROP_OIL_DRUM1", /* Oil Drum", Single Stripe", Ribbed */
"PROP_OIL_DRUM2", /* Oil Drum", Single Stripe", Ribbed - Class D1 Hazard */
"PROP_OIL_DRUM3", /* Oil Drum", Single Stripe", Ribbed - Toxic Materials */
"PROP_OIL_DRUM5", /* Oil Drum", Double Stripe - Toxic Materials */
"PROP_OIL_DRUM6", /* Oil Drum - Toxic Materials */
"PROP_OIL_DRUM7", /* Oil Drum", Double Dashes - Class D1 Hazard */
"PROP_PADLOCK", /* Padlock */
"PROP_PHONE1", /* Telephone */
"PROP_RADIO_UNIT1", /* Radio Tuner w/ 1 Knob + 2 Gauges */
"PROP_RADIO_UNIT2", /* Radio Tuner w/ 1 Knob + 5 Gauges */
"PROP_RADIO_UNIT3", /* Radio Tuner w/ 3 Knobs + 5 Gauges */
"PROP_RADIO_UNIT4", /* Radio Tuner w/ 3 Knobs + 2 Gauges */
"PROP_SAT1_REFLECT", /* GoldenEye Satellite */
"PROP_SATDISH", /* Satellite Dish (Arkangelsk) */
"PROP_SATBOX", /* Uplink Box */
"PROP_STOOL1", /* Wooden Stool */
"PROP_SWIVEL_CHAIR1", /* Swivel Chair */
"PROP_TORPEDO_RACK", /* Naval Torpedo Rack x3 */
"PROP_TV1", /* Television Monitor */
"PROP_TV_HOLDER", /* Hanging Monitor Rack */
"PROP_TVSCREEN", /* Wall Monitor Screen */
"PROP_TV4SCREEN", /* Wall Monitor Screens", 4-in-1 */
"PROP_WOOD_LG_CRATE1", /* Wooden Crate w/ #4 Label", Bahah */
"PROP_WOOD_LG_CRATE2", /* Wooden Crate", Darker Shading", Kapto|Enb */
"PROP_WOOD_MD_CRATE3", /* Wooden Crates x8", Bahko */
"PROP_WOOD_SM_CRATE4", /* Wooden Crate w/ #2 Label", Bahko */
"PROP_WOOD_SM_CRATE5", /* Wooden Crate w/ #4 Label", Darker Shading", Bahah */
"PROP_WOOD_SM_CRATE6", /* Wooden Crate w/ UP Arrow", Kapto|Enb */
"PROP_WOODEN_TABLE1", /* Wooden Table */
"PROP_SWIPE_CARD2", /* Keycard */
"PROP_BORG_CRATE", /* Blue and Gold Printed Circuit Cube (Borg Crate) */
"PROP_BOXES4X4", /* Metal Crate Stack", 4x4 */
"PROP_BOXES3X4", /* Metal Crate Stack", 3x4 */
"PROP_BOXES2X4", /* Metal Crate Stack", 2x4 */
"PROP_SEC_PANEL", /* Security Card Panel */
"PROP_ICBM_NOSE", /* Silo Missile (ICBM)", Nose Cone Only */
"PROP_ICBM", /* Silo Missile (ICBM) */
"PROP_TUNING_CONSOLE1", /* Dual Consoles on Castors */
"PROP_DESK_ARECIBO1", /* Computer Work Desk */
"PROP_LOCKER3", /* Lockers", Single Venting */
"PROP_LOCKER4", /* Lockers", Double Venting */
"PROP_ROOFGUN", /* Ceiling Mounted Drone Gun */
"PROP_DEST_ENGINE", /* Frigate Engine */
"PROP_DEST_EXOCET", /* Naval MK 29 Missile Launcher (Exocet) */
"PROP_DEST_GUN", /* Naval 100 mm Gun Turret (TR 100) */
"PROP_DEST_HARPOON", /* Naval MK 141 Launch Canisters (Harpoon) */
"PROP_DEST_SEAWOLF", /* Naval MK 26 Dual Missile Launcher (Seawolf) */
"PROP_WINDOW", /* Window Glass */
"PROP_WINDOW_LIB_LG1", /* Window Glass", Lattice Frame", 4x10 (single-sided) */
"PROP_WINDOW_LIB_SM1", /* Window Glass", Lattice Frame", 4x3 (double-sided) */
"PROP_WINDOW_COR11", /* Window Glass", Lattice Frame", 4x4 (single-sided) */
"PROP_JUNGLE3_TREE", /* Jungle Large Tree */
"PROP_PALM", /* Jungle Palm Tree */
"PROP_PALMTREE", /* Jungle Palm Tree", Resprouting After Loss of Fronds */
"PROP_PLANT2B", /* Jungle Plant", Low Shrub */
"PROP_LABBENCH", /* Laboratory Table w/ Sink Drains */
"PROP_GASBARREL", /* White Bin */
"PROP_GASBARRELS", /* White Bins x4 */
"PROP_BODYARMOUR", /* Body Armor */
"PROP_BODYARMOURVEST", /* Body Armor (Vest) */
"PROP_GASTANK", /* Bottling Tank */
"PROP_GLASSWARE1", /* Glass Cup */
"PROP_HATCHBOLT", /* Metallic Securing Strip (Hatch Bolt) */
"PROP_BRAKEUNIT", /* Train Brake Controller */
"PROP_AK47MAG", /* Gun Magazine (KF7 Soviet) */
"PROP_M16MAG", /* Gun Magazine (AR33 Assault Rifle) */
"PROP_MP5KMAG", /* Gun Magazine (D5K Deutsche) */
"PROP_SKORPIONMAG", /* Gun Magazine (Klobb) */
"PROP_SPECTREMAG", /* Gun Magazine (Phantom) */
"PROP_UZIMAG", /* Gun Magazine (ZMG (9mm)) */
"PROP_SILENCER", /* Silencer */
"PROP_CHREXTINGUISHER", /* Fire Extinguisher */
"PROP_BOXCARTRIDGES", /* Box of Shells (Shotgun Cartridges) */
"PROP_FNP90MAG", /* Gun Magazine (RC-P90) */
"PROP_GOLDENSHELLS", /* Box of Shells (Golden Gun Bullets) */
"PROP_MAGNUMSHELLS", /* Box of Shells (Magnum Rounds) */
"PROP_WPPKMAG", /* Gun Magazine (PP7) */
"PROP_TT33MAG", /* Gun Magazine (DD44 Dostovei) */
"PROP_SEV_DOOR", /* Grey Containment Door w/ Caution Stripes and Window */
"PROP_SEV_DOOR3", /* Grey Electronic Door w/ LEFT Arrow */
"PROP_SEV_DOOR3_WIND", /* BETA Electronic Door w/ LEFT Arrow and Fake Window */
"PROP_SEV_DOOR4_WIND", /* Grey Electronic Door w/ LEFT Arrow and Window */
"PROP_SEV_TRISLIDE", /* Glass Door w/ Stone Frame */
"PROP_SEV_DOOR_V1", /* Grey Electronic Door w/ UP Arrow */
"PROP_STEEL_DOOR1", /* Silver Corrugated Door w/ Caution Stripes */
"PROP_STEEL_DOOR2", /* Rusty Door w/ Handle */
"PROP_STEEL_DOOR3", /* Double Cross Brace Door */
"PROP_SILO_LIFT_DOOR", /* Elevator Door */
"PROP_STEEL_DOOR2B", /* Rusty Door w/o Handle */
"PROP_DOOR_ROLLER1", /* Blue Bay Door w/ Caution Stripes */
"PROP_DOOR_ROLLER2", /* Blue Bay Door w/ Venting and Caution Stripes */
"PROP_DOOR_ROLLER3", /* Blue Bay Door w/ Venting and Caution Stripes */
"PROP_DOOR_ROLLER4", /* Cargo Bay Door w/ UP Arrow and Transportation Stripes */
"PROP_DOOR_ST_AREC1", /* Blue Corrugated Door w/ Transportation Stripes */
"PROP_DOOR_ST_AREC2", /* Blue Reversed Corrugated Door w/ Transportation Stripes */
"PROP_DOOR_DEST1", /* Grey Frigate Door w/ Indents and Caution Stripes */
"PROP_DOOR_DEST2", /* Grey Frigate Door w/ Indents", Caution Stripes and KEEP CLEAR Label */
"PROP_GAS_PLANT_SW_DO1", /* Grey Swinging Door w/ Blue Stripe */
"PROP_GAS_PLANT_SW2_DO1", /* Grey Swinging Door", Darker */
"PROP_GAS_PLANT_SW3_DO1", /* Grey Swinging Door", Lighter */
"PROP_GAS_PLANT_SW4_DO1", /* Light Wooden Door (Looks Like Sand) */
"PROP_GAS_PLANT_MET1_DO1", /* Brown Electronic Door */
"PROP_GAS_PLANT_WC_CUB1", /* Bathroom Stall Door */
"PROP_GASPLANT_CLEAR_DOOR", /* Laboratory Glass Door */
"PROP_TRAIN_DOOR", /* Dark Wooden Door */
"PROP_TRAIN_DOOR2", /* Dark Wooden Door w/ Window */
"PROP_TRAIN_DOOR3", /* Dark Wooden Door w/ Window + Shutter */
"PROP_DOOR_EYELID", /* Eyelid Door */
"PROP_DOOR_IRIS", /* Iris Door */
"PROP_SEVDOORWOOD", /* Cabin Door */
"PROP_SEVDOORWIND", /* Weathered Swinging Door w/ Window */
"PROP_SEVDOORNOWIND", /* Weathered Swinging Door */
"PROP_SEVDOORMETSLIDE", /* Brown Corrugated Electronic Door */
"PROP_CRYPTDOOR1A", /* Stone Door w/ Prints (Set A) */
"PROP_CRYPTDOOR1B", /* Sand Door w/ Damage (Set A) */
"PROP_CRYPTDOOR2A", /* Stone Door w/ Prints", Darker (Set B) */
"PROP_CRYPTDOOR2B", /* Sand Door w/ Damage", Darker (Set B) */
"PROP_CRYPTDOOR3", /* Egyptian Moving Wall */
"PROP_CRYPTDOOR4", /* Brown Sand Door (Temple) */
"PROP_VERTDOOR", /* Blast Door (Control) */
"PROP_HATCHDOOR", /* Train Floor Hatch */
"PROP_DAMGATEDOOR", /* Security Gate (Dam) */
"PROP_DAMTUNDOOR", /* Tunnel Flood Door (Dam) */
"PROP_DAMCHAINDOOR", /* Mesh Gate */
"PROP_SILOTOPDOOR", /* Launch Tube Ceiling Shutter (Silo) */
"PROP_DOORPRISON1", /* Cell Door */
"PROP_DOORSTATGATE", /* Park Gate */
"PROP_CHRKALASH", /* KF7 Soviet */
"PROP_CHRGRENADELAUNCH", /* Grenade Launcher */
"PROP_CHRKNIFE", /* Hunting Knife */
"PROP_CHRLASER", /* Moonraker Laser */
"PROP_CHRM16", /* AR33 Assault Rifle */
"PROP_CHRMP5K", /* D5K Deutsche */
"PROP_CHRRUGER", /* Cougar Magnum */
"PROP_CHRWPPK", /* PP7 Special Issue */
"PROP_CHRSHOTGUN", /* Shotgun */
"PROP_CHRSKORPION", /* Klobb */
"PROP_CHRSPECTRE", /* Phantom */
"PROP_CHRUZI", /* ZMG (9mm) */
"PROP_CHRGRENADE", /* Hand Grenade */
"PROP_CHRFNP90", /* RC-P90 */
"PROP_CHRBRIEFCASE", /* Briefcase */
"PROP_CHRREMOTEMINE", /* Remote Mine */
"PROP_CHRPROXIMITYMINE", /* Proximity Mine */
"PROP_CHRTIMEDMINE", /* Timed Mine */
"PROP_CHRROCKET", /* Rocket */
"PROP_CHRGRENADEROUND", /* Grenade Round */
"PROP_CHRWPPKSIL", /* PP7 (Silenced) */
"PROP_CHRTT33", /* DD44 Dostovei */
"PROP_CHRMP5KSIL", /* D5K (Silenced) */
"PROP_CHRAUTOSHOT", /* Automatic Shotgun */
"PROP_CHRGOLDEN", /* Golden Gun */
"PROP_CHRTHROWKNIFE", /* Throwing Knife */
"PROP_CHRSNIPERRIFLE", /* Sniper Rifle */
"PROP_CHRROCKETLAUNCH", /* Rocket Launcher */
"PROP_HATFURRY", /* Fur Hat", Blue */
"PROP_HATFURRYBROWN", /* Fur Hat", Brown */
"PROP_HATFURRYBLACK", /* Fur Hat", Black */
"PROP_HATTBIRD", /* Side Cap", Light Green */
"PROP_HATTBIRDBROWN", /* Side Cap", Dark Green */
"PROP_HATHELMET", /* Combat Helmet", Green */
"PROP_HATHELMETGREY", /* Combat Helmet", Grey */
"PROP_HATMOON", /* Elite Headgear */
"PROP_HATBERET", /* Special Forces Beret", Black */
"PROP_HATBERETBLUE", /* Special Forces Beret", Navy */
"PROP_HATBERETRED", /* Special Forces Beret", Burgundy */
"PROP_HATPEAKED", /* Officer's Peaked Visor Cap */
"PROP_CHRWRISTDART", /* Pchrwristdart (BETA) */
"PROP_CHREXPLOSIVEPEN", /* Pchrexplosivepen (BETA) */
"PROP_CHRBOMBCASE", /* Bomb Case (Briefcase Laying Down) */
"PROP_CHRFLAREPISTOL", /* Pchrflarepistol (BETA Pickup) */
"PROP_CHRPITONGUN", /* Pchrpitongun (BETA Pickup) */
"PROP_CHRFINGERGUN", /* Pchrfingergun (BETA Pickup) */
"PROP_CHRSILVERWPPK", /* Pchrsilverwppk (BETA Pickup) */
"PROP_CHRGOLDWPPK", /* Pchrgoldwppk (BETA Pickup) */
"PROP_CHRDYNAMITE", /* Pchrdynamite (BETA Pickup) */
"PROP_CHRBUNGEE", /* Pchrbungee (BETA Pickup) */
"PROP_CHRDOORDECODER", /* Door Decoder */
"PROP_CHRBOMBDEFUSER", /* Bomb Defuser */
"PROP_CHRBUGDETECTOR", /* Pchrbugdetector (BETA Pickup) */
"PROP_CHRSAFECRACKERCASE", /* Safe Cracker Case (Briefcase Laying Down) */
"PROP_CHRCAMERA", /* Photo Camera (007) */
"PROP_CHRLOCKEXPLODER", /* Pchrlockexploder (BETA Pickup) */
"PROP_CHRDOOREXPLODER", /* Pchrdoorexploder (BETA Pickup) */
"PROP_CHRKEYANALYSERCASE", /* Key Analyzer Case (Briefcase Laying Down) */
"PROP_CHRWEAPONCASE", /* Weapon Case (Briefcase Standing Up) */
"PROP_CHRKEYYALE", /* Yale Key */
"PROP_CHRKEYBOLT", /* Bolt Key */
"PROP_CHRBUG", /* Covert Modem / Tracker Bug */
"PROP_CHRMICROCAMERA", /* Micro Camera */
"PROP_FLOPPY", /* Floppy Disc */
"PROP_CHRGOLDENEYEKEY", /* GoldenEye Key */
"PROP_CHRPOLARIZEDGLASSES", /* Polarized Glasses */
"PROP_CHRCREDITCARD", /* Pchrcreditcard (BETA Pickup) */
"PROP_CHRDARKGLASSES", /* Pchrdarkglasses (BETA Pickup) */
"PROP_CHRGASKEYRING", /* Gas Keyring */
"PROP_CHRDATATHIEF", /* Datathief */
"PROP_SAFE", /* Safe Body */
"PROP_BOMB", /* Pbomb (BETA Pickup) */
"PROP_CHRPLANS", /* Plans (Briefing Folder) */
"PROP_CHRSPYFILE", /* Pchrspyfile (BETA Pickup) */
"PROP_CHRBLUEPRINTS", /* Pirate Blueprints */
"PROP_CHRCIRCUITBOARD", /* Circuitboard */
"PROP_CHRMAP", /* Bunker Expansion Plans */
"PROP_CHRSPOOLTAPE", /* Pchrspooltape (BETA Pickup) */
"PROP_CHRAUDIOTAPE", /* Audiotape */
"PROP_CHRMICROFILM", /* Pchrmicrofilm (BETA Pickup) */
"PROP_CHRMICROCODE", /* Pchrmicrocode (BETA Pickup) */
"PROP_CHRLECTRE", /* Pchrlectre (BETA Pickup) */
"PROP_CHRMONEY", /* Pchrmoney (BETA Pickup) */
"PROP_CHRGOLDBAR", /* Pchrgoldbar (BETA Pickup) */
"PROP_CHRHEROIN", /* Pchrheroin (BETA Pickup) */
"PROP_CHRCLIPBOARD", /* Clipboard */
"PROP_CHRDOSSIERRED", /* Red Dossier */
"PROP_CHRSTAFFLIST", /* Staff List */
"PROP_CHRDATTAPE", /* DAT */
"PROP_CHRPLASTIQUE", /* Plastique */
"PROP_CHRBLACKBOX", /* Black Box (Orange Flight Recorder) */
"PROP_CHRVIDEOTAPE", /* CCTV Tape (GoldenEye VHS) */
"PROP_NINTENDOLOGO", /* Nintendo Logo */
"PROP_GOLDENEYELOGO", /* GoldenEye Logo */
"PROP_WALLETBOND", /* Classified Folder w/ Royal Crest (Folder Menus) */
"PROP_MILTRUCK", /* Supply Truck */
"PROP_JEEP", /* Military Jeep */
"PROP_ARTIC", /* Red Prime Mover */
"PROP_HELICOPTER", /* Transport Helicopter w/ Natalya */
"PROP_TIGER", /* Pirate Euro Chopper */
"PROP_MILCOPTER", /* Hound Helicopter */
"PROP_HIND", /* Soviet Camouflage Chopper */
"PROP_ARTICTRAILER", /* Black Trailer */
"PROP_MOTORBIKE", /* Motorbike */
"PROP_TANK", /* Tank */
"PROP_APC", /* Armored Personnel Carrier */
"PROP_SPEEDBOAT", /* Speedboat */
"PROP_PLANE", /* Aeroplane */
"PROP_GUN_RUNWAY1", /* Heavy Gun Emplacement */
"PROP_SAFEDOOR", /* Safe Door */
"PROP_KEY_HOLDER", /* Key Rack */
"PROP_HATCHSEVX", /* Grating (Ventshaft Hatch) */
"PROP_SEVDISH", /* Satellite Dish (Severnaya) */
"PROP_ARCHSECDOOR1", /* Archives Moving Wall (Dark) */
"PROP_ARCHSECDOOR2", /* Archives Moving Wall (Light) */
"PROP_GROUNDGUN", /* Free Standing Drone Gun */
"PROP_TRAINEXTDOOR", /* Train Exterior Door */
"PROP_CARBMW", /* White Car #1 (BMW) */
"PROP_CARESCORT", /* White Car #2 (Escort) */
"PROP_CARGOLF", /* White Car #3 (Golf) */
"PROP_CARWEIRD", /* Red Car (Cadillac) */
"PROP_CARZIL", /* Ourumov's Car (ZIL) */
"PROP_SHUTTLE_DOOR_L", /* Exhaust Bay Doors", Left Side */
"PROP_SHUTTLE_DOOR_R", /* Exhaust Bay Doors", Right Side */
"PROP_DEPOT_GATE_ENTRY", /* Metallic Gate w/ Red Star */
"PROP_DEPOT_DOOR_STEEL", /* Rusty Door w/ Handle (Lo-Res) */
"PROP_GLASSWARE2", /* Beaker w/ Blue Topper */
"PROP_GLASSWARE3", /* Erlenmeyer Flask */
"PROP_GLASSWARE4", /* Set of Five Beakers */
"PROP_LANDMINE", /* Land Mine */
"PROP_PLANT1", /* Jungle Plant", Withered and Dying */
"PROP_PLANT11", /* Jungle Plant", Turning Colour */
"PROP_PLANT2", /* Jungle Plant", Healthy and Thick */
"PROP_PLANT3", /* Jungle Plant", Tall Leaves */
"PROP_JUNGLE5_TREE", /* Jungle Tree", Moss Covered */
"PROP_LEGALPAGE", /* GoldenEye Certification Screen */
"PROP_ST_PETE_ROOM_1I", /* Roads and Buildings #1 (stretch of road) */
"PROP_ST_PETE_ROOM_2I", /* Roads and Buildings #2 (stretch of road) */
"PROP_ST_PETE_ROOM_3T", /* Roads and Buildings #3 (intersection) */
"PROP_ST_PETE_ROOM_5C", /* Roads and Buildings #4 (street corner) */
"PROP_ST_PETE_ROOM_6C", /* Roads and Buildings #5 (street corner) */
"PROP_DOOR_ROLLERTRAIN", /* Roller Door */
"PROP_DOOR_WIN", /* Glass Sliding Door (Aztec) */
"PROP_DOOR_AZTEC", /* Stone Sliding Door (Aztec) */
"PROP_SHUTTLE", /* Moonraker Shuttle */
"PROP_DOOR_AZT_DESK", /* Boardroom Table (Aztec Exhaust Bay) */
"PROP_DOOR_AZT_DESK_TOP", /* Boardroom Table Extension (Aztec Exhaust Bay) */
"PROP_DOOR_AZT_CHAIR", /* Boardroom Chair (Aztec Exhaust Bay) */
"PROP_DOOR_MF", /* Mainframe Door */
"PROP_FLAG", /* Flag Tag Token */
"PROP_BARRICADE", /* Road Barricade */
"PROP_MODEMBOX", /* Covert Modem Connection Screen */
"PROP_DOORPANEL", /* Sliding Door Activation Switch */
"PROP_DOORCONSOLE", /* Console w/ Activation Light */
"PROP_CHRTESTTUBE", /* Glass Test Tube */
"PROP_BOLLARD", /* Bollard */
};
char *CAMERAMODE_ToString[] = {
"CAMERAMODE_NONE",
"CAMERAMODE_INTRO",
"CAMERAMODE_FADESWIRL",
"CAMERAMODE_SWIRL",
"CAMERAMODE_FP",
"CAMERAMODE_DEATH_CAM_SP",
"CAMERAMODE_DEATH_CAM_MP",
"CAMERAMODE_POSEND",
"CAMERAMODE_FP_NOINPUT",
"CAMERAMODE_MP",
"CAMERAMODE_FADE_TO_TITLE",
};
char *INTRO_TYPE_ToString[] = {
"INTROTYPE_SPAWN",
"INTROTYPE_ITEM",
"INTROTYPE_AMMO",
"INTROTYPE_SWIRL",
"INTROTYPE_ANIM",
"INTROTYPE_CUFF",
"INTROTYPE_CAMERA",
"INTROTYPE_WATCH",
"INTROTYPE_CREDITS",
"INTROTYPE_END",
};
char *MISSION_STATE_IDS_ToString[] = {
"MISSION_STATE_0",
"MISSION_STATE_1",
"MISSION_STATE_2",
"MISSION_STATE_3",
"MISSION_STATE_4",
"MISSION_STATE_5",
"MISSION_STATE_6"};
char *OBJECTIVESTATUS_ToString[] = {
"OBJECTIVESTATUS_INCOMPLETE",
"OBJECTIVESTATUS_COMPLETE",
"OBJECTIVESTATUS_FAILED"};
char *GAILIST_ToString[] = {
"GAILIST_AIM_AT_BOND",
"GAILIST_DEAD_AI",
"GAILIST_STANDARD_GUARD",
"GAILIST_PLAY_IDLE_ANIMATION",
"GAILIST_BASH_KEYBOARD",
"GAILIST_SIMPLE_GUARD_DEAF",
"GAILIST_ATTACK_BOND",
"GAILIST_SIMPLE_GUARD",
"GAILIST_RUN_TO_BOND",
"GAILIST_SIMPLE_GUARD_ALARM_RAISER",
"GAILIST_STARTLE_AND_RUN_TO_BOND",
"GAILIST_TRY_CLONE_SEND_OR_RUN_TO_BOND",
"GAILIST_STANDARD_CLONE",
"GAILIST_PERSISTENTLY_CHASE_AND_ATTACK_BOND",
"GAILIST_WAIT_ONE_SECOND",
"GAILIST_END_LEVEL",
"GAILIST_DRAW_TT33_AND_ATTCK_BOND",
"GAILIST_REMOVE_CHR"};
char *LEVELID_ToString[] = {
"LEVELID_NONE",
"LEVELID_DEFAULT",
"",
"",
"",
"",
"",
"",
"",
"",
"LEVELID_BUNKER1",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"LEVELID_SILO",
"",
"LEVELID_STATUE",
"LEVELID_CONTROL",
"LEVELID_ARCHIVES",
"LEVELID_TRAIN",
"LEVELID_FRIGATE",
"LEVELID_BUNKER2",
"LEVELID_AZTEC",
"LEVELID_STREETS",
"LEVELID_DEPOT",
"LEVELID_COMPLEX",
"LEVELID_EGYPT",
"LEVELID_DAM",
"LEVELID_FACILITY",
"LEVELID_RUNWAY",
"LEVELID_SURFACE",
"LEVELID_JUNGLE",
"LEVELID_TEMPLE",
"LEVELID_CAVERNS",
"LEVELID_CITADEL",
"LEVELID_CRADLE",
"LEVELID_SHO",
"LEVELID_SURFACE2",
"LEVELID_ELD",
"LEVELID_BASEMENT",
"LEVELID_STACK",
"LEVELID_LUE",
"LEVELID_LIBRARY",
"LEVELID_RIT",
"LEVELID_CAVES",
"LEVELID_EAR",
"LEVELID_LEE",
"LEVELID_LIP",
"LEVELID_CUBA",
"LEVELID_WAX",
"LEVELID_PAM",
"LEVELID_MAX",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"LEVELID_TITLE"};
char *TEXTBANK_LEVEL_INDEX_ToString[] =
{
"LNULL", /* Null (unused) */
"LAME", /* Library (multi) */
"LARCH", /* Archives */
"LARK", /* Facility */
"LASH", /* Stack (multi) */
"LAZT", /* Aztec */
"LCAT", /* Citadel (multi) */
"LCAVE", /* Caverns */
"LAREC", /* Control */
"LCRAD", /* Cradle */
"LCRYP", /* Egypt */
"LDAM", /* Dam */
"LDEPO", /* Depot */
"LDEST", /* Frigate */
"LDISH", /* Temple (multi) */
"LEAR", /* Ear (unused) */
"LELD", /* Eld (unused) */
"LIMP", /* Basement (multi) */
"LJUN", /* Jungle */
"LLEE", /* Lee (unused) */
"LLEN", /* Cuba */
"LLIP", /* Lip (unused) */
"LLUE", /* Lue (unused) */
"LOAT", /* Cave (multi) */
"LPAM", /* Pam (unused) */
"LPETE", /* Streets */
"LREF", /* Complex (multi) */
"LRIT", /* Rit (unused) */
"LRUN", /* Runway */
"LSEVB", /* Bunker 2 */
"LSEV", /* Bunker 1 */
"LSEVX", /* Surface 1 */
"LSEVXB", /* Surface 2 */
"LSHO", /* Sho (unused) */
"LSILO", /* Silo */
"LSTAT", /* Statue */
"LTRA", /* Train */
"LWAX", /* Wax (unused) */
"LGUN", /* Guns */
"LTITLE", /* Stage and menu titles */
"LMPMENU", /* Multi menus */
"LPROPOBJ", /* In-game pickups */
"LMPWEAPONS", /* Multi weapon select */
"LOPTIONS", /* Solo in-game menus */
"LMISC" /* Cheat options */
};
#pragma region lengths
#define AI_GotoNext_LENGTH 2
#define AI_GotoFirst_LENGTH 2
#define AI_Label_LENGTH 2
#define AI_Yield_LENGTH 1
#define AI_EndList_LENGTH /*canonical name*/ 1
#define AI_SetChrAiList_LENGTH 4
#define AI_SetReturnAiList_LENGTH 3
#define AI_Return_LENGTH 1
#define AI_Stop_LENGTH 1
#define AI_Kneel_LENGTH 1
#define AI_PlayAnimation_LENGTH 9
#define AI_IFPlayingAnimation_LENGTH 2
#define AI_PointAtBond_LENGTH 1
#define AI_LookSurprised_LENGTH 1
#define AI_TRYSidestepping_LENGTH 2
#define AI_TRYSideHopping_LENGTH 2
#define AI_TRYSideRunning_LENGTH 2
#define AI_TRYFiringWalk_LENGTH 2
#define AI_TRYFiringRun_LENGTH 2
#define AI_TRYFiringRoll_LENGTH 2
#define AI_TRYFireOrAimAtTarget_LENGTH 6
#define AI_TRYFireOrAimAtTargetKneel_LENGTH 6
#define AI_IFImFiring_LENGTH 2
#define AI_IFImFiringAndLockedForward_LENGTH 2
#define AI_TRYFireOrAimAtTargetUpdate_LENGTH 6
#define AI_TRYFacingTarget_LENGTH 6
#define AI_HitChrWithItem_LENGTH 4
#define AI_ChrHitChr_LENGTH 4
#define AI_TRYThrowingGrenade_LENGTH 2
#define AI_TRYDroppingItem_LENGTH 5
#define AI_RunToPad_LENGTH 3
#define AI_RunToPadPreset_LENGTH 1
#define AI_WalkToPad_LENGTH 3
#define AI_SprintToPad_LENGTH 3
#define AI_StartPatrol_LENGTH 2
#define AI_Surrender_LENGTH 1
#define AI_RemoveMe_LENGTH 1
#define AI_ChrRemoveInstant_LENGTH 2
#define AI_TRYTriggeringAlarmAtPad_LENGTH 4
#define AI_AlarmOn_LENGTH 1
#define AI_AlarmOff_LENGTH 1
#define AI_TRYRunFromBond_LENGTH 2
#define AI_TRYRunToBond_LENGTH 2
#define AI_TRYWalkToBond_LENGTH 2
#define AI_TRYSprintToBond_LENGTH 2
#define AI_TRYFindCover_LENGTH 2
#define AI_TRYRunToChr_LENGTH 3
#define AI_TRYWalkToChr_LENGTH 3
#define AI_TRYSprintToChr_LENGTH 3
#define AI_IFImOnPatrolOrStopped_LENGTH 2
#define AI_IFChrDyingOrDead_LENGTH 3
#define AI_IFChrDoesNotExist_LENGTH 3
#define AI_IFISeeBond_LENGTH 2
#define AI_SetNewRandom_LENGTH 1
#define AI_IFRandomLessThan_LENGTH 3
#define AI_IFRandomGreaterThan_LENGTH 3
#define AI_IFICanHearAlarm_LENGTH 2
#define AI_IFAlarmIsOn_LENGTH 2
#define AI_IFGasIsLeaking_LENGTH 2
#define AI_IFIHeardBond_LENGTH 2
#define AI_IFISeeSomeoneShot_LENGTH 2
#define AI_IFISeeSomeoneDie_LENGTH 2
#define AI_IFICouldSeeBond_LENGTH 2
#define AI_IFICouldSeeBondsStan_LENGTH 2
#define AI_IFIWasShotRecently_LENGTH 2
#define AI_IFIHeardBondRecently_LENGTH 2
#define AI_IFImInRoomWithChr_LENGTH 3
#define AI_IFIveNotBeenSeen_LENGTH 2
#define AI_IFImOnScreen_LENGTH 2
#define AI_IFMyRoomIsOnScreen_LENGTH 2
#define AI_IFRoomWithPadIsOnScreen_LENGTH 4
#define AI_IFImTargetedByBond_LENGTH 2
#define AI_IFBondMissedMe_LENGTH 2
#define AI_IFMyAngleToBondLessThan_LENGTH 3
#define AI_IFMyAngleToBondGreaterThan_LENGTH 3
#define AI_IFMyAngleFromBondLessThan_LENGTH 3
#define AI_IFMyAngleFromBondGreaterThan_LENGTH 3
#define AI_IFMyDistanceToBondLessThanDecimeter_LENGTH 4
#define AI_IFMyDistanceToBondGreaterThanDecimeter_LENGTH 4
#define AI_IFChrDistanceToPadLessThanDecimeter_LENGTH 7
#define AI_IFChrDistanceToPadGreaterThanDecimeter_LENGTH 7
#define AI_IFMyDistanceToChrLessThanDecimeter_LENGTH 5
#define AI_IFMyDistanceToChrGreaterThanDecimeter_LENGTH 5
#define AI_TRYSettingMyPresetToChrWithinDistanceDecimeter_LENGTH 4
#define AI_IFBondDistanceToPadLessThanDecimeter_LENGTH 6
#define AI_IFBondDistanceToPadGreaterThanDecimeter_LENGTH 6
#define AI_IFChrInRoomWithPad_LENGTH 5
#define AI_IFBondInRoomWithPad_LENGTH 4
#define AI_IFBondCollectedObject_LENGTH 3
#define AI_IFKeyDropped_LENGTH 3
#define AI_IFItemIsAttachedToObject_LENGTH 4
#define AI_IFBondHasItemEquipped_LENGTH 3
#define AI_IFObjectExists_LENGTH 3
#define AI_IFObjectNotDestroyed_LENGTH 3
#define AI_IFObjectWasActivated_LENGTH 3
#define AI_IFBondUsedGadgetOnObject_LENGTH 3
#define AI_ActivateObject_LENGTH 2
#define AI_DestroyObject_LENGTH 2
#define AI_DropObject_LENGTH 2
#define AI_ChrDropAllConcealedItems_LENGTH 2
#define AI_ChrDropAllHeldItems_LENGTH 2
#define AI_BondCollectObject_LENGTH 2
#define AI_ChrEquipObject_LENGTH 3
#define AI_MoveObject_LENGTH 4
#define AI_DoorOpen_LENGTH 2
#define AI_DoorClose_LENGTH 2
#define AI_IFDoorStateEqual_LENGTH 4
#define AI_IFDoorHasBeenOpenedBefore_LENGTH 3
#define AI_DoorSetLock_LENGTH 3
#define AI_DoorUnsetLock_LENGTH 3
#define AI_IFDoorLockEqual_LENGTH 4
#define AI_IFObjectiveNumComplete_LENGTH 3
#define AI_TRYUnknown6e_LENGTH 3
#define AI_TRYUnknown6f_LENGTH 3
#define AI_IFGameDifficultyLessThan_LENGTH 3
#define AI_IFGameDifficultyGreaterThan_LENGTH 3
#define AI_IFMissionTimeLessThan_LENGTH 4
#define AI_IFMissionTimeGreaterThan_LENGTH 4
#define AI_IFSystemPowerTimeLessThan_LENGTH 4
#define AI_IFSystemPowerTimeGreaterThan_LENGTH 4
#define AI_IFLevelIdLessThan_LENGTH 3
#define AI_IFLevelIdGreaterThan_LENGTH 3
#define AI_IFMyNumArghsLessThan_LENGTH 3
#define AI_IFMyNumArghsGreaterThan_LENGTH 3
#define AI_IFMyNumCloseArghsLessThan_LENGTH 3
#define AI_IFMyNumCloseArghsGreaterThan_LENGTH 3
#define AI_IFChrHealthLessThan_LENGTH 4
#define AI_IFChrHealthGreaterThan_LENGTH 4
#define AI_IFChrWasDamagedSinceLastCheck_LENGTH 3
#define AI_IFBondHealthLessThan_LENGTH 3
#define AI_IFBondHealthGreaterThan_LENGTH 3
#define AI_SetMyMorale_LENGTH 2
#define AI_AddToMyMorale_LENGTH 2
#define AI_SubtractFromMyMorale_LENGTH 2
#define AI_IFMyMoraleLessThan_LENGTH 3
#define AI_IFMyMoraleLessThanRandom_LENGTH 2
#define AI_SetMyAlertness_LENGTH 2
#define AI_AddToMyAlertness_LENGTH 2
#define AI_SubtractFromMyAlertness_LENGTH 2
#define AI_IFMyAlertnessLessThan_LENGTH 3
#define AI_IFMyAlertnessLessThanRandom_LENGTH 2
#define AI_SetMyHearingScale_LENGTH 3
#define AI_SetMyVisionRange_LENGTH 2
#define AI_SetMyGrenadeProbability_LENGTH 2
#define AI_SetMyChrNum_LENGTH 2
#define AI_SetMyHealthTotal_LENGTH 3
#define AI_SetMyArmour_LENGTH 3
#define AI_SetMySpeedRating_LENGTH 2
#define AI_SetMyArghRating_LENGTH 2
#define AI_SetMyAccuracyRating_LENGTH 2
#define AI_SetMyFlags2_LENGTH 2
#define AI_UnsetMyFlags2_LENGTH 2
#define AI_IFMyFlags2Has_LENGTH 3
#define AI_SetChrBitfield_LENGTH 3
#define AI_UnsetChrBitfield_LENGTH 3
#define AI_IFChrBitfieldHas_LENGTH 4
#define AI_SetObjectiveBitfield_LENGTH 5
#define AI_UnsetObjectiveBitfield_LENGTH 5
#define AI_IFObjectiveBitfieldHas_LENGTH 6
#define AI_SetMychrflags_LENGTH 5
#define AI_UnsetMychrflags_LENGTH 5
#define AI_IFMychrflagsHas_LENGTH 6
#define AI_SetChrchrflags_LENGTH 6
#define AI_UnsetChrchrflags_LENGTH 6
#define AI_IFChrchrflagsHas_LENGTH 7
#define AI_SetObjectFlags_LENGTH 6
#define AI_UnsetObjectFlags_LENGTH 6
#define AI_IFObjectFlagsHas_LENGTH 7
#define AI_SetObjectFlags2_LENGTH 6
#define AI_UnsetObjectFlags2_LENGTH 6
#define AI_IFObjectFlags2Has_LENGTH 7
#define AI_SetMyChrPreset_LENGTH 2
#define AI_SetChrChrPreset_LENGTH 3
#define AI_SetMyPadPreset_LENGTH 3
#define AI_SetChrPadPreset_LENGTH 4
#define AI_MyTimerStart_LENGTH 1
#define AI_MyTimerReset_LENGTH 1
#define AI_MyTimerPause_LENGTH 1
#define AI_MyTimerResume_LENGTH 1
#define AI_IFMyTimerIsNotRunning_LENGTH 2
#define AI_IFMyTimerLessThanTicks_LENGTH 5
#define AI_IFMyTimerGreaterThanTicks_LENGTH 5
#define AI_HudCountdownShow_LENGTH 1
#define AI_HudCountdownHide_LENGTH 1
#define AI_HudCountdownSet_LENGTH 3
#define AI_HudCountdownStop_LENGTH 1
#define AI_HudCountdownStart_LENGTH 1
#define AI_IFHudCountdownIsNotRunning_LENGTH 2
#define AI_IFHudCountdownLessThan_LENGTH 4
#define AI_IFHudCountdownGreaterThan_LENGTH 4
#define AI_TRYSpawningChrAtPad_LENGTH 12
#define AI_TRYSpawningChrNextToChr_LENGTH 11
#define AI_TRYGiveMeItem_LENGTH 9
#define AI_TRYGiveMeHat_LENGTH 8
#define AI_TRYCloningChr_LENGTH 5
#define AI_TextPrintBottom_LENGTH 3
#define AI_TextPrintTop_LENGTH 3
#define AI_SfxPlay_LENGTH 4
#define AI_SfxEmitFromObject_LENGTH 5
#define AI_SfxEmitFromPad_LENGTH 6
#define AI_SfxSetChannelVolume_LENGTH 6
#define AI_SfxFadeChannelVolume_LENGTH 6
#define AI_SfxStopChannel_LENGTH 2
#define AI_IFSfxChannelVolumeLessThan_LENGTH 5
#define AI_VehicleStartPath_LENGTH 2
#define AI_VehicleSpeed_LENGTH 5
#define AI_AircraftRotorSpeed_LENGTH 5
#define AI_IFCameraIsInIntro_LENGTH 2
#define AI_IFCameraIsInBondSwirl_LENGTH 2
#define AI_TvChangeScreenBank_LENGTH 4
#define AI_IFBondInTank_LENGTH /*canonical name*/ 2
#define AI_EndLevel_LENGTH /* canonical name */ 1
#define AI_CameraReturnToBond_LENGTH 1
#define AI_CameraLookAtBondFromPad_LENGTH 3
#define AI_CameraSwitch_LENGTH 6
#define AI_IFBondYPosLessThan_LENGTH 4
#define AI_BondDisableControl_LENGTH 2
#define AI_BondEnableControl_LENGTH 1
#define AI_TRYTeleportingChrToPad_LENGTH 5
#define AI_ScreenFadeToBlack_LENGTH 1
#define AI_ScreenFadeFromBlack_LENGTH 1
#define AI_IFScreenFadeCompleted_LENGTH 2
#define AI_HideAllChrs_LENGTH 1
#define AI_ShowAllChrs_LENGTH 1
#define AI_DoorOpenInstant_LENGTH 2
#define AI_ChrRemoveItemInHand_LENGTH 3
#define AI_IfNumberOfActivePlayersLessThan_LENGTH 3
#define AI_IFBondItemTotalAmmoLessThan_LENGTH 4
#define AI_BondEquipItem_LENGTH 2
#define AI_BondEquipItemCinema_LENGTH 2
#define AI_BondSetLockedVelocity_LENGTH 3
#define AI_IFObjectInRoomWithPad_LENGTH 5
#define AI_SwitchSky_LENGTH 1
#define AI_TriggerFadeAndExitLevelOnButtonPress_LENGTH 1
#define AI_IFBondIsDead_LENGTH 2
#define AI_BondDisableDamageAndPickups_LENGTH 1
#define AI_BondHideWeapons_LENGTH 1
#define AI_CameraOrbitPad_LENGTH 13
#define AI_CreditsRoll_LENGTH 1
#define AI_IFCreditsHasCompleted_LENGTH 2
#define AI_IFObjectiveAllCompleted_LENGTH 2
#define AI_IFFolderActorIsEqual_LENGTH 3
#define AI_IFBondDamageAndPickupsDisabled_LENGTH 2
#define AI_MusicPlaySlot_LENGTH 4
#define AI_MusicStopSlot_LENGTH 2
#define AI_TriggerExplosionsAroundBond_LENGTH 1
#define AI_IFKilledCiviliansGreaterThan_LENGTH 3
#define AI_IFChrWasShotSinceLastCheck_LENGTH 3
#define AI_BondKilledInAction_LENGTH 1
#define AI_RaiseArms_LENGTH 1
#define AI_GasLeakAndFadeFog_LENGTH 1
#define AI_ObjectRocketLaunch_LENGTH 2
#pragma endregion //w
int AI_CMD_LENGTHS_ToInt[] = {
AI_GotoNext_LENGTH,
AI_GotoFirst_LENGTH,
AI_Label_LENGTH,
AI_Yield_LENGTH,
AI_EndList_LENGTH,
AI_SetChrAiList_LENGTH,
AI_SetReturnAiList_LENGTH,
AI_Return_LENGTH,
AI_Stop_LENGTH,
AI_Kneel_LENGTH,
AI_PlayAnimation_LENGTH,
AI_IFPlayingAnimation_LENGTH,
AI_PointAtBond_LENGTH,
AI_LookSurprised_LENGTH,
AI_TRYSidestepping_LENGTH,
AI_TRYSideHopping_LENGTH,
AI_TRYSideRunning_LENGTH,
AI_TRYFiringWalk_LENGTH,
AI_TRYFiringRun_LENGTH,
AI_TRYFiringRoll_LENGTH,
AI_TRYFireOrAimAtTarget_LENGTH,
AI_TRYFireOrAimAtTargetKneel_LENGTH,
AI_TRYFireOrAimAtTargetUpdate_LENGTH,
AI_TRYFacingTarget_LENGTH,
AI_HitChrWithItem_LENGTH,
AI_ChrHitChr_LENGTH,
AI_TRYThrowingGrenade_LENGTH,
AI_TRYDroppingItem_LENGTH,
AI_RunToPad_LENGTH,
AI_RunToPadPreset_LENGTH,
AI_WalkToPad_LENGTH,
AI_SprintToPad_LENGTH,
AI_StartPatrol_LENGTH,
AI_Surrender_LENGTH,
AI_RemoveMe_LENGTH,
AI_ChrRemoveInstant_LENGTH,
AI_TRYTriggeringAlarmAtPad_LENGTH,
AI_AlarmOn_LENGTH,
AI_AlarmOff_LENGTH,
AI_TRYRunFromBond_LENGTH,
AI_TRYRunToBond_LENGTH,
AI_TRYWalkToBond_LENGTH,
AI_TRYSprintToBond_LENGTH,
AI_TRYFindCover_LENGTH,
AI_TRYRunToChr_LENGTH,
AI_TRYWalkToChr_LENGTH,
AI_TRYSprintToChr_LENGTH,
AI_IFImOnPatrolOrStopped_LENGTH,
AI_IFChrDyingOrDead_LENGTH,
AI_IFChrDoesNotExist_LENGTH,
AI_IFISeeBond_LENGTH,
AI_SetNewRandom_LENGTH,
AI_IFRandomLessThan_LENGTH,
AI_IFRandomGreaterThan_LENGTH,
AI_IFICanHearAlarm_LENGTH,
AI_IFAlarmIsOn_LENGTH,
AI_IFGasIsLeaking_LENGTH,
AI_IFIHeardBond_LENGTH,
AI_IFISeeSomeoneShot_LENGTH,
AI_IFISeeSomeoneDie_LENGTH,
AI_IFICouldSeeBond_LENGTH,
AI_IFICouldSeeBondsStan_LENGTH,
AI_IFIWasShotRecently_LENGTH,
AI_IFIHeardBondRecently_LENGTH,
AI_IFImInRoomWithChr_LENGTH,
AI_IFIveNotBeenSeen_LENGTH,
AI_IFImOnScreen_LENGTH,
AI_IFMyRoomIsOnScreen_LENGTH,
AI_IFRoomWithPadIsOnScreen_LENGTH,
AI_IFImTargetedByBond_LENGTH,
AI_IFBondMissedMe_LENGTH,
AI_IFMyAngleToBondLessThan_LENGTH,
AI_IFMyAngleToBondGreaterThan_LENGTH,
AI_IFMyAngleFromBondLessThan_LENGTH,
AI_IFMyAngleFromBondGreaterThan_LENGTH,
AI_IFMyDistanceToBondLessThanDecimeter_LENGTH,
AI_IFMyDistanceToBondGreaterThanDecimeter_LENGTH,
AI_IFChrDistanceToPadLessThanDecimeter_LENGTH,
AI_IFChrDistanceToPadGreaterThanDecimeter_LENGTH,
AI_IFMyDistanceToChrLessThanDecimeter_LENGTH,
AI_IFMyDistanceToChrGreaterThanDecimeter_LENGTH,
AI_TRYSettingMyPresetToChrWithinDistanceDecimeter_LENGTH,
AI_IFBondDistanceToPadLessThanDecimeter_LENGTH,
AI_IFBondDistanceToPadGreaterThanDecimeter_LENGTH,
AI_IFChrInRoomWithPad_LENGTH,
AI_IFBondInRoomWithPad_LENGTH,
AI_IFBondCollectedObject_LENGTH,
AI_IFKeyDropped_LENGTH,
AI_IFItemIsAttachedToObject_LENGTH,
AI_IFBondHasItemEquipped_LENGTH,
AI_IFObjectExists_LENGTH,
AI_IFObjectNotDestroyed_LENGTH,
AI_IFObjectWasActivated_LENGTH,
AI_IFBondUsedGadgetOnObject_LENGTH,
AI_ActivateObject_LENGTH,
AI_DestroyObject_LENGTH,
AI_DropObject_LENGTH,
AI_ChrDropAllConcealedItems_LENGTH,
AI_ChrDropAllHeldItems_LENGTH,
AI_BondCollectObject_LENGTH,
AI_ChrEquipObject_LENGTH,
AI_MoveObject_LENGTH,
AI_DoorOpen_LENGTH,
AI_DoorClose_LENGTH,
AI_IFDoorStateEqual_LENGTH,
AI_IFDoorHasBeenOpenedBefore_LENGTH,
AI_DoorSetLock_LENGTH,
AI_DoorUnsetLock_LENGTH,
AI_IFDoorLockEqual_LENGTH,
AI_IFObjectiveNumComplete_LENGTH,
AI_TRYUnknown6e_LENGTH,
AI_TRYUnknown6f_LENGTH,
AI_IFGameDifficultyLessThan_LENGTH,
AI_IFGameDifficultyGreaterThan_LENGTH,
AI_IFMissionTimeLessThan_LENGTH,
AI_IFMissionTimeGreaterThan_LENGTH,
AI_IFSystemPowerTimeLessThan_LENGTH,
AI_IFSystemPowerTimeGreaterThan_LENGTH,
AI_IFLevelIdLessThan_LENGTH,
AI_IFLevelIdGreaterThan_LENGTH,
AI_IFMyNumArghsLessThan_LENGTH,
AI_IFMyNumArghsGreaterThan_LENGTH,
AI_IFMyNumCloseArghsLessThan_LENGTH,
AI_IFMyNumCloseArghsGreaterThan_LENGTH,
AI_IFChrHealthLessThan_LENGTH,
AI_IFChrHealthGreaterThan_LENGTH,
AI_IFChrWasDamagedSinceLastCheck_LENGTH,
AI_IFBondHealthLessThan_LENGTH,
AI_IFBondHealthGreaterThan_LENGTH,
AI_SetMyMorale_LENGTH,
AI_AddToMyMorale_LENGTH,
AI_SubtractFromMyMorale_LENGTH,
AI_IFMyMoraleLessThan_LENGTH,
AI_IFMyMoraleLessThanRandom_LENGTH,
AI_SetMyAlertness_LENGTH,
AI_AddToMyAlertness_LENGTH,
AI_SubtractFromMyAlertness_LENGTH,
AI_IFMyAlertnessLessThan_LENGTH,
AI_IFMyAlertnessLessThanRandom_LENGTH,
AI_SetMyHearingScale_LENGTH,
AI_SetMyVisionRange_LENGTH,
AI_SetMyGrenadeProbability_LENGTH,
AI_SetMyChrNum_LENGTH,
AI_SetMyHealthTotal_LENGTH,
AI_SetMyArmour_LENGTH,
AI_SetMySpeedRating_LENGTH,
AI_SetMyArghRating_LENGTH,
AI_SetMyAccuracyRating_LENGTH,
AI_SetMyFlags2_LENGTH,
AI_UnsetMyFlags2_LENGTH,
AI_IFMyFlags2Has_LENGTH,
AI_SetChrBitfield_LENGTH,
AI_UnsetChrBitfield_LENGTH,
AI_IFChrBitfieldHas_LENGTH,
AI_SetObjectiveBitfield_LENGTH,
AI_UnsetObjectiveBitfield_LENGTH,
AI_IFObjectiveBitfieldHas_LENGTH,
AI_SetMychrflags_LENGTH,
AI_UnsetMychrflags_LENGTH,
AI_IFMychrflagsHas_LENGTH,
AI_SetChrchrflags_LENGTH,
AI_UnsetChrchrflags_LENGTH,
AI_IFChrchrflagsHas_LENGTH,
AI_SetObjectFlags_LENGTH,
AI_UnsetObjectFlags_LENGTH,
AI_IFObjectFlagsHas_LENGTH,
AI_SetObjectFlags2_LENGTH,
AI_UnsetObjectFlags2_LENGTH,
AI_IFObjectFlags2Has_LENGTH,
AI_SetMyChrPreset_LENGTH,
AI_SetChrChrPreset_LENGTH,
AI_SetMyPadPreset_LENGTH,
AI_SetChrPadPreset_LENGTH,
0,
AI_MyTimerStart_LENGTH,
AI_MyTimerReset_LENGTH,
AI_MyTimerPause_LENGTH,
AI_MyTimerResume_LENGTH,
AI_IFMyTimerIsNotRunning_LENGTH,
AI_IFMyTimerLessThanTicks_LENGTH,
AI_IFMyTimerGreaterThanTicks_LENGTH,
AI_HudCountdownShow_LENGTH,
AI_HudCountdownHide_LENGTH,
AI_HudCountdownSet_LENGTH,
AI_HudCountdownStop_LENGTH,
AI_HudCountdownStart_LENGTH,
AI_IFHudCountdownIsNotRunning_LENGTH,
AI_IFHudCountdownLessThan_LENGTH,
AI_IFHudCountdownGreaterThan_LENGTH,
AI_TRYSpawningChrAtPad_LENGTH,
AI_TRYSpawningChrNextToChr_LENGTH,
AI_TRYGiveMeItem_LENGTH,
AI_TRYGiveMeHat_LENGTH,
AI_TRYCloningChr_LENGTH,
AI_TextPrintBottom_LENGTH,
AI_TextPrintTop_LENGTH,
AI_SfxPlay_LENGTH,
AI_SfxEmitFromObject_LENGTH,
AI_SfxEmitFromPad_LENGTH,
AI_SfxSetChannelVolume_LENGTH,
AI_SfxFadeChannelVolume_LENGTH,
AI_SfxStopChannel_LENGTH,
AI_IFSfxChannelVolumeLessThan_LENGTH,
AI_VehicleStartPath_LENGTH,
AI_VehicleSpeed_LENGTH,
AI_AircraftRotorSpeed_LENGTH,
AI_IFCameraIsInIntro_LENGTH,
AI_IFCameraIsInBondSwirl_LENGTH,
AI_TvChangeScreenBank_LENGTH,
AI_IFBondInTank_LENGTH,
AI_EndLevel_LENGTH,
AI_CameraReturnToBond_LENGTH,
AI_CameraLookAtBondFromPad_LENGTH,
AI_CameraSwitch_LENGTH,
AI_IFBondYPosLessThan_LENGTH,
AI_BondDisableControl_LENGTH,
AI_BondEnableControl_LENGTH,
AI_TRYTeleportingChrToPad_LENGTH,
AI_ScreenFadeToBlack_LENGTH,
AI_ScreenFadeFromBlack_LENGTH,
AI_IFScreenFadeCompleted_LENGTH,
AI_HideAllChrs_LENGTH,
AI_ShowAllChrs_LENGTH,
AI_DoorOpenInstant_LENGTH,
AI_ChrRemoveItemInHand_LENGTH,
AI_IfNumberOfActivePlayersLessThan_LENGTH,
AI_IFBondItemTotalAmmoLessThan_LENGTH,
AI_BondEquipItem_LENGTH,
AI_BondEquipItemCinema_LENGTH,
AI_BondSetLockedVelocity_LENGTH,
AI_IFObjectInRoomWithPad_LENGTH,
AI_IFImFiringAndLockedForward_LENGTH,
AI_IFImFiring_LENGTH,
AI_SwitchSky_LENGTH,
AI_TriggerFadeAndExitLevelOnButtonPress_LENGTH,
AI_IFBondIsDead_LENGTH,
AI_BondDisableDamageAndPickups_LENGTH,
AI_BondHideWeapons_LENGTH,
AI_CameraOrbitPad_LENGTH,
AI_CreditsRoll_LENGTH,
AI_IFCreditsHasCompleted_LENGTH,
AI_IFObjectiveAllCompleted_LENGTH,
AI_IFFolderActorIsEqual_LENGTH,
AI_IFBondDamageAndPickupsDisabled_LENGTH,
AI_MusicPlaySlot_LENGTH,
AI_MusicStopSlot_LENGTH,
AI_TriggerExplosionsAroundBond_LENGTH,
AI_IFKilledCiviliansGreaterThan_LENGTH,
AI_IFChrWasShotSinceLastCheck_LENGTH,
AI_BondKilledInAction_LENGTH,
AI_RaiseArms_LENGTH,
AI_GasLeakAndFadeFog_LENGTH,
AI_ObjectRocketLaunch_LENGTH};
typedef enum AI_CMD
{
AI_GotoNext,
AI_GotoFirst,
AI_Label,
AI_Yield,
AI_EndList,
AI_SetChrAiList,
AI_SetReturnAiList,
AI_Return,
AI_Stop,
AI_Kneel,
AI_PlayAnimation,
AI_IFPlayingAnimation,
AI_PointAtBond,
AI_LookSurprised,
AI_TRYSidestepping,
AI_TRYSideHopping,
AI_TRYSideRunning,
AI_TRYFiringWalk,
AI_TRYFiringRun,
AI_TRYFiringRoll,
AI_TRYFireOrAimAtTarget,
AI_TRYFireOrAimAtTargetKneel,
AI_TRYFireOrAimAtTargetUpdate,
AI_TRYFacingTarget,
AI_HitChrWithItem,
AI_ChrHitChr,
AI_TRYThrowingGrenade,
AI_TRYDroppingItem,
AI_RunToPad,
AI_RunToPadPreset,
AI_WalkToPad,
AI_SprintToPad,
AI_StartPatrol,
AI_Surrender,
AI_RemoveMe,
AI_ChrRemoveInstant,
AI_TRYTriggeringAlarmAtPad,
AI_AlarmOn,
AI_AlarmOff,
AI_TRYRunFromBond,
AI_TRYRunToBond,
AI_TRYWalkToBond,
AI_TRYSprintToBond,
AI_TRYFindCover,
AI_TRYRunToChr,
AI_TRYWalkToChr,
AI_TRYSprintToChr,
AI_IFImOnPatrolOrStopped,
AI_IFChrDyingOrDead,
AI_IFChrDoesNotExist,
AI_IFISeeBond,
AI_SetNewRandom,
AI_IFRandomLessThan,
AI_IFRandomGreaterThan,
AI_IFICanHearAlarm,
AI_IFAlarmIsOn,
AI_IFGasIsLeaking,
AI_IFIHeardBond,
AI_IFISeeSomeoneShot,
AI_IFISeeSomeoneDie,
AI_IFICouldSeeBond,
AI_IFICouldSeeBondsStan,
AI_IFIWasShotRecently,
AI_IFIHeardBondRecently,
AI_IFImInRoomWithChr,
AI_IFIveNotBeenSeen,
AI_IFImOnScreen,
AI_IFMyRoomIsOnScreen,
AI_IFRoomWithPadIsOnScreen,
AI_IFImTargetedByBond,
AI_IFBondMissedMe,
AI_IFMyAngleToBondLessThan,
AI_IFMyAngleToBondGreaterThan,
AI_IFMyAngleFromBondLessThan,
AI_IFMyAngleFromBondGreaterThan,
AI_IFMyDistanceToBondLessThanDecimeter,
AI_IFMyDistanceToBondGreaterThanDecimeter,
AI_IFChrDistanceToPadLessThanDecimeter,
AI_IFChrDistanceToPadGreaterThanDecimeter,
AI_IFMyDistanceToChrLessThanDecimeter,
AI_IFMyDistanceToChrGreaterThanDecimeter,
AI_TRYSettingMyPresetToChrWithinDistanceDecimeter,
AI_IFBondDistanceToPadLessThanDecimeter,
AI_IFBondDistanceToPadGreaterThanDecimeter,
AI_IFChrInRoomWithPad,
AI_IFBondInRoomWithPad,
AI_IFBondCollectedObject,
AI_IFKeyDropped,
AI_IFItemIsAttachedToObject,
AI_IFBondHasItemEquipped,
AI_IFObjectExists,
AI_IFObjectNotDestroyed,
AI_IFObjectWasActivated,
AI_IFBondUsedGadgetOnObject,
AI_ActivateObject,
AI_DestroyObject,
AI_DropObject,
AI_ChrDropAllConcealedItems,
AI_ChrDropAllHeldItems,
AI_BondCollectObject,
AI_ChrEquipObject,
AI_MoveObject,
AI_DoorOpen,
AI_DoorClose,
AI_IFDoorStateEqual,
AI_IFDoorHasBeenOpenedBefore,
AI_DoorSetLock,
AI_DoorUnsetLock,
AI_IFDoorLockEqual,
AI_IFObjectiveNumComplete,
AI_TRYUnknown6e,
AI_TRYUnknown6f,
AI_IFGameDifficultyLessThan,
AI_IFGameDifficultyGreaterThan,
AI_IFMissionTimeLessThan,
AI_IFMissionTimeGreaterThan,
AI_IFSystemPowerTimeLessThan,
AI_IFSystemPowerTimeGreaterThan,
AI_IFLevelIdLessThan,
AI_IFLevelIdGreaterThan,
AI_IFMyNumArghsLessThan,
AI_IFMyNumArghsGreaterThan,
AI_IFMyNumCloseArghsLessThan,
AI_IFMyNumCloseArghsGreaterThan,
AI_IFChrHealthLessThan,
AI_IFChrHealthGreaterThan,
AI_IFChrWasDamagedSinceLastCheck,
AI_IFBondHealthLessThan,
AI_IFBondHealthGreaterThan,
AI_SetMyMorale,
AI_AddToMyMorale,
AI_SubtractFromMyMorale,
AI_IFMyMoraleLessThan,
AI_IFMyMoraleLessThanRandom,
AI_SetMyAlertness,
AI_AddToMyAlertness,
AI_SubtractFromMyAlertness,
AI_IFMyAlertnessLessThan,
AI_IFMyAlertnessLessThanRandom,
AI_SetMyHearingScale,
AI_SetMyVisionRange,
AI_SetMyGrenadeProbability,
AI_SetMyChrNum,
AI_SetMyHealthTotal,
AI_SetMyArmour,
AI_SetMySpeedRating,
AI_SetMyArghRating,
AI_SetMyAccuracyRating,
AI_SetMyFlags2,
AI_UnsetMyFlags2,
AI_IFMyFlags2Has,
AI_SetChrBitfield,
AI_UnsetChrBitfield,
AI_IFChrBitfieldHas,
AI_SetObjectiveBitfield,
AI_UnsetObjectiveBitfield,
AI_IFObjectiveBitfieldHas,
AI_SetMychrflags,
AI_UnsetMychrflags,
AI_IFMychrflagsHas,
AI_SetChrchrflags,
AI_UnsetChrchrflags,
AI_IFChrchrflagsHas,
AI_SetObjectFlags,
AI_UnsetObjectFlags,
AI_IFObjectFlagsHas,
AI_SetObjectFlags2,
AI_UnsetObjectFlags2,
AI_IFObjectFlags2Has,
AI_SetMyChrPreset,
AI_SetChrChrPreset,
AI_SetMyPadPreset,
AI_SetChrPadPreset,
AI_PRINT,
AI_MyTimerStart,
AI_MyTimerReset,
AI_MyTimerPause,
AI_MyTimerResume,
AI_IFMyTimerIsNotRunning,
AI_IFMyTimerLessThanTicks,
AI_IFMyTimerGreaterThanTicks,
AI_HudCountdownShow,
AI_HudCountdownHide,
AI_HudCountdownSet,
AI_HudCountdownStop,
AI_HudCountdownStart,
AI_IFHudCountdownIsNotRunning,
AI_IFHudCountdownLessThan,
AI_IFHudCountdownGreaterThan,
AI_TRYSpawningChrAtPad,
AI_TRYSpawningChrNextToChr,
AI_TRYGiveMeItem,
AI_TRYGiveMeHat,
AI_TRYCloningChr,
AI_TextPrintBottom,
AI_TextPrintTop,
AI_SfxPlay,
AI_SfxEmitFromObject,
AI_SfxEmitFromPad,
AI_SfxSetChannelVolume,
AI_SfxFadeChannelVolume,
AI_SfxStopChannel,
AI_IFSfxChannelVolumeLessThan,
AI_VehicleStartPath,
AI_VehicleSpeed,
AI_AircraftRotorSpeed,
AI_IFCameraIsInIntro,
AI_IFCameraIsInBondSwirl,
AI_TvChangeScreenBank,
AI_IFBondInTank,
AI_EndLevel,
AI_CameraReturnToBond,
AI_CameraLookAtBondFromPad,
AI_CameraSwitch,
AI_IFBondYPosLessThan,
AI_BondDisableControl,
AI_BondEnableControl,
AI_TRYTeleportingChrToPad,
AI_ScreenFadeToBlack,
AI_ScreenFadeFromBlack,
AI_IFScreenFadeCompleted,
AI_HideAllChrs,
AI_ShowAllChrs,
AI_DoorOpenInstant,
AI_ChrRemoveItemInHand,
AI_IfNumberOfActivePlayersLessThan,
AI_IFBondItemTotalAmmoLessThan,
AI_BondEquipItem,
AI_BondEquipItemCinema,
AI_BondSetLockedVelocity,
AI_IFObjectInRoomWithPad,
AI_IFImFiringAndLockedForward,
AI_IFImFiring,
AI_SwitchSky,
AI_TriggerFadeAndExitLevelOnButtonPress,
AI_IFBondIsDead,
AI_BondDisableDamageAndPickups,
AI_BondHideWeapons,
AI_CameraOrbitPad,
AI_CreditsRoll,
AI_IFCreditsHasCompleted,
AI_IFObjectiveAllCompleted,
AI_IFFolderActorIsEqual,
AI_IFBondDamageAndPickupsDisabled,
AI_MusicPlaySlot,
AI_MusicStopSlot,
AI_TriggerExplosionsAroundBond,
AI_IFKilledCiviliansGreaterThan,
AI_IFChrWasShotSinceLastCheck,
AI_BondKilledInAction,
AI_RaiseArms,
AI_GasLeakAndFadeFog,
AI_ObjectRocketLaunch,
AI_CMD_COUNT
} AI_CMD;
char *AI_CMD_ToString[] = {
"GotoNext",
"GotoFirst",
"Label",
"Yield",
"EndList",
"SetChrAiList",
"SetReturnAiList",
"Return",
"Stop",
"Kneel",
"PlayAnimation",
"IFPlayingAnimation",
"PointAtBond",
"LookSurprised",
"TRYSidestepping",
"TRYSideHopping",
"TRYSideRunning",
"TRYFiringWalk",
"TRYFiringRun",
"TRYFiringRoll",
"TRYFireOrAimAtTarget",
"TRYFireOrAimAtTargetKneel",
"TRYFireOrAimAtTargetUpdate",
"TRYFacingTarget",
"HitChrWithItem",
"ChrHitChr",
"TRYThrowingGrenade",
"TRYDroppingItem",
"RunToPad",
"RunToPadPreset",
"WalkToPad",
"SprintToPad",
"StartPatrol",
"Surrender",
"RemoveMe",
"ChrRemoveInstant",
"TRYTriggeringAlarmAtPad",
"AlarmOn",
"AlarmOff",
"TRYRunFromBond",
"TRYRunToBond",
"TRYWalkToBond",
"TRYSprintToBond",
"TRYFindCover",
"TRYRunToChr",
"TRYWalkToChr",
"TRYSprintToChr",
"IFImOnPatrolOrStopped",
"IFChrDyingOrDead",
"IFChrDoesNotExist",
"IFISeeBond",
"SetNewRandom",
"IFRandomLessThan",
"IFRandomGreaterThan",
"IFICanHearAlarm",
"IFAlarmIsOn",
"IFGasIsLeaking",
"IFIHeardBond",
"IFISeeSomeoneShot",
"IFISeeSomeoneDie",
"IFICouldSeeBond",
"IFICouldSeeBondsStan",
"IFIWasShotRecently",
"IFIHeardBondRecently",
"IFImInRoomWithChr",
"IFIveNotBeenSeen",
"IFImOnScreen",
"IFMyRoomIsOnScreen",
"IFRoomWithPadIsOnScreen",
"IFImTargetedByBond",
"IFBondMissedMe",
"IFMyAngleToBondLessThan",
"IFMyAngleToBondGreaterThan",
"IFMyAngleFromBondLessThan",
"IFMyAngleFromBondGreaterThan",
"IFMyDistanceToBondLessThanDecimeter",
"IFMyDistanceToBondGreaterThanDecimeter",
"IFChrDistanceToPadLessThanDecimeter",
"IFChrDistanceToPadGreaterThanDecimeter",
"IFMyDistanceToChrLessThanDecimeter",
"IFMyDistanceToChrGreaterThanDecimeter",
"TRYSettingMyPresetToChrWithinDistanceDecimeter",
"IFBondDistanceToPadLessThanDecimeter",
"IFBondDistanceToPadGreaterThanDecimeter",
"IFChrInRoomWithPad",
"IFBondInRoomWithPad",
"IFBondCollectedObject",
"IFKeyDropped",
"IFItemIsAttachedToObject",
"IFBondHasItemEquipped",
"IFObjectExists",
"IFObjectNotDestroyed",
"IFObjectWasActivated",
"IFBondUsedGadgetOnObject",
"ActivateObject",
"DestroyObject",
"DropObject",
"ChrDropAllConcealedItems",
"ChrDropAllHeldItems",
"BondCollectObject",
"ChrEquipObject",
"MoveObject",
"DoorOpen",
"DoorClose",
"IFDoorStateEqual",
"IFDoorHasBeenOpenedBefore",
"DoorSetLock",
"DoorUnsetLock",
"IFDoorLockEqual",
"IFObjectiveNumComplete",
"TRYUnknown6e",
"TRYUnknown6f",
"IFGameDifficultyLessThan",
"IFGameDifficultyGreaterThan",
"IFMissionTimeLessThan",
"IFMissionTimeGreaterThan",
"IFSystemPowerTimeLessThan",
"IFSystemPowerTimeGreaterThan",
"IFLevelIdLessThan",
"IFLevelIdGreaterThan",
"IFMyNumArghsLessThan",
"IFMyNumArghsGreaterThan",
"IFMyNumCloseArghsLessThan",
"IFMyNumCloseArghsGreaterThan",
"IFChrHealthLessThan",
"IFChrHealthGreaterThan",
"IFChrWasDamagedSinceLastCheck",
"IFBondHealthLessThan",
"IFBondHealthGreaterThan",
"SetMyMorale",
"AddToMyMorale",
"SubtractFromMyMorale",
"IFMyMoraleLessThan",
"IFMyMoraleLessThanRandom",
"SetMyAlertness",
"AddToMyAlertness",
"SubtractFromMyAlertness",
"IFMyAlertnessLessThan",
"IFMyAlertnessLessThanRandom",
"SetMyHearingScale",
"SetMyVisionRange",
"SetMyGrenadeProbability",
"SetMyChrNum",
"SetMyHealthTotal",
"SetMyArmour",
"SetMySpeedRating",
"SetMyArghRating",
"SetMyAccuracyRating",
"SetMyFlags2",
"UnsetMyFlags2",
"IFMyFlags2Has",
"SetChrBitfield",
"UnsetChrBitfield",
"IFChrBitfieldHas",
"SetObjectiveBitfield",
"UnsetObjectiveBitfield",
"IFObjectiveBitfieldHas",
"SetMychrflags",
"UnsetMychrflags",
"IFMychrflagsHas",
"SetChrchrflags",
"UnsetChrchrflags",
"IFChrchrflagsHas",
"SetObjectFlags",
"UnsetObjectFlags",
"IFObjectFlagsHas",
"SetObjectFlags2",
"UnsetObjectFlags2",
"IFObjectFlags2Has",
"SetMyChrPreset",
"SetChrChrPreset",
"SetMyPadPreset",
"SetChrPadPreset",
"PRINT",
"MyTimerStart",
"MyTimerReset",
"MyTimerPause",
"MyTimerResume",
"IFMyTimerIsNotRunning",
"IFMyTimerLessThanTicks",
"IFMyTimerGreaterThanTicks",
"HudCountdownShow",
"HudCountdownHide",
"HudCountdownSet",
"HudCountdownStop",
"HudCountdownStart",
"IFHudCountdownIsNotRunning",
"IFHudCountdownLessThan",
"IFHudCountdownGreaterThan",
"TRYSpawningChrAtPad",
"TRYSpawningChrNextToChr",
"TRYGiveMeItem",
"TRYGiveMeHat",
"TRYCloningChr",
"TextPrintBottom",
"TextPrintTop",
"SfxPlay",
"SfxEmitFromObject",
"SfxEmitFromPad",
"SfxSetChannelVolume",
"SfxFadeChannelVolume",
"SfxStopChannel",
"IFSfxChannelVolumeLessThan",
"VehicleStartPath",
"VehicleSpeed",
"AircraftRotorSpeed",
"IFCameraIsInIntro",
"IFCameraIsInBondSwirl",
"TvChangeScreenBank",
"IFBondInTank",
"EndLevel",
"CameraReturnToBond",
"CameraLookAtBondFromPad",
"CameraSwitch",
"IFBondYPosLessThan",
"BondDisableControl",
"BondEnableControl",
"TRYTeleportingChrToPad",
"ScreenFadeToBlack",
"ScreenFadeFromBlack",
"IFScreenFadeCompleted",
"HideAllChrs",
"ShowAllChrs",
"DoorOpenInstant",
"ChrRemoveItemInHand",
"IfNumberOfActivePlayersLessThan",
"IFBondItemTotalAmmoLessThan",
"BondEquipItem",
"BondEquipItemCinema",
"BondSetLockedVelocity",
"IFObjectInRoomWithPad",
"IFImFiringAndLockedForward",
"IFImFiring",
"SwitchSky",
"TriggerFadeAndExitLevelOnButtonPress",
"IFBondIsDead",
"BondDisableDamageAndPickups",
"BondHideWeapons",
"CameraOrbitPad",
"CreditsRoll",
"IFCreditsHasCompleted",
"IFObjectiveAllCompleted",
"IFFolderActorIsEqual",
"IFBondDamageAndPickupsDisabled",
"MusicPlaySlot",
"MusicStopSlot",
"TriggerExplosionsAroundBond",
"IFKilledCiviliansGreaterThan",
"IFChrWasShotSinceLastCheck",
"BondKilledInAction",
"RaiseArms",
"GasLeakAndFadeFog",
"ObjectRocketLaunch"};
#pragma pack(1)
typedef struct AiGotoNextRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiGotoNextRecord;
typedef struct AiGotoFirstRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiGotoFirstRecord;
typedef struct AiLabelRecord
{
u8 cmd;
u8 ID;
} AiLabelRecord;
typedef struct AiYieldRecord
{
u8 cmd;
} AiYieldRecord;
typedef struct AiEndListRecord
{
u8 cmd;
} AiEndListRecord;
typedef struct AiSetChrAiListRecord
{
u8 cmd;
s8 CHR_NUM;
s16 AI_LIST_ID;
} AiSetChrAiListRecord;
typedef struct AiSetReturnAiListRecord
{
u8 cmd;
s16 AI_LIST_ID;
} AiSetReturnAiListRecord;
typedef struct AiReturnRecord
{
u8 cmd;
} AiReturnRecord;
typedef struct AiStopRecord
{
u8 cmd;
} AiStopRecord;
typedef struct AiKneelRecord
{
u8 cmd;
} AiKneelRecord;
typedef struct AiPlayAnimationRecord
{
u8 cmd;
s16 ANIMATION_ID;
s16 START_TIME30;
s16 END_TIME30;
u8 BITFIELD;
u8 INTERPOL_TIME60;
} AiPlayAnimationRecord;
typedef struct AiIFPlayingAnimationRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFPlayingAnimationRecord;
typedef struct AiPointAtBondRecord
{
u8 cmd;
} AiPointAtBondRecord;
typedef struct AiLookSurprisedRecord
{
u8 cmd;
} AiLookSurprisedRecord;
typedef struct AiTRYSidesteppingRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiTRYSidesteppingRecord;
typedef struct AiTRYSideHoppingRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiTRYSideHoppingRecord;
typedef struct AiTRYSideRunningRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiTRYSideRunningRecord;
typedef struct AiTRYFiringWalkRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiTRYFiringWalkRecord;
typedef struct AiTRYFiringRunRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiTRYFiringRunRecord;
typedef struct AiTRYFiringRollRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiTRYFiringRollRecord;
typedef struct AiTRYFireOrAimAtTargetRecord
{
u8 cmd;
s16 BITFIELD;
s16 TARGET;
u8 GOTOLABEL;
} AiTRYFireOrAimAtTargetRecord;
typedef struct AiTRYFireOrAimAtTargetKneelRecord
{
u8 cmd;
s16 BITFIELD;
s16 TARGET;
u8 GOTOLABEL;
} AiTRYFireOrAimAtTargetKneelRecord;
typedef struct AiTRYFireOrAimAtTargetUpdateRecord
{
u8 cmd;
s16 BITFIELD;
s16 TARGET;
u8 GOTOLABEL;
} AiTRYFireOrAimAtTargetUpdateRecord;
typedef struct AiTRYFacingTargetRecord
{
u8 cmd;
s16 BITFIELD;
s16 TARGET;
u8 GOTOLABEL;
} AiTRYFacingTargetRecord;
typedef struct AiHitChrWithItemRecord
{
u8 cmd;
u8 CHR_NUM;
s8 PART_NUM;
u8 ITEM_NUM;
} AiHitChrWithItemRecord;
typedef struct AiChrHitChrRecord
{
u8 cmd;
u8 CHR_NUM;
u8 CHR_NUM_TARGET;
s8 PART_NUM;
} AiChrHitChrRecord;
typedef struct AiTRYThrowingGrenadeRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiTRYThrowingGrenadeRecord;
typedef struct AiTRYDroppingItemRecord
{
u8 cmd;
s16 PROP_NUM;
u8 ITEM_NUM;
u8 GOTOLABEL;
} AiTRYDroppingItemRecord;
typedef struct AiRunToPadRecord
{
u8 cmd;
s16 PAD;
} AiRunToPadRecord;
typedef struct AiRunToPadPresetRecord
{
u8 cmd;
} AiRunToPadPresetRecord;
typedef struct AiWalkToPadRecord
{
u8 cmd;
s16 PAD;
} AiWalkToPadRecord;
typedef struct AiSprintToPadRecord
{
u8 cmd;
s16 PAD;
} AiSprintToPadRecord;
typedef struct AiStartPatrolRecord
{
u8 cmd;
u8 PATH_NUM;
} AiStartPatrolRecord;
typedef struct AiSurrenderRecord
{
u8 cmd;
} AiSurrenderRecord;
typedef struct AiRemoveMeRecord
{
u8 cmd;
} AiRemoveMeRecord;
typedef struct AiChrRemoveInstantRecord
{
u8 cmd;
u8 CHR_NUM;
} AiChrRemoveInstantRecord;
typedef struct AiTRYTriggeringAlarmAtPadRecord
{
u8 cmd;
s16 PAD;
u8 GOTOLABEL;
} AiTRYTriggeringAlarmAtPadRecord;
typedef struct AiAlarmOnRecord
{
u8 cmd;
} AiAlarmOnRecord;
typedef struct AiAlarmOffRecord
{
u8 cmd;
} AiAlarmOffRecord;
typedef struct AiTRYRunFromBondRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiTRYRunFromBondRecord;
typedef struct AiTRYRunToBondRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiTRYRunToBondRecord;
typedef struct AiTRYWalkToBondRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiTRYWalkToBondRecord;
typedef struct AiTRYSprintToBondRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiTRYSprintToBondRecord;
typedef struct AiTRYFindCoverRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiTRYFindCoverRecord;
typedef struct AiTRYRunToChrRecord
{
u8 cmd;
u8 CHR_NUM;
u8 GOTOLABEL;
} AiTRYRunToChrRecord;
typedef struct AiTRYWalkToChrRecord
{
u8 cmd;
u8 CHR_NUM;
u8 GOTOLABEL;
} AiTRYWalkToChrRecord;
typedef struct AiTRYSprintToChrRecord
{
u8 cmd;
u8 CHR_NUM;
u8 GOTOLABEL;
} AiTRYSprintToChrRecord;
typedef struct AiIFImOnPatrolOrStoppedRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFImOnPatrolOrStoppedRecord;
typedef struct AiIFChrDyingOrDeadRecord
{
u8 cmd;
u8 CHR_NUM;
u8 GOTOLABEL;
} AiIFChrDyingOrDeadRecord;
typedef struct AiIFChrDoesNotExistRecord
{
u8 cmd;
u8 CHR_NUM;
u8 GOTOLABEL;
} AiIFChrDoesNotExistRecord;
typedef struct AiIFISeeBondRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFISeeBondRecord;
typedef struct AiSetNewRandomRecord
{
u8 cmd;
} AiSetNewRandomRecord;
typedef struct AiIFRandomLessThanRecord
{
u8 cmd;
u8 BYTE;
u8 GOTOLABEL;
} AiIFRandomLessThanRecord;
typedef struct AiIFRandomGreaterThanRecord
{
u8 cmd;
u8 BYTE;
u8 GOTOLABEL;
} AiIFRandomGreaterThanRecord;
typedef struct AiIFICanHearAlarmRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFICanHearAlarmRecord;
typedef struct AiIFAlarmIsOnRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFAlarmIsOnRecord;
typedef struct AiIFGasIsLeakingRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFGasIsLeakingRecord;
typedef struct AiIFIHeardBondRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFIHeardBondRecord;
typedef struct AiIFISeeSomeoneShotRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFISeeSomeoneShotRecord;
typedef struct AiIFISeeSomeoneDieRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFISeeSomeoneDieRecord;
typedef struct AiIFICouldSeeBondRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFICouldSeeBondRecord;
typedef struct AiIFICouldSeeBondsStanRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFICouldSeeBondsStanRecord;
typedef struct AiIFIWasShotRecentlyRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFIWasShotRecentlyRecord;
typedef struct AiIFIHeardBondRecentlyRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFIHeardBondRecentlyRecord;
typedef struct AiIFImInRoomWithChrRecord
{
u8 cmd;
u8 CHR_NUM;
u8 GOTOLABEL;
} AiIFImInRoomWithChrRecord;
typedef struct AiIFIveNotBeenSeenRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFIveNotBeenSeenRecord;
typedef struct AiIFImOnScreenRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFImOnScreenRecord;
typedef struct AiIFMyRoomIsOnScreenRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFMyRoomIsOnScreenRecord;
typedef struct AiIFRoomWithPadIsOnScreenRecord
{
u8 cmd;
s16 PAD;
u8 GOTOLABEL;
} AiIFRoomWithPadIsOnScreenRecord;
typedef struct AiIFImTargetedByBondRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFImTargetedByBondRecord;
typedef struct AiIFBondMissedMeRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFBondMissedMeRecord;
typedef struct AiIFMyAngleToBondLessThanRecord
{
u8 cmd;
u8 ANGLE;
u8 GOTOLABEL;
} AiIFMyAngleToBondLessThanRecord;
typedef struct AiIFMyAngleToBondGreaterThanRecord
{
u8 cmd;
u8 ANGLE;
u8 GOTOLABEL;
} AiIFMyAngleToBondGreaterThanRecord;
typedef struct AiIFMyAngleFromBondLessThanRecord
{
u8 cmd;
u8 ANGLE;
u8 GOTOLABEL;
} AiIFMyAngleFromBondLessThanRecord;
typedef struct AiIFMyAngleFromBondGreaterThanRecord
{
u8 cmd;
u8 ANGLE;
u8 GOTOLABEL;
} AiIFMyAngleFromBondGreaterThanRecord;
typedef struct AiIFMyDistanceToBondLessThanDecimeterRecord
{
u8 cmd;
s16 DISTANCE;
u8 GOTOLABEL;
} AiIFMyDistanceToBondLessThanDecimeterRecord;
typedef struct AiIFMyDistanceToBondGreaterThanDecimeterRecord
{
u8 cmd;
s16 DISTANCE;
u8 GOTOLABEL;
} AiIFMyDistanceToBondGreaterThanDecimeterRecord;
typedef struct AiIFChrDistanceToPadLessThanDecimeterRecord
{
u8 cmd;
u8 CHR_NUM;
s16 DISTANCE;
s16 PAD;
u8 GOTOLABEL;
} AiIFChrDistanceToPadLessThanDecimeterRecord;
typedef struct AiIFChrDistanceToPadGreaterThanDecimeterRecord
{
u8 cmd;
u8 CHR_NUM;
s16 DISTANCE;
s16 PAD;
u8 GOTOLABEL;
} AiIFChrDistanceToPadGreaterThanDecimeterRecord;
typedef struct AiIFMyDistanceToChrLessThanDecimeterRecord
{
u8 cmd;
s16 DISTANCE;
u8 CHR_NUM;
u8 GOTOLABEL;
} AiIFMyDistanceToChrLessThanDecimeterRecord;
typedef struct AiIFMyDistanceToChrGreaterThanDecimeterRecord
{
u8 cmd;
s16 DISTANCE;
u8 CHR_NUM;
u8 GOTOLABEL;
} AiIFMyDistanceToChrGreaterThanDecimeterRecord;
typedef struct AiTRYSettingMyPresetToChrWithinDistanceDecimeterRecord
{
u8 cmd;
s16 DISTANCE;
u8 GOTOLABEL;
} AiTRYSettingMyPresetToChrWithinDistanceDecimeterRecord;
typedef struct AiIFBondDistanceToPadLessThanDecimeterRecord
{
u8 cmd;
s16 DISTANCE;
s16 PAD;
u8 GOTOLABEL;
} AiIFBondDistanceToPadLessThanDecimeterRecord;
typedef struct AiIFBondDistanceToPadGreaterThanDecimeterRecord
{
u8 cmd;
s16 DISTANCE;
s16 PAD;
u8 GOTOLABEL;
} AiIFBondDistanceToPadGreaterThanDecimeterRecord;
typedef struct AiIFChrInRoomWithPadRecord
{
u8 cmd;
u8 CHR_NUM;
s16 PAD;
u8 GOTOLABEL;
} AiIFChrInRoomWithPadRecord;
typedef struct AiIFBondInRoomWithPadRecord
{
u8 cmd;
s16 PAD;
u8 GOTOLABEL;
} AiIFBondInRoomWithPadRecord;
typedef struct AiIFBondCollectedObjectRecord
{
u8 cmd;
u8 OBJECT_TAG;
u8 GOTOLABEL;
} AiIFBondCollectedObjectRecord;
typedef struct AiIFKeyDroppedRecord
{
u8 cmd;
u8 KEY_ID;
u8 GOTOLABEL;
} AiIFKeyDroppedRecord;
typedef struct AiIFItemIsAttachedToObjectRecord
{
u8 cmd;
u8 ITEM_NUM;
u8 OBJECT_TAG;
u8 GOTOLABEL;
} AiIFItemIsAttachedToObjectRecord;
typedef struct AiIFBondHasItemEquippedRecord
{
u8 cmd;
u8 ITEM_NUM;
u8 GOTOLABEL;
} AiIFBondHasItemEquippedRecord;
typedef struct AiIFObjectExistsRecord
{
u8 cmd;
u8 OBJECT_TAG;
u8 GOTOLABEL;
} AiIFObjectExistsRecord;
typedef struct AiIFObjectNotDestroyedRecord
{
u8 cmd;
u8 OBJECT_TAG;
u8 GOTOLABEL;
} AiIFObjectNotDestroyedRecord;
typedef struct AiIFObjectWasActivatedRecord
{
u8 cmd;
u8 OBJECT_TAG;
u8 GOTOLABEL;
} AiIFObjectWasActivatedRecord;
typedef struct AiIFBondUsedGadgetOnObjectRecord
{
u8 cmd;
u8 OBJECT_TAG;
u8 GOTOLABEL;
} AiIFBondUsedGadgetOnObjectRecord;
typedef struct AiActivateObjectRecord
{
u8 cmd;
u8 OBJECT_TAG;
} AiActivateObjectRecord;
typedef struct AiDestroyObjectRecord
{
u8 cmd;
u8 OBJECT_TAG;
} AiDestroyObjectRecord;
typedef struct AiDropObjectRecord
{
u8 cmd;
u8 OBJECT_TAG;
} AiDropObjectRecord;
typedef struct AiChrDropAllConcealedItemsRecord
{
u8 cmd;
u8 CHR_NUM;
} AiChrDropAllConcealedItemsRecord;
typedef struct AiChrDropAllHeldItemsRecord
{
u8 cmd;
u8 CHR_NUM;
} AiChrDropAllHeldItemsRecord;
typedef struct AiBondCollectObjectRecord
{
u8 cmd;
u8 OBJECT_TAG;
} AiBondCollectObjectRecord;
typedef struct AiChrEquipObjectRecord
{
u8 cmd;
u8 OBJECT_TAG;
u8 CHR_NUM;
} AiChrEquipObjectRecord;
typedef struct AiMoveObjectRecord
{
u8 cmd;
u8 OBJECT_TAG;
s16 PAD;
} AiMoveObjectRecord;
typedef struct AiDoorOpenRecord
{
u8 cmd;
u8 OBJECT_TAG;
} AiDoorOpenRecord;
typedef struct AiDoorCloseRecord
{
u8 cmd;
u8 OBJECT_TAG;
} AiDoorCloseRecord;
typedef struct AiIFDoorStateEqualRecord
{
u8 cmd;
u8 OBJECT_TAG;
u8 DOOR_STATE;
u8 GOTOLABEL;
} AiIFDoorStateEqualRecord;
typedef struct AiIFDoorHasBeenOpenedBeforeRecord
{
u8 cmd;
u8 OBJECT_TAG;
u8 GOTOLABEL;
} AiIFDoorHasBeenOpenedBeforeRecord;
typedef struct AiDoorSetLockRecord
{
u8 cmd;
u8 OBJECT_TAG;
u8 LOCK_FLAG;
} AiDoorSetLockRecord;
typedef struct AiDoorUnsetLockRecord
{
u8 cmd;
u8 OBJECT_TAG;
u8 LOCK_FLAG;
} AiDoorUnsetLockRecord;
typedef struct AiIFDoorLockEqualRecord
{
u8 cmd;
u8 OBJECT_TAG;
u8 LOCK_FLAG;
u8 GOTOLABEL;
} AiIFDoorLockEqualRecord;
typedef struct AiIFObjectiveNumCompleteRecord
{
u8 cmd;
u8 OBJ_NUM;
u8 GOTOLABEL;
} AiIFObjectiveNumCompleteRecord;
typedef struct AiTRYUnknown6eRecord
{
u8 cmd;
u8 val;
u8 GOTOLABEL;
} AiTRYUnknown6eRecord;
typedef struct AiTRYUnknown6fRecord
{
u8 cmd;
u8 val;
u8 GOTOLABEL;
} AiTRYUnknown6fRecord;
typedef struct AiIFGameDifficultyLessThanRecord
{
u8 cmd;
u8 DIFICULTY_ID;
u8 GOTOLABEL;
} AiIFGameDifficultyLessThanRecord;
typedef struct AiIFGameDifficultyGreaterThanRecord
{
u8 cmd;
u8 DIFICULTY_ID;
u8 GOTOLABEL;
} AiIFGameDifficultyGreaterThanRecord;
typedef struct AiIFMissionTimeLessThanRecord
{
u8 cmd;
s16 SECONDS;
u8 GOTOLABEL;
} AiIFMissionTimeLessThanRecord;
typedef struct AiIFMissionTimeGreaterThanRecord
{
u8 cmd;
s16 SECONDS;
u8 GOTOLABEL;
} AiIFMissionTimeGreaterThanRecord;
typedef struct AiIFSystemPowerTimeLessThanRecord
{
u8 cmd;
s16 MINUTES;
u8 GOTOLABEL;
} AiIFSystemPowerTimeLessThanRecord;
typedef struct AiIFSystemPowerTimeGreaterThanRecord
{
u8 cmd;
s16 MINUTES;
u8 GOTOLABEL;
} AiIFSystemPowerTimeGreaterThanRecord;
typedef struct AiIFLevelIdLessThanRecord
{
u8 cmd;
u8 LEVEL_ID;
u8 GOTOLABEL;
} AiIFLevelIdLessThanRecord;
typedef struct AiIFLevelIdGreaterThanRecord
{
u8 cmd;
u8 LEVEL_ID;
u8 GOTOLABEL;
} AiIFLevelIdGreaterThanRecord;
typedef struct AiIFMyNumArghsLessThanRecord
{
u8 cmd;
u8 val;
u8 GOTOLABEL;
} AiIFMyNumArghsLessThanRecord;
typedef struct AiIFMyNumArghsGreaterThanRecord
{
u8 cmd;
u8 val;
u8 GOTOLABEL;
} AiIFMyNumArghsGreaterThanRecord;
typedef struct AiIFMyNumCloseArghsLessThanRecord
{
u8 cmd;
u8 val;
u8 GOTOLABEL;
} AiIFMyNumCloseArghsLessThanRecord;
typedef struct AiIFMyNumCloseArghsGreaterThanRecord
{
u8 cmd;
u8 val;
u8 GOTOLABEL;
} AiIFMyNumCloseArghsGreaterThanRecord;
typedef struct AiIFChrHealthLessThanRecord
{
u8 cmd;
u8 CHR_NUM;
u8 HEALTH;
u8 GOTOLABEL;
} AiIFChrHealthLessThanRecord;
typedef struct AiIFChrHealthGreaterThanRecord
{
u8 cmd;
u8 CHR_NUM;
u8 HEALTH;
u8 GOTOLABEL;
} AiIFChrHealthGreaterThanRecord;
typedef struct AiIFChrWasDamagedSinceLastCheckRecord
{
u8 cmd;
u8 CHR_NUM;
u8 GOTOLABEL;
} AiIFChrWasDamagedSinceLastCheckRecord;
typedef struct AiIFBondHealthLessThanRecord
{
u8 cmd;
u8 HEALTH;
u8 GOTOLABEL;
} AiIFBondHealthLessThanRecord;
typedef struct AiIFBondHealthGreaterThanRecord
{
u8 cmd;
u8 HEALTH;
u8 GOTOLABEL;
} AiIFBondHealthGreaterThanRecord;
typedef struct AiSetMyMoraleRecord
{
u8 cmd;
u8 val;
} AiSetMyMoraleRecord;
typedef struct AiAddToMyMoraleRecord
{
u8 cmd;
u8 val;
} AiAddToMyMoraleRecord;
typedef struct AiSubtractFromMyMoraleRecord
{
u8 cmd;
u8 val;
} AiSubtractFromMyMoraleRecord;
typedef struct AiIFMyMoraleLessThanRecord
{
u8 cmd;
u8 val;
u8 GOTOLABEL;
} AiIFMyMoraleLessThanRecord;
typedef struct AiIFMyMoraleLessThanRandomRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFMyMoraleLessThanRandomRecord;
typedef struct AiSetMyAlertnessRecord
{
u8 cmd;
u8 val;
} AiSetMyAlertnessRecord;
typedef struct AiAddToMyAlertnessRecord
{
u8 cmd;
u8 val;
} AiAddToMyAlertnessRecord;
typedef struct AiSubtractFromMyAlertnessRecord
{
u8 cmd;
u8 val;
} AiSubtractFromMyAlertnessRecord;
typedef struct AiIFMyAlertnessLessThanRecord
{
u8 cmd;
u8 CHRBYTE;
u8 GOTOLABEL;
} AiIFMyAlertnessLessThanRecord;
typedef struct AiIFMyAlertnessLessThanRandomRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFMyAlertnessLessThanRandomRecord;
typedef struct AiSetMyHearingScaleRecord
{
u8 cmd;
s16 HEARING_SCALE;
} AiSetMyHearingScaleRecord;
typedef struct AiSetMyVisionRangeRecord
{
u8 cmd;
u8 VISION_RANGE;
} AiSetMyVisionRangeRecord;
typedef struct AiSetMyGrenadeProbabilityRecord
{
u8 cmd;
u8 GRENADE_PROB;
} AiSetMyGrenadeProbabilityRecord;
typedef struct AiSetMyChrNumRecord
{
u8 cmd;
u8 CHR_NUM;
} AiSetMyChrNumRecord;
typedef struct AiSetMyHealthTotalRecord
{
u8 cmd;
s16 HEALTH;
} AiSetMyHealthTotalRecord;
typedef struct AiSetMyArmourRecord
{
u8 cmd;
s16 AMOUNT;
} AiSetMyArmourRecord;
typedef struct AiSetMySpeedRatingRecord
{
u8 cmd;
s8 val;
} AiSetMySpeedRatingRecord;
typedef struct AiSetMyArghRatingRecord
{
u8 cmd;
s8 val;
} AiSetMyArghRatingRecord;
typedef struct AiSetMyAccuracyRatingRecord
{
u8 cmd;
s8 val;
} AiSetMyAccuracyRatingRecord;
typedef struct AiSetMyFlags2Record
{
u8 cmd;
u8 BITS;
} AiSetMyFlags2Record;
typedef struct AiUnsetMyFlags2Record
{
u8 cmd;
u8 BITS;
} AiUnsetMyFlags2Record;
typedef struct AiIFMyFlags2HasRecord
{
u8 cmd;
u8 BITS;
u8 GOTOLABEL;
} AiIFMyFlags2HasRecord;
typedef struct AiSetChrBitfieldRecord
{
u8 cmd;
u8 CHR_NUM;
u8 BITS;
} AiSetChrBitfieldRecord;
typedef struct AiUnsetChrBitfieldRecord
{
u8 cmd;
u8 CHR_NUM;
u8 BITS;
} AiUnsetChrBitfieldRecord;
typedef struct AiIFChrBitfieldHasRecord
{
u8 cmd;
u8 CHR_NUM;
u8 BITS;
u8 GOTOLABEL;
} AiIFChrBitfieldHasRecord;
typedef struct AiSetObjectiveBitfieldRecord
{
u8 cmd;
s32 BITFIELD;
} AiSetObjectiveBitfieldRecord;
typedef struct AiUnsetObjectiveBitfieldRecord
{
u8 cmd;
s32 BITFIELD;
} AiUnsetObjectiveBitfieldRecord;
typedef struct AiIFObjectiveBitfieldHasRecord
{
u8 cmd;
s32 BITS;
u8 GOTOLABEL;
} AiIFObjectiveBitfieldHasRecord;
typedef struct AiSetMychrflagsRecord
{
u8 cmd;
s32 CHRFLAGS;
} AiSetMychrflagsRecord;
typedef struct AiUnsetMychrflagsRecord
{
u8 cmd;
s32 CHRFLAGS;
} AiUnsetMychrflagsRecord;
typedef struct AiIFMychrflagsHasRecord
{
u8 cmd;
s32 CHRFLAGS;
u8 GOTOLABEL;
} AiIFMychrflagsHasRecord;
typedef struct AiSetChrchrflagsRecord
{
u8 cmd;
u8 CHR_NUM;
s32 CHRFLAGS;
} AiSetChrchrflagsRecord;
typedef struct AiUnsetChrchrflagsRecord
{
u8 cmd;
u8 CHR_NUM;
s32 CHRFLAGS;
} AiUnsetChrchrflagsRecord;
typedef struct AiIFChrchrflagsHasRecord
{
u8 cmd;
u8 CHR_NUM;
s32 CHRFLAGS;
u8 GOTOLABEL;
} AiIFChrchrflagsHasRecord;
typedef struct AiSetObjectFlagsRecord
{
u8 cmd;
u8 OBJECT_TAG;
s32 BITFIELD;
} AiSetObjectFlagsRecord;
typedef struct AiUnsetObjectFlagsRecord
{
u8 cmd;
u8 OBJECT_TAG;
s32 BITFIELD;
} AiUnsetObjectFlagsRecord;
typedef struct AiIFObjectFlagsHasRecord
{
u8 cmd;
u8 OBJECT_TAG;
s32 BITS;
u8 GOTOLABEL;
} AiIFObjectFlagsHasRecord;
typedef struct AiSetObjectFlags2Record
{
u8 cmd;
u8 OBJECT_TAG;
s32 BITS;
} AiSetObjectFlags2Record;
typedef struct AiUnsetObjectFlags2Record
{
u8 cmd;
u8 OBJECT_TAG;
s32 BITS;
} AiUnsetObjectFlags2Record;
typedef struct AiIFObjectFlags2HasRecord
{
u8 cmd;
u8 OBJECT_TAG;
s32 BITFIELD;
u8 GOTOLABEL;
} AiIFObjectFlags2HasRecord;
typedef struct AiSetMyChrPresetRecord
{
u8 cmd;
u8 PRESET;
} AiSetMyChrPresetRecord;
typedef struct AiSetChrChrPresetRecord
{
u8 cmd;
u8 CHR_NUM;
u8 PRESET;
} AiSetChrChrPresetRecord;
typedef struct AiSetMyPadPresetRecord
{
u8 cmd;
s16 PAD_PRESET;
} AiSetMyPadPresetRecord;
typedef struct AiSetChrPadPresetRecord
{
u8 cmd;
u8 CHR_NUM;
s16 PAD_PRESET;
} AiSetChrPadPresetRecord;
typedef struct AiPRINTRecord
{
u8 cmd;
u8 val[];
} AiPRINTRecord;
typedef struct AiMyTimerStartRecord
{
u8 cmd;
} AiMyTimerStartRecord;
typedef struct AiMyTimerResetRecord
{
u8 cmd;
} AiMyTimerResetRecord;
typedef struct AiMyTimerPauseRecord
{
u8 cmd;
} AiMyTimerPauseRecord;
typedef struct AiMyTimerResumeRecord
{
u8 cmd;
} AiMyTimerResumeRecord;
typedef struct AiIFMyTimerIsNotRunningRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFMyTimerIsNotRunningRecord;
typedef struct AiIFMyTimerLessThanTicksRecord
{
u8 cmd;
u8 TICKS[3];
u8 GOTOLABEL;
} AiIFMyTimerLessThanTicksRecord;
typedef struct AiIFMyTimerGreaterThanTicksRecord
{
u8 cmd;
u8 TICKS[3];
u8 GOTOLABEL;
} AiIFMyTimerGreaterThanTicksRecord;
typedef struct AiHudCountdownShowRecord
{
u8 cmd;
} AiHudCountdownShowRecord;
typedef struct AiHudCountdownHideRecord
{
u8 cmd;
} AiHudCountdownHideRecord;
typedef struct AiHudCountdownSetRecord
{
u8 cmd;
s16 SECONDS;
} AiHudCountdownSetRecord;
typedef struct AiHudCountdownStopRecord
{
u8 cmd;
} AiHudCountdownStopRecord;
typedef struct AiHudCountdownStartRecord
{
u8 cmd;
} AiHudCountdownStartRecord;
typedef struct AiIFHudCountdownIsNotRunningRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFHudCountdownIsNotRunningRecord;
typedef struct AiIFHudCountdownLessThanRecord
{
u8 cmd;
s16 SECONDS;
u8 GOTOLABEL;
} AiIFHudCountdownLessThanRecord;
typedef struct AiIFHudCountdownGreaterThanRecord
{
u8 cmd;
s16 SECONDS;
u8 GOTOLABEL;
} AiIFHudCountdownGreaterThanRecord;
typedef struct AiTRYSpawningChrAtPadRecord
{
u8 cmd;
u8 BODY_NUM;
s8 HEAD_NUM;
s16 PAD;
s16 AI_LIST_ID;
s32 BITFIELD;
u8 GOTOLABEL;
} AiTRYSpawningChrAtPadRecord;
typedef struct AiTRYSpawningChrNextToChrRecord
{
u8 cmd;
u8 BODY_NUM;
s8 HEAD_NUM;
u8 CHR_NUM_TARGET;
s16 AI_LIST_ID;
s32 BITFIELD;
u8 GOTOLABEL;
} AiTRYSpawningChrNextToChrRecord;
typedef struct AiTRYGiveMeItemRecord
{
u8 cmd;
s16 PROP_NUM;
u8 ITEM_NUM;
s32 PROPFLAG;
u8 GOTOLABEL;
} AiTRYGiveMeItemRecord;
typedef struct AiTRYGiveMeHatRecord
{
u8 cmd;
s16 PROP_NUM;
s32 PROP_BITFIELD;
u8 GOTOLABEL;
} AiTRYGiveMeHatRecord;
typedef struct AiTRYCloningChrRecord
{
u8 cmd;
u8 CHR_NUM;
s16 AI_LIST_ID;
u8 GOTOLABEL;
} AiTRYCloningChrRecord;
typedef struct AiTextPrintBottomRecord
{
u8 cmd;
s16 txt;
} AiTextPrintBottomRecord;
typedef struct AiTextPrintTopRecord
{
u8 cmd;
s16 txt;
} AiTextPrintTopRecord;
typedef struct AiSfxPlayRecord
{
u8 cmd;
s16 SOUND_NUM;
s8 CHANNEL_NUM;
} AiSfxPlayRecord;
typedef struct AiSfxEmitFromObjectRecord
{
u8 cmd;
s8 slotID;
u8 OBJECT_TAG;
s16 sfxID;
} AiSfxEmitFromObjectRecord;
typedef struct AiSfxEmitFromPadRecord
{
u8 cmd;
s8 slotID;
s16 PAD;
s16 sfxID;
} AiSfxEmitFromPadRecord;
typedef struct AiSfxSetChannelVolumeRecord
{
u8 cmd;
s8 slotID;
s16 TARGET_VOLUME;
s16 sfxID;
} AiSfxSetChannelVolumeRecord;
typedef struct AiSfxFadeChannelVolumeRecord
{
u8 cmd;
s8 slotID;
s16 TARGET_VOLUME;
s16 sfxID;
} AiSfxFadeChannelVolumeRecord;
typedef struct AiSfxStopChannelRecord
{
u8 cmd;
s8 CHANNEL_NUM;
} AiSfxStopChannelRecord;
typedef struct AiIFSfxChannelVolumeLessThanRecord
{
u8 cmd;
s8 slotID;
s16 VOLUME;
u8 GOTOLABEL;
} AiIFSfxChannelVolumeLessThanRecord;
typedef struct AiVehicleStartPathRecord
{
u8 cmd;
u8 PATH_NUM;
} AiVehicleStartPathRecord;
typedef struct AiVehicleSpeedRecord
{
u8 cmd;
s16 TOP_SPEED;
s16 ACCELERATION_TIME60;
} AiVehicleSpeedRecord;
typedef struct AiAircraftRotorSpeedRecord
{
u8 cmd;
s16 ROTOR_SPEED;
s16 ACCELERATION_TIME60;
} AiAircraftRotorSpeedRecord;
typedef struct AiIFCameraIsInIntroRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFCameraIsInIntroRecord;
typedef struct AiIFCameraIsInBondSwirlRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFCameraIsInBondSwirlRecord;
typedef struct AiTvChangeScreenBankRecord
{
u8 cmd;
u8 OBJECT_TAG;
u8 SCREEN_INDEX;
u8 SCREEN_BANK;
} AiTvChangeScreenBankRecord;
typedef struct AiIFBondInTankRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFBondInTankRecord;
typedef struct AiEndLevelRecord
{
u8 cmd;
} AiEndLevelRecord;
typedef struct AiCameraReturnToBondRecord
{
u8 cmd;
} AiCameraReturnToBondRecord;
typedef struct AiCameraLookAtBondFromPadRecord
{
u8 cmd;
s16 PAD;
} AiCameraLookAtBondFromPadRecord;
typedef struct AiCameraSwitchRecord
{
u8 cmd;
u8 OBJECT_TAG;
s16 LOOK_AT_BOND_FLAG;
s16 UNUSED_FLAG;
} AiCameraSwitchRecord;
typedef struct AiIFBondYPosLessThanRecord
{
u8 cmd;
s16 Y_POS;
u8 GOTOLABEL;
} AiIFBondYPosLessThanRecord;
typedef struct AiBondDisableControlRecord
{
u8 cmd;
u8 val;
} AiBondDisableControlRecord;
typedef struct AiBondEnableControlRecord
{
u8 cmd;
} AiBondEnableControlRecord;
typedef struct AiTRYTeleportingChrToPadRecord
{
u8 cmd;
u8 CHR_NUM;
s16 PAD;
u8 GOTOLABEL;
} AiTRYTeleportingChrToPadRecord;
typedef struct AiScreenFadeToBlackRecord
{
u8 cmd;
} AiScreenFadeToBlackRecord;
typedef struct AiScreenFadeFromBlackRecord
{
u8 cmd;
} AiScreenFadeFromBlackRecord;
typedef struct AiIFScreenFadeCompletedRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFScreenFadeCompletedRecord;
typedef struct AiHideAllChrsRecord
{
u8 cmd;
} AiHideAllChrsRecord;
typedef struct AiShowAllChrsRecord
{
u8 cmd;
} AiShowAllChrsRecord;
typedef struct AiDoorOpenInstantRecord
{
u8 cmd;
u8 OBJECT_TAG;
} AiDoorOpenInstantRecord;
typedef struct AiChrRemoveItemInHandRecord
{
u8 cmd;
u8 CHR_NUM;
u8 HAND_INDEX;
} AiChrRemoveItemInHandRecord;
typedef struct AiIfNumberOfActivePlayersLessThanRecord
{
u8 cmd;
s8 NUMBER;
u8 GOTOLABEL;
} AiIfNumberOfActivePlayersLessThanRecord;
typedef struct AiIFBondItemTotalAmmoLessThanRecord
{
u8 cmd;
s8 ITEM_NUM;
s8 AMMO_TOTAL;
u8 GOTOLABEL;
} AiIFBondItemTotalAmmoLessThanRecord;
typedef struct AiBondEquipItemRecord
{
u8 cmd;
s8 ITEM_NUM;
} AiBondEquipItemRecord;
typedef struct AiBondEquipItemCinemaRecord
{
u8 cmd;
s8 ITEM_NUM;
} AiBondEquipItemCinemaRecord;
typedef struct AiBondSetLockedVelocityRecord
{
u8 cmd;
s8 X_SPEED60;
s8 Z_SPEED60;
} AiBondSetLockedVelocityRecord;
typedef struct AiIFObjectInRoomWithPadRecord
{
u8 cmd;
u8 OBJECT_TAG;
s16 PAD;
u8 GOTOLABEL;
} AiIFObjectInRoomWithPadRecord;
typedef struct AiIFImFiringAndLockedForwardRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFImFiringAndLockedForwardRecord;
typedef struct AiIFImFiringRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFImFiringRecord;
typedef struct AiSwitchSkyRecord
{
u8 cmd;
} AiSwitchSkyRecord;
typedef struct AiTriggerFadeAndExitLevelOnButtonPressRecord
{
u8 cmd;
} AiTriggerFadeAndExitLevelOnButtonPressRecord;
typedef struct AiIFBondIsDeadRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFBondIsDeadRecord;
typedef struct AiBondDisableDamageAndPickupsRecord
{
u8 cmd;
} AiBondDisableDamageAndPickupsRecord;
typedef struct AiBondHideWeaponsRecord
{
u8 cmd;
} AiBondHideWeaponsRecord;
typedef struct AiCameraOrbitPadRecord
{
u8 cmd;
s16 LAT_DISTANCE;
s16 VERT_DISTANCE;
s16 ORBIT_SPEED60;
s16 PAD;
s16 Y_POS_OFFSET;
s16 INITIAL_ROTATION;
} AiCameraOrbitPadRecord;
typedef struct AiCreditsRollRecord
{
u8 cmd;
} AiCreditsRollRecord;
typedef struct AiIFCreditsHasCompletedRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFCreditsHasCompletedRecord;
typedef struct AiIFObjectiveAllCompletedRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFObjectiveAllCompletedRecord;
typedef struct AiIFFolderActorIsEqualRecord
{
u8 cmd;
s8 BOND_ACTOR_INDEX;
u8 GOTOLABEL;
} AiIFFolderActorIsEqualRecord;
typedef struct AiIFBondDamageAndPickupsDisabledRecord
{
u8 cmd;
u8 GOTOLABEL;
} AiIFBondDamageAndPickupsDisabledRecord;
typedef struct AiMusicPlaySlotRecord
{
u8 cmd;
s8 MUSIC_SLOT;
u8 SECONDS_STOPPED_DURATION;
u8 SECONDS_TOTAL_DURATION;
} AiMusicPlaySlotRecord;
typedef struct AiMusicStopSlotRecord
{
u8 cmd;
s8 MUSIC_SLOT;
} AiMusicStopSlotRecord;
typedef struct AiTriggerExplosionsAroundBondRecord
{
u8 cmd;
} AiTriggerExplosionsAroundBondRecord;
typedef struct AiIFKilledCiviliansGreaterThanRecord
{
u8 cmd;
u8 CIVILIANS_KILLED;
u8 GOTOLABEL;
} AiIFKilledCiviliansGreaterThanRecord;
typedef struct AiIFChrWasShotSinceLastCheckRecord
{
u8 cmd;
u8 CHR_NUM;
u8 GOTOLABEL;
} AiIFChrWasShotSinceLastCheckRecord;
typedef struct AiBondKilledInActionRecord
{
u8 cmd;
} AiBondKilledInActionRecord;
typedef struct AiRaiseArmsRecord
{
u8 cmd;
} AiRaiseArmsRecord;
typedef struct AiGasLeakAndFadeFogRecord
{
u8 cmd;
} AiGasLeakAndFadeFogRecord;
typedef struct AiObjectRocketLaunchRecord
{
u8 cmd;
u8 OBJECT_TAG;
} AiObjectRocketLaunchRecord;
#pragma pack(0)
typedef struct coord3d
{
union
{
struct
{
float x;
float y;
float z;
};
float AsArray[3];
};
} coord3d;
typedef struct bbox
{
union
{
struct
{
float xmin;
float xmax;
float ymin;
float ymax;
float zmin;
float zmax;
};
float AsArray[6];
};
} bbox;
typedef struct PropDefHeaderRecord
{
unsigned short extrascale; /*0x0 Fixed-Point format char.8 eg: 0x03.80 = 3.5*/
char state;
char type; /*0x3*/
} PropDefHeaderRecord;
typedef struct AIListRecord
{
char *ailist;
int ID;
} AIListRecord;
typedef struct PadRecord /*0x2c (44) long confirmed*/
{
coord3d pos; /*0x00*/
coord3d up; /*0x0c*/
coord3d look; /*0x18*/
char *plink; /*0x24 canonical name */
void *stan; /*0x28 canonical name */
} PadRecord;
/**
* Bound Pads hold an extra Bounding Box which any prop assigned will try to
* fill (non-uniform scaling).
*/
typedef struct BoundPadRecord /*0x44 (68) long confirmed*/
{
// inherits PadRecord; /*0x00 confirmed*/
coord3d pos; /*0x00*/
coord3d up; /*0x0c*/
coord3d look; /*0x18*/
char *plink; /*0x24 canonical name */
void *stan; /*0x28 canonical name */
// temporary fix for no inheritance support by glibtools
bbox bbox; /*0x2c - 0x40 confirmed*/
} BoundPadRecord;
typedef struct waypoint
{
int padID; // Pad ID to anchor waypoint to.
int *neighbours; // Array of neighbouring (connected) waypoint IDs (ending in -1)
int groupNum; // index entry in the waygroup table that contains this path entry
int dist; // Initialise to 0, used by engine for pathfinding Heuristics between waypoints within a set.
} waypoint;
/**
* The Subset waygroup table which lists the IDs of the waypoints that
* belong to each group as well as any connected groups
*/
typedef struct waygroup
{
int *neighbours; // Array of neighbouring (connected) waygroup IDs (ending in -1)
int *waypoints; // Array of waypoint IDs (ending in -1)
int dist; // Initialise to 0, used by engine for pathfinding Heuristics between sets
} waygroup;
/**
* Path for guard to patrol (loop) or get from A to B (linear)
*/
typedef struct PathRecord
{
int *waypoints; // array of waypoint IDs in path (ending in -1)
char ID; // path ID
char isLoop; // 0x05 Path loops
short len; /*0x06 unused*/
} PathRecord;
typedef struct stagesetup
{
waypoint *pathwaypoints;
waygroup *waypointgroups;
void *intro;
PropDefHeaderRecord *propDefs;
PathRecord *patrolpaths;
AIListRecord *ailists;
PadRecord *pads;
BoundPadRecord *boundpads;
char **padnames;
char **boundpadnames;
} stagesetup;
#define MAX 10
int top = -1;
char stack[MAX];
typedef struct
{
int id;
int used;
int num0s;
} LLEnum;
LLEnum labels[100];
LLEnum tags[100];
LLEnum keys[100];
LLEnum chrs[100];
LLEnum pads[1000];
LLEnum SubIDs[100];
char *hasName;
/*PUSH FUNCTION*/
int push(int item)
{
if (top == (MAX - 1))
{
return 0;
}
else
{
++top;
stack[top] = item;
return 1;
}
}
/*POP */
int pop()
{
if (top == -1)
{
return 0;
}
else
{
--top;
return stack[top + 1];
}
}
/*Sniff */
int sniff()
{
if (top == -1)
{
return 0;
}
else
{
return stack[top];
}
}
int stackFind(int find)
{
int i;
if (top == -1)
{
return -1;
}
else
{
for (i = top; i >= 0; --i)
{
if (stack[i] == find) return i;
}
}
return -1;
}
int stackFindAndremove(int find)
{
int i = stackFind(find);
if (i >= 0)
{
for (; i <= top; i++)
{
stack[i] = i < MAX ? stack[i + 1] : 0;
}
top--;
return 1;
}
return 0;
}
void displayStack()
{
int i;
printf("\nThe label Stack is: ");
if (top == -1)
{
printf("empty");
}
else
{
for (i = top; i >= 0; --i)
{
printf("\n%3d", stack[i]);
}
}
printf("\n---------------\n\n");
}
void _AddLabel(int lbl, void *ptr)
{
int i = 0;
int found = 0;
LLEnum *labels = ptr;
if (lbl == 0)
{
labels[0].num0s++;
return;
}
while (labels[i].id != 0)
{
if (lbl == labels[i].id)
{
found = 1;
labels[i].used++;
}
i++;
}
if (!found)
{
labels[i].id = lbl;
labels[i].used++;
}
}
void AddLabel(char lbl)
{
_AddLabel(lbl, labels);
}
void AddTag(char lbl)
{
_AddLabel(lbl, tags);
}
void AddKey(char lbl)
{
_AddLabel(lbl, keys);
}
void AddChr(char lbl)
{
_AddLabel(lbl, chrs);
}
void AddPad(short lbl)
{
_AddLabel(lbl, pads);
}
void AddSubID(int lbl)
{
_AddLabel(lbl, SubIDs);
}
void SortEnums(LLEnum *labels)
{
int i, j, tempid, tempnum;
for (i = 0; i < 100; ++i)
{
if (labels[i].id != 0)
{
for (j = i + 1; j < 100; ++j)
{
if (labels[j].id != 0)
{
if (labels[i].id > labels[j].id)
{
tempid = labels[i].id;
tempnum = labels[i].used;
labels[i].id = labels[j].id;
labels[i].used = labels[j].used;
labels[j].id = tempid;
labels[j].used = tempnum;
}
}
}
}
}
}
void printenum(LLEnum labels[], char *enumname)
{
int i = 0;
if (labels[0].num0s || labels[i].id)
{
printf(" enum %s\n {\n", enumname);
if (labels[0].num0s) printf(" %s0, //used %d times\n", enumname, labels[0].num0s);
while (labels[i].id != 0)
{
if (!(enumname == "chr" && ((signed char)labels[i].id < 0 && (signed char)labels[i].id > -9)))
{
if ((i > 0 && labels[i - 1].id == labels[i].id - 1)||(i==0 && labels[0].num0s && labels[0].id ==1))
{
printf(" %s%u, //Used %d times\n", enumname, labels[i].id, labels[i].used);
}
else
{
printf(" %s%u = %u, //Used %d times\n", enumname, labels[i].id, labels[i].id, labels[i].used);
}
}
i++;
}
printf(" };\n");
}
}
int getDataSize(FILE *pfile ,void *pointer, int endtag)
{
int i = 0;
fseek(pfile, (int)pointer, SEEK_SET);
// scan for end of Record (NULL or -1)
do
{
fread(&i, 4, 1, pfile);
} while (i != endtag);
return (ftell(pfile) ) - (int)pointer;
}
int chraiitemsize(unsigned char *AIList, int offset)
{
switch (AIList[offset])
{
case AI_GotoNext:
return sizeof(AiGotoNextRecord);
case AI_GotoFirst:
return sizeof(AiGotoFirstRecord);
case AI_Label:
return sizeof(AiLabelRecord);
case AI_Yield:
return sizeof(AiYieldRecord);
case AI_EndList:
return sizeof(AiEndListRecord);
case AI_SetChrAiList:
return sizeof(AiSetChrAiListRecord);
case AI_SetReturnAiList:
return sizeof(AiSetReturnAiListRecord);
case AI_Return:
return sizeof(AiReturnRecord);
case AI_Stop:
return sizeof(AiStopRecord);
case AI_Kneel:
return sizeof(AiKneelRecord);
case AI_PlayAnimation:
return sizeof(AiPlayAnimationRecord);
case AI_IFPlayingAnimation:
return sizeof(AiIFPlayingAnimationRecord);
case AI_PointAtBond:
return sizeof(AiPointAtBondRecord);
case AI_LookSurprised:
return sizeof(AiLookSurprisedRecord);
case AI_TRYSidestepping:
return sizeof(AiTRYSidesteppingRecord);
case AI_TRYSideHopping:
return sizeof(AiTRYSideHoppingRecord);
case AI_TRYSideRunning:
return sizeof(AiTRYSideRunningRecord);
case AI_TRYFiringWalk:
return sizeof(AiTRYFiringWalkRecord);
case AI_TRYFiringRun:
return sizeof(AiTRYFiringRunRecord);
case AI_TRYFiringRoll:
return sizeof(AiTRYFiringRollRecord);
case AI_TRYFireOrAimAtTarget:
return sizeof(AiTRYFireOrAimAtTargetRecord);
case AI_TRYFireOrAimAtTargetKneel:
return sizeof(AiTRYFireOrAimAtTargetKneelRecord);
case AI_IFImFiring:
return sizeof(AiIFImFiringRecord);
case AI_IFImFiringAndLockedForward:
return sizeof(AiIFImFiringAndLockedForwardRecord);
case AI_TRYFireOrAimAtTargetUpdate:
return sizeof(AiTRYFireOrAimAtTargetUpdateRecord);
case AI_TRYFacingTarget:
return sizeof(AiTRYFacingTargetRecord);
case AI_HitChrWithItem:
return sizeof(AiHitChrWithItemRecord);
case AI_ChrHitChr:
return sizeof(AiChrHitChrRecord);
case AI_TRYThrowingGrenade:
return sizeof(AiTRYThrowingGrenadeRecord);
case AI_TRYDroppingItem:
return sizeof(AiTRYDroppingItemRecord);
case AI_RunToPad:
return sizeof(AiRunToPadRecord);
case AI_RunToPadPreset:
return sizeof(AiRunToPadPresetRecord);
case AI_WalkToPad:
return sizeof(AiWalkToPadRecord);
case AI_SprintToPad:
return sizeof(AiSprintToPadRecord);
case AI_StartPatrol:
return sizeof(AiStartPatrolRecord);
case AI_Surrender:
return sizeof(AiSurrenderRecord);
case AI_RemoveMe:
return sizeof(AiRemoveMeRecord);
case AI_ChrRemoveInstant:
return sizeof(AiChrRemoveInstantRecord);
case AI_TRYTriggeringAlarmAtPad:
return sizeof(AiTRYTriggeringAlarmAtPadRecord);
case AI_AlarmOn:
return sizeof(AiAlarmOnRecord);
case AI_AlarmOff:
return sizeof(AiAlarmOffRecord);
case AI_TRYRunFromBond:
return sizeof(AiTRYRunFromBondRecord);
case AI_TRYRunToBond:
return sizeof(AiTRYRunToBondRecord);
case AI_TRYWalkToBond:
return sizeof(AiTRYWalkToBondRecord);
case AI_TRYSprintToBond:
return sizeof(AiTRYSprintToBondRecord);
case AI_TRYFindCover:
return sizeof(AiTRYFindCoverRecord);
case AI_TRYRunToChr:
return sizeof(AiTRYRunToChrRecord);
case AI_TRYWalkToChr:
return sizeof(AiTRYWalkToChrRecord);
case AI_TRYSprintToChr:
return sizeof(AiTRYSprintToChrRecord);
case AI_IFImOnPatrolOrStopped:
return sizeof(AiIFImOnPatrolOrStoppedRecord);
case AI_IFChrDyingOrDead:
return sizeof(AiIFChrDyingOrDeadRecord);
case AI_IFChrDoesNotExist:
return sizeof(AiIFChrDoesNotExistRecord);
case AI_IFISeeBond:
return sizeof(AiIFISeeBondRecord);
case AI_SetNewRandom:
return sizeof(AiSetNewRandomRecord);
case AI_IFRandomLessThan:
return sizeof(AiIFRandomLessThanRecord);
case AI_IFRandomGreaterThan:
return sizeof(AiIFRandomGreaterThanRecord);
case AI_IFICanHearAlarm:
return sizeof(AiIFICanHearAlarmRecord);
case AI_IFAlarmIsOn:
return sizeof(AiIFAlarmIsOnRecord);
case AI_IFGasIsLeaking:
return sizeof(AiIFGasIsLeakingRecord);
case AI_IFIHeardBond:
return sizeof(AiIFIHeardBondRecord);
case AI_IFISeeSomeoneShot:
return sizeof(AiIFISeeSomeoneShotRecord);
case AI_IFISeeSomeoneDie:
return sizeof(AiIFISeeSomeoneDieRecord);
case AI_IFICouldSeeBond:
return sizeof(AiIFICouldSeeBondRecord);
case AI_IFICouldSeeBondsStan:
return sizeof(AiIFICouldSeeBondsStanRecord);
case AI_IFIWasShotRecently:
return sizeof(AiIFIWasShotRecentlyRecord);
case AI_IFIHeardBondRecently:
return sizeof(AiIFIHeardBondRecentlyRecord);
case AI_IFImInRoomWithChr:
return sizeof(AiIFImInRoomWithChrRecord);
case AI_IFIveNotBeenSeen:
return sizeof(AiIFIveNotBeenSeenRecord);
case AI_IFImOnScreen:
return sizeof(AiIFImOnScreenRecord);
case AI_IFMyRoomIsOnScreen:
return sizeof(AiIFMyRoomIsOnScreenRecord);
case AI_IFRoomWithPadIsOnScreen:
return sizeof(AiIFRoomWithPadIsOnScreenRecord);
case AI_IFImTargetedByBond:
return sizeof(AiIFImTargetedByBondRecord);
case AI_IFBondMissedMe:
return sizeof(AiIFBondMissedMeRecord);
case AI_IFMyAngleToBondLessThan:
return sizeof(AiIFMyAngleToBondLessThanRecord);
case AI_IFMyAngleToBondGreaterThan:
return sizeof(AiIFMyAngleToBondGreaterThanRecord);
case AI_IFMyAngleFromBondLessThan:
return sizeof(AiIFMyAngleFromBondLessThanRecord);
case AI_IFMyAngleFromBondGreaterThan:
return sizeof(AiIFMyAngleFromBondGreaterThanRecord);
case AI_IFMyDistanceToBondLessThanDecimeter:
return sizeof(AiIFMyDistanceToBondLessThanDecimeterRecord);
case AI_IFMyDistanceToBondGreaterThanDecimeter:
return sizeof(AiIFMyDistanceToBondGreaterThanDecimeterRecord);
case AI_IFChrDistanceToPadLessThanDecimeter:
return sizeof(AiIFChrDistanceToPadLessThanDecimeterRecord);
case AI_IFChrDistanceToPadGreaterThanDecimeter:
return sizeof(AiIFChrDistanceToPadGreaterThanDecimeterRecord);
case AI_IFMyDistanceToChrLessThanDecimeter:
return sizeof(AiIFMyDistanceToChrLessThanDecimeterRecord);
case AI_IFMyDistanceToChrGreaterThanDecimeter:
return sizeof(AiIFMyDistanceToChrGreaterThanDecimeterRecord);
case AI_TRYSettingMyPresetToChrWithinDistanceDecimeter:
return sizeof(AiTRYSettingMyPresetToChrWithinDistanceDecimeterRecord);
case AI_IFBondDistanceToPadLessThanDecimeter:
return sizeof(AiIFBondDistanceToPadLessThanDecimeterRecord);
case AI_IFBondDistanceToPadGreaterThanDecimeter:
return sizeof(AiIFBondDistanceToPadGreaterThanDecimeterRecord);
case AI_IFChrInRoomWithPad:
return sizeof(AiIFChrInRoomWithPadRecord);
case AI_IFBondInRoomWithPad:
return sizeof(AiIFBondInRoomWithPadRecord);
case AI_IFBondCollectedObject:
return sizeof(AiIFBondCollectedObjectRecord);
case AI_IFKeyDropped:
return sizeof(AiIFKeyDroppedRecord);
case AI_IFItemIsAttachedToObject:
return sizeof(AiIFItemIsAttachedToObjectRecord);
case AI_IFBondHasItemEquipped:
return sizeof(AiIFBondHasItemEquippedRecord);
case AI_IFObjectExists:
return sizeof(AiIFObjectExistsRecord);
case AI_IFObjectNotDestroyed:
return sizeof(AiIFObjectNotDestroyedRecord);
case AI_IFObjectWasActivated:
return sizeof(AiIFObjectWasActivatedRecord);
case AI_IFBondUsedGadgetOnObject:
return sizeof(AiIFBondUsedGadgetOnObjectRecord);
case AI_ActivateObject:
return sizeof(AiActivateObjectRecord);
case AI_DestroyObject:
return sizeof(AiDestroyObjectRecord);
case AI_DropObject:
return sizeof(AiDropObjectRecord);
case AI_ChrDropAllConcealedItems:
return sizeof(AiChrDropAllConcealedItemsRecord);
case AI_ChrDropAllHeldItems:
return sizeof(AiChrDropAllHeldItemsRecord);
case AI_BondCollectObject:
return sizeof(AiBondCollectObjectRecord);
case AI_ChrEquipObject:
return sizeof(AiChrEquipObjectRecord);
case AI_MoveObject:
return sizeof(AiMoveObjectRecord);
case AI_DoorOpen:
return sizeof(AiDoorOpenRecord);
case AI_DoorClose:
return sizeof(AiDoorCloseRecord);
case AI_IFDoorStateEqual:
return sizeof(AiIFDoorStateEqualRecord);
case AI_IFDoorHasBeenOpenedBefore:
return sizeof(AiIFDoorHasBeenOpenedBeforeRecord);
case AI_DoorSetLock:
return sizeof(AiDoorSetLockRecord);
case AI_DoorUnsetLock:
return sizeof(AiDoorUnsetLockRecord);
case AI_IFDoorLockEqual:
return sizeof(AiIFDoorLockEqualRecord);
case AI_IFObjectiveNumComplete:
return sizeof(AiIFObjectiveNumCompleteRecord);
case AI_TRYUnknown6e:
return sizeof(AiTRYUnknown6eRecord);
case AI_TRYUnknown6f:
return sizeof(AiTRYUnknown6fRecord);
case AI_IFGameDifficultyLessThan:
return sizeof(AiIFGameDifficultyLessThanRecord);
case AI_IFGameDifficultyGreaterThan:
return sizeof(AiIFGameDifficultyGreaterThanRecord);
case AI_IFMissionTimeLessThan:
return sizeof(AiIFMissionTimeLessThanRecord);
case AI_IFMissionTimeGreaterThan:
return sizeof(AiIFMissionTimeGreaterThanRecord);
case AI_IFSystemPowerTimeLessThan:
return sizeof(AiIFSystemPowerTimeLessThanRecord);
case AI_IFSystemPowerTimeGreaterThan:
return sizeof(AiIFSystemPowerTimeGreaterThanRecord);
case AI_IFLevelIdLessThan:
return sizeof(AiIFLevelIdLessThanRecord);
case AI_IFLevelIdGreaterThan:
return sizeof(AiIFLevelIdGreaterThanRecord);
case AI_IFMyNumArghsLessThan:
return sizeof(AiIFMyNumArghsLessThanRecord);
case AI_IFMyNumArghsGreaterThan:
return sizeof(AiIFMyNumArghsGreaterThanRecord);
case AI_IFMyNumCloseArghsLessThan:
return sizeof(AiIFMyNumCloseArghsLessThanRecord);
case AI_IFMyNumCloseArghsGreaterThan:
return sizeof(AiIFMyNumCloseArghsGreaterThanRecord);
case AI_IFChrHealthLessThan:
return sizeof(AiIFChrHealthLessThanRecord);
case AI_IFChrHealthGreaterThan:
return sizeof(AiIFChrHealthGreaterThanRecord);
case AI_IFChrWasDamagedSinceLastCheck:
return sizeof(AiIFChrWasDamagedSinceLastCheckRecord);
case AI_IFBondHealthLessThan:
return sizeof(AiIFBondHealthLessThanRecord);
case AI_IFBondHealthGreaterThan:
return sizeof(AiIFBondHealthGreaterThanRecord);
case AI_SetMyMorale:
return sizeof(AiSetMyMoraleRecord);
case AI_AddToMyMorale:
return sizeof(AiAddToMyMoraleRecord);
case AI_SubtractFromMyMorale:
return sizeof(AiSubtractFromMyMoraleRecord);
case AI_IFMyMoraleLessThan:
return sizeof(AiIFMyMoraleLessThanRecord);
case AI_IFMyMoraleLessThanRandom:
return sizeof(AiIFMyMoraleLessThanRandomRecord);
case AI_SetMyAlertness:
return sizeof(AiSetMyAlertnessRecord);
case AI_AddToMyAlertness:
return sizeof(AiAddToMyAlertnessRecord);
case AI_SubtractFromMyAlertness:
return sizeof(AiSubtractFromMyAlertnessRecord);
case AI_IFMyAlertnessLessThan:
return sizeof(AiIFMyAlertnessLessThanRecord);
case AI_IFMyAlertnessLessThanRandom:
return sizeof(AiIFMyAlertnessLessThanRandomRecord);
case AI_SetMyHearingScale:
return sizeof(AiSetMyHearingScaleRecord);
case AI_SetMyVisionRange:
return sizeof(AiSetMyVisionRangeRecord);
case AI_SetMyGrenadeProbability:
return sizeof(AiSetMyGrenadeProbabilityRecord);
case AI_SetMyChrNum:
return sizeof(AiSetMyChrNumRecord);
case AI_SetMyHealthTotal:
return sizeof(AiSetMyHealthTotalRecord);
case AI_SetMyArmour:
return sizeof(AiSetMyArmourRecord);
case AI_SetMySpeedRating:
return sizeof(AiSetMySpeedRatingRecord);
case AI_SetMyArghRating:
return sizeof(AiSetMyArghRatingRecord);
case AI_SetMyAccuracyRating:
return sizeof(AiSetMyAccuracyRatingRecord);
case AI_SetMyFlags2:
return sizeof(AiSetMyFlags2Record);
case AI_UnsetMyFlags2:
return sizeof(AiUnsetMyFlags2Record);
case AI_IFMyFlags2Has:
return sizeof(AiIFMyFlags2HasRecord);
case AI_SetChrBitfield:
return sizeof(AiSetChrBitfieldRecord);
case AI_UnsetChrBitfield:
return sizeof(AiUnsetChrBitfieldRecord);
case AI_IFChrBitfieldHas:
return sizeof(AiIFChrBitfieldHasRecord);
case AI_SetObjectiveBitfield:
return sizeof(AiSetObjectiveBitfieldRecord);
case AI_UnsetObjectiveBitfield:
return sizeof(AiUnsetObjectiveBitfieldRecord);
case AI_IFObjectiveBitfieldHas:
return sizeof(AiIFObjectiveBitfieldHasRecord);
case AI_SetMychrflags:
return sizeof(AiSetMychrflagsRecord);
case AI_UnsetMychrflags:
return sizeof(AiUnsetMychrflagsRecord);
case AI_IFMychrflagsHas:
return sizeof(AiIFMychrflagsHasRecord);
case AI_SetChrchrflags:
return sizeof(AiSetChrchrflagsRecord);
case AI_UnsetChrchrflags:
return sizeof(AiUnsetChrchrflagsRecord);
case AI_IFChrchrflagsHas:
return sizeof(AiIFChrchrflagsHasRecord);
case AI_SetObjectFlags:
return sizeof(AiSetObjectFlagsRecord);
case AI_UnsetObjectFlags:
return sizeof(AiUnsetObjectFlagsRecord);
case AI_IFObjectFlagsHas:
return sizeof(AiIFObjectFlagsHasRecord);
case AI_SetObjectFlags2:
return sizeof(AiSetObjectFlags2Record);
case AI_UnsetObjectFlags2:
return sizeof(AiUnsetObjectFlags2Record);
case AI_IFObjectFlags2Has:
return sizeof(AiIFObjectFlags2HasRecord);
case AI_SetMyChrPreset:
return sizeof(AiSetMyChrPresetRecord);
case AI_SetChrChrPreset:
return sizeof(AiSetChrChrPresetRecord);
case AI_SetMyPadPreset:
return sizeof(AiSetMyPadPresetRecord);
case AI_SetChrPadPreset:
return sizeof(AiSetChrPadPresetRecord);
case AI_MyTimerStart:
return sizeof(AiMyTimerStartRecord);
case AI_MyTimerReset:
return sizeof(AiMyTimerResetRecord);
case AI_MyTimerPause:
return sizeof(AiMyTimerPauseRecord);
case AI_MyTimerResume:
return sizeof(AiMyTimerResumeRecord);
case AI_IFMyTimerIsNotRunning:
return sizeof(AiIFMyTimerIsNotRunningRecord);
case AI_IFMyTimerLessThanTicks:
return sizeof(AiIFMyTimerLessThanTicksRecord);
case AI_IFMyTimerGreaterThanTicks:
return sizeof(AiIFMyTimerGreaterThanTicksRecord);
case AI_HudCountdownShow:
return sizeof(AiHudCountdownShowRecord);
case AI_HudCountdownHide:
return sizeof(AiHudCountdownHideRecord);
case AI_HudCountdownSet:
return sizeof(AiHudCountdownSetRecord);
case AI_HudCountdownStop:
return sizeof(AiHudCountdownStopRecord);
case AI_HudCountdownStart:
return sizeof(AiHudCountdownStartRecord);
case AI_IFHudCountdownIsNotRunning:
return sizeof(AiIFHudCountdownIsNotRunningRecord);
case AI_IFHudCountdownLessThan:
return sizeof(AiIFHudCountdownLessThanRecord);
case AI_IFHudCountdownGreaterThan:
return sizeof(AiIFHudCountdownGreaterThanRecord);
case AI_TRYSpawningChrAtPad:
return sizeof(AiTRYSpawningChrAtPadRecord);
case AI_TRYSpawningChrNextToChr:
return sizeof(AiTRYSpawningChrNextToChrRecord);
case AI_TRYGiveMeItem:
return sizeof(AiTRYGiveMeItemRecord);
case AI_TRYGiveMeHat:
return sizeof(AiTRYGiveMeHatRecord);
case AI_TRYCloningChr:
return sizeof(AiTRYCloningChrRecord);
case AI_TextPrintBottom:
return sizeof(AiTextPrintBottomRecord);
case AI_TextPrintTop:
return sizeof(AiTextPrintTopRecord);
case AI_SfxPlay:
return sizeof(AiSfxPlayRecord);
case AI_SfxEmitFromObject:
return sizeof(AiSfxEmitFromObjectRecord);
case AI_SfxEmitFromPad:
return sizeof(AiSfxEmitFromPadRecord);
case AI_SfxSetChannelVolume:
return sizeof(AiSfxSetChannelVolumeRecord);
case AI_SfxFadeChannelVolume:
return sizeof(AiSfxFadeChannelVolumeRecord);
case AI_SfxStopChannel:
return sizeof(AiSfxStopChannelRecord);
case AI_IFSfxChannelVolumeLessThan:
return sizeof(AiIFSfxChannelVolumeLessThanRecord);
case AI_VehicleStartPath:
return sizeof(AiVehicleStartPathRecord);
case AI_VehicleSpeed:
return sizeof(AiVehicleSpeedRecord);
case AI_AircraftRotorSpeed:
return sizeof(AiAircraftRotorSpeedRecord);
case AI_IFCameraIsInIntro:
return sizeof(AiIFCameraIsInIntroRecord);
case AI_IFCameraIsInBondSwirl:
return sizeof(AiIFCameraIsInBondSwirlRecord);
case AI_TvChangeScreenBank:
return sizeof(AiTvChangeScreenBankRecord);
case AI_IFBondInTank:
return sizeof(AiIFBondInTankRecord);
case AI_EndLevel:
return sizeof(AiEndLevelRecord);
case AI_CameraReturnToBond:
return sizeof(AiCameraReturnToBondRecord);
case AI_CameraLookAtBondFromPad:
return sizeof(AiCameraLookAtBondFromPadRecord);
case AI_CameraSwitch:
return sizeof(AiCameraSwitchRecord);
case AI_IFBondYPosLessThan:
return sizeof(AiIFBondYPosLessThanRecord);
case AI_BondDisableControl:
return sizeof(AiBondDisableControlRecord);
case AI_BondEnableControl:
return sizeof(AiBondEnableControlRecord);
case AI_TRYTeleportingChrToPad:
return sizeof(AiTRYTeleportingChrToPadRecord);
case AI_ScreenFadeToBlack:
return sizeof(AiScreenFadeToBlackRecord);
case AI_ScreenFadeFromBlack:
return sizeof(AiScreenFadeFromBlackRecord);
case AI_IFScreenFadeCompleted:
return sizeof(AiIFScreenFadeCompletedRecord);
case AI_HideAllChrs:
return sizeof(AiHideAllChrsRecord);
case AI_ShowAllChrs:
return sizeof(AiShowAllChrsRecord);
case AI_DoorOpenInstant:
return sizeof(AiDoorOpenInstantRecord);
case AI_ChrRemoveItemInHand:
return sizeof(AiChrRemoveItemInHandRecord);
case AI_IfNumberOfActivePlayersLessThan:
return sizeof(AiIfNumberOfActivePlayersLessThanRecord);
case AI_IFBondItemTotalAmmoLessThan:
return sizeof(AiIFBondItemTotalAmmoLessThanRecord);
case AI_BondEquipItem:
return sizeof(AiBondEquipItemRecord);
case AI_BondEquipItemCinema:
return sizeof(AiBondEquipItemCinemaRecord);
case AI_BondSetLockedVelocity:
return sizeof(AiBondSetLockedVelocityRecord);
case AI_IFObjectInRoomWithPad:
return sizeof(AiIFObjectInRoomWithPadRecord);
case AI_SwitchSky:
return sizeof(AiSwitchSkyRecord);
case AI_TriggerFadeAndExitLevelOnButtonPress:
return sizeof(AiTriggerFadeAndExitLevelOnButtonPressRecord);
case AI_IFBondIsDead:
return sizeof(AiIFBondIsDeadRecord);
case AI_BondDisableDamageAndPickups:
return sizeof(AiBondDisableDamageAndPickupsRecord);
case AI_BondHideWeapons:
return sizeof(AiBondHideWeaponsRecord);
case AI_CameraOrbitPad:
return sizeof(AiCameraOrbitPadRecord);
case AI_CreditsRoll:
return sizeof(AiCreditsRollRecord);
case AI_IFCreditsHasCompleted:
return sizeof(AiIFCreditsHasCompletedRecord);
case AI_IFObjectiveAllCompleted:
return sizeof(AiIFObjectiveAllCompletedRecord);
case AI_IFFolderActorIsEqual:
return sizeof(AiIFFolderActorIsEqualRecord);
case AI_IFBondDamageAndPickupsDisabled:
return sizeof(AiIFBondDamageAndPickupsDisabledRecord);
case AI_MusicPlaySlot:
return sizeof(AiMusicPlaySlotRecord);
case AI_MusicStopSlot:
return sizeof(AiMusicStopSlotRecord);
case AI_TriggerExplosionsAroundBond:
return sizeof(AiTriggerExplosionsAroundBondRecord);
case AI_IFKilledCiviliansGreaterThan:
return sizeof(AiIFKilledCiviliansGreaterThanRecord);
case AI_IFChrWasShotSinceLastCheck:
return sizeof(AiIFChrWasShotSinceLastCheckRecord);
case AI_BondKilledInAction:
return sizeof(AiBondKilledInActionRecord);
case AI_RaiseArms:
return sizeof(AiRaiseArmsRecord);
case AI_GasLeakAndFadeFog:
return sizeof(AiGasLeakAndFadeFogRecord);
case AI_ObjectRocketLaunch:
return sizeof(AiObjectRocketLaunchRecord);
case AI_PRINT:
{
int pos = offset + 1;
while (AIList[pos] != 0)
{
++pos;
}
return (pos - offset) + 1;
}
default:
printf("chraiitemsize: unknown type %d!\n", AIList[offset]);
printf("%d,%d,%d,[%d],%d,%d,%d\n", AIList[offset - 3], AIList[offset - 2], AIList[offset - 1], AIList[offset ], AIList[offset +1], AIList[offset + 2], AIList[offset +3]);
return 1;
}
}
#define EraseCommand printf("\r%*s\r", (int)strlen(AI_CMD_ToString[AiList[Offset]]) + ((int)strlen((char *)tabs) + 1), "")
//#define NOMACROS
/**
* @brief Parse AI list and print out C Macros
* @param AiList: Bytestream for ai
* @param ID: List ID
*/
void ai(unsigned char *AiList, short ID)
{
for (int Offset = 0;;)
{
int hasClosingBrace = FALSE;
int hasLabel = FALSE;
int hasMacro = FALSE;
int tabs[MAX + 1]; // 4 char wide string
int i;
for ( i = 0; i < MAX; i++)
{
tabs[i] = 0;
}
for ( i = 0; i < top + 2 && i < MAX; i++)
{
tabs[i] = 0x20202020; // 4 spaces
}
printf("%s%s(", (char *)tabs, AI_CMD_ToString[AiList[Offset]]);
switch (AiList[Offset])
{
case AI_GotoFirst: // BYTE(LABEL)
{
AiGotoFirstRecord *ai = &AiList+Offset;
int lbl = AiList[Offset + 1];
#ifndef NOMACROS
if (lbl == sniff()) //either contnue or loop
{
int found = 0;
for (i = Offset; AiList[i] != AI_EndList; i += chraiitemsize(AiList, i))
{
if (AiList[i] == AI_GotoFirst && AiList[i+1] == lbl) found++;
}
EraseCommand;
if (found ==1)
{
pop();
for ( i = top + 2; i < MAX; i++)
{
tabs[i] = 0;
}
printf("%sLOOP(", (char *)tabs);
}
else
{
printf("%sCONTINUE(", (char *)tabs);
}
}
#endif
printf("lbl%d)\n\n",lbl);
AddLabel(lbl);
hasClosingBrace = TRUE;
break;
}
case AI_Label: // BYTE(ID)
{
AiLabelRecord *ai = &AiList+Offset;
int lbl = AiList[Offset + 1];
#ifndef NOMACROS
Offset += AI_Label_LENGTH;
hasMacro = TRUE;
if (AiList[Offset] == AI_Yield)
{
int hasLoop = FALSE;
Offset += AI_Yield_LENGTH;
for (i = Offset; AiList[i] != AI_EndList; i += chraiitemsize(AiList, i))
{
if (AiList[i] == AI_GotoFirst && AiList[i + 1] == lbl) hasLoop = TRUE;
}
if (hasLoop)
{
EraseCommand;
if (AiList[Offset] != AI_GotoFirst)
{
push(lbl);
printf("\n%sDO(", (char *)tabs);
}
else
{
printf("\n%sYIELD_FOREVER( lbl%d )\n\n", (char *)tabs, lbl);
Offset += AI_GotoFirst_LENGTH;
hasClosingBrace = TRUE;
}
}
else
{
Offset -= AI_Yield_LENGTH;
}
}
#endif
if(!hasClosingBrace) printf(" lbl%d ", lbl);
AddLabel(lbl);
break;
}
case AI_EndList /*canonical name*/: // /*NONE*/
{
AiEndListRecord *ai = &AiList+Offset;
printf(")\n\n");
return;
}
case AI_SetChrAiList: // BYTE(CHR_NUM), DBYTE(AI_LIST_ID)
{
AiSetChrAiListRecord *ai = &AiList+Offset;
unsigned short AI_LIST_ID = CharArrayTo16(AiList, (Offset + 1 + 1));
signed char CHR_NUM = AiList[Offset + 1];
if (CHR_NUM < 0 && CHR_NUM > -10)
{
EraseCommand;
switch (CHR_NUM)
{
case CHR_SELF:
{
int found = 0;
i = Offset;
while (i > 0)
{
if (AiList[i] == AI_SetReturnAiList &&
CharArrayTo16(AiList, i + 1) == ID)
{
found = 1;
if (i < Offset - AI_SetReturnAiList_LENGTH) printf("// tentative, Please confirm\n");
break;
}
i --;
}
if (found)
{
printf("%s%s(", (char *)tabs, "CALL");
}
else
{
printf("%s%s(", (char *)tabs, "JumpTo");
}
break;
}
case CHR_BOND_CINEMA:
{
printf("%s%s(", (char *)tabs, "SetBondsAiList");
break;
}
case CHR_CLONE:
{
printf("%s%s(", (char *)tabs, "SetMyClonesAiList");
break;
}
}
}
else
{
if (CHR_NUM < 0 && CHR_NUM > -10)
{
printf("%s,", CHR_ToString[abs(CHR_NUM)]);
}
else
{
printf("chr%hd,", CHR_NUM);
}
}
if (isGlobalAIListID(AI_LIST_ID))
{
printf("%s", GAILIST_ToString[AI_LIST_ID]);
}
else if (isBGAIListID(AI_LIST_ID))
{
printf("bgai_%hd", getBGAIListID(AI_LIST_ID));
}
else
{
printf("chrai_%hd", getChrAIListID(AI_LIST_ID));
}
if (hasClosingBrace) printf(")\n\n");
break;
}
case AI_SetReturnAiList: // DBYTE(AI_LIST_ID)
{
AiSetReturnAiListRecord *ai = &AiList+Offset;
unsigned short AI_LIST_ID = CharArrayTo16(AiList, (Offset + 1));
if (!(AiList[Offset + AI_SetReturnAiList_LENGTH] == AI_SetChrAiList &&
AI_LIST_ID == ID &&
(signed char)AiList[Offset + AI_SetReturnAiList_LENGTH + 1] == CHR_SELF))
{
if (isGlobalAIListID(AI_LIST_ID))
{
printf("%s", GAILIST_ToString[AI_LIST_ID]);
}
else if (isBGAIListID(AI_LIST_ID))
{
printf("bgai_%hd", getBGAIListID(AI_LIST_ID));
}
else
{
printf("chrai_%hd", getChrAIListID(AI_LIST_ID));
}
}
else
{
EraseCommand; // CALL should already be printed
hasClosingBrace = TRUE;
}
break;
}
case AI_Return: // /*NONE*/
{
AiReturnRecord *ai = &AiList+Offset;
AddSubID(ID);
break;
}
case AI_PlayAnimation: // DBYTE(ANIMATION_ID), DBYTE(START_TIME30),DBYTE(END_TIME30), BYTE(BITFIELD), BYTE(INTERPOL_TIME60)
{
AiPlayAnimationRecord *ai = &AiList+Offset;
int anim_id, zero ;
short startframe, endframe;
anim_id = CharArrayTo16(AiList, Offset + 1 + 0);
startframe = CharArrayTo16(AiList, Offset + 1 + 2);
endframe = CharArrayTo16(AiList, Offset + 1 + 4);
if (startframe == -1 && endframe == -1 && AiList[Offset + 1 + 6] == 6 && AiList[Offset + 1 + 7] == 16)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "PlayAnimationSimple");
printf("%s", ANIMATIONS_ToString[anim_id]);
}
else
{
printf("%s,%d,%d,0x%02X,%d", ANIMATIONS_ToString[anim_id], startframe, endframe, AiList[Offset + 1 + 6], AiList[Offset + 1 + 7]);
}
break;
}
case AI_IFChrDyingOrDead: // BYTE(CHR_NUM), BYTE(GOTOLABEL)
{
AiIFChrDyingOrDeadRecord *ai = &AiList+Offset;
signed char chr = AiList[Offset + 1];
if (chr == CHR_SELF)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "IFImDyingOrDead");
}
else
{
if (chr < 0 && chr > -10)
{
printf("%s,", CHR_ToString[abs(chr)]);
}
else
{
printf("chr%hd,", chr);
AddChr(chr);
}
}
hasLabel = TRUE;
break;
}
case AI_IFChrDoesNotExist: // BYTE(CHR_NUM), BYTE(GOTOLABEL)
{
AiIFChrDoesNotExistRecord *ai = &AiList+Offset;
signed char chr = AiList[Offset + 1];
switch (chr)
{
case CHR_SELF:
{
EraseCommand;
printf("%s%s(", (char *)tabs, "IFIDoNotExist");
break;
}
case CHR_CLONE:
{
EraseCommand;
printf("%s%s(", (char *)tabs, "IFMyCloneDoesNotExist");
break;
}
default:
{
if (chr < 0 && chr > -10)
{
printf("%s,", CHR_ToString[abs(chr)]);
}
else
{
printf("chr%hd,", chr);
AddChr(chr);
}
}
}
hasLabel = TRUE;
break;
}
case AI_TRYFireOrAimAtTarget: // DBYTE(BITFIELD), DBYTE(TARGET), BYTE(GOTOLABEL)
{
AiTRYFireOrAimAtTargetRecord *ai = &AiList+Offset;
int targetid = CharArrayTo16(AiList, Offset + 1 + 2);
int targettype = CharArrayTo16(AiList, Offset + 1 + 0);
if (targettype == TARGET_BOND)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYFireAtBond");
}
else if (targettype == TARGET_PAD)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYFireAtPad");
printf("%d", targetid);
}
else if (targettype == TARGET_AIM_ONLY | TARGET_BOND)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYAimAtBond");
}
else if (targettype == TARGET_AIM_ONLY | TARGET_PAD)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYAimAtPad");
printf("%d", targetid);
}
else
{
printf("%04X,", targettype);
printf("chr%d", targetid);
AddChr(targetid);
}
hasLabel = TRUE;
break;
}
case AI_TRYFireOrAimAtTargetKneel: // DBYTE(BITFIELD), DBYTE(TARGET), BYTE(GOTOLABEL)
{
AiTRYFireOrAimAtTargetKneelRecord *ai = &AiList+Offset;
int targetid = CharArrayTo16(AiList, Offset + 1 + 2);
int targettype = CharArrayTo16(AiList, Offset + 1 + 0);
if (targettype == TARGET_BOND)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYFireAtBondKneeling");
}
else if (targettype == TARGET_PAD)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYFireAtPadKneeling");
printf("%d", targetid);
}
else if (targettype == TARGET_AIM_ONLY | TARGET_BOND)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYAimAtBondKneeling");
}
else if (targettype == TARGET_AIM_ONLY | TARGET_PAD)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYAimAtPadKneeling");
printf("%d", targetid);
}
else
{
printf("%04X,", targettype);
printf("chr%d", targetid);
AddChr(targetid);
}
hasLabel = TRUE;
break;
}
case AI_TRYFireOrAimAtTargetUpdate: // DBYTE(BITFIELD), DBYTE(TARGET), BYTE(GOTOLABEL)
{
AiTRYFireOrAimAtTargetUpdateRecord *ai = &AiList+Offset;
int targetid = CharArrayTo16(AiList, Offset + 1 + 2);
int targettype = CharArrayTo16(AiList, Offset + 1 + 0);
if (targettype == TARGET_BOND)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYFireAtBondUpdate");
}
else if (targettype == TARGET_PAD)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYFireAtPadUpdate");
printf("%d", targetid);
}
else if (targettype == TARGET_AIM_ONLY | TARGET_BOND)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYAimAtBondUpdate");
}
else if (targettype == TARGET_AIM_ONLY | TARGET_PAD)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYAimAtPadUpdate");
printf("%d", targetid);
}
else
{
printf("%04X,", targettype);
printf("chr%d", targetid);
AddChr(targetid);
}
hasLabel = TRUE;
break;
}
case AI_TRYFacingTarget: // DBYTE(BITFIELD),DBYTE(TARGET),BYTE(GOTOLABEL)
{
AiTRYFacingTargetRecord *ai = &AiList+Offset;
int targetid = CharArrayTo16(AiList, Offset + 1 + 2);
int targettype = CharArrayTo16(AiList, Offset + 1 + 0);
if (targettype == TARGET_BOND)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYFacingBond");
}
else if (targettype == TARGET_PAD)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYFacingPad");
printf("%d", targetid);
}
else
{
printf("%04X,", targettype);
printf("chr%d", targetid);
AddChr(targetid);
}
hasLabel = TRUE;
break;
}
case AI_HitChrWithItem: // BYTE(CHR_NUM),BYTE(PART_NUM),BYTE(ITEM_NUM)
{
AiHitChrWithItemRecord *ai = &AiList+Offset;
signed char CHR_NUM = AiList[Offset + 1];
if (CHR_NUM == CHR_SELF)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "HitMeWithItem");
printf("%d,%d", AiList[Offset + 2], AiList[Offset + 1 + 2]);
}
else
{
if (CHR_NUM<0 && CHR_NUM> - 10)
{
printf("%s,", CHR_ToString[abs(CHR_NUM)]);
}
else
{
printf("chr%hd,", CHR_NUM);
AddChr(CHR_NUM);
}
printf("%s,%s", HITTARGET_ToString[AiList[Offset + 1 + 1]], ITEM_IDS_ToString[AiList[Offset + 1 + 2]]);
}
break;
}
case AI_ChrHitChr: // BYTE(CHR_NUM),BYTE(CHR_NUM_TARGET),BYTE(PART_NUM)
{
AiChrHitChrRecord *ai = &AiList+Offset;
signed char CHR_NUM = AiList[Offset + 1];
signed char CHR_NUM2 = AiList[Offset + 2];
char PART_NUM = AiList[Offset + 3];
if (CHR_NUM == CHR_SELF)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "IHitChr");
if (CHR_NUM2 < 0 && CHR_NUM2 > -10)
{
printf("%s,", CHR_ToString[abs(CHR_NUM2)]);
}
else
{
printf("chr%hd,", CHR_NUM2);
AddChr(CHR_NUM2);
}
}
else if (CHR_NUM2 == CHR_SELF)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "ChrHitMe");
if (CHR_NUM < 0 && CHR_NUM > -10)
{
printf("%s,", CHR_ToString[abs(CHR_NUM)]);
}
else
{
printf("chr%hd,", CHR_NUM);
AddChr(CHR_NUM);
}
}
else
{
if (CHR_NUM < 0 && CHR_NUM > -10)
{
printf("%s,", CHR_ToString[abs(CHR_NUM)]);
}
else
{
printf("chr%hd,", CHR_NUM);
AddChr(CHR_NUM);
}
if (CHR_NUM2 < 0 && CHR_NUM2 > -10)
{
printf("%s,", CHR_ToString[abs(CHR_NUM2)]);
}
else
{
printf("chr%hd,", CHR_NUM2);
AddChr(CHR_NUM2);
}
}
printf("%s", HITTARGET_ToString[PART_NUM]);
break;
}
case AI_TRYDroppingItem: // DBYTE(PROP_NUM),BYTE(ITEM_NUM),BYTE(GOTOLABEL)
{
AiTRYDroppingItemRecord *ai = &AiList+Offset;
unsigned short modelnum = CharArrayTo16(AiList, Offset + 1 + 0);
printf("%s,%s", PROP_ToString[modelnum], ITEM_IDS_ToString[AiList[Offset + 1 + 2]]);
hasLabel = TRUE;
break;
}
case AI_ChrRemoveInstant: // BYTE(CHR_NUM)
{
AiChrRemoveInstantRecord *ai = AiList[Offset];
signed char chr = AiList[Offset + 1];
if (chr == CHR_SELF)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "RemoveMeInstantly");
}
else
{
if (chr < 0 && chr > -10)
{
printf("%s,", CHR_ToString[abs(chr)]);
}
else
{
printf("chr%hd,", chr);
AddChr(chr);
}
}
break;
}
case AI_TRYTriggeringAlarmAtPad: // DBYTE(PAD),BYTE(GOTOLABEL)
{
AiTRYTriggeringAlarmAtPadRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 0);
if (isNotBoundPad(pad))
{
printf("%d,", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
hasLabel = TRUE;
break;
}
case AI_TRYRunToChr: // BYTE(CHR_NUM), BYTE(GOTOLABEL)
{
AiTRYRunToChrRecord *ai = &AiList+Offset;
signed char chr = AiList[Offset + 1];
if (chr == CHR_PRESET)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYRunToPresetChr");
}
else
{
if (chr < 0 && chr > -10)
{
printf("%s,", CHR_ToString[abs(chr)]);
}
else
{
printf("chr%hd,", chr);
AddChr(chr);
}
}
hasLabel = TRUE;
break;
}
case AI_TRYWalkToChr: // BYTE(CHR_NUM), BYTE(GOTOLABEL)
{
AiTRYWalkToChrRecord *ai = &AiList+Offset;
signed char chr = AiList[Offset + 1];
if (chr == CHR_PRESET)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYWalkToPresetChr");
}
else
{
if (chr < 0 && chr > -10)
{
printf("%s,", CHR_ToString[abs(chr)]);
}
else
{
printf("chr%hd,", chr);
AddChr(chr);
}
}
hasLabel = TRUE;
break;
}
case AI_TRYSprintToChr: // BYTE(CHR_NUM), BYTE(GOTOLABEL)
{
AiTRYSprintToChrRecord *ai = &AiList+Offset;
signed char chr = AiList[Offset + 1];
if (chr == CHR_PRESET)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYSprintToPresetChr");
}
else
{
if (chr < 0 && chr > -10)
{
printf("%s,", CHR_ToString[abs(chr)]);
}
else
{
printf("chr%hd,", chr);
AddChr(chr);
}
}
hasLabel = TRUE;
break;
}
case AI_SetNewRandom:
{
AiSetNewRandomRecord *ai = &AiList+Offset;
if (AiList[Offset + 1] == AI_IFRandomLessThan || AiList[Offset + 1] == AI_IFRandomGreaterThan)
{
EraseCommand;
hasClosingBrace = TRUE;
}
break;
}
case AI_IFRandomLessThan: // BYTE(BYTE), BYTE(GOTOLABEL)
{
AiIFRandomLessThanRecord *ai = &AiList+Offset;
if (AiList[Offset - 1] == AI_SetNewRandom)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "IFNewRandomLessThan");
}
hasLabel = TRUE;
break;
}
case AI_IFRandomGreaterThan: // BYTE(BYTE), BYTE(GOTOLABEL)
{
AiIFRandomGreaterThanRecord *ai = &AiList+Offset;
if (AiList[Offset - 1] == AI_SetNewRandom)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "IFNewRandomGreaterThan");
}
hasLabel = TRUE;
break;
}
case AI_RunToPad: // DBYTE(PAD)
{
AiRunToPadRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 0);
if (isNotBoundPad(pad))
{
printf("%d", pad);
}
else
{
printf("setBoundPadNum(%d)", getBoundPadNum(pad));
}
break;
}
case AI_WalkToPad: // DBYTE(PAD)
{
AiWalkToPadRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 0);
if (isNotBoundPad(pad))
{
printf("%d", pad);
}
else
{
printf("setBoundPadNum(%d)", getBoundPadNum(pad));
}
break;
}
case AI_SprintToPad: // DBYTE(PAD)
{
AiSprintToPadRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 0);
if (isNotBoundPad(pad))
{
printf("%d", pad);
}
else
{
printf("setBoundPadNum(%d)", getBoundPadNum(pad));
}
break;
}
case AI_StartPatrol: // BYTE(PATH_NUM)
{
AiStartPatrolRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_IFImInRoomWithChr: // BYTE(CHR_NUM), BYTE(GOTOLABEL)
{
AiIFImInRoomWithChrRecord *ai = &AiList+Offset;
signed char chr = AiList[Offset + 1];
if (chr < 0 && chr > -10)
{
printf("%s,", CHR_ToString[abs(chr)]);
}
else
{
printf("chr%hd,", chr);
AddChr(chr);
}
hasLabel = TRUE;
break;
}
case AI_IFRoomWithPadIsOnScreen: // DBYTE(PAD), BYTE(GOTOLABEL)
{
AiIFRoomWithPadIsOnScreenRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 0);
if (isNotBoundPad(pad))
{
printf("%d,", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
hasLabel = TRUE;
break;
}
case AI_IFMyAngleToBondLessThan: // BYTE(ANGLE), BYTE(GOTOLABEL)
{
AiIFMyAngleToBondLessThanRecord *ai = &AiList+Offset;
EraseCommand;
printf("%s%sDeg(", (char *)tabs, AI_CMD_ToString[AiList[Offset]]);
printf("%f,", RadToDeg(ByteToRadian((AiList[Offset + 1 + 0]))));
hasLabel = TRUE;
break;
}
case AI_IFMyAngleToBondGreaterThan: // BYTE(ANGLE), BYTE(GOTOLABEL)
{
AiIFMyAngleToBondGreaterThanRecord *ai = &AiList+Offset;
EraseCommand;
printf("%s%sDeg(", (char *)tabs, AI_CMD_ToString[AiList[Offset]]);
printf("%f,", RadToDeg(ByteToRadian((AiList[Offset + 1 + 0]))));
hasLabel = TRUE;
break;
}
case AI_IFMyAngleFromBondLessThan: // BYTE(ANGLE), BYTE(GOTOLABEL)
{
AiIFMyAngleFromBondLessThanRecord *ai = &AiList+Offset;
EraseCommand;
printf("%s%sDeg(", (char *)tabs, AI_CMD_ToString[AiList[Offset]]);
printf("%f,", RadToDeg(ByteToRadian((AiList[Offset + 1 + 0]))));
hasLabel = TRUE;
break;
}
case AI_IFMyAngleFromBondGreaterThan: // BYTE(ANGLE), BYTE(GOTOLABEL)
{
AiIFMyAngleFromBondGreaterThanRecord *ai = &AiList+Offset;
EraseCommand;
printf("%s%sDeg(", (char *)tabs, AI_CMD_ToString[AiList[Offset]]);
printf("%f,", RadToDeg(ByteToRadian((AiList[Offset + 1 + 0]))));
hasLabel = TRUE;
break;
}
case AI_IFMyDistanceToBondLessThanDecimeter: // DBYTE(DISTANCE), BYTE(GOTOLABEL)
{
AiIFMyDistanceToBondLessThanDecimeterRecord *ai = &AiList+Offset;
float distance = CharArrayTo16(AiList, Offset + 1 + 0) * 10.0f;
EraseCommand;
printf("%s%s(", (char *)tabs, "IFMyDistanceToBondLessThanMeter");
printf("%f,", distance / 100);
hasLabel = TRUE;
break;
}
case AI_IFMyDistanceToBondGreaterThanDecimeter: // DBYTE(DISTANCE), BYTE(GOTOLABEL)
{
AiIFMyDistanceToBondGreaterThanDecimeterRecord *ai = &AiList+Offset;
float distance = CharArrayTo16(AiList, Offset + 1 + 0) * 10.0f;
EraseCommand;
printf("%s%s(", (char *)tabs, "IFMyDistanceToBondGreaterThanMeter");
printf("%f,", distance / 100);
hasLabel = TRUE;
break;
}
case AI_IFChrDistanceToPadLessThanDecimeter: // BYTE(CHR_NUM), DBYTE(DISTANCE), DBYTE(PAD), BYTE(GOTOLABEL)
{
AiIFChrDistanceToPadLessThanDecimeterRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 3);
float value = CharArrayTo16(AiList, Offset + 1 + 1) * 10.0f;
signed char chr = AiList[Offset + 1];
EraseCommand;
if (chr == CHR_SELF)
{
printf("%s%s(", (char *)tabs, "IFMyDistanceToPadLessThanMeter");
}
else
{
printf("%s%s(", (char *)tabs, "IFChrDistanceToPadLessThanMeter");
if (chr < 0 && chr > -10)
{
printf("%s,", CHR_ToString[abs(chr)]);
}
else
{
printf("chr%hd,", chr);
AddChr(chr);
}
}
printf("%f,", value / 100);
if (isNotBoundPad(pad))
{
printf("%d,", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
hasLabel = TRUE;
break;
}
case AI_IFChrDistanceToPadGreaterThanDecimeter: // BYTE(CHR_NUM), DBYTE(DISTANCE), DBYTE(PAD), BYTE(GOTOLABEL)
{
AiIFChrDistanceToPadGreaterThanDecimeterRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 3);
float value = CharArrayTo16(AiList, Offset + 1 + 1) * 10.0f;
signed char chr = AiList[Offset + 1];
EraseCommand;
if ((signed char)AiList[Offset + 1 + 0] == CHR_SELF)
{
printf("%s%s(", (char *)tabs, "IFMyDistanceToPadGreaterThanMeter");
}
else
{
printf("%s%s(", (char *)tabs, "IFChrDistanceToPadGreaterThanMeter");
if (chr < 0 && chr > -10)
{
printf("%s,", CHR_ToString[abs(chr)]);
}
else
{
printf("chr%hd,", chr);
AddChr(chr);
}
}
printf("%f,", value / 100);
if (isNotBoundPad(pad))
{
printf("%d,", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
hasLabel = TRUE;
break;
}
case AI_IFMyDistanceToChrLessThanDecimeter: // DBYTE(DISTANCE), BYTE(CHR_NUM), BYTE(GOTOLABEL)
{
AiIFMyDistanceToChrLessThanDecimeterRecord *ai = &AiList+Offset;
float cutoff = CharArrayTo16(AiList, Offset + 1 + 0) * 10.0f;
signed char chr = AiList[Offset + 3];
EraseCommand;
printf("%s%s(", (char *)tabs, "AIFMyDistanceToChrLessThanMeter");
printf("%f,", cutoff / 100 );
if (chr < 0 && chr > -10)
{
printf("%s,", CHR_ToString[abs(chr)]);
}
else
{
printf("chr%hd,", chr);
AddChr(chr);
}
hasLabel = TRUE;
break;
}
case AI_IFMyDistanceToChrGreaterThanDecimeter: // DBYTE(DISTANCE), BYTE(CHR_NUM), BYTE(GOTOLABEL)
{
AiIFMyDistanceToChrGreaterThanDecimeterRecord *ai = &AiList+Offset;
float cutoff = CharArrayTo16(AiList, Offset + 1 + 0) * 10.0f;
signed char chr = AiList[Offset + 3];
EraseCommand;
printf("%s%s(", (char *)tabs, "AIFMyDistanceToChrGreaterThanMeter");
printf("%f,", cutoff / 100);
if (chr < 0 && chr > -10)
{
printf("%s,", CHR_ToString[abs(chr)]);
}
else
{
printf("chr%hd,", chr);
AddChr(chr);
}
hasLabel = TRUE;
break;
}
case AI_TRYSettingMyPresetToChrWithinDistanceDecimeter: // DBYTE(DISTANCE), BYTE(GOTOLABEL)
{
AiTRYSettingMyPresetToChrWithinDistanceDecimeterRecord *ai = &AiList+Offset;
float distance = CharArrayTo16(AiList, Offset + 1 + 0) * 10.0f;
EraseCommand;
printf("%s%s(", (char *)tabs, "TRYSettingMyPresetToChrWithinDistanceMeter");
printf("%f,", distance / 100);
hasLabel = TRUE;
break;
}
case AI_IFBondDistanceToPadLessThanDecimeter: // DBYTE(DISTANCE), DBYTE(PAD), BYTE(GOTOLABEL)
{
AiIFBondDistanceToPadLessThanDecimeterRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 2);
float value = CharArrayTo16(AiList, Offset + 1 + 0) * 10.0f;
EraseCommand;
printf("%s%s(", (char *)tabs, "IFBondDistanceToPadLessThanMeter");
printf("%f,", value / 100);
if (isNotBoundPad(pad))
{
printf("%d,", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
hasLabel = TRUE;
break;
}
case AI_IFBondDistanceToPadGreaterThanDecimeter: // DBYTE(DISTANCE), DBYTE(PAD), BYTE(GOTOLABEL)
{
AiIFBondDistanceToPadGreaterThanDecimeterRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 2);
float value = CharArrayTo16(AiList, Offset + 1 + 0) * 10.0f;
EraseCommand;
printf("%s%s(", (char *)tabs, "IFBondDistanceToPadGreaterThanMeter");
printf("%f,", value / 100);
if (isNotBoundPad(pad))
{
printf("%d,", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
hasLabel = TRUE;
break;
}
case AI_IFChrInRoomWithPad: // BYTE(CHR_NUM), DBYTE(PAD), BYTE(GOTOLABEL)
{
AiIFChrInRoomWithPadRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 1);
if ((signed char)AiList[Offset + 1 + 0] == CHR_SELF)
{
EraseCommand;
printf("%s%s(", (char *)tabs, "IFImInRoomWithPad");
}
else
{
printf("%d,", AiList[Offset + 1 + 0]);
}
if (isNotBoundPad(pad))
{
printf("%d,", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
hasLabel = TRUE;
break;
}
case AI_IFBondInRoomWithPad: // DBYTE(PAD), BYTE(GOTOLABEL)
{
AiIFBondInRoomWithPadRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 0);
if (isNotBoundPad(pad))
{
printf("%d,", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
hasLabel = TRUE;
break;
}
case AI_IFBondCollectedObject: // BYTE(OBJECT_TAG), BYTE(GOTOLABEL)
{
AiIFBondCollectedObjectRecord *ai = &AiList+Offset;
printf("tag%d,", AiList[Offset + 1]);
AddTag(AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_IFKeyDropped: // BYTE(KEY_ID), BYTE(GOTOLABEL)
{
AiIFKeyDroppedRecord *ai = &AiList+Offset;
printf("key%d,", AiList[Offset + 1]);
AddKey(AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_IFItemIsAttachedToObject: // BYTE(ITEM_NUM), BYTE(OBJECT_TAG), BYTE(GOTOLABEL)
{
AiIFItemIsAttachedToObjectRecord *ai = &AiList+Offset;
printf("%s,tag%d,", ITEM_IDS_ToString[AiList[Offset + 1]], AiList[Offset + 2]);
hasLabel = TRUE;
AddTag(AiList[Offset + 2]);
break;
}
case AI_IFBondHasItemEquipped: // BYTE(ITEM_NUM), BYTE(GOTOLABEL)
{
AiIFBondHasItemEquippedRecord *ai = &AiList+Offset;
printf("%s,", ITEM_IDS_ToString[AiList[Offset + 1]]);
hasLabel = TRUE;
break;
}
case AI_IFObjectExists: // BYTE(OBJECT_TAG), BYTE(GOTOLABEL)
{
AiIFObjectExistsRecord *ai = &AiList+Offset;
printf("tag%d,", AiList[Offset + 1]);
hasLabel = TRUE;
AddTag(AiList[Offset + 1]);
break;
}
case AI_IFObjectNotDestroyed: // BYTE(OBJECT_TAG), BYTE(GOTOLABEL)
{
AiIFObjectNotDestroyedRecord *ai = &AiList+Offset;
printf("tag%d,", AiList[Offset + 1]);
hasLabel = TRUE;
AddTag(AiList[Offset + 1]);
break;
}
case AI_IFObjectWasActivated: // BYTE(OBJECT_TAG), BYTE(GOTOLABEL)
{
AiIFObjectWasActivatedRecord *ai = &AiList+Offset;
printf("tag%d,", AiList[Offset + 1]);
hasLabel = TRUE;
AddTag(AiList[Offset + 1]);
break;
}
case AI_IFBondUsedGadgetOnObject: // BYTE(OBJECT_TAG), BYTE(GOTOLABEL)
{
AiIFBondUsedGadgetOnObjectRecord *ai = &AiList+Offset;
printf("tag%d,", AiList[Offset + 1]);
hasLabel = TRUE;
AddTag(AiList[Offset + 1]);
break;
}
case AI_ActivateObject: // BYTE(OBJECT_TAG)
{
AiActivateObjectRecord *ai = &AiList+Offset;
printf("tag%d", AiList[Offset + 1]);
break;
}
case AI_DestroyObject: // BYTE(OBJECT_TAG)
{
AiDestroyObjectRecord *ai = &AiList+Offset;
printf("tag%d", AiList[Offset + 1]);
AddTag(AiList[Offset + 1]);
break;
}
case AI_DropObject: // BYTE(OBJECT_TAG)
{
AiDropObjectRecord *ai = &AiList+Offset;
printf("tag%d", AiList[Offset + 1]);
AddTag(AiList[Offset + 1]);
break;
}
case AI_ChrDropAllConcealedItems: // BYTE(CHR_NUM)
{
AiChrDropAllConcealedItemsRecord *ai = &AiList+Offset;
printf("chr%d", AiList[Offset + 1]);
AddChr(AiList[Offset + 1]);
break;
}
case AI_ChrDropAllHeldItems: // BYTE(CHR_NUM)
{
AiChrDropAllHeldItemsRecord *ai = &AiList+Offset;
printf("chr%d", AiList[Offset + 1]);
AddChr(AiList[Offset + 1]);
break;
}
case AI_BondCollectObject: // BYTE(OBJECT_TAG)
{
AiBondCollectObjectRecord *ai = &AiList+Offset;
printf("tag%d", AiList[Offset + 1]);
AddTag(AiList[Offset + 1]);
break;
}
case AI_ChrEquipObject: // BYTE(OBJECT_TAG), BYTE(CHR_NUM)
{
AiChrEquipObjectRecord *ai = &AiList+Offset;
printf("tag%d,chr%d", AiList[Offset + 1], AiList[Offset + 2]);
AddTag(AiList[Offset + 1]);
AddChr(AiList[Offset + 2]);
break;
}
case AI_MoveObject: // BYTE(OBJECT_TAG), DBYTE(PAD)
{
AiMoveObjectRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 1);
printf("tag%d,", AiList[Offset + 1]);
if (isNotBoundPad(pad))
{
printf("%d", pad);
}
else
{
printf("setBoundPadNum(%d)", getBoundPadNum(pad));
}
AddTag(AiList[Offset + 1]);
AddPad(pad);
break;
}
case AI_DoorOpen: // BYTE(OBJECT_TAG)
{
AiDoorOpenRecord *ai = &AiList+Offset;
printf("tag%d", AiList[Offset + 1]);
AddTag(AiList[Offset + 1]);
break;
}
case AI_DoorClose: // BYTE(OBJECT_TAG)
{
AiDoorCloseRecord *ai = &AiList+Offset;
printf("tag%d", AiList[Offset + 1]);
AddTag(AiList[Offset + 1]);
break;
}
case AI_IFDoorStateEqual: // BYTE(OBJECT_TAG), BYTE(DOOR_STATE), BYTE(GOTOLABEL)
{
AiIFDoorStateEqualRecord *ai = &AiList+Offset;
printf("tag%d,%s,", AiList[Offset + 1], DOORSTATE_ToString[AiList[Offset + 2] >> 1]);
hasLabel = TRUE;
AddTag(AiList[Offset + 1]);
break;
}
case AI_IFDoorHasBeenOpenedBefore: // BYTE(OBJECT_TAG), BYTE(GOTOLABEL)
{
AiIFDoorHasBeenOpenedBeforeRecord *ai = &AiList+Offset;
printf("tag%d,", AiList[Offset + 1]);
hasLabel = TRUE;
AddTag(AiList[Offset + 1]);
break;
}
case AI_DoorSetLock: // BYTE(OBJECT_TAG), BYTE(LOCK_FLAG)
{
AiDoorSetLockRecord *ai = &AiList+Offset;
printf("tag%d,%d", AiList[Offset + 1], AiList[Offset + 2]);
AddTag(AiList[Offset + 1]);
break;
}
case AI_DoorUnsetLock: // BYTE(OBJECT_TAG), BYTE(LOCK_FLAG)
{
AiDoorUnsetLockRecord *ai = &AiList+Offset;
printf("tag%d,%d", AiList[Offset + 1], AiList[Offset + 2]);
AddTag(AiList[Offset + 1]);
break;
}
case AI_IFDoorLockEqual: // BYTE(OBJECT_TAG), BYTE(LOCK_FLAG), BYTE(GOTOLABEL)
{
AiIFDoorLockEqualRecord *ai = &AiList+Offset;
printf("tag%d,%d,%d", AiList[Offset + 1], AiList[Offset + 2], AiList[Offset + 3]);
AddTag(AiList[Offset + 1]);
break;
}
case AI_IFObjectiveNumComplete: // BYTE(OBJ_NUM), BYTE(GOTOLABEL)
{
AiIFObjectiveNumCompleteRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_TRYUnknown6e: // BYTE(UNKNOWN_FLAG), BYTE(GOTOLABEL)
{
AiTRYUnknown6eRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_TRYUnknown6f: // BYTE(UNKNOWN_FLAG), BYTE(GOTOLABEL)
{
AiTRYUnknown6fRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_IFMyNumArghsLessThan: // BYTE(HIT_NUM), BYTE(GOTOLABEL)
{
AiIFMyNumArghsLessThanRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_IFMyNumArghsGreaterThan: // BYTE(HIT_NUM), BYTE(GOTOLABEL)
{
AiIFMyNumArghsGreaterThanRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_IFMyNumCloseArghsLessThan: // BYTE(MISSED_NUM), BYTE(GOTOLABEL)
{
AiIFMyNumCloseArghsLessThanRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_IFMyNumCloseArghsGreaterThan: // BYTE(MISSED_NUM), BYTE(GOTOLABEL)
{
AiIFMyNumCloseArghsGreaterThanRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_IFChrHealthLessThan: // BYTE(CHR_NUM), BYTE(HEALTH), BYTE(GOTOLABEL)
{
AiIFChrHealthLessThanRecord *ai = &AiList+Offset;
float value = (AiList[Offset + 1 + 1]) * 0.1f;
printf("%d,%f,", AiList[Offset + 1], value * 10);
hasLabel = TRUE;
AddChr(AiList[Offset + 1]);
break;
}
case AI_IFChrHealthGreaterThan: // BYTE(CHR_NUM), BYTE(HEALTH), BYTE(GOTOLABEL)
{
AiIFChrHealthGreaterThanRecord *ai = &AiList+Offset;
float value = (AiList[Offset + 1 + 1]) * 0.1f;
printf("%d,%f,", AiList[Offset + 1], value * 10);
hasLabel = TRUE;
AddChr(AiList[Offset + 1]);
break;
}
case AI_IFChrWasDamagedSinceLastCheck: // BYTE(CHR_NUM), BYTE(GOTOLABEL)
{
AiIFChrWasDamagedSinceLastCheckRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
AddChr(AiList[Offset + 1]);
break;
}
case AI_IFBondHealthLessThan: // BYTE(HEALTH), BYTE(GOTOLABEL)
{
AiIFBondHealthLessThanRecord *ai = &AiList+Offset;
float val = (AiList[Offset + 1 + 0]) / 255.0f;
printf("%f,", val * 255);
hasLabel = TRUE;
break;
}
case AI_IFBondHealthGreaterThan: // BYTE(HEALTH), BYTE(GOTOLABEL)
{
AiIFBondHealthGreaterThanRecord *ai = &AiList+Offset;
float val = (AiList[Offset + 1 + 0]) / 255.0f;
printf("%f,", val * 255);
hasLabel = TRUE;
break;
}
case AI_IFGameDifficultyLessThan: // BYTE(DIFICULTY_ID), BYTE(GOTOLABEL)
{
AiIFGameDifficultyLessThanRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_IFGameDifficultyGreaterThan: // BYTE(DIFICULTY_ID), BYTE(GOTOLABEL)
{
AiIFGameDifficultyGreaterThanRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_IFMissionTimeLessThan: // DBYTE(SECONDS), BYTE(GOTOLABEL)
{
AiIFMissionTimeLessThanRecord *ai = &AiList+Offset;
float target = CharArrayTo16(AiList, Offset + 1 + 0);
printf("%f,", target);
hasLabel = TRUE;
break;
}
case AI_IFMissionTimeGreaterThan: // DBYTE(SECONDS), BYTE(GOTOLABEL)
{
AiIFMissionTimeGreaterThanRecord *ai = &AiList+Offset;
float target = CharArrayTo16(AiList, Offset + 1 + 0);
printf("%f,", target);
hasLabel = TRUE;
break;
}
case AI_IFSystemPowerTimeLessThan: // DBYTE(MINUTES), BYTE(GOTOLABEL)
{
AiIFSystemPowerTimeLessThanRecord *ai = &AiList+Offset;
float target = CharArrayTo16(AiList, Offset + 1 + 0);
printf("%f,", target);
break;
}
case AI_IFSystemPowerTimeGreaterThan: // DBYTE(MINUTES), BYTE(GOTOLABEL)
{
AiIFSystemPowerTimeGreaterThanRecord *ai = &AiList+Offset;
float target = CharArrayTo16(AiList, Offset + 1 + 0);
printf("%f,", target);
hasLabel = TRUE;
break;
}
case AI_IFLevelIdLessThan: // BYTE(LEVEL_ID), BYTE(GOTOLABEL)
{
AiIFLevelIdLessThanRecord *ai = &AiList+Offset;
printf("%s,", LEVELID_ToString[AiList[Offset + 1] + 1]);
hasLabel = TRUE;
break;
}
case AI_IFLevelIdGreaterThan: // BYTE(LEVEL_ID), BYTE(GOTOLABEL)
{
AiIFLevelIdGreaterThanRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_SetMyMorale: // BYTE(CHRBYTE)
{
AiSetMyMoraleRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_AddToMyMorale: // BYTE(CHRBYTE)
{
AiAddToMyMoraleRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_SubtractFromMyMorale: // BYTE(CHRBYTE)
{
AiSubtractFromMyMoraleRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_IFMyMoraleLessThan: // BYTE(CHRBYTE), BYTE(GOTOLABEL)
{
AiIFMyMoraleLessThanRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_SetMyAlertness: // BYTE(CHRBYTE)
{
AiSetMyAlertnessRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_AddToMyAlertness: // BYTE(CHRBYTE)
{
AiAddToMyAlertnessRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_SubtractFromMyAlertness: // BYTE(CHRBYTE)
{
AiSubtractFromMyAlertnessRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_IFMyAlertnessLessThan: // BYTE(CHRBYTE), BYTE(GOTOLABEL)
{
AiIFMyAlertnessLessThanRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_SetMyHearingScale: // DBYTE(HEARING_SCALE)
{
AiSetMyHearingScaleRecord *ai = &AiList+Offset;
float distance = CharArrayTo16(AiList, Offset + 1 + 0) / 1000.0f;
printf("%f", distance * 1000);
break;
}
case AI_SetMyVisionRange: // BYTE(VISION_RANGE)
{
AiSetMyVisionRangeRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_SetMyGrenadeProbability: // BYTE(GRENADE_PROB)
{
AiSetMyGrenadeProbabilityRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_SetMyChrNum: // BYTE(CHR_NUM)
{
AiSetMyChrNumRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_SetMyHealthTotal: // DBYTE(HEALTH)
{
AiSetMyHealthTotalRecord *ai = &AiList+Offset;
float amount = CharArrayTo16(AiList, Offset + 1 + 0) * 0.1f;
printf("%f", amount * 10);
break;
}
case AI_SetMyArmour: // DBYTE(AMOUNT)
{
AiSetMyArmourRecord *ai = &AiList+Offset;
float amount = CharArrayTo16(AiList, Offset + 1 + 0) * 0.1f; /*if (cheatIsActive(CHEAT_ENEMYSHIELDS)) { amount = amount < 8 ? 8 : amount; } */
printf("%f", amount * 10);
break;
}
case AI_SetMySpeedRating: // BYTE(SPEED_RATING)
{
AiSetMySpeedRatingRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_SetMyArghRating: // BYTE(ARGH_RATING)
{
AiSetMyArghRatingRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_SetMyAccuracyRating: // BYTE(ACCURACY_RATING)
{
AiSetMyAccuracyRatingRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_SetMyFlags2: // BYTE(BITS)
{
AiSetMyFlags2Record *ai = &AiList+Offset;
printf("0x%x", AiList[Offset + 1]);
break;
}
case AI_UnsetMyFlags2: // BYTE(BITS)
{
AiUnsetMyFlags2Record *ai = &AiList+Offset;
printf("0x%x", AiList[Offset + 1]);
break;
}
case AI_IFMyFlags2Has: // BYTE(BITS) BYTE(GOTOLABEL)
{
AiIFMyFlags2HasRecord *ai = &AiList+Offset;
printf("0x%x,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_SetChrBitfield: // BYTE(CHR_NUM), BYTE(BITS)
{
AiSetChrBitfieldRecord *ai = &AiList+Offset;
printf("%d,0x%x", AiList[Offset + 1], AiList[Offset + 2]);
break;
}
case AI_UnsetChrBitfield: // BYTE(CHR_NUM), BYTE(BITS)
{
AiUnsetChrBitfieldRecord *ai = &AiList+Offset;
printf("%d,0x%x", AiList[Offset + 1], AiList[Offset + 2]);
break;
}
case AI_IFChrBitfieldHas: // BYTE(CHR_NUM), BYTE(BITS), BYTE(GOTOLABEL)
{
AiIFChrBitfieldHasRecord *ai = &AiList+Offset;
printf("%d,0x%x,", AiList[Offset + 1], AiList[Offset + 2]);
hasLabel = TRUE;
break;
}
case AI_SetObjectiveBitfield: // QBYTE(BITFIELD)
{
AiSetObjectiveBitfieldRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 0);
printf("0x%x", flags);
break;
}
case AI_UnsetObjectiveBitfield: // QBYTE(BITFIELD)
{
AiUnsetObjectiveBitfieldRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 0);
printf("0x%x", flags);
break;
}
case AI_IFObjectiveBitfieldHas: // QBYTE(BITS), BYTE(GOTOLABEL)
{
AiIFObjectiveBitfieldHasRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 0);
printf("0x%x,", flags);
hasLabel = TRUE;
break;
}
case AI_SetMychrflags: // QBYTE(CHRFLAGS)
{
AiSetMychrflagsRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 0);
printf("0x%x", flags);
break;
}
case AI_UnsetMychrflags: // QBYTE(CHRFLAGS)
{
AiUnsetMychrflagsRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 0);
printf("0x%x", flags);
break;
}
case AI_IFMychrflagsHas: // QBYTE(CHRFLAGS), BYTE(GOTOLABEL)
{
AiIFMychrflagsHasRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 0);
printf("0x%x,", flags);
hasLabel = TRUE;
break;
}
case AI_SetChrchrflags: // BYTE(CHR_NUM), QBYTE(CHRFLAGS)
{
AiSetChrchrflagsRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 1);
printf("%d,0x%x", AiList[Offset + 1], flags);
break;
}
case AI_UnsetChrchrflags: // BYTE(CHR_NUM), QBYTE(CHRFLAGS)
{
AiUnsetChrchrflagsRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 1);
printf("%d,0x%x", AiList[Offset + 1], flags);
break;
}
case AI_IFChrchrflagsHas: // BYTE(CHR_NUM), QBYTE(CHRFLAGS), BYTE(GOTOLABEL)
{
AiIFChrchrflagsHasRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 1);
printf("%d,0x%x,", AiList[Offset + 1], flags);
hasLabel = TRUE;
break;
}
case AI_SetObjectFlags: // BYTE(OBJECT_TAG), QBYTE(BITFIELD)
{
AiSetObjectFlagsRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 1);
printf("%d,0x%x", AiList[Offset + 1], flags);
break;
}
case AI_UnsetObjectFlags: // BYTE(OBJECT_TAG), QBYTE(BITFIELD)
{
AiUnsetObjectFlagsRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 1);
printf("%d,0x%x", AiList[Offset + 1], flags);
break;
}
case AI_IFObjectFlagsHas: // BYTE(OBJECT_TAG), QBYTE(BITS), BYTE(GOTOLABEL)
{
AiIFObjectFlagsHasRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 1);
printf("%d,0x%x,", AiList[Offset + 1], flags);
hasLabel = TRUE;
break;
}
case AI_SetObjectFlags2: // BYTE(OBJECT_TAG), QBYTE(BITS)
{
AiSetObjectFlags2Record *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 1);
printf("%d,0x%x", AiList[Offset + 1], flags);
break;
}
case AI_UnsetObjectFlags2: // BYTE(OBJECT_TAG), QBYTE(BITS)
{
AiUnsetObjectFlags2Record *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 1);
printf("%d,0x%x", AiList[Offset + 1], flags);
break;
}
case AI_IFObjectFlags2Has: // BYTE(OBJECT_TAG), QBYTE(BITFIELD), BYTE(GOTOLABEL)
{
AiIFObjectFlags2HasRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 1);
printf("%d,0x%x,", AiList[Offset + 1], flags);
hasLabel = TRUE;
break;
}
case AI_SetMyChrPreset: // BYTE(CHR_PRESET)
{
AiSetMyChrPresetRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_SetChrChrPreset: // BYTE(CHR_NUM), BYTE(CHR_PRESET)
{
AiSetChrChrPresetRecord *ai = &AiList+Offset;
printf("%d,%d", AiList[Offset + 1], AiList[Offset + 2]);
break;
}
case AI_SetMyPadPreset: // DBYTE(PAD_PRESET)
{
AiSetMyPadPresetRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 0);
if (isNotBoundPad(pad))
{
printf("%d", pad);
}
else
{
printf("setBoundPadNum(%d)", getBoundPadNum(pad));
}
break;
}
case AI_SetChrPadPreset: // BYTE(CHR_NUM), DBYTE(PAD_PRESET)
{
AiSetChrPadPresetRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 1);
printf("%s(%d,", AI_CMD_ToString[AiList[Offset]], AiList[Offset + 1]);
if (isNotBoundPad(pad))
{
printf("%d", pad);
}
else
{
printf("setBoundPadNum(%d)", getBoundPadNum(pad));
}
break;
}
case AI_PRINT:
{
AiPRINTRecord *ai = &AiList+Offset;
int j = 1;
printf("\"");
for (; AiList[Offset + j] != 0; j++)
{
if (AiList[Offset + j] == '\n')
{
printf("\\n");
}
else
{
printf("%c", AiList[Offset + j]);
}
}
if (!hasName)
{
hasName = malloc(j);
hasName = &AiList[Offset + 1];
}
printf("\"");
break;
}
case AI_IFMyTimerLessThanTicks: // TBYTE(TICKS), BYTE(GOTOLABEL)
{
AiIFMyTimerLessThanTicksRecord *ai = &AiList+Offset;
float valf = ((unsigned)CharArrayTo24(AiList, Offset + 1 + 0));
printf("%f,", valf);
hasLabel = TRUE;
break;
}
case AI_IFMyTimerGreaterThanTicks: // TBYTE(TICKS), BYTE(GOTOLABEL)
{
AiIFMyTimerGreaterThanTicksRecord *ai = &AiList+Offset;
float valf = ((unsigned)CharArrayTo24(AiList, Offset + 1 + 0));
printf("%f,", valf);
hasLabel = TRUE;
break;
}
case AI_HudCountdownSet: // DBYTE(SECONDS)
{
AiHudCountdownSetRecord *ai = &AiList+Offset;
float seconds = CharArrayTo16(AiList, Offset + 1 + 0);
printf("%f", seconds);
break;
}
case AI_IFHudCountdownLessThan: // DBYTE(SECONDS), BYTE(GOTOLABEL)
{
AiIFHudCountdownLessThanRecord *ai = &AiList+Offset;
float value = CharArrayTo16(AiList, Offset + 1 + 0);
printf("%f,", value);
hasLabel = TRUE;
break;
}
case AI_IFHudCountdownGreaterThan: // DBYTE(SECONDS), BYTE(GOTOLABEL)
{
AiIFHudCountdownGreaterThanRecord *ai = &AiList+Offset;
float value = CharArrayTo16(AiList, Offset + 1 + 0);
printf("%f,", value);
hasLabel = TRUE;
break;
}
case AI_TRYSpawningChrAtPad: // BYTE(BODY_NUM), BYTE(HEAD_NUM), DBYTE(PAD), DBYTE(AI_LIST_ID), QBYTE(BITFIELD), BYTE(GOTOLABEL)
{
AiTRYSpawningChrAtPadRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 2);
int flags = CharArrayTo32(AiList, Offset + 1 + 6);
unsigned short ailistid = CharArrayTo16(AiList, Offset + 1 + 4);
printf("%d,", AiList[Offset + 1]);
if (isNotBoundPad(pad))
{
printf("%d,", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
printf("%d,0x%x,%d,", ailistid, flags, AiList[Offset + 10]);
hasLabel = TRUE;
break;
}
case AI_TRYSpawningChrNextToChr: // BYTE(BODY_NUM), BYTE(HEAD_NUM), BYTE(CHR_NUM_TARGET), DBYTE(AI_LIST_ID), QBYTE(BITFIELD), BYTE(GOTOLABEL)
{
AiTRYSpawningChrNextToChrRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 5);
unsigned short ailistid = CharArrayTo16(AiList, Offset + 1 + 3);
printf("%d,%d,%d,%d,0x%x,", AiList[Offset + 1], AiList[Offset + 1 + 1], AiList[Offset + 1 + 2], ailistid, flags);
hasLabel = TRUE;
break;
}
case AI_TRYGiveMeItem: // DBYTE(PROP_NUM), BYTE(ITEM_NUM), QBYTE(PROPFLAG), BYTE(GOTOLABEL)
{
AiTRYGiveMeItemRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 3);
int model = CharArrayTo16(AiList, Offset + 1 + 0);
printf("%d,%d,0x%x,", model, AiList[Offset + 1 + 2], flags);
hasLabel = TRUE;
break;
}
case AI_TRYGiveMeHat: // DBYTE(PROP_NUM), QBYTE(PROP_BITFIELD), BYTE(GOTOLABEL)
{
AiTRYGiveMeHatRecord *ai = &AiList+Offset;
int flags = CharArrayTo32(AiList, Offset + 1 + 2);
int modelnum = CharArrayTo16(AiList, Offset + 1 + 0);
printf("%d,0x%x,", modelnum, flags);
hasLabel = TRUE;
break;
}
case AI_TRYCloningChr: // BYTE(CHR_NUM), DBYTE(AI_LIST_ID), BYTE(GOTOLABEL)
{
AiTRYCloningChrRecord *ai = &AiList+Offset;
unsigned short ailistid = CharArrayTo16(AiList, Offset + 1 + 1);
printf("%d,%d,", AiList[Offset + 4], ailistid);
hasLabel = TRUE;
break;
}
case AI_TextPrintBottom: // DBYTE(TEXT_SLOT)
{
AiTextPrintBottomRecord *ai = &AiList+Offset;
// printf("//USING HUD MESSAGE Stringy = %d, ai->txt = %d\n", 0, CharArrayTo16(AiList, Offset + 1 + 0));
printf("TEXT(%s,%d)", TEXTBANK_LEVEL_INDEX_ToString[(CharArrayTo16(AiList, Offset + 1 + 0)) / 1024], (CharArrayTo16(AiList, Offset + 1 + 0)) % 1024);
break;
}
case AI_TextPrintTop: // DBYTE(TEXT_SLOT)
{
AiTextPrintTopRecord *ai = &AiList+Offset;
// printf("//USING HUD MESSAGE Stringy = %d, ai->txt = %d\n", 0, CharArrayTo16(AiList, Offset + 1 + 0));
printf("TEXT(%s,%d)", TEXTBANK_LEVEL_INDEX_ToString[(CharArrayTo16(AiList, Offset + 1 + 0)) / 1024], (CharArrayTo16(AiList, Offset + 1 + 0)) % 1024);
break;
}
case AI_SfxPlay: // DBYTE(SOUND_NUM), BYTE(CHANNEL_NUM)
{
AiSfxPlayRecord *ai = &AiList+Offset;
short audio_id = CharArrayTo16(AiList, Offset + 1 + 0);
printf("%d,%d", audio_id, AiList[Offset + 3]);
break;
}
case AI_SfxStopChannel: // BYTE(CHANNEL_NUM)
{
AiSfxStopChannelRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 3]);
break;
}
case AI_SfxSetChannelVolume: // BYTE(CHANNEL_NUM), DBYTE(TARGET_VOLUME), DBYTE(TRANSITION_TIME60)
{
AiSfxSetChannelVolumeRecord *ai = &AiList+Offset;
short vol = CharArrayTo16(AiList, Offset + 2 + 0);
unsigned short sfxID = CharArrayTo16(AiList, Offset + 2 + 2);
printf("%d, %d,%d", AiList[Offset + 1], vol, sfxID);
break;
}
case AI_SfxFadeChannelVolume: // BYTE(CHANNEL_NUM), DBYTE(TARGET_VOLUME), DBYTE(TRANSITION_TIME60)
{
AiSfxFadeChannelVolumeRecord *ai = &AiList+Offset;
short vol = CharArrayTo16(AiList, Offset + 2 + 0);
unsigned short sfxID = CharArrayTo16(AiList, Offset + 2 + 2);
printf("%d, %d,%d", AiList[Offset + 1], vol, sfxID);
break;
}
case AI_SfxEmitFromObject: // BYTE(CHANNEL_NUM), BYTE(OBJECT_TAG), DBYTE(VOL_DECAY_TIME60)
{
AiSfxEmitFromObjectRecord *ai = &AiList+Offset;
unsigned short sfxID = CharArrayTo16(AiList, Offset + 2 + 1);
printf("%d, %d,%d", AiList[Offset + 1], AiList[Offset + 2], sfxID);
break;
}
case AI_SfxEmitFromPad: // BYTE(CHANNEL_NUM), DBYTE(PAD), DBYTE(VOL_DECAY_TIME60)
{
AiSfxEmitFromPadRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 2 + 0);
unsigned short sfxID = CharArrayTo16(AiList, Offset + 2 + 2);
printf("%d,", AiList[Offset + 1]);
if (isNotBoundPad(pad))
{
printf("%d,", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
printf("%d", sfxID);
break;
}
case AI_IFSfxChannelVolumeLessThan: // BYTE(CHANNEL_NUM), DBYTE(VOLUME), BYTE(GOTOLABEL)
{
AiIFSfxChannelVolumeLessThanRecord *ai = &AiList+Offset;
short vol = CharArrayTo16(AiList, Offset + 2 + 0);
printf("%d, %d,", AiList[Offset + 1], vol);
hasLabel = TRUE;
break;
}
case AI_VehicleStartPath: // BYTE(PATH_NUM)
{
AiVehicleStartPathRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1 + 0]);
break;
}
case AI_VehicleSpeed: // DBYTE(TOP_SPEED), DBYTE(ACCELERATION_TIME60)
{
AiVehicleSpeedRecord *ai = &AiList+Offset;
float speedtime = CharArrayTo16(AiList, Offset + 1 + 2);
float speedaim = CharArrayTo16(AiList, Offset + 1 + 0) * 100.0f / 15360.0f;
printf("%d,%f", CharArrayTo16(AiList, Offset + 1 + 0), speedtime);
break;
}
case AI_AircraftRotorSpeed: // DBYTE(ROTOR_SPEED), DBYTE(ACCELERATION_TIME60)
{
AiAircraftRotorSpeedRecord *ai = &AiList+Offset;
float speedtime = CharArrayTo16(AiList, Offset + 1 + 2);
float speedaim = CharArrayTo16(AiList, Offset + 1 + 0) * M_TAU_F / 3600.0f;
printf("%d,%f", CharArrayTo16(AiList, Offset + 1 + 0), speedtime);
break;
}
case AI_TvChangeScreenBank: // BYTE(OBJECT_TAG), BYTE(SCREEN_INDEX), BYTE(SCREEN_BANK)
{
AiTvChangeScreenBankRecord *ai = &AiList+Offset;
printf("%d,%d,%d", AiList[Offset + 1], AiList[Offset + 2], AiList[Offset + 3]);
break;
}
case AI_CameraLookAtBondFromPad: // DBYTE(PAD)
{
AiCameraLookAtBondFromPadRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 0);
if (isNotBoundPad(pad))
{
printf("%d", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
break;
}
case AI_CameraSwitch: // BYTE(OBJECT_TAG), DBYTE(LOOK_AT_BOND_FLAG), DBYTE(UNUSED_FLAG)
{
AiCameraSwitchRecord *ai = &AiList+Offset;
printf("%d,%d,%d", AiList[Offset + 1 + 0], CharArrayTo16(AiList, Offset + 1 + 1), CharArrayTo16(AiList, Offset + 1 + 3));
break;
}
case AI_IFBondYPosLessThan: // DBYTE(Y_POS), BYTE(GOTOLABEL)
{
AiIFBondYPosLessThanRecord *ai = &AiList+Offset;
float bondpos = (short)CharArrayTo16(AiList, Offset + 1 + 0);
printf("%f,", bondpos );
hasLabel = TRUE;
break;
}
case AI_BondDisableControl: // BYTE(BITFIELD)
{
AiBondDisableControlRecord *ai = &AiList+Offset;
printf("%d", AiList[Offset + 1]);
break;
}
case AI_TRYTeleportingChrToPad: // BYTE(CHR_NUM), DBYTE(PAD), BYTE(GOTOLABEL)
{
AiTRYTeleportingChrToPadRecord *ai = &AiList+Offset;
int pad = CharArrayTo16(AiList, Offset + 1 + 1);
printf("%d,", AiList[Offset + 1]);
if (isNotBoundPad(pad))
{
printf("%d,", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
hasLabel = TRUE;
break;
}
case AI_DoorOpenInstant: // BYTE(OBJECT_TAG)
{
AiDoorOpenInstantRecord *ai = &AiList+Offset;
printf("tag%d", AiList[Offset + 1]);
break;
}
case AI_ChrRemoveItemInHand: // BYTE(CHR_NUM), BYTE(HAND_INDEX)
{
AiChrRemoveItemInHandRecord *ai = &AiList+Offset;
printf("chr%d,%s", AiList[Offset + 1], AiList[Offset + 2] == 0 ? "GUNRIGHT" : "GUNLEFT");
break;
}
case AI_IfNumberOfActivePlayersLessThan: // BYTE(NUMBER), BYTE(GOTOLABEL)
{
AiIfNumberOfActivePlayersLessThanRecord *ai = &AiList+Offset;
if (AiList[Offset + 1] == 2)
{
printf("%sIFSinglePlayer(", (char *)tabs);
}
else
{
printf("%d,", AiList[Offset + 1]);
}
hasLabel = TRUE;
break;
}
case AI_IFBondItemTotalAmmoLessThan: // BYTE(ITEM_NUM), BYTE(AMMO_TOTAL), BYTE(GOTOLABEL)
{
AiIFBondItemTotalAmmoLessThanRecord *ai = &AiList+Offset;
printf("%s,%d,", ITEM_IDS_ToString[AiList[Offset + 1]], AiList[Offset + 2]);
hasLabel = TRUE;
break;
}
case AI_BondEquipItem: // BYTE(ITEM_NUM)
{
AiBondEquipItemRecord *ai = &AiList+Offset;
printf("%s", ITEM_IDS_ToString[AiList[Offset + 1]]);
break;
}
case AI_BondEquipItemCinema: // BYTE(ITEM_NUM)
{
AiBondEquipItemCinemaRecord *ai = &AiList+Offset;
printf("%s", ITEM_IDS_ToString[ AiList[Offset + 1]]);
break;
}
case AI_BondSetLockedVelocity: // BYTE(X_SPEED60), BYTE(Z_SPEED60)
{
AiBondSetLockedVelocityRecord *ai = &AiList+Offset;
printf("%d,%d", AiList[Offset + 1], AiList[Offset + 2]);
break;
}
case AI_IFObjectInRoomWithPad: // BYTE(OBJECT_TAG), DBYTE(PAD), BYTE(GOTOLABEL)
{
AiIFObjectInRoomWithPadRecord *ai = &AiList+Offset;
unsigned short pad = CharArrayTo16(AiList, Offset + 1 + 1);
printf("tag%d,", AiList[Offset + 1]);
if (isNotBoundPad(pad))
{
printf("%d,", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
hasLabel = TRUE;
break;
}
case AI_CameraOrbitPad:
{
AiCameraOrbitPadRecord *ai = &AiList+Offset;
int pad;
int speed60;
int camDististance;
int targetHeight;
int camHeight;
int start;
camDististance = CharArrayTo16(AiList, Offset + 1 + 0);
camHeight = (short)CharArrayTo16(AiList, Offset + 1 + 2);
speed60 = (short)CharArrayTo16(AiList, Offset + 1 + 4);
pad = CharArrayTo16(AiList, Offset + 1 + 6);
targetHeight = (short)CharArrayTo16(AiList, Offset + 1 + 8);
start = CharArrayTo16(AiList, Offset + 1 + 10);
printf("%d,%d,%d,", camDististance, camHeight, speed60);
if (isNotBoundPad(pad))
{
printf("%d,", pad);
}
else
{
printf("setBoundPadNum(%d),", getBoundPadNum(pad));
}
printf("%d,%d", targetHeight, start);
break;
}
case AI_IFFolderActorIsEqual: // BYTE(BOND_ACTOR_INDEX), BYTE(GOTOLABEL)
{
AiIFFolderActorIsEqualRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_MusicPlaySlot: // BYTE(MUSIC_SLOT), BYTE(SECONDS_STOPPED_DURATION), BYTE(SECONDS_TOTAL_DURATION)
{
AiMusicPlaySlotRecord *ai = &AiList+Offset;
// printf("/*ai: enery tune on (%d, %d, %d)*/", AiList[Offset + 1 + 0], AiList[Offset + 1 + 1], AiList[Offset + 1 + 2]);
printf("%d,%d,%d", AiList[Offset + 1 + 0], AiList[Offset + 1 + 1], AiList[Offset + 1 + 2]);
break;
}
case AI_MusicStopSlot:
{
AiMusicStopSlotRecord *ai = &AiList+Offset;
// printf("/*ai: enery tune off (%d)*/", AiList[Offset + 1 + 0]);
printf("%d", AiList[Offset + 1 + 0]);
break;
}
case AI_IFKilledCiviliansGreaterThan:
{
AiIFKilledCiviliansGreaterThanRecord *ai = &AiList+Offset;
printf("%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_IFChrWasShotSinceLastCheck: // BYTE(CHR_NUM), BYTE(GOTOLABEL)
{
AiIFChrWasShotSinceLastCheckRecord *ai = &AiList+Offset;
printf("chr%d,", AiList[Offset + 1]);
hasLabel = TRUE;
break;
}
case AI_ObjectRocketLaunch: // BYTE(OBJECT_TAG)
{
AiObjectRocketLaunchRecord *ai = &AiList+Offset;
printf("tag%d", AiList[Offset + 1]);
break;
}
case AI_GotoNext: // BYTE(LABEL)
case AI_IFPlayingAnimation: // BYTE(GOTOLABEL)
case AI_IFImOnPatrolOrStopped: // BYTE(GOTOLABEL)
case AI_IFISeeBond: // BYTE(GOTOLABEL)
case AI_TRYSidestepping: // BYTE(GOTOLABEL)
case AI_TRYSideHopping: // BYTE(GOTOLABEL)
case AI_TRYSideRunning: // BYTE(GOTOLABEL)
case AI_TRYFiringWalk: // BYTE(GOTOLABEL)
case AI_TRYFiringRun: // BYTE(GOTOLABEL)
case AI_TRYFiringRoll: // BYTE(GOTOLABEL)
case AI_IFImFiringAndLockedForward: // BYTE(GOTOLABEL)
case AI_IFImFiring: // BYTE(GOTOLABEL)
case AI_TRYThrowingGrenade: // BYTE(GOTOLABEL)
case AI_TRYRunFromBond: // BYTE(GOTOLABEL)
case AI_TRYRunToBond: // BYTE(GOTOLABEL)
case AI_TRYWalkToBond: // BYTE(GOTOLABEL)
case AI_TRYSprintToBond: // BYTE(GOTOLABEL)
case AI_TRYFindCover: // BYTE(GOTOLABEL)
case AI_IFICanHearAlarm: // BYTE(GOTOLABEL)
case AI_IFAlarmIsOn: // BYTE(GOTOLABEL)
case AI_IFGasIsLeaking: // BYTE(GOTOLABEL)
case AI_IFIHeardBond: // BYTE(GOTOLABEL)
case AI_IFISeeSomeoneShot: // BYTE(GOTOLABEL)
case AI_IFISeeSomeoneDie: // BYTE(GOTOLABEL)
case AI_IFICouldSeeBond: // BYTE(GOTOLABEL)
case AI_IFICouldSeeBondsStan: // BYTE(GOTOLABEL)
case AI_IFIWasShotRecently: // BYTE(GOTOLABEL)
case AI_IFIHeardBondRecently: // BYTE(GOTOLABEL)
case AI_IFIveNotBeenSeen: // BYTE(GOTOLABEL)
case AI_IFImOnScreen: // BYTE(GOTOLABEL)
case AI_IFMyRoomIsOnScreen: // BYTE(GOTOLABEL)
case AI_IFImTargetedByBond: // BYTE(GOTOLABEL)
case AI_IFBondMissedMe: // BYTE(GOTOLABEL)
case AI_IFMyMoraleLessThanRandom: // BYTE(GOTOLABEL)
case AI_IFMyAlertnessLessThanRandom: // BYTE(GOTOLABEL)
case AI_IFMyTimerIsNotRunning: // BYTE(GOTOLABEL)
case AI_IFHudCountdownIsNotRunning: // BYTE(GOTOLABEL)
case AI_IFCameraIsInIntro: // BYTE(GOTOLABEL)
case AI_IFCameraIsInBondSwirl: // BYTE(GOTOLABEL)
case AI_IFBondInTank: // canonical name
case AI_IFScreenFadeCompleted: // BYTE(GOTOLABEL)
case AI_IFBondIsDead:
case AI_IFCreditsHasCompleted:
case AI_IFObjectiveAllCompleted:
case AI_IFBondDamageAndPickupsDisabled:
{
AiIFBondDamageAndPickupsDisabledRecord *ai = &AiList+Offset;
hasLabel = TRUE;
break;
}
case AI_Yield: // /*NONE*/
case AI_Stop: // /*NONE*/
case AI_Kneel: // /*NONE*/
case AI_PointAtBond: // /*NONE*/
case AI_LookSurprised: // /*NONE*/
case AI_Surrender: // /*NONE*/
case AI_RemoveMe: // /*NONE*/
case AI_AlarmOn:
case AI_AlarmOff:
case AI_RunToPadPreset: // /*NONE*/
case AI_MyTimerStart:
case AI_MyTimerReset:
case AI_MyTimerPause:
case AI_MyTimerResume:
case AI_HudCountdownShow:
case AI_HudCountdownHide:
case AI_HudCountdownStop:
case AI_HudCountdownStart:
case AI_EndLevel: // canonical name
case AI_CameraReturnToBond:
case AI_BondEnableControl:
case AI_ScreenFadeToBlack:
case AI_ScreenFadeFromBlack:
case AI_HideAllChrs:
case AI_ShowAllChrs:
case AI_TriggerFadeAndExitLevelOnButtonPress:
case AI_BondDisableDamageAndPickups:
case AI_BondHideWeapons:
case AI_CreditsRoll:
case AI_SwitchSky:
case AI_BondKilledInAction:
case AI_RaiseArms:
case AI_TriggerExplosionsAroundBond:
case AI_GasLeakAndFadeFog:
default:
{
break;
}
} // switch
if(!hasMacro)Offset += chraiitemsize(AiList, Offset);
if (hasLabel)
{
printf(" lbl%d ", AiList[Offset - 1]);
AddLabel(AiList[Offset - 1]);
}
if (!hasClosingBrace) printf(")\n");
}
}
void hexDump(char *desc, void *addr, int len)
{
int i;
unsigned char buff[17];
unsigned char *pc = (unsigned char *)addr;
// Output description if given.
if (desc != NULL)
printf("%s:\n", desc);
// Process every byte in the data.
for (i = 0; i < len; i++)
{
// Multiple of 16 means new line (with line offset).
if ((i % 16) == 0)
{
// Just don't print ASCII for the zeroth line.
if (i != 0)
printf(" %s\n", buff);
// Output the offset.
printf(" %04x ", i);
}
// Now the hex code for the specific character.
printf(" %02x", pc[i]);
// And store a printable ASCII character for later.
if ((pc[i] < 0x20) || (pc[i] > 0x7e))
{
buff[i % 16] = '.';
}
else
{
buff[i % 16] = pc[i];
}
buff[(i % 16) + 1] = '\0';
}
// Pad out last line if not exactly 16 characters.
while ((i % 16) != 0)
{
printf(" ");
i++;
}
// And print the final ASCII bit.
printf(" %s\n", buff);
}
int main(int argc, char *argv[])
{
#define PRINTDEBUG
char fname[1000];
FILE *pfile;
char cwd[1000];
void *g_ptrStageSetupFile, *lastAddr;
int fsize;
int i,j;
time_t current_time;
time(&current_time);
getcwd(cwd, sizeof(cwd));
if (argc > 1)
{
strcat(cwd, "/");
strcat(cwd, argv[1]);
strcpy(fname,argv[1]);
}
else
{
printf("Enter a filename:\n");
scanf("%99s", fname);
strcat(cwd, "/");
strcat(cwd, fname);
}
for (i=strlen(fname); i>0; i-- )
{
j = i+1;
if (fname[i] == '/') break;
}
for (i = 0; i < strlen(fname); i++, j++)
{
if (fname[j] == '.')
{
fname[i] = 0;
break;
}
fname[i] = fname[j];
}
pfile = fopen(cwd, "rb");
if (!pfile)
{
printf("Error! opening file: %s\n", cwd);
// exit from program if file pointer returns NULL.
return 0;
}
// Get file size
fseek(pfile, 0, SEEK_END);
fsize = ftell(pfile);
rewind(pfile);
//allocate setup file
g_ptrStageSetupFile = malloc(fsize);
rewind(pfile);
//Load setup file
if (1 != fread(g_ptrStageSetupFile, fsize, 1, pfile))
{
fclose(pfile);
free(g_ptrStageSetupFile);
printf("entire read fails\n");
return 0;
}
fclose(pfile);
{
stagesetup g_chraiCurrentSetup = *(stagesetup *)g_ptrStageSetupFile;
// convert to host endian and turn file pointer to RAM pointer
g_chraiCurrentSetup.pathwaypoints = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.pathwaypoints);
g_chraiCurrentSetup.waypointgroups = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.waypointgroups);
g_chraiCurrentSetup.intro = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.intro);
g_chraiCurrentSetup.propDefs = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.propDefs);
g_chraiCurrentSetup.patrolpaths = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.patrolpaths);
g_chraiCurrentSetup.ailists = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.ailists);
g_chraiCurrentSetup.pads = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.pads);
g_chraiCurrentSetup.boundpads = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.boundpads);
g_chraiCurrentSetup.padnames = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.padnames);
g_chraiCurrentSetup.boundpadnames = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.boundpadnames);
// iterate over all items and sub-items converting from file to ram pointer
#pragma region "foreach item in setupheader"
if (g_chraiCurrentSetup.pathwaypoints)
{
// NAV Points - use Pads as NavPoints
for (i = 0; g_chraiCurrentSetup.pathwaypoints[i].padID >= 0; i++)
{
btol(g_chraiCurrentSetup.pathwaypoints[i].padID);
g_chraiCurrentSetup.pathwaypoints[i].neighbours = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.pathwaypoints[i].neighbours);
btol(g_chraiCurrentSetup.pathwaypoints[i].groupNum);
btol(g_chraiCurrentSetup.pathwaypoints[i].dist);
#ifdef PRINTDEBUG
printf("\nwaypoint %d: pad %d, nb %X, GN %d, dst%d\n", i, g_chraiCurrentSetup.pathwaypoints[i].padID, g_chraiCurrentSetup.pathwaypoints[i].neighbours, g_chraiCurrentSetup.pathwaypoints[i].groupNum, g_chraiCurrentSetup.pathwaypoints[i].dist);
#endif
for (j = 0; g_chraiCurrentSetup.pathwaypoints[i].neighbours[j] >= 0; j++)
{
btol(g_chraiCurrentSetup.pathwaypoints[i].neighbours[j]);
#ifdef PRINTDEBUG
printf("%d, ", g_chraiCurrentSetup.pathwaypoints[i].neighbours[j]);
#endif
}
}
}
if (g_chraiCurrentSetup.waypointgroups)
{
// NAV Mesh, make a mesh from NAV Points
for (i = 0; g_chraiCurrentSetup.waypointgroups[i].neighbours; i++)
{
g_chraiCurrentSetup.waypointgroups[i].neighbours = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.waypointgroups[i].neighbours);
g_chraiCurrentSetup.waypointgroups[i].waypoints = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.waypointgroups[i].waypoints);
#ifdef PRINTDEBUG
printf("\nwaygrp %d: nb %X, wp%X, dst%d\n", i, g_chraiCurrentSetup.waypointgroups[i].neighbours, g_chraiCurrentSetup.waypointgroups[i].waypoints, g_chraiCurrentSetup.waypointgroups[i].dist);
#endif
for (j = 0; g_chraiCurrentSetup.waypointgroups[i].neighbours[j] >= 0; j++)
{
btol(g_chraiCurrentSetup.waypointgroups[i].neighbours[j]);
#ifdef PRINTDEBUG
printf("%d, ", g_chraiCurrentSetup.waypointgroups[i].neighbours[j]);
#endif
}
#ifdef PRINTDEBUG
printf("\n");
#endif
for (j = 0; g_chraiCurrentSetup.waypointgroups[i].waypoints[j] >= 0; j++)
{
btol(g_chraiCurrentSetup.waypointgroups[i].waypoints[j]);
#ifdef PRINTDEBUG
printf("%d, ", g_chraiCurrentSetup.waypointgroups[i].waypoints[j]);
#endif
}
}
}
if (g_chraiCurrentSetup.intro)
{
//g_chraiCurrentSetup.intro = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.intro);
#ifdef PRINTDEBUG
printf("\nintro %X: \n", g_chraiCurrentSetup.intro);
#endif
}
if (g_chraiCurrentSetup.propDefs)
{
// g_chraiCurrentSetup.propDefs = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.propDefs);
#ifdef PRINTDEBUG
printf("\npropDefs %X: \n", g_chraiCurrentSetup.propDefs);
#endif
}
if (g_chraiCurrentSetup.patrolpaths)
{
for (i = 0; g_chraiCurrentSetup.patrolpaths[i].waypoints; i++)
{
g_chraiCurrentSetup.patrolpaths[i].waypoints = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.patrolpaths[i].waypoints);
#ifdef PRINTDEBUG
printf("path %d: wp %X, ID%d, isLoop %d, len %d\n", i, g_chraiCurrentSetup.patrolpaths[i].waypoints, g_chraiCurrentSetup.patrolpaths[i].ID, g_chraiCurrentSetup.patrolpaths[i].isLoop, g_chraiCurrentSetup.patrolpaths[i].len);
#endif
for (j = 0; g_chraiCurrentSetup.patrolpaths[i].waypoints[j] > -1; j++)
{
g_chraiCurrentSetup.patrolpaths[i].waypoints[j] = ntohl(g_chraiCurrentSetup.patrolpaths[i].waypoints[j]);
#ifdef PRINTDEBUG
printf("wp %d: %d\n", j, g_chraiCurrentSetup.patrolpaths[i].waypoints[j]);
#endif
}
g_chraiCurrentSetup.patrolpaths[i].len = j;
}
}
if (g_chraiCurrentSetup.ailists)
{
for (i = 0; g_chraiCurrentSetup.ailists[i].ailist; i++)
{
g_chraiCurrentSetup.ailists[i].ailist = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.ailists[i].ailist);
btol(g_chraiCurrentSetup.ailists[i].ID);
#ifdef PRINTDEBUG
printf("\nAI %d: Lst %X, ID%d\n", i, g_chraiCurrentSetup.ailists[i].ailist, g_chraiCurrentSetup.ailists[i].ID);
#endif
}
}
if (g_chraiCurrentSetup.pads)
{
for (i = 0; g_chraiCurrentSetup.pads[i].plink; i++)
{
for (j = 0; j < 3; j++)
{
btol(g_chraiCurrentSetup.pads[i].pos.AsArray[j]);
btol(g_chraiCurrentSetup.pads[i].up.AsArray[j]);
btol(g_chraiCurrentSetup.pads[i].look.AsArray[j]);
}
g_chraiCurrentSetup.pads[i].plink = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.pads[i].plink);
if (g_chraiCurrentSetup.pads[i].plink == 0)
{
printf("pad number %d has no stan! (%s)\n", i, g_chraiCurrentSetup.pads[i].plink);
}
}
}
if (g_chraiCurrentSetup.boundpads)
{
for (i = 0; g_chraiCurrentSetup.boundpads[i].plink; i++)
{
for (j = 0; j < 6; j++)
{
if (j < 3)
{
btol(g_chraiCurrentSetup.boundpads[i].pos.AsArray[j]);
btol(g_chraiCurrentSetup.boundpads[i].up.AsArray[j]);
btol(g_chraiCurrentSetup.boundpads[i].look.AsArray[j]);
}
btol(g_chraiCurrentSetup.boundpads[i].bbox.AsArray[j]);
}
g_chraiCurrentSetup.boundpads[i].plink = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.boundpads[i].plink);
if (g_chraiCurrentSetup.boundpads[i].plink == 0)
{
printf("vol number %d has no stan! (%s)\n", i, g_chraiCurrentSetup.boundpads[i].plink);
}
}
}
if (g_chraiCurrentSetup.padnames)
{
for (i = 0; g_chraiCurrentSetup.padnames[i]; i++)
{
g_chraiCurrentSetup.padnames[i] = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.padnames[i]);
#ifdef PRINTDEBUG
printf("\nNAVPoint %d: %s\n", i, g_chraiCurrentSetup.padnames[i]);
#endif
}
}
if (g_chraiCurrentSetup.boundpadnames)
{
for (i = 0; g_chraiCurrentSetup.boundpadnames[i]; i++)
{
g_chraiCurrentSetup.boundpadnames[i] = g_ptrStageSetupFile + ntohl(g_chraiCurrentSetup.boundpadnames[i]);
#ifdef PRINTDEBUG
printf("\nNAVMesh %d: %s\n", i, g_chraiCurrentSetup.boundpadnames[i]);
#endif
}
}
#pragma endregion // foreach item in setupheader
printf("/*\n* This file was automatically generated from %s\n*\n* $Date: %s*/\n\n#include <bondtypes.h>\n#include <bondaicommands.h>\n\n// forward declarations\nwaypoint pathwaypoints[];\nwaygroup pathsets[];\ns32 intro[];\ns32 propDefs[];\nPathRecord patrolpaths[];\nAIListRecord ailists[];\nPadRecord pads[];\nBoundPadRecord vols[];\nchar *NAVPADs[];\nchar *NAVnames[];\n\nstagesetup %s = {\n &pathwaypoints,\n &pathsets,\n &intro,\n &propDefs,\n &patrolpaths,\n &ailists,\n &pads,\n &vols,\n &NAVPADs,\n &NAVnames\n};\n\n", fname, ctime(&current_time), fname);
//retain file-order
for (lastAddr = g_ptrStageSetupFile; lastAddr < g_ptrStageSetupFile + fsize; lastAddr += 4)
{
if (g_chraiCurrentSetup.pathwaypoints && lastAddr == &g_chraiCurrentSetup.pathwaypoints[0])
{
printf("char propDefs[] = {\n");
printf(" };\n //nothing to see here yet");
}
if (g_chraiCurrentSetup.waypointgroups && lastAddr == &g_chraiCurrentSetup.waypointgroups[0])
{
printf("char propDefs[] = {\n");
printf(" };\n //nothing to see here yet");
}
if (g_chraiCurrentSetup.intro && lastAddr == &g_chraiCurrentSetup.intro[0])
{
printf("char intro[] = {\n");
printf(" };\n //nothing to see here yet");
}
if (g_chraiCurrentSetup.propDefs && lastAddr == &g_chraiCurrentSetup.propDefs[0])
{
printf("char propDefs[] = {\n");
printf(" };\n //nothing to see here yet");
}
if (g_chraiCurrentSetup.patrolpaths && lastAddr == &g_chraiCurrentSetup.patrolpaths[0])
{
printf("char propDefs[] = {\n");
printf(" };\n //nothing to see here yet");
}
if (g_chraiCurrentSetup.ailists)
{
for (i = 0; g_chraiCurrentSetup.ailists[i].ailist; i++)
{
if (lastAddr == g_chraiCurrentSetup.ailists[i].ailist)
{
if (isChrAIListID(g_chraiCurrentSetup.ailists[i].ID))
{
printf("u8 chrAI_%hd[] = {\n #define THIS chrai_%hd\n\n", getChrAIListID(g_chraiCurrentSetup.ailists[i].ID), getChrAIListID(g_chraiCurrentSetup.ailists[i].ID));
}
else
{
printf("u8 bgAi_%hd[] = {\n #define THIS bgai_%hd\n\n", getBGAIListID(g_chraiCurrentSetup.ailists[i].ID), getBGAIListID(g_chraiCurrentSetup.ailists[i].ID));
}
hasName = 0;
ai(g_chraiCurrentSetup.ailists[i].ailist, g_chraiCurrentSetup.ailists[i].ID);
// un-closed loops
if (top != -1) printf("\nUnused Labels Found!"), displayStack();
top = -1;
printf(" #undef THIS \n};%s%s\n\n", hasName ? " //Possible Name " : "", hasName ? hasName : "");
}
}
}
if (g_chraiCurrentSetup.ailists && lastAddr == &g_chraiCurrentSetup.ailists[0])
{
printf("AIListRecord ailists[] = {\n");
for (i = 0; g_chraiCurrentSetup.ailists[i].ailist; i++)
{
if (isChrAIListID(g_chraiCurrentSetup.ailists[i].ID))
{
printf(" { &chrAI_%hd, chrai_%hd }, \n", getChrAIListID(g_chraiCurrentSetup.ailists[i].ID), getChrAIListID(g_chraiCurrentSetup.ailists[i].ID));
}
else if (isBGAIListID(g_chraiCurrentSetup.ailists[i].ID))
{
printf(" { &bgAi_%hd, bgai_%hd },\n", getBGAIListID(g_chraiCurrentSetup.ailists[i].ID), getBGAIListID(g_chraiCurrentSetup.ailists[i].ID));
}
else
{
printf(" /*Invalid ID*/{ &Ai_%hd, %hd }, //index %d\n", g_chraiCurrentSetup.ailists[i].ID, g_chraiCurrentSetup.ailists[i].ID, i);
}
}
printf(" { NULL, 0 }\n};\n");
}
if (g_chraiCurrentSetup.pads && lastAddr == &g_chraiCurrentSetup.pads[0])
{
printf("PadRecord pads[] = {\n //%30s%30s%40s%40s\tstan\n", "pos", "up", "look", "plink");
for (i = 0; g_chraiCurrentSetup.pads[i].plink; i++)
{
printf(" {{%# 10gf, %# 10gf, %# 10gf},\t{%# 10gf, %# 10gf, %# 10gf},\t{%# 10gf, %# 10gf, %# 10gf}, \t\"%#s\", NULL }, \n", g_chraiCurrentSetup.pads[i].pos.x, g_chraiCurrentSetup.pads[i].pos.y, g_chraiCurrentSetup.pads[i].pos.z, g_chraiCurrentSetup.pads[i].up.x, g_chraiCurrentSetup.pads[i].up.y, g_chraiCurrentSetup.pads[i].up.z, g_chraiCurrentSetup.pads[i].look.x, g_chraiCurrentSetup.pads[i].look.y, g_chraiCurrentSetup.pads[i].look.z, g_chraiCurrentSetup.pads[i].plink);
}
printf(" { 0 }\n};\n");
}
if (g_chraiCurrentSetup.boundpads && lastAddr == &g_chraiCurrentSetup.boundpads[0])
{
printf("BoundPadRecord boundpads[] = {\n //%30s%30s%40s%40s\tstan\tbbox\n", "pos", "up", "look", "plink");
for (i = 0; g_chraiCurrentSetup.boundpads[i].plink; i++)
{
printf(" {{%# 10gf, %# 10gf, %# 10gf},\t{%# 10gf, %# 10gf, %# 10gf},\t{%# 10gf, %# 10gf, %# 10gf}, \t\"%#s\", NULL, {%# 10gf, %# 10gf, %# 10gf, %# 10gf, %# 10gf, %# 10gf} }, \n", g_chraiCurrentSetup.boundpads[i].pos.x, g_chraiCurrentSetup.boundpads[i].pos.y, g_chraiCurrentSetup.boundpads[i].pos.z, g_chraiCurrentSetup.boundpads[i].up.x, g_chraiCurrentSetup.boundpads[i].up.y, g_chraiCurrentSetup.boundpads[i].up.z, g_chraiCurrentSetup.boundpads[i].look.x, g_chraiCurrentSetup.boundpads[i].look.y, g_chraiCurrentSetup.boundpads[i].look.z, g_chraiCurrentSetup.boundpads[i].plink, g_chraiCurrentSetup.boundpads[i].bbox.AsArray[0], g_chraiCurrentSetup.boundpads[i].bbox.AsArray[1], g_chraiCurrentSetup.boundpads[i].bbox.AsArray[2], g_chraiCurrentSetup.boundpads[i].bbox.AsArray[3], g_chraiCurrentSetup.boundpads[i].bbox.AsArray[4], g_chraiCurrentSetup.boundpads[i].bbox.AsArray[5]);
}
printf(" { 0 }\n};\n");
}
if (g_chraiCurrentSetup.padnames && lastAddr == &g_chraiCurrentSetup.padnames[0])
{
printf("char propDefs[] = {\n");
printf(" };\n //nothing to see here yet");
}
if (g_chraiCurrentSetup.boundpadnames && lastAddr == &g_chraiCurrentSetup.boundpadnames[0])
{
printf("char propDefs[] = {\n");
printf(" };\n //nothing to see here yet");
}
}
printf("#pragma region Enums \n //Move the following Enums to the top of file\n");
if (g_chraiCurrentSetup.ailists)
{
printf(" enum chrAilist\n {\n");
for (i = 0; g_chraiCurrentSetup.ailists[i].ailist; i++)
{
if (g_chraiCurrentSetup.ailists[i].ID)
{
if (isChrAIListID(g_chraiCurrentSetup.ailists[i].ID))
{
if (getChrAIListID(g_chraiCurrentSetup.ailists[i].ID))
{
printf(" chrai_%hd,\n", getChrAIListID(g_chraiCurrentSetup.ailists[i].ID));
}
else
{
printf(" chrai_%hd = setChrAIListID(%hd),\n", getChrAIListID(g_chraiCurrentSetup.ailists[i].ID), getChrAIListID(g_chraiCurrentSetup.ailists[i].ID));
}
}
}
}
printf(" };\n");
}
if (g_chraiCurrentSetup.ailists)
{
printf(" enum bgAilist\n {\n");
for (i = 0; g_chraiCurrentSetup.ailists[i].ailist; i++)
{
if (g_chraiCurrentSetup.ailists[i].ID)
{
if (isBGAIListID(g_chraiCurrentSetup.ailists[i].ID))
{
if (getBGAIListID(g_chraiCurrentSetup.ailists[i].ID))
{
printf(" bgai_%hd,\n", getBGAIListID(g_chraiCurrentSetup.ailists[i].ID));
}
else
{
printf(" bgai_%hd = setBGAIListID(%hd),\n", getBGAIListID(g_chraiCurrentSetup.ailists[i].ID), getBGAIListID(g_chraiCurrentSetup.ailists[i].ID));
}
}
}
}
printf(" };\n");
}
SortEnums(labels);
SortEnums(keys);
SortEnums(tags);
SortEnums(chrs);
SortEnums(pads);
printenum(labels, "lbl");
printenum(tags, "tag");
printenum(keys, "key");
printenum(chrs, "chr");
printenum(pads, "pad");
i = 0;
if (SubIDs[i].id)
{
printf(" #define SETUPSUBROUTINES(ID) ");
while (SubIDs[i].id != 0)
{
if (isBGAIListID(SubIDs[i].id))
{
printf(" (ID == bgai_%hd)", getBGAIListID(SubIDs[i].id));
}
else
{
printf(" (ID == chrai_%hd)", getChrAIListID(SubIDs[i].id));
}
i++;
if (SubIDs[i].id) printf(" | \\\n");
}
printf("\n");
}
printf("#pragma endregion\n");
}
free(g_ptrStageSetupFile);
return 0;
}