diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/fileselect.S | 186 | ||||
-rw-r--r-- | src/newer.cpp | 5 |
2 files changed, 139 insertions, 52 deletions
diff --git a/src/fileselect.S b/src/fileselect.S index 7b9b9d6..3145846 100644 --- a/src/fileselect.S +++ b/src/fileselect.S @@ -53,22 +53,41 @@ DFNiceTitle: mtctr r12 bctr +.extern findTextBoxByName__Q23m2d17EmbedLayoutBase_cCFPCc .extern NewerWorldNames +.extern NewerWorldCount +.extern InsertIntIntoTextBox1 .global DFNiceWorldName DFNiceWorldName: - stwu r1, -0x10(r1) + stwu r1, -0x30(r1) mflr r0 - stw r0, 0x14(r1) - stw r20, 0xC(r1) + stw r0, 0x34(r1) + stw r20, 0x2C(r1) + stw r21, 0x28(r1) + stw r22, 0x24(r1) + # r1+0x20 is reserved for the stupid ints in textboxes + stw r23, 0x1C(r1) + stw r24, 0x18(r1) + stw r25, 0x14(r1) mr r20, r4 # get Newer map number lbz r6, 0x6FC(r31) + lis r8, NewerWorldCount@h + ori r8, r8, NewerWorldCount@h + lwz r8, 0(r8) + cmpw r6, r8 + bge invalidThing slwi r6, r6, 2 lis r7, NewerWorldNames@h ori r7, r7, NewerWorldNames@l lwzx r4, r7, r6 li r5, 0 + b gotName +invalidThing: + lis r4, InvalidWorld@h + ori r4, InvalidWorld@l +gotName: mr r3, r20 lwz r12, 0(r3) @@ -76,10 +95,111 @@ DFNiceWorldName: mtctr r12 bctrl - lwz r20, 0xC(r1) - lwz r0, 0x14(r1) + # While we're at it, take care of some other things + # r21 shall hold our star coin count; r22 shall hold our exit count + # r23 shall hold the level pointer + # r24 shall hold the world number, and r25 the level number + + li r21, 0 + li r22, 0 + li r24, 0 + li r25, 0 + + # Loop through ALL levels + addi r23, r31, 0x6C + li r4, 420 + mtctr r4 + +levelLoop: + lwz r4, 0(r23) + + cmpwi r25, 38 + beq ignoreStartPoint + + clrlwi. r0, r4, 31 + beq noCoin1 + addi r21, r21, 1 +noCoin1: + extrwi. r0, r4, 1,30 + beq noCoin2 + addi r21, r21, 1 +noCoin2: + extrwi. r0, r4, 1,29 + beq noCoin3 + addi r21, r21, 1 +noCoin3: + + extrwi. r0, r4, 1,27 + beq noNormalExit + addi r22, r22, 1 + + lis r3, NormalExitStr@h + ori r3, r3, NormalExitStr@l + mr r4, r24 + mr r5, r25 + crclr 4*cr1+eq + bl OSReport +noNormalExit: + lwz r4, 0(r23) + extrwi. r0, r4, 1,26 + beq noSecretExit + addi r22, r22, 1 + + lis r3, SecretExitStr@h + ori r3, r3, SecretExitStr@l + mr r4, r24 + mr r5, r25 + crclr 4*cr1+eq + bl OSReport +noSecretExit: + +ignoreStartPoint: + + addi r23, r23, 4 + addi r25, r25, 1 + cmpwi r25, 42 + blt dontGoNextWorld + addi r24, r24, 1 + li r25, 0 +dontGoNextWorld: + bdnz levelLoop + + # Now, subtract the paid star coins + lhz r3, 0x66(r31) + sub r21, r21, r3 + + # And write everything ... + addi r3, r30, 0x74 + lis r4, ExitCount@h + ori r4, r4, ExitCount@l + bl findTextBoxByName__Q23m2d17EmbedLayoutBase_cCFPCc + + stw r22, 0x20(r1) + mr r4, r3 + addi r3, r1, 0x20 + li r5, 1 + bl InsertIntIntoTextBox1 + + addi r3, r30, 0x74 + lis r4, StarCoinCount@h + ori r4, r4, StarCoinCount@l + bl findTextBoxByName__Q23m2d17EmbedLayoutBase_cCFPCc + + stw r21, 0x20(r1) + mr r4, r3 + addi r3, r1, 0x20 + li r5, 0 + bl InsertIntIntoTextBox1 + + lwz r25, 0x14(r1) + lwz r24, 0x18(r1) + lwz r23, 0x1C(r1) + lwz r22, 0x24(r1) + lwz r21, 0x28(r1) + lwz r20, 0x2C(r1) + lwz r0, 0x34(r1) mtlr r0 - addi r1, r1, 0x10 + addi r1, r1, 0x30 blr .global FSDebugStates @@ -132,52 +252,14 @@ N_posFile1_00: .string "N_posFile1_00" .global CDHolderGroup CDHolderGroup: .string "CDHolderGroup" +NormalExitStr: .string "<Normal> %d-%d\n" +SecretExitStr: .string "<Secret> %d-%d\n" +StarCoinCount: .string "StarCoinCount" +ExitCount: .string "ExitCount" + .align 4 DFTitle: -.short 'F','i','l','e',' ','X' - -NameYI: .string "Yoshi's Island" -NameDesert: .string "Rubble Ruins" -NameSewer: .string "Soggy Sewers" -NameMountain: .string "Mushroom Peaks" -NameJapan: .string "Sakura Village" -NameFF: .string "FreezeFlame Valley" -NameVolcano: .string "FreezeFlame Volcano" -NameGhost: .string "Pumpkin Boneyard" -NameSkyM: .string "Sky Mountain" -NameSky: .string "Starry Skies" -NameKoopa: .string "Koopa Planet" -NameCore: .string "Koopa Core" -NameGoldwood: .string "Goldwood Forest" -NameCaverns: .string "Crystal Caves" -NameBomb: .string "Bombard Cliffs" -NameMiniMega: .string "Mini-Mega Island" -NameSkyCity: .string "Sky City" -NameBonus: .string "Bonus Land" - -# [05:59:00] <Tempus> W1 GW W2 MM W3 W4 W5 CC W6 BC W7 SC W8 KC W9 -.align 4 -# Struct definition: World, Level, IsSecret, Name -.long -1,-1,0,NameYI -.long 1,6,1,NameGoldwood -.long 1,38,0,NameDesert -.long 2,1,0,NameSewer -.long 2,15,0,NameDesert -.long 2,9,1,NameMiniMega -.long 2,38,0,NameMountain -.long 3,38,0,NameJapan -.long 4,38,0,NameFF -.long 5,6,0,NameVolcano -.long 5,8,0,NameFF -.long 5,10,0,NameFF -.long 5,9,1,NameCaverns -.long 5,38,0,NameGhost -.long 6,8,0,NameBomb -.long 6,38,0,NameSkyM -.long 7,3,0,NameSky -.long 7,4,1,NameSkyCity -.long 7,38,0,NameKoopa -.long 8,25,0,NameCore -.long 8,26,0,NameBonus -.long 0,0,0,0 +.short 'F','i','l','e',' ','X',0 +InvalidWorld: +.short '<','I','n','v','a','l','i','d',' ','W','o','r','l','d','>',0 diff --git a/src/newer.cpp b/src/newer.cpp index 215dfeb..3e08ded 100644 --- a/src/newer.cpp +++ b/src/newer.cpp @@ -65,6 +65,11 @@ const wchar_t *NewerWorldNames[] = { L"Sky City" }; +// This is an array so it can be accessed from fileselect.S +const int *NewerWorldCount[] = { + 18 +}; + const wchar_t *NewerWorldName(NWRWorld world) { if (world < 0 || world >= WORLD_COUNT) return L"Unknown World"; |