the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "SelectWorldScreen.h"
3#include "Button.h"
4#include "ConfirmScreen.h"
5#include "CreateWorldScreen.h"
6#include "RenameWorldScreen.h"
7#include "DemoMode.h"
8#include "..\Minecraft.World\net.minecraft.locale.h"
9#include "..\Minecraft.World\net.minecraft.world.level.h"
10#include "..\Minecraft.World\net.minecraft.world.level.storage.h"
11
12
13SelectWorldScreen::SelectWorldScreen(Screen *lastScreen)
14{
15 // 4J - added initialisers
16 title = L"Select world";
17 done = false;
18 selectedWorld = 0;
19 worldSelectionList = NULL;
20 isDeleting = false;
21 deleteButton = NULL;
22 selectButton = NULL;
23 renameButton = NULL;
24
25 this->lastScreen = lastScreen;
26}
27
28void SelectWorldScreen::init()
29{
30 Language *language = Language::getInstance();
31 title = language->getElement(L"selectWorld.title");
32
33 worldLang = language->getElement(L"selectWorld.world");
34 conversionLang = language->getElement(L"selectWorld.conversion");
35 loadLevelList();
36
37 worldSelectionList = new WorldSelectionList(this);
38 worldSelectionList->init(&buttons, BUTTON_UP_ID, BUTTON_DOWN_ID);
39
40 postInit();
41}
42
43void SelectWorldScreen::loadLevelList()
44{
45 LevelStorageSource *levelSource = minecraft->getLevelSource();
46 levelList = levelSource->getLevelList();
47// Collections.sort(levelList); // 4J - TODO - get sort functor etc.
48 selectedWorld = -1;
49}
50
51wstring SelectWorldScreen::getWorldId(int id)
52{
53 return levelList->at(id)->getLevelId();
54}
55
56wstring SelectWorldScreen::getWorldName(int id)
57{
58 wstring levelName = levelList->at(id)->getLevelName();
59
60 if ( levelName.length() == 0 )
61 {
62 Language *language = Language::getInstance();
63 levelName = language->getElement(L"selectWorld.world") + L" " + _toString<int>(id + 1);
64 }
65
66 return levelName;
67}
68
69void SelectWorldScreen::postInit()
70{
71 Language *language = Language::getInstance();
72
73 buttons.push_back(selectButton = new Button(BUTTON_SELECT_ID, width / 2 - 154, height - 52, 150, 20, language->getElement(L"selectWorld.select")));
74 buttons.push_back(deleteButton = new Button(BUTTON_RENAME_ID, width / 2 - 154, height - 28, 70, 20, language->getElement(L"selectWorld.rename")));
75 buttons.push_back(renameButton = new Button(BUTTON_DELETE_ID, width / 2 - 74, height - 28, 70, 20, language->getElement(L"selectWorld.delete")));
76 buttons.push_back(new Button(BUTTON_CREATE_ID, width / 2 + 4, height - 52, 150, 20, language->getElement(L"selectWorld.create")));
77 buttons.push_back(new Button(BUTTON_CANCEL_ID, width / 2 + 4, height - 28, 150, 20, language->getElement(L"gui.cancel")));
78
79 selectButton->active = false;
80 deleteButton->active = false;
81 renameButton->active = false;
82
83}
84
85void SelectWorldScreen::buttonClicked(Button *button)
86{
87 if (!button->active) return;
88 if (button->id == BUTTON_DELETE_ID)
89 {
90 wstring worldName = getWorldName(selectedWorld);
91 if (worldName != L"")
92 {
93 isDeleting = true;
94
95 Language *language = Language::getInstance();
96 wstring title = language->getElement(L"selectWorld.deleteQuestion");
97 wstring warning = L"'" + worldName + L"' " + language->getElement(L"selectWorld.deleteWarning");
98 wstring yes = language->getElement(L"selectWorld.deleteButton");
99 wstring no = language->getElement(L"gui.cancel");
100
101 ConfirmScreen *confirmScreen = new ConfirmScreen(this, title, warning, yes, no, selectedWorld);
102 minecraft->setScreen(confirmScreen);
103 }
104 }
105 else if (button->id == BUTTON_SELECT_ID)
106 {
107 worldSelected(selectedWorld);
108 }
109 else if (button->id == BUTTON_CREATE_ID)
110 {
111 if (ProfileManager.IsFullVersion())
112 {
113 minecraft->setScreen(new CreateWorldScreen(this));
114 }
115 else
116 {
117 // create demo world
118 minecraft->setScreen(NULL);
119 if (done) return;
120 done = true;
121// 4J Stu - Not used, so commenting to stop the build failing
122#if 0
123 minecraft->gameMode = new DemoMode(minecraft);
124 minecraft->selectLevel(CreateWorldScreen::findAvailableFolderName(minecraft->getLevelSource(), L"Demo"), L"Demo World", 0L);
125 minecraft->setScreen(NULL);
126#endif
127 }
128 }
129 else if (button->id == BUTTON_RENAME_ID)
130 {
131 minecraft->setScreen(new RenameWorldScreen(this, getWorldId(selectedWorld)));
132 }
133 else if (button->id == BUTTON_CANCEL_ID)
134 {
135 minecraft->setScreen(lastScreen);
136 }
137 else
138 {
139 worldSelectionList->buttonClicked(button);
140 }
141}
142
143void SelectWorldScreen::worldSelected(int id)
144{
145 minecraft->setScreen(NULL);
146 if (done) return;
147 done = true;
148 minecraft->gameMode = NULL; //new SurvivalMode(minecraft);
149
150 wstring worldFolderName = getWorldId(id);
151 if (worldFolderName == L"") // 4J - was NULL comparison
152 {
153 worldFolderName = L"World" + _toString<int>(id);
154 }
155// 4J Stu - Not used, so commenting to stop the build failing
156#if 0
157 minecraft->selectLevel(worldFolderName, getWorldName(id), 0);
158 minecraft->setScreen(NULL);
159#endif
160}
161
162void SelectWorldScreen::confirmResult(bool result, int id)
163{
164 if (isDeleting)
165 {
166 isDeleting = false;
167 if (result)
168 {
169 LevelStorageSource *levelSource = minecraft->getLevelSource();
170 levelSource->clearAll();
171 levelSource->deleteLevel(getWorldId(id));
172
173 loadLevelList();
174 }
175 minecraft->setScreen(this);
176 }
177}
178
179void SelectWorldScreen::render(int xm, int ym, float a)
180{
181 // fill(0, 0, width, height, 0x40000000);
182 worldSelectionList->render(xm, ym, a);
183
184 drawCenteredString(font, title, width / 2, 20, 0xffffff);
185
186 Screen::render(xm, ym, a);
187
188 // 4J - debug code - remove
189 static int count = 0;
190 static bool forceCreateLevel = false;
191 if( count++ >= 100 )
192 {
193 if( !forceCreateLevel && levelList->size() > 0 )
194 {
195 // 4J Stu - For some obscures reason the "delete" button is called "renameButton" and vice versa.
196 //if( levelList->size() > 2 && deleteButton->active )
197 //{
198 // this->selectedWorld = 2;
199 // count = 0;
200 // buttonClicked(deleteButton);
201 //}
202 //else
203 if( levelList->size() > 1 && renameButton->active )
204 {
205 this->selectedWorld = 1;
206 count = 0;
207 buttonClicked(renameButton);
208 }
209 else
210 if( selectButton->active == true )
211 {
212 this->selectedWorld = 0;
213 buttonClicked(selectButton);
214 //this->worldSelected( 0 );
215 }
216 else
217 {
218 selectButton->active = true;
219 deleteButton->active = true;
220 renameButton->active = true;
221 count = 0;
222 }
223 }
224 else
225 {
226 minecraft->setScreen(new CreateWorldScreen(this));
227 }
228 }
229}
230
231SelectWorldScreen::WorldSelectionList::WorldSelectionList(SelectWorldScreen *sws) : ScrolledSelectionList(sws->minecraft, sws->width, sws->height, 32, sws->height - 64, 36)
232{
233 parent = sws;
234}
235
236int SelectWorldScreen::WorldSelectionList::getNumberOfItems()
237{
238 return (int)this->parent->levelList->size();
239}
240
241void SelectWorldScreen::WorldSelectionList::selectItem(int item, bool doubleClick)
242{
243 parent->selectedWorld = item;
244 bool active = (this->parent->selectedWorld >= 0 && this->parent->selectedWorld < getNumberOfItems());
245 parent->selectButton->active = active;
246 parent->deleteButton->active = active;
247 parent->renameButton->active = active;
248
249 if (doubleClick && active)
250 {
251 parent->worldSelected(item);
252 }
253}
254
255bool SelectWorldScreen::WorldSelectionList::isSelectedItem(int item)
256{
257 return item == parent->selectedWorld;
258}
259
260int SelectWorldScreen::WorldSelectionList::getMaxPosition()
261{
262 return (int)parent->levelList->size() * 36;
263}
264
265void SelectWorldScreen::WorldSelectionList::renderBackground()
266{
267 parent->renderBackground(); // 4J - was SelectWorldScreen.this.renderBackground();
268}
269
270void SelectWorldScreen::WorldSelectionList::renderItem(int i, int x, int y, int h, Tesselator *t)
271{
272 LevelSummary *levelSummary = parent->levelList->at(i);
273
274 wstring name = levelSummary->getLevelName();
275 if (name.length()==0)
276 {
277 name = parent->worldLang + L" " + _toString<int>(i + 1);
278 }
279
280 wstring id = levelSummary->getLevelId();
281
282 ULARGE_INTEGER rawtime;
283 rawtime.QuadPart = levelSummary->getLastPlayed() * 10000; // Convert it from milliseconds back to FileTime
284
285 FILETIME timeasfiletime;
286 timeasfiletime.dwHighDateTime = rawtime.HighPart;
287 timeasfiletime.dwLowDateTime = rawtime.LowPart;
288
289 SYSTEMTIME time;
290 FileTimeToSystemTime( &timeasfiletime, &time );
291
292 wchar_t buffer[20];
293 // 4J Stu - Currently shows years as 4 digits, where java only showed 2
294 swprintf(buffer,20,L"%d/%d/%d %d:%02d",time.wDay, time.wMonth, time.wYear, time.wHour, time.wMinute); // 4J - TODO Localise this
295 id = id + L" (" + buffer;
296
297 __int64 size = levelSummary->getSizeOnDisk();
298 id = id + L", " + _toString<float>(size / 1024 * 100 / 1024 / 100.0f) + L" MB)";
299 wstring info;
300
301 if (levelSummary->isRequiresConversion())
302 {
303 info = parent->conversionLang + L" " + info;
304 }
305
306 parent->drawString(parent->font, name, x + 2, y + 1, 0xffffff);
307 parent->drawString(parent->font, id, x + 2, y + 12, 0x808080);
308 parent->drawString(parent->font, info, x + 2, y + 12 + 10, 0x808080);
309
310}