diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/g3dwrap.cpp | 90 | ||||
-rw-r--r-- | src/wm_player.cpp | 192 | ||||
-rw-r--r-- | src/wmresourcemng.cpp | 78 | ||||
-rw-r--r-- | src/world_camera.cpp | 94 | ||||
-rw-r--r-- | src/worldmap.cpp | 1567 | ||||
-rw-r--r-- | src/worldmap_new.cpp | 1358 | ||||
-rw-r--r-- | src/worldmapdata.cpp | 93 | ||||
-rw-r--r-- | src/worldmapdata.h | 149 |
8 files changed, 1340 insertions, 2281 deletions
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 <rvl/mtx.h> - -// 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 |