From c966111a279251fb7c2499e5ed6eee464411006d Mon Sep 17 00:00:00 2001
From: Treeki <treeki@gmail.com>
Date: Wed, 19 Sep 2012 05:03:39 +0200
Subject: added Exits and Star Coins fields to datefile

---
 kamek_pal.x      |   2 +
 src/fileselect.S | 186 +++++++++++++++++++++++++++++++++++++++----------------
 src/newer.cpp    |   5 ++
 3 files changed, 141 insertions(+), 52 deletions(-)

diff --git a/kamek_pal.x b/kamek_pal.x
index 88b811b..02bc004 100644
--- a/kamek_pal.x
+++ b/kamek_pal.x
@@ -6,6 +6,8 @@ SECTIONS {
 
 	RealAcPyDtor = 0x80144820;
 
+	InsertIntIntoTextBox1 = 0x800B3BE0;
+
 	__ct__20daJrClownForPlayer_cFv = 0x80810480;
 	__dt__20daJrClownForPlayer_cFv = 0x80810540; /* Beans indeed. */
 
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";
-- 
cgit v1.2.3