Files
Cesarus85--mjolnir-vr/source/ai/encounters.c
T

526 lines
15 KiB
C

/*
ENCOUNTERS.C
symbols in this file:
00047520 00f0:
_encounters_initialize (0000)
00047610 0010:
_encounters_dispose (0000)
00047620 0020:
_encounters_dispose_from_old_map (0000)
00047640 04b0:
_encounter_compute_activation_cluster_bit_vector (0000)
00047AF0 01b0:
_encounter_detach_actor (0000)
00047CA0 0110:
_encounter_attach_unit (0000)
00047DB0 00b0:
_encounterless_attach_actor (0000)
00047E60 0140:
_encounterless_detach_actor (0000)
00047FA0 0060:
_encounter_get_by_name (0000)
00048000 0030:
_encounter_iterator_new (0000)
00048030 0040:
_encounter_iterator_next (0000)
00048070 0050:
_encounter_actor_iterator_new (0000)
000480C0 0040:
_encounter_actor_iterator_next (0000)
00048100 0080:
_encounter_actor_iterator_prev (0000)
00048180 0040:
_actor_iterator_new (0000)
000481C0 00a0:
_actor_iterator_next (0000)
00048260 0050:
_code_00048260 (0000)
000482B0 00f0:
_code_000482b0 (0000)
000483A0 00a0:
_encounter_modify_pursuit_desires (0000)
00048440 0280:
_encounter_determine_pursuit_availability (0000)
000486C0 00d0:
_code_000486c0 (0000)
00048790 0290:
_code_00048790 (0000)
00048A20 0080:
_code_00048a20 (0000)
00048AA0 0060:
_encounterless_activate (0000)
00048B00 0050:
_code_00048b00 (0000)
00048B50 00c0:
_code_00048b50 (0000)
00048C10 00a0:
_encounter_link_activation (0000)
00048CB0 00a0:
_code_00048cb0 (0000)
00048D50 03d0:
_code_00048d50 (0000)
00049120 01b0:
_encounter_stand_down (0000)
000492D0 0090:
_code_000492d0 (0000)
00049360 0070:
_code_00049360 (0000)
000493D0 0030:
_encounter_set_blind (0000)
00049400 0030:
_encounter_set_deaf (0000)
00049430 00b0:
_encounter_squad_timer_expire (0000)
000494E0 0100:
_code_000494e0 (0000)
000495E0 0290:
_code_000495e0 (0000)
00049870 00a0:
_encounters_initialize_for_new_map (0000)
00049910 00d0:
_encounters_unit_died (0000)
000499E0 0140:
_encounter_verify_firing_position_owner_actor_indices (0000)
00049B20 0130:
_encounter_build_firing_position_owner_actor_indices (0000)
00049C50 0100:
_encounter_mark_examined_pursuit_position (0000)
00049D50 00b0:
_encounter_pursuit_position_already_examined (0000)
00049E00 02e0:
_encounter_get_actor_starting_location (0000)
0004A0E0 0030:
_encounter_force_activate (0000)
0004A110 0030:
_encounter_force_deactivate (0000)
0004A140 0110:
_code_0004a140 (0000)
0004A250 07c0:
_code_0004a250 (0000)
0004AA10 0170:
_code_0004aa10 (0000)
0004AB80 0120:
_encounter_spawn_actor (0000)
0004ACA0 0050:
_encounter_set_respawn (0000)
0004ACF0 02c0:
_code_0004acf0 (0000)
0004AFB0 0140:
_code_0004afb0 (0000)
0004B0F0 0780:
_code_0004b0f0 (0000)
0004B870 0220:
_encounter_attach_actor (0000)
0004BA90 0470:
_encounter_update_status (0000)
0004BF00 0080:
_encounters_update_dirty_status (0000)
0004BF80 02f0:
_encounter_create (0000)
0004C270 01c0:
_code_0004c270 (0000)
0004C430 00c0:
_encounters_create_for_new_map (0000)
0004C4F0 0100:
_encounters_update (0000)
0024CDBC 0018:
_global_empty_possibility (0000)
_global_post_combat_translation_table (0010)
0024CDD4 000d:
??_C@_0N@BNPPEOCF@pursuit_data?$AA@ (0000)
0024CDE4 000b:
??_C@_0L@BAANOOMI@ai?5pursuit?$AA@ (0000)
0024CDF0 000e:
??_C@_0O@CIMAAJHO@platoon_array?$AA@ (0000)
0024CE00 0008:
??_C@_07GONBCAAG@platoon?$AA@ (0000)
0024CE08 000c:
??_C@_0M@EHCGPGM@squad_array?$AA@ (0000)
0024CE14 0006:
??_C@_05BDFMLHFG@squad?$AA@ (0000)
0024CE1C 000f:
??_C@_0P@MECKMOOF@encounter_data?$AA@ (0000)
0024CE2C 001f:
??_C@_0BP@EGKKNGMH@c?3?2halo?2SOURCE?2ai?2encounters?4c?$AA@ (0000)
0024CE50 0058:
??_C@_0FI@BMEIILPH@?$CImove_position?9?$DOcluster_index?5?$DO?$DN@ (0000)
0024CEA8 005c:
??_C@_0FM@DFHIGNCO@?$CIfiring_position?9?$DOcluster_index?5@ (0000)
0024CF04 003a:
??_C@_0DK@EFAAMOOO@?$CIcluster_index?5?$DO?$DN?50?$CJ?5?$CG?$CG?5?$CIcluster@ (0000)
0024CF40 0031:
??_C@_0DB@KHGAFALI@structure_bsp?9?$DOclusters?4count?5?$DM?$DN@ (0000)
0024CF74 001c:
??_C@_0BM@ONCBDDBG@platoon?9?$DOoriginal_count?5?$DO?50?$AA@ (0000)
0024CF90 001a:
??_C@_0BK@NALIBEDP@squad?9?$DOoriginal_count?5?$DO?50?$AA@ (0000)
0024CFAC 001e:
??_C@_0BO@FMKIINLL@encounter?9?$DOoriginal_count?5?$DO?50?$AA@ (0000)
0024CFCC 001d:
??_C@_0BN@DOEKPEEH@?$CKactor_index_reference?$CB?$DNNONE?$AA@ (0000)
0024CFEC 0025:
??_C@_0CF@FBFKAFPA@actor?9?$DOmeta?4unit_index?5?$DN?$DN?5unit_i@ (0000)
0024D014 002f:
??_C@_0CP@NCMOENFD@actor?9?$DOmeta?4encounter_index?5?$DN?$DN?5e@ (0000)
0024D044 001b:
??_C@_0BL@OIOHEOEO@?$CBactor?9?$DOmeta?4encounterless?$AA@ (0000)
0024D060 0022:
??_C@_0CC@PHCDCJEH@actor?9?$DOmeta?4encounter_index?$DN?$DNNON@ (0000)
0024D084 0022:
??_C@_0CC@LJBHAGND@actor?9?$DOmeta?4platoon_index?5?$DN?$DN?5NON@ (0000)
0024D0A8 0020:
??_C@_0CA@HNKMILAG@actor?9?$DOmeta?4squad_index?5?$DN?$DN?5NONE?$AA@ (0000)
0024D0C8 0024:
??_C@_0CE@BMJAJPHM@actor?9?$DOmeta?4encounter_index?5?$DN?$DN?5N@ (0000)
0024D0F0 005d:
??_C@_0FN@LOCOBBFO@WARNING?3?5too?5many?5actors?5searchi@ (0000)
0024D150 003d:
??_C@_0DN@ECMJNADN@?$CFs?5?$CF04X?3?5coord?5?$CFd?5current?5?$CFd?1?$CFd?1@ (0000)
0024D190 0029:
??_C@_0CJ@GDIDEEDO@overflowed?5MAXIMUM_PLATOONS_PER_@ (0000)
0024D1C0 0047:
??_C@_0EH@JLNGBIIA@encounter_definition?9?$DOplatoons?4c@ (0000)
0024D208 0027:
??_C@_0CH@CNGIJGEJ@overflowed?5MAXIMUM_SQUADS_PER_MA@ (0000)
0024D230 0043:
??_C@_0ED@JFKFDEJF@encounter_definition?9?$DOsquads?4cou@ (0000)
0024D278 0063:
??_C@_0GD@GOGHLEAJ@?$CIlink_encounter_index?5?$DO?$DN?50?$CJ?5?$CG?$CG?5?$CI@ (0000)
0024D2DC 0036:
??_C@_0DG@EPEOFOPA@parent_prop?9?$DOorphan_prop_index?5?$DN@ (0000)
0024D314 001a:
??_C@_0BK@GDHJJECC@?$CBencounter?9?$DOenemy_visible?$AA@ (0000)
0024D330 001c:
??_C@_0BM@IJGMLGCM@?$CFs?1?$CFs?3?5delay?5timer?5finished?$AA@ (0000)
0024D34C 0026:
??_C@_0CG@HJILMOOD@?$CFs?1?$CFs?3?5delay?5timer?5started?5?$CI?$CF?41f@ (0000)
0024D374 0011:
??_C@_0BB@HBMEBMNH@survivors?5?$CFd?5?$DN?50?$AA@ (0000)
0024D388 0012:
??_C@_0BC@FNKOIBFL@survivors?5?$CFd?5?$DM?$DN?51?$AA@ (0000)
0024D39C 0021:
??_C@_0CB@HJKPDMEB@survivors?5?$CFd?5?$DM?$DN?575?$CF?$CF?5of?5total?5?$CFd@ (0000)
0024D3C0 0021:
??_C@_0CB@NHMKHBJA@survivors?5?$CFd?5?$DM?$DN?550?$CF?$CF?5of?5total?5?$CFd@ (0000)
0024D3E4 0021:
??_C@_0CB@INABNAMN@survivors?5?$CFd?5?$DM?$DN?525?$CF?$CF?5of?5total?5?$CFd@ (0000)
0024D408 0018:
??_C@_0BI@IGDFHOAI@survivors?5?$CFd?5?$DM?5total?5?$CFd?$AA@ (0000)
0024D420 0015:
??_C@_0BF@FJJAHOMB@strength?5?$CF?42f?5?$DM?525?$CF?$CF?$AA@ (0000)
0024D438 0015:
??_C@_0BF@NMGOFCOD@strength?5?$CF?42f?5?$DM?550?$CF?$CF?$AA@ (0000)
0024D450 0015:
??_C@_0BF@JBHAPBLB@strength?5?$CF?42f?5?$DM?575?$CF?$CF?$AA@ (0000)
0024D468 004a:
??_C@_0EK@PHDJOLGD@owner_actor_indices?$FLactor?9?$DOfirin@ (0000)
0024D4B8 0093:
??_C@_0JD@GAKCCOHE@actor?9?$DOfiring_positions?4current_@ (0000)
0024D550 005a:
??_C@_0FK@DNNFPKMF@firing_position_owner_actor_indi@ (0000)
0024D5B0 0084:
??_C@_0IE@GJHEMMJI@?$CIpursuit?9?$DOnext_actor_index_index@ (0000)
0024D634 0038:
??_C@_0DI@GONNFCHM@pursuit?9?$DOfiring_position_index?5?$DN@ (0000)
0024D66C 0014:
??_C@_0BE@MIHACDDA@found_index?5?$CB?$DN?5NONE?$AA@ (0000)
0024D680 0035:
??_C@_0DF@FCNHHGJA@BIT_VECTOR_TEST_FLAG?$CIsquad?9?$DOunus@ (0000)
0024D6B8 0063:
??_C@_0GD@GIHDEKAB@?$CIselected_behavior_index?5?$DO?$DN?50?$CJ?5?$CG@ (0000)
0024D720 009d:
??_C@_0JN@COMBHAJN@?$CIprimary_postcombat_behaviors?$FLpr@ (0000)
0024D7C0 0004:
__real@3b888889 (0000)
0024D7C8 006c:
??_C@_0GM@MFIMGOEE@WARNING?3?5cannot?5spawn?5actors?5in?5@ (0000)
0024D834 0022:
??_C@_0CC@EIGEOIGF@?$CFs?1?$CFs?3?5randomly?5selected?5to?5spaw@ (0000)
0024D858 002b:
??_C@_0CL@DJPLPKCC@?$CFs?1?$CFs?3?5current?5?$CFd?5?$DM?5max?5?$CFd?5?9?$DO?5de@ (0000)
0024D884 002f:
??_C@_0CP@JPOKCDIH@?$CFs?1?$CFs?3?5unable?5to?5spawn?0?5out?5of?5s@ (0000)
0024D8B4 002e:
??_C@_0CO@IIDKDHP@?$CFs?1?$CFs?3?5current?5?$CFd?5?$DM?5min?5?$CFd?5?9?$DO?5sp@ (0000)
0024D8E4 0018:
??_C@_0BI@NJPCKEMP@?$CFs?1?$CFs?5triggered?5?$CFs?5rule?$AA@ (0000)
0024D8FC 000a:
??_C@_09MEJNCKEO@attacking?$AA@ (0000)
0024D908 000a:
??_C@_09GNBACBHC@defending?$AA@ (0000)
0024D914 0021:
??_C@_0CB@JPLEGLHP@?$CFs?1?$CFs?5triggered?5maneuvering?5rule@ (0000)
0024D938 0030:
??_C@_0DA@LKCBJOBO@?$CFs?3?5current?5?$CFs?1?$CF?41f?5best?5?$CFs?1?$CF?41f@ (0000)
0024D968 0004:
__real@c47a0000 (0000)
0024D96C 0005:
??_C@_04NEBKMGJO@stay?$AA@ (0000)
0024D974 0008:
??_C@_07JBBGNPIP@migrate?$AA@ (0000)
0024D980 004d:
??_C@_0EN@MMBDPONO@WARNING?3?5squad?5?$CFs?1?$CFs?5has?5an?5inva@ (0000)
0024D9D0 004b:
??_C@_0EL@LEBBGDPA@WARNING?3?5actor?5changing?5to?5encou@ (0000)
0024DA1C 0035:
??_C@_0DF@OEDIHECK@?$CBencounter?9?$DOenemy_visible?5?$CG?$CG?5?$CBen@ (0000)
0024DA54 002e:
??_C@_0CO@DFDAGGAE@?$CFs?1?$CFs?3?5?$CFd?5current?5?$CFd?5leaders?0?5cr@ (0000)
0024DA84 000a:
??_C@_09PONLBLAH@no?5leader?$AA@ (0000)
0024DA90 000b:
??_C@_0L@JLIMGEDN@new?5leader?$AA@ (0000)
0024DA9C 000c:
??_C@_0M@ELGJNJDG@ai_place?5?$CFs?$AA@ (0000)
0024DAA8 000f:
??_C@_0P@IGLHCPJF@ai_place?5?$CFs?1?$CFs?$AA@ (0000)
*/
/* ---------- headers */
#include "cseries.h"
#include "encounters.h"
#include "actors.h"
#include "memory/data.h"
#include "saved games/game_state.h"
#include <stddef.h>
/* ---------- constants */
enum
{
MAXIMUM_ENCOUNTERS = 128,
MAXIMUM_PURSUITS = 256,
PURSUIT_DATUM_SIZE = 0x28,
};
/* ---------- macros */
/* ---------- structures */
struct encounter_iterator
{
struct data_iterator data;
long index;
boolean active_only;
};
struct encounter_actor_iterator
{
long encounter_index;
long index;
long next_index;
};
struct actor_iterator
{
struct data_iterator encounter_iterator;
boolean iterated_encounterless_list;
boolean active_only;
byte pad[2];
long index;
long next_index;
};
struct encounter_ai_globals_prefix
{
boolean ai_active;
boolean ai_initialized_for_map;
boolean ai_has_control_data;
boolean time_given_this_frame;
short last_highest_service_timer;
short current_highest_service_timer;
long first_encounterless_actor_index;
};
typedef char encounter_iterator_size_assert[
sizeof(struct encounter_iterator) == 0x18 ? 1 : -1];
typedef char encounter_iterator_index_offset_assert[
offsetof(struct encounter_iterator, index) == 0x10 ? 1 : -1];
typedef char encounter_iterator_active_only_offset_assert[
offsetof(struct encounter_iterator, active_only) == 0x14 ? 1 : -1];
typedef char encounter_actor_iterator_size_assert[
sizeof(struct encounter_actor_iterator) == 0xC ? 1 : -1];
typedef char encounter_actor_iterator_index_offset_assert[
offsetof(struct encounter_actor_iterator, index) == 0x4 ? 1 : -1];
typedef char encounter_actor_iterator_next_index_offset_assert[
offsetof(struct encounter_actor_iterator, next_index) == 0x8 ? 1 : -1];
typedef char actor_iterator_size_assert[
sizeof(struct actor_iterator) == 0x1C ? 1 : -1];
typedef char actor_iterator_iterated_encounterless_offset_assert[
offsetof(struct actor_iterator, iterated_encounterless_list) == 0x10 ? 1 : -1];
typedef char actor_iterator_active_only_offset_assert[
offsetof(struct actor_iterator, active_only) == 0x11 ? 1 : -1];
typedef char actor_iterator_index_offset_assert[
offsetof(struct actor_iterator, index) == 0x14 ? 1 : -1];
typedef char actor_iterator_next_index_offset_assert[
offsetof(struct actor_iterator, next_index) == 0x18 ? 1 : -1];
typedef char encounter_ai_globals_initialized_offset_assert[
offsetof(struct encounter_ai_globals_prefix, ai_initialized_for_map) == 0x1 ? 1 : -1];
typedef char encounter_ai_globals_encounterless_actor_offset_assert[
offsetof(struct encounter_ai_globals_prefix, first_encounterless_actor_index) == 0x8 ? 1 : -1];
typedef char encounter_datum_active_offset_assert[
offsetof(struct encounter_datum, active) == 0xD ? 1 : -1];
typedef char encounter_datum_first_actor_index_offset_assert[
offsetof(struct encounter_datum, first_actor_index) == 0x14 ? 1 : -1];
typedef char encounter_datum_blind_offset_assert[
offsetof(struct encounter_datum, blind) == 0x40 ? 1 : -1];
typedef char encounter_datum_deaf_offset_assert[
offsetof(struct encounter_datum, deaf) == 0x41 ? 1 : -1];
typedef char actor_datum_next_actor_index_offset_assert[
offsetof(struct actor_datum, meta.next_actor_index) == 0x2C ? 1 : -1];
/* ---------- prototypes */
/* ---------- globals */
extern struct encounter_ai_globals_prefix *ai_globals;
struct data_array *encounter_data;
struct platoon_datum *platoon_array;
struct squad_datum *squad_array;
struct data_array *pursuit_data;
/* ---------- public code */
void encounters_initialize(
void)
{
encounter_data = game_state_data_new("encounter", MAXIMUM_ENCOUNTERS, sizeof(struct encounter_datum));
match_assert("c:\\halo\\SOURCE\\ai\\encounters.c", 110, encounter_data);
squad_array = (struct squad_datum *)game_state_malloc("squad", "squad", MAXIMUM_SQUADS_PER_MAP * sizeof(struct squad_datum));
match_assert("c:\\halo\\SOURCE\\ai\\encounters.c", 113, squad_array);
platoon_array = (struct platoon_datum *)game_state_malloc("platoon", "platoon", MAXIMUM_PLATOONS_PER_MAP * sizeof(struct platoon_datum));
match_assert("c:\\halo\\SOURCE\\ai\\encounters.c", 116, platoon_array);
pursuit_data = game_state_data_new("ai pursuit", MAXIMUM_PURSUITS, PURSUIT_DATUM_SIZE);
match_assert("c:\\halo\\SOURCE\\ai\\encounters.c", 119, pursuit_data);
return;
}
void encounters_dispose(
void)
{
return;
}
void encounters_dispose_from_old_map(
void)
{
data_make_invalid(encounter_data);
data_make_invalid(pursuit_data);
return;
}
void encounter_iterator_new(
struct encounter_iterator *iterator,
boolean active_only)
{
if (ai_globals->ai_initialized_for_map)
{
data_iterator_new(&iterator->data, encounter_data);
iterator->active_only = active_only;
}
return;
}
struct encounter_datum *encounter_iterator_next(
struct encounter_iterator *iterator)
{
struct encounter_datum *result = NULL;
if (ai_globals->ai_initialized_for_map)
{
do
{
result = (struct encounter_datum *)data_iterator_next(&iterator->data);
} while (result && iterator->active_only && !result->active);
iterator->index = iterator->data.datum_index;
}
return result;
}
void encounter_actor_iterator_new(
struct encounter_actor_iterator *iterator,
long encounter_index)
{
if (!ai_globals->ai_initialized_for_map)
return;
iterator->encounter_index = encounter_index;
iterator->index = NONE;
if (encounter_index == NONE)
iterator->next_index = ai_globals->first_encounterless_actor_index;
else
iterator->next_index = encounter_get(encounter_index)->first_actor_index;
return;
}
struct actor_datum *encounter_actor_iterator_next(
struct encounter_actor_iterator *iterator)
{
struct actor_datum *result = NULL;
if (ai_globals->ai_initialized_for_map)
{
long next_index = iterator->next_index;
iterator->index = next_index;
if (next_index != NONE)
{
result = actor_get(next_index);
iterator->next_index = result->meta.next_actor_index;
}
}
return result;
}
void encounter_set_blind(
long encounter_index,
boolean blind)
{
if (ai_globals->ai_initialized_for_map)
encounter_get(encounter_index)->blind = blind;
return;
}
void encounter_set_deaf(
long encounter_index,
boolean deaf)
{
if (ai_globals->ai_initialized_for_map)
encounter_get(encounter_index)->deaf = deaf;
return;
}
void actor_iterator_new(
struct actor_iterator *iterator,
boolean active_only)
{
if (!ai_globals->ai_initialized_for_map)
return;
data_iterator_new(&iterator->encounter_iterator, encounter_data);
iterator->iterated_encounterless_list = FALSE;
iterator->next_index = NONE;
iterator->index = NONE;
iterator->active_only = active_only;
return;
}
/* ---------- private code */