Attempt to decompile chrAssignCoverByCriteria

This commit is contained in:
Ryan Dwyer 2021-06-28 22:29:38 +10:00
parent 0e8b55b265
commit f28074d92a
12 changed files with 230 additions and 55 deletions

View File

@ -7741,7 +7741,11 @@ s32 func0f03aca0(struct chrdata *chr, f32 arg1, u8 arg2)
}
if (arg1 < 0) {
func0f04ba34(g_Vars.chrdata, 0x90a, 0);
chrAssignCoverByCriteria(g_Vars.chrdata,
COVERCRITERIA_FURTHEREST
| COVERCRITERIA_DISTTOTARGET
| COVERCRITERIA_ONLYNEIGHBOURINGROOMS
| COVERCRITERIA_ROOMSFROMME, 0);
return chrGoToCover(chr, SPEED_RUN);
}
@ -7751,8 +7755,12 @@ s32 func0f03aca0(struct chrdata *chr, f32 arg1, u8 arg2)
somefloat = 2000;
}
if (chrAssignCoverAwayFromDanger(chr, somefloat, arg1 + 10000) == 0) {
func0f04ba34(g_Vars.chrdata, 0x90a, 0);
if (!chrAssignCoverAwayFromDanger(chr, somefloat, arg1 + 10000)) {
chrAssignCoverByCriteria(g_Vars.chrdata,
COVERCRITERIA_FURTHEREST
| COVERCRITERIA_DISTTOTARGET
| COVERCRITERIA_ONLYNEIGHBOURINGROOMS
| COVERCRITERIA_ROOMSFROMME, 0);
}
return chrGoToCover(chr, SPEED_RUN);
@ -25235,7 +25243,7 @@ bool chrCheckCoverOutOfSight(struct chrdata *chr, s32 covernum, bool arg2)
}
GLOBAL_ASM(
glabel func0f04ba34
glabel chrAssignCoverByCriteria
/* f04ba34: 27bdff48 */ addiu $sp,$sp,-184
/* f04ba38: afbf003c */ sw $ra,0x3c($sp)
/* f04ba3c: afb40028 */ sw $s4,0x28($sp)
@ -25288,8 +25296,8 @@ glabel func0f04ba34
/* f04baec: 00840019 */ multu $a0,$a0
/* f04baf0: 8fa80078 */ lw $t0,0x78($sp)
/* f04baf4: 86990292 */ lh $t9,0x292($s4)
/* f04baf8: 3c12800a */ lui $s2,%hi(var800a2368)
/* f04bafc: 26522368 */ addiu $s2,$s2,%lo(var800a2368)
/* f04baf8: 3c12800a */ lui $s2,%hi(g_CoverCandidates)
/* f04bafc: 26522368 */ addiu $s2,$s2,%lo(g_CoverCandidates)
/* f04bb00: 00008025 */ or $s0,$zero,$zero
/* f04bb04: 27b500a0 */ addiu $s5,$sp,0xa0
/* f04bb08: afb90084 */ sw $t9,0x84($sp)
@ -25507,10 +25515,10 @@ glabel func0f04ba34
/* f04bdf4: 02002025 */ or $a0,$s0,$zero
/* f04bdf8: 00008025 */ or $s0,$zero,$zero
.L0f04bdfc:
/* f04bdfc: 3c12800a */ lui $s2,%hi(var800a2368)
/* f04bdfc: 3c12800a */ lui $s2,%hi(g_CoverCandidates)
/* f04be00: 2bc10002 */ slti $at,$s8,0x2
/* f04be04: 1420004b */ bnez $at,.L0f04bf34
/* f04be08: 26522368 */ addiu $s2,$s2,%lo(var800a2368)
/* f04be08: 26522368 */ addiu $s2,$s2,%lo(g_CoverCandidates)
/* f04be0c: 27c6ffff */ addiu $a2,$s8,-1
/* f04be10: 27a30088 */ addiu $v1,$sp,0x88
.L0f04be14:
@ -25653,6 +25661,141 @@ glabel func0f04ba34
/* f04bff8: 27bd00b8 */ addiu $sp,$sp,0xb8
);
// Mismatch: regalloc
//s32 chrAssignCoverByCriteria(struct chrdata *chr, u16 criteria, s32 refdist)
//{
// s16 rooms[8];
// struct cover cover;
// struct covercandidate tmp;
// s32 oldcover;
// s32 i;
// struct prop *roomprop;
// s32 numcovers = coverGetCount();
// s32 numcandidates = 0;
// struct prop *target = chrGetTargetProp(chr);
// bool userandomdist = false;
// bool changed;
// f32 sqdist;
// f32 y = chr->prop->pos.y + 170;
// s32 currefdist = refdist;
// struct prop *fetchprop;
//
// if (criteria & COVERCRITERIA_DISTTOFETCHPROP) {
// if (!chr->aibot || !chr->aibot->fetchprop) {
// return -1;
// }
//
// fetchprop = chr->aibot->fetchprop;
// }
//
// if (chr == NULL) {
// return 0;
// }
//
// oldcover = chr->cover;
// refdist *= refdist;
//
// // Iterate all cover, filter them by criteria and store them in g_CoverCandidates
// for (i = 0; i < numcovers; i++) {
// if (coverUnpack(i, &cover)
// && !coverIsSpecial(&cover)
// && ((criteria & COVERCRITERIA_2000) == 0 || (cover.flags & COVERFLAG_OMNIDIRECTIONAL))
// && ((criteria & COVERCRITERIA_1000) || (cover.flags & COVERFLAG_AIMDIFFROOM) == 0 || !arrayIntersects(cover.rooms, target->rooms))) {
// userandomdist = false;
//
// if ((criteria & COVERCRITERIA_0001) && (criteria & COVERCRITERIA_FURTHEREST)) {
// userandomdist = true;
// criteria &= ~(COVERCRITERIA_0001 | COVERCRITERIA_FURTHEREST);
// }
//
// if (((criteria & COVERCRITERIA_FORCENEWCOVER) == 0 || i != oldcover)
// && ((criteria & COVERCRITERIA_2000) || !(coverIsInUse(i) || cover.pos->y > y))) {
// if (criteria & COVERCRITERIA_ROOMSFROMME) {
// roomprop = chr->prop;
// } else if (criteria & COVERCRITERIA_ROOMSFROMTARGET) {
// roomprop = target;
// } else if (criteria & COVERCRITERIA_DISTTOTARGET) {
// roomprop = target;
// } else {
// roomprop = chr->prop;
// }
//
// rooms[0] = roomprop->rooms[0];
// rooms[1] = -1;
//
// if (criteria & COVERCRITERIA_ALLOWNEIGHBOURINGROOMS) {
// roomGetNeighbours(roomprop->rooms[0], &rooms[1], 6);
// } else if (criteria & COVERCRITERIA_ONLYNEIGHBOURINGROOMS) {
// roomGetNeighbours(roomprop->rooms[0], &rooms[0], 7);
// }
//
// if (((criteria & COVERCRITERIA_0040) == 0 || !arrayIntersects(cover.rooms, rooms))
// && ((criteria & COVERCRITERIA_0020) == 0 || arrayIntersects(cover.rooms, rooms))
// && (rooms[1] == -1
// || chr->oldrooms[0] == -1
// || (criteria & COVERCRITERIA_0200) == 0
// || !arrayIntersects(cover.rooms, chr->oldrooms))) {
// if (criteria & COVERCRITERIA_DISTTOME) {
// sqdist = chrGetSquaredDistanceToCoord(chr, cover.pos);
// } else if (criteria & COVERCRITERIA_DISTTOTARGET) {
// sqdist = coordGetSquaredDistanceToCoord(&target->pos, cover.pos);
// } else if (criteria & COVERCRITERIA_DISTTOFETCHPROP) {
// sqdist = coordGetSquaredDistanceToCoord(&fetchprop->pos, cover.pos);
// } else if (userandomdist) {
// sqdist = random() % 0xf000;
// } else {
// sqdist = 0;
// currefdist = 0;
// }
//
// if (!currefdist
// || (currefdist < 0 && sqdist > refdist)
// || (currefdist > 0 && sqdist < refdist)) {
// g_CoverCandidates[numcandidates].sqdist = sqdist;
// g_CoverCandidates[numcandidates].covernum = i;
// numcandidates++;
// }
// }
// }
// }
// }
//
// // Sort candidates by distance ascending, or descending if using COVERCRITERIA_FURTHEREST
// if (numcandidates >= 2) {
// do {
// changed = false;
//
// for (i = 0; i < numcandidates - 1; i++) {
// if ((((criteria & COVERCRITERIA_0001) || (criteria & COVERCRITERIA_DISTTOFETCHPROP) || userandomdist) && (g_CoverCandidates[i].sqdist > g_CoverCandidates[i + 1].sqdist))
// || ((criteria & COVERCRITERIA_FURTHEREST) && g_CoverCandidates[i].sqdist < g_CoverCandidates[i + 1].sqdist)) {
// changed = true;
//
// tmp = g_CoverCandidates[i];
// g_CoverCandidates[i] = g_CoverCandidates[i + 1];
// g_CoverCandidates[i + 1] = tmp;
// }
// }
// } while (changed);
// }
//
// // Assign the first out of sight cover
// for (i = 0; i < numcandidates; i++) {
// if (chrCheckCoverOutOfSight(chr, g_CoverCandidates[i].covernum, criteria & COVERCRITERIA_8000)) {
// chr->cover = g_CoverCandidates[i].covernum;
//
// if (oldcover != -1) {
// coverSetInUse(oldcover, false);
// }
//
// coverSetInUse(chr->cover, true);
//
// return g_CoverCandidates[i].covernum;
// }
// }
//
// return -1;
//}
GLOBAL_ASM(
glabel chrAssignCoverAwayFromDanger
/* f04bffc: 27bdff58 */ addiu $sp,$sp,-168
@ -25940,7 +26083,7 @@ s16 chrGoToCover(struct chrdata *chr, u8 speed)
}
if (chrIsReadyForOrders(chr) && chr->cover != -1 && coverUnpack(chr->cover, &cover)) {
chrGoToPos(chr, cover.pos, &cover.room, speed);
chrGoToPos(chr, cover.pos, &cover.rooms[0], speed);
return chr->cover;
}

View File

@ -299,9 +299,9 @@ bool (*g_CommandPointers[])(void) = {
/*0x011e*/ aiIfHuman,
/*0x011f*/ aiIfSkedar,
/*0x0120*/ ai0120,
/*0x0121*/ ai0121,
/*0x0122*/ ai0122,
/*0x0123*/ ai0123,
/*0x0121*/ aiFindCover,
/*0x0122*/ aiFindCoverWithinDist,
/*0x0123*/ aiFindCoverOutsideDist,
/*0x0124*/ aiGoToCover,
/*0x0125*/ aiCheckCoverOutOfSight,
/*0x0126*/ aiIfPlayerUsingCmpOrAr34,

View File

@ -6914,12 +6914,12 @@ glabel var7f1a9d4c
/**
* @cmd 0121
*/
bool ai0121(void)
bool aiFindCover(void)
{
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
u16 someshort = cmd[3] | (cmd[2] << 8);
u16 criteria = cmd[3] | (cmd[2] << 8);
if (g_Vars.chrdata && g_Vars.chrdata->prop && func0f04ba34(g_Vars.chrdata, someshort, 0) != -1) {
if (g_Vars.chrdata && g_Vars.chrdata->prop && chrAssignCoverByCriteria(g_Vars.chrdata, criteria, 0) != -1) {
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[4]);
} else {
g_Vars.aioffset += 5;
@ -6931,13 +6931,13 @@ bool ai0121(void)
/**
* @cmd 0122
*/
bool ai0122(void)
bool aiFindCoverWithinDist(void)
{
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
u16 thing = cmd[3] | (cmd[2] << 8);
u16 criteria = cmd[3] | (cmd[2] << 8);
u32 flags = (cmd[5] << 16) | (cmd[6] << 8) | cmd[7] | (cmd[4] << 24);
if (g_Vars.chrdata && g_Vars.chrdata->prop && func0f04ba34(g_Vars.chrdata, thing, flags) != -1) {
if (g_Vars.chrdata && g_Vars.chrdata->prop && chrAssignCoverByCriteria(g_Vars.chrdata, criteria, flags) != -1) {
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[8]);
} else {
g_Vars.aioffset += 9;
@ -6949,13 +6949,13 @@ bool ai0122(void)
/**
* @cmd 0123
*/
bool ai0123(void)
bool aiFindCoverOutsideDist(void)
{
u8 *cmd = g_Vars.ailist + g_Vars.aioffset;
u16 thing = cmd[3] | (cmd[2] << 8);
u16 criteria = cmd[3] | (cmd[2] << 8);
u32 flags = (cmd[5] << 16) | (cmd[6] << 8) | cmd[7] | (cmd[4] << 24);
if (g_Vars.chrdata && g_Vars.chrdata->prop && func0f04ba34(g_Vars.chrdata, thing, -flags) != -1) {
if (g_Vars.chrdata && g_Vars.chrdata->prop && chrAssignCoverByCriteria(g_Vars.chrdata, criteria, -flags) != -1) {
g_Vars.aioffset = chraiGoToLabel(g_Vars.ailist, g_Vars.aioffset, cmd[8]);
} else {
g_Vars.aioffset += 9;
@ -10064,7 +10064,11 @@ bool aiRetreat(void)
struct prop *target = chrGetTargetProp(g_Vars.chrdata);
chrRunFromPos(g_Vars.chrdata, cmd[2], 10000, &target->pos);
} else {
func0f04ba34(g_Vars.chrdata, 2314, 0);
chrAssignCoverByCriteria(g_Vars.chrdata,
COVERCRITERIA_FURTHEREST
| COVERCRITERIA_DISTTOTARGET
| COVERCRITERIA_ONLYNEIGHBOURINGROOMS
| COVERCRITERIA_ROOMSFROMME, 0);
chrGoToCover(g_Vars.chrdata, cmd[2]);
}

View File

@ -1240,7 +1240,7 @@ u8 func0007_alerted[] = {
//
label(0xa4)
if_self_flag_bankx_eq(CHRFLAG0_00002000, TRUE, BANK_0, /*goto*/ 0xa8)
cmd0121_if_something(0xa0b5, /*goto*/ 0xa5)
find_cover(COVERCRITERIA_0001 | COVERCRITERIA_DISTTOME | COVERCRITERIA_FORCENEWCOVER | COVERCRITERIA_0020 | COVERCRITERIA_ALLOWNEIGHBOURINGROOMS | COVERCRITERIA_2000 | COVERCRITERIA_8000, /*goto*/ 0xa5)
dprint 'P','O','P','P','E','R',' ','F','A','I','L','E','D','\n',0,
goto_next(0x52)
@ -1452,30 +1452,30 @@ u8 func0007_alerted[] = {
if_self_flag_bankx_eq(CHRFLAG1_00004000, TRUE, BANK_1, /*goto*/ 0x15)
if_self_flag_bankx_eq(CHRFLAG0_00000040, TRUE, BANK_0, /*goto*/ 0x16)
if_self_flag_bankx_eq(CHRFLAG0_08000000, FALSE, BANK_0, /*goto*/ 0x5c)
cmd0121_if_something(0x10b5, /*goto*/ 0x53)
find_cover(COVERCRITERIA_0001 | COVERCRITERIA_DISTTOME | COVERCRITERIA_FORCENEWCOVER | COVERCRITERIA_0020 | COVERCRITERIA_ALLOWNEIGHBOURINGROOMS | COVERCRITERIA_1000, /*goto*/ 0x53)
goto_next(0x14)
label(0x5c)
cmd0121_if_something(0x1035, /*goto*/ 0x53)
find_cover(COVERCRITERIA_0001 | COVERCRITERIA_DISTTOME | COVERCRITERIA_FORCENEWCOVER | COVERCRITERIA_0020 | COVERCRITERIA_1000, /*goto*/ 0x53)
goto_next(0x14)
label(0x16)
cmd0121_if_something(0x0035, /*goto*/ 0x53)
find_cover(COVERCRITERIA_0001 | COVERCRITERIA_DISTTOME | COVERCRITERIA_FORCENEWCOVER | COVERCRITERIA_0020, /*goto*/ 0x53)
goto_next(0x14)
label(0x15)
dprint 'S','O','F','T',' ','C','O','V','E','R','\n',0,
if_self_flag_bankx_eq(CHRFLAG0_00000040, TRUE, BANK_0, /*goto*/ 0x16)
if_self_flag_bankx_eq(CHRFLAG0_08000000, FALSE, BANK_0, /*goto*/ 0x5c)
cmd0121_if_something(0x90b5, /*goto*/ 0x53)
find_cover(COVERCRITERIA_0001 | COVERCRITERIA_DISTTOME | COVERCRITERIA_FORCENEWCOVER | COVERCRITERIA_0020 | COVERCRITERIA_ALLOWNEIGHBOURINGROOMS | COVERCRITERIA_1000 | COVERCRITERIA_8000, /*goto*/ 0x53)
goto_next(0x14)
label(0x5c)
cmd0121_if_something(0x9035, /*goto*/ 0x53)
find_cover(COVERCRITERIA_0001 | COVERCRITERIA_DISTTOME | COVERCRITERIA_FORCENEWCOVER | COVERCRITERIA_0020 | COVERCRITERIA_1000 | COVERCRITERIA_8000, /*goto*/ 0x53)
goto_next(0x14)
label(0x16)
cmd0121_if_something(0x8035, /*goto*/ 0x53)
find_cover(COVERCRITERIA_0001 | COVERCRITERIA_DISTTOME | COVERCRITERIA_FORCENEWCOVER | COVERCRITERIA_0020 | COVERCRITERIA_8000, /*goto*/ 0x53)
goto_next(0x14)
label(0x14)
@ -3277,13 +3277,13 @@ u8 func000c_combat_with_target_chr[] = {
label(0x13)
dprint 'L','O','O','K',' ','F','O','R',' ','C','O','V','E','R','\n',0,
if_self_flag_bankx_eq(CHRFLAG1_00004000, TRUE, BANK_1, /*goto*/ 0x15)
cmd0121_if_something(0x1035, /*goto*/ 0x53)
cmd0121_if_something(0x1095, /*goto*/ 0x53)
find_cover(COVERCRITERIA_0001 | COVERCRITERIA_DISTTOME | COVERCRITERIA_FORCENEWCOVER | COVERCRITERIA_0020 | COVERCRITERIA_1000, /*goto*/ 0x53)
find_cover(COVERCRITERIA_0001 | COVERCRITERIA_DISTTOME | COVERCRITERIA_FORCENEWCOVER | COVERCRITERIA_ALLOWNEIGHBOURINGROOMS | COVERCRITERIA_1000, /*goto*/ 0x53)
goto_next(0x16)
label(0x15)
cmd0121_if_something(0x9035, /*goto*/ 0x53)
cmd0121_if_something(0x9095, /*goto*/ 0x53)
find_cover(COVERCRITERIA_0001 | COVERCRITERIA_DISTTOME | COVERCRITERIA_FORCENEWCOVER | COVERCRITERIA_0020 | COVERCRITERIA_1000 | COVERCRITERIA_8000, /*goto*/ 0x53)
find_cover(COVERCRITERIA_0001 | COVERCRITERIA_DISTTOME | COVERCRITERIA_FORCENEWCOVER | COVERCRITERIA_ALLOWNEIGHBOURINGROOMS | COVERCRITERIA_1000 | COVERCRITERIA_8000, /*goto*/ 0x53)
label(0x16)
goto_next(0x54)
@ -4874,7 +4874,7 @@ u8 func0014_coop_buddy[] = {
* Not used?
*/
u8 func002b_do_something_and_wait[] = {
cmd01c5
avoid
beginloop(0x03)
if_chr_stopped(/*goto*/ 0x16)

View File

@ -64,12 +64,12 @@ void coverLoad(void)
g_CoverFlags = malloc(ALIGN16(numcovers * sizeof(u16)), MEMPOOL_STAGE);
g_CoverRooms = malloc(ALIGN16(numcovers * sizeof(s32)), MEMPOOL_STAGE);
var800a2368 = malloc(ALIGN16(numcovers * 0x10), MEMPOOL_STAGE);
g_CoverCandidates = malloc(ALIGN16(numcovers * 0x10), MEMPOOL_STAGE);
g_NumSpecialCovers = 0;
g_SpecialCoverNums = NULL;
if (g_CoverFlags && g_CoverRooms && var800a2368) {
if (g_CoverFlags && g_CoverRooms && g_CoverCandidates) {
for (i = 0; i < numcovers; i++) {
roomsptr = NULL;
g_CoverFlags[i] = 0;

View File

@ -11,7 +11,7 @@ u32 var800a2358;
u32 var800a235c;
u16 *g_CoverFlags;
s32 *g_CoverRooms;
void *var800a2368;
struct covercandidate *g_CoverCandidates;
u16 g_NumSpecialCovers;
u16 *g_SpecialCoverNums;
@ -633,8 +633,8 @@ bool coverUnpack(s32 covernum, struct cover *cover)
g_CoverFlags[covernum] |= def->flags;
cover->flags = g_CoverFlags[covernum];
cover->room = g_CoverRooms[covernum];
cover->unk0a = -1;
cover->rooms[0] = g_CoverRooms[covernum];
cover->rooms[1] = -1;
return true;
}

View File

@ -206,7 +206,7 @@ extern s32 *g_PadsFile;
extern u16 *g_PadOffsets;
extern u16 *g_CoverFlags;
extern s32 *g_CoverRooms;
extern void *var800a2368;
extern struct covercandidate *g_CoverCandidates;
extern u16 g_NumSpecialCovers;
extern u16 *g_SpecialCoverNums;
extern struct var800a2380 var800a2380[5];

View File

@ -2633,22 +2633,29 @@
value, \
label,
// If cover exists nearby
#define cmd0121_if_something(u1, label) \
/**
* Finds cover using the given criteria. If any matches, it is assigned to the
* chr and the label is followed.
*
* Criteria is expected to be a bitfield of COVERCRITERIA constants.
*
* To actually go to the cover, go_to_cover must be used afterwards.
*/
#define find_cover(criteria, label) \
mkshort(0x0121), \
mkshort(u1), \
mkshort(criteria), \
label,
#define cmd0122(u1, flags, label) \
#define find_cover_within_dist(criteria, distance, label) \
mkshort(0x0122), \
mkshort(u1), \
mkword(flags), \
mkshort(criteria), \
mkword(distance), \
label,
#define cmd0123(u1, flags, label) \
#define find_cover_outside_dist(criteria, distance, label) \
mkshort(0x0123), \
mkshort(u1), \
mkword(flags), \
mkshort(criteria), \
mkword(distance), \
label,
#define go_to_cover(speed) \

View File

@ -566,6 +566,23 @@
#define COUNTDOWNTIMERREASON_AI 0x01
#define COUNTDOWNTIMERREASON_NOCONTROL 0x10
#define COVERCRITERIA_0001 0x0001
#define COVERCRITERIA_FURTHEREST 0x0002
#define COVERCRITERIA_DISTTOME 0x0004
#define COVERCRITERIA_DISTTOTARGET 0x0008
#define COVERCRITERIA_FORCENEWCOVER 0x0010
#define COVERCRITERIA_0020 0x0020
#define COVERCRITERIA_0040 0x0040
#define COVERCRITERIA_ALLOWNEIGHBOURINGROOMS 0x0080
#define COVERCRITERIA_ONLYNEIGHBOURINGROOMS 0x0100
#define COVERCRITERIA_0200 0x0200
#define COVERCRITERIA_ROOMSFROMTARGET 0x0400
#define COVERCRITERIA_ROOMSFROMME 0x0800
#define COVERCRITERIA_1000 0x1000
#define COVERCRITERIA_2000 0x2000
#define COVERCRITERIA_DISTTOFETCHPROP 0x4000
#define COVERCRITERIA_8000 0x8000
#define COVERFLAG_0001 0x0001
#define COVERFLAG_INUSE 0x0002
#define COVERFLAG_AIMSAMEROOM 0x0004 // look + 6 metres is in the same room

View File

@ -215,7 +215,7 @@ struct prop *chrSpawnAtCoord(s32 body, s32 head, struct coord *pos, s16 *room, f
bool func0f04b658(struct chrdata *chr);
bool chrMoveToPos(struct chrdata *chr, struct coord *pos, s16 *room, f32 angle, bool allowonscreen);
bool chrCheckCoverOutOfSight(struct chrdata *chr, s32 covernum, bool arg2);
s32 func0f04ba34(struct chrdata *chr, u16 arg1, u32 arg2);
s32 chrAssignCoverByCriteria(struct chrdata *chr, u16 arg1, s32 arg2);
s32 chrAssignCoverAwayFromDanger(struct chrdata *chr, s32 mindist, s32 maxdist);
bool chrRunFromPos(struct chrdata *chr, u32 speed, f32 distance, struct coord *frompos);
f32 func0f04c784(struct chrdata *chr);

View File

@ -290,9 +290,9 @@
/*0x011e*/ bool aiIfHuman(void);
/*0x011f*/ bool aiIfSkedar(void);
/*0x0120*/ bool ai0120(void);
/*0x0121*/ bool ai0121(void);
/*0x0122*/ bool ai0122(void);
/*0x0123*/ bool ai0123(void);
/*0x0121*/ bool aiFindCover(void);
/*0x0122*/ bool aiFindCoverWithinDist(void);
/*0x0123*/ bool aiFindCoverOutsideDist(void);
/*0x0124*/ bool aiGoToCover(void);
/*0x0125*/ bool aiCheckCoverOutOfSight(void);
/*0x0126*/ bool aiIfPlayerUsingCmpOrAr34(void);

View File

@ -2930,6 +2930,11 @@ struct path {
/*0x06*/ u16 len;
};
struct covercandidate {
u64 sqdist;
s32 covernum;
};
struct coverdefinition {
struct coord pos;
struct coord look;
@ -2939,8 +2944,7 @@ struct coverdefinition {
struct cover {
/*0x00*/ struct coord *pos;
/*0x04*/ struct coord *look;
/*0x08*/ s16 room;
/*0x0a*/ s16 unk0a;
/*0x08*/ s16 rooms[2];
/*0x0c*/ u16 flags;
};