the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 310 lines 9.1 kB view raw
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}