2007-05-30 21:56:52 +00:00
|
|
|
/* 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.
|
2004-04-09 12:36:06 +00:00
|
|
|
*
|
|
|
|
* 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
|
2004-10-15 06:06:47 +00:00
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2004-04-09 12:36:06 +00:00
|
|
|
* 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
|
2005-10-18 01:30:26 +00:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2004-04-09 12:36:06 +00:00
|
|
|
*
|
2006-02-09 12:19:53 +00:00
|
|
|
* $URL$
|
|
|
|
* $Id$
|
2004-04-09 12:36:06 +00:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "common/config-manager.h"
|
2005-08-19 22:12:09 +00:00
|
|
|
|
2004-11-11 13:37:35 +00:00
|
|
|
#include "sound/mididrv.h"
|
2007-07-29 16:31:29 +00:00
|
|
|
#include "sound/mixer.h"
|
2006-01-04 07:39:16 +00:00
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
#include "kyra/kyra_v1.h"
|
2007-07-29 16:31:29 +00:00
|
|
|
#include "kyra/sound.h"
|
2005-06-24 16:01:42 +00:00
|
|
|
#include "kyra/resource.h"
|
2005-08-19 22:12:09 +00:00
|
|
|
#include "kyra/screen.h"
|
2006-01-02 22:58:59 +00:00
|
|
|
#include "kyra/text.h"
|
2007-07-29 16:33:11 +00:00
|
|
|
#include "kyra/timer.h"
|
|
|
|
#include "kyra/script.h"
|
2008-05-06 20:50:27 +00:00
|
|
|
#include "kyra/debugger.h"
|
2005-08-19 22:12:09 +00:00
|
|
|
|
2006-04-08 11:21:04 +00:00
|
|
|
namespace Kyra {
|
2004-10-15 06:06:47 +00:00
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
KyraEngine_v1::KyraEngine_v1(OSystem *system, const GameFlags &flags)
|
2008-04-29 14:22:04 +00:00
|
|
|
: Engine(system), _flags(flags) {
|
2006-04-27 00:39:10 +00:00
|
|
|
_res = 0;
|
|
|
|
_sound = 0;
|
|
|
|
_text = 0;
|
2007-07-29 16:31:29 +00:00
|
|
|
_staticres = 0;
|
2007-07-29 16:33:11 +00:00
|
|
|
_timer = 0;
|
2008-04-29 15:12:09 +00:00
|
|
|
_emc = 0;
|
2008-05-06 20:50:27 +00:00
|
|
|
_debugger = 0;
|
2007-09-19 08:40:12 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
_gameSpeed = 60;
|
|
|
|
_tickLength = (uint8)(1000.0 / _gameSpeed);
|
2007-09-19 08:40:12 +00:00
|
|
|
|
2008-03-21 16:18:27 +00:00
|
|
|
_speechFile = "";
|
2007-10-10 09:06:15 +00:00
|
|
|
_trackMap = 0;
|
|
|
|
_trackMapSize = 0;
|
|
|
|
_lastMusicCommand = -1;
|
|
|
|
_curSfxFile = _curMusicTheme = -1;
|
|
|
|
|
2008-03-28 00:53:54 +00:00
|
|
|
_gameToLoad = -1;
|
|
|
|
|
2008-05-12 12:42:10 +00:00
|
|
|
_mouseState = -1;
|
2008-05-12 12:57:42 +00:00
|
|
|
_deathHandler = -1;
|
2008-05-12 12:42:10 +00:00
|
|
|
|
2007-07-29 16:31:29 +00:00
|
|
|
memset(_flagsTable, 0, sizeof(_flagsTable));
|
2007-06-08 23:04:13 +00:00
|
|
|
|
2008-11-03 19:51:34 +00:00
|
|
|
_isSaveAllowed = false;
|
|
|
|
|
2008-12-25 03:00:24 +00:00
|
|
|
_mouseX = _mouseY = 0;
|
|
|
|
|
2006-11-13 12:00:36 +00:00
|
|
|
// sets up all engine specific debug levels
|
2009-01-30 05:10:24 +00:00
|
|
|
Common::addDebugChannel(kDebugLevelScriptFuncs, "ScriptFuncs", "Script function debug level");
|
|
|
|
Common::addDebugChannel(kDebugLevelScript, "Script", "Script interpreter debug level");
|
|
|
|
Common::addDebugChannel(kDebugLevelSprites, "Sprites", "Sprite debug level");
|
|
|
|
Common::addDebugChannel(kDebugLevelScreen, "Screen", "Screen debug level");
|
|
|
|
Common::addDebugChannel(kDebugLevelSound, "Sound", "Sound debug level");
|
|
|
|
Common::addDebugChannel(kDebugLevelAnimator, "Animator", "Animator debug level");
|
|
|
|
Common::addDebugChannel(kDebugLevelMain, "Main", "Generic debug level");
|
|
|
|
Common::addDebugChannel(kDebugLevelGUI, "GUI", "GUI debug level");
|
|
|
|
Common::addDebugChannel(kDebugLevelSequence, "Sequence", "Sequence debug level");
|
|
|
|
Common::addDebugChannel(kDebugLevelMovie, "Movie", "Movie debug level");
|
|
|
|
Common::addDebugChannel(kDebugLevelTimer, "Timer", "Timer debug level");
|
2007-09-19 13:55:05 +00:00
|
|
|
|
|
|
|
system->getEventManager()->registerRandomSource(_rnd, "kyra");
|
2006-04-27 00:39:10 +00:00
|
|
|
}
|
2004-04-09 12:36:06 +00:00
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
::GUI::Debugger *KyraEngine_v1::getDebugger() {
|
2008-05-06 20:50:27 +00:00
|
|
|
return _debugger;
|
|
|
|
}
|
|
|
|
|
2008-05-23 13:37:56 +00:00
|
|
|
void KyraEngine_v1::pauseEngineIntern(bool pause) {
|
|
|
|
Engine::pauseEngineIntern(pause);
|
|
|
|
_timer->pause(pause);
|
|
|
|
}
|
|
|
|
|
2008-11-06 17:05:54 +00:00
|
|
|
Common::Error KyraEngine_v1::init() {
|
2008-01-27 15:53:09 +00:00
|
|
|
registerDefaultSettings();
|
|
|
|
|
2006-04-27 00:39:10 +00:00
|
|
|
// Setup mixer
|
|
|
|
_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume"));
|
|
|
|
_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
|
|
|
|
_mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, ConfMan.getInt("speech_volume"));
|
2007-09-19 08:40:12 +00:00
|
|
|
|
2008-04-29 14:22:04 +00:00
|
|
|
if (!_flags.useDigSound) {
|
2009-05-17 22:12:36 +00:00
|
|
|
// We prefer AdLib over MIDI, since generally AdLib is better supported
|
|
|
|
int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB);
|
2008-04-29 14:22:04 +00:00
|
|
|
|
2008-06-26 19:42:59 +00:00
|
|
|
if (_flags.platform == Common::kPlatformFMTowns) {
|
2008-04-29 14:22:04 +00:00
|
|
|
if (_flags.gameID == GI_KYRA1)
|
|
|
|
_sound = new SoundTowns(this, _mixer);
|
|
|
|
else
|
2008-06-26 19:42:59 +00:00
|
|
|
_sound = new SoundTownsPC98_v2(this, _mixer);
|
|
|
|
} else if (_flags.platform == Common::kPlatformPC98) {
|
|
|
|
if (_flags.gameID == GI_KYRA1)
|
2008-08-02 23:11:31 +00:00
|
|
|
_sound = new SoundPC98(this, _mixer);
|
2008-06-26 19:42:59 +00:00
|
|
|
else
|
|
|
|
_sound = new SoundTownsPC98_v2(this, _mixer);
|
2008-04-29 14:22:04 +00:00
|
|
|
} else if (midiDriver == MD_ADLIB) {
|
|
|
|
_sound = new SoundAdlibPC(this, _mixer);
|
2006-03-28 15:15:36 +00:00
|
|
|
assert(_sound);
|
2008-04-29 14:22:04 +00:00
|
|
|
} else {
|
|
|
|
bool native_mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32"));
|
|
|
|
|
|
|
|
MidiDriver *driver = MidiDriver::createMidi(midiDriver);
|
|
|
|
assert(driver);
|
|
|
|
if (native_mt32)
|
|
|
|
driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
|
|
|
|
|
|
|
|
SoundMidiPC *soundMidiPc = new SoundMidiPC(this, _mixer, driver);
|
|
|
|
_sound = soundMidiPc;
|
|
|
|
assert(_sound);
|
|
|
|
soundMidiPc->hasNativeMT32(native_mt32);
|
|
|
|
|
|
|
|
// Unlike some SCUMM games, it's not that the MIDI sounds are
|
|
|
|
// missing. It's just that at least at the time of writing they
|
|
|
|
// are decidedly inferior to the Adlib ones.
|
|
|
|
if (ConfMan.getBool("multi_midi")) {
|
|
|
|
SoundAdlibPC *adlib = new SoundAdlibPC(this, _mixer);
|
|
|
|
assert(adlib);
|
|
|
|
|
|
|
|
_sound = new MixedSoundDriver(this, _mixer, soundMidiPc, adlib);
|
|
|
|
assert(_sound);
|
|
|
|
}
|
2006-03-28 15:15:36 +00:00
|
|
|
}
|
2006-02-27 22:39:55 +00:00
|
|
|
}
|
2007-01-29 18:15:14 +00:00
|
|
|
|
2008-04-04 18:09:19 +00:00
|
|
|
if (_sound)
|
|
|
|
_sound->updateVolumeSettings();
|
2008-04-29 14:22:04 +00:00
|
|
|
|
2006-07-08 12:23:44 +00:00
|
|
|
_res = new Resource(this);
|
|
|
|
assert(_res);
|
2007-10-09 05:40:20 +00:00
|
|
|
_res->reset();
|
2008-08-02 23:11:31 +00:00
|
|
|
|
|
|
|
if (_flags.isDemo) {
|
|
|
|
// HACK: check whether this is the HOF demo or the LOL demo.
|
|
|
|
// The LOL demo needs to be detected and run as KyraEngine_HoF,
|
|
|
|
// but the static resource loader and the sequence player will
|
|
|
|
// need correct IDs.
|
|
|
|
if (_res->exists("scene1.cps"))
|
2009-03-04 00:45:34 +00:00
|
|
|
#ifdef ENABLE_LOL
|
2008-08-02 23:11:31 +00:00
|
|
|
_flags.gameID = GI_LOL;
|
2009-03-04 00:45:34 +00:00
|
|
|
#else
|
|
|
|
error("Lands of Lore demo is not supported in this build.");
|
|
|
|
#endif // !ENABLE_LOL
|
2008-08-02 23:11:31 +00:00
|
|
|
}
|
|
|
|
|
2006-03-18 14:43:18 +00:00
|
|
|
_staticres = new StaticResource(this);
|
|
|
|
assert(_staticres);
|
2006-05-19 07:34:24 +00:00
|
|
|
if (!_staticres->init())
|
|
|
|
error("_staticres->init() failed");
|
2008-04-06 14:41:25 +00:00
|
|
|
if (!screen()->init())
|
|
|
|
error("screen()->init() failed");
|
2007-07-29 16:33:11 +00:00
|
|
|
_timer = new TimerManager(this, _system);
|
|
|
|
assert(_timer);
|
2008-01-27 15:56:56 +00:00
|
|
|
setupTimers();
|
2008-04-29 15:12:09 +00:00
|
|
|
_emc = new EMCInterpreter(this);
|
|
|
|
assert(_emc);
|
2007-09-19 08:40:12 +00:00
|
|
|
|
2007-07-29 16:33:11 +00:00
|
|
|
setupOpcodeTable();
|
2008-01-27 15:56:56 +00:00
|
|
|
readSettings();
|
2006-02-09 12:19:53 +00:00
|
|
|
|
2008-03-28 00:53:54 +00:00
|
|
|
if (ConfMan.hasKey("save_slot")) {
|
|
|
|
_gameToLoad = ConfMan.getInt("save_slot");
|
|
|
|
if (!saveFileLoadable(_gameToLoad))
|
|
|
|
_gameToLoad = -1;
|
|
|
|
}
|
2008-09-14 19:48:40 +00:00
|
|
|
|
|
|
|
// Prevent autosave on game startup
|
|
|
|
_lastAutosave = _system->getMillis();
|
2008-03-28 00:53:54 +00:00
|
|
|
|
2008-11-06 17:05:54 +00:00
|
|
|
return Common::kNoError;
|
2004-04-09 12:36:06 +00:00
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
KyraEngine_v1::~KyraEngine_v1() {
|
2008-04-20 15:16:58 +00:00
|
|
|
for (Common::Array<const Opcode*>::iterator i = _opcodes.begin(); i != _opcodes.end(); ++i)
|
|
|
|
delete *i;
|
|
|
|
_opcodes.clear();
|
|
|
|
|
2005-08-19 22:12:09 +00:00
|
|
|
delete _res;
|
2008-04-06 15:35:30 +00:00
|
|
|
delete _staticres;
|
2006-01-13 23:06:04 +00:00
|
|
|
delete _sound;
|
2006-01-02 22:58:59 +00:00
|
|
|
delete _text;
|
2007-07-29 16:33:11 +00:00
|
|
|
delete _timer;
|
2008-04-29 15:12:09 +00:00
|
|
|
delete _emc;
|
2008-05-06 20:50:27 +00:00
|
|
|
delete _debugger;
|
2006-02-09 12:19:53 +00:00
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
Common::Point KyraEngine_v1::getMousePos() const {
|
2007-04-01 17:36:13 +00:00
|
|
|
Common::Point mouse = _eventMan->getMousePos();
|
2007-07-29 16:31:29 +00:00
|
|
|
|
2007-03-18 18:27:52 +00:00
|
|
|
if (_flags.useHiResOverlay) {
|
|
|
|
mouse.x >>= 1;
|
|
|
|
mouse.y >>= 1;
|
|
|
|
}
|
2007-04-15 16:41:20 +00:00
|
|
|
|
2007-07-29 16:31:29 +00:00
|
|
|
return mouse;
|
2005-12-08 17:19:18 +00:00
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
void KyraEngine_v1::setMousePos(int x, int y) {
|
2008-03-16 02:00:14 +00:00
|
|
|
if (_flags.useHiResOverlay) {
|
|
|
|
x <<= 1;
|
|
|
|
y <<= 1;
|
|
|
|
}
|
|
|
|
_system->warpMouse(x, y);
|
|
|
|
}
|
|
|
|
|
2008-12-16 17:40:34 +00:00
|
|
|
int KyraEngine_v1::checkInput(Button *buttonList, bool mainLoop) {
|
|
|
|
debugC(9, kDebugLevelMain, "KyraEngine_v1::checkInput(%p, %d)", (const void*)buttonList, mainLoop);
|
2009-01-21 15:36:31 +00:00
|
|
|
_isSaveAllowed = mainLoop;
|
2008-12-16 17:40:34 +00:00
|
|
|
updateInput();
|
|
|
|
_isSaveAllowed = false;
|
|
|
|
|
|
|
|
int keys = 0;
|
|
|
|
int8 mouseWheel = 0;
|
|
|
|
|
|
|
|
while (_eventList.size()) {
|
|
|
|
Common::Event event = *_eventList.begin();
|
|
|
|
bool breakLoop = false;
|
|
|
|
|
|
|
|
switch (event.type) {
|
|
|
|
case Common::EVENT_KEYDOWN:
|
|
|
|
if (event.kbd.keycode >= '1' && event.kbd.keycode <= '9' &&
|
|
|
|
(event.kbd.flags == Common::KBD_CTRL || event.kbd.flags == Common::KBD_ALT) && mainLoop) {
|
|
|
|
int saveLoadSlot = 9 - (event.kbd.keycode - '0') + 990;
|
|
|
|
|
|
|
|
if (event.kbd.flags == Common::KBD_CTRL) {
|
|
|
|
loadGameStateCheck(saveLoadSlot);
|
|
|
|
_eventList.clear();
|
|
|
|
breakLoop = true;
|
|
|
|
} else {
|
|
|
|
char savegameName[14];
|
|
|
|
sprintf(savegameName, "Quicksave %d", event.kbd.keycode - '0');
|
|
|
|
saveGameState(saveLoadSlot, savegameName, 0);
|
|
|
|
}
|
|
|
|
} else if (event.kbd.flags == Common::KBD_CTRL) {
|
|
|
|
if (event.kbd.keycode == 'd')
|
|
|
|
_debugger->attach();
|
|
|
|
else if (event.kbd.keycode == 'q')
|
|
|
|
quitGame();
|
2009-02-01 19:27:01 +00:00
|
|
|
} else {
|
|
|
|
switch(event.kbd.keycode) {
|
|
|
|
case Common::KEYCODE_SPACE:
|
2009-02-16 17:17:15 +00:00
|
|
|
keys = 43;
|
2009-02-01 19:27:01 +00:00
|
|
|
break;
|
|
|
|
case Common::KEYCODE_RETURN:
|
2009-02-16 17:17:15 +00:00
|
|
|
keys = 61;
|
2009-02-01 19:27:01 +00:00
|
|
|
break;
|
|
|
|
case Common::KEYCODE_UP:
|
2009-02-15 03:36:30 +00:00
|
|
|
case Common::KEYCODE_KP8:
|
|
|
|
keys = 96;
|
2009-02-01 19:27:01 +00:00
|
|
|
break;
|
|
|
|
case Common::KEYCODE_RIGHT:
|
2009-02-15 03:36:30 +00:00
|
|
|
case Common::KEYCODE_KP6:
|
|
|
|
keys = 102;
|
2009-02-01 19:27:01 +00:00
|
|
|
break;
|
|
|
|
case Common::KEYCODE_DOWN:
|
2009-02-15 03:36:30 +00:00
|
|
|
case Common::KEYCODE_KP2:
|
|
|
|
keys = 97;
|
2009-02-01 19:27:01 +00:00
|
|
|
break;
|
|
|
|
case Common::KEYCODE_LEFT:
|
2009-02-15 03:36:30 +00:00
|
|
|
case Common::KEYCODE_KP4:
|
|
|
|
keys = 92;
|
|
|
|
break;
|
|
|
|
case Common::KEYCODE_HOME:
|
|
|
|
case Common::KEYCODE_KP7:
|
|
|
|
keys = 91;
|
|
|
|
break;
|
|
|
|
case Common::KEYCODE_PAGEUP:
|
|
|
|
case Common::KEYCODE_KP9:
|
|
|
|
keys = 101;
|
|
|
|
break;
|
|
|
|
case Common::KEYCODE_F1:
|
|
|
|
keys = 112;
|
|
|
|
break;
|
|
|
|
case Common::KEYCODE_F2:
|
2009-02-01 19:27:01 +00:00
|
|
|
keys = 113;
|
|
|
|
break;
|
2009-02-15 03:36:30 +00:00
|
|
|
case Common::KEYCODE_F3:
|
|
|
|
keys = 114;
|
|
|
|
break;
|
|
|
|
case Common::KEYCODE_o:
|
|
|
|
keys = 25;
|
|
|
|
break;
|
|
|
|
case Common::KEYCODE_r:
|
|
|
|
keys = 20;
|
|
|
|
break;
|
2009-02-16 17:17:15 +00:00
|
|
|
case Common::KEYCODE_SLASH:
|
|
|
|
keys = 55;
|
|
|
|
break;
|
2009-02-15 03:36:30 +00:00
|
|
|
case Common::KEYCODE_ESCAPE:
|
|
|
|
keys = 110;
|
|
|
|
break;
|
2009-02-01 19:27:01 +00:00
|
|
|
default:
|
2009-05-17 21:52:31 +00:00
|
|
|
keys = 0;
|
2009-02-01 19:27:01 +00:00
|
|
|
break;
|
|
|
|
}
|
2009-05-17 21:52:31 +00:00
|
|
|
|
2009-05-17 21:55:24 +00:00
|
|
|
// When we got an keypress, which we might need to handle,
|
|
|
|
// break the event loop and pass it to GUI code.
|
2009-05-17 21:52:31 +00:00
|
|
|
if (keys)
|
|
|
|
breakLoop = true;
|
2008-12-16 17:40:34 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Common::EVENT_MOUSEMOVE: {
|
|
|
|
Common::Point pos = getMousePos();
|
|
|
|
_mouseX = pos.x;
|
|
|
|
_mouseY = pos.y;
|
|
|
|
} break;
|
|
|
|
|
|
|
|
case Common::EVENT_LBUTTONDOWN:
|
|
|
|
case Common::EVENT_LBUTTONUP: {
|
|
|
|
Common::Point pos = getMousePos();
|
|
|
|
_mouseX = pos.x;
|
|
|
|
_mouseY = pos.y;
|
|
|
|
keys = (event.type == Common::EVENT_LBUTTONDOWN ? 199 : (200 | 0x800));
|
|
|
|
breakLoop = true;
|
|
|
|
} break;
|
|
|
|
|
2009-02-01 19:27:01 +00:00
|
|
|
case Common::EVENT_RBUTTONDOWN:
|
|
|
|
case Common::EVENT_RBUTTONUP: {
|
|
|
|
Common::Point pos = getMousePos();
|
|
|
|
_mouseX = pos.x;
|
|
|
|
_mouseY = pos.y;
|
2009-02-15 03:36:30 +00:00
|
|
|
keys = (event.type == Common::EVENT_RBUTTONDOWN ? 201 : (202 | 0x800));
|
2009-02-01 19:27:01 +00:00
|
|
|
breakLoop = true;
|
|
|
|
} break;
|
|
|
|
|
2008-12-16 17:40:34 +00:00
|
|
|
case Common::EVENT_WHEELUP:
|
|
|
|
mouseWheel = -1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Common::EVENT_WHEELDOWN:
|
|
|
|
mouseWheel = 1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2008-12-26 08:35:36 +00:00
|
|
|
if (_debugger && _debugger->isAttached())
|
2008-12-16 17:40:34 +00:00
|
|
|
_debugger->onFrame();
|
|
|
|
|
|
|
|
if (breakLoop)
|
|
|
|
break;
|
|
|
|
|
|
|
|
_eventList.erase(_eventList.begin());
|
|
|
|
}
|
|
|
|
|
|
|
|
GUI *guiInstance = gui();
|
|
|
|
if (guiInstance)
|
|
|
|
return guiInstance->processButtonList(buttonList, keys | 0x8000, mouseWheel);
|
|
|
|
else
|
|
|
|
return keys;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KyraEngine_v1::updateInput() {
|
|
|
|
Common::Event event;
|
|
|
|
|
2009-04-18 03:15:34 +00:00
|
|
|
bool updateScreen = false;
|
|
|
|
|
2008-12-16 17:40:34 +00:00
|
|
|
while (_eventMan->pollEvent(event)) {
|
|
|
|
switch (event.type) {
|
|
|
|
case Common::EVENT_KEYDOWN:
|
2009-02-14 00:51:07 +00:00
|
|
|
if (event.kbd.keycode == '.' || event.kbd.keycode == Common::KEYCODE_ESCAPE ||
|
|
|
|
event.kbd.keycode == Common::KEYCODE_SPACE || event.kbd.keycode == Common::KEYCODE_RETURN ||
|
|
|
|
event.kbd.keycode == Common::KEYCODE_UP || event.kbd.keycode == Common::KEYCODE_RIGHT ||
|
|
|
|
event.kbd.keycode == Common::KEYCODE_DOWN || event.kbd.keycode == Common::KEYCODE_LEFT)
|
|
|
|
_eventList.push_back(Event(event, true));
|
2008-12-16 17:40:34 +00:00
|
|
|
else if (event.kbd.keycode == 'q' && event.kbd.flags == Common::KBD_CTRL)
|
|
|
|
quitGame();
|
|
|
|
else
|
|
|
|
_eventList.push_back(event);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Common::EVENT_LBUTTONDOWN:
|
2009-02-14 00:51:07 +00:00
|
|
|
case Common::EVENT_RBUTTONDOWN:
|
2008-12-16 17:40:34 +00:00
|
|
|
_eventList.push_back(Event(event, true));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Common::EVENT_MOUSEMOVE:
|
2009-04-18 03:15:34 +00:00
|
|
|
if (screen()->isMouseVisible())
|
|
|
|
updateScreen = true;
|
2008-12-16 17:40:34 +00:00
|
|
|
// fall through
|
|
|
|
|
|
|
|
case Common::EVENT_LBUTTONUP:
|
2009-02-14 00:51:07 +00:00
|
|
|
case Common::EVENT_RBUTTONUP:
|
2008-12-16 17:40:34 +00:00
|
|
|
case Common::EVENT_WHEELUP:
|
|
|
|
case Common::EVENT_WHEELDOWN:
|
|
|
|
_eventList.push_back(event);
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2009-04-18 03:15:34 +00:00
|
|
|
|
2009-04-18 21:23:45 +00:00
|
|
|
// TODO: Check whether we should really call Screen::updateScreen here.
|
|
|
|
// We might simply want to call OSystem::updateScreen instead, since Screen::updateScreen
|
|
|
|
// copies changed screen parts to the screen buffer, which might not be desired.
|
2009-04-18 03:15:34 +00:00
|
|
|
if (updateScreen)
|
|
|
|
screen()->updateScreen();
|
2008-12-16 17:40:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void KyraEngine_v1::removeInputTop() {
|
|
|
|
if (!_eventList.empty())
|
|
|
|
_eventList.erase(_eventList.begin());
|
|
|
|
}
|
|
|
|
|
|
|
|
bool KyraEngine_v1::skipFlag() const {
|
|
|
|
for (Common::List<Event>::const_iterator i = _eventList.begin(); i != _eventList.end(); ++i) {
|
|
|
|
if (i->causedSkip)
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KyraEngine_v1::resetSkipFlag(bool removeEvent) {
|
|
|
|
for (Common::List<Event>::iterator i = _eventList.begin(); i != _eventList.end(); ++i) {
|
|
|
|
if (i->causedSkip) {
|
|
|
|
if (removeEvent)
|
|
|
|
_eventList.erase(i);
|
|
|
|
else
|
|
|
|
i->causedSkip = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
int KyraEngine_v1::setGameFlag(int flag) {
|
2006-02-11 08:31:13 +00:00
|
|
|
_flagsTable[flag >> 3] |= (1 << (flag & 7));
|
|
|
|
return 1;
|
2005-12-10 15:52:38 +00:00
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
int KyraEngine_v1::queryGameFlag(int flag) const {
|
2006-02-11 08:31:13 +00:00
|
|
|
return ((_flagsTable[flag >> 3] >> (flag & 7)) & 1);
|
2005-12-10 15:52:38 +00:00
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
int KyraEngine_v1::resetGameFlag(int flag) {
|
2006-02-11 08:31:13 +00:00
|
|
|
_flagsTable[flag >> 3] &= ~(1 << (flag & 7));
|
|
|
|
return 0;
|
2005-12-26 14:53:51 +00:00
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
void KyraEngine_v1::delayUntil(uint32 timestamp, bool updateTimers, bool update, bool isMainLoop) {
|
2008-09-30 12:27:38 +00:00
|
|
|
while (_system->getMillis() < timestamp && !shouldQuit()) {
|
2007-07-29 16:31:29 +00:00
|
|
|
if (timestamp - _system->getMillis() >= 10)
|
|
|
|
delay(10, update, isMainLoop);
|
2005-11-18 23:55:31 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
void KyraEngine_v1::delay(uint32 amount, bool update, bool isMainLoop) {
|
2007-07-29 16:31:29 +00:00
|
|
|
_system->delayMillis(amount);
|
2005-12-09 23:02:16 +00:00
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
void KyraEngine_v1::delayWithTicks(int ticks) {
|
2007-07-29 16:31:29 +00:00
|
|
|
delay(ticks * _tickLength);
|
2005-12-09 23:02:16 +00:00
|
|
|
}
|
2006-04-08 11:21:04 +00:00
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
void KyraEngine_v1::registerDefaultSettings() {
|
2009-05-17 21:55:24 +00:00
|
|
|
if (_flags.platform == Common::kPlatformFMTowns)
|
2008-09-14 14:58:37 +00:00
|
|
|
ConfMan.registerDefault("cdaudio", true);
|
2008-07-05 08:20:10 +00:00
|
|
|
if (_flags.fanLang != Common::UNK_LANG) {
|
|
|
|
// HACK/WORKAROUND: Since we can't use registerDefault here to overwrite
|
|
|
|
// the global subtitles settings, we're using this hack to enable subtitles
|
|
|
|
// for fan translations
|
|
|
|
const Common::ConfigManager::Domain *cur = ConfMan.getActiveDomain();
|
|
|
|
if (!cur || (cur && cur->get("subtitles").empty()))
|
|
|
|
ConfMan.setBool("subtitles", true);
|
|
|
|
}
|
2008-01-27 15:30:53 +00:00
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
void KyraEngine_v1::readSettings() {
|
2008-01-27 15:30:53 +00:00
|
|
|
_configWalkspeed = ConfMan.getInt("walkspeed");
|
2008-02-07 23:31:13 +00:00
|
|
|
_configMusic = 0;
|
2009-01-01 15:06:43 +00:00
|
|
|
|
2008-02-07 23:31:13 +00:00
|
|
|
if (!ConfMan.getBool("music_mute")) {
|
2009-05-17 22:12:36 +00:00
|
|
|
if (_flags.platform == Common::kPlatformFMTowns)
|
2008-09-14 15:35:40 +00:00
|
|
|
_configMusic = ConfMan.getBool("cdaudio") ? 2 : 1;
|
|
|
|
else
|
|
|
|
_configMusic = 1;
|
2008-02-07 23:31:13 +00:00
|
|
|
}
|
2008-01-27 15:30:53 +00:00
|
|
|
_configSounds = ConfMan.getBool("sfx_mute") ? 0 : 1;
|
|
|
|
|
2008-04-29 15:12:09 +00:00
|
|
|
if (_sound) {
|
|
|
|
_sound->enableMusic(_configMusic);
|
|
|
|
_sound->enableSFX(_configSounds);
|
|
|
|
}
|
2008-01-27 15:30:53 +00:00
|
|
|
|
|
|
|
bool speechMute = ConfMan.getBool("speech_mute");
|
|
|
|
bool subtitles = ConfMan.getBool("subtitles");
|
|
|
|
|
|
|
|
if (!speechMute && subtitles)
|
|
|
|
_configVoice = 2; // Voice & Text
|
|
|
|
else if (!speechMute && !subtitles)
|
|
|
|
_configVoice = 1; // Voice only
|
|
|
|
else
|
|
|
|
_configVoice = 0; // Text only
|
|
|
|
|
|
|
|
setWalkspeed(_configWalkspeed);
|
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
void KyraEngine_v1::writeSettings() {
|
2008-01-27 15:30:53 +00:00
|
|
|
bool speechMute, subtitles;
|
|
|
|
|
|
|
|
ConfMan.setInt("walkspeed", _configWalkspeed);
|
|
|
|
ConfMan.setBool("music_mute", _configMusic == 0);
|
2008-02-07 23:31:13 +00:00
|
|
|
if (_flags.gameID != GI_KYRA3)
|
|
|
|
ConfMan.setBool("cdaudio", _configMusic == 2);
|
2008-01-27 15:30:53 +00:00
|
|
|
ConfMan.setBool("sfx_mute", _configSounds == 0);
|
|
|
|
|
|
|
|
switch (_configVoice) {
|
|
|
|
case 0: // Text only
|
|
|
|
speechMute = true;
|
|
|
|
subtitles = true;
|
|
|
|
break;
|
|
|
|
case 1: // Voice only
|
|
|
|
speechMute = false;
|
|
|
|
subtitles = false;
|
|
|
|
break;
|
|
|
|
default: // Voice & Text
|
|
|
|
speechMute = false;
|
|
|
|
subtitles = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2008-04-29 15:12:09 +00:00
|
|
|
if (_sound) {
|
|
|
|
if (!_configMusic)
|
|
|
|
_sound->beginFadeOut();
|
|
|
|
_sound->enableMusic(_configMusic);
|
|
|
|
_sound->enableSFX(_configSounds);
|
|
|
|
}
|
2008-01-27 15:30:53 +00:00
|
|
|
|
|
|
|
ConfMan.setBool("speech_mute", speechMute);
|
|
|
|
ConfMan.setBool("subtitles", subtitles);
|
|
|
|
|
|
|
|
ConfMan.flushToDisk();
|
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
bool KyraEngine_v1::speechEnabled() {
|
2008-01-27 15:30:53 +00:00
|
|
|
return _flags.isTalkie && (_configVoice == 1 || _configVoice == 2);
|
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
bool KyraEngine_v1::textEnabled() {
|
2008-01-27 15:30:53 +00:00
|
|
|
return !_flags.isTalkie || (_configVoice == 0 || _configVoice == 2);
|
|
|
|
}
|
|
|
|
|
2008-04-04 18:02:50 +00:00
|
|
|
inline int convertValueToMixer(int value) {
|
|
|
|
value -= 2;
|
|
|
|
return (value * Audio::Mixer::kMaxMixerVolume) / 95;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline int convertValueFromMixer(int value) {
|
|
|
|
return (value * 95) / Audio::Mixer::kMaxMixerVolume + 2;
|
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
void KyraEngine_v1::setVolume(kVolumeEntry vol, uint8 value) {
|
2008-04-04 18:02:50 +00:00
|
|
|
switch (vol) {
|
|
|
|
case kVolumeMusic:
|
|
|
|
ConfMan.setInt("music_volume", convertValueToMixer(value));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case kVolumeSfx:
|
|
|
|
ConfMan.setInt("sfx_volume", convertValueToMixer(value));
|
|
|
|
break;
|
2009-01-01 15:06:43 +00:00
|
|
|
|
2008-04-04 18:02:50 +00:00
|
|
|
case kVolumeSpeech:
|
|
|
|
ConfMan.setInt("speech_volume", convertValueToMixer(value));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Resetup mixer
|
|
|
|
_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume"));
|
|
|
|
_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
|
|
|
|
_mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, ConfMan.getInt("speech_volume"));
|
2008-04-04 18:09:19 +00:00
|
|
|
if (_sound)
|
|
|
|
_sound->updateVolumeSettings();
|
2008-04-04 18:02:50 +00:00
|
|
|
}
|
|
|
|
|
2008-05-11 23:16:50 +00:00
|
|
|
uint8 KyraEngine_v1::getVolume(kVolumeEntry vol) {
|
2008-04-04 18:02:50 +00:00
|
|
|
switch (vol) {
|
|
|
|
case kVolumeMusic:
|
|
|
|
return convertValueFromMixer(ConfMan.getInt("music_volume"));
|
|
|
|
break;
|
|
|
|
|
|
|
|
case kVolumeSfx:
|
|
|
|
return convertValueFromMixer(ConfMan.getInt("sfx_volume"));
|
|
|
|
break;
|
2009-01-01 15:06:43 +00:00
|
|
|
|
2008-04-04 18:02:50 +00:00
|
|
|
case kVolumeSpeech:
|
|
|
|
if (speechEnabled())
|
|
|
|
return convertValueFromMixer(ConfMan.getInt("speech_volume"));
|
|
|
|
else
|
|
|
|
return 2;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
2008-11-09 12:07:20 +00:00
|
|
|
void KyraEngine_v1::syncSoundSettings() {
|
|
|
|
Engine::syncSoundSettings();
|
|
|
|
|
|
|
|
if (_sound)
|
|
|
|
_sound->updateVolumeSettings();
|
|
|
|
}
|
|
|
|
|
2005-08-19 22:12:09 +00:00
|
|
|
} // End of namespace Kyra
|
2007-04-15 16:41:20 +00:00
|
|
|
|