diff --git a/src/game/data/data_000000.c b/src/game/data/data_000000.c index 30412f5da..f5e76aa8f 100644 --- a/src/game/data/data_000000.c +++ b/src/game/data/data_000000.c @@ -6939,7 +6939,7 @@ u32 var80061410 = 0xe7000000; u32 var80061414 = 0x00000000; u32 var80061418 = 0xb8000000; u32 var8006141c = 0x00000000; -u32 var80061420 = 0x00000000; +struct var80061420 *var80061420 = NULL; u32 var80061424 = 0x00000000; u32 var80061428 = 0x00000000; u32 var8006142c = 0x00000000; diff --git a/src/game/dlights.c b/src/game/dlights.c index c3c502164..ab6d9a3a4 100644 --- a/src/game/dlights.c +++ b/src/game/dlights.c @@ -3157,136 +3157,37 @@ void func0f004384(void) // empty } -GLOBAL_ASM( -glabel func0f00438c -.late_rodata -glabel var7f1a7dd8 -.word 0x3b808081 -.text -/* f00438c: 27bdff80 */ addiu $sp,$sp,-128 -/* f004390: afbe0050 */ sw $s8,0x50($sp) -/* f004394: 3c1e8006 */ lui $s8,%hi(var80061420) -/* f004398: 27de1420 */ addiu $s8,$s8,%lo(var80061420) -/* f00439c: 8fc30000 */ lw $v1,0x0($s8) -/* f0043a0: afb7004c */ sw $s7,0x4c($sp) -/* f0043a4: afb60048 */ sw $s6,0x48($sp) -/* f0043a8: 00a0b025 */ or $s6,$a1,$zero -/* f0043ac: 00c0b825 */ or $s7,$a2,$zero -/* f0043b0: afbf0054 */ sw $ra,0x54($sp) -/* f0043b4: afb50044 */ sw $s5,0x44($sp) -/* f0043b8: afb40040 */ sw $s4,0x40($sp) -/* f0043bc: afb3003c */ sw $s3,0x3c($sp) -/* f0043c0: afb20038 */ sw $s2,0x38($sp) -/* f0043c4: afb10034 */ sw $s1,0x34($sp) -/* f0043c8: afb00030 */ sw $s0,0x30($sp) -/* f0043cc: f7b80028 */ sdc1 $f24,0x28($sp) -/* f0043d0: f7b60020 */ sdc1 $f22,0x20($sp) -/* f0043d4: f7b40018 */ sdc1 $f20,0x18($sp) -/* f0043d8: 10600050 */ beqz $v1,.L0f00451c -/* f0043dc: 00803825 */ or $a3,$a0,$zero -/* f0043e0: 3c15800a */ lui $s5,%hi(g_Rooms) -/* f0043e4: 000488c0 */ sll $s1,$a0,0x3 -/* f0043e8: 02248821 */ addu $s1,$s1,$a0 -/* f0043ec: 26b54928 */ addiu $s5,$s5,%lo(g_Rooms) -/* f0043f0: 8eae0000 */ lw $t6,0x0($s5) -/* f0043f4: 00118880 */ sll $s1,$s1,0x2 -/* f0043f8: 02248823 */ subu $s1,$s1,$a0 -/* f0043fc: 00118880 */ sll $s1,$s1,0x2 -/* f004400: 01d17821 */ addu $t7,$t6,$s1 -/* f004404: 95f80000 */ lhu $t8,0x0($t7) -/* f004408: 00001025 */ or $v0,$zero,$zero -/* f00440c: 27b20078 */ addiu $s2,$sp,0x78 -/* f004410: 33198000 */ andi $t9,$t8,0x8000 -/* f004414: 13200003 */ beqz $t9,.L0f004424 -/* f004418: 27b30074 */ addiu $s3,$sp,0x74 -/* f00441c: 10000001 */ b .L0f004424 -/* f004420: 24020001 */ addiu $v0,$zero,0x1 -.L0f004424: -/* f004424: 1440003d */ bnez $v0,.L0f00451c -/* f004428: 000780c0 */ sll $s0,$a3,0x3 -/* f00442c: afa00078 */ sw $zero,0x78($sp) -/* f004430: afa00074 */ sw $zero,0x74($sp) -/* f004434: 00704021 */ addu $t0,$v1,$s0 -/* f004438: 8d040004 */ lw $a0,0x4($t0) -/* f00443c: 02402825 */ or $a1,$s2,$zero -/* f004440: 0fc5df23 */ jal func0f177c8c -/* f004444: 02603025 */ or $a2,$s3,$zero -/* f004448: 2414ffff */ addiu $s4,$zero,-1 -/* f00444c: 10540033 */ beq $v0,$s4,.L0f00451c -/* f004450: 3c0140a0 */ lui $at,0x40a0 -/* f004454: 44962000 */ mtc1 $s6,$f4 -/* f004458: 4481c000 */ mtc1 $at,$f24 -/* f00445c: 3c017f1a */ lui $at,%hi(var7f1a7dd8) -/* f004460: c4367dd8 */ lwc1 $f22,%lo(var7f1a7dd8)($at) -/* f004464: 46802520 */ cvt.s.w $f20,$f4 -/* f004468: 44823000 */ mtc1 $v0,$f6 -.L0f00446c: -/* f00446c: 00001025 */ or $v0,$zero,$zero -/* f004470: 46803220 */ cvt.s.w $f8,$f6 -/* f004474: 46164282 */ mul.s $f10,$f8,$f22 -/* f004478: 00000000 */ nop -/* f00447c: 46145402 */ mul.s $f16,$f10,$f20 -/* f004480: 00000000 */ nop -/* f004484: 46188002 */ mul.s $f0,$f16,$f24 -/* f004488: 1ac00007 */ blez $s6,.L0f0044a8 -/* f00448c: 46000086 */ mov.s $f2,$f0 -/* f004490: 4600a03c */ c.lt.s $f20,$f0 -/* f004494: 00000000 */ nop -/* f004498: 45020009 */ bc1fl .L0f0044c0 -/* f00449c: 8ea90000 */ lw $t1,0x0($s5) -/* f0044a0: 10000006 */ b .L0f0044bc -/* f0044a4: 4600a086 */ mov.s $f2,$f20 -.L0f0044a8: -/* f0044a8: 4614003c */ c.lt.s $f0,$f20 -/* f0044ac: 00000000 */ nop -/* f0044b0: 45020003 */ bc1fl .L0f0044c0 -/* f0044b4: 8ea90000 */ lw $t1,0x0($s5) -/* f0044b8: 4600a086 */ mov.s $f2,$f20 -.L0f0044bc: -/* f0044bc: 8ea90000 */ lw $t1,0x0($s5) -.L0f0044c0: -/* f0044c0: 01315021 */ addu $t2,$t1,$s1 -/* f0044c4: 954b0000 */ lhu $t3,0x0($t2) -/* f0044c8: 316c8000 */ andi $t4,$t3,0x8000 -/* f0044cc: 11800003 */ beqz $t4,.L0f0044dc -/* f0044d0: 00000000 */ nop -/* f0044d4: 10000001 */ b .L0f0044dc -/* f0044d8: 24020001 */ addiu $v0,$zero,0x1 -.L0f0044dc: -/* f0044dc: 54400008 */ bnezl $v0,.L0f004500 -/* f0044e0: 8fce0000 */ lw $t6,0x0($s8) -/* f0044e4: 4600148d */ trunc.w.s $f18,$f2 -/* f0044e8: 8fa40074 */ lw $a0,0x74($sp) -/* f0044ec: 02e03025 */ or $a2,$s7,$zero -/* f0044f0: 44059000 */ mfc1 $a1,$f18 -/* f0044f4: 0fc01156 */ jal func0f004558 -/* f0044f8: 00000000 */ nop -/* f0044fc: 8fce0000 */ lw $t6,0x0($s8) -.L0f004500: -/* f004500: 02402825 */ or $a1,$s2,$zero -/* f004504: 02603025 */ or $a2,$s3,$zero -/* f004508: 01d07821 */ addu $t7,$t6,$s0 -/* f00450c: 0fc5df23 */ jal func0f177c8c -/* f004510: 8de40004 */ lw $a0,0x4($t7) -/* f004514: 5454ffd5 */ bnel $v0,$s4,.L0f00446c -/* f004518: 44823000 */ mtc1 $v0,$f6 -.L0f00451c: -/* f00451c: 8fbf0054 */ lw $ra,0x54($sp) -/* f004520: d7b40018 */ ldc1 $f20,0x18($sp) -/* f004524: d7b60020 */ ldc1 $f22,0x20($sp) -/* f004528: d7b80028 */ ldc1 $f24,0x28($sp) -/* f00452c: 8fb00030 */ lw $s0,0x30($sp) -/* f004530: 8fb10034 */ lw $s1,0x34($sp) -/* f004534: 8fb20038 */ lw $s2,0x38($sp) -/* f004538: 8fb3003c */ lw $s3,0x3c($sp) -/* f00453c: 8fb40040 */ lw $s4,0x40($sp) -/* f004540: 8fb50044 */ lw $s5,0x44($sp) -/* f004544: 8fb60048 */ lw $s6,0x48($sp) -/* f004548: 8fb7004c */ lw $s7,0x4c($sp) -/* f00454c: 8fbe0050 */ lw $s8,0x50($sp) -/* f004550: 03e00008 */ jr $ra -/* f004554: 27bd0080 */ addiu $sp,$sp,0x80 -); +void func0f00438c(s32 roomnum, s32 start, s32 limit) +{ + if (var80061420 && !(g_Rooms[roomnum].flags & ROOMFLAG_OUTDOORS ? 1 : 0)) { + s32 value; + s32 sp78 = 0; + s32 neighbournum = 0; + + value = func0f177c8c(var80061420[roomnum].unk04, &sp78, &neighbournum); + + while (value != -1) { + f32 increment = value * 0.0039215688593686f * start * 5.0f; + + if (start > 0) { + if (increment > start) { + increment = start; + } + } else { + if (increment < start) { + increment = start; + } + } + + // @bug: Should be checking neighbournum flags, not roomnum + if (!(g_Rooms[roomnum].flags & ROOMFLAG_OUTDOORS ? 1 : 0)) { + func0f004558(neighbournum, increment, limit); + } + + value = func0f177c8c(var80061420[roomnum].unk04, &sp78, &neighbournum); + } + } +} void func0f004558(s32 roomnum, s32 increment, s32 limit) { diff --git a/src/include/game/data/data_000000.h b/src/include/game/data/data_000000.h index 4fb8b2f05..91984d3a0 100644 --- a/src/include/game/data/data_000000.h +++ b/src/include/game/data/data_000000.h @@ -185,7 +185,7 @@ extern u32 var80061344; extern u32 var80061360; extern u32 var80061380; extern u32 var800613a0; -extern u32 var80061420; +extern struct var80061420 *var80061420; extern u32 var80061424; extern u32 var8006142c; extern u32 var80061430; diff --git a/src/include/game/dlights.h b/src/include/game/dlights.h index 1eb67d481..2c6e2eb74 100644 --- a/src/include/game/dlights.h +++ b/src/include/game/dlights.h @@ -40,7 +40,7 @@ void func0f0035c0(void); void func0f00372c(void); void func0f0037ac(void); void func0f004314(void); -void func0f00438c(s16 roomnum, u32 arg1, u32 arg2); +void func0f00438c(s32 roomnum, s32 start, s32 limit); void func0f004558(s32 roomnum, s32 increment, s32 limit); u32 func0f004604(void); void func0f004c6c(void); diff --git a/src/include/game/utils.h b/src/include/game/utils.h index cfac30472..f7352307c 100644 --- a/src/include/game/utils.h +++ b/src/include/game/utils.h @@ -17,6 +17,6 @@ u32 func0f17776c(void); void func0f1777f8(void); u32 func0f177a54(void); u32 func0f177bb4(void); -u32 func0f177c8c(void); +s32 func0f177c8c(s32 arg0, s32 *arg1, s32 *arg2); #endif diff --git a/src/include/types.h b/src/include/types.h index adba0690d..55127fdfc 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -6383,4 +6383,9 @@ struct light { /*0x0a*/ struct vec3s16 bbox[4]; }; +struct var80061420 { + s32 unk00; + s32 unk04; +}; + #endif