summaryrefslogtreecommitdiff
path: root/src/koopatlas/core.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/koopatlas/core.cpp')
-rw-r--r--src/koopatlas/core.cpp928
1 files changed, 928 insertions, 0 deletions
diff --git a/src/koopatlas/core.cpp b/src/koopatlas/core.cpp
new file mode 100644
index 0000000..627f828
--- /dev/null
+++ b/src/koopatlas/core.cpp
@@ -0,0 +1,928 @@
+#include "koopatlas/core.h"
+#include "koopatlas/camera.h"
+#include "koopatlas/player.h"
+#include "koopatlas/hud.h"
+
+extern "C" void LoadMapScene();
+
+dScKoopatlas_c *dScKoopatlas_c::instance = 0;
+
+CREATE_STATE_E(dScKoopatlas_c, Limbo);
+CREATE_STATE_E(dScKoopatlas_c, ContinueWait);
+CREATE_STATE_E(dScKoopatlas_c, Normal);
+CREATE_STATE_E(dScKoopatlas_c, CSMenu);
+CREATE_STATE_E(dScKoopatlas_c, TitleConfirmOpenWait);
+CREATE_STATE_E(dScKoopatlas_c, TitleConfirmSelect);
+CREATE_STATE_E(dScKoopatlas_c, TitleConfirmHitWait);
+CREATE_STATE_E(dScKoopatlas_c, PlayerChangeWait);
+CREATE_STATE_E(dScKoopatlas_c, EasyPairingWait);
+CREATE_STATE_E(dScKoopatlas_c, PowerupsWait);
+CREATE_STATE_E(dScKoopatlas_c, SaveOpen);
+CREATE_STATE_E(dScKoopatlas_c, SaveSelect);
+CREATE_STATE_E(dScKoopatlas_c, SaveWindowClose);
+CREATE_STATE_E(dScKoopatlas_c, SaveDo);
+CREATE_STATE_E(dScKoopatlas_c, SaveEndWindow);
+CREATE_STATE_E(dScKoopatlas_c, SaveEndCloseWait);
+CREATE_STATE_E(dScKoopatlas_c, QuickSaveOpen);
+CREATE_STATE_E(dScKoopatlas_c, QuickSaveSelect);
+CREATE_STATE_E(dScKoopatlas_c, QuickSaveWindowClose);
+CREATE_STATE_E(dScKoopatlas_c, QuickSaveDo);
+CREATE_STATE_E(dScKoopatlas_c, QuickSaveEndWindow);
+CREATE_STATE_E(dScKoopatlas_c, QuickSaveEndCloseWait);
+CREATE_STATE_E(dScKoopatlas_c, SaveError);
+
+dScKoopatlas_c *dScKoopatlas_c::build() {
+ // return new dScKoopatlas_c;
+ MapReport("Creating WorldMap\n");
+
+ void *buffer = AllocFromGameHeap1(sizeof(dScKoopatlas_c));
+ dScKoopatlas_c *c = new(buffer) dScKoopatlas_c;
+
+ MapReport("Created WorldMap @ %p\n", c);
+
+ instance = c;
+ return c;
+}
+
+bool WMInit_StartLoading(void*);
+bool WMInit_LoadSIAnims(void*);
+bool WMInit_EndLoading(void*);
+bool WMInit_LoadResources(void*);
+bool WMInit_SetupWait(void*);
+bool WMInit_SetupExtra(void*);
+bool WMInit_SetupWipe(void*);
+
+ChainedFunc initFunctions[] = {
+ WMInit_StartLoading,
+ WMInit_LoadSIAnims,
+ WMInit_EndLoading,
+ WMInit_LoadResources,
+ WMInit_SetupWait,
+ WMInit_SetupExtra,
+ WMInit_SetupWipe
+};
+
+dScKoopatlas_c::dScKoopatlas_c() : state(this) {
+ initChain.setup(initFunctions, 7);
+
+ setInitChain(initChain);
+}
+
+
+
+#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)))
+
+bool WMInit_StartLoading(void *ptr) {
+ SpammyReport("WMInit_StartLoading called\n");
+
+ DVD_Start();
+ return true;
+}
+
+bool WMInit_LoadSIAnims(void *ptr) {
+ SpammyReport("WMInit_LoadSIAnims called\n");
+
+ 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);
+ return true;
+}
+
+bool WMInit_EndLoading(void *ptr) {
+ SpammyReport("WMInit_EndLoading called\n");
+
+ if (DVD_StillLoading(GetDVDClass2())) {
+ SpammyReport("WMInit_EndLoading returning false\n");
+ return false;
+ }
+
+ DVD_End();
+ SpammyReport("WMInit_EndLoading returning true\n");
+ return true;
+}
+
+bool WMInit_LoadResources(void *ptr) {
+ SpammyReport("WMInit_LoadResources returning true\n");
+
+ dScKoopatlas_c *wm = (dScKoopatlas_c*)ptr;
+ return wm->mapData.load("/Maps/yat.kpbin");
+ //TODO
+ //return wm->resMng.loadSet("MMFullWorld");
+ //return true;
+}
+
+bool WMInit_SetupWait(void *ptr) {
+ SpammyReport("WMInit_SetupWait called\n");
+
+ dScKoopatlas_c *wm = (dScKoopatlas_c*)ptr;
+
+ bool success = true;
+
+ success &= CSMENU_SETUP_DONE(wm->csMenu);
+ success &= SELC_SETUP_DONE(wm->selectCursor);
+ success &= NPCHG_SETUP_DONE(wm->numPeopleChange);
+ success &= YESNO_SETUP_DONE(wm->yesNoWindow);
+ success &= CONT_SETUP_DONE(wm->continueObj);
+ success &= STKI_SETUP_DONE(wm->stockItem);
+ success &= SIS_SETUP_DONE(wm->stockItemShadow);
+ success &= EASYP_SETUP_DONE(wm->easyPairing);
+
+ return success;
+}
+
+bool WMInit_SetupExtra(void *ptr) {
+ SpammyReport("WMInit_SetupExtra called\n");
+
+ // ok, now we can set up other required shit
+ dScKoopatlas_c *wm = (dScKoopatlas_c*)ptr;
+
+ // first up: player models for Stocked Items
+ for (int i = 0; i < 4; i++) {
+ void *obj = CreateChildObject(WM_2D_PLAYER, wm, i, 0, 0);
+ STKI_2DPLAYER(wm->stockItem,i) = obj;
+ NPCHG_2DPLAYER(wm->numPeopleChange,i) = obj;
+ }
+
+ // next: items for the Powerup screen
+ for (int i = 0; i < 7; i++) {
+ void *obj = CreateChildObject(WM_ITEM, wm, i, 0, 0);
+ STKI_ITEM(wm->stockItem,i) = obj;
+ }
+
+ // since we've got all the resources, set up the path data too
+ //wm->pathManager->setup();
+ //wm->pathManager->computeEvents();
+
+ // and now Player setup
+ wm->player = (daWMPlayer_c*)CreateParentedObject(WM_PLAYER, wm, 0, 2);
+ wm->player->modelHandler->mdlClass->setPowerup(2);
+ wm->player->modelHandler->mdlClass->startAnimation(0, 1.2f, 10.0f, 0.0f);
+ //wm->player->pos = wm->pathManager->currentPoint->position;
+
+ // is last param correct? must check :/
+ wm->map = (dWMMap_c*)CreateParentedObject(WM_MAP, wm, 0, 0);
+ wm->hud = (dWMHud_c*)CreateParentedObject(WM_HUD, wm, 0, 0);
+ // note: world_camera and wm_path_manager are not created here
+ // because we require them earlier
+ // they are created in dScKoopatlas_c::onCreate
+
+ return true;
+}
+
+bool WMInit_SetupWipe(void *ptr) {
+ SpammyReport("WMInit_SetupWipe called\n");
+
+ dScKoopatlas_c *wm = (dScKoopatlas_c*)ptr;
+
+ if (wm->hasUninitialisedProcesses()) {
+ SpammyReport("WMInit_SetupWipe returning false\n");
+ return false;
+ }
+
+ SpammyReport("WMInit_SetupWipe returning true\n");
+ return true;
+}
+
+
+
+
+
+/*void dScKoopatlas_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);
+}*/
+
+
+int dScKoopatlas_c::onCreate() {
+ SpammyReport("onCreate() called\n");
+
+ SpammyReport("LoadMapScene()\n");
+ LoadMapScene();
+
+ SpammyReport("GameSetup__LoadScene(0)\n");
+ GameSetup__LoadScene(0); // lol, stolen from GAME_SETUP
+
+
+ SpammyReport("select cursor\n");
+ this->selectCursor = CreateParentedObject(SELECT_CURSOR, this, 0, 0);
+
+ SpammyReport("cs menu\n");
+ this->csMenu = CreateParentedObject(COURSE_SELECT_MENU, this, 0, 0);
+
+ SpammyReport("yes no window\n");
+ this->yesNoWindow = CreateParentedObject(YES_NO_WINDOW, this, 0, 0);
+
+ SpammyReport("number of people change\n");
+ this->numPeopleChange = CreateParentedObject(NUMBER_OF_PEOPLE_CHANGE, this, 0, 0);
+
+ for (int i = 0; i < 4; i++) {
+ SpammyReport("ccsb %d\n", i);
+ void *ccsb = CreateParentedObject(CHARACTER_CHANGE_SELECT_BASE, this, i, 0);
+ SpammyReport("ccsc %d\n", i);
+ void *ccsc = CreateParentedObject(CHARACTER_CHANGE_SELECT_CONTENTS, this, i, 0);
+ SpammyReport("ccsa %d\n", i);
+ void *ccsa = CreateParentedObject(CHARACTER_CHANGE_SELECT_ARROW, this, i, 0);
+ SpammyReport("ccsi %d\n", i);
+ 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;
+ }
+
+ SpammyReport("continue\n");
+ this->continueObj = CreateParentedObject(CONTINUE, this, 0, 0);
+
+ // check if we need to handle Continue
+ if (CheckIfContinueShouldBeActivated()) {
+ SpammyReport("continue is activated\n");
+ state.setState(&StateID_ContinueWait);
+ CONT_UNK1(this->continueObj) = true;
+ CONT_UNK2(this->continueObj) = true;
+ CONT_UNK3(this->continueObj) = false;
+ } else {
+ SpammyReport("continue is not activated\n");
+ state.setState(&StateID_Normal);
+ }
+
+ SpammyReport("stock item\n");
+ this->stockItem = CreateParentedObject(STOCK_ITEM, this, 0, 0);
+ SpammyReport("stock item shadow\n");
+ this->stockItemShadow = CreateParentedObject(STOCK_ITEM_SHADOW, this, 0, 0);
+ STKI_SHADOW(this->stockItem) = this->stockItemShadow;
+
+ SpammyReport("easy pairing\n");
+ this->easyPairing = CreateParentedObject(EASY_PAIRING, this, 0, 0);
+
+ SpammyReport("world camera\n");
+ CreateParentedObject(WORLD_CAMERA, this, 0, 0);
+
+ /*pathManager = (dWMPathManager_c*)CreateParentedObject(WM_PATH_MANAGER, this, 0, 0);*/
+
+ SpammyReport("setting NewerMapDrawFunc\n");
+ *CurrentDrawFunc = NewerMapDrawFunc;
+
+ // level info
+ /*SpammyReport("loading level info file\n");
+ levelInfoFile.open("/NewerRes/LevelInfo.bin");
+ SpammyReport("preparing level info\n");
+ levelInfo.load(levelInfoFile.ptr());*/
+
+ SpammyReport("onCreate() completed\n");
+ return true;
+}
+
+int dScKoopatlas_c::onDelete() {
+ 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 dScKoopatlas_c::canDoStuff() {
+ if (QueryGlobal5758(0xFFFFFFFF)) return false;
+ if (CheckIfWeCantDoStuff()) return false;
+ if (state.getCurrentState() == &StateID_Limbo) return false;
+ return true;
+}
+
+
+int dScKoopatlas_c::onExecute() {
+ if (!canDoStuff()) return true;
+
+ SpammyReport("Executing state: %s\n", state.getCurrentState()->getName());
+ state.execute();
+
+ return true;
+}
+
+
+void dScKoopatlas_c::executeState_Limbo() { }
+
+
+void dScKoopatlas_c::executeState_ContinueWait() {
+ // Waiting for the Continue anim to finish
+ 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);
+ }
+
+ state.setState(&StateID_Normal);
+ }
+}
+
+void dScKoopatlas_c::executeState_Normal() {
+ int nowPressed = Remocon_GetPressed(GetActiveRemocon());
+
+ // Nothing related to the menu is going on
+ if (nowPressed & WPAD_ONE) {
+ STKI_SHOW(this->stockItem) = true;
+ state.setState(&StateID_PowerupsWait);
+ } else if (nowPressed & WPAD_PLUS) {
+ CSMENU_ACTIVE(this->csMenu) = true;
+ state.setState(&StateID_CSMenu);
+ }
+}
+
+void dScKoopatlas_c::executeState_CSMenu() {
+ // The course select menu is currently being shown
+
+ // 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
+ MapReport("Star Coins was pressed\n");
+ state.setState(&StateID_Normal);
+ break;
+
+ case 1:
+ // Add/Drop Players
+ MapReport("Add/Drop Players was pressed\n");
+ state.setState(&StateID_PlayerChangeWait);
+ NPCHG_ACTIVE(this->numPeopleChange) = true;
+ WpadShit(10);
+
+ break;
+
+ case 2:
+ // Save or Quick Save
+ MapReport("Save or Quick Save was pressed\n");
+ if (GetSaveFile()->GetBlock(-1)->bitfield & 2) {
+ state.setState(&StateID_SaveOpen);
+ YESNO_TYPE(this->yesNoWindow) = 1;
+ YESNO_VISIBLE(this->yesNoWindow) = 1;
+
+ } else {
+ state.setState(&StateID_QuickSaveOpen);
+ YESNO_TYPE(this->yesNoWindow) = 15;
+ YESNO_VISIBLE(this->yesNoWindow) = 1;
+
+ }
+
+ break;
+
+ case 3:
+ // Title Screen
+ MapReport("Title Screen was pressed\n");
+ state.setState(&StateID_TitleConfirmOpenWait);
+ YESNO_VISIBLE(this->yesNoWindow) = true;
+ YESNO_TYPE(this->yesNoWindow) = 10;
+ break;
+ }
+
+ } else {
+ // Ok, change back to STATE_Normal
+ state.setState(&StateID_Normal);
+ }
+ }
+}
+
+void dScKoopatlas_c::executeState_TitleConfirmOpenWait() {
+ // Waiting for the "Go to Title Screen" YesNoWindow to finish opening
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ state.setState(&StateID_TitleConfirmSelect);
+ }
+
+}
+
+/**********************************************************************/
+// STATE_TitleConfirmSelect : Let the user choose an option on the
+// "Go to Title Screen" YesNoWindow.
+void dScKoopatlas_c::executeState_TitleConfirmSelect() {
+ int nowPressed = Remocon_GetPressed(GetActiveRemocon());
+
+ 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;
+ state.setState(&StateID_TitleConfirmHitWait);
+
+ } else {
+ // Cancel using B or 1
+ if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) {
+ YESNO_CANCELLED(this->yesNoWindow) = true;
+ YESNO_CURRENT(this->yesNoWindow) = true;
+ state.setState(&StateID_TitleConfirmHitWait);
+ }
+ }
+
+}
+
+/**********************************************************************/
+// STATE_TitleConfirmHitWait : Process the user's chosen option on
+// the "Go to Title Screen" YesNoWindow. Also, wait for the
+// animation to be complete.
+void dScKoopatlas_c::executeState_TitleConfirmHitWait() {
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ if (YESNO_CURRENT(this->yesNoWindow) == 1) {
+ state.setState(&StateID_Normal);
+ } else {
+ state.setState(&StateID_Limbo);
+ StartTitleScreenStage(false, 0);
+ }
+ }
+
+}
+
+/**********************************************************************/
+// STATE_PlayerChangeWait : Wait for the user to do something on the
+// Add/Drop Players screen.
+void dScKoopatlas_c::executeState_PlayerChangeWait() {
+ int nowPressed = Remocon_GetPressed(GetActiveRemocon());
+
+ 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;
+ state.setState(&StateID_EasyPairingWait);
+ }
+ } else {
+ if (!NPCHG_ACTIVE(this->numPeopleChange)) {
+ state.setState(&StateID_Normal);
+ }
+ }
+
+}
+
+/**********************************************************************/
+// STATE_EasyPairingWait : Wait for the user to exit Easy Pairing.
+void dScKoopatlas_c::executeState_EasyPairingWait() {
+
+ 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;
+ }
+
+ state.setState(&StateID_PlayerChangeWait);
+ WpadShit(10);
+ }
+
+}
+
+/**********************************************************************/
+// STATE_PowerupsWait : Wait for the user to exit the Powerups screen.
+void dScKoopatlas_c::executeState_PowerupsWait() {
+
+ if (!STKI_SHOW(this->stockItem)) {
+ state.setState(&StateID_Normal);
+ }
+
+}
+
+/**********************************************************************/
+// STATE_SaveOpen : Waiting for the "Save?" YesNoWindow to open
+void dScKoopatlas_c::executeState_SaveOpen() {
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ state.setState(&StateID_SaveSelect);
+ }
+
+}
+
+/**********************************************************************/
+// STATE_SaveSelect : Let the user choose an option on the
+// "Save?" YesNoWindow.
+void dScKoopatlas_c::executeState_SaveSelect() {
+ int nowPressed = Remocon_GetPressed(GetActiveRemocon());
+
+ 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;
+ state.setState(&StateID_SaveWindowClose);
+
+ } else {
+ // Cancel using B or 1
+ if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) {
+ YESNO_CANCELLED(this->yesNoWindow) = true;
+ YESNO_CURRENT(this->yesNoWindow) = 1;
+ state.setState(&StateID_SaveWindowClose);
+ }
+ }
+
+}
+
+/**********************************************************************/
+// STATE_SaveWindowClose : Process the user's chosen option on the
+// "Save?" YesNoWindow. Also, wait for the animation to be complete.
+void dScKoopatlas_c::executeState_SaveWindowClose() {
+
+ if (!YESNO_VISIBLE(this->yesNoWindow)) {
+ if (YESNO_CURRENT(this->yesNoWindow) == 1) {
+ state.setState(&StateID_Normal);
+ } else {
+ state.setState(&StateID_SaveDo);
+ SaveGame(0, false);
+ }
+ }
+
+}
+
+/**********************************************************************/
+// STATE_SaveDo : Save the game.
+void dScKoopatlas_c::executeState_SaveDo() {
+
+ if (!GetSaveFile()->CheckIfWriting()) {
+ if (GetSaveHandler()->CurrentError == 0) {
+ YESNO_TYPE(this->yesNoWindow) = 2;
+ YESNO_VISIBLE(this->yesNoWindow) = true;
+ state.setState(&StateID_SaveEndWindow);
+ } else {
+ state.setState(&StateID_SaveError);
+ }
+ }
+
+}
+
+/**********************************************************************/
+// STATE_SaveEndWindow : Handle the Save End window.
+void dScKoopatlas_c::executeState_SaveEndWindow() {
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
+ YESNO_CLOSE(this->yesNoWindow) = true;
+ state.setState(&StateID_SaveEndCloseWait);
+ }
+ }
+
+}
+
+/**********************************************************************/
+// STATE_SaveEndCloseWait : Wait for the Save End window to close.
+void dScKoopatlas_c::executeState_SaveEndCloseWait() {
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ state.setState(&StateID_Normal);
+ }
+
+}
+
+/**********************************************************************/
+// STATE_QuickSaveOpen : Waiting for the "Save?" YesNoWindow to open
+void dScKoopatlas_c::executeState_QuickSaveOpen() {
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ state.setState(&StateID_QuickSaveSelect);
+ }
+
+}
+
+/**********************************************************************/
+// STATE_QuickSaveSelect : Let the user choose an option on the
+// "Save?" YesNoWindow.
+void dScKoopatlas_c::executeState_QuickSaveSelect() {
+ int nowPressed = Remocon_GetPressed(GetActiveRemocon());
+
+ 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;
+ state.setState(&StateID_QuickSaveWindowClose);
+
+ } else {
+ // Cancel using B or 1
+ if (CheckIfMenuShouldBeCancelledForSpecifiedWiimote(0)) {
+ YESNO_CANCELLED(this->yesNoWindow) = true;
+ YESNO_CURRENT(this->yesNoWindow) = 1;
+ state.setState(&StateID_QuickSaveWindowClose);
+ }
+ }
+
+}
+
+/**********************************************************************/
+// STATE_QuickSaveWindowClose : Process the user's chosen option on
+// the "Save?" YesNoWindow. Also, wait for the animation to be complete
+void dScKoopatlas_c::executeState_QuickSaveWindowClose() {
+
+ if (!YESNO_VISIBLE(this->yesNoWindow)) {
+ if (YESNO_CURRENT(this->yesNoWindow) == 1) {
+ state.setState(&StateID_Normal);
+ } else {
+ state.setState(&StateID_QuickSaveDo);
+ SaveGame(0, true);
+ }
+ }
+
+}
+
+/**********************************************************************/
+// STATE_QuickSaveDo : Save the game.
+void dScKoopatlas_c::executeState_QuickSaveDo() {
+
+ if (!GetSaveFile()->CheckIfWriting()) {
+ if (GetSaveHandler()->CurrentError == 0) {
+ YESNO_TYPE(this->yesNoWindow) = 16;
+ YESNO_VISIBLE(this->yesNoWindow) = true;
+ state.setState(&StateID_QuickSaveEndWindow);
+ } else {
+ state.setState(&StateID_SaveError);
+ }
+ }
+
+}
+
+// STATE_QuickSaveEndWindow : Handle the Save End window.
+void dScKoopatlas_c::executeState_QuickSaveEndWindow() {
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ if (Wiimote_TestButtons(GetActiveWiimote(), WPAD_A | WPAD_TWO)) {
+ YESNO_CLOSE(this->yesNoWindow) = true;
+ YESNO_REFUSED(this->yesNoWindow) = true;
+ state.setState(&StateID_QuickSaveEndCloseWait);
+ }
+ }
+
+}
+
+void dScKoopatlas_c::executeState_QuickSaveEndCloseWait() {
+ // Wait for Save End window to close
+
+ if (!YESNO_OPENING(this->yesNoWindow)) {
+ if (YESNO_CURRENT(this->yesNoWindow) == 1) {
+ state.setState(&StateID_Normal);
+ } else {
+ state.setState(&StateID_Limbo);
+ StartTitleScreenStage(false, 0);
+ }
+ }
+
+}
+
+
+void dScKoopatlas_c::executeState_SaveError() { }
+
+
+/*
+// MODELLED ON STAGE
+void NewerMapDrawFunc() {
+ DoSomethingCameraRelatedWithEGGScreen(0, &dWorldCamera_c::instance->screen);
+ LinkScene(0);
+ ChangeAlphaUpdate(false);
+ SceneCalcWorld(0);
+ SceneCameraStuff(0);
+ DrawOpa();
+ DrawXlu();
+ // Something
+ nw4r::g3d::Camera camera(GetCameraByID(0));
+ camera.GXSetViewport();
+ camera.GXSetScissor();
+ RenderEffects(0, 6);
+ SetupLYTDrawing();
+ DrawAllLayoutsBeforeX(0x81);
+ RenderEffects(0, 3);
+ RenderEffects(0, 2);
+ DrawAllLayoutsAfterX(0x80);
+ ClearLayoutDrawList();
+ UnlinkScene(0);
+}*/
+
+
+void NewerMapDrawFunc() {
+ Reset3DState();
+ SetCurrentCameraID(0);
+ DoSomethingCameraRelatedWithEGGScreen(0, &dWorldCamera_c::instance->screen);
+ LinkScene(0);
+ SceneCalcWorld(0);
+ SceneCameraStuff(0);
+ ChangeAlphaUpdate(false);
+ DrawOpa();
+ DrawXlu();
+ UnlinkScene(0);
+ // Something
+ SetupLYTDrawing();
+ DrawAllLayoutsBeforeX(0x81);
+ RenderEffects(0, 3);
+ RenderEffects(0, 2);
+ GXDrawDone();
+ RemoveAllFromScnRoot();
+ Reset3DState();
+ SetCurrentCameraID(1);
+ DoSpecialDrawing1();
+ LinkScene(1);
+ SceneCalcWorld(1);
+ SceneCameraStuff(1);
+ CalcMaterial();
+ DrawOpa();
+ DrawXlu();
+ UnlinkScene(1);
+ GXDrawDone();
+ // Leaving out some stuff here
+ DrawAllLayoutsAfterX(0x80);
+ ClearLayoutDrawList();
+ SetCurrentCameraID(0);
+}
+
+
+/*void NewerMapDrawFunc() {
+ int keepCamera = GetCurrentCameraID();
+
+ // All drawing uses scene 1, since that's the only one loaded by GAME_SETUP.
+ // Todo: Newer-specific scenes?
+
+ // Stage 1
+
+ // 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();
+ DrawAllLayoutsBeforeX(146);
+ //DrawAllLayoutsBeforeX(129);
+ //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);
+}
+
+*/