summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTreeki <treeki@gmail.com>2012-09-19 05:03:39 +0200
committerTreeki <treeki@gmail.com>2012-09-19 05:03:39 +0200
commitc966111a279251fb7c2499e5ed6eee464411006d (patch)
tree6dc691b1dccbde56a5a36aeab68c27ddef716439 /src
parentacd5537aa58e827bb9ab80bda9b3297a40ddf3e5 (diff)
downloadkamek-c966111a279251fb7c2499e5ed6eee464411006d.tar.gz
kamek-c966111a279251fb7c2499e5ed6eee464411006d.zip
added Exits and Star Coins fields to datefile
Diffstat (limited to '')
-rw-r--r--src/fileselect.S186
-rw-r--r--src/newer.cpp5
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";