Decompile doorChooseSwingDirection

This commit is contained in:
Ryan Dwyer 2021-03-01 17:05:06 +10:00
parent 09c052875c
commit e81a05d2cb
4 changed files with 35 additions and 64 deletions

View File

@ -22729,7 +22729,7 @@ glabel var7f1a9260
/* f045b44: 00000000 */ nop
/* f045b48: 8fab0030 */ lw $t3,0x30($sp)
/* f045b4c: 8e050004 */ lw $a1,0x4($s0)
/* f045b50: 0fc24030 */ jal func0f0900c0
/* f045b50: 0fc24030 */ jal doorChooseSwingDirection
/* f045b54: 8d64001c */ lw $a0,0x1c($t3)
/* f045b58: 02002025 */ or $a0,$s0,$zero
/* f045b5c: 0fc198c4 */ jal doorCallLift

View File

@ -25568,7 +25568,7 @@ glabel var7f1aa6e4
/* f07d6f8: 00000000 */ nop
/* f07d6fc: 45000007 */ bc1f .L0f07d71c
/* f07d700: 00000000 */ nop
/* f07d704: 0fc24030 */ jal func0f0900c0
/* f07d704: 0fc24030 */ jal doorChooseSwingDirection
/* f07d708: e7ac0058 */ swc1 $f12,0x58($sp)
/* f07d70c: 8fa401a0 */ lw $a0,0x1a0($sp)
/* f07d710: 0fc23922 */ jal doorsRequestMode
@ -26328,7 +26328,7 @@ glabel var7f1aa6e4
// + (doorprop->pos.z - prop->pos.z) * (doorprop->pos.z - prop->pos.z);
//
// if (dist < 200 * 200) {
// func0f0900c0(prop, door);
// doorChooseSwingDirection(prop, door);
// doorsRequestMode(door, DOORMODE_OPENING);
// }
//
@ -46294,65 +46294,34 @@ glabel posIsInFrontOfDoor
/* f0900bc: 27bd0080 */ addiu $sp,$sp,0x80
);
GLOBAL_ASM(
glabel func0f0900c0
/* f0900c0: 27bdffe8 */ addiu $sp,$sp,-24
/* f0900c4: afbf0014 */ sw $ra,0x14($sp)
/* f0900c8: 8cae0008 */ lw $t6,0x8($a1)
/* f0900cc: 000e7800 */ sll $t7,$t6,0x0
/* f0900d0: 05e3002b */ bgezl $t7,.L0f090180
/* f0900d4: 8fbf0014 */ lw $ra,0x14($sp)
/* f0900d8: 80b80084 */ lb $t8,0x84($a1)
/* f0900dc: 57000028 */ bnezl $t8,.L0f090180
/* f0900e0: 8fbf0014 */ lw $ra,0x14($sp)
/* f0900e4: 44802000 */ mtc1 $zero,$f4
/* f0900e8: c4a6007c */ lwc1 $f6,0x7c($a1)
/* f0900ec: 24840008 */ addiu $a0,$a0,0x8
/* f0900f0: 46062032 */ c.eq.s $f4,$f6
/* f0900f4: 00000000 */ nop
/* f0900f8: 45020021 */ bc1fl .L0f090180
/* f0900fc: 8fbf0014 */ lw $ra,0x14($sp)
/* f090100: 0fc23fff */ jal posIsInFrontOfDoor
/* f090104: afa5001c */ sw $a1,0x1c($sp)
/* f090108: 8fa5001c */ lw $a1,0x1c($sp)
/* f09010c: 00002025 */ or $a0,$zero,$zero
/* f090110: 94b90070 */ lhu $t9,0x70($a1)
/* f090114: 33280008 */ andi $t0,$t9,0x8
/* f090118: 15000006 */ bnez $t0,.L0f090134
/* f09011c: 00000000 */ nop
/* f090120: 14400002 */ bnez $v0,.L0f09012c
/* f090124: 00000000 */ nop
/* f090128: 3c042000 */ lui $a0,0x2000
.L0f09012c:
/* f09012c: 10000005 */ b .L0f090144
/* f090130: 8ca90008 */ lw $t1,0x8($a1)
.L0f090134:
/* f090134: 50400003 */ beqzl $v0,.L0f090144
/* f090138: 8ca90008 */ lw $t1,0x8($a1)
/* f09013c: 3c042000 */ lui $a0,0x2000
/* f090140: 8ca90008 */ lw $t1,0x8($a1)
.L0f090144:
/* f090144: 3c032000 */ lui $v1,0x2000
/* f090148: 00a01025 */ or $v0,$a1,$zero
/* f09014c: 01245026 */ xor $t2,$t1,$a0
/* f090150: 000a5880 */ sll $t3,$t2,0x2
/* f090154: 0563000a */ bgezl $t3,.L0f090180
/* f090158: 8fbf0014 */ lw $ra,0x14($sp)
/* f09015c: 8c4c0008 */ lw $t4,0x8($v0)
.L0f090160:
/* f090160: 01836826 */ xor $t5,$t4,$v1
/* f090164: ac4d0008 */ sw $t5,0x8($v0)
/* f090168: 8c4200bc */ lw $v0,0xbc($v0)
/* f09016c: 50400004 */ beqzl $v0,.L0f090180
/* f090170: 8fbf0014 */ lw $ra,0x14($sp)
/* f090174: 5445fffa */ bnel $v0,$a1,.L0f090160
/* f090178: 8c4c0008 */ lw $t4,0x8($v0)
/* f09017c: 8fbf0014 */ lw $ra,0x14($sp)
.L0f090180:
/* f090180: 27bd0018 */ addiu $sp,$sp,0x18
/* f090184: 03e00008 */ jr $ra
/* f090188: 00000000 */ nop
);
void doorChooseSwingDirection(struct prop *playerprop, struct doorobj *door)
{
if ((door->base.flags & OBJFLAG_DOOR_TWOWAY) && door->mode == DOORMODE_IDLE && door->frac == 0) {
bool infront = posIsInFrontOfDoor(&playerprop->pos, door);
u32 wantflag = 0;
if ((door->doorflags & DOORFLAG_0008) == 0) {
if (!infront) {
wantflag = OBJFLAG_DOOR_OPENTOFRONT;
}
} else {
if (infront) {
wantflag = OBJFLAG_DOOR_OPENTOFRONT;
}
}
// If flags are different
if ((s32)((door->base.flags ^ wantflag) << 2) < 0) {
// Toggle direction on door and siblings
struct doorobj *sibling = door;
do {
sibling->base.flags ^= OBJFLAG_DOOR_OPENTOFRONT;
sibling = sibling->sibling;
} while (sibling && sibling != door);
}
}
}
bool propdoorInteract(struct prop *doorprop)
{
@ -46361,7 +46330,7 @@ bool propdoorInteract(struct prop *doorprop)
struct prop *playerprop = usingeyespy ? g_Vars.currentplayer->eyespy->prop : g_Vars.currentplayer->prop;
if (doorIsUnlocked(playerprop, doorprop)) {
func0f0900c0(playerprop, door);
doorChooseSwingDirection(playerprop, door);
doorsActivate(doorprop, true);
} else if (door->mode == DOORMODE_IDLE && door->frac < 0.5f * door->maxfrac) {
if ((door->base.flags2 & OBJFLAG2_00000004) == 0) {

View File

@ -2484,11 +2484,13 @@
#define OBJFLAG_ESCSTEP_ZALIGNED 0x10000000
#define OBJFLAG_20000000 0x20000000 // Editor: "Door Opens Backwards/Special Function/Conceal Weapon"
#define OBJFLAG_CAMERA_DISABLED 0x20000000
#define OBJFLAG_DOOR_OPENTOFRONT 0x20000000
#define OBJFLAG_40000000 0x40000000
#define OBJFLAG_CAMERA_BONDINVIEW 0x40000000
#define OBJFLAG_DOOR_KEEPOPEN 0x40000000 // Editor: "Door open by default/Empty weapon"
#define OBJFLAG_LIFT_TRIGGERDISABLE 0x40000000
#define OBJFLAG_80000000 0x80000000
#define OBJFLAG_DOOR_TWOWAY 0x80000000 // Door swings in both directions
#define OBJFLAG_CHOPPER_INACTIVE 0x80000000 // Or lift disabled, or hovercar something
// obj->flags2

View File

@ -337,7 +337,7 @@ bool func0f08f968(struct doorobj *door, bool arg1);
bool doorTestForInteract(struct prop *prop);
void doorsActivate(struct prop *prop, bool allowliftclose);
bool posIsInFrontOfDoor(struct coord *pos, struct doorobj *door);
void func0f0900c0(struct prop *prop, struct doorobj *door);
void doorChooseSwingDirection(struct prop *playerprop, struct doorobj *door);
bool propdoorInteract(struct prop *doorprop);
void alarmStopAudio(void);
u32 func0f09044c(void);