aboutsummaryrefslogtreecommitdiff
path: root/engines/xeen/dialogs/dialogs_control_panel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/xeen/dialogs/dialogs_control_panel.cpp')
-rw-r--r--engines/xeen/dialogs/dialogs_control_panel.cpp220
1 files changed, 220 insertions, 0 deletions
diff --git a/engines/xeen/dialogs/dialogs_control_panel.cpp b/engines/xeen/dialogs/dialogs_control_panel.cpp
new file mode 100644
index 0000000000..9c933b30a3
--- /dev/null
+++ b/engines/xeen/dialogs/dialogs_control_panel.cpp
@@ -0,0 +1,220 @@
+/* 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 2
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "xeen/dialogs/dialogs_control_panel.h"
+#include "xeen/dialogs/dialogs_query.h"
+#include "xeen/party.h"
+#include "xeen/resources.h"
+#include "xeen/xeen.h"
+
+namespace Xeen {
+
+int ControlPanel::show(XeenEngine *vm) {
+ ControlPanel *dlg = new ControlPanel(vm);
+ int result = dlg->execute();
+ delete dlg;
+
+ return result;
+}
+
+int ControlPanel::execute() {
+ EventsManager &events = *_vm->_events;
+ Interface &intf = *_vm->_interface;
+ Map &map = *_vm->_map;
+ Party &party = *_vm->_party;
+ SavesManager &saves = *_vm->_saves;
+ Sound &sound = *_vm->_sound;
+ Windows &windows = *_vm->_windows;
+ Window &w = windows[23];
+ Window &w3 = windows[3];
+
+ loadButtons();
+
+ int result = 0, debugCtr = 0;
+ w.open();
+
+ do {
+ Common::String btnText = getButtonText();
+ Common::String text = Common::String::format(Res.CONTROL_PANEL_TEXT, btnText.c_str());
+
+ drawButtons(&w);
+ w.writeString(text);
+ w.writeString("\xB""000\t000\x1");
+ w.update();
+
+ do {
+ events.updateGameCounter();
+ intf.draw3d(false, false);
+ w.writeString("\r");
+ drawButtons(&w);
+ w.writeString(text);
+ w.writeString("\v000\t000");
+ w.frame();
+
+ if (_debugFlag)
+ w.writeString(getTimeText());
+
+ w3.update();
+ w.update();
+
+ events.pollEventsAndWait();
+ checkEvents(_vm);
+ if (_vm->shouldExit())
+ return 0;
+ } while (!_buttonValue && !events.timeElapsed());
+
+ switch (_buttonValue) {
+ case Common::KEYCODE_q:
+ if (Confirm::show(g_vm, Res.CONFIRM_QUIT)) {
+ g_vm->_gameMode = GMODE_QUIT;
+ result = 1;
+ }
+ break;
+
+ case Common::KEYCODE_w:
+ if (Confirm::show(g_vm, Res.MR_WIZARD)) {
+ w.close();
+ if (!windows[2]._enabled) {
+ sound.playFX(51);
+
+ if (g_vm->getGameID() == GType_WorldOfXeen) {
+ map._loadDarkSide = false;
+ map.load(28);
+ party._mazeDirection = DIR_EAST;
+ } else {
+ map._loadDarkSide = true;
+ map.load(29);
+ party._mazeDirection = DIR_SOUTH;
+ }
+ party.moveToRunLocation();
+ }
+
+ party._gems = 0;
+ result = 2;
+ }
+ break;
+
+ case Common::KEYCODE_l:
+ if (_vm->_mode == MODE_COMBAT) {
+ ErrorScroll::show(_vm, Res.NO_LOADING_IN_COMBAT);
+ } else {
+ // Close dialog and show loading dialog
+ result = 3;
+ }
+ break;
+
+ case Common::KEYCODE_s:
+ if (_vm->_mode == MODE_COMBAT) {
+ ErrorScroll::show(_vm, Res.NO_SAVING_IN_COMBAT);
+ } else {
+ // Close dialog and show saving dialog
+ result = 4;
+ }
+ break;
+
+ case Common::KEYCODE_e:
+ sound.setEffectsOn(!sound._soundOn);
+ break;
+
+ case Common::KEYCODE_m:
+ sound.setMusicOn(!sound._musicOn);
+ break;
+
+ case Common::KEYCODE_ESCAPE:
+ result = 1;
+ break;
+
+ // Goober cheat sequence
+ case Common::KEYCODE_g:
+ debugCtr = 1;
+ break;
+ case Common::KEYCODE_o:
+ debugCtr = (debugCtr == 1 || debugCtr == 2) ? 2 : 0;
+ break;
+ case Common::KEYCODE_b:
+ debugCtr = (debugCtr == 2) ? 3 : 0;
+ break;
+ case Common::KEYCODE_r:
+ if (debugCtr == 3)
+ _debugFlag = true;
+ else
+ debugCtr = 0;
+ break;
+
+ default:
+ break;
+ }
+ } while (!result);
+
+ w.close();
+ intf.drawParty(true);
+
+ if (result == 3) {
+ saves.loadGame();
+ } else if (result == 4) {
+ saves.saveGame();
+ }
+
+ return result;
+}
+
+void ControlPanel::loadButtons() {
+ _iconSprites.load("cpanel.icn");
+
+ addButton(Common::Rect(214, 56, 244, 69), Common::KEYCODE_e, 0, &_iconSprites);
+ addButton(Common::Rect(214, 75, 244, 88), Common::KEYCODE_m, 0, &_iconSprites);
+ addButton(Common::Rect(135, 56, 165, 69), Common::KEYCODE_l, 0, &_iconSprites);
+ addButton(Common::Rect(135, 75, 165, 88), Common::KEYCODE_s, 0, &_iconSprites);
+
+ // For ScummVM we've merged both Save and Save As into a single
+ // save item, so we don't need this one
+ addButton(Common::Rect(), 0);
+
+ addButton(Common::Rect(135, 94, 165, 107), Common::KEYCODE_q, 0, &_iconSprites);
+ addButton(Common::Rect(175, 113, 205, 126), Common::KEYCODE_w, 0, &_iconSprites);
+}
+
+Common::String ControlPanel::getButtonText() {
+ Sound &sound = *g_vm->_sound;
+ _btnSoundText = sound._soundOn ? Res.ON : Res.OFF;
+ _btnMusicText = sound._musicOn ? Res.ON : Res.OFF;
+
+ return Common::String::format(Res.CONTROL_PANEL_BUTTONS,
+ _btnSoundText.c_str(), _btnMusicText.c_str());
+}
+
+Common::String ControlPanel::getTimeText() const {
+ TimeDate td;
+ g_system->getTimeAndDate(td);
+ Common::String timeStr = Common::String::format("%d:%.2d:%.2d%c",
+ td.tm_hour == 0 || td.tm_hour == 12 ? 12 : (td.tm_hour % 12),
+ td.tm_min, td.tm_sec, (td.tm_hour >= 12) ? 'p' : 'c');
+
+ uint32 playtime = g_vm->_events->playTime() / GAME_FRAME_RATE;
+ Common::String playtimeStr = Common::String::format("%d:%.2d:%.2d",
+ playtime / 3600, (playtime / 60) % 60, playtime % 60);
+ return Common::String::format(
+ "\x2\x3l\xB""000\t000\x4""160%s\x3r\xB""000\t000%s\x1",
+ timeStr.c_str(), playtimeStr.c_str());
+}
+
+} // End of namespace Xeen