diff --git a/src/game/game_12f6c0.c b/src/game/game_12f6c0.c index c4eea2fe1..c4f0d5f90 100644 --- a/src/game/game_12f6c0.c +++ b/src/game/game_12f6c0.c @@ -31,8 +31,8 @@ const u32 var7f1b561c[] = {0x00000000}; GLOBAL_ASM( glabel func0f12f6c0 -/* f12f6c0: 3c03800a */ lui $v1,%hi(var800a3fc0) -/* f12f6c4: 24633fc0 */ addiu $v1,$v1,%lo(var800a3fc0) +/* f12f6c0: 3c03800a */ lui $v1,%hi(g_NextSparkIndex) +/* f12f6c4: 24633fc0 */ addiu $v1,$v1,%lo(g_NextSparkIndex) /* f12f6c8: 8c620000 */ lw $v0,0x0($v1) /* f12f6cc: 24010064 */ addiu $at,$zero,0x64 /* f12f6d0: 27bdffd8 */ addiu $sp,$sp,-40 @@ -212,51 +212,25 @@ glabel func0f12f6c0 /* f12f958: 27bd0028 */ addiu $sp,$sp,0x28 ); -GLOBAL_ASM( -glabel func0f12f95c -/* f12f95c: 3c03800a */ lui $v1,%hi(g_SparkGroups) -/* f12f960: 3c07800a */ lui $a3,%hi(var800a4130) -/* f12f964: 3c05800a */ lui $a1,%hi(var800a3fc0) -/* f12f968: 24a53fc0 */ addiu $a1,$a1,%lo(var800a3fc0) -/* f12f96c: 24e74130 */ addiu $a3,$a3,%lo(var800a4130) -/* f12f970: 24633fc8 */ addiu $v1,$v1,%lo(g_SparkGroups) -/* f12f974: 24060064 */ addiu $a2,$zero,0x64 -.L0f12f978: -/* f12f978: 50830019 */ beql $a0,$v1,.L0f12f9e0 -/* f12f97c: 24630024 */ addiu $v1,$v1,0x24 -/* f12f980: 8c62000c */ lw $v0,0xc($v1) -/* f12f984: 8cae0000 */ lw $t6,0x0($a1) -/* f12f988: 244f0001 */ addiu $t7,$v0,0x1 -/* f12f98c: 55c20014 */ bnel $t6,$v0,.L0f12f9e0 -/* f12f990: 24630024 */ addiu $v1,$v1,0x24 -/* f12f994: 01e6001a */ div $zero,$t7,$a2 -/* f12f998: 8c790004 */ lw $t9,0x4($v1) -/* f12f99c: 0000c010 */ mfhi $t8 -/* f12f9a0: ac78000c */ sw $t8,0xc($v1) -/* f12f9a4: 2728ffff */ addiu $t0,$t9,-1 -/* f12f9a8: 14c00002 */ bnez $a2,.L0f12f9b4 -/* f12f9ac: 00000000 */ sll $zero,$zero,0x0 -/* f12f9b0: 0007000d */ break 0x7 -.L0f12f9b4: -/* f12f9b4: 2401ffff */ addiu $at,$zero,-1 -/* f12f9b8: 14c10004 */ bne $a2,$at,.L0f12f9cc -/* f12f9bc: 3c018000 */ lui $at,0x8000 -/* f12f9c0: 15e10002 */ bne $t7,$at,.L0f12f9cc -/* f12f9c4: 00000000 */ sll $zero,$zero,0x0 -/* f12f9c8: 0006000d */ break 0x6 -.L0f12f9cc: -/* f12f9cc: ac680004 */ sw $t0,0x4($v1) -/* f12f9d0: 15000002 */ bnez $t0,.L0f12f9dc -/* f12f9d4: 01004825 */ or $t1,$t0,$zero -/* f12f9d8: ac600008 */ sw $zero,0x8($v1) -.L0f12f9dc: -/* f12f9dc: 24630024 */ addiu $v1,$v1,0x24 -.L0f12f9e0: -/* f12f9e0: 1467ffe5 */ bne $v1,$a3,.L0f12f978 -/* f12f9e4: 00000000 */ sll $zero,$zero,0x0 -/* f12f9e8: 03e00008 */ jr $ra -/* f12f9ec: 00000000 */ sll $zero,$zero,0x0 -); +/** + * This function handles an out-of-memory situation when creating a spark, by + * shrinking whichever spark group was about to be overwritten. + */ +void sparkgroupEnsureFreeSparkSlot(struct sparkgroup *group) +{ + s32 i; + + for (i = 0; i < 10; i++) { + if (&g_SparkGroups[i] != group && g_SparkGroups[i].startindex == g_NextSparkIndex) { + g_SparkGroups[i].startindex = (g_SparkGroups[i].startindex + 1) % 100; + g_SparkGroups[i].numsparks--; + + if (g_SparkGroups[i].numsparks == 0) { + g_SparkGroups[i].age = 0; + } + } + } +} GLOBAL_ASM( glabel func0f12f9f0 @@ -603,9 +577,9 @@ glabel func0f12f9f0 /* f12fee0: 8fb80084 */ lw $t8,0x84($sp) /* f12fee4: 24090001 */ addiu $t1,$zero,0x1 /* f12fee8: ae290008 */ sw $t1,0x8($s1) -/* f12feec: 3c19800a */ lui $t9,%hi(var800a3fc0) +/* f12feec: 3c19800a */ lui $t9,%hi(g_NextSparkIndex) /* f12fef0: ae380000 */ sw $t8,0x0($s1) -/* f12fef4: 8f393fc0 */ lw $t9,%lo(var800a3fc0)($t9) +/* f12fef4: 8f393fc0 */ lw $t9,%lo(g_NextSparkIndex)($t9) /* f12fef8: ae39000c */ sw $t9,0xc($s1) /* f12fefc: 960b0014 */ lhu $t3,0x14($s0) /* f12ff00: ae2b0004 */ sw $t3,0x4($s1) @@ -626,7 +600,7 @@ glabel func0f12f9f0 /* f12ff3c: 19a0000d */ blez $t5,.L0f12ff74 /* f12ff40: 02202025 */ or $a0,$s1,$zero .L0f12ff44: -/* f12ff44: 0fc4be57 */ jal func0f12f95c +/* f12ff44: 0fc4be57 */ jal sparkgroupEnsureFreeSparkSlot /* f12ff48: afa30058 */ sw $v1,0x58($sp) /* f12ff4c: 27a4005c */ addiu $a0,$sp,0x5c /* f12ff50: 0fc4bdb0 */ jal func0f12f6c0 diff --git a/src/game/sparksreset.c b/src/game/sparksreset.c index 5ef0c6cdd..3b2fff477 100644 --- a/src/game/sparksreset.c +++ b/src/game/sparksreset.c @@ -13,7 +13,7 @@ void sparksReset(void) { s32 i; - var800a3fc0 = 0; + g_NextSparkIndex = 0; for (i = 0; i < 10; i++) { g_SparkGroups[i].age = 0; diff --git a/src/game/sparkstick.c b/src/game/sparkstick.c index 65c06cb69..9158d0d01 100644 --- a/src/game/sparkstick.c +++ b/src/game/sparkstick.c @@ -29,14 +29,14 @@ glabel sparksTick /* f01e080: 3c02800a */ lui $v0,%hi(g_SparkGroups) /* f01e084: 3c017f1b */ lui $at,%hi(var7f1a8680) /* f01e088: 3c15800a */ lui $s5,%hi(g_Vars) -/* f01e08c: 3c14800a */ lui $s4,%hi(var800a3fc0) +/* f01e08c: 3c14800a */ lui $s4,%hi(g_NextSparkIndex) /* f01e090: 3c12800a */ lui $s2,%hi(g_Sparks) /* f01e094: 3c0c8008 */ lui $t4,%hi(g_SparkTypes) /* f01e098: 44807000 */ mtc1 $zero,$f14 /* f01e09c: 24423fc8 */ addiu $v0,$v0,%lo(g_SparkGroups) /* f01e0a0: 258cec80 */ addiu $t4,$t4,%lo(g_SparkTypes) /* f01e0a4: 265234d0 */ addiu $s2,$s2,%lo(g_Sparks) -/* f01e0a8: 26943fc0 */ addiu $s4,$s4,%lo(var800a3fc0) +/* f01e0a8: 26943fc0 */ addiu $s4,$s4,%lo(g_NextSparkIndex) /* f01e0ac: 26b59fc0 */ addiu $s5,$s5,%lo(g_Vars) /* f01e0b0: c4308680 */ lwc1 $f16,%lo(var7f1a8680)($at) /* f01e0b4: 00001825 */ or $v1,$zero,$zero diff --git a/src/gvars/gvars.c b/src/gvars/gvars.c index e3b8567bb..c45eb0ce4 100644 --- a/src/gvars/gvars.c +++ b/src/gvars/gvars.c @@ -16616,7 +16616,7 @@ u32 var800a34c4 = 0; u32 var800a34c8 = 0; u32 var800a34cc = 0; struct spark g_Sparks[100] = {0}; -u32 var800a3fc0 = 0; +u32 g_NextSparkIndex = 0; u32 var800a3fc4 = 0; struct sparkgroup g_SparkGroups[10] = {0}; u32 var800a4130 = 0; diff --git a/src/include/game/game_12f6c0.h b/src/include/game/game_12f6c0.h index 9dfa0e50c..1fbfee837 100644 --- a/src/include/game/game_12f6c0.h +++ b/src/include/game/game_12f6c0.h @@ -4,7 +4,7 @@ #include "types.h" u32 func0f12f6c0(void); -u32 func0f12f95c(void); +void sparkgroupEnsureFreeSparkSlot(struct sparkgroup *group); void func0f12f9f0(s32 room, struct prop *prop, struct coord *pos, s32 arg3, s32 arg4, s32 arg5); u32 func0f130044(void); diff --git a/src/include/gvars/gvars.h b/src/include/gvars/gvars.h index ba2fd7e89..82629d0b1 100644 --- a/src/include/gvars/gvars.h +++ b/src/include/gvars/gvars.h @@ -690,7 +690,7 @@ extern s32 g_NumSmokes; extern u32 var800a3448; extern u32 var800a3488; extern struct spark g_Sparks[100]; -extern u32 var800a3fc0; // likely a count of g_SparkGroups +extern u32 g_NextSparkIndex; extern struct sparkgroup g_SparkGroups[]; extern u32 var800a4130; extern u32 var800a4154;