diff options
Diffstat (limited to 'engines/xeen/dialogs/dialogs_control_panel.cpp')
-rw-r--r-- | engines/xeen/dialogs/dialogs_control_panel.cpp | 220 |
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 |