diff --git a/src/game/game_066310.c b/src/game/game_066310.c index 3ce9b9b6a..e1ae1b792 100644 --- a/src/game/game_066310.c +++ b/src/game/game_066310.c @@ -48381,159 +48381,48 @@ glabel func0f0900c0 /* f090188: 00000000 */ sll $zero,$zero,0x0 ); -GLOBAL_ASM( -glabel func0f09018c -/* f09018c: 3c05800a */ lui $a1,0x800a -/* f090190: 8ca5a244 */ lw $a1,-0x5dbc($a1) -/* f090194: 27bdffc8 */ addiu $sp,$sp,-56 -/* f090198: afbf001c */ sw $ra,0x1c($sp) -/* f09019c: afb00018 */ sw $s0,0x18($sp) -/* f0901a0: 8ca20480 */ lw $v0,0x480($a1) -/* f0901a4: 00803025 */ or $a2,$a0,$zero -/* f0901a8: 8c900004 */ lw $s0,0x4($a0) -/* f0901ac: 0002182b */ sltu $v1,$zero,$v0 -/* f0901b0: 10600004 */ beqz $v1,.L0f0901c4 -/* f0901b4: 00000000 */ sll $zero,$zero,0x0 -/* f0901b8: 80430037 */ lb $v1,0x37($v0) -/* f0901bc: 0003702b */ sltu $t6,$zero,$v1 -/* f0901c0: 01c01825 */ or $v1,$t6,$zero -.L0f0901c4: -/* f0901c4: 50600004 */ beqzl $v1,.L0f0901d8 -/* f0901c8: 8ca400bc */ lw $a0,0xbc($a1) -/* f0901cc: 10000002 */ beqz $zero,.L0f0901d8 -/* f0901d0: 8c440000 */ lw $a0,0x0($v0) -/* f0901d4: 8ca400bc */ lw $a0,0xbc($a1) -.L0f0901d8: -/* f0901d8: 00c02825 */ or $a1,$a2,$zero -/* f0901dc: afa4002c */ sw $a0,0x2c($sp) -/* f0901e0: 0fc22f40 */ jal func0f08bd00 -/* f0901e4: afa60038 */ sw $a2,0x38($sp) -/* f0901e8: 10400008 */ beqz $v0,.L0f09020c -/* f0901ec: 8fa4002c */ lw $a0,0x2c($sp) -/* f0901f0: 0fc24030 */ jal func0f0900c0 -/* f0901f4: 02002825 */ or $a1,$s0,$zero -/* f0901f8: 8fa40038 */ lw $a0,0x38($sp) -/* f0901fc: 0fc23fba */ jal func0f08fee8 -/* f090200: 24050001 */ addiu $a1,$zero,0x1 -/* f090204: 10000066 */ beqz $zero,.L0f0903a0 -/* f090208: 8fbf001c */ lw $ra,0x1c($sp) -.L0f09020c: -/* f09020c: 820f0084 */ lb $t7,0x84($s0) -/* f090210: 3c013f00 */ lui $at,0x3f00 -/* f090214: 55e00062 */ bnezl $t7,.L0f0903a0 -/* f090218: 8fbf001c */ lw $ra,0x1c($sp) -/* f09021c: 44813000 */ mtc1 $at,$f6 -/* f090220: c608005c */ lwc1 $f8,0x5c($s0) -/* f090224: c604007c */ lwc1 $f4,0x7c($s0) -/* f090228: 46083282 */ mul.s $f10,$f6,$f8 -/* f09022c: 460a203c */ c.lt.s $f4,$f10 -/* f090230: 00000000 */ sll $zero,$zero,0x0 -/* f090234: 4502005a */ bc1fl .L0f0903a0 -/* f090238: 8fbf001c */ lw $ra,0x1c($sp) -/* f09023c: 8e18000c */ lw $t8,0xc($s0) -/* f090240: 33190004 */ andi $t9,$t8,0x4 -/* f090244: 17200040 */ bnez $t9,.L0f090348 -/* f090248: 00000000 */ sll $zero,$zero,0x0 -/* f09024c: 0fc44af0 */ jal func0f112bc0 -/* f090250: 02002025 */ or $a0,$s0,$zero -/* f090254: 3c08800a */ lui $t0,0x800a -/* f090258: 8d08a474 */ lw $t0,-0x5b8c($t0) -/* f09025c: 24010026 */ addiu $at,$zero,0x26 -/* f090260: 00402825 */ or $a1,$v0,$zero -/* f090264: 1501001b */ bne $t0,$at,.L0f0902d4 -/* f090268: 00002025 */ or $a0,$zero,$zero -/* f09026c: 0fc68606 */ jal ciGetTrainingData -/* f090270: afa20028 */ sw $v0,0x28($sp) -/* f090274: 0fc687f8 */ jal func0f1a1fe0 -/* f090278: afa20020 */ sw $v0,0x20($sp) -/* f09027c: 8fa40020 */ lw $a0,0x20($sp) -/* f090280: 8fa50028 */ lw $a1,0x28($sp) -/* f090284: 10800006 */ beqz $a0,.L0f0902a0 -/* f090288: 00000000 */ sll $zero,$zero,0x0 -/* f09028c: 8c830000 */ lw $v1,0x0($a0) -/* f090290: 00034fc2 */ srl $t1,$v1,0x1f -/* f090294: 0009182b */ sltu $v1,$zero,$t1 -/* f090298: 5460000e */ bnezl $v1,.L0f0902d4 -/* f09029c: 306400ff */ andi $a0,$v1,0xff -.L0f0902a0: -/* f0902a0: 10400006 */ beqz $v0,.L0f0902bc -/* f0902a4: 3c0d800a */ lui $t5,0x800a -/* f0902a8: 8c430000 */ lw $v1,0x0($v0) -/* f0902ac: 00035fc2 */ srl $t3,$v1,0x1f -/* f0902b0: 000b182b */ sltu $v1,$zero,$t3 -/* f0902b4: 54600007 */ bnezl $v1,.L0f0902d4 -/* f0902b8: 306400ff */ andi $a0,$v1,0xff -.L0f0902bc: -/* f0902bc: 8dada244 */ lw $t5,-0x5dbc($t5) -/* f0902c0: 8dae00bc */ lw $t6,0xbc($t5) -/* f0902c4: 85c30028 */ lh $v1,0x28($t6) -/* f0902c8: 386f000a */ xori $t7,$v1,0xa -/* f0902cc: 2de30001 */ sltiu $v1,$t7,0x1 -/* f0902d0: 306400ff */ andi $a0,$v1,0xff -.L0f0902d4: -/* f0902d4: 10a0000c */ beqz $a1,.L0f090308 -/* f0902d8: 00000000 */ sll $zero,$zero,0x0 -/* f0902dc: 8ca2001c */ lw $v0,0x1c($a1) -/* f0902e0: 10400009 */ beqz $v0,.L0f090308 -/* f0902e4: 00000000 */ sll $zero,$zero,0x0 -/* f0902e8: 0fc5b9f1 */ jal textGet -/* f0902ec: 00402025 */ or $a0,$v0,$zero -/* f0902f0: 00402025 */ or $a0,$v0,$zero -/* f0902f4: 00002825 */ or $a1,$zero,$zero -/* f0902f8: 0fc377e9 */ jal func0f0ddfa4 -/* f0902fc: 24060001 */ addiu $a2,$zero,0x1 -/* f090300: 10000011 */ beqz $zero,.L0f090348 -/* f090304: 00000000 */ sll $zero,$zero,0x0 -.L0f090308: -/* f090308: 10800009 */ beqz $a0,.L0f090330 -/* f09030c: 00000000 */ sll $zero,$zero,0x0 -/* f090310: 0fc5b9f1 */ jal textGet -/* f090314: 24041c50 */ addiu $a0,$zero,0x1c50 -/* f090318: 00402025 */ or $a0,$v0,$zero -/* f09031c: 00002825 */ or $a1,$zero,$zero -/* f090320: 0fc377e9 */ jal func0f0ddfa4 -/* f090324: 24060001 */ addiu $a2,$zero,0x1 -/* f090328: 10000007 */ beqz $zero,.L0f090348 -/* f09032c: 00000000 */ sll $zero,$zero,0x0 -.L0f090330: -/* f090330: 0fc5b9f1 */ jal textGet -/* f090334: 2404522c */ addiu $a0,$zero,0x522c -/* f090338: 00402025 */ or $a0,$v0,$zero -/* f09033c: 00002825 */ or $a1,$zero,$zero -/* f090340: 0fc377e9 */ jal func0f0ddfa4 -/* f090344: 24060001 */ addiu $a2,$zero,0x1 -.L0f090348: -/* f090348: 3c02800a */ lui $v0,0x800a -/* f09034c: 3c18800a */ lui $t8,0x800a -/* f090350: 8f18a258 */ lw $t8,-0x5da8($t8) -/* f090354: 8c42a24c */ lw $v0,-0x5db4($v0) -/* f090358: 3c09800a */ lui $t1,0x800a -/* f09035c: 17020006 */ bne $t8,$v0,.L0f090378 -/* f090360: 00000000 */ sll $zero,$zero,0x0 -/* f090364: 8e190040 */ lw $t9,0x40($s0) -/* f090368: 3c010004 */ lui $at,0x4 -/* f09036c: 03214025 */ or $t0,$t9,$at -/* f090370: 10000007 */ beqz $zero,.L0f090390 -/* f090374: ae080040 */ sw $t0,0x40($s0) -.L0f090378: -/* f090378: 8d29a254 */ lw $t1,-0x5dac($t1) -/* f09037c: 55220005 */ bnel $t1,$v0,.L0f090394 -/* f090380: 8e0c000c */ lw $t4,0xc($s0) -/* f090384: 8e0a0040 */ lw $t2,0x40($s0) -/* f090388: 354b4000 */ ori $t3,$t2,0x4000 -/* f09038c: ae0b0040 */ sw $t3,0x40($s0) -.L0f090390: -/* f090390: 8e0c000c */ lw $t4,0xc($s0) -.L0f090394: -/* f090394: 358d0008 */ ori $t5,$t4,0x8 -/* f090398: ae0d000c */ sw $t5,0xc($s0) -/* f09039c: 8fbf001c */ lw $ra,0x1c($sp) -.L0f0903a0: -/* f0903a0: 8fb00018 */ lw $s0,0x18($sp) -/* f0903a4: 27bd0038 */ addiu $sp,$sp,0x38 -/* f0903a8: 03e00008 */ jr $ra -/* f0903ac: 00001025 */ or $v0,$zero,$zero -); +bool func0f09018c(struct prop *doorprop) +{ + struct doorobj *door = doorprop->door; + bool usingeyespy = g_Vars.currentplayer->eyespy && g_Vars.currentplayer->eyespy->active; + struct prop *playerprop = usingeyespy ? g_Vars.currentplayer->eyespy->prop : g_Vars.currentplayer->prop; + + if (func0f08bd00(playerprop, doorprop)) { + func0f0900c0(playerprop, door); + func0f08fee8(doorprop, 1); + } else if (door->mode == DOORMODE_IDLE && door->frac < 0.5f * door->maxfrac) { + if ((door->base.flags2 & OBJFLAG2_00000004) == 0) { + struct textoverride *override = objGetTextOverride(&door->base); + u8 intraining = false; + + if (g_Vars.stagenum == STAGE_CITRAINING) { + struct trainingdata *a = ciGetTrainingData(); + struct trainingdata *b = func0f1a1fe0(); + + intraining = (a && a->unk00_00) || (b && b->unk00_00) || + g_Vars.currentplayer->prop->rooms[0] == 0x0a; + } + + if (override && override->activatetextid) { + func0f0ddfa4(textGet(override->activatetextid), 0, 1); + } else if (intraining) { + func0f0ddfa4(textGet(0x1c50), 0, 1); // "Cannot exit while training is in progress." + } else { + func0f0ddfa4(textGet(0x522c), 0, 1); // "This door is locked." + } + } + + if (g_Vars.currentplayernum == g_Vars.coopplayernum) { + door->base.hidden |= OBJHFLAG_ACTIVATED_BY_COOP; + } else if (g_Vars.currentplayernum == g_Vars.bondplayernum) { + door->base.hidden |= OBJHFLAG_ACTIVATED_BY_BOND; + } + + door->base.flags2 |= OBJFLAG2_00000008; + } + + return false; +} void alarmActivate(void) { diff --git a/src/game/game_111600.c b/src/game/game_111600.c index 436e31751..6547d65f3 100644 --- a/src/game/game_111600.c +++ b/src/game/game_111600.c @@ -155,7 +155,7 @@ glabel func0f11179c /* f1117c8: 10800025 */ beqz $a0,.L0f111860 /* f1117cc: 00000000 */ sll $zero,$zero,0x0 /* f1117d0: afa50020 */ sw $a1,0x20($sp) -/* f1117d4: 0fc44af0 */ jal func0f112bc0 +/* f1117d4: 0fc44af0 */ jal objGetTextOverride /* f1117d8: afa6001c */ sw $a2,0x1c($sp) /* f1117dc: 8fa50020 */ lw $a1,0x20($sp) /* f1117e0: 8fa6001c */ lw $a2,0x1c($sp) @@ -723,7 +723,7 @@ glabel func0f111ea4 /* f111ef0: 1662000f */ bne $s3,$v0,.L0f111f30 /* f111ef4: 00000000 */ sll $zero,$zero,0x0 /* f111ef8: 8e020004 */ lw $v0,0x4($s0) -/* f111efc: 0fc44af0 */ jal func0f112bc0 +/* f111efc: 0fc44af0 */ jal objGetTextOverride /* f111f00: 8c440004 */ lw $a0,0x4($v0) /* f111f04: 10400006 */ beqz $v0,.L0f111f20 /* f111f08: 00000000 */ sll $zero,$zero,0x0 @@ -1685,7 +1685,7 @@ glabel func0f112a58 ); GLOBAL_ASM( -glabel func0f112bc0 +glabel objGetTextOverride /* f112bc0: 3c03800a */ lui $v1,0x800a /* f112bc4: 8c63a278 */ lw $v1,-0x5d88($v1) /* f112bc8: 00001025 */ or $v0,$zero,$zero @@ -1745,7 +1745,7 @@ glabel func0f112c44 /* f112c68: 54810009 */ bnel $a0,$at,.L0f112c90 /* f112c6c: 24010001 */ addiu $at,$zero,0x1 /* f112c70: 8c420004 */ lw $v0,0x4($v0) -/* f112c74: 0fc44af0 */ jal func0f112bc0 +/* f112c74: 0fc44af0 */ jal objGetTextOverride /* f112c78: 8c440004 */ lw $a0,0x4($v0) /* f112c7c: 5040001a */ beqzl $v0,.L0f112ce8 /* f112c80: 00001025 */ or $v0,$zero,$zero @@ -1800,7 +1800,7 @@ glabel func0f112cf8 /* f112d24: 24010001 */ addiu $at,$zero,0x1 /* f112d28: 8c420004 */ lw $v0,0x4($v0) /* f112d2c: 8c440004 */ lw $a0,0x4($v0) -/* f112d30: 0fc44af0 */ jal func0f112bc0 +/* f112d30: 0fc44af0 */ jal objGetTextOverride /* f112d34: afa00018 */ sw $zero,0x18($sp) /* f112d38: 8fa50018 */ lw $a1,0x18($sp) /* f112d3c: 10400029 */ beqz $v0,.L0f112de4 @@ -1889,7 +1889,7 @@ glabel func0f112e24 /* f112e50: 24010001 */ addiu $at,$zero,0x1 /* f112e54: 8c420004 */ lw $v0,0x4($v0) /* f112e58: 8c440004 */ lw $a0,0x4($v0) -/* f112e5c: 0fc44af0 */ jal func0f112bc0 +/* f112e5c: 0fc44af0 */ jal objGetTextOverride /* f112e60: afa00018 */ sw $zero,0x18($sp) /* f112e64: 8fa50018 */ lw $a1,0x18($sp) /* f112e68: 1040002d */ beqz $v0,.L0f112f20 @@ -2020,7 +2020,7 @@ GLOBAL_ASM( glabel func0f112fec /* f112fec: 27bdffe8 */ addiu $sp,$sp,-24 /* f112ff0: afbf0014 */ sw $ra,0x14($sp) -/* f112ff4: 0fc44af0 */ jal func0f112bc0 +/* f112ff4: 0fc44af0 */ jal objGetTextOverride /* f112ff8: 00000000 */ sll $zero,$zero,0x0 /* f112ffc: 50400009 */ beqzl $v0,.L0f113024 /* f113000: 00001025 */ or $v0,$zero,$zero diff --git a/src/include/game/game_066310.h b/src/include/game/game_066310.h index 93d213f52..9f0d94bb8 100644 --- a/src/include/game/game_066310.h +++ b/src/include/game/game_066310.h @@ -282,7 +282,7 @@ u32 func0f08bb3c(void); void func0f08bb5c(struct prop *prop, bool firing, s32 room); s32 func0f08bc5c(struct prop *prop); u32 func0f08bcf4(void); -u32 func0f08bd00(void); +bool func0f08bd00(struct prop *playerprop, struct prop *doorprop); u32 func0f08bdd4(void); u32 func0f08be80(void); u32 func0f08bf78(void); @@ -324,8 +324,8 @@ u32 func0f08f968(void); u32 func0f08fcb8(void); void func0f08fee8(struct prop *prop, s32 arg1); u32 func0f08fffc(void); -u32 func0f0900c0(void); -u32 func0f09018c(void); +void func0f0900c0(struct prop *prop, struct doorobj *door); +bool func0f09018c(struct prop *doorprop); u32 func0f0903d4(void); u32 func0f09044c(void); u32 func0f0904e0(void); diff --git a/src/include/game/game_111600.h b/src/include/game/game_111600.h index 595b15cce..e709af579 100644 --- a/src/include/game/game_111600.h +++ b/src/include/game/game_111600.h @@ -33,7 +33,7 @@ bool func0f112884(void); u32 currentPlayerHasProp(struct prop *prop); u32 func0f112950(void); u32 func0f112a58(void); -u32 func0f112bc0(void); +struct textoverride *objGetTextOverride(struct defaultobj *obj); u32 func0f112bfc(void); u32 func0f112c44(void); u32 func0f112cf8(void); diff --git a/src/include/game/game_19c990.h b/src/include/game/game_19c990.h index 252bef312..28ee06cdf 100644 --- a/src/include/game/game_19c990.h +++ b/src/include/game/game_19c990.h @@ -89,7 +89,7 @@ u32 func0f1a1e38(void); u32 func0f1a1e90(void); u32 func0f1a1f00(void); u32 func0f1a1f70(void); -u32 func0f1a1fe0(void); +struct trainingdata *func0f1a1fe0(void); // might be a different but similar struct u32 func0f1a1fec(void); u32 func0f1a2070(void); u32 func0f1a2198(void); diff --git a/src/include/gvars/gvars.h b/src/include/gvars/gvars.h index 0d1601f55..fc291ba69 100644 --- a/src/include/gvars/gvars.h +++ b/src/include/gvars/gvars.h @@ -44,7 +44,7 @@ struct g_vars { /*000274*/ u32 unk000274[4]; /*000284*/ struct player *currentplayer; /*000288*/ struct gvars74 *unk000288; - /*00028c*/ u32 currentplayernum; // 0-3 - controller numbers I think + /*00028c*/ s32 currentplayernum; // 0-3 - controller numbers I think /*000290*/ u32 currentplayerindex; // 0-3 - but 2 or 3 probably only used in combat simulator /*000294*/ s32 bondplayernum; /*000298*/ s32 coopplayernum; diff --git a/src/include/types.h b/src/include/types.h index c4ca101f6..2291fc0fc 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -32,6 +32,7 @@ struct prop { union { struct chrdata *chr; struct defaultobj *obj; + struct doorobj *door; struct weaponobj *weapon; }; @@ -920,7 +921,7 @@ struct eyespy { /*0x34*/ u8 init; /*0x35*/ u8 initialised; /*0x36*/ u8 startuptimer60; - /*0x37*/ u8 active; + /*0x37*/ s8 active; /*0x38*/ u8 buttonheld; /*0x39*/ u8 camerabuttonheld; /*0x3a*/ s16 bobdir; @@ -4741,4 +4742,15 @@ struct smoketype { f32 unk20; }; +struct textoverride { + /*0x00*/ u32 unk00; + /*0x04*/ u32 unk04; + /*0x08*/ u32 unk08; + /*0x0c*/ u32 unk0c; + /*0x10*/ u32 unk10; + /*0x14*/ u32 unk14; + /*0x18*/ u32 unk18; + /*0x1c*/ u32 activatetextid; +}; + #endif