/* * Copyright (C) 2002-2007 The Warp Rogue Team * Part of the Warp Rogue Project * * This software is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License. * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY. * * See the license.txt file for more details. */ /* * * Global types * */ #if INT_MAX < 2147483647 # error int is too narrow (must be at least 32bit wide) #endif typedef struct terrain_struct TERRAIN; typedef struct object_struct OBJECT; typedef struct character_struct CHARACTER; /*********************************************************************/ /* */ /* Util. types */ /* */ /*********************************************************************/ /* * directions */ typedef enum { DIRECTION_NIL = -1, DIRECTION_UP, DIRECTION_DOWN, DIRECTION_LEFT, DIRECTION_RIGHT, DIRECTION_UP_LEFT, DIRECTION_UP_RIGHT, DIRECTION_DOWN_LEFT, DIRECTION_DOWN_RIGHT, DIRECTION_ELEVATOR, DIRECTION_WAY_UP, DIRECTION_WAY_DOWN, DIRECTION_OUT_OF_BOUNDS } DIRECTION; /*********************************************************************/ /* */ /* IO types */ /* */ /*********************************************************************/ typedef int FILE_INDEX; #define FILE_INDEX_NIL -1 typedef int FILE_COUNTER; /* * program directories */ typedef enum { DIR_NIL = -1, DIR_DATA, /* engine directories */ DIR_CONFIG, DIR_DESCRIPTIONS, DIR_GRAPHICS, DIR_HELP, DIR_PSYCHIC_BOLTS, /* scenario directories */ DIR_CAREERS, DIR_INFO, DIR_NPCS, DIR_OBJECTS, DIR_RACE, DIR_TERRAIN, DIR_USER_DATA, DIR_WORLD, DIR_OUT_OF_BOUNDS } PROGRAM_DIRECTORY; /*********************************************************************/ /* */ /* UI types */ /* */ /*********************************************************************/ typedef int SCREEN_COORD; #define MENU_AUTO -1 typedef int KEY_CODE; typedef int MACRO_INDEX; typedef int COLOUR_VALUE; typedef int COLOUR_FREQUENCY; #define COLOUR_FREQUENCY_MIN 1 #define COLOUR_FREQUENCY_MAX 100 /* * colours */ typedef enum { C_NIL = -1, C_BLACK, C_DARK_ASH, C_ASH, C_DARK_METAL, C_METAL, C_GRAY, C_SLATE, C_SILVER, C_BLOOD, C_BURGUNDY, C_RED, C_PURPLE, C_WARLOCK_PURPLE, C_ARMY, C_JADE, C_POISON_GREEN, C_LIME, C_OLIVE, C_STEEL_BLUE, C_TEAL, C_DARK_RADIOACTIVE, C_RADIOACTIVE, C_DARK_GOLD, C_GOLD, C_YELLOW, C_DARK_RUSTY, C_RUSTY, C_VERMIN_BROWN, C_SIENNA, C_TAN, C_SNAKEBITE_LEATHER, C_FIERY_ORANGE, C_KHAKI, C_OUT_OF_BOUNDS } COLOUR; /* * symbols */ #define SPECIAL_SYMBOL_OFFSET 200 typedef enum { SYM_NIL = -1, /* ASCII symbols .. */ /* special symbols */ SYM_FLOOR = SPECIAL_SYMBOL_OFFSET, SYM_WALL, SYM_OUT_OF_BOUNDS } SYMBOL; /* * screen area rectangle */ typedef struct { SCREEN_COORD top; SCREEN_COORD bottom; SCREEN_COORD left; SCREEN_COORD right; } SCREEN_AREA; /* * RGB data */ typedef struct { COLOUR_VALUE red; COLOUR_VALUE green; COLOUR_VALUE blue; } RGB_DATA; /* * dynamic colour */ typedef struct { COLOUR primary; COLOUR secondary; COLOUR_FREQUENCY frequency; } DYNAMIC_COLOUR; /* * commands */ typedef enum { CM_NIL = -1, CM_UP, CM_DOWN, CM_LEFT, CM_RIGHT, CM_UP_LEFT, CM_UP_RIGHT, CM_DOWN_LEFT, CM_DOWN_RIGHT, CM_OK, CM_EXIT, CM_DROP, CM_INFO, CM_USE, CM_REROLL, CM_ADVANCEMENT, CM_PSY_POWERS, CM_NEAREST_ENEMY, CM_ADV_TARGET_MODE, CM_ATTACK, CM_TRIGGER, CM_INVENTORY_SCREEN, CM_CONCENTRATE, CM_EVOKE_PSY_POWER, CM_TACTICAL_COMMAND, CM_CHARACTER_SCREEN, CM_LOOK, CM_RELOAD_WEAPON, CM_UNJAM_WEAPON, CM_SWITCH_WEAPONS, CM_RUN, CM_USE_PERK, CM_JOURNAL, CM_GAME_CONTROLS, CM_HELP, CM_WAIT, CM_MACRO_1, CM_MACRO_2, CM_MACRO_3, CM_MACRO_4, CM_MACRO_5, CM_MACRO_6, CM_MACRO_7, CM_MACRO_8, CM_MACRO_9, CM_MACRO_10, CM_MACRO_11, CM_MACRO_12, CM_LIST, CM_CURRENT_TILE, CM_EQUIPMENT, CM_S, CM_SA, CM_A, CM_DEBUG, CM_RENAME, CM_CAREER, CM_CHARACTER_1, CM_CHARACTER_2, CM_CHARACTER_3, CM_PAGE_UP, CM_PAGE_DOWN, CM_ADDITIONAL_INFORMATION, CM_BUY, CM_MANUFACTURE, CM_OUT_OF_BOUNDS } COMMAND; /* * menu */ typedef struct { LIST * items; int first_visible; int last_visible; int highlighted; int last; COMMAND entered_command; } MENU; /* * get text dialogue */ typedef struct { char prompt[STRING_BUFFER_SIZE]; COLOUR prompt_colour; char entered_text[STRING_BUFFER_SIZE]; int max_length; } GET_TEXT_DIALOGUE; /* * confirmation dialogue */ typedef struct { char prompt[STRING_BUFFER_SIZE]; bool confirmed; } CONFIRMATION_DIALOGUE; /* * dialogue state */ typedef struct { char text[DIALOGUE_TEXT_SIZE]; CHARACTER *active_character; CHARACTER *passive_character; LIST *options; MENU *menu; } DIALOGUE_STATE; /* * message object types */ typedef enum { MOT_NIL = -1, MOT_CHARACTER, MOT_OBJECT, MOT_STRING, MOT_OUT_OF_BOUNDS } MESSAGE_OBJECT_TYPE; /* * screen IDs */ typedef enum { SID_NIL = -1, SID_GAME, SID_SECONDARY, SID_DIALOGUE, SID_CHARACTER, SID_TITLE, SID_INVENTORY, SID_INCREASE_STAT, SID_NEW_PERK, SID_LEARN_PSY_POWER, SID_CHANGE_CAREER_FOLLOW_PATH, SID_CHANGE_CAREER_NEW_PATH, SID_CURRENT_POSITION, SID_OUT_OF_BOUNDS } SCREEN_ID; /* * numerus values */ typedef enum { NUMERUS_NIL = -1, NUMERUS_SINGULAR, NUMERUS_PLURAL, NUMERUS_OUT_OF_BOUNDS } NUMERUS; /*********************************************************************/ /* */ /* World types */ /* */ /*********************************************************************/ typedef int WORLD_COORD; #define WORLD_COORD_NIL -1 /* * world point coordinates */ typedef struct { WORLD_COORD z; WORLD_COORD y; WORLD_COORD x; } WORLD_POINT; /*********************************************************************/ /* */ /* Area types */ /* */ /*********************************************************************/ typedef int AREA_COORD; #define AREA_COORD_NIL -1 #define AREA_POINT_NOT_DEFINED(p) ((p)->y == AREA_COORD_NIL) typedef int AREA_DISTANCE; #define AREA_DISTANCE_MAX INT_MAX #define AREA_DISTANCE_NIL -1 /* * area point coordinates */ typedef struct { AREA_COORD y; AREA_COORD x; } AREA_POINT; /* * area section rectangle */ typedef struct { AREA_COORD top; AREA_COORD bottom; AREA_COORD left; AREA_COORD right; } AREA_SECTION; /* * area sector */ typedef struct { TERRAIN * terrain; OBJECT * object; CHARACTER * character; } SECTOR; /* * area */ typedef struct { char name[AREA_NAME_SIZE]; WORLD_POINT location; SECTOR sector[AREA_HEIGHT][AREA_WIDTH]; LIST * characters; LIST * objects; LIST * terrain; LIST * events; } AREA; /* * sector classes */ typedef enum { SC_NIL = -1, SC_FREE, SC_FREE_OBJECT_LOCATION, SC_FREE_OBJECT_LOCATION_ANTIBLOCK, SC_MOVE_TARGET, SC_MOVE_TARGET_SAFE, SC_OUT_OF_BOUNDS } SECTOR_CLASS; /*********************************************************************/ /* */ /* Pathfinder types */ /* */ /*********************************************************************/ /* * path node */ typedef struct path_node_struct PATH_NODE; struct path_node_struct { AREA_POINT p; PATH_NODE * parent; }; /*********************************************************************/ /* */ /* Dice types */ /* */ /*********************************************************************/ /* * dice roll */ typedef struct { int n_dice; int n_sides; int modifier; } DICE_ROLL; /*********************************************************************/ /* */ /* Stat types */ /* */ /*********************************************************************/ typedef int STAT_VALUE; typedef int STAT_MODIFIER; #define STAT_MODIFIER_MAX INT_MAX /* * character stat */ typedef struct { STAT_VALUE current; STAT_VALUE total; STAT_MODIFIER advance; } CHARACTER_STAT; /*********************************************************************/ /* */ /* Perk types */ /* */ /*********************************************************************/ typedef int N_PERKS; /* * perks */ typedef enum { PK_NIL = -1, PK_ALERTNESS, PK_ALIEN_TECHNOLOGY, PK_BATTLE_TACTICS, PK_BIOMANCER, PK_BLADEMASTER, PK_COMBAT_EVOCATION, PK_CRITICAL_SHOT, PK_CRITICAL_STRIKE, PK_CRUSHING_STRIKE, PK_DAEMON_LORE, PK_DAEMONOLOGIST, PK_DIE_HARD, PK_DISARM, PK_DISEASE_ATTACK, PK_DOCTOR, PK_DRUG_RESISTANT, PK_ENHANCED_PARRY, PK_FAST_DRAW, PK_FIRST_AID, PK_GRENADIER, PK_IMMUNITY_TO_DISEASE, PK_IMMUNITY_TO_FEAR, PK_IMMUNITY_TO_PAIN, PK_IMMUNITY_TO_POISON, PK_IMPERIAL_LANGUAGE, PK_JUMP_PACK, PK_LEADER, PK_MANUFACTURE_DRUGS, PK_MARKSMAN, PK_PERSUADE, PK_PSYCHIC, PK_PSYCHIC_RESISTANCE, PK_PSYCHIC_STABILITY, PK_PYROMANCER, PK_QUICKLOAD, PK_RAPID_SHOT, PK_RAPID_STRIKE, PK_SILENT_EVOCATION, PK_SNEAK_ATTACK, PK_SPOT_WEAKNESS, PK_STEALTH, PK_TELEKINETIC, PK_TELEPATH, PK_UNCANNY_DODGE, PK_WEAPON_MAINTENANCE, PK_OUT_OF_BOUNDS } PERK; /*********************************************************************/ /* */ /* Psychic types */ /* */ /*********************************************************************/ /* * psychic disciplines */ typedef enum { PSY_DISCIPLINE_NIL = -1, PSY_DISCIPLINE_BIOMANCY, PSY_DISCIPLINE_TELEPATHY, PSY_DISCIPLINE_TELEKINESIS, PSY_DISCIPLINE_PYROMANCY, PSY_DISCIPLINE_DAEMONOLOGY, PSY_DISCIPLINE_OUT_OF_BOUNDS } PSY_DISCIPLINE; /* * psychic powers */ typedef enum { PSY_NIL = -1, /* PSY_DISCIPLINE_BIOMANCY */ PSY_REGENERATE = 0, PSY_REACTIVATE, PSY_WARP_STRENGTH, PSY_PURIFY_BLOOD, PSY_PURGE_PLAGUE, /* PSY_DISCIPLINE_TELEPATHY */ PSY_MIND_VIEW = 5, PSY_PSYCHIC_SHRIEK, PSY_TERRIFY, /* xxx */ /* xxx */ /* xxx */ /* PSY_DISCIPLINE_TELEKINESES */ PSY_PSYCHIC_SHIELD = 10, /* xxx */ /* xxx */ /* xxx */ /* xxx */ /* PSY_DISCIPLINE_PYROMANCY */ PSY_FIREBALL = 15, PSY_FIRESTORM, /* xxx */ /* xxx */ /* xxx */ /* PSY_DISCIPLINE_DAEMONOLOGY */ PSY_BANISHMENT = 20, /* xxx */ /* xxx */ /* xxx */ /* xxx */ PSY_OUT_OF_BOUNDS } PSY_POWER; /*********************************************************************/ /* */ /* Drug types */ /* */ /*********************************************************************/ /* * drugs */ typedef enum { DRUG_NIL = -1, DRUG_ANTIDOTE, DRUG_FLASH, DRUG_STOIC, DRUG_NOMAT, DRUG_ZEN, DRUG_BULL, DRUG_OUT_OF_BOUNDS } DRUG; /*********************************************************************/ /* */ /* Time types */ /* */ /*********************************************************************/ typedef int PHASE_TIME; #define TIME_UNDETERMINED -1 #define TIME_CONTINUOUS -2 typedef int PHASE; /*********************************************************************/ /* */ /* Effect types */ /* */ /*********************************************************************/ /* * effects */ typedef enum { ET_NIL = -1, ET_POISONED, ET_DISEASED, ET_BROKEN, ET_STUNNED, ET_PSYCHIC_OVERLOAD, ET_OUT_OF_BOUNDS } EFFECT; /*********************************************************************/ /* */ /* Event types */ /* */ /*********************************************************************/ typedef int N_EVENTS; typedef int EVENT_POWER; /* * event types */ typedef enum { EVT_NIL = -1, EVT_RELOAD_WEAPON, EVT_RECHARGE_WEAPON, EVT_UNJAM_WEAPON, EVT_EFFECT_TERMINATION, EVT_PSY_POWER_TERMINATION, EVT_DRUG_TERMINATION, EVT_POISON_DAMAGE, EVT_OUT_OF_BOUNDS } EVENT_TYPE; /* * event */ typedef struct { EVENT_TYPE type; PHASE_TIME delay; CHARACTER * character; OBJECT * object; DRUG drug; PSY_POWER psy_power; EFFECT effect; EVENT_POWER power; STAT_MODIFIER stat_modifier[MAX_STATS]; } EVENT; /*********************************************************************/ /* */ /* Combat system types */ /* */ /*********************************************************************/ typedef int N_SHOTS; typedef int N_STRIKES; typedef int N_TARGETS; typedef int HIT_ROLL; typedef int HIT_VALUE; typedef int HIT_MODIFIER; typedef int REACH_MODIFIER; typedef int PARRY_VALUE; typedef int A_MODE_SPREAD_FACTOR; typedef int DAMAGE; /* * target modes */ typedef enum { TMODE_NIL = -1, TMODE_SHOOT, TMODE_STRIKE, TMODE_PSY_POWER, TMODE_TRIGGER, TMODE_RUN, TMODE_JUMP, TMODE_DISARM, TMODE_DOCTOR, TMODE_OUT_OF_BOUNDS } TARGET_MODE; /* * firing modes */ typedef enum { FMODE_NIL = -1, FMODE_S, FMODE_SA, FMODE_A, FMODE_OUT_OF_BOUNDS } FIRING_MODE; /* * firing data */ typedef struct { FIRING_MODE firing_mode; N_SHOTS n_shots; A_MODE_SPREAD_FACTOR spread; } FIRING_DATA; /* * attack types */ typedef enum { AT_NIL = -1, AT_STRIKE, AT_SHOT, AT_OUT_OF_BOUNDS } ATTACK_TYPE; /* * attack data structure */ typedef struct { ATTACK_TYPE type; CHARACTER * attacker; OBJECT * weapon; FIRING_DATA * firing_data; AREA_POINT target_point; AREA_DISTANCE distance; bool sneak; bool rapid; HIT_VALUE hit_value; HIT_ROLL hit_roll; bool critical_hit; } ATTACK_DATA; /*********************************************************************/ /* */ /* Gore types */ /* */ /*********************************************************************/ /* * gore levels */ typedef enum { GORE_LEVEL_NIL = -1, GORE_LEVEL_ZERO, GORE_LEVEL_BLOOD, GORE_LEVEL_BODY_PART, GORE_LEVEL_MACHINE_PARTS, GORE_LEVEL_POISONED_CORPSE, GORE_LEVEL_CORPSE, GORE_LEVEL_OUT_OF_BOUNDS } GORE_LEVEL; /*********************************************************************/ /* */ /* Terrain types */ /* */ /*********************************************************************/ typedef BOX_ITEM_INDEX TERRAIN_INDEX; #define TERRAIN_INDEX_NIL -1 /* * terrain */ struct terrain_struct { TERRAIN_INDEX index; COLOUR colour; GORE_LEVEL gore_level; LIST_NODE * list_node; LIST_NODE_INDEX list_index; }; /* * terrain attributes */ typedef enum { TA_NIL = -1, TA_AIR, TA_BLOCKS_LINE_OF_SIGHT, TA_CAUSES_DISEASE, TA_DANGEROUS, TA_IMPASSABLE, TA_OUT_OF_BOUNDS } TERRAIN_ATTRIBUTE; /*********************************************************************/ /* */ /* Object types */ /* */ /*********************************************************************/ typedef BOX_ITEM_INDEX OBJECT_INDEX; #define OBJECT_INDEX_NIL -1 typedef int MONEY; #define VALUE_NIL -1 typedef int WEIGHT; #define WEIGHT_NIL -1 #define ENCUMBRANCE_MAX(c) ((c)->stat[S_ST].current * 10) typedef int WEAPON_REACH; typedef int PARRY_PENALTY; typedef int CONDITION; #define CONDITION_MAX INT_MAX #define CONDITION_INDESTRUCTABLE CONDITION_MAX typedef int RELOAD_VALUE; typedef int ARMOUR_VALUE; typedef int CHARGE; #define CHARGE_NIL -1 typedef int N_OBJECTS; typedef int N_OBJECT_ATTRIBUTES; /* * object types */ typedef enum { OTYPE_NIL = -1, OTYPE_CLOSE_COMBAT_WEAPON, OTYPE_RANGED_COMBAT_WEAPON, OTYPE_ARMOUR, OTYPE_DRUG, OTYPE_ENVIRONMENT, OTYPE_MONEY, OTYPE_JUMP_PACK, OTYPE_TOME, OTYPE_OUT_OF_BOUNDS } OBJECT_TYPE; /* * object subtypes */ typedef enum { OSTYPE_NIL = -1, OSTYPE_KNIFE, OSTYPE_PISTOL, OSTYPE_BASIC, OSTYPE_LIGHT, OSTYPE_MEDIUM, OSTYPE_HEAVY, OSTYPE_ANCIENT_TOME, OSTYPE_WARP_TOME, OSTYPE_ELEVATOR, OSTYPE_WAY_UP, OSTYPE_WAY_DOWN, OSTYPE_OUT_OF_BOUNDS } OBJECT_SUBTYPE; /* * object attributes */ typedef enum { OA_NIL = -1, OA_ALIEN, OA_AUTOMATIC_RECHARGE, OA_BLOCKS_LINE_OF_SIGHT, OA_DAEMONIC, OA_DANGEROUS, OA_ENVIRONMENTAL_PROTECTION, OA_FORCE, OA_FORCE_CHANNEL, OA_FORCE_RUNE, OA_HINDERS_MOVEMENT, OA_IGNORE_ARMOUR, OA_IMPASSABLE, OA_INHERENT, OA_LASER, OA_NOISY, OA_NO_PARRY, OA_PAIN, OA_PARTIAL_RELOAD, OA_PLAGUE, OA_PLASMA, OA_POISON, OA_POWER, OA_PROJECTILE, OA_PSYCHIC_BOLT, OA_RELIABLE, OA_SHOCK, OA_SILENT, OA_STRENGTH_BOOST, OA_STRENGTH_BOOST_2, OA_UNIQUE, OA_OUT_OF_BOUNDS } OBJECT_ATTRIBUTE; /* * object firing mode data */ typedef struct { bool has[MAX_FIRING_MODES]; N_SHOTS min_sa_shots; N_SHOTS max_sa_shots; N_SHOTS a_shots; HIT_MODIFIER accuracy; } FIRING_MODE_DATA; /* * object */ struct object_struct { OBJECT_INDEX index; COLOUR colour; GORE_LEVEL gore_level; CONDITION condition; CHARGE charge; bool functional; LIST_NODE * list_node; LIST_NODE_INDEX list_index; }; /*********************************************************************/ /* */ /* Career types */ /* */ /*********************************************************************/ typedef BOX_ITEM_INDEX CAREER_INDEX; #define CAREER_NIL -1 typedef int CAREER_EXIT_INDEX; typedef int N_CAREERS; /* * career types */ typedef enum { CAREER_TYPE_NIL = -1, CAREER_TYPE_BASIC, CAREER_TYPE_ADVANCED, CAREER_TYPE_OUT_OF_BOUNDS } CAREER_TYPE; /* * career */ typedef struct { char name[CAREER_NAME_SIZE]; COLOUR colour; char description[DESCRIPTION_SIZE]; CAREER_TYPE type; STAT_MODIFIER max_stat_advance[MAX_STATS]; bool perk[MAX_PERKS]; LIST * trappings; char exit[MAX_CAREER_EXITS][CAREER_NAME_SIZE]; } CAREER; /*********************************************************************/ /* */ /* AI types */ /* */ /*********************************************************************/ /* * AI states */ typedef enum { AI_STATE_NIL = -1, AI_STATE_WAIT, AI_STATE_GUARD, AI_STATE_PATROL, AI_STATE_FOLLOW, AI_STATE_FLEE, AI_STATE_SEARCH, AI_STATE_COMBAT, AI_STATE_OUT_OF_BOUNDS } AI_STATE; /* * AI tactics */ typedef enum { TACTIC_NIL = -1, TACTIC_PLAN_A, TACTIC_GET_READY, TACTIC_STAY_CLOSE, TACTIC_HOLD_POSITION, TACTIC_OUT_OF_BOUNDS } AI_TACTIC; /* * character AI data */ typedef struct { /* * the currrent state of the AI */ AI_STATE state; /* * the default state of the AI i.e. the basic state to which * the AI jumps back, once it has finished its current task */ AI_STATE default_state; /* * the AI state which was set at character creation */ AI_STATE original_state; /* * the current AI tactic */ AI_TACTIC tactic; /* * the current target of the AI */ AREA_POINT target_point; } AI_DATA; /*********************************************************************/ /* */ /* Party types */ /* */ /*********************************************************************/ /* * parties */ typedef enum { PARTY_NIL = -1, PARTY_PLAYER, PARTY_OUT_OF_BOUNDS } PARTY; /*********************************************************************/ /* */ /* Character types */ /* */ /*********************************************************************/ typedef BOX_ITEM_INDEX NPC_INDEX; #define NPC_INDEX_NIL -1 #define NPC_RANDOM -2 typedef int N_NPCS; typedef int N_CHARACTERS; typedef int EXPERIENCE_POINTS; typedef int POWER_RATING; typedef int INJURY; typedef int BLOODY_FEET_VALUE; typedef int CONCENTRATION_VALUE; /* * genders */ typedef enum { GENDER_NIL = -1, GENDER_MALE, GENDER_FEMALE, GENDER_NEUTER, GENDER_OUT_OF_BOUNDS } GENDER; /* * character types */ typedef enum { CT_NIL = -1, CT_PC, CT_PARTY_NPC_1, CT_PARTY_NPC_2, CT_NPC, CT_OUT_OF_BOUNDS } CHARACTER_TYPE; /* * character controllers */ typedef enum { CC_NIL = -1, CC_PLAYER, CC_AI, CC_OUT_OF_BOUNDS } CHARACTER_CONTROLLER; /* * character armour rating */ typedef struct { ARMOUR_VALUE current; ARMOUR_VALUE total; } ARMOUR_RATING; /* * character flags */ typedef enum { CF_NIL = -1, CF_BROKEN, CF_BULL, CF_BUSY, CF_CANNOT_SPEAK, CF_DAEMONIC, CF_DISEASED, CF_FLASH, CF_MACHINE, CF_NOMAT, CF_POISONED, CF_PSYCHIC_OVERLOAD, CF_PSYCHIC_SHIELD, CF_STOIC, CF_STUNNED, CF_UNIQUE, CF_UNNOTICED, CF_WARP_STRENGTH, CF_FOCUS, CF_OUT_OF_BOUNDS } CHARACTER_FLAG; /* * character structure */ struct character_struct { /* representation data ****************************/ char name[CHARACTER_NAME_SIZE]; NUMERUS numerus; SYMBOL symbol; COLOUR colour; GENDER gender; char * description; /**************************************************/ /* state data *************************************/ CHARACTER_TYPE type; CHARACTER_CONTROLLER controller; AREA_POINT location; bool is_hostile; INJURY injury; BLOODY_FEET_VALUE bloody_feet; CONCENTRATION_VALUE concentration; bool action_spent; /**************************************************/ /* stats ******************************************/ CHARACTER_STAT stat[MAX_STATS]; /**************************************************/ /* flags, perks, psychic powers *******************/ bool flag[MAX_CHARACTER_FLAGS]; bool perk[MAX_PERKS]; bool psy_power[MAX_PSY_POWERS]; /**************************************************/ /* advancement data *******************************/ CAREER_INDEX career; EXPERIENCE_POINTS ep; EXPERIENCE_POINTS ep_total; /**************************************************/ /* party data *************************************/ PARTY party; /**************************************************/ /* inventory, equipment ****************************/ LIST * inventory; OBJECT * weapon; OBJECT * secondary_weapon; OBJECT * armour; OBJECT * jump_pack; ARMOUR_RATING armour_rating; /**************************************************/ /* perception data ********************************/ LIST * noticed_enemies; /**************************************************/ /* AI data ****************************************/ AI_DATA ai; /**************************************************/ /* character script *******************************/ char script[FILE_NAME_SIZE]; /**************************************************/ /* serialization data *****************************/ LIST_NODE * list_node; LIST_NODE_INDEX list_index; /**************************************************/ /* NPC box index **********************************/ NPC_INDEX index; /**************************************************/ };