Attempt to decompile chrAssignCoverByCriteria
This commit is contained in:
parent
0e8b55b265
commit
f28074d92a
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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) \
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue