diff --git a/src/game/chr/chraction.c b/src/game/chr/chraction.c index eb3c12b66..582ad988f 100644 --- a/src/game/chr/chraction.c +++ b/src/game/chr/chraction.c @@ -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; } diff --git a/src/game/chr/chrai.c b/src/game/chr/chrai.c index eeeb4aec3..973b3d4a4 100644 --- a/src/game/chr/chrai.c +++ b/src/game/chr/chrai.c @@ -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, diff --git a/src/game/chr/chraicommands.c b/src/game/chr/chraicommands.c index 0cc7dc62b..7afec226e 100644 --- a/src/game/chr/chraicommands.c +++ b/src/game/chr/chraicommands.c @@ -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]); } diff --git a/src/game/data/ailists.c b/src/game/data/ailists.c index 722bbc0da..6e3a4179d 100644 --- a/src/game/data/ailists.c +++ b/src/game/data/ailists.c @@ -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) diff --git a/src/game/game_013ee0.c b/src/game/game_013ee0.c index 7c2612411..82591c309 100644 --- a/src/game/game_013ee0.c +++ b/src/game/game_013ee0.c @@ -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; diff --git a/src/game/pad.c b/src/game/pad.c index 0daaa293e..544dbb04a 100644 --- a/src/game/pad.c +++ b/src/game/pad.c @@ -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; } diff --git a/src/include/bss.h b/src/include/bss.h index a9214fdb5..0311f2b6a 100644 --- a/src/include/bss.h +++ b/src/include/bss.h @@ -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]; diff --git a/src/include/commands.h b/src/include/commands.h index 81e50399c..b31c1269d 100644 --- a/src/include/commands.h +++ b/src/include/commands.h @@ -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) \ diff --git a/src/include/constants.h b/src/include/constants.h index f9564548d..1bd28da5a 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -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 diff --git a/src/include/game/chr/chraction.h b/src/include/game/chr/chraction.h index de46e6800..9f558d2ed 100644 --- a/src/include/game/chr/chraction.h +++ b/src/include/game/chr/chraction.h @@ -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); diff --git a/src/include/game/chr/chraicommands.h b/src/include/game/chr/chraicommands.h index b73bb8bc8..be29cd322 100644 --- a/src/include/game/chr/chraicommands.h +++ b/src/include/game/chr/chraicommands.h @@ -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); diff --git a/src/include/types.h b/src/include/types.h index 66c4370e9..2626d9f6e 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -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; };