#include #include #include #include "levelinfo.h" #include "fileload.h" #include "layoutlib.h" //#define DEBUG_NAMES #ifndef DEBUG_NAMES #define OSReport(...) #endif extern char CurrentLevel; extern char CurrentWorld; int DoNames(int state) { OSReport("DoNames called - State param is %d\n", state); int wnum = (int)CurrentWorld; int lnum = (int)CurrentLevel; OSReport("Current Level: %d-%d\n", wnum+1, lnum+1); // Skip the title screen // and only process the code if the State is set to 1 // (the screen has been initialised) if (state == 1 && lnum != STAGE_TITLE) { OSReport("Processing\n"); // grab the CRSIN object Actor *ptr = FindActorByType(CRSIN, 0); //OSReport("CRSIN actor found at : %08X\n", ptr); // FIX !!!!! if (ptr != 0) { void *worldObj = EmbeddedLayout_FindTextBoxByName((Layout*)((u32)ptr+0xB0), "TXT_WorldName"); void *levelObj = EmbeddedLayout_FindTextBoxByName((Layout*)((u32)ptr+0xB0), "TXT_LevelName"); //OSReport("WorldObj TextBox : %08X; LevelObj TextBox : %08X\n", worldObj, levelObj); if (worldObj == 0 || levelObj == 0) return state; /*char *file = RetrieveFileFromArc(ARC_TABLE, "Mario", "newer/names.bin"); //OSReport("RetrieveFileFromArc returned : %08X\n", file); char *worldname = file + (wnum * 0x40); char *levelname = file + 0x280 + (wnum * 0xA80) + (lnum * 0x40);*/ OSReport("Loading file...\n"); File fh; fh.open("/NewerRes/LevelInfo.bin"); LevelInfo info; info.load(fh.ptr()); LevelInfo::Entry *entry = info.search(wnum, lnum); char *worldname = info.getNameForLevel(entry); char *levelname = ""; OSReport("Got name : %s\n", worldname); void *vtable = *((void**)levelObj); void *funcaddr = *((void**)((u32)vtable+0x7C)); int (*SetString)(void*, unsigned short*, unsigned short); SetString = (int(*)(void*, unsigned short*, unsigned short))funcaddr; unsigned short wbuffer[0x40], lbuffer[0x40]; for (int i = 0; i < 0x40; i++) { wbuffer[i] = (unsigned short)worldname[i]; lbuffer[i] = (unsigned short)levelname[i]; } SetString(worldObj, wbuffer, 0); SetString(levelObj, lbuffer, 0); OSReport("Freeing file\n"); OSReport("Inserted strings\n"); } } else { OSReport("Skipped\n"); } OSReport("Reached the end of DoNames\n"); return state; } int DoNamesTest2(int state, u32 ptr) { OSReport("TEST 1:%08X 2:%08X\n", state, ptr); return DoNames(state); }