Decompile waypointEnableSegmentInDirection

This commit is contained in:
Ryan Dwyer 2020-11-21 11:03:40 +10:00
parent 6eda0c93a8
commit 74c668e560
2 changed files with 43 additions and 73 deletions

View File

@ -1708,78 +1708,42 @@ glabel waypointDisableSegmentInDirection
/* f115948: 00000000 */ nop
);
GLOBAL_ASM(
glabel waypointEnableSegmentInDirection
/* f11594c: 3c0a800a */ lui $t2,%hi(g_StageSetup)
/* f115950: 8c8e0008 */ lw $t6,0x8($a0)
/* f115954: 8c890004 */ lw $t1,0x4($a0)
/* f115958: 254ad030 */ addiu $t2,$t2,%lo(g_StageSetup)
/* f11595c: 8d590000 */ lw $t9,0x0($t2)
/* f115960: 8d280000 */ lw $t0,0x0($t1)
/* f115964: 000e7880 */ sll $t7,$t6,0x2
/* f115968: 8d580004 */ lw $t8,0x4($t2)
/* f11596c: 01ee7823 */ subu $t7,$t7,$t6
/* f115970: 00b91823 */ subu $v1,$a1,$t9
/* f115974: 000f7880 */ sll $t7,$t7,0x2
/* f115978: 00035903 */ sra $t3,$v1,0x4
/* f11597c: 01601825 */ or $v1,$t3,$zero
/* f115980: 8ca60008 */ lw $a2,0x8($a1)
/* f115984: 00003825 */ or $a3,$zero,$zero
/* f115988: 0500000c */ bltz $t0,.L0f1159bc
/* f11598c: 01f81021 */ addu $v0,$t7,$t8
/* f115990: 310c3fff */ andi $t4,$t0,0x3fff
/* f115994: 116c0009 */ beq $t3,$t4,.L0f1159bc
/* f115998: 00006880 */ sll $t5,$zero,0x2
/* f11599c: 012d2821 */ addu $a1,$t1,$t5
/* f1159a0: 8ca80004 */ lw $t0,0x4($a1)
.L0f1159a4:
/* f1159a4: 24e70001 */ addiu $a3,$a3,0x1
/* f1159a8: 24a50004 */ addiu $a1,$a1,0x4
/* f1159ac: 05000003 */ bltz $t0,.L0f1159bc
/* f1159b0: 310e3fff */ andi $t6,$t0,0x3fff
/* f1159b4: 546efffb */ bnel $v1,$t6,.L0f1159a4
/* f1159b8: 8ca80004 */ lw $t0,0x4($a1)
.L0f1159bc:
/* f1159bc: 310f3fff */ andi $t7,$t0,0x3fff
/* f1159c0: 106f0007 */ beq $v1,$t7,.L0f1159e0
/* f1159c4: 00072880 */ sll $a1,$a3,0x2
/* f1159c8: 0125c021 */ addu $t8,$t1,$a1
/* f1159cc: af030000 */ sw $v1,0x0($t8)
/* f1159d0: 8c8b0004 */ lw $t3,0x4($a0)
/* f1159d4: 2419ffff */ addiu $t9,$zero,-1
/* f1159d8: 01656021 */ addu $t4,$t3,$a1
/* f1159dc: ad990004 */ sw $t9,0x4($t4)
.L0f1159e0:
/* f1159e0: 8c430000 */ lw $v1,0x0($v0)
/* f1159e4: 00003825 */ or $a3,$zero,$zero
/* f1159e8: 8c680000 */ lw $t0,0x0($v1)
/* f1159ec: 0500000b */ bltz $t0,.L0f115a1c
/* f1159f0: 310d3fff */ andi $t5,$t0,0x3fff
/* f1159f4: 10cd0009 */ beq $a2,$t5,.L0f115a1c
/* f1159f8: 00007080 */ sll $t6,$zero,0x2
/* f1159fc: 006e2021 */ addu $a0,$v1,$t6
/* f115a00: 8c880004 */ lw $t0,0x4($a0)
.L0f115a04:
/* f115a04: 24e70001 */ addiu $a3,$a3,0x1
/* f115a08: 24840004 */ addiu $a0,$a0,0x4
/* f115a0c: 05000003 */ bltz $t0,.L0f115a1c
/* f115a10: 310f3fff */ andi $t7,$t0,0x3fff
/* f115a14: 54cffffb */ bnel $a2,$t7,.L0f115a04
/* f115a18: 8c880004 */ lw $t0,0x4($a0)
.L0f115a1c:
/* f115a1c: 31183fff */ andi $t8,$t0,0x3fff
/* f115a20: 10d80007 */ beq $a2,$t8,.L0f115a40
/* f115a24: 00072880 */ sll $a1,$a3,0x2
/* f115a28: 00655821 */ addu $t3,$v1,$a1
/* f115a2c: ad660000 */ sw $a2,0x0($t3)
/* f115a30: 8c4c0000 */ lw $t4,0x0($v0)
/* f115a34: 2419ffff */ addiu $t9,$zero,-1
/* f115a38: 01856821 */ addu $t5,$t4,$a1
/* f115a3c: adb90004 */ sw $t9,0x4($t5)
.L0f115a40:
/* f115a40: 03e00008 */ jr $ra
/* f115a44: 00000000 */ nop
);
/**
* Enable the segment from A to B.
*
* This works by adding B to A's neighbour list. If B is already a neighbour of
* A (ie. segment is already enabled) then no operation is performed.
*
* This code assumes that A's neighbours array is big enough to add the new
* neighbour, which it will be if B was disabled previously.
*/
void waypointEnableSegmentInDirection(struct waypoint *a, struct waypoint *b)
{
struct waygroup *agroup = &g_StageSetup.waygroups[a->groupnum];
s32 bpointnum = b - g_StageSetup.waypoints;
s32 bgroupnum = b->groupnum;
s32 neighbournum;
s32 i;
// Find index in A's neighbour list where B can be added.
// This will either be at the -1 terminator, or if B already exists in the
// list then the index of B.
for (i = 0; (neighbournum = a->neighbours[i]) >= 0 && (neighbournum & 0x3fff) != bpointnum; i++);
// Add B to A's neighbour list if it doesn't exist
if ((neighbournum & 0x3fff) != bpointnum) {
a->neighbours[i] = bpointnum;
a->neighbours[i + 1] = -1;
}
// Now the same for groups. Make sure B's group is a neighbour of A's group.
for (i = 0; (neighbournum = agroup->neighbours[i]) >= 0 && (neighbournum & 0x3fff) != bgroupnum; i++);
if (bgroupnum != (neighbournum & 0x3fff)) {
agroup->neighbours[i] = bgroupnum;
agroup->neighbours[i + 1] = -1;
}
}
void waypointDisableSegment(struct waypoint *a, struct waypoint *b)
{

View File

@ -338,6 +338,12 @@ struct modeldata_headspot { // type 0x17
void *datas;
};
struct waygroup {
s32 *neighbours;
s32 *waypoints;
s32 terminator; // always zero
};
struct waypoint {
s32 padnum;
s32 *neighbours; // most significant two bits are booleans, remaining bits are waypoint index
@ -2839,7 +2845,7 @@ struct cover {
struct stagesetup {
/*0x00*/ struct waypoint *waypoints;
/*0x04*/ void *unk04;
/*0x04*/ struct waygroup *waygroups;
/*0x08*/ struct coverdefinition *cover;
/*0x0c*/ s32 *intro;
/*0x10*/ u32 *props;