Initial commit
This commit is contained in:
324
engines/pink/gui.cpp
Normal file
324
engines/pink/gui.cpp
Normal file
@@ -0,0 +1,324 @@
|
||||
/* ScummVM - Graphic Adventure Engine
|
||||
*
|
||||
* ScummVM is the legal property of its developers, whose names
|
||||
* are too numerous to list here. Please refer to the COPYRIGHT
|
||||
* file distributed with this source distribution.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "common/config-manager.h"
|
||||
#include "common/translation.h"
|
||||
|
||||
#include "engines/metaengine.h"
|
||||
|
||||
#include "graphics/macgui/macwindowmanager.h"
|
||||
#include "graphics/macgui/macmenu.h"
|
||||
|
||||
#include "gui/message.h"
|
||||
|
||||
#include "pink/pink.h"
|
||||
#include "pink/screen.h"
|
||||
#include "pink/objects/actors/lead_actor.h"
|
||||
|
||||
namespace Pink {
|
||||
|
||||
enum {
|
||||
kNewGameAction = 57600,
|
||||
kLoadSave = 57601,
|
||||
kSaveAction = 57603,
|
||||
kSaveAsAction = 57604,
|
||||
kSongsAction = 32865,
|
||||
kSoundSettingsAction = 32772,
|
||||
kLastSavesAction = 57616,
|
||||
kPauseAction = 32854,
|
||||
kExitAction = 57665
|
||||
};
|
||||
|
||||
enum {
|
||||
kShowContent = 32771,
|
||||
kShowGreece = 32866,
|
||||
kShowIndonesia = 32867,
|
||||
kShowIsrael = 32868,
|
||||
kShowKenya = 32869,
|
||||
kShowRussia = 32870
|
||||
};
|
||||
|
||||
enum {
|
||||
kShowPDAAction = 32793,
|
||||
|
||||
kShowAustraliaArt = 32796,
|
||||
kShowAustraliaCloth = 32797,
|
||||
kShowAustraliaFood = 32798,
|
||||
kShowAustraliaHistory = 32799,
|
||||
kShowAustraliaNature = 32800,
|
||||
kShowAustraliaPeople = 32801,
|
||||
kShowAustraliaPlaces = 32802,
|
||||
kShowAustraliaReligion = 32803,
|
||||
|
||||
kShowBhutanArt = 32804,
|
||||
kShowBhutanCloth = 32805,
|
||||
kShowBhutanFood = 32806,
|
||||
kShowBhutanHistory = 32807,
|
||||
kShowBhutanNature = 32808,
|
||||
kShowBhutanPeople = 32809,
|
||||
kShowBhutanPlaces = 32810,
|
||||
kShowBhutanReligion = 32811,
|
||||
|
||||
kShowChinaArt = 32812,
|
||||
kShowChinaCloth = 32813,
|
||||
kShowChinaFood = 32814,
|
||||
kShowChinaHistory = 32815,
|
||||
kShowChinaNature = 32816,
|
||||
kShowChinaPeople = 32817,
|
||||
kShowChinaPlaces = 32818,
|
||||
kShowChinaReligion = 32819,
|
||||
|
||||
kShowEnglandArt = 32820,
|
||||
kShowEnglandCloth = 32821,
|
||||
kShowEnglandFood = 32822,
|
||||
kShowEnglandHistory = 32823,
|
||||
kShowEnglandNature = 32824,
|
||||
kShowEnglandPeople = 32825,
|
||||
kShowEnglandPlaces = 32826,
|
||||
kShowEnglandReligion = 32827,
|
||||
|
||||
kShowEgyptArt = 32828,
|
||||
kShowEgyptCloth = 32829,
|
||||
kShowEgyptFood = 32830,
|
||||
kShowEgyptHistory = 32831,
|
||||
kShowEgyptNature = 32832,
|
||||
kShowEgyptPeople = 32833,
|
||||
kShowEgyptPlaces = 32834,
|
||||
kShowEgyptReligion = 32835,
|
||||
|
||||
kShowIndiaArt = 32836,
|
||||
kShowIndiaCloth = 32837,
|
||||
kShowIndiaFood = 32838,
|
||||
kShowIndiaHistory = 32839,
|
||||
kShowIndiaNature = 32840,
|
||||
kShowIndiaPeople = 32841,
|
||||
kShowIndiaPlaces = 32842,
|
||||
kShowIndiaReligion = 32843
|
||||
};
|
||||
|
||||
enum {
|
||||
kShowGameWebPage = 32844,
|
||||
kShowTechSupport = 32778,
|
||||
kShowOnlineHints = 32777,
|
||||
kShowWanderLustWebPage = 32775,
|
||||
kShowHelp = 32846,
|
||||
kShowHints = 32847,
|
||||
|
||||
kShowWinnnerPage = 32779,
|
||||
kShowWanderlustInteractive = 32849,
|
||||
kShowMGM = 32848,
|
||||
kShowDiagnostics = 32850,
|
||||
kShowAbout = 57664
|
||||
};
|
||||
|
||||
enum {
|
||||
kRecentSaveId = 9,
|
||||
kRecentSavesOffset = 400000
|
||||
};
|
||||
|
||||
static const int kMaxSaves = 10;
|
||||
|
||||
static void menuCommandsCallback(int action, Common::U32String &, void *data) {
|
||||
PinkEngine *engine = (PinkEngine *)data;
|
||||
|
||||
engine->executeMenuCommand(action);
|
||||
}
|
||||
|
||||
struct SaveStateDescriptorTimeComparator {
|
||||
bool operator()(const SaveStateDescriptor &x, const SaveStateDescriptor &y) const {
|
||||
return x.getSaveDate() == y.getSaveDate() ? x.getSaveTime() > y.getSaveTime() : x.getSaveDate() > y.getSaveDate();
|
||||
}
|
||||
};
|
||||
|
||||
SaveStateList PinkEngine::listSaves() const {
|
||||
Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
|
||||
Common::String pattern = getMetaEngine()->getSavegameFile(kSavegameFilePattern, _targetName.c_str());
|
||||
Common::StringArray filenames = saveFileMan->listSavefiles(pattern);
|
||||
|
||||
SaveStateList saveList;
|
||||
for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
|
||||
// Obtain the last 2 digits of the filename, since they correspond to the save slot
|
||||
int slotNum = atoi(file->c_str() + file->size() - 2);
|
||||
Common::ScopedPtr<Common::InSaveFile> in(saveFileMan->openForLoading(*file));
|
||||
if (in) {
|
||||
SaveStateDescriptor desc;
|
||||
desc.setSaveSlot(slotNum);
|
||||
if (Pink::readSaveHeader(*in.get(), desc))
|
||||
saveList.push_back(desc);
|
||||
}
|
||||
}
|
||||
|
||||
// Sort saves based on save time.
|
||||
Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorTimeComparator());
|
||||
return saveList;
|
||||
}
|
||||
|
||||
void PinkEngine::initMenu() {
|
||||
_screen->getWndManager().setEngine(this);
|
||||
|
||||
_menu = Graphics::MacMenu::createMenuFromPEexe(_exeResources, &_screen->getWndManager());
|
||||
if (getLanguage() == Common::HE_ISR) {
|
||||
_menu->setAlignment(Graphics::kTextAlignRight);
|
||||
}
|
||||
|
||||
Graphics::MacMenuSubMenu *subMenu = _menu->getSubmenu(nullptr, 0);
|
||||
if (subMenu) {
|
||||
|
||||
if (isPerilDemo()) {
|
||||
// From the first submenu ("Game"), disable the (zero indexed) item 5 ("Songs").
|
||||
// Use setEnabled() rather than removeMenuItem() since the latter removes the item
|
||||
// out of the list changing the index for the items that follow.
|
||||
// The effect is that "Songs" will be greyed out for the demo, since it's not available for it.
|
||||
// The original demo does not have the "Songs" item in the menu at all.
|
||||
_menu->setEnabled( _menu->getSubMenuItem(_menu->getMenuItem(0), 5), false);
|
||||
}
|
||||
|
||||
SaveStateList saves = listSaves();
|
||||
if (!saves.empty()) {
|
||||
_menu->removeMenuItem(subMenu, kRecentSaveId);
|
||||
int maxSaves = saves.size() > kMaxSaves ? kMaxSaves : saves.size();
|
||||
for (int i = 0; i < maxSaves; ++i) {
|
||||
_menu->insertMenuItem(subMenu, Common::U32String::format("%i. %S", i + 1, saves[i].getDescription().c_str()),
|
||||
kRecentSaveId + i, saves[i].getSaveSlot() + kRecentSavesOffset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_menu->calcDimensions();
|
||||
_menu->setCommandsCallback(&menuCommandsCallback, this);
|
||||
}
|
||||
|
||||
void PinkEngine::executeMenuCommand(uint id) {
|
||||
if (executePageChangeCommand(id))
|
||||
return;
|
||||
|
||||
if (id >= kRecentSavesOffset) {
|
||||
int slotNum = id - kRecentSavesOffset;
|
||||
Common::Error loadError = loadGameState(slotNum);
|
||||
if (loadError.getCode() != Common::kNoError) {
|
||||
GUI::MessageDialog errorDialog(loadError.getDesc());
|
||||
errorDialog.runModal();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
switch (id) {
|
||||
case kNewGameAction: {
|
||||
initModule(_modules[0]->getName(), "", nullptr);
|
||||
break;
|
||||
}
|
||||
case kLoadSave:
|
||||
loadGameDialog();
|
||||
break;
|
||||
|
||||
case kSaveAction:
|
||||
case kSaveAsAction:
|
||||
saveGameDialog();
|
||||
break;
|
||||
|
||||
case kSoundSettingsAction:
|
||||
case kLastSavesAction:
|
||||
case kPauseAction:
|
||||
case kExitAction:
|
||||
openMainMenuDialog();
|
||||
break;
|
||||
|
||||
case kSongsAction:
|
||||
initModule("Muzik", "", nullptr);
|
||||
break;
|
||||
|
||||
case kShowPDAAction:
|
||||
_actor->loadPDA(kNavigatePage);
|
||||
break;
|
||||
|
||||
// Cases kShowAustraliaArt - kShowIndiaReligion are handled in executePageChangeCommand()
|
||||
|
||||
case kShowContent:
|
||||
_actor->loadPDA("TOC");
|
||||
break;
|
||||
case kShowGreece:
|
||||
_actor->loadPDA("GREOVER");
|
||||
break;
|
||||
case kShowIndonesia:
|
||||
_actor->loadPDA("INDOVER");
|
||||
break;
|
||||
case kShowIsrael:
|
||||
_actor->loadPDA("ISROVER");
|
||||
break;
|
||||
case kShowKenya:
|
||||
_actor->loadPDA("KENOVER");
|
||||
break;
|
||||
case kShowRussia:
|
||||
_actor->loadPDA("SIBOVER");
|
||||
break;
|
||||
|
||||
case kShowGameWebPage:
|
||||
openLocalWebPage("PINK.HTM");
|
||||
break;
|
||||
case kShowTechSupport:
|
||||
openLocalWebPage("SUPPORT.HTM");
|
||||
break;
|
||||
case kShowWinnnerPage:
|
||||
openLocalWebPage("WINNER.HTM");
|
||||
break;
|
||||
case kShowWanderLustWebPage:
|
||||
openLocalWebPage("LUST.HTM");
|
||||
break;
|
||||
case kShowOnlineHints:
|
||||
openLocalWebPage("HINTS.HTM");
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
GUI::MessageDialog dialog(_("This menu item is not yet implemented"));
|
||||
dialog.runModal();
|
||||
warning("Unprocessed command id %d", id);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Australia, Bhutan, China, Britain, Egypt, India
|
||||
static const char *pageChangePrefixes[] = { "AUS", "BHU", "CHI", "BRI", "EGY", "IND" };
|
||||
// Art, Cloth, Food, History, Nature, People, Places, Religion
|
||||
static const char *pageChangeSuffixes[] = { "ART", "CLO", "FOO", "HIS", "NAT", "PEO", "PLA", "REL" };
|
||||
|
||||
bool PinkEngine::executePageChangeCommand(uint id) {
|
||||
if (id >= kShowAustraliaArt && id <= kShowIndiaReligion) {
|
||||
Common::String prefix = pageChangePrefixes[(id - kShowAustraliaArt) / 8];
|
||||
Common::String suffix = pageChangeSuffixes[(id - kShowAustraliaArt) % 8];
|
||||
_actor->loadPDA(prefix + suffix);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void PinkEngine::openLocalWebPage(const Common::String &pageName) const {
|
||||
Common::FSNode gameFolder = Common::FSNode(ConfMan.getPath("path"));
|
||||
Common::FSNode filePath = gameFolder.getChild("INSTALL").getChild(pageName);
|
||||
if (filePath.exists()) {
|
||||
Common::String fullUrl = Common::String::format("file:///%s", filePath.getPath().toString('/').c_str());
|
||||
_system->openUrl(fullUrl);
|
||||
}
|
||||
}
|
||||
|
||||
} // End of namespace Pink
|
||||
Reference in New Issue
Block a user