From b0e0d63eab1e11d1a7f841afdc7eb18e7a9de3ba Mon Sep 17 00:00:00 2001 From: Treeki Date: Sun, 13 Mar 2011 00:19:13 +0100 Subject: this branch now features only the level select stuff --- src/g3dwrap.cpp | 90 --- src/wm_player.cpp | 192 ------ src/wmresourcemng.cpp | 78 --- src/world_camera.cpp | 94 --- src/worldmap.cpp | 1567 ++++++++++++++++++++++++++++++++++++++++++------- src/worldmap_new.cpp | 1358 ------------------------------------------ src/worldmapdata.cpp | 93 --- src/worldmapdata.h | 149 ----- 8 files changed, 1340 insertions(+), 2281 deletions(-) delete mode 100644 src/g3dwrap.cpp delete mode 100644 src/wm_player.cpp delete mode 100644 src/wmresourcemng.cpp delete mode 100644 src/world_camera.cpp delete mode 100644 src/worldmap_new.cpp delete mode 100644 src/worldmapdata.cpp delete mode 100644 src/worldmapdata.h (limited to 'src') diff --git a/src/g3dwrap.cpp b/src/g3dwrap.cpp deleted file mode 100644 index 644c5e8..0000000 --- a/src/g3dwrap.cpp +++ /dev/null @@ -1,90 +0,0 @@ -// nw4r::g3d wrapper - -namespace nw4r { -namespace g3d { - -class ResFile { - void * /*ResFileData*/ data; - - ResFile(void *p = NULL); - - void Init(); - bool CheckRevision() const; - - void * /*ResMdl*/ GetResMdl(const char *str) const; - void * /*ResPltt*/ GetResPltt(const ResName n) const; - void * /*ResTex*/ GetResTex(const char *str) const; - void * /*ResTex*/ GetResTex(const ResName n) const; - void * /*ResTex*/ GetResTex(u32 idx) const; - void * /*ResAnmChr*/ GetResAnmChr(const char *str) const; - void * /*ResAnmVis*/ GetResAnmVis(const char *str) const; - void * /*ResAnmClr*/ GetResAnmClr(const char *str) const; - void * /*ResAnmTexPat*/ GetResAnmTexPat(const char *str) const; - void * /*ResAnmTexSrt*/ GetResAnmTexSrt(const char *str) const; - void * /*ResAnmScn*/ GetResAnmScn(const char *str) const; - - bool Bind(ResFile rhs); -}; - -void *__ScnMdl__Construct( - void * /*MEMAllocator*/ pHeap, - u32 *pSize, - void * /*ResMdl*/ mdl, - u32 bufferOption, - int nView = 1); - - -void *__AnmObjChrRes__Construct( - void * /*MEMAllocator*/ pHeap, - u32 *pSize, - void * /*ResAnmChr*/ resAnm, - void * /*ResMdl*/ resMdl, - bool bHasCache); - - -void *__AnmObjVisRes__Construct( - void * /*MEMAllocator*/ pHeap, - u32 *pSize, - void * /*ResAnmVis*/ resAnm, - void * /*ResMdl*/ resMdl); - - -void *__AnmObjTexPatRes__Construct( - void * /*MEMAllocator*/ pHeap, - u32 *pSize, - void * /*ResAnmTexPat*/ resAnm, - void * /*ResMdl*/ resMdl, - bool bHasCache); - - -void *__AnmObjTexSrtRes__Construct( - void * /*MEMAllocator*/ pHeap, - u32 *pSize, - void * /*ResAnmTexSrt*/ resAnm, - void * /*ResMdl*/ resMdl, - bool bHasCache); - - -void *__AnmObjMatClrRes__Construct( - void * /*MEMAllocator*/ pHeap, - u32 *pSize, - void * /*ResAnmMatClr*/ resAnm, - void * /*ResMdl*/ resMdl, - bool bHasCache); - - -void *__AnmObjShpRes__Construct( - void * /*MEMAllocator*/ pHeap, - u32 *pSize, - void * /*ResAnmShp*/ resAnm, - void * /*ResMdl*/ resMdl, - bool bHasCache); - - - -bool InsertIntoScene(void *scnObj); // 80164F90 - - - -} -} \ No newline at end of file diff --git a/src/wm_player.cpp b/src/wm_player.cpp deleted file mode 100644 index 39dc0a5..0000000 --- a/src/wm_player.cpp +++ /dev/null @@ -1,192 +0,0 @@ -#include "worldmap.h" - -daWMPlayer_c *daWMPlayer_c::instance; - -int daWMPlayer_c::onCreate() { - OSReport("* dWMPlayer_c created\n"); - - OSReport("Init handler...\n"); - this->modelHandler = new dPlayerModelHandler_c(0); - this->modelHandler->loadModel(0, 3, 2); - this->modelHandler->mdlClass->startAnimation(0, 1.2, 10.0, 0.0); - this->modelHandler->setSRT((Vec){0.0,100.0,-100.0}, (S16Vec){0,0,0}, (Vec){2.0,2.0,2.0}); - this->modelHandler->draw(); - OSReport("Init done!\n"); - - pos = (Vec){0.0f,0.0f,0.0f}; - rot = (S16Vec){0,0,0}; - scale = (Vec){1.5f,1.5f,1.5f}; - - current_param = 0; - - /*//#define BRRES_NAME "fruits_kusa_gake" - //#define MODEL_NAME "fruits_kusa_gake_S" - - #define BRRES_NAME "bgB_4502" - #define MODEL_NAME BRRES_NAME - - OSReport("Loading nw4r model\n"); - //LoadFile(&this->nw4rMdlFH, "/Object/" BRRES_NAME ".arc"); - LoadFile(&this->nw4rMdlFH, "/Object/CrapMap.arc"); - OSReport("Loaded. Reading arc\n"); - ARCHandle arc; - ARCFileInfo keyinfo; - ARCInitHandle(this->nw4rMdlFH.filePtr, &arc); - //bool arcres = ARCOpen(&arc, "g3d/" BRRES_NAME ".brres", &keyinfo); - bool arcres = ARCOpen(&arc, "g3d/model.brres", &keyinfo); - OSReport(arcres ? "Success\n" : "Fail\n"); - - OSReport("Getting nw4r model\n"); - //void *brres = DVD_GetFile(GetDVDClass2(), "fruits_kusa_gake", "g3d/fruits_kusa_gake.brres"); - - OSReport("Done. Constructing model\n"); - void *brres = ARCGetStartAddrInMem(&keyinfo); - OSReport("brres @ %p\n", brres); - nw4r::g3d::ResFile resfile(brres); - OSReport(resfile.CheckRevision() ? "Success\n" : "Fail\n"); - resfile.Init(); - OSReport(resfile.Bind(resfile) ? "Success\n" : "Fail\n"); - //void *mdl = resfile.GetResMdl(MODEL_NAME); - void *mdl = resfile.GetResMdl("CrapMap"); - OSReport("MDL @ %p, %d\n", mdl, 1099); - //this->nw4rMdlTest = nw4r::g3d::ConstructScnMdl(mdl, 0x20, 1); - //this->nw4rMdlTest = nw4r::g3d::ConstructScnMdlSimple(mdl, 1); - OSReport(this->allocator.link(-1, GameHeaps[0], 0, 0x20) ? "Success\n" : "Fail\n"); - OSReport(this->nw4rMdl.setup(&mdl, &this->allocator, 0, 1, 0) ? "Success\n" : "Fail\n"); - //this->nw4rMdl.sub_80064BF0(); - //this->nw4rMdl.oneSetupType(); - OSReport("Unlink returned %d\n", this->allocator.unlink()); - OSReport("Done!\n"); - - Mtx asdf; - MTXIdentity(asdf); - this->nw4rMdl.setDrawMatrix(asdf); - - ARCClose(&keyinfo);*/ - - return true; -} - -int daWMPlayer_c::onDelete() { - delete modelHandler; - OSReport("* dWMPlayer_c deleted\n"); - - return true; -} - - -int daWMPlayer_c::onExecute() { - this->modelHandler->update(); - this->modelHandler->setSRT(this->pos, this->rot, this->scale); - -#ifdef MARIO_OPTIONS - // Before we leave, do the debug movement stuff - int heldButtons = Remocon_GetButtons(GetActiveRemocon()); - int nowPressed = Remocon_GetPressed(GetActiveRemocon()); - char buf[100]; - bool updated = false; - - if (nowPressed & WPAD_LEFT) { - current_param--; - updated = true; - } - - if (nowPressed & WPAD_RIGHT) { - current_param++; - updated = true; - } - - if (current_param < 0) - current_param = 8; - - if (current_param > 8) - current_param = 0; - - float pos_mod = 0.0f; - short rot_mod = 0.0f; - float scale_mod = 0.0f; - if (nowPressed & WPAD_ONE) { - pos_mod -= 5.0f; - rot_mod -= 0x1000; - scale_mod -= 0.1f; - updated = true; - } else if (nowPressed & WPAD_TWO) { - pos_mod += 5.0f; - rot_mod += 0x1000; - scale_mod += 0.1f; - updated = true; - } - - if (!updated) return true; - - if (current_param == 0) { - pos.x += pos_mod; - sprintf(buf, "X position: %f", pos.x); - } else if (current_param == 1) { - pos.y += pos_mod; - sprintf(buf, "Y position: %f", pos.y); - } else if (current_param == 2) { - pos.z += pos_mod; - sprintf(buf, "Z position: %f", pos.z); - } else if (current_param == 3) { - rot.x += rot_mod; - sprintf(buf, "X rotation: 0x%04x", rot.x); - } else if (current_param == 4) { - rot.y += rot_mod; - sprintf(buf, "Y rotation: 0x%04x", rot.y); - } else if (current_param == 5) { - rot.z += rot_mod; - sprintf(buf, "Z rotation: 0x%04x", rot.z); - } else if (current_param == 6) { - scale.x += scale_mod; - sprintf(buf, "X scale: %f", scale.x); - } else if (current_param == 7) { - scale.y += scale_mod; - sprintf(buf, "Y scale: %f", scale.y); - } else if (current_param == 8) { - scale.z += scale_mod; - sprintf(buf, "Z scale: %f", scale.z); - } - - dScNewerWorldMap_c::instance->SetTitle(buf); -#endif - - return true; -} - -int daWMPlayer_c::onDraw() { - this->modelHandler->draw(); - - //OSReport("Adding to scene\n"); - //this->nw4rMdl.scheduleForDrawing(); - //OSReport("done\n"); - - return true; -} - - -void daWMPlayer_c::startAnimation(int id, float frame, float unk, float updateRate) { - if (id == currentAnim && frame == currentFrame && unk == currentUnk && updateRate == currentUpdateRate) - return; - - currentAnim = id; - currentFrame = frame; - currentUnk = unk; - currentUpdateRate = updateRate; - this->modelHandler->mdlClass->startAnimation(id, frame, unk, updateRate); -} - - - -daWMPlayer_c *daWMPlayer_c::build() { - OSReport("Creating WMPlayer\n"); - - void *buffer = AllocFromGameHeap1(sizeof(daWMPlayer_c)); - daWMPlayer_c *c = new(buffer) daWMPlayer_c; - - OSReport("Created WMPlayer @ %p\n", c); - - instance = c; - return c; -} - diff --git a/src/wmresourcemng.cpp b/src/wmresourcemng.cpp deleted file mode 100644 index 4a71753..0000000 --- a/src/wmresourcemng.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "worldmap.h" - - - - -dWMResourceMng_c::dWMResourceMng_c() { - hasSetPath = false; - isSetLoaded = false; - isLoadingComplete = false; -} - -dWMResourceMng_c::~dWMResourceMng_c() { - if (isSetLoaded) { - for (int i = 0; i < setData->count; i++) { - resLoaders[i].unload(); - } - - delete[] resLoaders; - } - - setLoader.unload(); -} - - - -bool dWMResourceMng_c::isLoaded() { - return isLoadingComplete; -} - - -bool dWMResourceMng_c::loadSet(const char *setName) { - if (isLoadingComplete) - return true; - - // only start the loading process if we haven't done that already - if (!isSetLoaded) { - if (!hasSetPath) { - snprintf(setPath, sizeof(setPath), "/Maps/%s.fileset", setName); - hasSetPath = true; - } - - void *result = setLoader.load(setPath); - if (result == 0) - return false; - - // cool, we've got it, now load everything here - setData = (WMResSetHeader*)result; - - resLoaders = new dDvdLoader_c[setData->count]; - - isSetLoaded = true; - } - - // now try to load every resource - // if even ONE of them fails, then don't return true - bool isLoadingComplete = true; - - for (int i = 0; i < setData->count; i++) { - isLoadingComplete &= (resLoaders[i].load(setData->getName(i)) != 0); - } - - // if they are ALL loaded, then we'll return true! - return isLoadingComplete; -} - - -void *dWMResourceMng_c::operator[](u32 key) { - if (!isLoadingComplete) - return 0; - - for (int i = 0; i < setData->count; i++) { - if (key == setData->entries[i].key) - return resLoaders[i].buffer; - } - - return 0; -} - diff --git a/src/world_camera.cpp b/src/world_camera.cpp deleted file mode 100644 index 1fc3a5a..0000000 --- a/src/world_camera.cpp +++ /dev/null @@ -1,94 +0,0 @@ -#include "worldmap.h" - -dWorldCamera_c *dWorldCamera_c::instance = 0; - -dWorldCamera_c *dWorldCamera_c::build() { - OSReport("Creating WorldCamera\n"); - - void *buffer = AllocFromGameHeap1(sizeof(dWorldCamera_c)); - dWorldCamera_c *c = new(buffer) dWorldCamera_c; - - OSReport("Created WorldCamera @ %p\n", c); - - instance = c; - return c; -} - - - - -int dWorldCamera_c::onCreate() { - this->camPos = (Point3d){0.0f, 400.0f, 400.0f}; - this->camRotate = (Point3d){-40.0f, 0.0f, 0.0f}; // ZXY order - - return true; -} - - -int dWorldCamera_c::onDelete() { - return true; -} - - -int dWorldCamera_c::onExecute() { - int heldButtons = Remocon_GetButtons(GetActiveRemocon()); - - if (heldButtons & WPAD_LEFT) - this->camPos.x -= 5.0f; - if (heldButtons & WPAD_RIGHT) - this->camPos.x += 5.0f; - - if (heldButtons & WPAD_UP) - this->camPos.z -= 5.0f; - if (heldButtons & WPAD_DOWN) - this->camPos.z += 5.0f; - - if (heldButtons & WPAD_MINUS) - this->camRotate.y -= 2.0f; - if (heldButtons & WPAD_PLUS) - this->camRotate.y += 2.0f; - - return true; -} - - -int dWorldCamera_c::onDraw() { - // fixup camera shit - GXRenderModeObj *rmode = nw4r::g3d::G3DState::GetRenderModeObj(); - - // 2D camera - nw4r::g3d::Camera cam2d(GetCameraByID(1)); - - if (rmode->field_rendering != 0) - cam2d.SetViewportJitter(VIGetNextField()); - - cam2d.SetOrtho(rmode->efbHeight, 0.0f, 0.0f, rmode->fbWidth * (IsWideScreen() ? 1.3333334f : 1.0f), -100000.0f, 100000.0f); - - // 3D camera - nw4r::g3d::Camera cam3d(GetCameraByID(0)); - - if (rmode->field_rendering != 0) - cam3d.SetViewportJitter(VIGetNextField()); - - cam3d.SetPerspective(45, (f32)rmode->viWidth / (f32)rmode->viHeight, 0.1f, 2400.0f); - - nw4r::g3d::Camera::PostureInfo posture; - posture.tp = nw4r::g3d::Camera::POSTURE_ROTATE; - posture.cameraRotate = this->camRotate; - - cam3d.SetPosition(this->camPos); - cam3d.SetPosture(posture); - - /*nw4r::g3d::Camera::PostureInfo posture; - posture.tp = nw4r::g3d::Camera::POSTURE_LOOKAT; - posture.cameraUp = (Point3d){0,1,0}; - posture.cameraTarget = (Point3d){0,0,0}; - - cam3d.SetPosition((Point3d){-3,2,3}); - cam3d.SetPosture(posture);*/ - - //cam3d.GetCameraMtx(&T3D::Camera.view_matrix); - - return true; -} - diff --git a/src/worldmap.cpp b/src/worldmap.cpp index 97d1b73..2db382a 100644 --- a/src/worldmap.cpp +++ b/src/worldmap.cpp @@ -1,245 +1,1358 @@ -/* - * Newer Super Mario Bros. Wii - * 2D World Maps - * - * Wish me luck. That's all I'm saying. --Treeki - * Started: 03/06/2010; 11:52pm - */ - #include "worldmap.h" -/* Code */ -void PaneSetAllVisible(void *pane, int flag, bool value) { - //OSReport("%08X {\n", pane); - if (value) - ((char*)pane)[0xBB] &= ~(1 << flag); - else - ((char*)pane)[0xBB] |= (1 << flag); - - nw4rLinkListNode *firstNode = (nw4rLinkListNode*)(pane+0x14); - nw4rLinkListNode *currentNode = (nw4rLinkListNode*)(firstNode->prev); - - while (currentNode != firstNode) { - PaneSetAllVisible(((void*)currentNode) - 4, flag, value); - currentNode = (nw4rLinkListNode*)currentNode->prev; - } - //OSReport("} %08X\n", pane); -} - -void LayoutSetAllVisible(void *layout, int flag, bool value) { - // get the rootpane from offset 0x10 - PaneSetAllVisible(*((void**)(layout+0x10)), flag, value); -} - - -void *LoadFile(FileHandle *handle, char *name) { - int entryNum = DVDConvertPathToEntrynum(name); - - DVDHandle dvdhandle; - if (!DVDFastOpen(entryNum, &dvdhandle)) { - OSReport("Cannot open file %s\n", name); - return 0; - } - - handle->length = dvdhandle.length; - handle->filePtr = EGG__Heap__alloc((handle->length+0x1F) & ~0x1F, 0x20, GetArchiveHeap()); - - int ret = DVDReadPrio(&dvdhandle, handle->filePtr, (handle->length+0x1F) & ~0x1F, 0, 2); - //OSReport("retval: %x\n", ret); - - DVDClose(&dvdhandle); - - return handle->filePtr; -} - -bool FreeFile(FileHandle *handle) { - if (!handle) return false; - - if (handle->filePtr) - EGG__Heap__free(handle->filePtr, GetArchiveHeap()); - - return true; +extern "C" void LoadMapScene(); + +dScNewerWorldMap_c *dScNewerWorldMap_c::instance = 0; + + +dScNewerWorldMap_c *dScNewerWorldMap_c::build() { + // return new dScNewerWorldMap_c; + OSReport("Creating WorldMap\n"); + + void *buffer = AllocFromGameHeap1(sizeof(dScNewerWorldMap_c)); + dScNewerWorldMap_c *c = new(buffer) dScNewerWorldMap_c; + + OSReport("Created WorldMap @ %p\n", c); + + instance = c; + return c; } -void d2DWorldMap_c__LoadLayout(d2DWorldMap_c *self, char *arcName, char *prefix, char *brlytName) { - //char *arc = NSMBWLoadFile(&self->fileHandle, arcName, 0, *((void**)0x8042A72C)); - //char *arc = NSMBWLoadFile(&self->fileHandle, arcName, 0, 0); - char *arc = (char*)LoadFile(&self->fileHandle, arcName); - if (arc == 0) { - OSReport("Can't load %s :(\n", arcName); - while (true) { } - } - - // allocate 0xC0 space for the ArcResourceAccessor - // unsure what the actual size is, but we should be safe with that - self->ResAcc = AllocFromGameHeap1(0xC0); - nsmbw__ArcResourceAccessor__ArcResourceAccessor(self->ResAcc); -#ifdef REGION_NTSC - *((void**)self->ResAcc) = (void*)0x802FE410; // replace vtable with NSMB's version -#endif -#ifdef REGION_PAL - *((void**)self->ResAcc) = (void*)0x802FE710; // replace vtable with NSMB's version + +#define SELC_SETUP_DONE(sc) (*((bool*)(((u32)(sc))+0xD38))) + +#define EASYP_SETUP_DONE(ep) (*((bool*)(((u32)(ep))+0x278))) +#define EASYP_ACTIVE(ep) (*((bool*)(((u32)(ep))+0x279))) + +#define CSMENU_SETUP_DONE(csm) (*((bool*)(((u32)(csm))+0x270))) +#define CSMENU_ACTIVE(csm) (*((bool*)(((u32)(csm))+0x271))) +#define CSMENU_CHOICE_OK(csm) (*((bool*)(((u32)(csm))+0x272))) +#define CSMENU_UNK(csm) (*((bool*)(((u32)(csm))+0x273))) +#define CSMENU_CURRENT(csm) (*((int*)(((u32)(csm))+0x268))) + +#define YESNO_SETUP_DONE(ynw) (*((bool*)(((u32)(ynw))+0x294))) +#define YESNO_VISIBLE(ynw) (*((bool*)(((u32)(ynw))+0x295))) +#define YESNO_CLOSE(ynw) (*((bool*)(((u32)(ynw))+0x296))) +#define YESNO_OPENING(ynw) (*((bool*)(((u32)(ynw))+0x297))) +#define YESNO_REFUSED(ynw) (*((bool*)(((u32)(ynw))+0x298))) +#define YESNO_CANCELLED(ynw) (*((bool*)(((u32)(ynw))+0x299))) +#define YESNO_CANCELLED2(ynw) (*((bool*)(((u32)(ynw))+0x29A))) +#define YESNO_CURRENT(ynw) (*((int*)(((u32)(ynw))+0x284))) +#define YESNO_TYPE(ynw) (*((int*)(((u32)(ynw))+0x28C))) + +#define NPCHG_SETUP_DONE(npc) (*((bool*)(((u32)(npc))+0x67C))) +#define NPCHG_ACTIVE(npc) (*((bool*)(((u32)(npc))+0x67E))) +#define NPCHG_HIDE_FOR_EASYP(npc) (*((bool*)(((u32)(npc))+0x67F))) +#define NPCHG_READY(npc) (*((bool*)(((u32)(npc))+0x680))) +#define NPCHG_CCSB(npc,idx) (((void**)(((u32)(npc))+0x74))[(idx)]) +#define NPCHG_CCSC(npc,idx) (((void**)(((u32)(npc))+0x84))[(idx)]) +#define NPCHG_CCSA(npc,idx) (((void**)(((u32)(npc))+0x94))[(idx)]) +#define NPCHG_CCI(npc,idx) (((void**)(((u32)(npc))+0xA4))[(idx)]) +#define NPCHG_2DPLAYER(npc,idx) (((void**)(((u32)(npc))+0x64C))[(idx)]) + +#define STKI_SETUP_DONE(si) (*((bool*)(((u32)(si))+0x310))) +#define STKI_SHADOW(si) (*((void**)(((u32)(si))+0x310))) +#define STKI_2DPLAYER(si,idx) (((void**)(((u32)(si))+0x2E4))[(idx)]) +#define STKI_ITEM(si,idx) (((void**)(((u32)(si))+0x2F4))[(idx)]) +#define STKI_SHOW(si) (*((bool*)(((u32)(si))+0x8DD))) + +#define SIS_SETUP_DONE(sis) (*((bool*)(((u32)(sis))+0x260))) + +#define CCSB_ACTIVE(ccsb) (*((bool*)(((u32)(ccsb))+0x29C))) + +#define CCSC_ACTIVE(ccsc) (*((bool*)(((u32)(ccsc))+0x2A1))) + +#define PLAYER2D_SHOW_EASY_PAIRING(p2d) (*((bool*)(((u32)(p2d))+0x264))) + +#define CONT_LIVES(cont,idx) (((int*)(((u32)(cont))+0x2B8))[(idx)]) +#define CONT_SETUP_DONE(cont) (*((bool*)(((u32)(cont))+0x2D4))) +#define CONT_UNK1(cont) (*((bool*)(((u32)(cont))+0x2D5))) +#define CONT_UNK2(cont) (*((bool*)(((u32)(cont))+0x2D6))) +#define CONT_DONE(cont) (*((bool*)(((u32)(cont))+0x2D7))) +#define CONT_UNK3(cont) (*((bool*)(((u32)(cont))+0x2E0))) + +#define STATE_START_DVD 0 +#define STATE_LOAD_RES 1 +#define STATE_END_DVD 2 +#define STATE_SETUP_WAIT 3 +#define STATE_LIMBO 4 +#define STATE_CONTINUE_WAIT 5 +#define STATE_NORMAL 6 +#define STATE_OPT_CHANGE_WAIT 7 +#define STATE_CSMENU 8 +#define STATE_TITLE_CONFIRM_OPEN_WAIT 9 +#define STATE_TITLE_CONFIRM_SELECT 10 +#define STATE_TITLE_CONFIRM_HIT_WAIT 11 +#define STATE_PLAYER_CHANGE_WAIT 12 +#define STATE_EASY_PAIRING_WAIT 13 +#define STATE_POWERUPS_WAIT 14 +#define STATE_SAVE_OPEN 15 +#define STATE_SAVE_SELECT 16 +#define STATE_SAVE_WINDOW_CLOSE 17 +#define STATE_SAVE_DO 18 +#define STATE_SAVE_END_WINDOW 19 +#define STATE_SAVE_END_CLOSE_WAIT 20 +#define STATE_QUICKSAVE_OPEN 21 +#define STATE_QUICKSAVE_SELECT 22 +#define STATE_QUICKSAVE_WINDOW_CLOSE 23 +#define STATE_QUICKSAVE_DO 24 +#define STATE_QUICKSAVE_END_WINDOW 25 +#define STATE_QUICKSAVE_END_CLOSE_WAIT 26 +#define STATE_SAVE_ERROR 27 + +#define MENU_HEIGHT 15 + +const char *anim1 = "optionActivated.brlan"; +const char *anim2 = "optionDeactivated.brlan"; + +const char *group1 = "G_opt00"; +const char *group2 = "G_opt01"; +const char *group3 = "G_opt02"; +const char *group4 = "G_opt03"; +const char *group5 = "G_opt04"; +const char *group6 = "G_opt05"; +const char *group7 = "G_opt06"; +const char *group8 = "G_opt07"; +const char *group9 = "G_opt08"; +const char *group10 = "G_opt09"; +const char *group11 = "G_opt10"; +const char *group12 = "G_opt11"; +const char *group13 = "G_opt12"; +const char *group14 = "G_opt13"; +const char *group15 = "G_opt14"; + +//void *EGG__Heap__alloc(unsigned long size, int unk, void *heap); + +#ifdef LEVEL_MENU +void dScNewerWorldMap_c::StartLevel() { + LevelInfo_Entry *level = LevelInfo_GetLevels(this->levelInfo, this->currentPage); + level += this->selections[this->currentPage]; + StartLevel(level); +} #endif - nsmbw__ArcResourceAccessor__Set(self->ResAcc, arc, prefix); - - char *brlyt = nsmbw__ArcResourceAccessor__GetResource(self->ResAcc, 0x626C7974, brlytName, 0); - - // allocate 0x20 space for the Layout - self->Layout = AllocFromGameHeap1(0x20); - lyt__Layout__Layout(self->Layout); - lyt__Layout__Build(self->Layout, brlyt, self->ResAcc); - - // allocate 0x54 space for the DrawInfo - self->DrawInfo = (nw4r__lyt__DrawInfo*)AllocFromGameHeap1(0x54); - lyt__DrawInfo__DrawInfo(self->DrawInfo); - - // set up the anims - self->BrlanArray = 0; - self->BrlanCount = 0; - - //PSMTXTransApply(self->DrawInfo->matrix, self->DrawInfo->matrix, 304, 228, 0); - - /*self->DrawInfo->left = 0; - self->DrawInfo->top = 0; - self->DrawInfo->right = 608; - self->DrawInfo->bottom = 456;*/ -} - -void d2DWorldMap_c__LoadAnims(d2DWorldMap_c *self, const char **brlanNames, int brlanCount) { - //OSReport("Loading anims\n"); - void *buf = __nwa(brlanCount*0x1C + 0x10); - //OSReport("Alloced buffer: %08X\n", buf); - // function params are BrlanHandler_ctor, BrlanHandler_dtor - self->BrlanArray = construct_new_array(buf, (void*)0x800C9150, (void*)0x800C91A0, 0x1C, brlanCount); - //OSReport("Constructed array: %08X\n", self->BrlanArray); - - // huge hack coming up - struct TrickClass_t { - void *pad1; - void *resacc; - void *pad2; - void *pad3; - void *pad4; - void *pad5; - void *pad6; - void *pad7; - } TrickClass; - TrickClass.resacc = self->ResAcc; - //OSReport("Created TrickClass\n"); - - for (int i = 0; i < brlanCount; i++) { - //OSReport("b@%08X\n", self->BrlanArray+(0x1C*i)); - //OSReport("Loading brlan %d %s\n", i, brlanNames[i]); - NSMBWBrlan__Load(self->BrlanArray+(0x1C*i), brlanNames[i], (void*)(&TrickClass), self->Layout, 1); - //OSReport("Done loading brlan %d %s\n", i, brlanNames[i]); - //OSReport("a@%08X\n", self->BrlanArray+(0x1C*i)); - } - OSReport("Done loading brlans\n"); - - /*char *brlan = nsmbw__ArcResourceAccessor__GetResource(self->ResAcc, 0x616e696d, brlanName, 0); - OSReport("grabbed brlan %s to %08X\n", brlanName, brlan); - - // call CreateAnimTransform - CreateAnimTransformFunc CreateAnimTransform = (*((CreateAnimTransformFunc**)self->Layout))[5]; - void *atf = CreateAnimTransform(self->Layout, brlan, self->ResAcc); - - // call BindAnimation - BindAnimationFunc BindAnimation = (*((BindAnimationFunc**)self->Layout))[7]; - BindAnimation(self->Layout, atf); - - return atf;*/ -} - -void d2DWorldMap_c__SetAnimationEnable(d2DWorldMap_c *self, void *anim, bool val) { - SetAnimationEnableFunc SetAnimationEnable = (*((SetAnimationEnableFunc**)self->Layout))[11]; - SetAnimationEnable(self->Layout, anim, val); -} - - -void d2DWorldMap_c__FreeLayout(d2DWorldMap_c *self) { - if (self->BrlanArray) { - for (int i = 0; i < self->BrlanCount; i++) { - NSMBWBrlan__Free(self->BrlanArray+(0x1C*i)); + +void dScNewerWorldMap_c::StartLevel(LevelInfo_Entry *entry) { + for (int i = 0; i < 4; i++) { + bool isThere = QueryPlayerAvailability(i); + int id = Player_ID[i]; + Player_Active[i] = isThere ? 1 : 0; + if (!isThere) Player_Flags[i] = 0; + } + + StartLevelInfo sl; + sl.unk1 = 0; + sl.unk2 = 0xFF; + sl.unk3 = 0; + sl.unk4 = 0; + sl.purpose = 0; + + sl.world1 = entry->world; + sl.world2 = entry->world; + sl.level1 = entry->level; + sl.level2 = entry->level; + + // hopefully this will fix the Star Coin issues + SetSomeConditionShit(entry->world, entry->level, 2); + + ActivateWipe(WIPE_MARIO); + + DoStartLevel(GetGameMgr(), &sl); +} + +#ifdef LEVEL_MENU +void dScNewerWorldMap_c::SetTitle(const char *text) { + unsigned short conv_buf[0x1FF]; + int length = strlen(text); + if (length > 0x1FF) + length = 0x1FF; + + for (int i = 0; i < length; i++) { + conv_buf[i] = text[i]; + } + + void *textBox = EmbeddedLayout_FindTextBoxByName(this->layout, "ScreenTitle"); + TextBox_SetString(textBox, conv_buf, 0); +} + +void dScNewerWorldMap_c::GenText() { + char buf[0x1FF]; + char paneNameBuf[0x20]; + char textBoxNameBuf[0x20]; + unsigned short wchars[0x1FF]; + + SaveBlock *save = GetSaveFile()->GetBlock(-1); + + LevelInfo_Section *section = LevelInfo_GetSection(this->levelInfo, this->currentPage); + LevelInfo_Entry *levels = LevelInfo_GetLevels(this->levelInfo, section); + + int count = section->levelCount; + + for (int i = 0; i < MENU_HEIGHT; i++) { + sprintf(paneNameBuf, "Opt%02d", i); + sprintf(textBoxNameBuf, "OptText%02d", i); + void *pane = EmbeddedLayout_FindPaneByName(this->layout, paneNameBuf); + void *textBox = EmbeddedLayout_FindTextBoxByName(this->layout, textBoxNameBuf); + + if (i < count) { + // valid level + PANE_FLAGS(pane) |= 1; + + u32 conds = save->GetLevelCondition(levels[i].world, levels[i].level); + + char cond1, cond2, cond3, cond4, cond5; + cond1 = (conds & COND_NORMAL ? 'x' : '.'); + cond2 = (conds & COND_SECRET ? 'x' : '.'); + cond3 = (conds & COND_COIN1 ? 'x' : '.'); + cond4 = (conds & COND_COIN2 ? 'x' : '.'); + cond5 = (conds & COND_COIN3 ? 'x' : '.'); + + sprintf(buf, "%s %c%c %c%c%c", LevelInfo_GetName(this->levelInfo, &levels[i]), cond1, cond2, cond3, cond4, cond5); + + for (int i = 0; i < 0x1FF; i++) { + wchars[i] = buf[i]; + if (buf[i] == 0) break; + } + + TextBox_SetString(textBox, wchars, 0); + } else { + // invalid, hide the pane + PANE_FLAGS(pane) &= ~1; } - - // function param is BrlanHandler_dtor - DeleteArray(self->BrlanArray, (void*)0x800C91A0); - } - - lyt__Layout__dt(self->Layout, 0); - nsmbw__ArcResourceAccessor__dt(self->ResAcc, 0); - lyt__DrawInfo__dt(self->DrawInfo, 0); - - FreeFromGameHeap1(self->ResAcc); - FreeFromGameHeap1(self->Layout); - FreeFromGameHeap1(self->DrawInfo); - - //NSMBWFreeFile(&self->fileHandle); - FreeFile(&self->fileHandle); -} - - - -const char *bannerStart = "banner_start.brlan"; -const char *bannerLoop = "banner_loop.brlan"; - -bool d2DWorldMap_c__onCreate(d2DWorldMap_c *self) { - OSReport("Starting\n"); - //d2DWorldMap_c__LoadLayout(self, testArc, "arc", "messageWindow_02.brlyt"); - d2DWorldMap_c__LoadLayout(self, "/NewerRes/wmap.arc", "arc", "banner.brlyt"); - OSReport("Loaded\n"); - //d2DWorldMap_c__LoadLayout(self, "/NewerRes/wmap.arc", "arc", "openingTitle_EU_00.brlyt"); - //d2DWorldMap_c__LoadLayout(self, "/NewerRes/wmap.arc", "arc", "pauseMenu_16.brlyt"); - //self->StartAnim = d2DWorldMap_c__LoadAnim(self, "banner_start.brlan"); - //OSReport("startanim: %X\n", self->StartAnim); - //self->LoopAnim = d2DWorldMap_c__LoadAnim(self, "banner_loop.brlan"); - - const char* anims[2]; - anims[0] = bannerStart; - anims[1] = bannerLoop; - OSReport("Set anims\n"); - - d2DWorldMap_c__LoadAnims(self, anims, 2); - OSReport("Loaded anims\n"); - OSReport("layout is at %8X\n", self->Layout); // 815e7450 - OSReport("Enabled anims\n"); - d2DWorldMap_c__SetAnimationEnable(self, (void*)0x815ED040, true); - - //LayoutMakeAllVisible(self->Layout, true); - - /*bool (*idk)(int) = (bool(*)(int))0x800B0DB0; - idk(0); - - bool (*idk2)(int*) = (bool(*)(int*))0x800E4940; - int blah = 0xFF; - idk2(&blah);*/ - + } +} +#endif + +int dScNewerWorldMap_c::onCreate() { + LoadMapScene(); + GameSetup__LoadScene(0); // lol, stolen from GAME_SETUP + + #ifdef LEVEL_MENU + this->layout = (Layout*)AllocFromGameHeap1(sizeof(Layout)); + if (!this->layout) { + OSReport("memalloc fail\n"); + InfiniteLoop; + } + + EmbeddedLayout_ctor(this->layout); + EmbeddedLayout_LoadArc(this->layout, "NewerRes/wmap.arc"); + + if (!EmbeddedLayout_Build(this->layout, "levelSelect.brlyt", 0)) { + OSReport("build fail\n"); + InfiniteLoop; + } + + + const char *anims[2] = {anim1, anim2}; + EmbeddedLayout_LoadBrlans(this->layout, anims, 2); + + const char *groups[30] = { + group1, group2, group3, group4, group5, + group6, group7, group8, group9, group10, + group11, group12, group13, group14, group15, + group1, group2, group3, group4, group5, + group6, group7, group8, group9, group10, + group11, group12, group13, group14, group15, + }; + + int mappings[30] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; + EmbeddedLayout_LoadGroups(this->layout, groups, mappings, 30); + + EmbeddedLayout_DisableAllAnims(this->layout); + + for (int i = 0; i < 15; i++) { + EmbeddedLayout_ResetAnimToInitialState(this->layout, i, false); + } + #endif + + + this->selectCursor = CreateParentedObject(SELECT_CURSOR, this, 0, 0); + this->csMenu = CreateParentedObject(COURSE_SELECT_MENU, this, 0, 0); + this->yesNoWindow = CreateParentedObject(YES_NO_WINDOW, this, 0, 0); + this->numPeopleChange = CreateParentedObject(NUMBER_OF_PEOPLE_CHANGE, this, 0, 0); + + for (int i = 0; i < 4; i++) { + void *ccsb = CreateParentedObject(CHARACTER_CHANGE_SELECT_BASE, this, i, 0); + void *ccsc = CreateParentedObject(CHARACTER_CHANGE_SELECT_CONTENTS, this, i, 0); + void *ccsa = CreateParentedObject(CHARACTER_CHANGE_SELECT_ARROW, this, i, 0); + void *cci = CreateParentedObject(CHARACTER_CHANGE_INDICATOR, this, i, 0); + + NPCHG_CCSB(this->numPeopleChange, i) = ccsb; + NPCHG_CCSC(this->numPeopleChange, i) = ccsc; + NPCHG_CCSA(this->numPeopleChange, i) = ccsa; + NPCHG_CCI(this->numPeopleChange, i) = cci; + } + + this->continueObj = CreateParentedObject(CONTINUE, this, 0, 0); + + this->stockItem = CreateParentedObject(STOCK_ITEM, this, 0, 0); + this->stockItemShadow = CreateParentedObject(STOCK_ITEM_SHADOW, this, 0, 0); + STKI_SHADOW(this->stockItem) = this->stockItemShadow; + + this->easyPairing = CreateParentedObject(EASY_PAIRING, this, 0, 0); + + //this->player = (daWMPlayer_c*)CreateParentedObject(WM_PLAYER, this, 0, 2); + + CreateParentedObject(WORLD_CAMERA, this, 0, 0); + + this->state = STATE_START_DVD; + + #ifdef LEVEL_MENU + this->layout->drawOrder = 0; + #endif + + *CurrentDrawFunc = NewerMapDrawFunc; + + // level info + this->levelInfo = LoadFile(&this->levelInfoFH, "/NewerRes/LevelInfo.bin"); + LevelInfo_Prepare(&this->levelInfoFH); + + // load the menu info + SaveBlock *save = GetSaveFile()->GetBlock(-1); + + #ifdef LEVEL_MENU + this->currentPage = save->current_world; + + // bounds check + if (save->current_path_node >= 15) + save->current_path_node = 0; + + int sCount = LevelInfo_GetSectionCount(this->levelInfo); + this->selections = (int*)AllocFromGameHeap1(sizeof(int) * sCount); + + for (int i = 0; i < sCount; i++) { + this->selections[i] = 0; + } + + this->selections[this->currentPage] = save->current_path_node; + + // show button anim + EmbeddedLayout_EnableNonLoopAnim(this->layout, save->current_path_node, false); + #endif + + LoadModel(); + + wmData.load("/NewerRes/TestMap.wm"); + + + WMDataHeader *hdr = (WMDataHeader*)wmData.fh.filePtr; + if (save->current_path_node >= hdr->pointCount) { + this->currentPoint = wmData.getPath(0)->startPoint; + } else { + this->currentPoint = hdr->pointList[save->current_path_node]; + } + + #ifdef LEVEL_MENU + this->GenText(); + #endif + + return true; } -bool d2DWorldMap_c__onDelete(d2DWorldMap_c *self) { - //d2DWorldMap_c__FreeLayout(self); +int dScNewerWorldMap_c::onDelete() { + #ifdef LEVEL_MENU + EmbeddedLayout_FreeArc(this->layout); + EmbeddedLayout_Free(this->layout); + EmbeddedLayout_dtor(this->layout, false); + FreeFromGameHeap1(this->layout); + + FreeFromGameHeap1(this->selections); + #endif + + FreeFile(&this->levelInfoFH); + + FreeScene(0); + FreeScene(1); + + DVD_FreeFile(GetDVDClass2(), "SI_kinoko"); + DVD_FreeFile(GetDVDClass2(), "SI_fireflower"); + DVD_FreeFile(GetDVDClass2(), "SI_iceflower"); + DVD_FreeFile(GetDVDClass2(), "SI_penguin"); + DVD_FreeFile(GetDVDClass2(), "SI_propeller"); + DVD_FreeFile(GetDVDClass2(), "SI_star"); + return true; } -bool d2DWorldMap_c__onExecute(d2DWorldMap_c *self) { - // call Animate() - AnimateFunc Animate = (*((AnimateFunc**)self->Layout))[14]; - Animate(self->Layout, true); +int dScNewerWorldMap_c::onExecute() { + + if (QueryGlobal5758(0xFFFFFFFF)) return true; + if (CheckIfWeCantDoStuff()) return true; + + /**************************************************************************/ + // Read Wiimote Buttons + + int heldButtons = Remocon_GetButtons(GetActiveRemocon()); + int nowPressed = Remocon_GetPressed(GetActiveRemocon()); + + /**************************************************************************/ + // State Specific + + switch (this->state) { + /**********************************************************************/ + // STATE_START_DVD : Set up DVD + case STATE_START_DVD: + + DVD_Start(); + this->state = STATE_LOAD_RES; + + break; + + /**********************************************************************/ + // STATE_LOAD_RES : Load extra stuff we need + case STATE_LOAD_RES: + + DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_kinoko", 0); + DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_fireflower", 0); + DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_iceflower", 0); + DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_penguin", 0); + DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_propeller", 0); + DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_star", 0); + //DVD_LoadFile(GetDVDClass(), "Object", "fruits_kusa_gake", 0); + + this->state = STATE_END_DVD; + + break; + + /**********************************************************************/ + // STATE_END_DVD : Wait for files to load, end DVD + case STATE_END_DVD: + + if (!DVD_StillLoading(GetDVDClass2())) { + if (DVD_End()) { + this->state = STATE_SETUP_WAIT; + } + } + + break; + + /**********************************************************************/ + // STATE_SETUP_WAIT : Waiting for the world map managers to be set up + case STATE_SETUP_WAIT: { + + bool success = true; + + success &= CSMENU_SETUP_DONE(this->csMenu); + success &= SELC_SETUP_DONE(this->selectCursor); + success &= NPCHG_SETUP_DONE(this->numPeopleChange); + success &= YESNO_SETUP_DONE(this->yesNoWindow); + success &= CONT_SETUP_DONE(this->continueObj); + success &= STKI_SETUP_DONE(this->stockItem); + success &= SIS_SETUP_DONE(this->stockItemShadow); + success &= EASYP_SETUP_DONE(this->easyPairing); + + if (success) { + // ok, now we can set up other required shit + + // first up: player models for Stocked Items + for (int i = 0; i < 4; i++) { + void *obj = CreateChildObject(WM_2D_PLAYER, this, i, 0, 0); + STKI_2DPLAYER(this->stockItem,i) = obj; + NPCHG_2DPLAYER(this->numPeopleChange,i) = obj; + } + + // next: items for the Powerup screen + for (int i = 0; i < 7; i++) { + void *obj = CreateChildObject(WM_ITEM, this, i, 0, 0); + STKI_ITEM(this->stockItem,i) = obj; + } + + // now, check if we need to handle Continue + if (CheckIfContinueShouldBeActivated()) { + this->state = STATE_CONTINUE_WAIT; + CONT_UNK1(this->continueObj) = true; + CONT_UNK2(this->continueObj) = true; + CONT_UNK3(this->continueObj) = false; + } else { + #ifdef LEVEL_MENU + this->state = STATE_OPT_CHANGE_WAIT; + #else + this->state = STATE_NORMAL; + #endif + } + + // and now Player setup + #ifndef LEVEL_MENU + this->player = (daWMPlayer_c*)CreateParentedObject(WM_PLAYER, this, 0, 2); + this->player->modelHandler->mdlClass->setPowerup(2); + this->player->modelHandler->mdlClass->startAnimation(0, 1.2f, 10.0f, 0.0f); + this->player->pos = this->currentPoint->position; + #endif + } + + } break; + + /**********************************************************************/ + // STATE_CONTINUE_WAIT : Waiting for the Continue anim to finish + case STATE_CONTINUE_WAIT: + + if (CONT_DONE(this->continueObj)) { + CONT_UNK1(this->continueObj) = 0; + CONT_UNK2(this->continueObj) = 0; + CONT_UNK3(this->continueObj) = 0; + + for (int i = 0; i < 4; i++) { + int idx = SearchForIndexOfPlayerID(i); + Player_Lives[Player_ID[idx]] = CONT_LIVES(this->continueObj, i); + } + + this->state = STATE_OPT_CHANGE_WAIT; + } + + break; + + /**********************************************************************/ + // STATE_NORMAL : Nothing related to the menu is going on + case STATE_NORMAL: { + + #ifndef LEVEL_MENU + HandleMovement(); + #endif + +#ifdef LEVEL_MENU + int currentPage = this->currentPage; + int currentSelection = this->selections[currentPage]; + int newPage = currentPage; + int newSelection = currentSelection; + + // Activate the menu + if (nowPressed & WPAD_PLUS) { + CSMENU_ACTIVE(this->csMenu) = true; + this->state = STATE_CSMENU; + } + + + // Change the current level + if ((nowPressed & WPAD_UP) && currentSelection > 0) { + newSelection = currentSelection - 1; + } + + if ((nowPressed & WPAD_DOWN) && currentSelection < (LevelInfo_GetSection(this->levelInfo, currentPage)->levelCount - 1)) { + newSelection = currentSelection + 1; + } + + // Change the current world + if ((nowPressed & WPAD_LEFT) && currentPage > 0) { + newPage = currentPage - 1; + } + + if ((nowPressed & WPAD_RIGHT) && currentPage < (LevelInfo_GetSectionCount(this->levelInfo) - 1)) { + newPage = currentPage + 1; + } + + + if (newPage != currentPage) { + this->currentPage = newPage; + this->GenText(); + + // do this to let the rest of the code handle animations + newSelection = this->selections[newPage]; + } + + if (newSelection != currentSelection) { + EmbeddedLayout_DisableAllAnims(this->layout); + + // enable On animation + EmbeddedLayout_EnableNonLoopAnim(this->layout, newSelection, false); + + // enable Off animation + EmbeddedLayout_EnableNonLoopAnim(this->layout, currentSelection+15, false); + + this->selections[newPage] = newSelection; + this->state = STATE_OPT_CHANGE_WAIT; + } + + + // save the info to the file + if (currentSelection != newSelection || currentPage != newPage) { + SaveBlock *save = GetSaveFile()->GetBlock(-1); + save->current_world = newPage; + save->current_path_node = newSelection; + } +#endif + + + // Enter the current level +#ifndef MARIO_OPTIONS +#ifdef LEVEL_MENU + if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) { + this->StartLevel(); + this->state = STATE_LIMBO; // just in case + } +#endif + + if (nowPressed & WPAD_ONE) { + STKI_SHOW(this->stockItem) = true; + this->state = STATE_POWERUPS_WAIT; + } +#endif + } break; + + /**********************************************************************/ + // STATE_OPT_CHANGE_WAIT : Waiting for the option change animation to + // finish playing + #ifdef LEVEL_MENU + case STATE_OPT_CHANGE_WAIT: + + if (!EmbeddedLayout_CheckIfAnimationIsOn(this->layout, -1)) { + this->state = STATE_NORMAL; + } + + break; + #endif + /**********************************************************************/ + // STATE_CSMENU : The course select menu is currently being shown + case STATE_CSMENU: + + // First off, check to see if it's been hidden + if (!CSMENU_ACTIVE(this->csMenu)) { + // That means something happened + if (CSMENU_CHOICE_OK(this->csMenu)) { + // Player pressed a button + + switch (CSMENU_CURRENT(this->csMenu)) { + case 0: + // Star Coins + //OSReport("Star Coins was pressed\n"); + this->state = STATE_NORMAL; + break; + + case 1: + // Add/Drop Players + //OSReport("Add/Drop Players was pressed\n"); + this->state = STATE_PLAYER_CHANGE_WAIT; + NPCHG_ACTIVE(this->numPeopleChange) = true; + WpadShit(10); + + break; + + case 2: + // Save or Quick Save + //OSReport("Save or Quick Save was pressed\n"); + if (GetSaveFile()->GetBlock(-1)->bitfield & 2) { + this->state = STATE_SAVE_OPEN; + YESNO_TYPE(this->yesNoWindow) = 1; + YESNO_VISIBLE(this->yesNoWindow) = 1; + + } else { + this->state = STATE_QUICKSAVE_OPEN; + YESNO_TYPE(this->yesNoWindow) = 15; + YESNO_VISIBLE(this->yesNoWindow) = 1; + + } + + break; + + case 3: + // Title Screen + //OSReport("Title Screen was pressed\n"); + this->state = STATE_TITLE_CONFIRM_OPEN_WAIT; + YESNO_VISIBLE(this->yesNoWindow) = true; + YESNO_TYPE(this->yesNoWindow) = 10; + break; + } + + } else { + // Ok, change back to STATE_NORMAL + this->state = STATE_NORMAL; + } + } + + break; + + /**********************************************************************/ + // STATE_TITLE_CONFIRM_OPEN_WAIT : Waiting for the "Go to Title Screen" + // YesNoWindow to finish opening + case STATE_TITLE_CONFIRM_OPEN_WAIT: + + if (!YESNO_OPENING(this->yesNoWindow)) { + this->state = STATE_TITLE_CONFIRM_SELECT; + } + + break; + + /**********************************************************************/ + // STATE_TITLE_CONFIRM_SELECT : Let the user choose an option on the + // "Go to Title Screen" YesNoWindow. + case STATE_TITLE_CONFIRM_SELECT: + + if (nowPressed & WPAD_LEFT) { + // Select "OK!" + YESNO_CURRENT(this->yesNoWindow) = 1; + + } else if (nowPressed & WPAD_RIGHT) { + // Select "Cancel" + YESNO_CURRENT(this->yesNoWindow) = 0; + + } else if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) { + // Pick the current option + YESNO_CLOSE(this->yesNoWindow) = true; + if (YESNO_CURRENT(this->yesNoWindow) != 1) + YESNO_REFUSED(this->yesNoWindow) = true; + this->state = STATE_TITLE_CONFIRM_HIT_WAIT; + + } else { + // Cancel using B or 1 + if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) { + YESNO_CANCELLED(this->yesNoWindow) = true; + YESNO_CURRENT(this->yesNoWindow) = true; + this->state = STATE_TITLE_CONFIRM_HIT_WAIT; + } + } + + break; + + /**********************************************************************/ + // STATE_TITLE_CONFIRM_HIT_WAIT : Process the user's chosen option on + // the "Go to Title Screen" YesNoWindow. Also, wait for the + // animation to be complete. + case STATE_TITLE_CONFIRM_HIT_WAIT: + + if (!YESNO_OPENING(this->yesNoWindow)) { + if (YESNO_CURRENT(this->yesNoWindow) == 1) { + this->state = STATE_NORMAL; + } else { + this->state = STATE_LIMBO; + StartTitleScreenStage(false, 0); + } + } + + break; + + /**********************************************************************/ + // STATE_PLAYER_CHANGE_WAIT : Wait for the user to do something on the + // Add/Drop Players screen. + case STATE_PLAYER_CHANGE_WAIT: + + if (NPCHG_READY(this->numPeopleChange)) { + if (nowPressed & WPAD_PLUS) { + // activate easy pairing. FUN !! + NPCHG_HIDE_FOR_EASYP(this->numPeopleChange) = 1; + + for (int i = 0; i < 4; i++) { + void *obj = NPCHG_2DPLAYER(this->numPeopleChange, i); + void *ccsb = NPCHG_CCSB(this->numPeopleChange, i); + void *ccsc = NPCHG_CCSC(this->numPeopleChange, i); + + PLAYER2D_SHOW_EASY_PAIRING(obj) = 1; + CCSB_ACTIVE(ccsb) = 1; + CCSC_ACTIVE(ccsc) = 1; + } + + EASYP_ACTIVE(this->easyPairing) = 1; + this->state = STATE_EASY_PAIRING_WAIT; + } + } else { + if (!NPCHG_ACTIVE(this->numPeopleChange)) { + this->state = STATE_NORMAL; + } + } + + break; + + /**********************************************************************/ + // STATE_EASY_PAIRING_WAIT : Wait for the user to exit Easy Pairing. + case STATE_EASY_PAIRING_WAIT: + + if (!EASYP_ACTIVE(this->easyPairing)) { + NPCHG_HIDE_FOR_EASYP(this->numPeopleChange) = 0; + + for (int i = 0; i < 4; i++) { + void *obj = NPCHG_2DPLAYER(this->numPeopleChange, i); + void *ccsb = NPCHG_CCSB(this->numPeopleChange, i); + void *ccsc = NPCHG_CCSC(this->numPeopleChange, i); + + PLAYER2D_SHOW_EASY_PAIRING(obj) = 0; + CCSB_ACTIVE(ccsb) = 0; + CCSC_ACTIVE(ccsc) = 0; + } + + this->state = STATE_PLAYER_CHANGE_WAIT; + WpadShit(10); + } + + break; + + /**********************************************************************/ + // STATE_POWERUPS_WAIT : Wait for the user to exit the Powerups screen. + case STATE_POWERUPS_WAIT: + + if (!STKI_SHOW(this->stockItem)) { + this->state = STATE_NORMAL; + } + + break; + + /**********************************************************************/ + // STATE_SAVE_OPEN : Waiting for the "Save?" YesNoWindow to open + case STATE_SAVE_OPEN: + + if (!YESNO_OPENING(this->yesNoWindow)) { + this->state = STATE_SAVE_SELECT; + } + + break; + + /**********************************************************************/ + // STATE_SAVE_SELECT : Let the user choose an option on the + // "Save?" YesNoWindow. + case STATE_SAVE_SELECT: + + if (nowPressed & WPAD_LEFT) { + // Select "OK!" + YESNO_CURRENT(this->yesNoWindow) = 1; + + } else if (nowPressed & WPAD_RIGHT) { + // Select "Cancel" + YESNO_CURRENT(this->yesNoWindow) = 0; + + } else if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) { + // Pick the current option + YESNO_CLOSE(this->yesNoWindow) = true; + + if (YESNO_CURRENT(this->yesNoWindow) != 1) + YESNO_CANCELLED2(this->yesNoWindow) = true; + this->state = STATE_SAVE_WINDOW_CLOSE; + + } else { + // Cancel using B or 1 + if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) { + YESNO_CANCELLED(this->yesNoWindow) = true; + YESNO_CURRENT(this->yesNoWindow) = 1; + this->state = STATE_SAVE_WINDOW_CLOSE; + } + } + + break; + + /**********************************************************************/ + // STATE_SAVE_WINDOW_CLOSE : Process the user's chosen option on the + // "Save?" YesNoWindow. Also, wait for the animation to be complete. + case STATE_SAVE_WINDOW_CLOSE: + + if (!YESNO_VISIBLE(this->yesNoWindow)) { + if (YESNO_CURRENT(this->yesNoWindow) == 1) { + this->state = STATE_NORMAL; + } else { + this->state = STATE_SAVE_DO; + SaveGame(0, false); + } + } + + break; + + /**********************************************************************/ + // STATE_SAVE_DO : Save the game. + case STATE_SAVE_DO: + + if (!GetSaveFile()->CheckIfWriting()) { + if (GetSaveHandler()->CurrentError == 0) { + YESNO_TYPE(this->yesNoWindow) = 2; + YESNO_VISIBLE(this->yesNoWindow) = true; + this->state = STATE_SAVE_END_WINDOW; + } else { + this->state = STATE_SAVE_ERROR; + } + } + + break; + + /**********************************************************************/ + // STATE_SAVE_END_WINDOW : Handle the Save End window. + case STATE_SAVE_END_WINDOW: + + if (!YESNO_OPENING(this->yesNoWindow)) { + if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) { + YESNO_CLOSE(this->yesNoWindow) = true; + this->state = STATE_SAVE_END_CLOSE_WAIT; + } + } + + break; + + /**********************************************************************/ + // STATE_SAVE_END_CLOSE_WAIT : Wait for the Save End window to close. + case STATE_SAVE_END_CLOSE_WAIT: + + if (!YESNO_OPENING(this->yesNoWindow)) { + this->state = STATE_NORMAL; + } + + break; + + /**********************************************************************/ + // STATE_QUICKSAVE_OPEN : Waiting for the "Save?" YesNoWindow to open + case STATE_QUICKSAVE_OPEN: + + if (!YESNO_OPENING(this->yesNoWindow)) { + this->state = STATE_QUICKSAVE_SELECT; + } + + break; + + /**********************************************************************/ + // STATE_QUICKSAVE_SELECT : Let the user choose an option on the + // "Save?" YesNoWindow. + case STATE_QUICKSAVE_SELECT: + + if (nowPressed & WPAD_LEFT) { + // Select "OK!" + YESNO_CURRENT(this->yesNoWindow) = 1; + + } else if (nowPressed & WPAD_RIGHT) { + // Select "Cancel" + YESNO_CURRENT(this->yesNoWindow) = 0; + + } else if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) { + // Pick the current option + YESNO_CLOSE(this->yesNoWindow) = true; + + if (YESNO_CURRENT(this->yesNoWindow) != 1) + YESNO_CANCELLED2(this->yesNoWindow) = true; + this->state = STATE_QUICKSAVE_WINDOW_CLOSE; + + } else { + // Cancel using B or 1 + if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) { + YESNO_CANCELLED(this->yesNoWindow) = true; + YESNO_CURRENT(this->yesNoWindow) = 1; + this->state = STATE_QUICKSAVE_WINDOW_CLOSE; + } + } + + break; + + /**********************************************************************/ + // STATE_QUICKSAVE_WINDOW_CLOSE : Process the user's chosen option on + // the "Save?" YesNoWindow. Also, wait for the animation to be complete + case STATE_QUICKSAVE_WINDOW_CLOSE: + + if (!YESNO_VISIBLE(this->yesNoWindow)) { + if (YESNO_CURRENT(this->yesNoWindow) == 1) { + this->state = STATE_NORMAL; + } else { + this->state = STATE_QUICKSAVE_DO; + SaveGame(0, true); + } + } + + break; + + /**********************************************************************/ + // STATE_QUICKSAVE_DO : Save the game. + case STATE_QUICKSAVE_DO: + + if (!GetSaveFile()->CheckIfWriting()) { + if (GetSaveHandler()->CurrentError == 0) { + YESNO_TYPE(this->yesNoWindow) = 16; + YESNO_VISIBLE(this->yesNoWindow) = true; + this->state = STATE_QUICKSAVE_END_WINDOW; + } else { + this->state = STATE_SAVE_ERROR; + } + } + + break; + + /**********************************************************************/ + // STATE_QUICKSAVE_END_WINDOW : Handle the Save End window. + case STATE_QUICKSAVE_END_WINDOW: + + if (!YESNO_OPENING(this->yesNoWindow)) { + if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) { + YESNO_CLOSE(this->yesNoWindow) = true; + YESNO_REFUSED(this->yesNoWindow) = true; + this->state = STATE_QUICKSAVE_END_CLOSE_WAIT; + } + } + + break; + + /**********************************************************************/ + // STATE_QUICKSAVE_END_CLOSE_WAIT : Wait for Save End window to close + case STATE_QUICKSAVE_END_CLOSE_WAIT: + + if (!YESNO_OPENING(this->yesNoWindow)) { + if (YESNO_CURRENT(this->yesNoWindow) == 1) { + this->state = STATE_NORMAL; + } else { + this->state = STATE_LIMBO; + StartTitleScreenStage(false, 0); + } + } + + break; + + } + + #ifdef LEVEL_MENU + if (this->state >= STATE_NORMAL) { + EmbeddedLayout_Process(this->layout); + EmbeddedLayout_UpdateMatrix(this->layout); + } + #endif + return true; } -bool d2DWorldMap_c__onDraw(d2DWorldMap_c *self) { - MTX44 matrix; - MTXOrtho(matrix, 228, -228, -304, 304, 0, 1); - GXSetProjection(matrix, GX_ORTHOGRAPHIC); - - // call CalculateMtx() - CalculateMtxFunc CalculateMtx = (*((CalculateMtxFunc**)self->Layout))[12]; - CalculateMtx(self->Layout, self->DrawInfo); - // call Draw() - DrawFunc Draw = (*((DrawFunc**)self->Layout))[13]; - Draw(self->Layout, self->DrawInfo); +int dScNewerWorldMap_c::onDraw() { +#ifdef LEVEL_MENU + EmbeddedLayout_AddToDrawList(this->layout); +#endif + +#ifndef LEVEL_MENU + this->model.scheduleForDrawing(); + + //Mtx matrix; + //MTXIdentity(matrix); + + //this->testModel.addToDrawList(matrix); +#endif + return true; } + + +#ifndef LEVEL_MENU +// Todo: move to .LZ files and dDvd::loader_c + +void dScNewerWorldMap_c::LoadModel() { + OSReport("Loading Goldwood model...\n"); + modelFile.openCompressed("/NewerRes/Maps/SMGoldwood.brres"); + + //LoadFile(&this->modelFH, "/Object/GoldwoodBase.arc"); + //LoadFile(&this->modelFH, "/WorldMap/CS_W1.arc"); + + /*ARCHandle arc; + ARCFileInfo keyinfo; + ARCInitHandle(this->modelFH.filePtr, &arc); + ARCOpen(&arc, "g3d/GoldwoodBase.brres", &keyinfo); + //ARCOpen(&arc, "g3d/model.brres", &keyinfo); + + nw4r::g3d::ResFile resfile(ARCGetStartAddrInMem(&keyinfo));*/ + + nw4r::g3d::ResFile resfile(modelFile.ptr()); + + if (!resfile.CheckRevision()) + OSReport("Warning: Revision check failed!\n"); + + resfile.Init(); + + if (!resfile.Bind(resfile)) + OSReport("Warning: ResFile bind failed!\n"); + + void *mdl = resfile.GetResMdl("GoldwoodBase"); + //void *mdl = resfile.GetResMdl("CS_W1"); + OSReport("Obtained ResMdl: %p\n", mdl); + + OSReport(this->allocator.link(-1, GameHeaps[0], 0, 0x20) ? "Success\n" : "Fail\n"); + OSReport(this->model.setup(&mdl, &this->allocator, 0, 1, 0) ? "Success\n" : "Fail\n"); + + SetupTextures_Map(&model, 1); + + //this->nw4rMdl.sub_80064BF0(); + //this->nw4rMdl.oneSetupType(); + + this->allocator.unlink(); + OSReport("Done loading model!\n"); + + Mtx asdf; + //MTXScale(asdf, 0.1, 0.1, 0.1); + MTXIdentity(asdf); + this->model.setDrawMatrix(asdf); + + //ARCClose(&keyinfo); +} + + +void dScNewerWorldMap_c::HandleMovement() { + int heldButtons = Remocon_GetButtons(GetActiveRemocon()); + int nowPressed = Remocon_GetPressed(GetActiveRemocon()); + + if (isMoving) { + MoveThroughPath(); + } else { + if (nowPressed & WPAD_LEFT && currentPoint->exits.asDirection.left.isValid()) + StartMovementTo(LEFT); + else if (nowPressed & WPAD_RIGHT && currentPoint->exits.asDirection.right.isValid()) + StartMovementTo(RIGHT); + else if (nowPressed & WPAD_UP && currentPoint->exits.asDirection.up.isValid()) + StartMovementTo(UP); + else if (nowPressed & WPAD_DOWN && currentPoint->exits.asDirection.down.isValid()) + StartMovementTo(DOWN); + + if (nowPressed & WPAD_TWO) + ActivatePoint(); + } +} + +void dScNewerWorldMap_c::MoveThroughPath() { + // figure out how much to move on each step + Vec from, to; + if (this->reverseThroughPath) { + from = this->currentSegment->end; + to = this->currentSegment->start; + } else { + from = this->currentSegment->start; + to = this->currentSegment->end; + } + + //float xMove = this->currentSegment->stepsPerFrame * cos(this->movementAngle); + //float zMove = this->currentSegment->stepsPerFrame * sin(this->movementAngle); + Vec move; + move.x = to.x - from.x; + move.y = to.y - from.y; + move.z = to.z - from.z; + + VECNormalize(&move, &move); + VECScale(&move, &move, this->currentSegment->stepsPerFrame); + + this->player->pos.x += move.x; + this->player->pos.y += move.y; + this->player->pos.z += move.z; + + // have we reached the end? + bool xAtEnd = false; + bool yAtEnd = false; + bool zAtEnd = false; + + if (move.x > 0) { + xAtEnd = (this->player->pos.x >= to.x); + } else { + xAtEnd = (this->player->pos.x <= to.x); + } + + if (move.y > 0) { + yAtEnd = (this->player->pos.y >= to.y); + } else { + yAtEnd = (this->player->pos.y <= to.y); + } + + if (move.z > 0) { + zAtEnd = (this->player->pos.z >= to.z); + } else { + zAtEnd = (this->player->pos.z <= to.z); + } + + if (xAtEnd && yAtEnd && zAtEnd) { + MapReport("reached end of segment %d\n", this->currentSegmentID); + + int nextSegment = this->currentSegmentID + (this->reverseThroughPath ? -1 : 1); + if (nextSegment == -1 || nextSegment == this->currentPath->segCount) { + MapReport("reached end of path\n"); + this->currentPoint = this->nextPoint; + this->player->pos = this->currentPoint->position; + this->player->startAnimation(0, 1.2, 10.0, 0.0); + this->isMoving = false; + + SaveBlock *save = GetSaveFile()->GetBlock(-1); + //save->current_world = newPage; ? + save->current_path_node = wmData.getPointID(this->currentPoint); + } else { + this->MoveToSegment(nextSegment); + } + } +} + +void dScNewerWorldMap_c::StartMovementTo(WMDirection direction) { + this->isMoving = true; + + WMPathEntrance *thisExit = ¤tPoint->exits.asArray[direction]; + MapReport("Using an exit in direction %d\n", direction); + + this->currentPath = thisExit->path; + if (thisExit->isEndSide) { + this->nextPoint = thisExit->path->startPoint; + this->reverseThroughPath = true; + this->MoveToSegment(thisExit->path->segCount - 1); + } else { + this->nextPoint = thisExit->path->endPoint; + this->reverseThroughPath = false; + this->MoveToSegment(0); + } +} + +void dScNewerWorldMap_c::MoveToSegment(int id) { + MapReport("Moving to segment %d\n", id); + + this->currentSegmentID = id; + this->currentSegment = this->currentPath->segments[id]; + + // calculate rotation + Vec from, to; + if (this->reverseThroughPath) { + from = this->currentSegment->end; + to = this->currentSegment->start; + } else { + from = this->currentSegment->start; + to = this->currentSegment->end; + } + + MapReport("From: %f,%f,%f To: %f,%f,%f\n", from.x, from.y, from.z, to.x, to.y, to.z); + + /*float xDiff = to.x - from.x; + float zDiff = to.z - from.z; + this->movementAngle = atan2(zDiff, xDiff); + float rotValue = ((int)(90.0f - MTXRadToDeg(this->movementAngle)) % 360); + + MapReport("Calculated rotation value: %f\n", rotValue);*/ + + this->player->pos = from; + + // update rotation + if (!this->currentSegment->useLastDir) { + this->player->rot.x = 0; + this->player->rot.y = this->currentSegment->direction; + this->player->rot.z = 0; + + if (this->reverseThroughPath && !this->currentSegment->alwaysSameDir) { + this->player->rot.y = ((this->currentSegment->direction) + 0x8000) & 0xFFFF; + } + } + + this->player->startAnimation(this->currentSegment->animationType, this->currentSegment->animationSpeed, 10.0, 0.0); +} + +void dScNewerWorldMap_c::ActivatePoint() { + MapReport("Point activated!\n"); + this->player->startAnimation(170, 1.2, 10.0, 0.0); + + if (this->currentPoint->type == WMPathPoint::LEVEL_TYPE) { + int w = this->currentPoint->params[0] - 1; + int l = this->currentPoint->params[1] - 1; + LevelInfo_Entry *level = LevelInfo_Search(this->levelInfo, w, l); + StartLevel(level); + } +} +#endif + + +void NewerMapDrawFunc() { + int keepCamera = GetCurrentCameraID(); + + /*// Based off WorldMapDrawFunc. + + LinkScene(1); + SceneCalcWorld(1); + SceneCameraStuff(1); + ChangeAlphaUpdate(false); + DrawOpa(); + DrawXlu(); + UnlinkScene(0); + + SetupLYTDrawing(); + DrawAllLayoutsBeforeX(129); + RenderEffects(0, 3); + RenderEffects(0, 2); + GXDrawDone(); + + RemoveAllFromScnRoot(); + Reset3DState(); + SetCurrentCameraID(1); + DoSpecialDrawing1(); + LinkScene(1); + SceneCalcWorld(1); + SceneCameraStuff(1); + CalcMaterial(); + DrawOpa(); + DrawXlu(); + UnlinkScene(1); + GXDrawDone(); + + RemoveAllFromScnRoot(); + Reset3DState(); + GXSetZMode(0, GX_ALWAYS, 0); + DrawAllLayoutsAfterXandBeforeY(128, 146); + SetCurrentCameraID(1); + DoSpecialDrawing2(); + LinkScene(1); + SceneCalcWorld(1); + SceneCameraStuff(1); + CalcMaterial(); + DrawOpa(); + DrawXlu(); + UnlinkScene(1); + + if (GAMEMGR_GET_AFC(GameMgr)) { + for (int i = 0; i < 4; i++) { + RenderEffects(0, 11+i); + } + + for (int i = 0; i < 4; i++) { + RenderEffects(0, 7+i); + } + } + + GXDrawDone(); + RemoveAllFromScnRoot(); + Reset3DState(); + DrawAllLayoutsAfterX(145); + ClearLayoutDrawList(); + SetCurrentCameraID(0);*/ + + + // All drawing uses scene 1, since that's the only one loaded by GAME_SETUP. + // Todo: Newer-specific scenes? + + // Stage 1 + SetupLYTDrawing(); + DrawAllLayoutsBeforeX(129); + GXDrawDone(); // is all GXDrawDone really needed..? + + // Stage 2 + Reset3DState(); + SetCurrentCameraID(0); + LinkScene(0); + SceneCalcWorld(0); + SceneCameraStuff(0); + ChangeAlphaUpdate(false); + CalcMaterial(); + DrawOpa(); + DrawXlu(); + UnlinkScene(0); + GXDrawDone(); + + //Reset3DState(); + //T3D::DrawQueue(); + + // Stage 3 + Reset3DState(); + SetupLYTDrawing(); + DrawAllLayoutsAfterXandBeforeY(128, 146); + GXDrawDone(); + + // Stage 4 + RemoveAllFromScnRoot(); + Reset3DState(); + SetCurrentCameraID(1); + DoSpecialDrawing1(); + LinkScene(1); + SceneCalcWorld(1); + SceneCameraStuff(1); + CalcMaterial(); + DrawOpa(); + DrawXlu(); + + // Stage 5 + if (GAMEMGR_GET_AFC(GameMgr)) { + for (int i = 0; i < 4; i++) { + RenderEffects(0, 11+i); + } + + for (int i = 0; i < 4; i++) { + RenderEffects(0, 7+i); + } + } + + RenderEffects(0, 2); // need to investigate how this thing works + + DrawAllLayoutsAfterX(145); + ClearLayoutDrawList(); // this is REALLY IMPORTANT! + + UnlinkScene(1); + + // End + SetCurrentCameraID(0); +} + diff --git a/src/worldmap_new.cpp b/src/worldmap_new.cpp deleted file mode 100644 index 2db382a..0000000 --- a/src/worldmap_new.cpp +++ /dev/null @@ -1,1358 +0,0 @@ -#include "worldmap.h" - -extern "C" void LoadMapScene(); - -dScNewerWorldMap_c *dScNewerWorldMap_c::instance = 0; - - -dScNewerWorldMap_c *dScNewerWorldMap_c::build() { - // return new dScNewerWorldMap_c; - OSReport("Creating WorldMap\n"); - - void *buffer = AllocFromGameHeap1(sizeof(dScNewerWorldMap_c)); - dScNewerWorldMap_c *c = new(buffer) dScNewerWorldMap_c; - - OSReport("Created WorldMap @ %p\n", c); - - instance = c; - return c; -} - - -#define SELC_SETUP_DONE(sc) (*((bool*)(((u32)(sc))+0xD38))) - -#define EASYP_SETUP_DONE(ep) (*((bool*)(((u32)(ep))+0x278))) -#define EASYP_ACTIVE(ep) (*((bool*)(((u32)(ep))+0x279))) - -#define CSMENU_SETUP_DONE(csm) (*((bool*)(((u32)(csm))+0x270))) -#define CSMENU_ACTIVE(csm) (*((bool*)(((u32)(csm))+0x271))) -#define CSMENU_CHOICE_OK(csm) (*((bool*)(((u32)(csm))+0x272))) -#define CSMENU_UNK(csm) (*((bool*)(((u32)(csm))+0x273))) -#define CSMENU_CURRENT(csm) (*((int*)(((u32)(csm))+0x268))) - -#define YESNO_SETUP_DONE(ynw) (*((bool*)(((u32)(ynw))+0x294))) -#define YESNO_VISIBLE(ynw) (*((bool*)(((u32)(ynw))+0x295))) -#define YESNO_CLOSE(ynw) (*((bool*)(((u32)(ynw))+0x296))) -#define YESNO_OPENING(ynw) (*((bool*)(((u32)(ynw))+0x297))) -#define YESNO_REFUSED(ynw) (*((bool*)(((u32)(ynw))+0x298))) -#define YESNO_CANCELLED(ynw) (*((bool*)(((u32)(ynw))+0x299))) -#define YESNO_CANCELLED2(ynw) (*((bool*)(((u32)(ynw))+0x29A))) -#define YESNO_CURRENT(ynw) (*((int*)(((u32)(ynw))+0x284))) -#define YESNO_TYPE(ynw) (*((int*)(((u32)(ynw))+0x28C))) - -#define NPCHG_SETUP_DONE(npc) (*((bool*)(((u32)(npc))+0x67C))) -#define NPCHG_ACTIVE(npc) (*((bool*)(((u32)(npc))+0x67E))) -#define NPCHG_HIDE_FOR_EASYP(npc) (*((bool*)(((u32)(npc))+0x67F))) -#define NPCHG_READY(npc) (*((bool*)(((u32)(npc))+0x680))) -#define NPCHG_CCSB(npc,idx) (((void**)(((u32)(npc))+0x74))[(idx)]) -#define NPCHG_CCSC(npc,idx) (((void**)(((u32)(npc))+0x84))[(idx)]) -#define NPCHG_CCSA(npc,idx) (((void**)(((u32)(npc))+0x94))[(idx)]) -#define NPCHG_CCI(npc,idx) (((void**)(((u32)(npc))+0xA4))[(idx)]) -#define NPCHG_2DPLAYER(npc,idx) (((void**)(((u32)(npc))+0x64C))[(idx)]) - -#define STKI_SETUP_DONE(si) (*((bool*)(((u32)(si))+0x310))) -#define STKI_SHADOW(si) (*((void**)(((u32)(si))+0x310))) -#define STKI_2DPLAYER(si,idx) (((void**)(((u32)(si))+0x2E4))[(idx)]) -#define STKI_ITEM(si,idx) (((void**)(((u32)(si))+0x2F4))[(idx)]) -#define STKI_SHOW(si) (*((bool*)(((u32)(si))+0x8DD))) - -#define SIS_SETUP_DONE(sis) (*((bool*)(((u32)(sis))+0x260))) - -#define CCSB_ACTIVE(ccsb) (*((bool*)(((u32)(ccsb))+0x29C))) - -#define CCSC_ACTIVE(ccsc) (*((bool*)(((u32)(ccsc))+0x2A1))) - -#define PLAYER2D_SHOW_EASY_PAIRING(p2d) (*((bool*)(((u32)(p2d))+0x264))) - -#define CONT_LIVES(cont,idx) (((int*)(((u32)(cont))+0x2B8))[(idx)]) -#define CONT_SETUP_DONE(cont) (*((bool*)(((u32)(cont))+0x2D4))) -#define CONT_UNK1(cont) (*((bool*)(((u32)(cont))+0x2D5))) -#define CONT_UNK2(cont) (*((bool*)(((u32)(cont))+0x2D6))) -#define CONT_DONE(cont) (*((bool*)(((u32)(cont))+0x2D7))) -#define CONT_UNK3(cont) (*((bool*)(((u32)(cont))+0x2E0))) - -#define STATE_START_DVD 0 -#define STATE_LOAD_RES 1 -#define STATE_END_DVD 2 -#define STATE_SETUP_WAIT 3 -#define STATE_LIMBO 4 -#define STATE_CONTINUE_WAIT 5 -#define STATE_NORMAL 6 -#define STATE_OPT_CHANGE_WAIT 7 -#define STATE_CSMENU 8 -#define STATE_TITLE_CONFIRM_OPEN_WAIT 9 -#define STATE_TITLE_CONFIRM_SELECT 10 -#define STATE_TITLE_CONFIRM_HIT_WAIT 11 -#define STATE_PLAYER_CHANGE_WAIT 12 -#define STATE_EASY_PAIRING_WAIT 13 -#define STATE_POWERUPS_WAIT 14 -#define STATE_SAVE_OPEN 15 -#define STATE_SAVE_SELECT 16 -#define STATE_SAVE_WINDOW_CLOSE 17 -#define STATE_SAVE_DO 18 -#define STATE_SAVE_END_WINDOW 19 -#define STATE_SAVE_END_CLOSE_WAIT 20 -#define STATE_QUICKSAVE_OPEN 21 -#define STATE_QUICKSAVE_SELECT 22 -#define STATE_QUICKSAVE_WINDOW_CLOSE 23 -#define STATE_QUICKSAVE_DO 24 -#define STATE_QUICKSAVE_END_WINDOW 25 -#define STATE_QUICKSAVE_END_CLOSE_WAIT 26 -#define STATE_SAVE_ERROR 27 - -#define MENU_HEIGHT 15 - -const char *anim1 = "optionActivated.brlan"; -const char *anim2 = "optionDeactivated.brlan"; - -const char *group1 = "G_opt00"; -const char *group2 = "G_opt01"; -const char *group3 = "G_opt02"; -const char *group4 = "G_opt03"; -const char *group5 = "G_opt04"; -const char *group6 = "G_opt05"; -const char *group7 = "G_opt06"; -const char *group8 = "G_opt07"; -const char *group9 = "G_opt08"; -const char *group10 = "G_opt09"; -const char *group11 = "G_opt10"; -const char *group12 = "G_opt11"; -const char *group13 = "G_opt12"; -const char *group14 = "G_opt13"; -const char *group15 = "G_opt14"; - -//void *EGG__Heap__alloc(unsigned long size, int unk, void *heap); - -#ifdef LEVEL_MENU -void dScNewerWorldMap_c::StartLevel() { - LevelInfo_Entry *level = LevelInfo_GetLevels(this->levelInfo, this->currentPage); - level += this->selections[this->currentPage]; - StartLevel(level); -} -#endif - -void dScNewerWorldMap_c::StartLevel(LevelInfo_Entry *entry) { - for (int i = 0; i < 4; i++) { - bool isThere = QueryPlayerAvailability(i); - int id = Player_ID[i]; - Player_Active[i] = isThere ? 1 : 0; - if (!isThere) Player_Flags[i] = 0; - } - - StartLevelInfo sl; - sl.unk1 = 0; - sl.unk2 = 0xFF; - sl.unk3 = 0; - sl.unk4 = 0; - sl.purpose = 0; - - sl.world1 = entry->world; - sl.world2 = entry->world; - sl.level1 = entry->level; - sl.level2 = entry->level; - - // hopefully this will fix the Star Coin issues - SetSomeConditionShit(entry->world, entry->level, 2); - - ActivateWipe(WIPE_MARIO); - - DoStartLevel(GetGameMgr(), &sl); -} - -#ifdef LEVEL_MENU -void dScNewerWorldMap_c::SetTitle(const char *text) { - unsigned short conv_buf[0x1FF]; - int length = strlen(text); - if (length > 0x1FF) - length = 0x1FF; - - for (int i = 0; i < length; i++) { - conv_buf[i] = text[i]; - } - - void *textBox = EmbeddedLayout_FindTextBoxByName(this->layout, "ScreenTitle"); - TextBox_SetString(textBox, conv_buf, 0); -} - -void dScNewerWorldMap_c::GenText() { - char buf[0x1FF]; - char paneNameBuf[0x20]; - char textBoxNameBuf[0x20]; - unsigned short wchars[0x1FF]; - - SaveBlock *save = GetSaveFile()->GetBlock(-1); - - LevelInfo_Section *section = LevelInfo_GetSection(this->levelInfo, this->currentPage); - LevelInfo_Entry *levels = LevelInfo_GetLevels(this->levelInfo, section); - - int count = section->levelCount; - - for (int i = 0; i < MENU_HEIGHT; i++) { - sprintf(paneNameBuf, "Opt%02d", i); - sprintf(textBoxNameBuf, "OptText%02d", i); - void *pane = EmbeddedLayout_FindPaneByName(this->layout, paneNameBuf); - void *textBox = EmbeddedLayout_FindTextBoxByName(this->layout, textBoxNameBuf); - - if (i < count) { - // valid level - PANE_FLAGS(pane) |= 1; - - u32 conds = save->GetLevelCondition(levels[i].world, levels[i].level); - - char cond1, cond2, cond3, cond4, cond5; - cond1 = (conds & COND_NORMAL ? 'x' : '.'); - cond2 = (conds & COND_SECRET ? 'x' : '.'); - cond3 = (conds & COND_COIN1 ? 'x' : '.'); - cond4 = (conds & COND_COIN2 ? 'x' : '.'); - cond5 = (conds & COND_COIN3 ? 'x' : '.'); - - sprintf(buf, "%s %c%c %c%c%c", LevelInfo_GetName(this->levelInfo, &levels[i]), cond1, cond2, cond3, cond4, cond5); - - for (int i = 0; i < 0x1FF; i++) { - wchars[i] = buf[i]; - if (buf[i] == 0) break; - } - - TextBox_SetString(textBox, wchars, 0); - } else { - // invalid, hide the pane - PANE_FLAGS(pane) &= ~1; - } - } -} -#endif - -int dScNewerWorldMap_c::onCreate() { - LoadMapScene(); - GameSetup__LoadScene(0); // lol, stolen from GAME_SETUP - - #ifdef LEVEL_MENU - this->layout = (Layout*)AllocFromGameHeap1(sizeof(Layout)); - if (!this->layout) { - OSReport("memalloc fail\n"); - InfiniteLoop; - } - - EmbeddedLayout_ctor(this->layout); - EmbeddedLayout_LoadArc(this->layout, "NewerRes/wmap.arc"); - - if (!EmbeddedLayout_Build(this->layout, "levelSelect.brlyt", 0)) { - OSReport("build fail\n"); - InfiniteLoop; - } - - - const char *anims[2] = {anim1, anim2}; - EmbeddedLayout_LoadBrlans(this->layout, anims, 2); - - const char *groups[30] = { - group1, group2, group3, group4, group5, - group6, group7, group8, group9, group10, - group11, group12, group13, group14, group15, - group1, group2, group3, group4, group5, - group6, group7, group8, group9, group10, - group11, group12, group13, group14, group15, - }; - - int mappings[30] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; - EmbeddedLayout_LoadGroups(this->layout, groups, mappings, 30); - - EmbeddedLayout_DisableAllAnims(this->layout); - - for (int i = 0; i < 15; i++) { - EmbeddedLayout_ResetAnimToInitialState(this->layout, i, false); - } - #endif - - - this->selectCursor = CreateParentedObject(SELECT_CURSOR, this, 0, 0); - this->csMenu = CreateParentedObject(COURSE_SELECT_MENU, this, 0, 0); - this->yesNoWindow = CreateParentedObject(YES_NO_WINDOW, this, 0, 0); - this->numPeopleChange = CreateParentedObject(NUMBER_OF_PEOPLE_CHANGE, this, 0, 0); - - for (int i = 0; i < 4; i++) { - void *ccsb = CreateParentedObject(CHARACTER_CHANGE_SELECT_BASE, this, i, 0); - void *ccsc = CreateParentedObject(CHARACTER_CHANGE_SELECT_CONTENTS, this, i, 0); - void *ccsa = CreateParentedObject(CHARACTER_CHANGE_SELECT_ARROW, this, i, 0); - void *cci = CreateParentedObject(CHARACTER_CHANGE_INDICATOR, this, i, 0); - - NPCHG_CCSB(this->numPeopleChange, i) = ccsb; - NPCHG_CCSC(this->numPeopleChange, i) = ccsc; - NPCHG_CCSA(this->numPeopleChange, i) = ccsa; - NPCHG_CCI(this->numPeopleChange, i) = cci; - } - - this->continueObj = CreateParentedObject(CONTINUE, this, 0, 0); - - this->stockItem = CreateParentedObject(STOCK_ITEM, this, 0, 0); - this->stockItemShadow = CreateParentedObject(STOCK_ITEM_SHADOW, this, 0, 0); - STKI_SHADOW(this->stockItem) = this->stockItemShadow; - - this->easyPairing = CreateParentedObject(EASY_PAIRING, this, 0, 0); - - //this->player = (daWMPlayer_c*)CreateParentedObject(WM_PLAYER, this, 0, 2); - - CreateParentedObject(WORLD_CAMERA, this, 0, 0); - - this->state = STATE_START_DVD; - - #ifdef LEVEL_MENU - this->layout->drawOrder = 0; - #endif - - *CurrentDrawFunc = NewerMapDrawFunc; - - // level info - this->levelInfo = LoadFile(&this->levelInfoFH, "/NewerRes/LevelInfo.bin"); - LevelInfo_Prepare(&this->levelInfoFH); - - // load the menu info - SaveBlock *save = GetSaveFile()->GetBlock(-1); - - #ifdef LEVEL_MENU - this->currentPage = save->current_world; - - // bounds check - if (save->current_path_node >= 15) - save->current_path_node = 0; - - int sCount = LevelInfo_GetSectionCount(this->levelInfo); - this->selections = (int*)AllocFromGameHeap1(sizeof(int) * sCount); - - for (int i = 0; i < sCount; i++) { - this->selections[i] = 0; - } - - this->selections[this->currentPage] = save->current_path_node; - - // show button anim - EmbeddedLayout_EnableNonLoopAnim(this->layout, save->current_path_node, false); - #endif - - LoadModel(); - - wmData.load("/NewerRes/TestMap.wm"); - - - WMDataHeader *hdr = (WMDataHeader*)wmData.fh.filePtr; - if (save->current_path_node >= hdr->pointCount) { - this->currentPoint = wmData.getPath(0)->startPoint; - } else { - this->currentPoint = hdr->pointList[save->current_path_node]; - } - - #ifdef LEVEL_MENU - this->GenText(); - #endif - - - return true; -} - -int dScNewerWorldMap_c::onDelete() { - #ifdef LEVEL_MENU - EmbeddedLayout_FreeArc(this->layout); - EmbeddedLayout_Free(this->layout); - EmbeddedLayout_dtor(this->layout, false); - FreeFromGameHeap1(this->layout); - - FreeFromGameHeap1(this->selections); - #endif - - FreeFile(&this->levelInfoFH); - - FreeScene(0); - FreeScene(1); - - DVD_FreeFile(GetDVDClass2(), "SI_kinoko"); - DVD_FreeFile(GetDVDClass2(), "SI_fireflower"); - DVD_FreeFile(GetDVDClass2(), "SI_iceflower"); - DVD_FreeFile(GetDVDClass2(), "SI_penguin"); - DVD_FreeFile(GetDVDClass2(), "SI_propeller"); - DVD_FreeFile(GetDVDClass2(), "SI_star"); - - return true; -} - -int dScNewerWorldMap_c::onExecute() { - - if (QueryGlobal5758(0xFFFFFFFF)) return true; - if (CheckIfWeCantDoStuff()) return true; - - /**************************************************************************/ - // Read Wiimote Buttons - - int heldButtons = Remocon_GetButtons(GetActiveRemocon()); - int nowPressed = Remocon_GetPressed(GetActiveRemocon()); - - /**************************************************************************/ - // State Specific - - switch (this->state) { - /**********************************************************************/ - // STATE_START_DVD : Set up DVD - case STATE_START_DVD: - - DVD_Start(); - this->state = STATE_LOAD_RES; - - break; - - /**********************************************************************/ - // STATE_LOAD_RES : Load extra stuff we need - case STATE_LOAD_RES: - - DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_kinoko", 0); - DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_fireflower", 0); - DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_iceflower", 0); - DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_penguin", 0); - DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_propeller", 0); - DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_star", 0); - //DVD_LoadFile(GetDVDClass(), "Object", "fruits_kusa_gake", 0); - - this->state = STATE_END_DVD; - - break; - - /**********************************************************************/ - // STATE_END_DVD : Wait for files to load, end DVD - case STATE_END_DVD: - - if (!DVD_StillLoading(GetDVDClass2())) { - if (DVD_End()) { - this->state = STATE_SETUP_WAIT; - } - } - - break; - - /**********************************************************************/ - // STATE_SETUP_WAIT : Waiting for the world map managers to be set up - case STATE_SETUP_WAIT: { - - bool success = true; - - success &= CSMENU_SETUP_DONE(this->csMenu); - success &= SELC_SETUP_DONE(this->selectCursor); - success &= NPCHG_SETUP_DONE(this->numPeopleChange); - success &= YESNO_SETUP_DONE(this->yesNoWindow); - success &= CONT_SETUP_DONE(this->continueObj); - success &= STKI_SETUP_DONE(this->stockItem); - success &= SIS_SETUP_DONE(this->stockItemShadow); - success &= EASYP_SETUP_DONE(this->easyPairing); - - if (success) { - // ok, now we can set up other required shit - - // first up: player models for Stocked Items - for (int i = 0; i < 4; i++) { - void *obj = CreateChildObject(WM_2D_PLAYER, this, i, 0, 0); - STKI_2DPLAYER(this->stockItem,i) = obj; - NPCHG_2DPLAYER(this->numPeopleChange,i) = obj; - } - - // next: items for the Powerup screen - for (int i = 0; i < 7; i++) { - void *obj = CreateChildObject(WM_ITEM, this, i, 0, 0); - STKI_ITEM(this->stockItem,i) = obj; - } - - // now, check if we need to handle Continue - if (CheckIfContinueShouldBeActivated()) { - this->state = STATE_CONTINUE_WAIT; - CONT_UNK1(this->continueObj) = true; - CONT_UNK2(this->continueObj) = true; - CONT_UNK3(this->continueObj) = false; - } else { - #ifdef LEVEL_MENU - this->state = STATE_OPT_CHANGE_WAIT; - #else - this->state = STATE_NORMAL; - #endif - } - - // and now Player setup - #ifndef LEVEL_MENU - this->player = (daWMPlayer_c*)CreateParentedObject(WM_PLAYER, this, 0, 2); - this->player->modelHandler->mdlClass->setPowerup(2); - this->player->modelHandler->mdlClass->startAnimation(0, 1.2f, 10.0f, 0.0f); - this->player->pos = this->currentPoint->position; - #endif - } - - } break; - - /**********************************************************************/ - // STATE_CONTINUE_WAIT : Waiting for the Continue anim to finish - case STATE_CONTINUE_WAIT: - - if (CONT_DONE(this->continueObj)) { - CONT_UNK1(this->continueObj) = 0; - CONT_UNK2(this->continueObj) = 0; - CONT_UNK3(this->continueObj) = 0; - - for (int i = 0; i < 4; i++) { - int idx = SearchForIndexOfPlayerID(i); - Player_Lives[Player_ID[idx]] = CONT_LIVES(this->continueObj, i); - } - - this->state = STATE_OPT_CHANGE_WAIT; - } - - break; - - /**********************************************************************/ - // STATE_NORMAL : Nothing related to the menu is going on - case STATE_NORMAL: { - - #ifndef LEVEL_MENU - HandleMovement(); - #endif - -#ifdef LEVEL_MENU - int currentPage = this->currentPage; - int currentSelection = this->selections[currentPage]; - int newPage = currentPage; - int newSelection = currentSelection; - - // Activate the menu - if (nowPressed & WPAD_PLUS) { - CSMENU_ACTIVE(this->csMenu) = true; - this->state = STATE_CSMENU; - } - - - // Change the current level - if ((nowPressed & WPAD_UP) && currentSelection > 0) { - newSelection = currentSelection - 1; - } - - if ((nowPressed & WPAD_DOWN) && currentSelection < (LevelInfo_GetSection(this->levelInfo, currentPage)->levelCount - 1)) { - newSelection = currentSelection + 1; - } - - // Change the current world - if ((nowPressed & WPAD_LEFT) && currentPage > 0) { - newPage = currentPage - 1; - } - - if ((nowPressed & WPAD_RIGHT) && currentPage < (LevelInfo_GetSectionCount(this->levelInfo) - 1)) { - newPage = currentPage + 1; - } - - - if (newPage != currentPage) { - this->currentPage = newPage; - this->GenText(); - - // do this to let the rest of the code handle animations - newSelection = this->selections[newPage]; - } - - if (newSelection != currentSelection) { - EmbeddedLayout_DisableAllAnims(this->layout); - - // enable On animation - EmbeddedLayout_EnableNonLoopAnim(this->layout, newSelection, false); - - // enable Off animation - EmbeddedLayout_EnableNonLoopAnim(this->layout, currentSelection+15, false); - - this->selections[newPage] = newSelection; - this->state = STATE_OPT_CHANGE_WAIT; - } - - - // save the info to the file - if (currentSelection != newSelection || currentPage != newPage) { - SaveBlock *save = GetSaveFile()->GetBlock(-1); - save->current_world = newPage; - save->current_path_node = newSelection; - } -#endif - - - // Enter the current level -#ifndef MARIO_OPTIONS -#ifdef LEVEL_MENU - if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) { - this->StartLevel(); - this->state = STATE_LIMBO; // just in case - } -#endif - - if (nowPressed & WPAD_ONE) { - STKI_SHOW(this->stockItem) = true; - this->state = STATE_POWERUPS_WAIT; - } -#endif - } break; - - /**********************************************************************/ - // STATE_OPT_CHANGE_WAIT : Waiting for the option change animation to - // finish playing - #ifdef LEVEL_MENU - case STATE_OPT_CHANGE_WAIT: - - if (!EmbeddedLayout_CheckIfAnimationIsOn(this->layout, -1)) { - this->state = STATE_NORMAL; - } - - break; - #endif - /**********************************************************************/ - // STATE_CSMENU : The course select menu is currently being shown - case STATE_CSMENU: - - // First off, check to see if it's been hidden - if (!CSMENU_ACTIVE(this->csMenu)) { - // That means something happened - if (CSMENU_CHOICE_OK(this->csMenu)) { - // Player pressed a button - - switch (CSMENU_CURRENT(this->csMenu)) { - case 0: - // Star Coins - //OSReport("Star Coins was pressed\n"); - this->state = STATE_NORMAL; - break; - - case 1: - // Add/Drop Players - //OSReport("Add/Drop Players was pressed\n"); - this->state = STATE_PLAYER_CHANGE_WAIT; - NPCHG_ACTIVE(this->numPeopleChange) = true; - WpadShit(10); - - break; - - case 2: - // Save or Quick Save - //OSReport("Save or Quick Save was pressed\n"); - if (GetSaveFile()->GetBlock(-1)->bitfield & 2) { - this->state = STATE_SAVE_OPEN; - YESNO_TYPE(this->yesNoWindow) = 1; - YESNO_VISIBLE(this->yesNoWindow) = 1; - - } else { - this->state = STATE_QUICKSAVE_OPEN; - YESNO_TYPE(this->yesNoWindow) = 15; - YESNO_VISIBLE(this->yesNoWindow) = 1; - - } - - break; - - case 3: - // Title Screen - //OSReport("Title Screen was pressed\n"); - this->state = STATE_TITLE_CONFIRM_OPEN_WAIT; - YESNO_VISIBLE(this->yesNoWindow) = true; - YESNO_TYPE(this->yesNoWindow) = 10; - break; - } - - } else { - // Ok, change back to STATE_NORMAL - this->state = STATE_NORMAL; - } - } - - break; - - /**********************************************************************/ - // STATE_TITLE_CONFIRM_OPEN_WAIT : Waiting for the "Go to Title Screen" - // YesNoWindow to finish opening - case STATE_TITLE_CONFIRM_OPEN_WAIT: - - if (!YESNO_OPENING(this->yesNoWindow)) { - this->state = STATE_TITLE_CONFIRM_SELECT; - } - - break; - - /**********************************************************************/ - // STATE_TITLE_CONFIRM_SELECT : Let the user choose an option on the - // "Go to Title Screen" YesNoWindow. - case STATE_TITLE_CONFIRM_SELECT: - - if (nowPressed & WPAD_LEFT) { - // Select "OK!" - YESNO_CURRENT(this->yesNoWindow) = 1; - - } else if (nowPressed & WPAD_RIGHT) { - // Select "Cancel" - YESNO_CURRENT(this->yesNoWindow) = 0; - - } else if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) { - // Pick the current option - YESNO_CLOSE(this->yesNoWindow) = true; - if (YESNO_CURRENT(this->yesNoWindow) != 1) - YESNO_REFUSED(this->yesNoWindow) = true; - this->state = STATE_TITLE_CONFIRM_HIT_WAIT; - - } else { - // Cancel using B or 1 - if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) { - YESNO_CANCELLED(this->yesNoWindow) = true; - YESNO_CURRENT(this->yesNoWindow) = true; - this->state = STATE_TITLE_CONFIRM_HIT_WAIT; - } - } - - break; - - /**********************************************************************/ - // STATE_TITLE_CONFIRM_HIT_WAIT : Process the user's chosen option on - // the "Go to Title Screen" YesNoWindow. Also, wait for the - // animation to be complete. - case STATE_TITLE_CONFIRM_HIT_WAIT: - - if (!YESNO_OPENING(this->yesNoWindow)) { - if (YESNO_CURRENT(this->yesNoWindow) == 1) { - this->state = STATE_NORMAL; - } else { - this->state = STATE_LIMBO; - StartTitleScreenStage(false, 0); - } - } - - break; - - /**********************************************************************/ - // STATE_PLAYER_CHANGE_WAIT : Wait for the user to do something on the - // Add/Drop Players screen. - case STATE_PLAYER_CHANGE_WAIT: - - if (NPCHG_READY(this->numPeopleChange)) { - if (nowPressed & WPAD_PLUS) { - // activate easy pairing. FUN !! - NPCHG_HIDE_FOR_EASYP(this->numPeopleChange) = 1; - - for (int i = 0; i < 4; i++) { - void *obj = NPCHG_2DPLAYER(this->numPeopleChange, i); - void *ccsb = NPCHG_CCSB(this->numPeopleChange, i); - void *ccsc = NPCHG_CCSC(this->numPeopleChange, i); - - PLAYER2D_SHOW_EASY_PAIRING(obj) = 1; - CCSB_ACTIVE(ccsb) = 1; - CCSC_ACTIVE(ccsc) = 1; - } - - EASYP_ACTIVE(this->easyPairing) = 1; - this->state = STATE_EASY_PAIRING_WAIT; - } - } else { - if (!NPCHG_ACTIVE(this->numPeopleChange)) { - this->state = STATE_NORMAL; - } - } - - break; - - /**********************************************************************/ - // STATE_EASY_PAIRING_WAIT : Wait for the user to exit Easy Pairing. - case STATE_EASY_PAIRING_WAIT: - - if (!EASYP_ACTIVE(this->easyPairing)) { - NPCHG_HIDE_FOR_EASYP(this->numPeopleChange) = 0; - - for (int i = 0; i < 4; i++) { - void *obj = NPCHG_2DPLAYER(this->numPeopleChange, i); - void *ccsb = NPCHG_CCSB(this->numPeopleChange, i); - void *ccsc = NPCHG_CCSC(this->numPeopleChange, i); - - PLAYER2D_SHOW_EASY_PAIRING(obj) = 0; - CCSB_ACTIVE(ccsb) = 0; - CCSC_ACTIVE(ccsc) = 0; - } - - this->state = STATE_PLAYER_CHANGE_WAIT; - WpadShit(10); - } - - break; - - /**********************************************************************/ - // STATE_POWERUPS_WAIT : Wait for the user to exit the Powerups screen. - case STATE_POWERUPS_WAIT: - - if (!STKI_SHOW(this->stockItem)) { - this->state = STATE_NORMAL; - } - - break; - - /**********************************************************************/ - // STATE_SAVE_OPEN : Waiting for the "Save?" YesNoWindow to open - case STATE_SAVE_OPEN: - - if (!YESNO_OPENING(this->yesNoWindow)) { - this->state = STATE_SAVE_SELECT; - } - - break; - - /**********************************************************************/ - // STATE_SAVE_SELECT : Let the user choose an option on the - // "Save?" YesNoWindow. - case STATE_SAVE_SELECT: - - if (nowPressed & WPAD_LEFT) { - // Select "OK!" - YESNO_CURRENT(this->yesNoWindow) = 1; - - } else if (nowPressed & WPAD_RIGHT) { - // Select "Cancel" - YESNO_CURRENT(this->yesNoWindow) = 0; - - } else if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) { - // Pick the current option - YESNO_CLOSE(this->yesNoWindow) = true; - - if (YESNO_CURRENT(this->yesNoWindow) != 1) - YESNO_CANCELLED2(this->yesNoWindow) = true; - this->state = STATE_SAVE_WINDOW_CLOSE; - - } else { - // Cancel using B or 1 - if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) { - YESNO_CANCELLED(this->yesNoWindow) = true; - YESNO_CURRENT(this->yesNoWindow) = 1; - this->state = STATE_SAVE_WINDOW_CLOSE; - } - } - - break; - - /**********************************************************************/ - // STATE_SAVE_WINDOW_CLOSE : Process the user's chosen option on the - // "Save?" YesNoWindow. Also, wait for the animation to be complete. - case STATE_SAVE_WINDOW_CLOSE: - - if (!YESNO_VISIBLE(this->yesNoWindow)) { - if (YESNO_CURRENT(this->yesNoWindow) == 1) { - this->state = STATE_NORMAL; - } else { - this->state = STATE_SAVE_DO; - SaveGame(0, false); - } - } - - break; - - /**********************************************************************/ - // STATE_SAVE_DO : Save the game. - case STATE_SAVE_DO: - - if (!GetSaveFile()->CheckIfWriting()) { - if (GetSaveHandler()->CurrentError == 0) { - YESNO_TYPE(this->yesNoWindow) = 2; - YESNO_VISIBLE(this->yesNoWindow) = true; - this->state = STATE_SAVE_END_WINDOW; - } else { - this->state = STATE_SAVE_ERROR; - } - } - - break; - - /**********************************************************************/ - // STATE_SAVE_END_WINDOW : Handle the Save End window. - case STATE_SAVE_END_WINDOW: - - if (!YESNO_OPENING(this->yesNoWindow)) { - if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) { - YESNO_CLOSE(this->yesNoWindow) = true; - this->state = STATE_SAVE_END_CLOSE_WAIT; - } - } - - break; - - /**********************************************************************/ - // STATE_SAVE_END_CLOSE_WAIT : Wait for the Save End window to close. - case STATE_SAVE_END_CLOSE_WAIT: - - if (!YESNO_OPENING(this->yesNoWindow)) { - this->state = STATE_NORMAL; - } - - break; - - /**********************************************************************/ - // STATE_QUICKSAVE_OPEN : Waiting for the "Save?" YesNoWindow to open - case STATE_QUICKSAVE_OPEN: - - if (!YESNO_OPENING(this->yesNoWindow)) { - this->state = STATE_QUICKSAVE_SELECT; - } - - break; - - /**********************************************************************/ - // STATE_QUICKSAVE_SELECT : Let the user choose an option on the - // "Save?" YesNoWindow. - case STATE_QUICKSAVE_SELECT: - - if (nowPressed & WPAD_LEFT) { - // Select "OK!" - YESNO_CURRENT(this->yesNoWindow) = 1; - - } else if (nowPressed & WPAD_RIGHT) { - // Select "Cancel" - YESNO_CURRENT(this->yesNoWindow) = 0; - - } else if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) { - // Pick the current option - YESNO_CLOSE(this->yesNoWindow) = true; - - if (YESNO_CURRENT(this->yesNoWindow) != 1) - YESNO_CANCELLED2(this->yesNoWindow) = true; - this->state = STATE_QUICKSAVE_WINDOW_CLOSE; - - } else { - // Cancel using B or 1 - if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) { - YESNO_CANCELLED(this->yesNoWindow) = true; - YESNO_CURRENT(this->yesNoWindow) = 1; - this->state = STATE_QUICKSAVE_WINDOW_CLOSE; - } - } - - break; - - /**********************************************************************/ - // STATE_QUICKSAVE_WINDOW_CLOSE : Process the user's chosen option on - // the "Save?" YesNoWindow. Also, wait for the animation to be complete - case STATE_QUICKSAVE_WINDOW_CLOSE: - - if (!YESNO_VISIBLE(this->yesNoWindow)) { - if (YESNO_CURRENT(this->yesNoWindow) == 1) { - this->state = STATE_NORMAL; - } else { - this->state = STATE_QUICKSAVE_DO; - SaveGame(0, true); - } - } - - break; - - /**********************************************************************/ - // STATE_QUICKSAVE_DO : Save the game. - case STATE_QUICKSAVE_DO: - - if (!GetSaveFile()->CheckIfWriting()) { - if (GetSaveHandler()->CurrentError == 0) { - YESNO_TYPE(this->yesNoWindow) = 16; - YESNO_VISIBLE(this->yesNoWindow) = true; - this->state = STATE_QUICKSAVE_END_WINDOW; - } else { - this->state = STATE_SAVE_ERROR; - } - } - - break; - - /**********************************************************************/ - // STATE_QUICKSAVE_END_WINDOW : Handle the Save End window. - case STATE_QUICKSAVE_END_WINDOW: - - if (!YESNO_OPENING(this->yesNoWindow)) { - if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) { - YESNO_CLOSE(this->yesNoWindow) = true; - YESNO_REFUSED(this->yesNoWindow) = true; - this->state = STATE_QUICKSAVE_END_CLOSE_WAIT; - } - } - - break; - - /**********************************************************************/ - // STATE_QUICKSAVE_END_CLOSE_WAIT : Wait for Save End window to close - case STATE_QUICKSAVE_END_CLOSE_WAIT: - - if (!YESNO_OPENING(this->yesNoWindow)) { - if (YESNO_CURRENT(this->yesNoWindow) == 1) { - this->state = STATE_NORMAL; - } else { - this->state = STATE_LIMBO; - StartTitleScreenStage(false, 0); - } - } - - break; - - } - - #ifdef LEVEL_MENU - if (this->state >= STATE_NORMAL) { - EmbeddedLayout_Process(this->layout); - EmbeddedLayout_UpdateMatrix(this->layout); - } - #endif - - return true; -} - -int dScNewerWorldMap_c::onDraw() { -#ifdef LEVEL_MENU - EmbeddedLayout_AddToDrawList(this->layout); -#endif - -#ifndef LEVEL_MENU - this->model.scheduleForDrawing(); - - //Mtx matrix; - //MTXIdentity(matrix); - - //this->testModel.addToDrawList(matrix); -#endif - - return true; -} - - - -#ifndef LEVEL_MENU -// Todo: move to .LZ files and dDvd::loader_c - -void dScNewerWorldMap_c::LoadModel() { - OSReport("Loading Goldwood model...\n"); - modelFile.openCompressed("/NewerRes/Maps/SMGoldwood.brres"); - - //LoadFile(&this->modelFH, "/Object/GoldwoodBase.arc"); - //LoadFile(&this->modelFH, "/WorldMap/CS_W1.arc"); - - /*ARCHandle arc; - ARCFileInfo keyinfo; - ARCInitHandle(this->modelFH.filePtr, &arc); - ARCOpen(&arc, "g3d/GoldwoodBase.brres", &keyinfo); - //ARCOpen(&arc, "g3d/model.brres", &keyinfo); - - nw4r::g3d::ResFile resfile(ARCGetStartAddrInMem(&keyinfo));*/ - - nw4r::g3d::ResFile resfile(modelFile.ptr()); - - if (!resfile.CheckRevision()) - OSReport("Warning: Revision check failed!\n"); - - resfile.Init(); - - if (!resfile.Bind(resfile)) - OSReport("Warning: ResFile bind failed!\n"); - - void *mdl = resfile.GetResMdl("GoldwoodBase"); - //void *mdl = resfile.GetResMdl("CS_W1"); - OSReport("Obtained ResMdl: %p\n", mdl); - - OSReport(this->allocator.link(-1, GameHeaps[0], 0, 0x20) ? "Success\n" : "Fail\n"); - OSReport(this->model.setup(&mdl, &this->allocator, 0, 1, 0) ? "Success\n" : "Fail\n"); - - SetupTextures_Map(&model, 1); - - //this->nw4rMdl.sub_80064BF0(); - //this->nw4rMdl.oneSetupType(); - - this->allocator.unlink(); - OSReport("Done loading model!\n"); - - Mtx asdf; - //MTXScale(asdf, 0.1, 0.1, 0.1); - MTXIdentity(asdf); - this->model.setDrawMatrix(asdf); - - //ARCClose(&keyinfo); -} - - -void dScNewerWorldMap_c::HandleMovement() { - int heldButtons = Remocon_GetButtons(GetActiveRemocon()); - int nowPressed = Remocon_GetPressed(GetActiveRemocon()); - - if (isMoving) { - MoveThroughPath(); - } else { - if (nowPressed & WPAD_LEFT && currentPoint->exits.asDirection.left.isValid()) - StartMovementTo(LEFT); - else if (nowPressed & WPAD_RIGHT && currentPoint->exits.asDirection.right.isValid()) - StartMovementTo(RIGHT); - else if (nowPressed & WPAD_UP && currentPoint->exits.asDirection.up.isValid()) - StartMovementTo(UP); - else if (nowPressed & WPAD_DOWN && currentPoint->exits.asDirection.down.isValid()) - StartMovementTo(DOWN); - - if (nowPressed & WPAD_TWO) - ActivatePoint(); - } -} - -void dScNewerWorldMap_c::MoveThroughPath() { - // figure out how much to move on each step - Vec from, to; - if (this->reverseThroughPath) { - from = this->currentSegment->end; - to = this->currentSegment->start; - } else { - from = this->currentSegment->start; - to = this->currentSegment->end; - } - - //float xMove = this->currentSegment->stepsPerFrame * cos(this->movementAngle); - //float zMove = this->currentSegment->stepsPerFrame * sin(this->movementAngle); - Vec move; - move.x = to.x - from.x; - move.y = to.y - from.y; - move.z = to.z - from.z; - - VECNormalize(&move, &move); - VECScale(&move, &move, this->currentSegment->stepsPerFrame); - - this->player->pos.x += move.x; - this->player->pos.y += move.y; - this->player->pos.z += move.z; - - // have we reached the end? - bool xAtEnd = false; - bool yAtEnd = false; - bool zAtEnd = false; - - if (move.x > 0) { - xAtEnd = (this->player->pos.x >= to.x); - } else { - xAtEnd = (this->player->pos.x <= to.x); - } - - if (move.y > 0) { - yAtEnd = (this->player->pos.y >= to.y); - } else { - yAtEnd = (this->player->pos.y <= to.y); - } - - if (move.z > 0) { - zAtEnd = (this->player->pos.z >= to.z); - } else { - zAtEnd = (this->player->pos.z <= to.z); - } - - if (xAtEnd && yAtEnd && zAtEnd) { - MapReport("reached end of segment %d\n", this->currentSegmentID); - - int nextSegment = this->currentSegmentID + (this->reverseThroughPath ? -1 : 1); - if (nextSegment == -1 || nextSegment == this->currentPath->segCount) { - MapReport("reached end of path\n"); - this->currentPoint = this->nextPoint; - this->player->pos = this->currentPoint->position; - this->player->startAnimation(0, 1.2, 10.0, 0.0); - this->isMoving = false; - - SaveBlock *save = GetSaveFile()->GetBlock(-1); - //save->current_world = newPage; ? - save->current_path_node = wmData.getPointID(this->currentPoint); - } else { - this->MoveToSegment(nextSegment); - } - } -} - -void dScNewerWorldMap_c::StartMovementTo(WMDirection direction) { - this->isMoving = true; - - WMPathEntrance *thisExit = ¤tPoint->exits.asArray[direction]; - MapReport("Using an exit in direction %d\n", direction); - - this->currentPath = thisExit->path; - if (thisExit->isEndSide) { - this->nextPoint = thisExit->path->startPoint; - this->reverseThroughPath = true; - this->MoveToSegment(thisExit->path->segCount - 1); - } else { - this->nextPoint = thisExit->path->endPoint; - this->reverseThroughPath = false; - this->MoveToSegment(0); - } -} - -void dScNewerWorldMap_c::MoveToSegment(int id) { - MapReport("Moving to segment %d\n", id); - - this->currentSegmentID = id; - this->currentSegment = this->currentPath->segments[id]; - - // calculate rotation - Vec from, to; - if (this->reverseThroughPath) { - from = this->currentSegment->end; - to = this->currentSegment->start; - } else { - from = this->currentSegment->start; - to = this->currentSegment->end; - } - - MapReport("From: %f,%f,%f To: %f,%f,%f\n", from.x, from.y, from.z, to.x, to.y, to.z); - - /*float xDiff = to.x - from.x; - float zDiff = to.z - from.z; - this->movementAngle = atan2(zDiff, xDiff); - float rotValue = ((int)(90.0f - MTXRadToDeg(this->movementAngle)) % 360); - - MapReport("Calculated rotation value: %f\n", rotValue);*/ - - this->player->pos = from; - - // update rotation - if (!this->currentSegment->useLastDir) { - this->player->rot.x = 0; - this->player->rot.y = this->currentSegment->direction; - this->player->rot.z = 0; - - if (this->reverseThroughPath && !this->currentSegment->alwaysSameDir) { - this->player->rot.y = ((this->currentSegment->direction) + 0x8000) & 0xFFFF; - } - } - - this->player->startAnimation(this->currentSegment->animationType, this->currentSegment->animationSpeed, 10.0, 0.0); -} - -void dScNewerWorldMap_c::ActivatePoint() { - MapReport("Point activated!\n"); - this->player->startAnimation(170, 1.2, 10.0, 0.0); - - if (this->currentPoint->type == WMPathPoint::LEVEL_TYPE) { - int w = this->currentPoint->params[0] - 1; - int l = this->currentPoint->params[1] - 1; - LevelInfo_Entry *level = LevelInfo_Search(this->levelInfo, w, l); - StartLevel(level); - } -} -#endif - - -void NewerMapDrawFunc() { - int keepCamera = GetCurrentCameraID(); - - /*// Based off WorldMapDrawFunc. - - LinkScene(1); - SceneCalcWorld(1); - SceneCameraStuff(1); - ChangeAlphaUpdate(false); - DrawOpa(); - DrawXlu(); - UnlinkScene(0); - - SetupLYTDrawing(); - DrawAllLayoutsBeforeX(129); - RenderEffects(0, 3); - RenderEffects(0, 2); - GXDrawDone(); - - RemoveAllFromScnRoot(); - Reset3DState(); - SetCurrentCameraID(1); - DoSpecialDrawing1(); - LinkScene(1); - SceneCalcWorld(1); - SceneCameraStuff(1); - CalcMaterial(); - DrawOpa(); - DrawXlu(); - UnlinkScene(1); - GXDrawDone(); - - RemoveAllFromScnRoot(); - Reset3DState(); - GXSetZMode(0, GX_ALWAYS, 0); - DrawAllLayoutsAfterXandBeforeY(128, 146); - SetCurrentCameraID(1); - DoSpecialDrawing2(); - LinkScene(1); - SceneCalcWorld(1); - SceneCameraStuff(1); - CalcMaterial(); - DrawOpa(); - DrawXlu(); - UnlinkScene(1); - - if (GAMEMGR_GET_AFC(GameMgr)) { - for (int i = 0; i < 4; i++) { - RenderEffects(0, 11+i); - } - - for (int i = 0; i < 4; i++) { - RenderEffects(0, 7+i); - } - } - - GXDrawDone(); - RemoveAllFromScnRoot(); - Reset3DState(); - DrawAllLayoutsAfterX(145); - ClearLayoutDrawList(); - SetCurrentCameraID(0);*/ - - - // All drawing uses scene 1, since that's the only one loaded by GAME_SETUP. - // Todo: Newer-specific scenes? - - // Stage 1 - SetupLYTDrawing(); - DrawAllLayoutsBeforeX(129); - GXDrawDone(); // is all GXDrawDone really needed..? - - // Stage 2 - Reset3DState(); - SetCurrentCameraID(0); - LinkScene(0); - SceneCalcWorld(0); - SceneCameraStuff(0); - ChangeAlphaUpdate(false); - CalcMaterial(); - DrawOpa(); - DrawXlu(); - UnlinkScene(0); - GXDrawDone(); - - //Reset3DState(); - //T3D::DrawQueue(); - - // Stage 3 - Reset3DState(); - SetupLYTDrawing(); - DrawAllLayoutsAfterXandBeforeY(128, 146); - GXDrawDone(); - - // Stage 4 - RemoveAllFromScnRoot(); - Reset3DState(); - SetCurrentCameraID(1); - DoSpecialDrawing1(); - LinkScene(1); - SceneCalcWorld(1); - SceneCameraStuff(1); - CalcMaterial(); - DrawOpa(); - DrawXlu(); - - // Stage 5 - if (GAMEMGR_GET_AFC(GameMgr)) { - for (int i = 0; i < 4; i++) { - RenderEffects(0, 11+i); - } - - for (int i = 0; i < 4; i++) { - RenderEffects(0, 7+i); - } - } - - RenderEffects(0, 2); // need to investigate how this thing works - - DrawAllLayoutsAfterX(145); - ClearLayoutDrawList(); // this is REALLY IMPORTANT! - - UnlinkScene(1); - - // End - SetCurrentCameraID(0); -} - diff --git a/src/worldmapdata.cpp b/src/worldmapdata.cpp deleted file mode 100644 index 0473bbb..0000000 --- a/src/worldmapdata.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "worldmapdata.h" - -WorldMapData::WorldMapData() { - -} - -WorldMapData::~WorldMapData() { - FreeFile(&this->fh); -} - -bool WorldMapData::load(const char *filename) { - OSReport("Loading WM Data file: %s\n", filename); - - u32 ptr = (u32)LoadFile(&this->fh, filename); - WMDataHeader *header = (WMDataHeader*)ptr; - - OSReport("Loaded WM Data file @ %p\n", ptr); - - // first off, fix the list pointers - header->pathList = (WMPathDef**)((u32)header->pathList + ptr); - header->pointList = (WMPathPoint**)((u32)header->pointList + ptr); - header->segmentList = (WMPathSegment**)((u32)header->segmentList + ptr); - header->actionList = (WMPathAction**)((u32)header->actionList + ptr); - - // now, fix every pointer in the lists - OSReport("Fixing up list pointers\n"); - for (int i = 0; i < header->pathCount; i++) - header->pathList[i] = (WMPathDef*)((u32)header->pathList[i] + ptr); - - for (int i = 0; i < header->pointCount; i++) - header->pointList[i] = (WMPathPoint*)((u32)header->pointList[i] + ptr); - - for (int i = 0; i < header->segmentCount; i++) - header->segmentList[i] = (WMPathSegment*)((u32)header->segmentList[i] + ptr); - - for (int i = 0; i < header->actionCount; i++) - header->actionList[i] = (WMPathAction*)((u32)header->actionList[i] + ptr); - - // next up, fix every pointer in these structs - OSReport("Fixing up path pointers [%d]\n", header->pathCount); - for (int i = 0; i < header->pathCount; i++) { - WMPathDef *thisPath = header->pathList[i]; - //OSReport("Path @ %p - Index: %d - Segments: %d\n", thisPath, i, thisPath->segCount); - - thisPath->startPoint = header->pointList[(u32)thisPath->startPoint]; - thisPath->endPoint = header->pointList[(u32)thisPath->endPoint]; - - for (int j = 0; j < thisPath->segCount; j++) { - thisPath->segments[j] = header->segmentList[(u32)thisPath->segments[j]]; - } - } - - OSReport("Fixing up point pointers [%d]\n", header->pointCount); - for (int i = 0; i < header->pointCount; i++) { - WMPathPoint *thisPoint = header->pointList[i]; - - for (int j = 0; j < 4; j++) { - if ((u32)thisPoint->exits.asArray[j].path == -1) { - thisPoint->exits.asArray[j].path = 0; - } else { - thisPoint->exits.asArray[j].path = header->pathList[(u32)thisPoint->exits.asArray[j].path]; - } - } - } - - OSReport("Fixing up segment pointers [%d]\n", header->segmentCount); - for (int i = 0; i < header->segmentCount; i++) { - WMPathSegment *thisSegment = header->segmentList[i]; - - if ((u32)thisSegment->action == -1) { - thisSegment->action = 0; - } else { - thisSegment->action = header->actionList[(u32)thisSegment->action]; - } - } - - OSReport("Load complete\n"); - - return true; -} - - - -int WorldMapData::getPointID(WMPathPoint *point) { - WMDataHeader *header = (WMDataHeader*)this->fh.filePtr; - - for (int i = 0; i < header->pointCount; i++) { - if (header->pointList[i] == point) - return i; - } - - return -1; -} diff --git a/src/worldmapdata.h b/src/worldmapdata.h deleted file mode 100644 index 1d6a305..0000000 --- a/src/worldmapdata.h +++ /dev/null @@ -1,149 +0,0 @@ -#ifndef __NEWER_WORLDMAPDATA_H -#define __NEWER_WORLDMAPDATA_H - -#include "fileload.h" -#include - -// Forward declarations -struct WMPathPoint; -struct WMPathAction; -struct WMPathSegment; -struct WMPathDef; - -// here's a note: while most of these structs contain pointers to other structs, -// in the data file these fields actually contain an index into the lists -// (defined in WMDataHeader) -// WorldMapData::load() fixes these offsets. - -/******************************************************************************/ -// Definition for an entrance onto one side of a path -// (TODO: Maybe rename this struct?) - -// Note: a null WMPathEntrance has no path defined -// since the path pointer is stored as an index in the data file, the index for -// a null path becomes -1 - -struct WMPathEntrance { - WMPathDef *path; - bool isEndSide; - - bool isValid() { return (this->path != 0); } -}; - - -/******************************************************************************/ -// Definition for one point on the map - -struct WMPathPoint { - enum PointType { - NONE_TYPE, - LEVEL_TYPE - }; - - // Paths you arrive on when you press a direction when at this point - union { - struct { - WMPathEntrance left; - WMPathEntrance right; - WMPathEntrance up; - WMPathEntrance down; - } asDirection; - WMPathEntrance asArray[4]; - } exits; - - // Point metadata - PointType type; - int params[4]; - - Vec position; -}; - - -/******************************************************************************/ -// Definition for an action that can be triggered when the player reaches a -// specific point - -struct WMPathAction { - enum ActionType { - TELEPORT_TYPE // teleports to another submap - }; - - // Action metadata - ActionType type; - int params[4]; -}; - - -/******************************************************************************/ -// Definition for one part of a path - -struct WMPathSegment { - // Segment metadata - Vec start; - Vec end; - float stepsPerFrame; - int animationType; - float animationSpeed; - short direction; - bool useLastDir; - bool alwaysSameDir; - - // Optional Action that's triggered when the player touches this segment - WMPathAction *action; -}; - - -/******************************************************************************/ -// Definition for one path - -struct WMPathDef { - // Path metadata - WMPathPoint *startPoint; - WMPathPoint *endPoint; - - int segCount; - WMPathSegment *segments[1]; // variable-length array -}; - - - - -struct WMDataHeader { - u32 magic; - - WMPathDef **pathList; - int pathCount; - - WMPathPoint **pointList; - int pointCount; - - WMPathSegment **segmentList; - int segmentCount; - - // todo: remove action list? - WMPathAction **actionList; - int actionCount; -}; - - -class WorldMapData { -public: - WorldMapData(); - ~WorldMapData(); - - bool load(const char *filename); - - FileHandle fh; - - int getPathCount() { - return ((WMDataHeader*)fh.filePtr)->pathCount; - } - - WMPathDef *getPath(int idx) { - return ((WMDataHeader*)fh.filePtr)->pathList[idx]; - } - - int getPointID(WMPathPoint *point); -}; - -#endif // __NEWER_WORLDMAPDATA_H -- cgit v1.2.3