diff -Naur xu4-1.2.1/src/intro.cpp u4-1.2.1/src/intro.cpp --- xu4-1.2.1/src/intro.cpp 2022-12-28 11:16:16.000000000 -0500 +++ u4-1.2.1/src/intro.cpp 2022-12-12 17:42:19.000000000 -0500 @@ -48,8 +48,6 @@ #define GYP_SEGUE1 13 #define GYP_SEGUE2 14 -#define INTRO_CON IntroController* ic = xu4.intro - #ifndef GPU_RENDER class IntroObjectState { public: @@ -59,6 +57,9 @@ }; #endif +/* temporary place-holder for settings changes */ +SettingsData settingsChanged; + const int IntroBinData::INTRO_TEXT_OFFSET = 17445 - 1; // (start at zero) const int IntroBinData::INTRO_MAP_OFFSET = 30339; const int IntroBinData::INTRO_FIXUPDATA_OFFSET = 29806; @@ -167,93 +168,20 @@ return true; } -//---------------------------------------------------------------------------- - -struct SettingsMenus { - static void menusNotice(int, void*, void*); - - SettingsMenus(); - - void showMenu(Menu *menu); - void drawMenu(); - void dispatchMenu(const MenuEvent* event); - void saveSettings(); - void updateConfMenu(int); - void updateVideoMenu(int); - void updateSoundMenu(int); - - enum MenuConstants { - MI_CONF_VIDEO, - MI_CONF_SOUND, - MI_CONF_INPUT, - MI_CONF_SPEED, - MI_CONF_GAMEPLAY, - MI_CONF_INTERFACE, - MI_CONF_01, - MI_VIDEO_CONF_GFX, - MI_VIDEO_02, - MI_VIDEO_03, - MI_VIDEO_04, - MI_VIDEO_05, - MI_VIDEO_06, - MI_VIDEO_07, - MI_VIDEO_08, - MI_GFX_TILE_TRANSPARENCY, - MI_GFX_TILE_TRANSPARENCY_SHADOW_SIZE, - MI_GFX_TILE_TRANSPARENCY_SHADOW_OPACITY, - MI_GFX_RETURN, - MI_SOUND_01, - MI_SOUND_02, - MI_SOUND_03, - MI_INPUT_01, - MI_INPUT_02, - MI_INPUT_03, - MI_SPEED_01, - MI_SPEED_02, - MI_SPEED_03, - MI_SPEED_04, - MI_SPEED_05, - MI_SPEED_06, - MI_SPEED_07, - MI_GAMEPLAY_01, - MI_GAMEPLAY_02, - MI_GAMEPLAY_03, - MI_GAMEPLAY_04, - MI_GAMEPLAY_05, - MI_GAMEPLAY_06, - MI_INTERFACE_01, - MI_INTERFACE_02, - MI_INTERFACE_03, - MI_INTERFACE_04, - MI_INTERFACE_05, - MI_INTERFACE_06, - USE_SETTINGS = 0xFE, - CANCEL = 0xFF - }; - - Menu mainMenu; - Menu confMenu; - Menu videoMenu; - Menu gfxMenu; - Menu soundMenu; - Menu inputMenu; - Menu speedMenu; - Menu gameplayMenu; - Menu interfaceMenu; - - Menu* active; - TextView extendedMenuArea; - int listenerId; - - /* temporary place-holder for settings changes */ - SettingsData settingsChanged; -}; - -SettingsMenus::SettingsMenus() : - extendedMenuArea(2 * CHAR_WIDTH, 10 * CHAR_HEIGHT, 36, 13) +IntroController::IntroController() : + Controller(1), + backgroundArea(), + menuArea(1 * CHAR_WIDTH, 13 * CHAR_HEIGHT, 38, 11), + extendedMenuArea(2 * CHAR_WIDTH, 10 * CHAR_HEIGHT, 36, 13), + questionArea(INTRO_TEXT_X * CHAR_WIDTH, INTRO_TEXT_Y * CHAR_HEIGHT, INTRO_TEXT_WIDTH, INTRO_TEXT_HEIGHT), + mapArea(BORDER_WIDTH, (TILE_HEIGHT * 6) + BORDER_HEIGHT, INTRO_MAP_WIDTH, INTRO_MAP_HEIGHT), + binData(NULL), + titles(), // element list + title(titles.begin()), // element iterator + bSkipTitles(false), + egaGraphics(true) { - active = &confMenu; - + // initialize menus confMenu.setTitle("XU4 Configuration:", 0, 0); confMenu.add(MI_CONF_VIDEO, "\010 Video Options", 2, 2,/*'v'*/ 2); confMenu.add(MI_CONF_SOUND, "\010 Sound Options", 2, 3,/*'s'*/ 2); @@ -267,8 +195,8 @@ confMenu.setClosesMenu(CANCEL); /* set the default visibility of the two enhancement menus */ - confMenu.itemOfId(MI_CONF_GAMEPLAY)->setVisible(xu4.settings->enhancements); - confMenu.itemOfId(MI_CONF_INTERFACE)->setVisible(xu4.settings->enhancements); + confMenu.getItemById(MI_CONF_GAMEPLAY)->setVisible(xu4.settings->enhancements); + confMenu.getItemById(MI_CONF_INTERFACE)->setVisible(xu4.settings->enhancements); videoMenu.setTitle("Video Options:", 0, 0); videoMenu.add(MI_VIDEO_CONF_GFX, "\010 Game Graphics Options", 2, 2,/*'g'*/ 2); @@ -306,7 +234,7 @@ inputMenu.setTitle("Keyboard Options:", 0, 0); inputMenu.add(MI_INPUT_01, new IntMenuItem("Repeat Delay %4d msec", 2, 2,/*'d'*/ 7, &settingsChanged.keydelay, 100, MAX_KEY_DELAY, 100)); inputMenu.add(MI_INPUT_02, new IntMenuItem("Repeat Interval %4d msec", 2, 3,/*'i'*/ 7, &settingsChanged.keyinterval, 10, MAX_KEY_INTERVAL, 10)); - /* "Mouse Options:" is drawn in dispatchMenu() */ + /* "Mouse Options:" is drawn in the updateInputMenu() function */ inputMenu.add(MI_INPUT_03, new BoolMenuItem("Mouse %s", 2, 7,/*'m'*/ 0, &settingsChanged.mouseOptions.enabled)); inputMenu.add(USE_SETTINGS, "\010 Use These Settings", 2, 11,/*'u'*/ 2); inputMenu.add(CANCEL, "\010 Cancel", 2, 12,/*'c'*/ 2); @@ -357,198 +285,7 @@ interfaceMenu.setClosesMenu(CANCEL); } -/* - * Set the active menu. - */ -void SettingsMenus::showMenu(Menu *menu) -{ - active = menu; - menu->reset(); -} - -void SettingsMenus::drawMenu() -{ - // draw the extended background for all option screens - // beasties are always visible on the menus - INTRO_CON; - ic->backgroundArea.draw(BKGD_OPTIONS_TOP, 0, 0); - ic->backgroundArea.draw(BKGD_OPTIONS_BTM, 0, 120); - ic->drawBeasties(); - - active->show(&extendedMenuArea); - - // after drawing the menu, extra menu text can be added here - if (active == &inputMenu) - extendedMenuArea.textAt(0, 5, "Mouse Options:"); - else if (active == &interfaceMenu) - extendedMenuArea.textAt(2, 3, " (Open, Jimmy, etc.)"); - - screenUploadToGPU(); -} - -/* - * Update the screen when an observed menu is reset or has an item - * activated. - */ -void SettingsMenus::menusNotice(int sender, void* eventData, void* user) { - ((SettingsMenus*) user)->dispatchMenu((MenuEvent*) eventData); -} - -void SettingsMenus::saveSettings() { - xu4.settings->setData(settingsChanged); - xu4.settings->write(); -} - -void SettingsMenus::dispatchMenu(const MenuEvent* event) -{ - const Menu* menu = event->menu; - - //printf("KR menu %d\n", event->type); - - if (event->type == MenuEvent::ACTIVATE || - event->type == MenuEvent::INCREMENT || - event->type == MenuEvent::DECREMENT) - { - int itemId = event->item->getId(); - - if (menu == &confMenu) { - updateConfMenu(itemId); - } - else if (menu == &videoMenu) { - updateVideoMenu(itemId); - } - else if (menu == &gfxMenu) { - if(itemId == MI_GFX_RETURN) - showMenu(&videoMenu); - } - else if (menu == &soundMenu) { - updateSoundMenu(itemId); - } - else if (menu == &inputMenu) { - if (itemId == USE_SETTINGS) { - saveSettings(); - screenShowMouseCursor(xu4.settings->mouseOptions.enabled); - } - } - else if (menu == &speedMenu) { - if (itemId == USE_SETTINGS) { - saveSettings(); - - // re-initialize events - xu4.eventHandler->setTimerInterval(1000 / xu4.settings->gameCyclesPerSecond); - } - } - else if (menu == &gameplayMenu || - menu == &interfaceMenu) { - if (itemId == USE_SETTINGS) - saveSettings(); - } - - if (itemId == CANCEL) - settingsChanged = *xu4.settings; // discard settings - } - - drawMenu(); -} - -void SettingsMenus::updateConfMenu(int itemId) { - // show or hide game enhancement options if enhancements are enabled/disabled - confMenu.itemOfId(MI_CONF_GAMEPLAY)->setVisible(settingsChanged.enhancements); - confMenu.itemOfId(MI_CONF_INTERFACE)->setVisible(settingsChanged.enhancements); - - saveSettings(); - - switch(itemId) { - case MI_CONF_VIDEO: - showMenu(&videoMenu); - break; - case MI_VIDEO_CONF_GFX: - showMenu(&gfxMenu); - break; - case MI_CONF_SOUND: - showMenu(&soundMenu); - break; - case MI_CONF_INPUT: - showMenu(&inputMenu); - break; - case MI_CONF_SPEED: - showMenu(&speedMenu); - break; - case MI_CONF_GAMEPLAY: - showMenu(&gameplayMenu); - break; - case MI_CONF_INTERFACE: - showMenu(&interfaceMenu); - break; - } -} - -void SettingsMenus::updateVideoMenu(int itemId) { - switch(itemId) { - case USE_SETTINGS: - /* save settings (if necessary) */ - if (*xu4.settings != settingsChanged) { - saveSettings(); - - /* FIXME: resize images, etc. */ - INTRO_CON; - ic->deleteIntro(); // delete intro stuff - screenReInit(); - ic->init(); // re-fix the backgrounds and scale images, etc. - - // go back to menu mode - ic->mode = IntroController::INTRO_MENU; - } - break; - case MI_VIDEO_CONF_GFX: - showMenu(&gfxMenu); - break; - } -} - -void SettingsMenus::updateSoundMenu(int itemId) { - switch(itemId) { - case MI_SOUND_01: - musicSetVolume(settingsChanged.musicVol); - break; - case MI_SOUND_02: - soundSetVolume(settingsChanged.soundVol); - soundPlay(SOUND_FLEE); - break; - case USE_SETTINGS: - saveSettings(); - { - INTRO_CON; - musicPlay(ic->introMusic); - } - break; - case CANCEL: - musicSetVolume(xu4.settings->musicVol); - soundSetVolume(xu4.settings->soundVol); - break; - } -} - -//---------------------------------------------------------------------------- - -IntroController::IntroController() : - Controller(1), - backgroundArea(), - menuArea(1 * CHAR_WIDTH, 13 * CHAR_HEIGHT, 38, 11), - questionArea(INTRO_TEXT_X * CHAR_WIDTH, INTRO_TEXT_Y * CHAR_HEIGHT, INTRO_TEXT_WIDTH, INTRO_TEXT_HEIGHT), - mapArea(BORDER_WIDTH, (TILE_HEIGHT * 6) + BORDER_HEIGHT, INTRO_MAP_WIDTH, INTRO_MAP_HEIGHT), - menus(NULL), - binData(NULL), - titles(), // element list - title(titles.begin()), // element iterator - bSkipTitles(false), - egaGraphics(true) -{ -} - IntroController::~IntroController() { - delete menus; - for (unsigned i=0; i < titles.size(); i++) { delete titles[i].srcImage; delete titles[i].destImage; @@ -558,10 +295,12 @@ bool IntroController::present() { init(); preloadMap(); + listenerId = gs_listen(1<extendedMenuArea.reinit(); + extendedMenuArea.reinit(); questionArea.reinit(); mapArea.reinit(); @@ -714,17 +452,10 @@ MAP_ENABLE; break; case 'c': { - if (! menus) - menus = new SettingsMenus; - // Make a copy of our settings so we can change them - menus->settingsChanged = *xu4.settings; + settingsChanged = *xu4.settings; screenHideCursor(); - menus->listenerId = gs_listen(1<menusNotice, - menus); - menus->showMenu(&menus->confMenu); - runMenu(&menus->confMenu, &menus->extendedMenuArea, true); - gs_unplug(menus->listenerId); + runMenu(&confMenu, &extendedMenuArea, true); screenShowCursor(); updateScreen(); break; @@ -1489,6 +1220,289 @@ } /** + * Update the screen when an observed menu is reset or has an item + * activated. + * TODO, reduce duped code. + */ +void IntroController::introNotice(int sender, void* eventData, void* user) { + MenuEvent* event = (MenuEvent*) eventData; + ((IntroController*) user)->dispatchMenu(event->menu, *event); +} + +void IntroController::dispatchMenu(const Menu *menu, MenuEvent &event) { + if (menu == &confMenu) + updateConfMenu(event); + else if (menu == &videoMenu) + updateVideoMenu(event); + else if (menu == &gfxMenu) + updateGfxMenu(event); + else if (menu == &soundMenu) + updateSoundMenu(event); + else if (menu == &inputMenu) + updateInputMenu(event); + else if (menu == &speedMenu) + updateSpeedMenu(event); + else if (menu == &gameplayMenu) + updateGameplayMenu(event); + else if (menu == &interfaceMenu) + updateInterfaceMenu(event); + + // beasties are always visible on the menus + drawBeasties(); +} + +void IntroController::updateConfMenu(MenuEvent &event) { + if (event.type == MenuEvent::ACTIVATE || + event.type == MenuEvent::INCREMENT || + event.type == MenuEvent::DECREMENT) { + + // show or hide game enhancement options if enhancements are enabled/disabled + confMenu.getItemById(MI_CONF_GAMEPLAY)->setVisible(settingsChanged.enhancements); + confMenu.getItemById(MI_CONF_INTERFACE)->setVisible(settingsChanged.enhancements); + + // save settings + xu4.settings->setData(settingsChanged); + xu4.settings->write(); + + switch(event.item->getId()) { + case MI_CONF_VIDEO: + runMenu(&videoMenu, &extendedMenuArea, true); + break; + case MI_VIDEO_CONF_GFX: + runMenu(&gfxMenu, &extendedMenuArea, true); + break; + case MI_CONF_SOUND: + runMenu(&soundMenu, &extendedMenuArea, true); + break; + case MI_CONF_INPUT: + runMenu(&inputMenu, &extendedMenuArea, true); + break; + case MI_CONF_SPEED: + runMenu(&speedMenu, &extendedMenuArea, true); + break; + case MI_CONF_GAMEPLAY: + runMenu(&gameplayMenu, &extendedMenuArea, true); + break; + case MI_CONF_INTERFACE: + runMenu(&interfaceMenu, &extendedMenuArea, true); + break; + case CANCEL: + // discard settings + settingsChanged = *xu4.settings; + break; + default: break; + } + } + + // draw the extended background for all option screens + backgroundArea.draw(BKGD_OPTIONS_TOP, 0, 0); + backgroundArea.draw(BKGD_OPTIONS_BTM, 0, 120); +} + +void IntroController::updateVideoMenu(MenuEvent &event) { + if (event.type == MenuEvent::ACTIVATE || + event.type == MenuEvent::INCREMENT || + event.type == MenuEvent::DECREMENT) { + + switch(event.item->getId()) { + case USE_SETTINGS: + /* save settings (if necessary) */ + if (*xu4.settings != settingsChanged) { + xu4.settings->setData(settingsChanged); + xu4.settings->write(); + + /* FIXME: resize images, etc. */ + deleteIntro(); // delete intro stuff + screenReInit(); + init(); // re-fix the backgrounds and scale images, etc. + + // go back to menu mode + mode = INTRO_MENU; + } + break; + case MI_VIDEO_CONF_GFX: + runMenu(&gfxMenu, &extendedMenuArea, true); + break; + case CANCEL: + // discard settings + settingsChanged = *xu4.settings; + break; + default: break; + } + } + + // draw the extended background for all option screens + backgroundArea.draw(BKGD_OPTIONS_TOP, 0, 0); + backgroundArea.draw(BKGD_OPTIONS_BTM, 0, 120); +} + +void IntroController::updateGfxMenu(MenuEvent &event) +{ + if (event.type == MenuEvent::ACTIVATE || + event.type == MenuEvent::INCREMENT || + event.type == MenuEvent::DECREMENT) { + + + switch(event.item->getId()) { + case MI_GFX_RETURN: + runMenu(&videoMenu, &extendedMenuArea, true); + break; + default: break; + } + } + + // draw the extended background for all option screens + backgroundArea.draw(BKGD_OPTIONS_TOP, 0, 0); + backgroundArea.draw(BKGD_OPTIONS_BTM, 0, 120); +} + +void IntroController::updateSoundMenu(MenuEvent &event) { + if (event.type == MenuEvent::ACTIVATE || + event.type == MenuEvent::INCREMENT || + event.type == MenuEvent::DECREMENT) { + + switch(event.item->getId()) { + case MI_SOUND_01: + musicSetVolume(settingsChanged.musicVol); + break; + case MI_SOUND_02: + soundSetVolume(settingsChanged.soundVol); + soundPlay(SOUND_FLEE); + break; + case USE_SETTINGS: + // save settings + xu4.settings->setData(settingsChanged); + xu4.settings->write(); + musicPlay(introMusic); + break; + case CANCEL: + musicSetVolume(xu4.settings->musicVol); + soundSetVolume(xu4.settings->soundVol); + // discard settings + settingsChanged = *xu4.settings; + break; + default: break; + } + } + + // draw the extended background for all option screens + backgroundArea.draw(BKGD_OPTIONS_TOP, 0, 0); + backgroundArea.draw(BKGD_OPTIONS_BTM, 0, 120); +} + +void IntroController::updateInputMenu(MenuEvent &event) { + if (event.type == MenuEvent::ACTIVATE || + event.type == MenuEvent::INCREMENT || + event.type == MenuEvent::DECREMENT) { + + switch(event.item->getId()) { + case USE_SETTINGS: + // save settings + xu4.settings->setData(settingsChanged); + xu4.settings->write(); + + // re-initialize keyboard + EventHandler::setKeyRepeat(settingsChanged.keydelay, settingsChanged.keyinterval); +#ifndef IOS + screenShowMouseCursor(xu4.settings->mouseOptions.enabled); +#endif + break; + case CANCEL: + // discard settings + settingsChanged = *xu4.settings; + break; + default: break; + } + } + + // draw the extended background for all option screens + backgroundArea.draw(BKGD_OPTIONS_TOP, 0, 0); + backgroundArea.draw(BKGD_OPTIONS_BTM, 0, 120); + + // after drawing the menu, extra menu text can be added here + extendedMenuArea.textAt(0, 5, "Mouse Options:"); +} + +void IntroController::updateSpeedMenu(MenuEvent &event) { + if (event.type == MenuEvent::ACTIVATE || + event.type == MenuEvent::INCREMENT || + event.type == MenuEvent::DECREMENT) { + + switch(event.item->getId()) { + case USE_SETTINGS: + // save settings + xu4.settings->setData(settingsChanged); + xu4.settings->write(); + + // re-initialize events + xu4.eventHandler->setTimerInterval(1000 / + xu4.settings->gameCyclesPerSecond); + break; + case CANCEL: + // discard settings + settingsChanged = *xu4.settings; + break; + default: break; + } + } + + // draw the extended background for all option screens + backgroundArea.draw(BKGD_OPTIONS_TOP, 0, 0); + backgroundArea.draw(BKGD_OPTIONS_BTM, 0, 120); +} + +void IntroController::updateGameplayMenu(MenuEvent &event) { + if (event.type == MenuEvent::ACTIVATE || + event.type == MenuEvent::INCREMENT || + event.type == MenuEvent::DECREMENT) { + + switch(event.item->getId()) { + case USE_SETTINGS: + // save settings + xu4.settings->setData(settingsChanged); + xu4.settings->write(); + break; + case CANCEL: + // discard settings + settingsChanged = *xu4.settings; + break; + default: break; + } + } + + // draw the extended background for all option screens + backgroundArea.draw(BKGD_OPTIONS_TOP, 0, 0); + backgroundArea.draw(BKGD_OPTIONS_BTM, 0, 120); +} + +void IntroController::updateInterfaceMenu(MenuEvent &event) { + if (event.type == MenuEvent::ACTIVATE || + event.type == MenuEvent::INCREMENT || + event.type == MenuEvent::DECREMENT) { + + switch(event.item->getId()) { + case USE_SETTINGS: + // save settings + xu4.settings->setData(settingsChanged); + xu4.settings->write(); + break; + case CANCEL: + // discard settings + settingsChanged = *xu4.settings; + break; + default: break; + } + } + + // draw the extended background for all option screens + backgroundArea.draw(BKGD_OPTIONS_TOP, 0, 0); + backgroundArea.draw(BKGD_OPTIONS_BTM, 0, 120); + + // after drawing the menu, extra menu text can be added here + extendedMenuArea.textAt(2, 3, " (Open, Jimmy, etc.)"); +} + +/** * Initializes the question tree. The tree starts off with the first * eight entries set to the numbers 0-7 in a random order. */