diff --git a/src/game/game_00c490.c b/src/game/game_00c490.c index 4aa9cd650..15d60da8f 100644 --- a/src/game/game_00c490.c +++ b/src/game/game_00c490.c @@ -1626,202 +1626,70 @@ void setupHangingMonitors(struct hangingmonitorsobj *monitors, s32 cmdindex) setupGenericObject(&monitors->base, cmdindex); } -GLOBAL_ASM( -glabel setupSingleMonitor -.late_rodata -glabel var7f1a8058 -.word 0x3ebba0c0 -.text -/* f00ddbc: 27bdff38 */ addiu $sp,$sp,-200 -/* f00ddc0: afb00018 */ sw $s0,0x18($sp) -/* f00ddc4: 00808025 */ or $s0,$a0,$zero -/* f00ddc8: 3c0e800a */ lui $t6,%hi(var8009ce98) -/* f00ddcc: 25cece98 */ addiu $t6,$t6,%lo(var8009ce98) -/* f00ddd0: 2484005c */ addiu $a0,$a0,0x5c -/* f00ddd4: afbf001c */ sw $ra,0x1c($sp) -/* f00ddd8: afa500cc */ sw $a1,0xcc($sp) -/* f00dddc: 00804025 */ or $t0,$a0,$zero -/* f00dde0: 25d9006c */ addiu $t9,$t6,0x6c -.L0f00dde4: -/* f00dde4: 8dc10000 */ lw $at,0x0($t6) -/* f00dde8: 25ce000c */ addiu $t6,$t6,0xc -/* f00ddec: 2508000c */ addiu $t0,$t0,0xc -/* f00ddf0: ad01fff4 */ sw $at,-0xc($t0) -/* f00ddf4: 8dc1fff8 */ lw $at,-0x8($t6) -/* f00ddf8: ad01fff8 */ sw $at,-0x8($t0) -/* f00ddfc: 8dc1fffc */ lw $at,-0x4($t6) -/* f00de00: 15d9fff8 */ bne $t6,$t9,.L0f00dde4 -/* f00de04: ad01fffc */ sw $at,-0x4($t0) -/* f00de08: 8dc10000 */ lw $at,0x0($t6) -/* f00de0c: ad010000 */ sw $at,0x0($t0) -/* f00de10: 8dd90004 */ lw $t9,0x4($t6) -/* f00de14: ad190004 */ sw $t9,0x4($t0) -/* f00de18: 0fc1fe49 */ jal imageSlotSetImage -/* f00de1c: 920500d3 */ lbu $a1,0xd3($s0) -/* f00de20: 86090006 */ lh $t1,0x6($s0) -/* f00de24: 8fa500cc */ lw $a1,0xcc($sp) -/* f00de28: 05210085 */ bgez $t1,.L0f00e040 -/* f00de2c: 00000000 */ nop -/* f00de30: 8e0a0008 */ lw $t2,0x8($s0) -/* f00de34: 314b8000 */ andi $t3,$t2,0x8000 -/* f00de38: 15600081 */ bnez $t3,.L0f00e040 -/* f00de3c: 00000000 */ nop -/* f00de40: 860c0004 */ lh $t4,0x4($s0) -/* f00de44: afac00bc */ sw $t4,0xbc($sp) -/* f00de48: 860d00d0 */ lh $t5,0xd0($s0) -/* f00de4c: 0fc24801 */ jal setupGetPtrToCommandByIndex -/* f00de50: 01a52021 */ addu $a0,$t5,$a1 -/* f00de54: afa200b8 */ sw $v0,0xb8($sp) -/* f00de58: 0fc2486d */ jal propLoad -/* f00de5c: 8fa400bc */ lw $a0,0xbc($sp) -/* f00de60: 96180000 */ lhu $t8,0x0($s0) -/* f00de64: 3c03800a */ lui $v1,%hi(g_Vars) -/* f00de68: 24639fc0 */ addiu $v1,$v1,%lo(g_Vars) -/* f00de6c: 44982000 */ mtc1 $t8,$f4 -/* f00de70: 3c014f80 */ lui $at,0x4f80 -/* f00de74: 07010004 */ bgez $t8,.L0f00de88 -/* f00de78: 468021a0 */ cvt.s.w $f6,$f4 -/* f00de7c: 44814000 */ mtc1 $at,$f8 -/* f00de80: 00000000 */ nop -/* f00de84: 46083180 */ add.s $f6,$f6,$f8 -.L0f00de88: -/* f00de88: 3c013b80 */ lui $at,0x3b80 -/* f00de8c: 44815000 */ mtc1 $at,$f10 -/* f00de90: 8c6f0318 */ lw $t7,0x318($v1) -/* f00de94: 460a3402 */ mul.s $f16,$f6,$f10 -/* f00de98: 15e00004 */ bnez $t7,.L0f00deac -/* f00de9c: e7b000b0 */ swc1 $f16,0xb0($sp) -/* f00dea0: 8c79031c */ lw $t9,0x31c($v1) -/* f00dea4: 13200004 */ beqz $t9,.L0f00deb8 -/* f00dea8: 00000000 */ nop -.L0f00deac: -/* f00deac: 920e0002 */ lbu $t6,0x2($s0) -/* f00deb0: 35c80004 */ ori $t0,$t6,0x4 -/* f00deb4: a2080002 */ sb $t0,0x2($s0) -.L0f00deb8: -/* f00deb8: 0fc1a954 */ jal func0f06a550 -/* f00debc: 02002025 */ or $a0,$s0,$zero -/* f00dec0: 0fc1a1bc */ jal func0f0686f0 -/* f00dec4: afa200b4 */ sw $v0,0xb4($sp) -/* f00dec8: ae020048 */ sw $v0,0x48($s0) -/* f00decc: 8fa900b4 */ lw $t1,0xb4($sp) -/* f00ded0: 5120005e */ beqzl $t1,.L0f00e04c -/* f00ded4: 8e020014 */ lw $v0,0x14($s0) -/* f00ded8: 5040005c */ beqzl $v0,.L0f00e04c -/* f00dedc: 8e020014 */ lw $v0,0x14($s0) -/* f00dee0: 8e0b0040 */ lw $t3,0x40($s0) -/* f00dee4: 8e040018 */ lw $a0,0x18($s0) -/* f00dee8: 356c0040 */ ori $t4,$t3,0x40 -/* f00deec: ae0c0040 */ sw $t4,0x40($s0) -/* f00def0: c7a400b0 */ lwc1 $f4,0xb0($sp) -/* f00def4: c4920014 */ lwc1 $f18,0x14($a0) -/* f00def8: 46049202 */ mul.s $f8,$f18,$f4 -/* f00defc: 44054000 */ mfc1 $a1,$f8 -/* f00df00: 0c006bd6 */ jal modelSetUnk14 -/* f00df04: 00000000 */ nop -/* f00df08: 8fa300b8 */ lw $v1,0xb8($sp) -/* f00df0c: 8e180018 */ lw $t8,0x18($s0) -/* f00df10: 24010001 */ addiu $at,$zero,0x1 -/* f00df14: 8c6d0018 */ lw $t5,0x18($v1) -/* f00df18: af0d0018 */ sw $t5,0x18($t8) -/* f00df1c: 820200d2 */ lb $v0,0xd2($s0) -/* f00df20: 14400008 */ bnez $v0,.L0f00df44 -/* f00df24: 00000000 */ nop -/* f00df28: 8c6f0018 */ lw $t7,0x18($v1) -/* f00df2c: 00002825 */ or $a1,$zero,$zero -/* f00df30: 0c006a47 */ jal modelGetPart -/* f00df34: 8de40008 */ lw $a0,0x8($t7) -/* f00df38: 8e190018 */ lw $t9,0x18($s0) -/* f00df3c: 1000001a */ b .L0f00dfa8 -/* f00df40: af22001c */ sw $v0,0x1c($t9) -.L0f00df44: -/* f00df44: 54410009 */ bnel $v0,$at,.L0f00df6c -/* f00df48: 24010002 */ addiu $at,$zero,0x2 -/* f00df4c: 8c6e0018 */ lw $t6,0x18($v1) -/* f00df50: 24050001 */ addiu $a1,$zero,0x1 -/* f00df54: 0c006a47 */ jal modelGetPart -/* f00df58: 8dc40008 */ lw $a0,0x8($t6) -/* f00df5c: 8e080018 */ lw $t0,0x18($s0) -/* f00df60: 10000011 */ b .L0f00dfa8 -/* f00df64: ad02001c */ sw $v0,0x1c($t0) -/* f00df68: 24010002 */ addiu $at,$zero,0x2 -.L0f00df6c: -/* f00df6c: 54410009 */ bnel $v0,$at,.L0f00df94 -/* f00df70: 8c6b0018 */ lw $t3,0x18($v1) -/* f00df74: 8c690018 */ lw $t1,0x18($v1) -/* f00df78: 24050002 */ addiu $a1,$zero,0x2 -/* f00df7c: 0c006a47 */ jal modelGetPart -/* f00df80: 8d240008 */ lw $a0,0x8($t1) -/* f00df84: 8e0a0018 */ lw $t2,0x18($s0) -/* f00df88: 10000007 */ b .L0f00dfa8 -/* f00df8c: ad42001c */ sw $v0,0x1c($t2) -/* f00df90: 8c6b0018 */ lw $t3,0x18($v1) -.L0f00df94: -/* f00df94: 24050003 */ addiu $a1,$zero,0x3 -/* f00df98: 0c006a47 */ jal modelGetPart -/* f00df9c: 8d640008 */ lw $a0,0x8($t3) -/* f00dfa0: 8e0c0018 */ lw $t4,0x18($s0) -/* f00dfa4: ad82001c */ sw $v0,0x1c($t4) -.L0f00dfa8: -/* f00dfa8: 8fad00b8 */ lw $t5,0xb8($sp) -/* f00dfac: 8fa400b4 */ lw $a0,0xb4($sp) -/* f00dfb0: 0fc181a6 */ jal propReparent -/* f00dfb4: 8da50014 */ lw $a1,0x14($t5) -/* f00dfb8: 3c017f1b */ lui $at,%hi(var7f1a8058) -/* f00dfbc: c42c8058 */ lwc1 $f12,%lo(var7f1a8058)($at) -/* f00dfc0: 0c0058ba */ jal func000162e8 -/* f00dfc4: 27a50064 */ addiu $a1,$sp,0x64 -/* f00dfc8: 8faf00b8 */ lw $t7,0xb8($sp) -/* f00dfcc: 8e180018 */ lw $t8,0x18($s0) -/* f00dfd0: 27a50064 */ addiu $a1,$sp,0x64 -/* f00dfd4: 8df90018 */ lw $t9,0x18($t7) -/* f00dfd8: c7060014 */ lwc1 $f6,0x14($t8) -/* f00dfdc: c72a0014 */ lwc1 $f10,0x14($t9) -/* f00dfe0: 0c0057c1 */ jal func00015f04 -/* f00dfe4: 460a3303 */ div.s $f12,$f6,$f10 -/* f00dfe8: 8e040018 */ lw $a0,0x18($s0) -/* f00dfec: 0c006b43 */ jal modelGetRootPosition -/* f00dff0: 27a500a4 */ addiu $a1,$sp,0xa4 -/* f00dff4: c7b000a4 */ lwc1 $f16,0xa4($sp) -/* f00dff8: c7a400a8 */ lwc1 $f4,0xa8($sp) -/* f00dffc: c7a600ac */ lwc1 $f6,0xac($sp) -/* f00e000: 46008487 */ neg.s $f18,$f16 -/* f00e004: 46002207 */ neg.s $f8,$f4 -/* f00e008: 46003287 */ neg.s $f10,$f6 -/* f00e00c: e7b200a4 */ swc1 $f18,0xa4($sp) -/* f00e010: e7a800a8 */ swc1 $f8,0xa8($sp) -/* f00e014: e7aa00ac */ swc1 $f10,0xac($sp) -/* f00e018: 27a400a4 */ addiu $a0,$sp,0xa4 -/* f00e01c: 0c0059b7 */ jal func000166dc -/* f00e020: 27a50024 */ addiu $a1,$sp,0x24 -/* f00e024: 8e060048 */ lw $a2,0x48($s0) -/* f00e028: 27a40064 */ addiu $a0,$sp,0x64 -/* f00e02c: 27a50024 */ addiu $a1,$sp,0x24 -/* f00e030: 0c0056f9 */ jal func00015be4 -/* f00e034: 24c60004 */ addiu $a2,$a2,0x4 -/* f00e038: 10000004 */ b .L0f00e04c -/* f00e03c: 8e020014 */ lw $v0,0x14($s0) -.L0f00e040: -/* f00e040: 0fc033b9 */ jal setupGenericObject -/* f00e044: 02002025 */ or $a0,$s0,$zero -/* f00e048: 8e020014 */ lw $v0,0x14($s0) -.L0f00e04c: -/* f00e04c: 50400009 */ beqzl $v0,.L0f00e074 -/* f00e050: 8fbf001c */ lw $ra,0x1c($sp) -/* f00e054: 8e0e0008 */ lw $t6,0x8($s0) -/* f00e058: 000e4040 */ sll $t0,$t6,0x1 -/* f00e05c: 05030005 */ bgezl $t0,.L0f00e074 -/* f00e060: 8fbf001c */ lw $ra,0x1c($sp) -/* f00e064: 90490001 */ lbu $t1,0x1($v0) -/* f00e068: 352a0001 */ ori $t2,$t1,0x1 -/* f00e06c: a04a0001 */ sb $t2,0x1($v0) -/* f00e070: 8fbf001c */ lw $ra,0x1c($sp) -.L0f00e074: -/* f00e074: 8fb00018 */ lw $s0,0x18($sp) -/* f00e078: 27bd00c8 */ addiu $sp,$sp,0xc8 -/* f00e07c: 03e00008 */ jr $ra -/* f00e080: 00000000 */ nop -); +void setupSingleMonitor(struct singlemonitorobj *monitor, s32 cmdindex) +{ + u32 stack[2]; + + monitor->screen = var8009ce98; + imageSlotSetImage(&monitor->screen, monitor->imagenum); + + // The setup files never place any monitors on a -1 pad, so this code is + // unreachable. It appears to allow attaching monitors to other objects. + if (monitor->base.pad < 0 && (monitor->base.flags & OBJFLAG_00008000) == 0) { + s32 modelnum = monitor->base.modelnum; + struct defaultobj *owner = (struct defaultobj *)setupGetPtrToCommandByIndex(cmdindex + monitor->owneroffset); + struct prop *prop; + f32 scale; + struct coord spa4; + f32 sp64[16]; + f32 sp24[16]; + + propLoad(modelnum); + + scale = monitor->base.extrascale * (1.0f / 256.0f); + + if (g_Vars.normmplayerisrunning || g_Vars.lvmpbotlevel) { + monitor->base.hidden2 |= OBJH2FLAG_04; + } + + prop = func0f06a550(monitor); + monitor->base.unk48 = func0f0686f0(); + + if (prop && monitor->base.unk48) { + monitor->base.hidden |= OBJHFLAG_00000040; + modelSetUnk14(monitor->base.model, monitor->base.model->unk14 * scale); + monitor->base.model->attachedto = owner->model; + + if (monitor->ownerpart == 0) { + monitor->base.model->unk1c = modelGetPart(owner->model->unk08, 0); + } else if (monitor->ownerpart == 1) { + monitor->base.model->unk1c = modelGetPart(owner->model->unk08, 1); + } else if (monitor->ownerpart == 2) { + monitor->base.model->unk1c = modelGetPart(owner->model->unk08, 2); + } else { + monitor->base.model->unk1c = modelGetPart(owner->model->unk08, 3); + } + + propReparent(prop, owner->prop); + func000162e8(0.3664608001709f, sp64); + func00015f04(monitor->base.model->unk14 / owner->model->unk14, sp64); + modelGetRootPosition(monitor->base.model, &spa4); + + spa4.x = -spa4.x; + spa4.y = -spa4.y; + spa4.z = -spa4.z; + + func000166dc(&spa4, sp24); + func00015be4((u32)sp64, (struct model0c *)sp24, (f32 *)&monitor->base.unk48->unk004); + } + } else { + setupGenericObject(&monitor->base, cmdindex); + } + + if (monitor->base.prop && (monitor->base.flags & OBJFLAG_40000000)) { + monitor->base.prop->flags |= PROPFLAG_01; + } +} void setupMultiMonitor(struct multimonitorobj *monitor, s32 cmdindex) { diff --git a/src/include/constants.h b/src/include/constants.h index f4c52e771..b3f80f0e1 100644 --- a/src/include/constants.h +++ b/src/include/constants.h @@ -2115,6 +2115,7 @@ #define OBJFLAG_08000000 0x08000000 // Not used in scripts #define OBJFLAG_DEACTIVATED 0x10000000 #define OBJFLAG_20000000 0x20000000 // Editor: "Door Opens Backwards/Special Function/Conceal Weapon" +#define OBJFLAG_40000000 0x40000000 #define OBJFLAG_DOOR_KEEPOPEN 0x40000000 // Editor: "Door open by default/Empty weapon" #define OBJFLAG_LIFT_TRIGGERDISABLE 0x40000000 #define OBJFLAG_CHOPPER_INACTIVE 0x80000000 // Or lift disabled, or hovercar something @@ -2400,6 +2401,7 @@ #define PORTALMODE_SHOW 0 #define PORTALMODE_HIDE 1 +#define PROPFLAG_01 0x01 #define PROPFLAG_02 0x02 #define PROPFLAG_TANGIBLE 0x04 #define PROPFLAG_08 0x08 diff --git a/src/include/game/propobj.h b/src/include/game/propobj.h index 2c95a8c7c..641572198 100644 --- a/src/include/game/propobj.h +++ b/src/include/game/propobj.h @@ -60,7 +60,7 @@ u32 func0f06843c(void); void func0f0685e4(struct prop *prop); u32 func0f068694(void); u32 func0f0686e0(void); -u32 func0f0686f0(void); +struct obj48 *func0f0686f0(void); u32 func0f068760(void); u32 func0f0687b8(struct defaultobj *obj); u32 func0f0687e4(void); @@ -86,7 +86,7 @@ u32 func0f069d38(void); u32 func0f06a170(void); u32 func0f06a1ec(void); u32 func0f06a52c(void); -u32 func0f06a550(void); +struct prop *func0f06a550(struct singlemonitorobj *monitor); u32 func0f06a580(void); f32 func0f06a620(struct defaultobj *obj); void func0f06a730(struct defaultobj *obj, struct pad *newpad, f32 *matrix, s16 *arg3, struct pad *arg4); diff --git a/src/include/lib/lib_16110.h b/src/include/lib/lib_16110.h index 5309c39d5..500b13f7f 100644 --- a/src/include/lib/lib_16110.h +++ b/src/include/lib/lib_16110.h @@ -15,7 +15,7 @@ void func00016400(f32 arg0, f32 *matrix); void func0001648c(f32 *matrix, f32 *arg1); u32 func000165d8(void); u32 func000166a4(void); -u32 func000166dc(void); +void func000166dc(struct coord *pos, f32 *matrix); u32 func00016710(void); void func00016748(f32 arg0); u32 func00016760(void); diff --git a/src/include/types.h b/src/include/types.h index a1c7ec2cd..5296bd3c5 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -274,7 +274,7 @@ struct model08 { // raw model file data f32 unk10; }; -struct model0c { +struct model0c { // matrix /*0x00*/ u32 unk00; /*0x04*/ u32 unk04; /*0x08*/ u32 unk08; @@ -297,11 +297,11 @@ struct model { /*0x01*/ u8 unk01; /*0x04*/ struct chrdata *chr; /*0x08*/ struct model08 *unk08; - /*0x0c*/ struct model0c *unk0c; + /*0x0c*/ struct model0c *unk0c; // matrix /*0x10*/ void *datas; // array of pointers to modeldata structs /*0x14*/ f32 unk14; - /*0x18*/ u32 unk18; - /*0x1c*/ u32 unk1c; + /*0x18*/ struct model *attachedto; + /*0x1c*/ struct modelnode *unk1c; /*0x20*/ struct anim *anim; }; @@ -1284,27 +1284,11 @@ struct weaponobj { // objtype 0x08 }; struct singlemonitorobj { // objtype 0x0a - /*0x00*/ u16 extrascale; - /*0x02*/ u8 hidden2; - /*0x03*/ u8 type; - /*0x04*/ u16 obj; - /*0x06*/ u16 pad; - /*0x08*/ u32 flags; - /*0x0c*/ u32 flags2; - /*0x10*/ u32 flags3; - /*0x14*/ struct prop *prop; - /*0x18*/ u32 unk18; - /*0x1c*/ f32 realrot[9]; - /*0x40*/ u32 hidden; - /*0x44*/ u32 unk44; - /*0x48*/ u32 unk48; - /*0x4c*/ s16 damage; - /*0x4e*/ u16 maxdamage; - /*0x50*/ u32 shadecol; - /*0x54*/ u32 nextcol; - /*0x58*/ u16 floorcol; - /*0x5a*/ u8 numtiles; + struct defaultobj base; /*0x5c*/ struct monitorscreen screen; + /*0xd0*/ s16 owneroffset; + /*0xd2*/ s8 ownerpart; + /*0xd3*/ u8 imagenum; }; struct multimonitorobj { // objtype 0x0b