diff --git a/src/game/explosions/init.c b/src/game/explosions/init.c index 43708c754..4e27ea88d 100644 --- a/src/game/explosions/init.c +++ b/src/game/explosions/init.c @@ -34,7 +34,7 @@ void explosionsInit(void) for (i = 0; i < g_MaxExplosions; i++) { g_Explosions[i].prop = NULL; - for (j = 0; j < 40; j++) { + for (j = 0; j < ARRAYCOUNT(g_Explosions[i].parts); j++) { g_Explosions[i].parts[j].frame = 0; } } diff --git a/src/game/smoke/free.c b/src/game/smoke/free.c index 02b5cb458..a7aff4ea2 100644 --- a/src/game/smoke/free.c +++ b/src/game/smoke/free.c @@ -16,7 +16,7 @@ void smokeFree(void) s32 i; if (g_Smokes) { - for (i = 0; i < g_NumSmokes; i++) { + for (i = 0; i < g_MaxSmokes; i++) { if (g_Smokes[i].prop) { func0f0605c4(g_Smokes[i].prop); propHide(g_Smokes[i].prop); diff --git a/src/game/smoke/init.c b/src/game/smoke/init.c index 8c4c61c0d..c64012b98 100644 --- a/src/game/smoke/init.c +++ b/src/game/smoke/init.c @@ -11,89 +11,28 @@ #include "lib/lib_121e0.h" #include "types.h" -GLOBAL_ASM( -glabel smokeInit -/* f013130: 3c0e8009 */ lui $t6,%hi(g_Is4Mb) -/* f013134: 91ce0af0 */ lbu $t6,%lo(g_Is4Mb)($t6) -/* f013138: 27bdffe8 */ addiu $sp,$sp,-24 -/* f01313c: 24010001 */ addiu $at,$zero,0x1 -/* f013140: 15c10006 */ bne $t6,$at,.L0f01315c -/* f013144: afbf0014 */ sw $ra,0x14($sp) -/* f013148: 3c08800a */ lui $t0,%hi(g_NumSmokes) -/* f01314c: 25083444 */ addiu $t0,$t0,%lo(g_NumSmokes) -/* f013150: 240f000a */ addiu $t7,$zero,0xa -/* f013154: 10000005 */ b .L0f01316c -/* f013158: ad0f0000 */ sw $t7,0x0($t0) -.L0f01315c: -/* f01315c: 3c08800a */ lui $t0,%hi(g_NumSmokes) -/* f013160: 25083444 */ addiu $t0,$t0,%lo(g_NumSmokes) -/* f013164: 24180014 */ addiu $t8,$zero,0x14 -/* f013168: ad180000 */ sw $t8,0x0($t0) -.L0f01316c: -/* f01316c: 3c19800a */ lui $t9,%hi(g_Vars+0x4b4) -/* f013170: 8f39a474 */ lw $t9,%lo(g_Vars+0x4b4)($t9) -/* f013174: 3c05800a */ lui $a1,%hi(g_Smokes) -/* f013178: 24a53440 */ addiu $a1,$a1,%lo(g_Smokes) -/* f01317c: 2b21005a */ slti $at,$t9,0x5a -/* f013180: 54200003 */ bnezl $at,.L0f013190 -/* f013184: 8d020000 */ lw $v0,0x0($t0) -/* f013188: ad000000 */ sw $zero,0x0($t0) -/* f01318c: 8d020000 */ lw $v0,0x0($t0) -.L0f013190: -/* f013190: 54400004 */ bnezl $v0,.L0f0131a4 -/* f013194: 00022080 */ sll $a0,$v0,0x2 -/* f013198: 1000002c */ b .L0f01324c -/* f01319c: aca00000 */ sw $zero,0x0($a1) -/* f0131a0: 00022080 */ sll $a0,$v0,0x2 -.L0f0131a4: -/* f0131a4: 00822023 */ subu $a0,$a0,$v0 -/* f0131a8: 00042080 */ sll $a0,$a0,0x2 -/* f0131ac: 00822021 */ addu $a0,$a0,$v0 -/* f0131b0: 000420c0 */ sll $a0,$a0,0x3 -/* f0131b4: 00822023 */ subu $a0,$a0,$v0 -/* f0131b8: 00042080 */ sll $a0,$a0,0x2 -/* f0131bc: 0c0048f2 */ jal malloc -/* f0131c0: 24050004 */ addiu $a1,$zero,0x4 -/* f0131c4: 3c08800a */ lui $t0,%hi(g_NumSmokes) -/* f0131c8: 25083444 */ addiu $t0,$t0,%lo(g_NumSmokes) -/* f0131cc: 8d090000 */ lw $t1,0x0($t0) -/* f0131d0: 3c05800a */ lui $a1,%hi(g_Smokes) -/* f0131d4: 24a53440 */ addiu $a1,$a1,%lo(g_Smokes) -/* f0131d8: aca20000 */ sw $v0,0x0($a1) -/* f0131dc: 1920001b */ blez $t1,.L0f01324c -/* f0131e0: 00002025 */ or $a0,$zero,$zero -/* f0131e4: 44800000 */ mtc1 $zero,$f0 -/* f0131e8: 00003025 */ or $a2,$zero,$zero -/* f0131ec: 24030190 */ addiu $v1,$zero,0x190 -/* f0131f0: 8caa0000 */ lw $t2,0x0($a1) -.L0f0131f4: -/* f0131f4: 00001025 */ or $v0,$zero,$zero -/* f0131f8: 01465821 */ addu $t3,$t2,$a2 -/* f0131fc: ad600000 */ sw $zero,0x0($t3) -.L0f013200: -/* f013200: 00046880 */ sll $t5,$a0,0x2 -/* f013204: 01a46823 */ subu $t5,$t5,$a0 -/* f013208: 000d6880 */ sll $t5,$t5,0x2 -/* f01320c: 01a46821 */ addu $t5,$t5,$a0 -/* f013210: 8cac0000 */ lw $t4,0x0($a1) -/* f013214: 000d68c0 */ sll $t5,$t5,0x3 -/* f013218: 01a46823 */ subu $t5,$t5,$a0 -/* f01321c: 000d6880 */ sll $t5,$t5,0x2 -/* f013220: 018d7021 */ addu $t6,$t4,$t5 -/* f013224: 01c27821 */ addu $t7,$t6,$v0 -/* f013228: 24420028 */ addiu $v0,$v0,0x28 -/* f01322c: 1443fff4 */ bne $v0,$v1,.L0f013200 -/* f013230: e5e00014 */ swc1 $f0,0x14($t7) -/* f013234: 8d180000 */ lw $t8,0x0($t0) -/* f013238: 24840001 */ addiu $a0,$a0,0x1 -/* f01323c: 24c6019c */ addiu $a2,$a2,0x19c -/* f013240: 0098082a */ slt $at,$a0,$t8 -/* f013244: 5420ffeb */ bnezl $at,.L0f0131f4 -/* f013248: 8caa0000 */ lw $t2,0x0($a1) -.L0f01324c: -/* f01324c: 8fbf0014 */ lw $ra,0x14($sp) -/* f013250: 27bd0018 */ addiu $sp,$sp,0x18 -/* f013254: 03e00008 */ jr $ra -/* f013258: 00000000 */ nop -/* f01325c: 00000000 */ nop -); +void smokeInit(void) +{ + s32 i; + s32 j; + + g_MaxSmokes = IS4MB() ? 10 : 20; + + if (g_Vars.stagenum >= STAGE_TITLE) { + g_MaxSmokes = 0; + } + + if (g_MaxSmokes == 0) { + g_Smokes = NULL; + } else { + g_Smokes = malloc(g_MaxSmokes * sizeof(struct smoke), 4); + + for (i = 0; i < g_MaxSmokes; i++) { + g_Smokes[i].prop = NULL; + + for (j = 0; j < ARRAYCOUNT(g_Smokes[i].parts); j++) { + g_Smokes[i].parts[j].size = 0; + } + } + } +} diff --git a/src/game/smoke/smoke.c b/src/game/smoke/smoke.c index 2c6a1922d..20b235c6f 100644 --- a/src/game/smoke/smoke.c +++ b/src/game/smoke/smoke.c @@ -1031,7 +1031,7 @@ glabel smokeCreate /* f12e214: 00008825 */ or $s1,$zero,$zero /* f12e218: 00009025 */ or $s2,$zero,$zero /* f12e21c: 13000003 */ beqz $t8,.L0f12e22c -/* f12e220: 3c08800a */ lui $t0,%hi(g_NumSmokes) +/* f12e220: 3c08800a */ lui $t0,%hi(g_MaxSmokes) /* f12e224: 10000001 */ b .L0f12e22c /* f12e228: 24110001 */ addiu $s1,$zero,0x1 .L0f12e22c: @@ -1051,7 +1051,7 @@ glabel smokeCreate /* f12e25c: 10000001 */ b .L0f12e264 /* f12e260: 240d0001 */ addiu $t5,$zero,0x1 .L0f12e264: -/* f12e264: 8d083444 */ lw $t0,%lo(g_NumSmokes)($t0) +/* f12e264: 8d083444 */ lw $t0,%lo(g_MaxSmokes)($t0) /* f12e268: 00004825 */ or $t1,$zero,$zero /* f12e26c: 00003825 */ or $a3,$zero,$zero /* f12e270: 1900003b */ blez $t0,.L0f12e360 @@ -1086,13 +1086,13 @@ glabel smokeCreate /* f12e2dc: 5321001e */ beql $t9,$at,.L0f12e358 /* f12e2e0: 00e8082a */ slt $at,$a3,$t0 /* f12e2e4: 032c0019 */ multu $t9,$t4 -/* f12e2e8: 3c08800a */ lui $t0,%hi(g_NumSmokes) +/* f12e2e8: 3c08800a */ lui $t0,%hi(g_MaxSmokes) /* f12e2ec: 00007012 */ mflo $t6 /* f12e2f0: 016e7821 */ addu $t7,$t3,$t6 /* f12e2f4: 85f80000 */ lh $t8,0x0($t7) /* f12e2f8: a4780004 */ sh $t8,0x4($v1) /* f12e2fc: 10000015 */ b .L0f12e354 -/* f12e300: 8d083444 */ lw $t0,%lo(g_NumSmokes)($t0) +/* f12e300: 8d083444 */ lw $t0,%lo(g_MaxSmokes)($t0) /* f12e304: 2a01000f */ slti $at,$s0,0xf .L0f12e308: /* f12e308: 14200012 */ bnez $at,.L0f12e354 @@ -1107,12 +1107,12 @@ glabel smokeCreate /* f12e32c: 55210009 */ bnel $t1,$at,.L0f12e354 /* f12e330: 25290001 */ addiu $t1,$t1,0x1 /* f12e334: 032c0019 */ multu $t9,$t4 -/* f12e338: 3c08800a */ lui $t0,%hi(g_NumSmokes) +/* f12e338: 3c08800a */ lui $t0,%hi(g_MaxSmokes) /* f12e33c: 00007012 */ mflo $t6 /* f12e340: 016e7821 */ addu $t7,$t3,$t6 /* f12e344: 85f80000 */ lh $t8,0x0($t7) /* f12e348: a4580004 */ sh $t8,0x4($v0) -/* f12e34c: 8d083444 */ lw $t0,%lo(g_NumSmokes)($t0) +/* f12e34c: 8d083444 */ lw $t0,%lo(g_MaxSmokes)($t0) /* f12e350: 25290001 */ addiu $t1,$t1,0x1 .L0f12e354: /* f12e354: 00e8082a */ slt $at,$a3,$t0 @@ -1198,7 +1198,7 @@ glabel smokeCreate // s32 i; // // // 270 -// for (i = 0; i < g_NumSmokes; i++) { +// for (i = 0; i < g_MaxSmokes; i++) { // if (g_Smokes[i].prop == NULL) { // smoke = &g_Smokes[i]; // break; @@ -1264,7 +1264,7 @@ bool func0f12e454(struct coord *pos, s16 *rooms, s16 type, u32 arg4) s32 i; s32 j; - for (i = 0; i < g_NumSmokes; i++) { + for (i = 0; i < g_MaxSmokes; i++) { if (g_Smokes[i].prop && g_Smokes[i].unk06_07 == arg4 && g_Smokes[i].type >= SMOKETYPE_MUZZLE_PISTOL @@ -1312,7 +1312,7 @@ bool smokeCreateAtPropIfNecessary(struct prop *prop, struct coord *pos, s16 *roo } if (checksmokes) { - for (i = 0; i < g_NumSmokes; i++) { + for (i = 0; i < g_MaxSmokes; i++) { if (g_Smokes[i].prop && g_Smokes[i].srcprop == prop) { bool fail = false; @@ -1356,7 +1356,7 @@ void smokeClearForProp(struct prop *prop) { s32 i; - for (i = 0; i < g_NumSmokes; i++) { + for (i = 0; i < g_MaxSmokes; i++) { if (g_Smokes[i].prop && g_Smokes[i].srcprop == prop && g_Smokes[i].unk06_07 == false) { g_Smokes[i].age = g_SmokeTypes[g_Smokes[i].type].duration; g_Smokes[i].srcprop = NULL; @@ -2119,8 +2119,8 @@ Gfx *smokeRender(struct prop *prop, Gfx *gdl, bool withalpha) GLOBAL_ASM( glabel func0f12f5f8 -/* f12f5f8: 3c03800a */ lui $v1,%hi(g_NumSmokes) -/* f12f5fc: 8c633444 */ lw $v1,%lo(g_NumSmokes)($v1) +/* f12f5f8: 3c03800a */ lui $v1,%hi(g_MaxSmokes) +/* f12f5fc: 8c633444 */ lw $v1,%lo(g_MaxSmokes)($v1) /* f12f600: 27bdfff0 */ addiu $sp,$sp,-16 /* f12f604: afb1000c */ sw $s1,0xc($sp) /* f12f608: afb00008 */ sw $s0,0x8($sp) @@ -2155,12 +2155,12 @@ glabel func0f12f5f8 /* f12f678: 51b80009 */ beql $t5,$t8,.L0f12f6a0 /* f12f67c: 0043082a */ slt $at,$v0,$v1 /* f12f680: 03110019 */ multu $t8,$s1 -/* f12f684: 3c03800a */ lui $v1,%hi(g_NumSmokes) +/* f12f684: 3c03800a */ lui $v1,%hi(g_MaxSmokes) /* f12f688: 0000c812 */ mflo $t9 /* f12f68c: 02197021 */ addu $t6,$s0,$t9 /* f12f690: 85cf0000 */ lh $t7,0x0($t6) /* f12f694: a4cf0004 */ sh $t7,0x4($a2) -/* f12f698: 8c633444 */ lw $v1,%lo(g_NumSmokes)($v1) +/* f12f698: 8c633444 */ lw $v1,%lo(g_MaxSmokes)($v1) /* f12f69c: 0043082a */ slt $at,$v0,$v1 .L0f12f6a0: /* f12f6a0: 1420ffe6 */ bnez $at,.L0f12f63c diff --git a/src/game/training/training.c b/src/game/training/training.c index 9298fa8d9..d8f115bf5 100644 --- a/src/game/training/training.c +++ b/src/game/training/training.c @@ -1974,7 +1974,7 @@ void frEndSession(bool hidetargets) } // Remove smoke - for (i = 0; i < g_NumSmokes; i++) { + for (i = 0; i < g_MaxSmokes; i++) { g_Smokes[i].age = 256; for (j = 0; j < 10; j++) { diff --git a/src/gvars/gvars.c b/src/gvars/gvars.c index f6c3b1449..bfc0342e8 100644 --- a/src/gvars/gvars.c +++ b/src/gvars/gvars.c @@ -14944,7 +14944,7 @@ s32 g_MaxExplosions = 0; u32 var800a3438 = 0; u32 var800a343c = 0; struct smoke *g_Smokes = NULL; -s32 g_NumSmokes = 0; +s32 g_MaxSmokes = 0; u32 var800a3448 = 0; u32 var800a344c = 0; u32 var800a3450 = 0; diff --git a/src/include/gvars/gvars.h b/src/include/gvars/gvars.h index c7081db1e..edba92723 100644 --- a/src/include/gvars/gvars.h +++ b/src/include/gvars/gvars.h @@ -664,7 +664,7 @@ extern u32 var800a3420; extern struct explosion *g_Explosions; extern s32 g_MaxExplosions; extern struct smoke *g_Smokes; -extern s32 g_NumSmokes; +extern s32 g_MaxSmokes; extern u32 var800a3448; extern u32 var800a3488; extern struct spark g_Sparks[100];