#include #include #include "levelinfo.h" int lastLevelIDs[] = { -1, /*no world*/ 27, 27, 27, 27, 27, 27, 27, 25, -1, /*no end level in W9*/ 24, 24, 24, 3, 21 }; void WriteAsciiToTextBox(nw4r::lyt::TextBox *tb, const char *source) { int i = 0; wchar_t buffer[1024]; while (i < 1023 && source[i]) { buffer[i] = source[i]; i++; } buffer[i] = 0; tb->SetString(buffer); } void getNewerLevelNumberString(int world, int level, wchar_t *dest) { static const wchar_t *numberKinds[] = { // 0-19 are handled by code // To insert a picturefont character: // \x0B\x01YY\xZZZZ // YY is the character code, ZZZZ is ignored L"A", // 20, alternate L"\x0B\x0148\xBEEF", // 21, tower L"\x0B\x0148\xBEEF" L"2", // 22, tower 2 L"\x0B\x012E\xBEEF", // 23, castle L"\x0B\x012F\xBEEF", // 24, fortress L"\x0B\x013D\xBEEF", // 25, final castle L"\x0B\x014D\xBEEF", // 26, train L"\x0B\x0132\xBEEF", // 27, airship L"Palace", // 28, switch palace L"\x0B\x0147\xBEEF", // 29, yoshi's house L"\x0B\x014E\xBEEF" L"1", // 30, key 1 L"\x0B\x014E\xBEEF" L"2", // 31, key 2 L"\x0B\x014E\xBEEF" L"3", // 32, key 3 L"\x0B\x014E\xBEEF" L"4", // 33, key 4 L"\x0B\x014E\xBEEF" L"5", // 34, key 5 L"\x0B\x014E\xBEEF" L"6", // 35, key 6 L"\x0B\x0138\xBEEF", // 36, music house L"\x0B\x0133\xBEEF", // 37, shop L"\x0B\x0139\xBEEF", // 38, challenge house L"\x0B\x0151\xBEEF", // 39, red switch palace L"\x0B\x0152\xBEEF", // 40, blue switch palace L"\x0B\x0153\xBEEF", // 41, yellow switch palace L"\x0B\x0154\xBEEF", // 42, green switch palace }; dest[0] = (world >= 10) ? (world-10+'A') : (world+'0'); dest[1] = '-'; if (level >= 20) { wcscpy(&dest[2], numberKinds[level-20]); } else if (level >= 10) { dest[2] = '1'; dest[3] = ('0' - 10) + level; dest[4] = 0; } else { dest[2] = '0' + level; dest[3] = 0; } } int getUnspentStarCoinCount() { SaveBlock *save = GetSaveFile()->GetBlock(-1); int coinsSpent = save->spentStarCoins; return getStarCoinCount() - coinsSpent; } int getStarCoinCount() { SaveBlock *save = GetSaveFile()->GetBlock(-1); int coinsEarned = 0; for (int w = 0; w < 10; w++) { for (int l = 0; l < 42; l++) { u32 conds = save->GetLevelCondition(w, l); if (conds & COND_COIN1) { coinsEarned++; } if (conds & COND_COIN2) { coinsEarned++; } if (conds & COND_COIN3) { coinsEarned++; } } } return coinsEarned; } struct GEIFS { int starCoins, exits; }; extern "C" GEIFS *GrabExitInfoForFileSelect(GEIFS *out, SaveBlock *save) { out->starCoins = 0; out->exits = 0; for (int i = 0; i < dLevelInfo_c::s_info.sectionCount(); i++) { dLevelInfo_c::section_s *section = dLevelInfo_c::s_info.getSectionByIndex(i); for (int j = 0; j < section->levelCount; j++) { dLevelInfo_c::entry_s *l = §ion->levels[j]; if (l->flags & 2) { //OSReport("Checking %d-%d...\n", l->worldSlot+1, l->levelSlot+1); u32 cond = save->GetLevelCondition(l->worldSlot, l->levelSlot); if ((l->flags & 0x10) && (cond & COND_NORMAL)) out->exits++; if ((l->flags & 0x20) && (cond & COND_SECRET)) out->exits++; if (cond & COND_COIN1) out->starCoins++; if (cond & COND_COIN2) out->starCoins++; if (cond & COND_COIN3) out->starCoins++; } } } OSReport("Done, got %d coins and %d exits\n", out->starCoins, out->exits); return out; }