From 69b2b83ac585121b6cc37ff8fdcddf9ebd5cd5ce Mon Sep 17 00:00:00 2001
From: Treeki <treeki@gmail.com>
Date: Sat, 15 Sep 2012 17:48:38 +0200
Subject: initial version of file select

---
 NewerProject.yaml             |   1 +
 NewerProjectKP.yaml           |   1 +
 bugfixes.yaml                 |   4 +-
 fileselect.yaml               | 149 ++++++++++++++++++++++++++++++++++++++++++
 include/game.h                |  18 ++++-
 include/newer.h               |  31 +++++++++
 src/fileselect.S              | 120 ++++++++++++++++++++++++++++++++++
 src/koopatlas/hud.cpp         |  67 +------------------
 src/koopatlas/pathmanager.cpp |   7 ++
 src/newer.cpp                 |  72 ++++++++++++++++++++
 10 files changed, 400 insertions(+), 70 deletions(-)
 create mode 100644 fileselect.yaml
 create mode 100644 include/newer.h
 create mode 100644 src/fileselect.S
 create mode 100644 src/newer.cpp

diff --git a/NewerProject.yaml b/NewerProject.yaml
index 6044c59..ae354bf 100644
--- a/NewerProject.yaml
+++ b/NewerProject.yaml
@@ -2,6 +2,7 @@ output_dir: "NewerASM"
 code_address: 0x808D9000
 modules:
   - processed/prolog.yaml
+  - processed/fileselect.yaml
   - processed/magicplatform.yaml
   - processed/bugfixes.yaml
   - processed/worldmap.yaml
diff --git a/NewerProjectKP.yaml b/NewerProjectKP.yaml
index fdd447c..d6cdcc4 100644
--- a/NewerProjectKP.yaml
+++ b/NewerProjectKP.yaml
@@ -2,6 +2,7 @@ output_dir: "NewerASM"
 code_address: 0x808D9000
 modules:
   - processed/prolog.yaml
+  - processed/fileselect.yaml
   - processed/magicplatform.yaml
   - processed/cutScene.yaml
   - processed/bonepiece.yaml
diff --git a/bugfixes.yaml b/bugfixes.yaml
index 29b7acd..2576c1e 100644
--- a/bugfixes.yaml
+++ b/bugfixes.yaml
@@ -1,5 +1,7 @@
 ---
-source_files: [../src/randomcrap.S, ../src/music.cpp, ../src/fix38.S, ../src/nullsub.S]
+# This has kind of turned into the "random stuff that we don't want to make a yaml for"
+# yaml, hasn't it...
+source_files: [../src/randomcrap.S, ../src/music.cpp, ../src/fix38.S, ../src/nullsub.S, ../src/newer.cpp]
 hooks:
   - name: FixMemoryLeaks
     type: patch
diff --git a/fileselect.yaml b/fileselect.yaml
new file mode 100644
index 0000000..7b22520
--- /dev/null
+++ b/fileselect.yaml
@@ -0,0 +1,149 @@
+---
+source_files: [../src/fileselect.S]
+hooks:
+  - name: FSDisBrlan1 # inMulti
+    type: add_func_pointer
+    src_addr_pal: 0x80943A74
+    target_func: 'FSDummyBrlanName'
+  - name: FSDisBrlan2 # on
+    type: add_func_pointer
+    src_addr_pal: 0x80943AB4
+    target_func: 'FSDummyBrlanName'
+  - name: FSDisBrlan3 # idle
+    type: add_func_pointer
+    src_addr_pal: 0x80943AB8
+    target_func: 'FSDummyBrlanName'
+  - name: FSDisBrlan4 # hit
+    type: add_func_pointer
+    src_addr_pal: 0x80943ABC
+    target_func: 'FSDummyBrlanName'
+  - name: FSDisBrlan5 # off
+    type: add_func_pointer
+    src_addr_pal: 0x80943AC0
+    target_func: 'FSDummyBrlanName'
+  - name: FSDisBrlan6 # out
+    type: add_func_pointer
+    src_addr_pal: 0x80943AC4
+    target_func: 'FSDummyBrlanName'
+
+  - name: FSDisGroup1a # inMulti
+    type: add_func_pointer
+    src_addr_pal: 0x80943B88
+    target_func: 'FSDummyGroup'
+  - name: FSDisGroup1b # inMulti
+    type: add_func_pointer
+    src_addr_pal: 0x80943B8C
+    target_func: 'FSDummyGroup'
+  - name: FSDisGroup2a # onMulti
+    type: add_func_pointer
+    src_addr_pal: 0x80943BDC
+    target_func: 'FSDummyGroup'
+  - name: FSDisGroup2b # onMulti
+    type: add_func_pointer
+    src_addr_pal: 0x80943BE0
+    target_func: 'FSDummyGroup'
+  - name: FSDisGroup3a # idleMulti
+    type: add_func_pointer
+    src_addr_pal: 0x80943BE4
+    target_func: 'FSDummyGroup'
+  - name: FSDisGroup3b # idleMulti
+    type: add_func_pointer
+    src_addr_pal: 0x80943BE8
+    target_func: 'FSDummyGroup'
+  - name: FSDisGroup4a # hitMulti
+    type: add_func_pointer
+    src_addr_pal: 0x80943BEC
+    target_func: 'FSDummyGroup'
+  - name: FSDisGroup4b # hitMulti
+    type: add_func_pointer
+    src_addr_pal: 0x80943BF0
+    target_func: 'FSDummyGroup'
+  - name: FSDisGroup5a # offMulti
+    type: add_func_pointer
+    src_addr_pal: 0x80943BF4
+    target_func: 'FSDummyGroup'
+  - name: FSDisGroup5b # offMulti
+    type: add_func_pointer
+    src_addr_pal: 0x80943BF8
+    target_func: 'FSDummyGroup'
+#  - name: FSDisGroup6a # outMulti
+#    type: add_func_pointer
+#    src_addr_pal: 0x80943BFC
+#    target_func: 'FSDummyGroup'
+#  - name: FSDisGroup6b # outMulti
+#    type: add_func_pointer
+#    src_addr_pal: 0x80943C00
+#    target_func: 'FSDummyGroup'
+
+
+  - name: FSDummyPane1 # N_back
+    type: add_func_pointer
+    src_addr_pal: 0x80943C5C
+    target_func: 'FSDummyPane'
+
+
+  - name: FSCutOffSomeBmgs
+    type: patch
+    addr_pal: 0x80782F38
+    data: '38E00007'
+
+  - name: FSCutOffSomeTexts
+    type: patch
+    addr_pal: 0x80782F4C
+    data: '38C00002'
+
+  - name: FSNoBackBmg
+    type: nop_insn
+    area_pal: 0x80782F70
+
+  - name: FSNoWindows
+    type: nop_insn
+    area_pal: 0x80782F98
+
+  - {name: FSShowOrHideNBackNop1, type: nop_insn, area_pal: 0x80783428}
+  - {name: FSShowOrHideNBackNop2, type: nop_insn, area_pal: 0x80783440}
+  - {name: FSShowOrHideNBackNop3, type: nop_insn, area_pal: 0x80783458}
+  - {name: FSShowOrHideNBackNop4, type: nop_insn, area_pal: 0x8078346C}
+
+  - {name: FSDontMoveDown, type: patch, addr_pal: 0x80783D04, data: '4800001C'}
+  - {name: FSMoveLeftToUp, type: patch, addr_pal: 0x80783D20, data: '548007BD'}
+  - {name: FSMoveRightToDown, type: patch, addr_pal: 0x80783D3C, data: '548007FF'}
+
+  - {name: FS2MoveLeftToUp, type: patch, addr_pal: 0x8078456C, data: '540007BD'}
+  - {name: FS2MoveRightToDown, type: patch, addr_pal: 0x80784598, data: '540007FF'}
+
+  - {name: FS3MoveLeftToUp, type: patch, addr_pal: 0x80784B08, data: '540007BD'}
+  - {name: FS3MoveRightToDown, type: patch, addr_pal: 0x80784B40, data: '540007FF'}
+
+# needed because I replace A00_window with a couple of pointers LOL
+  - {name: FSFixWindowName, type: add_func_pointer, src_addr_pal: 0x80943B54, target_func: 'A00_window'}
+  - {name: FSShowRlan, type: add_func_pointer, src_addr_pal: 0x80943ACC, target_func: 'ShowEraseCopy'}
+  - {name: FSHideRlan, type: add_func_pointer, src_addr_pal: 0x80943AD0, target_func: 'HideEraseCopy'}
+  - {name: FSInitExtraRlans, type: patch, addr_pal: 0x80782EE4, data: '38A0001F'}
+#  - {name: FSFixPosFile, type: add_func_pointer, src_addr_pal: 0x80943C4C, target_func: 'N_posFile1_00'}
+#  - {name: FSCDHolderGrpA, type: add_func_pointer, src_addr_pal: 0x80943C08, target_func: 'CDHolderGroup'}
+#  - {name: FSCDHolderGrpB, type: add_func_pointer, src_addr_pal: 0x80943C0C, target_func: 'CDHolderGroup'}
+#  - {name: FSInitExtraGrps, type: patch, addr_pal: 0x80782EF8, data: '38C0002F'}
+  - {name: FSCDHolderGrpA, type: add_func_pointer, src_addr_pal: 0x80943BFC, target_func: 'CDHolderGroup'}
+  - {name: FSCDHolderGrpB, type: add_func_pointer, src_addr_pal: 0x80943C00, target_func: 'CDHolderGroup'}
+  - {name: FSRlanIdx, type: patch, addr_pal: 0x8093422C, data: '0000001D0000001E'}
+
+# disable the multi out anims
+  - {name: FSDisMulti1, type: nop_insn, area_pal: 0x80784220}
+  - {name: FSDisMulti2, type: nop_insn, area_pal: 0x80784230}
+
+  - {name: FSResetAnim, type: patch, addr_pal: 0x80783610, data: '3880002A'}
+#  - {name: FSShowCD, type: branch_insn, branch_type: b, src_addr_pal: 0x80783BFC, target_func: 'FSShowCD'}
+#  - {name: FSHideCD, type: branch_insn, branch_type: b, src_addr_pal: 0x80783F80, target_func: 'FSHideCD'}
+  - {name: FSShowCDa, type: branch_insn, branch_type: b, src_addr_pal: 0x80783810, target_func: 'FSShowCD_OpenWait'}
+#  - {name: FSHideCDa, type: branch_insn, branch_type: b, src_addr_pal: 0x80784304, target_func: 'FSHideCD_IWOSAEW'}
+# Show it on MultiButtnOnStageAnimeEndWait
+  - {name: FSShowCDOverrideA, type: patch, addr_pal: 0x80783954, data: '3880002A'}
+  - {name: FSShowCDOverrideB, type: patch, addr_pal: 0x807839AC, data: '3880002A'}
+# Hide it on MultiButtonExitAnimeEndWait
+  - {name: FSHideCD, type: branch_insn, branch_type: b, src_addr_pal: 0x80784200, target_func: 'FSHideCD'}
+
+
+  - {name: DFNiceTitle, type: branch_insn, branch_type: bl, src_addr_pal: 0x8077D044, target_func: 'DFNiceTitle'}
+
+
diff --git a/include/game.h b/include/game.h
index f3b14c3..29bb6d6 100755
--- a/include/game.h
+++ b/include/game.h
@@ -137,10 +137,21 @@ public:
 	u8 worlds_available[10];	// 0x32
 	u32 ambush_countdown[10];	// 0x3C
 	u16 field_64;				// 0x64
-	u16 credits_hiscore;		// 0x66
+	union {
+		u16 credits_hiscore;		// 0x66
+		u16 spentStarCoins;
+	};
 	u16 score;					// 0x68
 	u32 completions[10][0x2A];	// 0x6C
-	u8 hint_movie_bought[70];	// 0x6FC
+	union {
+		u8 hint_movie_bought[70];	// 0x6FC
+
+		struct {
+			// ALL Newer additions should go here
+			// This array has been verified as safe to replace
+			u8 currentNewerWorld; // 0x6FC
+		};
+	};
 	u8 toad_location[10];		// 0x742
 	u8 field_74C[10][4];		// 0x74C
 	u8 field_774[10][4];		// 0x774
@@ -2590,7 +2601,7 @@ namespace m2d {
 	class AnmResHandler_c {
 		public:
 			AnmResHandler_c();
-			~AnmResHandler_c();
+			virtual ~AnmResHandler_c();
 
 			struct Thing {
 				nw4r::lyt::Group *group;
@@ -3057,6 +3068,7 @@ namespace mHeap {
 
 void WriteNumberToTextBox(int *number, const int *fieldLength, nw4r::lyt::TextBox *textBox, bool unk); // 800B3B60
 
+#include "newer.h"
 
 #endif
 
diff --git a/include/newer.h b/include/newer.h
new file mode 100644
index 0000000..4f34f81
--- /dev/null
+++ b/include/newer.h
@@ -0,0 +1,31 @@
+#ifndef NEWER_H
+#define NEWER_H 
+
+enum NWRWorld {
+	ISLAND = 0, YOSHI_ISLAND = 0,
+	DESERT = 1, RUBBLE_RUINS = 1,
+	SEWER = 2, SOGGY_SEWERS = 2,
+	MOUNTAIN = 3, MUSHROOM_PEAKS = 3,
+	SAKURA = 4, SAKURA_VILLAGE = 4,
+	FREEZEFLAME = 5, FREEZEFLAME_GLACIER = 5,
+	VOLCANO = 6, FREEZEFLAME_VOLCANO = 6,
+	PUMPKIN = 7, PUMPKIN_BONEYARD = 7,
+	SKY_MOUNTAIN = 8,
+	SKY = 9, STARRY_SKIES = 9,
+	PLANET = 10, KOOPA_PLANET = 10,
+	CORE = 11, KOOPA_CORE = 11,
+	BONUS_LAND = 12,
+	GOLDWOOD = 13, GOLDWOOD_FOREST = 13,
+	MINIMEGA = 14, MINIMEGA_ISLAND = 14,
+	CRYSTAL = 15, CRYSTAL_CAVES = 15,
+	BOMBARD = 16, BOMBARD_CLIFFS = 16,
+	SKY_CITY = 17,
+	WORLD_COUNT = 18,
+	UNKNOWN_WORLD = 255
+};
+
+NWRWorld NewerWorldForLevelID(int world, int level);
+
+const wchar_t *NewerWorldName(NWRWorld world);
+
+#endif /* NEWER_H */
diff --git a/src/fileselect.S b/src/fileselect.S
new file mode 100644
index 0000000..b243e7f
--- /dev/null
+++ b/src/fileselect.S
@@ -0,0 +1,120 @@
+.set sp,1
+.set rtoc,2
+
+.text
+.extern enableNonLoopAnim__Q23m2d13EmbedLayout_cFib
+.global FSShowCD, FSHideCD
+FSShowCD:
+	addi r3, r3, 0x74
+	li r4, 0x2A
+	b enableNonLoopAnim__Q23m2d13EmbedLayout_cFib
+
+FSHideCD:
+	addi r3, r3, 0x74
+	li r4, 0x2B
+	b enableNonLoopAnim__Q23m2d13EmbedLayout_cFib
+
+.global FSShowCD_OpenWait
+FSShowCD_OpenWait:
+	addi r3, r31, 0x74
+	li r4, 0x2A
+	bl enableNonLoopAnim__Q23m2d13EmbedLayout_cFib
+	lwz r0, 0x14(r1)
+	lwz r31, 0xC(r1)
+	mtlr r0
+	addi r1, r1, 0x10
+	blr
+
+#.global FSHideCD_IWOSAEW
+#FSHideCD_IWOSAEW:
+#	addi r3, r31, 0x74
+#	li r4, 0x2B
+#	bl enableNonLoopAnim__Q23m2d13EmbedLayout_cFib
+#	lwz r0, 0x14(r1)
+#	lwz r31, 0xC(r1)
+#	mtlr r0
+#	addi r1, r1, 0x10
+#	blr
+
+.global DFNiceTitle
+DFNiceTitle:
+	mr r3, r4
+	lis r4, DFTitle@h
+	ori r4, r4, DFTitle@l
+	lwz r6, 0xE44(r30)
+	addi r6, r6, '1'
+	sth r6, 0xA(r4)
+	li r5, 0
+	li r6, 6
+	lwz r12, 0(r3)
+	lwz r12, 0x80(r12)
+	mtctr r12
+	bctr
+
+.align 4
+
+.data
+.global FSDummyBrlanName, FSDummyGroup, FSDummyPane
+FSDummyBrlanName: .string "fileSelectBase_18_DummyAnim.brlan"
+FSDummyGroup: .string "DummyGroup"
+FSDummyPane: .string "DummyPane"
+
+.global A00_window
+A00_window: .string "A00_window"
+.global ShowEraseCopy, HideEraseCopy
+ShowEraseCopy: .string "fileSelectBase_18_ShowEraseCopy.brlan"
+HideEraseCopy: .string "fileSelectBase_18_HideEraseCopy.brlan"
+.global N_posFile1_00
+N_posFile1_00: .string "N_posFile1_00"
+.global CDHolderGroup
+CDHolderGroup: .string "CDHolderGroup"
+
+.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
+
diff --git a/src/koopatlas/hud.cpp b/src/koopatlas/hud.cpp
index 8f4b778..3989a1c 100644
--- a/src/koopatlas/hud.cpp
+++ b/src/koopatlas/hud.cpp
@@ -383,72 +383,7 @@ void dWMHud_c::setWorldName() {
 		int world = node->levelNumber[0];
 		int level = node->levelNumber[1];
 
-		switch (world) {
-			case 1:		
-				setWorldText("Yoshi's\nIsland");
-				break;	
-
-			case 2:
-				if (((level > 1) && (level < 5)) || (level == 15) || (level == 33) || (level == 34))
-					setWorldText("Soggy\nSewers");
-				else
-					setWorldText("Rubble\nRuins");
-				break;	
-
-			case 3:		
-				setWorldText("Mushroom\nPeaks");
-				break;	
-
-			case 4:		
-				setWorldText("Sakura\nVillage");
-				break;	
-
-			case 5:		
-				if ((level < 6) || (level == 15) || (level == 33) || (level == 34))
-					setWorldText("FreezeFlame\nValley");
-				else
-					setWorldText("FreezeFlame\nVolcano");
-				break;	
-
-			case 6:		
-				setWorldText("Pumpkin\nBoneyard");
-				break;	
-
-			case 7:		
-				if (level < 4)
-					setWorldText("Sky\nMountain");
-				else
-					setWorldText("Starry\nSkies");
-				break;	
-
-			case 8:		
-				if ((level < 6) || (level == 15) || (level == 25) || (level == 33) || (level == 34))
-					setWorldText("Koopa\nPlanet");
-				else
-					setWorldText("Koopa\nCore");
-				break;	
-
-			case 9:		
-				setWorldText("Bonus\nLand");
-				break;	
-
-			case 10:		
-				if      ((level < 6)  || (level == 30) || (level == 41) )
-					setWorldText("Goldwood\nForest");
-				else if ((level < 11) || (level == 32))
-					setWorldText("Mini-Mega\nIsland");
-				else if ((level < 16) || (level == 33) || (level == 34) || (level == 31) )
-					setWorldText("Crystal\nCaves");
-				else if (level < 19)
-					setWorldText("Bombard\nCliffs");
-				else
-					setWorldText("Sky\nCity");
-				break;	
-
-			default:
-				setWorldText("Unknown\nWorld");
-				break;
-		}
+		setWorldText(NewerWorldName(NewerWorldForLevelID(world, level)));
 	}
 }
 
diff --git a/src/koopatlas/pathmanager.cpp b/src/koopatlas/pathmanager.cpp
index ffc4dfd..49ee728 100644
--- a/src/koopatlas/pathmanager.cpp
+++ b/src/koopatlas/pathmanager.cpp
@@ -560,6 +560,13 @@ void dWMPathManager_c::moveThroughPath() {
 			SaveBlock *save = GetSaveFile()->GetBlock(-1);
 			save->current_path_node = pathLayer->findNodeID(to);
 
+			if (to->type == dKPNode_s::LEVEL) {
+				NWRWorld nWorld = NewerWorldForLevelID(to->levelNumber[0], to->levelNumber[1]);
+				if (nWorld != UNKNOWN_WORLD) {
+					save->currentNewerWorld = (u8)nWorld;
+				}
+			}
+
 			dWMHud_c::instance->showPointBar();
 			SpammyReport("Point bar shown\n");
 		} else {
diff --git a/src/newer.cpp b/src/newer.cpp
new file mode 100644
index 0000000..314b50f
--- /dev/null
+++ b/src/newer.cpp
@@ -0,0 +1,72 @@
+#include <newer.h>
+
+NWRWorld NewerWorldForLevelID(int w, int l) {
+	switch (w) {
+		case 1: return YOSHI_ISLAND;
+		case 2:
+				if (((l>1) && (l<5)) || (l==15) || (l==33) || (l==34))
+					return SOGGY_SEWERS;
+				else
+					return RUBBLE_RUINS;
+		case 3: return MUSHROOM_PEAKS;
+		case 4: return SAKURA_VILLAGE;
+		case 5:
+				if (l<7 || l==15 || l==33 || l==34)
+					return FREEZEFLAME_GLACIER;
+				else
+					return FREEZEFLAME_VOLCANO;
+		case 6: return PUMPKIN_BONEYARD;
+		case 7:
+				if (l<4)
+					return SKY_MOUNTAIN;
+				else
+					return STARRY_SKIES;
+		case 8:
+				if (l<6 || l==15 || l==25 || l==33 || l==34)
+					return KOOPA_PLANET;
+				else
+					return KOOPA_CORE;
+		case 9: return BONUS_LAND;
+		case 10:
+				if (l<6 || l==30 || l==41)
+					return GOLDWOOD_FOREST;
+				else if (l<11 || l==32)
+					return MINIMEGA_ISLAND;
+				else if (l<16 || l==33 || l==34 || l==31)
+					return CRYSTAL_CAVES;
+				else if (l<19)
+					return BOMBARD_CLIFFS;
+				else
+					return SKY_CITY;
+	}
+
+	return UNKNOWN_WORLD;
+}
+
+
+static const wchar_t *NewerWorldNames[] = {
+	L"Yoshi's Island",
+	L"Rubble Ruins",
+	L"Soggy Sewers",
+	L"Mushroom Peaks",
+	L"Sakura Village",
+	L"Freezeflame Glacier",
+	L"Freezeflame Volcano",
+	L"Pumpkin Boneyard",
+	L"Sky Mountain",
+	L"Starry Skies",
+	L"Koopa Planet",
+	L"Koopa Core",
+	L"Bonus Land",
+	L"Goldwood Forest",
+	L"Mini-Mega Island",
+	L"Crystal Caves",
+	L"Bombard Cliffs",
+	L"Sky City"
+};
+
+const wchar_t *NewerWorldName(NWRWorld world) {
+	if (world < 0 || world >= WORLD_COUNT)
+		return L"Unknown World";
+	return NewerWorldNames[world];
+}
-- 
cgit v1.2.3