diff options
Diffstat (limited to 'engines')
287 files changed, 30950 insertions, 1623 deletions
diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index 7ae4d7718a..d864fe8b52 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -51,7 +51,13 @@ static GameDescriptor toGameDescriptor(const ADGameDescription &g, const PlainGa extra = g.extra; } - GameDescriptor gd(g.gameid, title, g.language, g.platform); + GameSupportLevel gsl = kStableGame; + if (g.flags & ADGF_UNSTABLE) + gsl = kUnstableGame; + else if (g.flags & ADGF_TESTING) + gsl = kTestingGame; + + GameDescriptor gd(g.gameid, title, g.language, g.platform, 0, gsl); gd.updateDesc(extra); return gd; } @@ -253,8 +259,21 @@ Common::Error AdvancedMetaEngine::createInstance(OSystem *syst, Engine **engine) Common::updateGameGUIOptions(agdDesc->guioptions | _guioptions, lang); + GameDescriptor gameDescriptor = toGameDescriptor(*agdDesc, _gameids); + + bool showTestingWarning = false; + +#ifdef RELEASE_BUILD + showTestingWarning = true; +#endif + + if (((gameDescriptor.getSupportLevel() == kUnstableGame + || (gameDescriptor.getSupportLevel() == kTestingGame + && showTestingWarning))) + && !Engine::warnUserAboutUnsupportedGame()) + return Common::kUserCanceled; - debug(2, "Running %s", toGameDescriptor(*agdDesc, _gameids).description().c_str()); + debug(2, "Running %s", gameDescriptor.description().c_str()); if (!createInstance(syst, engine, agdDesc)) return Common::kNoGameDataFoundError; else diff --git a/engines/advancedDetector.h b/engines/advancedDetector.h index 5360d23ac1..cbdfdf39d8 100644 --- a/engines/advancedDetector.h +++ b/engines/advancedDetector.h @@ -24,6 +24,7 @@ #define ENGINES_ADVANCED_DETECTOR_H #include "engines/metaengine.h" +#include "engines/engine.h" namespace Common { class Error; @@ -62,6 +63,8 @@ struct ADGameFileDescription { enum ADGameFlags { ADGF_NO_FLAGS = 0, + ADGF_UNSTABLE = (1 << 21), // flag to designate not yet officially-supported games that are not fit for public testing + ADGF_TESTING = (1 << 22), // flag to designate not yet officially-supported games that are fit for public testing ADGF_PIRATED = (1 << 23), ///< flag to designate well known pirated versions with cracks ADGF_ADDENGLISH = (1 << 24), ///< always add English as language option ADGF_MACRESFORK = (1 << 25), ///< the md5 for this entry will be calculated from the resource fork diff --git a/engines/agi/agi.cpp b/engines/agi/agi.cpp index 811a58f45d..0eefbab04d 100644 --- a/engines/agi/agi.cpp +++ b/engines/agi/agi.cpp @@ -188,7 +188,7 @@ void AgiEngine::processEvents() { case Common::KEYCODE_KP5: if (_predictiveDialogRunning) key = event.kbd.ascii; - else + else key = KEY_STATIONARY; break; case Common::KEYCODE_PLUS: diff --git a/engines/agi/detection.cpp b/engines/agi/detection.cpp index 21ff5deb2c..a0736d0cc3 100644 --- a/engines/agi/detection.cpp +++ b/engines/agi/detection.cpp @@ -473,7 +473,7 @@ bool AgiBase::canLoadGameStateCurrently() { bool AgiBase::canSaveGameStateCurrently() { if (getGameID() == GID_BC) // Technically in Black Cauldron we may save anytime return true; - + return (!(getGameType() == GType_PreAGI) && getflag(fMenusWork) && !_noSaveLoadAllowed && _game.inputEnabled); } diff --git a/engines/agi/sound.cpp b/engines/agi/sound.cpp index aa338db0f2..f2d7af32da 100644 --- a/engines/agi/sound.cpp +++ b/engines/agi/sound.cpp @@ -144,7 +144,7 @@ void SoundMgr::stopSound() { // not be any harm doing it, so do it anyway. if (_endflag != -1) _vm->setflag(_endflag, true); - + _endflag = -1; } diff --git a/engines/agi/sound_2gs.cpp b/engines/agi/sound_2gs.cpp index 3c8a3dfc8d..38e256aa4b 100644 --- a/engines/agi/sound_2gs.cpp +++ b/engines/agi/sound_2gs.cpp @@ -167,12 +167,12 @@ uint SoundGen2GS::generateOutput() { g->seg++; } } - + // TODO: Advance vibrato here. The Apple IIGS uses a LFO with // triangle wave to modulate the frequency of both oscillators. // In Apple IIGS the vibrato and the envelope are updated at the // same time, so the vibrato speed depends on ENVELOPE_COEF. - + // Advance oscillators int s0 = 0; int s1 = 0; @@ -202,12 +202,12 @@ uint SoundGen2GS::generateOutput() { } } } - + // Take envelope and MIDI volume information into account. // Also amplify. s0 *= vol * g->vel / 127 * 80 / 256; s1 *= vol * g->vel / 127 * 80 / 256; - + // Select output channel. if (g->osc[0].chn) outl += s0; @@ -375,7 +375,7 @@ void SoundGen2GS::midiNoteOn(int channel, int note, int velocity) { IIgsGenerator* g = allocateGenerator(); g->ins = _channels[channel].getInstrument(); const IIgsInstrumentHeader* i = g->ins; - + // Pass information from the MIDI channel to the generator. Take // velocity into account, although simplistically. velocity *= 5 / 3; @@ -385,7 +385,7 @@ void SoundGen2GS::midiNoteOn(int channel, int note, int velocity) { g->key = note; g->vel = velocity * _channels[channel].getVolume() / 127; g->chn = channel; - + // Instruments can define different samples to be used based on // what the key is. Find the correct samples for our key. int wa = 0; diff --git a/engines/agi/sound_2gs.h b/engines/agi/sound_2gs.h index 1a225300ae..9123e18415 100644 --- a/engines/agi/sound_2gs.h +++ b/engines/agi/sound_2gs.h @@ -33,7 +33,7 @@ namespace Agi { // Apple IIGS to halt the corresponding oscillator immediately. We preprocess // the sample data by converting it to signed values and the instruments by // detecting prematurely stopping samples beforehand. -// +// // Note: None of the tested SIERRASTANDARD files have zeroes in them. So in // practice there is no need to check for them. However, they still do exist // in the sample resources. @@ -263,7 +263,7 @@ private: uint _ticks; ///< MIDI ticks (60Hz) int16 *_out; ///< Output buffer uint _outSize; ///< Output buffer size - + static const int kSfxMidiChannel = 15; ///< MIDI channel used for playing sample resources }; diff --git a/engines/agi/sound_midi.cpp b/engines/agi/sound_midi.cpp index d2c99171e2..0cbaa4af86 100644 --- a/engines/agi/sound_midi.cpp +++ b/engines/agi/sound_midi.cpp @@ -33,7 +33,7 @@ // Timing is not perfect, yet. It plays correct, when I use the // Gravis-Midiplayer, but the songs are too fast when I use playmidi on // Linux. -// +// // Original program developed by Jens. Christian Restemeier // @@ -114,7 +114,7 @@ void SoundGenMIDI::endOfTrack() { void SoundGenMIDI::play(int resnum) { MIDISound *track; - + stop(); _isGM = true; @@ -153,7 +153,7 @@ unsigned char instr[] = {50, 51, 19}; static void writeDelta(Common::MemoryWriteStreamDynamic *st, int32 delta) { int32 i; - i = delta >> 21; if (i > 0) st->writeByte((i & 127) | 128); + i = delta >> 21; if (i > 0) st->writeByte((i & 127) | 128); i = delta >> 14; if (i > 0) st->writeByte((i & 127) | 128); i = delta >> 7; if (i > 0) st->writeByte((i & 127) | 128); st->writeByte(delta & 127); @@ -196,7 +196,7 @@ static uint32 convertSND2MIDI(byte *snddata, byte **data) { int note; /* I don't know, what frequency equals midi note 0 ... */ /* This moves the song 4 octaves down: */ - fr = (log10(111860.0 / (double)freq) / ll) - 48; + fr = (log10(111860.0 / (double)freq) / ll) - 48; note = (int)floor(fr + 0.5); if (note < 0) note = 0; if (note > 127) note = 127; @@ -222,7 +222,7 @@ static uint32 convertSND2MIDI(byte *snddata, byte **data) { st.writeByte(0); st.writeByte(0); } - } + } writeDelta(&st, 0); st.writeByte(0xff); st.writeByte(0x2f); diff --git a/engines/agi/sound_pcjr.h b/engines/agi/sound_pcjr.h index f50fd0aa82..4317e86516 100644 --- a/engines/agi/sound_pcjr.h +++ b/engines/agi/sound_pcjr.h @@ -45,9 +45,9 @@ struct SndGenChan { uint16 dissolveCount; byte attenuation; byte attenuationCopy; - + GenType genType; - + // for the sample mixer int freqCount; }; diff --git a/engines/agi/sound_sarien.cpp b/engines/agi/sound_sarien.cpp index fc9a57791c..9ea8569b81 100644 --- a/engines/agi/sound_sarien.cpp +++ b/engines/agi/sound_sarien.cpp @@ -105,7 +105,7 @@ SoundGenSarien::~SoundGenSarien() { int SoundGenSarien::readBuffer(int16 *buffer, const int numSamples) { fillAudio(buffer, numSamples / 2); - + return numSamples; } @@ -124,7 +124,7 @@ void SoundGenSarien::play(int resnum) { for (int i = 0; i < NUM_CHANNELS; i++) { _chn[i].type = type; _chn[i].flags = AGI_SOUND_LOOP; - + if (_env) { _chn[i].flags |= AGI_SOUND_ENVELOPE; _chn[i].adsr = AGI_SOUND_ENV_ATTACK; diff --git a/engines/agi/text.cpp b/engines/agi/text.cpp index fedfd29362..82a2340ad6 100644 --- a/engines/agi/text.cpp +++ b/engines/agi/text.cpp @@ -504,17 +504,16 @@ int AgiEngine::print(const char *p, int lin, int col, int len) { * */ void AgiEngine::printStatus(const char *message, ...) { - char x[42]; va_list args; va_start(args, message); - vsprintf(x, message, args); + Common::String x = Common::String::vformat(message, args); va_end(args); debugC(4, kDebugLevelText, "fg=%d, bg=%d", STATUS_FG, STATUS_BG); - printText(x, 0, 0, _game.lineStatus, 40, STATUS_FG, STATUS_BG); + printText(x.c_str(), 0, 0, _game.lineStatus, 40, STATUS_FG, STATUS_BG); } static void safeStrcat(Common::String &p, const char *t) { diff --git a/engines/agos/string.cpp b/engines/agos/string.cpp index 1cdd7f6d81..f9a06cbecb 100644 --- a/engines/agos/string.cpp +++ b/engines/agos/string.cpp @@ -621,7 +621,7 @@ void AGOSEngine_PuzzlePack::printInfoText(const char *itemText) { itemName = " Gem: "; } break; - + case 82: if (_variableArray[flag]) { if (_variableArray[flag] == 201 || _variableArray[flag] == 211) @@ -723,11 +723,9 @@ void AGOSEngine_Feeble::printScreenText(uint vgaSpriteId, uint color, const char const char *string2 = string; int16 height, talkDelay; int stringLength = strlen(string); - int lettersPerRow; const int textHeight = 15; height = textHeight; - lettersPerRow = width / 6; talkDelay = (stringLength + 3) / 3; if (_variableArray[86] == 0) @@ -840,13 +838,12 @@ void AGOSEngine_Feeble::printInteractText(uint16 num, const char *string) { void AGOSEngine_Feeble::sendInteractText(uint16 num, const char *fmt, ...) { va_list arglist; - char string[256]; va_start(arglist, fmt); - vsprintf(string, fmt, arglist); + Common::String string = Common::String::vformat(fmt, arglist); va_end(arglist); - printInteractText(num, string); + printInteractText(num, string.c_str()); } #endif diff --git a/engines/cine/various.cpp b/engines/cine/various.cpp index 81e72d6905..cdb5140002 100644 --- a/engines/cine/various.cpp +++ b/engines/cine/various.cpp @@ -55,7 +55,7 @@ int16 canUseOnObject = 0; void waitPlayerInput() { uint16 button; - + do { manageEvents(); getMouseData(mouseUpdateStatus, &button, &dummyU16, &dummyU16); diff --git a/engines/cruise/background.cpp b/engines/cruise/background.cpp index 1e7e87cf38..4d1284a802 100644 --- a/engines/cruise/background.cpp +++ b/engines/cruise/background.cpp @@ -212,7 +212,7 @@ int loadBackground(const char *name, int idx) { // NOTE: the following is really meant to compare pointers and not the actual // strings. See r48092 and r48094. if (name != backgroundTable[idx].name) { - if (strlen(name) >= sizeof(backgroundTable[idx].name)) + if (strlen(name) >= sizeof(backgroundTable[idx].name)) warning("background name length exceeded allowable maximum"); Common::strlcpy(backgroundTable[idx].name, name, sizeof(backgroundTable[idx].name)); diff --git a/engines/cruise/cruise_main.cpp b/engines/cruise/cruise_main.cpp index 3f13c6cbff..a97583c972 100644 --- a/engines/cruise/cruise_main.cpp +++ b/engines/cruise/cruise_main.cpp @@ -1882,7 +1882,7 @@ void CruiseEngine::mainLoop() { while (numIterations-- > 0) { bgChanged = backgroundChanged[masterScreen]; - + manageScripts(&relHead); manageScripts(&procHead); diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp index 531cf32dbc..89c07ad24c 100644 --- a/engines/dialogs.cpp +++ b/engines/dialogs.cpp @@ -173,7 +173,7 @@ void MainMenuDialog::reflowLayout() { _loadButton->setEnabled(_engine->canLoadGameStateCurrently()); if (_engine->hasFeature(Engine::kSupportsSavingDuringRuntime)) _saveButton->setEnabled(_engine->canSaveGameStateCurrently()); - + // Overlay size might have changed since the construction of the dialog. // Update labels when it might be needed // FIXME: it might be better to declare GUI::StaticTextWidget::setLabel() virtual diff --git a/engines/drascula/detection.cpp b/engines/drascula/detection.cpp index 2249a49e4d..6ba5597e8a 100644 --- a/engines/drascula/detection.cpp +++ b/engines/drascula/detection.cpp @@ -243,7 +243,7 @@ static const DrasculaGameDescription gameDescriptions[] = { GUIO_NONE }, }, - + { // Drascula French version (ScummVM repacked files) { diff --git a/engines/drascula/graphics.cpp b/engines/drascula/graphics.cpp index d133b3609d..9ea20e3e12 100644 --- a/engines/drascula/graphics.cpp +++ b/engines/drascula/graphics.cpp @@ -204,7 +204,7 @@ void DrasculaEngine::copyRect(int xorg, int yorg, int xdes, int ydes, int width, } ptr += 320 - width; } - + } void DrasculaEngine::updateScreen(int xorg, int yorg, int xdes, int ydes, int width, int height, byte *buffer) { @@ -354,7 +354,7 @@ void DrasculaEngine::centerText(const char *message, int textX, int textY) { print_abc(msg, x, y); return; } - + // Message doesn't fit on screen, split it // Get a word from the message diff --git a/engines/drascula/resource.cpp b/engines/drascula/resource.cpp index bda25113b7..6da43e7cba 100644 --- a/engines/drascula/resource.cpp +++ b/engines/drascula/resource.cpp @@ -45,7 +45,7 @@ TextResourceParser::TextResourceParser(Common::SeekableReadStream *stream, Dispo _stream(stream), _dispose(dispose) { // NOTE: strangely enough, the code before this refactoring used the size of - // the stream as a fixed maximum length for the parser. Using an updated + // the stream as a fixed maximum length for the parser. Using an updated // (size-pos) would make more sense to me, but let's see what the experts say. _maxLen = _stream->size(); } diff --git a/engines/drascula/rooms.cpp b/engines/drascula/rooms.cpp index 50d44bab79..9f725b6d76 100644 --- a/engines/drascula/rooms.cpp +++ b/engines/drascula/rooms.cpp @@ -1675,7 +1675,7 @@ void DrasculaEngine::enterRoom(int roomIndex) { if (!stream) { error("missing data file %s", fileName); } - + TextResourceParser p(stream, DisposeAfterUse::YES); p.parseInt(roomNumber); diff --git a/engines/dreamweb/README b/engines/dreamweb/README new file mode 100644 index 0000000000..d184613249 --- /dev/null +++ b/engines/dreamweb/README @@ -0,0 +1,12 @@ + +WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING + +Some files(dreamgen.*) in this directory is auto-generated. This means +(at least for some time) any changes to them will be lost. + +Please look into /devtools/tasmrecover directory, patch assembler source +or translator and run ./tasm-recover script. + +Then copy dreamgen.cpp/dreamgen.h to engine/dreamweb and check the diffs. + +If you'd like to reimplement something, blacklist it, then run script. diff --git a/engines/dreamweb/console.cpp b/engines/dreamweb/console.cpp new file mode 100644 index 0000000000..e004746d8a --- /dev/null +++ b/engines/dreamweb/console.cpp @@ -0,0 +1,36 @@ +/* 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. + * + * $URL: https://svn.scummvm.org:4444/svn/dreamweb/console.cpp $ + * $Id: console.cpp 70 2011-01-26 05:36:55Z digitall $ + * + */ + +#include "dreamweb/console.h" + +namespace DreamWeb { + +DreamWebConsole::DreamWebConsole(DreamWebEngine *vm) : GUI::Debugger(), _vm(vm) { +} + +DreamWebConsole::~DreamWebConsole() { +} + +} // End of namespace DreamWeb diff --git a/engines/dreamweb/console.h b/engines/dreamweb/console.h new file mode 100644 index 0000000000..58c8467b34 --- /dev/null +++ b/engines/dreamweb/console.h @@ -0,0 +1,46 @@ +/* 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. + * + * $URL: https://svn.scummvm.org:4444/svn/dreamweb/console.h $ + * $Id: console.h 70 2011-01-26 05:36:55Z digitall $ + * + */ + +#ifndef DREAMWEB_CONSOLE_H +#define DREAMWEB_CONSOLE_H + +#include "gui/debugger.h" + +namespace DreamWeb { + +class DreamWebEngine; + +class DreamWebConsole : public GUI::Debugger { +public: + DreamWebConsole(DreamWebEngine *vm); + virtual ~DreamWebConsole(void); + +private: + DreamWebEngine *_vm; +}; + +} // End of namespace DreamWeb + +#endif diff --git a/engines/dreamweb/detection.cpp b/engines/dreamweb/detection.cpp new file mode 100644 index 0000000000..18a2f899a8 --- /dev/null +++ b/engines/dreamweb/detection.cpp @@ -0,0 +1,155 @@ +/* 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. + * + * $URL: https://svn.scummvm.org:4444/svn/dreamweb/detection.cpp $ + * $Id: detection.cpp 3 2010-09-16 19:32:18Z megath $ + * + */ + +#include "base/plugins.h" + +#include "common/algorithm.h" +#include "common/system.h" + +#include "dreamweb/dreamweb.h" + +#include "engines/advancedDetector.h" + +namespace DreamWeb { + +struct DreamWebGameDescription { + ADGameDescription desc; +}; + +} // End of namespace DreamWeb + +static const PlainGameDescriptor dreamWebGames[] = { + { "dreamweb", "DreamWeb" }, + { 0, 0 } +}; + +#include "dreamweb/detection_tables.h" + +class DreamWebMetaEngine : public AdvancedMetaEngine { +public: + DreamWebMetaEngine(): + AdvancedMetaEngine(DreamWeb::gameDescriptions, + sizeof(DreamWeb::DreamWebGameDescription), dreamWebGames) { + _singleid = "dreamweb"; + _guioptions = Common::GUIO_NOMIDI; + } + + virtual const char *getName() const { + return "DreamWeb engine"; + } + + virtual const char *getOriginalCopyright() const { + return "DreamWeb (C) Creative Reality"; + } + + virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const; + virtual bool hasFeature(MetaEngineFeature f) const; + virtual SaveStateList listSaves(const char *target) const; + virtual int getMaximumSaveSlot() const; + virtual void removeSaveState(const char *target, int slot) const; +}; + +bool DreamWebMetaEngine::hasFeature(MetaEngineFeature f) const { + switch(f) { + case kSupportsListSaves: + //case kSupportsLoadingDuringStartup: + //case kSupportsDeleteSave: + return true; + default: + return false; + } +} + +bool DreamWeb::DreamWebEngine::hasFeature(EngineFeature f) const { + switch(f) { + case kSupportsRTL: + return true; + default: + return false; + } + return false; +} + +bool DreamWebMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { + const DreamWeb::DreamWebGameDescription *gd = (const DreamWeb::DreamWebGameDescription *)desc; + if (gd) { + *engine = new DreamWeb::DreamWebEngine(syst, gd); + } + return gd != 0; +} + +SaveStateList DreamWebMetaEngine::listSaves(const char *target) const { + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + Common::StringArray files = saveFileMan->listSavefiles("DREAMWEB.D??"); + Common::sort(files.begin(), files.end()); + + SaveStateList saveList; + for(uint i = 0; i < files.size(); ++i) { + const Common::String &file = files[i]; + Common::InSaveFile *stream = saveFileMan->openForLoading(file); + if (!stream) + error("cannot open save file %s", file.c_str()); + char name[17] = {}; + stream->seek(0x61); + stream->read(name, sizeof(name) - 1); + delete stream; + + SaveStateDescriptor sd(i, name); + saveList.push_back(sd); + } + + return saveList; +} + +int DreamWebMetaEngine::getMaximumSaveSlot() const { return 6; } + +void DreamWebMetaEngine::removeSaveState(const char *target, int slot) const { +} + +#if PLUGIN_ENABLED_DYNAMIC(DREAMWEB) + REGISTER_PLUGIN_DYNAMIC(DREAMWEB, PLUGIN_TYPE_ENGINE, DreamWebMetaEngine); +#else + REGISTER_PLUGIN_STATIC(DREAMWEB, PLUGIN_TYPE_ENGINE, DreamWebMetaEngine); +#endif + +namespace DreamWeb { + +Common::Error DreamWebEngine::loadGameState(int slot) { + return Common::kNoError; +} + +Common::Error DreamWebEngine::saveGameState(int slot, const Common::String &desc) { + return Common::kNoError; +} + +bool DreamWebEngine::canLoadGameStateCurrently() { + return false; +} + +bool DreamWebEngine::canSaveGameStateCurrently() { + return false; +} + +} // End of namespace DreamWeb diff --git a/engines/dreamweb/detection_tables.h b/engines/dreamweb/detection_tables.h new file mode 100644 index 0000000000..f32b8de6b6 --- /dev/null +++ b/engines/dreamweb/detection_tables.h @@ -0,0 +1,106 @@ +/* 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. + * + * $URL: https://svn.scummvm.org:4444/svn/dreamweb/detection_tables.h $ + * $Id: detection_tables.h 66 2010-11-07 08:31:21Z eriktorbjorn $ + * + */ + +#ifndef DREAMWEB_DETECTION_TABLES_H +#define DREAMWEB_DETECTION_TABLES_H + +namespace DreamWeb { + +using Common::GUIO_NONE; + +static const DreamWebGameDescription gameDescriptions[] = { + { + { + "dreamweb", + "", + { + {"dreamweb.r00", 0, "3b5c87717fc40cc5a5ae19c155662ee3", 152918}, + {"dreamweb.r02", 0, "28458718167a040d7e988cf7d2298eae", 210466}, + AD_LISTEND + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_UNSTABLE, + GUIO_NONE + }, + }, + + // International CD release + { + { + "dreamweb", + "CD", + { + {"dreamweb.r00", 0, "3b5c87717fc40cc5a5ae19c155662ee3", 152918}, + {"dreamweb.r02", 0, "d6fe5e3590ec1eea42ff65c10b023e0f", 198681}, + AD_LISTEND + }, + Common::EN_ANY, + Common::kPlatformPC, + ADGF_CD | ADGF_UNSTABLE, + GUIO_NONE + }, + }, + + // US CD release + { + { + "dreamweb", + "CD", + { + {"dreamweb.r00", 0, "8acafd7f4418d08d0e16b65b8b10bc50", 152983}, + {"dreamweb.r02", 0, "c0c363715ddf14ab54f2379906a3aa01", 198707}, + AD_LISTEND + }, + Common::EN_USA, + Common::kPlatformPC, + ADGF_CD, + GUIO_NONE + }, + }, + + // German CD release + { + { + "dreamweb", + "CD", + { + {"dreamweb.r00", 0, "9960dc3baddabc6ad2a6fd75292b149c", 155886}, + {"dreamweb.r02", 0, "076ca7cd326cb2abfb2091c6cf46ae08", 201038}, + AD_LISTEND + }, + Common::DE_DEU, + Common::kPlatformPC, + ADGF_CD | ADGF_UNSTABLE, + GUIO_NONE + }, + }, + + { AD_TABLE_END_MARKER } +}; + +} // End of namespace DreamWeb + +#endif diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp new file mode 100644 index 0000000000..9349436ca2 --- /dev/null +++ b/engines/dreamweb/dreamgen.cpp @@ -0,0 +1,22741 @@ +/* PLEASE DO NOT MODIFY THIS FILE. ALL CHANGES WILL BE LOST! LOOK FOR README FOR DETAILS */ + +#include "dreamgen.h" + +namespace DreamGen { + +void DreamGenContext::alleybarksound() { + STACK_CHECK; + ax = es.word(bx+3); + _dec(ax); + _cmp(ax, 0); + if (!flags.z()) + goto nobark; + push(bx); + push(es); + al = 14; + playchannel1(); + es = pop(); + bx = pop(); + ax = 1000; +nobark: + es.word(bx+3) = ax; +} + +void DreamGenContext::intromusic() { + STACK_CHECK; +} + +void DreamGenContext::foghornsound() { + STACK_CHECK; + randomnumber(); + _cmp(al, 198); + if (!flags.z()) + return /* (nofog) */; + al = 13; + playchannel1(); +} + +void DreamGenContext::receptionist() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto gotrecep; + _cmp(data.byte(kCardpassflag), 1); + if (!flags.z()) + goto notsetcard; + _inc(data.byte(kCardpassflag)); + es.byte(bx+7) = 1; + es.word(bx+3) = 64; +notsetcard: + _cmp(es.word(bx+3), 58); + if (!flags.z()) + goto notdes1; + randomnumber(); + _cmp(al, 30); + if (flags.c()) + goto notdes2; + es.word(bx+3) = 55; + goto gotrecep; +notdes1: + _cmp(es.word(bx+3), 60); + if (!flags.z()) + goto notdes2; + randomnumber(); + _cmp(al, 240); + if (flags.c()) + goto gotrecep; + es.word(bx+3) = 53; + goto gotrecep; +notdes2: + _cmp(es.word(bx+3), 88); + if (!flags.z()) + goto notendcard; + es.word(bx+3) = 53; + goto gotrecep; +notendcard: + _inc(es.word(bx+3)); +gotrecep: + showgamereel(); + addtopeoplelist(); + al = es.byte(bx+7); + _and(al, 128); + if (flags.z()) + return /* (nottalkedrecep) */; + data.byte(kTalkedtorecep) = 1; +} + +void DreamGenContext::smokebloke() { + STACK_CHECK; + _cmp(data.byte(kRockstardead), 0); + if (!flags.z()) + goto notspokento; + al = es.byte(bx+7); + _and(al, 128); + if (flags.z()) + goto notspokento; + push(es); + push(bx); + al = 5; + setlocation(); + bx = pop(); + es = pop(); +notspokento: + checkspeed(); + if (!flags.z()) + goto gotsmokeb; + _cmp(es.word(bx+3), 100); + if (!flags.z()) + goto notsmokeb1; + randomnumber(); + _cmp(al, 30); + if (flags.c()) + goto notsmokeb2; + es.word(bx+3) = 96; + goto gotsmokeb; +notsmokeb1: + _cmp(es.word(bx+3), 117); + if (!flags.z()) + goto notsmokeb2; + es.word(bx+3) = 96; + goto gotsmokeb; +notsmokeb2: + _inc(es.word(bx+3)); +gotsmokeb: + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::attendant() { + STACK_CHECK; + showgamereel(); + addtopeoplelist(); + al = es.byte(bx+7); + _and(al, 128); + if (flags.z()) + return /* (nottalked) */; + data.byte(kTalkedtoattendant) = 1; +} + +void DreamGenContext::manasleep() { + STACK_CHECK; + al = es.byte(bx+7); + _and(al, 127); + es.byte(bx+7) = al; + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::eden() { + STACK_CHECK; + _cmp(data.byte(kGeneraldead), 0); + if (!flags.z()) + return /* (notinbed) */; + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::edeninbath() { + STACK_CHECK; + _cmp(data.byte(kGeneraldead), 0); + if (flags.z()) + return /* (notinbath) */; + _cmp(data.byte(kSartaindead), 0); + if (!flags.z()) + return /* (notinbath) */; + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::malefan() { + STACK_CHECK; + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::femalefan() { + STACK_CHECK; + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::louis() { + STACK_CHECK; + _cmp(data.byte(kRockstardead), 0); + if (!flags.z()) + return /* (notlouis1) */; + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::louischair() { + STACK_CHECK; + _cmp(data.byte(kRockstardead), 0); + if (flags.z()) + return /* (notlouis2) */; + checkspeed(); + if (!flags.z()) + goto notlouisanim; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 191); + if (flags.z()) + goto restartlouis; + _cmp(ax, 185); + if (flags.z()) + goto randomlouis; + es.word(bx+3) = ax; + goto notlouisanim; +randomlouis: + es.word(bx+3) = ax; + randomnumber(); + _cmp(al, 245); + if (!flags.c()) + goto notlouisanim; +restartlouis: + ax = 182; + es.word(bx+3) = ax; +notlouisanim: + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::manasleep2() { + STACK_CHECK; + al = es.byte(bx+7); + _and(al, 127); + es.byte(bx+7) = al; + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::mansatstill() { + STACK_CHECK; + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::tattooman() { + STACK_CHECK; + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::drinker() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto gotdrinker; + _inc(es.word(bx+3)); + _cmp(es.word(bx+3), 115); + if (!flags.z()) + goto notdrinker1; + es.word(bx+3) = 105; + goto gotdrinker; +notdrinker1: + _cmp(es.word(bx+3), 106); + if (!flags.z()) + goto gotdrinker; + randomnumber(); + _cmp(al, 3); + if (flags.c()) + goto gotdrinker; + es.word(bx+3) = 105; +gotdrinker: + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::bartender() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto gotsmoket; + _cmp(es.word(bx+3), 86); + if (!flags.z()) + goto notsmoket1; + randomnumber(); + _cmp(al, 18); + if (flags.c()) + goto notsmoket2; + es.word(bx+3) = 81; + goto gotsmoket; +notsmoket1: + _cmp(es.word(bx+3), 103); + if (!flags.z()) + goto notsmoket2; + es.word(bx+3) = 81; + goto gotsmoket; +notsmoket2: + _inc(es.word(bx+3)); +gotsmoket: + showgamereel(); + _cmp(data.byte(kGunpassflag), 1); + if (!flags.z()) + goto notgotgun; + es.byte(bx+7) = 9; +notgotgun: + addtopeoplelist(); +} + +void DreamGenContext::othersmoker() { + STACK_CHECK; + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::barwoman() { + STACK_CHECK; + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::interviewer() { + STACK_CHECK; + _cmp(data.word(kReeltowatch), 68); + if (!flags.z()) + goto notgeneralstart; + _inc(es.word(bx+3)); +notgeneralstart: + _cmp(es.word(bx+3), 250); + if (flags.z()) + goto talking; + checkspeed(); + if (!flags.z()) + goto talking; + _cmp(es.word(bx+3), 259); + if (flags.z()) + goto talking; + _inc(es.word(bx+3)); +talking: + showgamereel(); +} + +void DreamGenContext::soldier1() { + STACK_CHECK; + _cmp(es.word(bx+3), 0); + if (flags.z()) + goto soldierwait; + data.word(kWatchingtime) = 10; + _cmp(es.word(bx+3), 30); + if (!flags.z()) + goto notaftersshot; + _inc(data.byte(kCombatcount)); + _cmp(data.byte(kCombatcount), 40); + if (!flags.z()) + goto gotsoldframe; + data.byte(kMandead) = 2; + goto gotsoldframe; +notaftersshot: + checkspeed(); + if (!flags.z()) + goto gotsoldframe; + _inc(es.word(bx+3)); + goto gotsoldframe; +soldierwait: + _cmp(data.byte(kLastweapon), 1); + if (!flags.z()) + goto gotsoldframe; + data.word(kWatchingtime) = 10; + _cmp(data.byte(kManspath), 2); + if (!flags.z()) + goto gotsoldframe; + _cmp(data.byte(kFacing), 4); + if (!flags.z()) + goto gotsoldframe; + _inc(es.word(bx+3)); + data.byte(kLastweapon) = -1; + data.byte(kCombatcount) = 0; +gotsoldframe: + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::rockstar() { + STACK_CHECK; + ax = es.word(bx+3); + _cmp(ax, 303); + if (flags.z()) + goto rockcombatend; + _cmp(ax, 118); + if (flags.z()) + goto rockcombatend; + checkspeed(); + if (!flags.z()) + goto rockspeed; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 118); + if (!flags.z()) + goto notbeforedead; + data.byte(kMandead) = 2; + goto gotrockframe; +notbeforedead: + _cmp(ax, 79); + if (!flags.z()) + goto gotrockframe; + _dec(ax); + _cmp(data.byte(kLastweapon), 1); + if (!flags.z()) + goto notgunonrock; + data.byte(kLastweapon) = -1; + ax = 123; + goto gotrockframe; +notgunonrock: + _inc(data.byte(kCombatcount)); + _cmp(data.byte(kCombatcount), 40); + if (!flags.z()) + goto gotrockframe; + data.byte(kCombatcount) = 0; + ax = 79; +gotrockframe: + es.word(bx+3) = ax; +rockspeed: + showgamereel(); + _cmp(es.word(bx+3), 78); + if (!flags.z()) + goto notalkrock; + addtopeoplelist(); + data.byte(kPointermode) = 2; + data.word(kWatchingtime) = 0; + return; +notalkrock: + data.word(kWatchingtime) = 2; + data.byte(kPointermode) = 0; + al = data.byte(kMapy); + es.byte(bx+2) = al; + return; +rockcombatend: + data.byte(kNewlocation) = 45; + showgamereel(); +} + +void DreamGenContext::helicopter() { + STACK_CHECK; + ax = es.word(bx+3); + _cmp(ax, 203); + if (flags.z()) + goto heliwon; + checkspeed(); + if (!flags.z()) + goto helispeed; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 53); + if (!flags.z()) + goto notbeforehdead; + _inc(data.byte(kCombatcount)); + _cmp(data.byte(kCombatcount), 8); + if (flags.c()) + goto waitabit; + data.byte(kMandead) = 2; +waitabit: + ax = 49; + goto gotheliframe; +notbeforehdead: + _cmp(ax, 9); + if (!flags.z()) + goto gotheliframe; + _dec(ax); + _cmp(data.byte(kLastweapon), 1); + if (!flags.z()) + goto notgunonheli; + data.byte(kLastweapon) = -1; + ax = 55; + goto gotheliframe; +notgunonheli: + ax = 5; + _inc(data.byte(kCombatcount)); + _cmp(data.byte(kCombatcount), 20); + if (!flags.z()) + goto gotheliframe; + data.byte(kCombatcount) = 0; + ax = 9; +gotheliframe: + es.word(bx+3) = ax; +helispeed: + showgamereel(); + al = data.byte(kMapx); + es.byte(bx+1) = al; + ax = es.word(bx+3); + _cmp(ax, 9); + if (!flags.c()) + goto notwaitingheli; + _cmp(data.byte(kCombatcount), 7); + if (flags.c()) + goto notwaitingheli; + data.byte(kPointermode) = 2; + data.word(kWatchingtime) = 0; + return; +notwaitingheli: + data.byte(kPointermode) = 0; + data.word(kWatchingtime) = 2; + return; +heliwon: + data.byte(kPointermode) = 0; +} + +void DreamGenContext::mugger() { + STACK_CHECK; + ax = es.word(bx+3); + _cmp(ax, 138); + if (flags.z()) + goto endmugger1; + _cmp(ax, 176); + if (flags.z()) + return /* (endmugger2) */; + _cmp(ax, 2); + if (!flags.z()) + goto havesetwatch; + data.word(kWatchingtime) = 175*2; +havesetwatch: + checkspeed(); + if (!flags.z()) + goto notmugger; + _inc(es.word(bx+3)); +notmugger: + showgamereel(); + al = data.byte(kMapx); + es.byte(bx+1) = al; + return; +endmugger1: + push(es); + push(bx); + createpanel2(); + showicon(); + al = 41; + findpuztext(); + di = 33+20; + bx = 104; + dl = 241; + ah = 0; + printdirect(); + worktoscreen(); + cx = 300; + hangon(); + bx = pop(); + es = pop(); + push(es); + push(bx); + es.word(bx+3) = 140; + data.byte(kManspath) = 2; + data.byte(kFinaldest) = 2; + findxyfrompath(); + data.byte(kResetmanxy) = 1; + al = 'W'; + ah = 'E'; + cl = 'T'; + ch = 'A'; + findexobject(); + data.byte(kCommand) = al; + data.byte(kObjecttype) = 4; + removeobfrominv(); + al = 'W'; + ah = 'E'; + cl = 'T'; + ch = 'B'; + findexobject(); + data.byte(kCommand) = al; + data.byte(kObjecttype) = 4; + removeobfrominv(); + makemainscreen(); + al = 48; + bl = 68-32; + bh = 54+64; + cx = 70; + dx = 10; + setuptimeduse(); + data.byte(kBeenmugged) = 1; + bx = pop(); + es = pop(); +} + +void DreamGenContext::aide() { + STACK_CHECK; + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::businessman() { + STACK_CHECK; + data.byte(kPointermode) = 0; + data.word(kWatchingtime) = 2; + ax = es.word(bx+3); + _cmp(ax, 2); + if (!flags.z()) + goto notfirstbiz; + push(ax); + push(bx); + push(es); + al = 49; + cx = 30; + dx = 1; + bl = 68; + bh = 174; + setuptimeduse(); + es = pop(); + bx = pop(); + ax = pop(); +notfirstbiz: + _cmp(ax, 95); + if (flags.z()) + goto buscombatwonend; + _cmp(ax, 49); + if (flags.z()) + return /* (buscombatend) */; + checkspeed(); + if (!flags.z()) + goto busspeed; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 48); + if (!flags.z()) + goto notbeforedeadb; + data.byte(kMandead) = 2; + goto gotbusframe; +notbeforedeadb: + _cmp(ax, 15); + if (!flags.z()) + goto buscombatwon; + _dec(ax); + _cmp(data.byte(kLastweapon), 3); + if (!flags.z()) + goto notshieldonbus; + data.byte(kLastweapon) = -1; + data.byte(kCombatcount) = 0; + ax = 51; + goto gotbusframe; +notshieldonbus: + _inc(data.byte(kCombatcount)); + _cmp(data.byte(kCombatcount), 20); + if (!flags.z()) + goto gotbusframe; + data.byte(kCombatcount) = 0; + ax = 15; + goto gotbusframe; +buscombatwon: + _cmp(ax, 91); + if (!flags.z()) + goto gotbusframe; + push(bx); + push(es); + al = 0; + turnpathon(); + al = 1; + turnpathon(); + al = 2; + turnpathon(); + al = 3; + turnpathoff(); + data.byte(kManspath) = 5; + data.byte(kFinaldest) = 5; + findxyfrompath(); + data.byte(kResetmanxy) = 1; + es = pop(); + bx = pop(); + ax = 92; + goto gotbusframe; +gotbusframe: + es.word(bx+3) = ax; +busspeed: + showgamereel(); + al = data.byte(kMapy); + es.byte(bx+2) = al; + ax = es.word(bx+3); + _cmp(ax, 14); + if (!flags.z()) + return /* (buscombatend) */; + data.word(kWatchingtime) = 0; + data.byte(kPointermode) = 2; + return; +buscombatwonend: + data.byte(kPointermode) = 0; + data.word(kWatchingtime) = 0; +} + +void DreamGenContext::poolguard() { + STACK_CHECK; + ax = es.word(bx+3); + _cmp(ax, 214); + if (flags.z()) + goto combatover2; + _cmp(ax, 258); + if (flags.z()) + goto combatover2; + _cmp(ax, 185); + if (flags.z()) + goto combatover1; + _cmp(ax, 0); + if (!flags.z()) + goto notfirstpool; + al = 0; + turnpathon(); +notfirstpool: + checkspeed(); + if (!flags.z()) + goto guardspeed; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 122); + if (!flags.z()) + goto notendguard1; + _dec(ax); + _cmp(data.byte(kLastweapon), 2); + if (!flags.z()) + goto notaxeonpool; + data.byte(kLastweapon) = -1; + ax = 122; + goto gotguardframe; +notaxeonpool: + _inc(data.byte(kCombatcount)); + _cmp(data.byte(kCombatcount), 40); + if (!flags.z()) + goto gotguardframe; + data.byte(kCombatcount) = 0; + ax = 195; + goto gotguardframe; +notendguard1: + _cmp(ax, 147); + if (!flags.z()) + goto gotguardframe; + _dec(ax); + _cmp(data.byte(kLastweapon), 1); + if (!flags.z()) + goto notgunonpool; + data.byte(kLastweapon) = -1; + ax = 147; + goto gotguardframe; +notgunonpool: + _inc(data.byte(kCombatcount)); + _cmp(data.byte(kCombatcount), 40); + if (!flags.z()) + goto gotguardframe; + data.byte(kCombatcount) = 0; + ax = 220; +gotguardframe: + es.word(bx+3) = ax; +guardspeed: + showgamereel(); + ax = es.word(bx+3); + _cmp(ax, 121); + if (flags.z()) + goto iswaitingpool; + _cmp(ax, 146); + if (flags.z()) + goto iswaitingpool; + data.byte(kPointermode) = 0; + data.word(kWatchingtime) = 2; + return; +iswaitingpool: + data.byte(kPointermode) = 2; + data.word(kWatchingtime) = 0; + return; +combatover1: + data.word(kWatchingtime) = 0; + data.byte(kPointermode) = 0; + al = 0; + turnpathon(); + al = 1; + turnpathoff(); + return; +combatover2: + showgamereel(); + data.word(kWatchingtime) = 2; + data.byte(kPointermode) = 0; + _inc(data.byte(kCombatcount)); + _cmp(data.byte(kCombatcount), 100); + if (flags.c()) + return /* (doneover2) */; + data.word(kWatchingtime) = 0; + data.byte(kMandead) = 2; +} + +void DreamGenContext::security() { + STACK_CHECK; + _cmp(es.word(bx+3), 32); + if (flags.z()) + goto securwait; + _cmp(es.word(bx+3), 69); + if (!flags.z()) + goto notaftersec; + return; +notaftersec: + data.word(kWatchingtime) = 10; + checkspeed(); + if (!flags.z()) + goto gotsecurframe; + _inc(es.word(bx+3)); + goto gotsecurframe; +securwait: + _cmp(data.byte(kLastweapon), 1); + if (!flags.z()) + goto gotsecurframe; + data.word(kWatchingtime) = 10; + _cmp(data.byte(kManspath), 9); + if (!flags.z()) + goto gotsecurframe; + _cmp(data.byte(kFacing), 0); + if (!flags.z()) + goto gotsecurframe; + data.byte(kLastweapon) = -1; + _inc(es.word(bx+3)); +gotsecurframe: + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::heavy() { + STACK_CHECK; + al = es.byte(bx+7); + _and(al, 127); + es.byte(bx+7) = al; + _cmp(es.word(bx+3), 43); + if (flags.z()) + goto heavywait; + data.word(kWatchingtime) = 10; + _cmp(es.word(bx+3), 70); + if (!flags.z()) + goto notafterhshot; + _inc(data.byte(kCombatcount)); + _cmp(data.byte(kCombatcount), 80); + if (!flags.z()) + goto gotheavyframe; + data.byte(kMandead) = 2; + goto gotheavyframe; +notafterhshot: + checkspeed(); + if (!flags.z()) + goto gotheavyframe; + _inc(es.word(bx+3)); + goto gotheavyframe; +heavywait: + _cmp(data.byte(kLastweapon), 1); + if (!flags.z()) + goto gotheavyframe; + _cmp(data.byte(kManspath), 5); + if (!flags.z()) + goto gotheavyframe; + _cmp(data.byte(kFacing), 4); + if (!flags.z()) + goto gotheavyframe; + data.byte(kLastweapon) = -1; + _inc(es.word(bx+3)); + data.byte(kCombatcount) = 0; +gotheavyframe: + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::bossman() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto notboss; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 4); + if (flags.z()) + goto firstdes; + _cmp(ax, 20); + if (flags.z()) + goto secdes; + _cmp(ax, 41); + if (!flags.z()) + goto gotallboss; + ax = 0; + _inc(data.byte(kGunpassflag)); + es.byte(bx+7) = 10; + goto gotallboss; +firstdes: + _cmp(data.byte(kGunpassflag), 1); + if (flags.z()) + goto gotallboss; + push(ax); + randomnumber(); + cl = al; + ax = pop(); + _cmp(cl, 10); + if (flags.c()) + goto gotallboss; + ax = 0; + goto gotallboss; +secdes: + _cmp(data.byte(kGunpassflag), 1); + if (flags.z()) + goto gotallboss; + ax = 0; +gotallboss: + es.word(bx+3) = ax; +notboss: + showgamereel(); + addtopeoplelist(); + al = es.byte(bx+7); + _and(al, 128); + if (flags.z()) + return /* (nottalkedboss) */; + data.byte(kTalkedtoboss) = 1; +} + +void DreamGenContext::gamer() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto gamerfin; +gameragain: + randomnum1(); + _and(al, 7); + _cmp(al, 5); + if (!flags.c()) + goto gameragain; + _add(al, 20); + _cmp(al, es.byte(bx+3)); + if (flags.z()) + goto gameragain; + ah = 0; + es.word(bx+3) = ax; +gamerfin: + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::sparkydrip() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + return /* (cantdrip) */; + al = 14; + ah = 0; + playchannel0(); +} + +void DreamGenContext::carparkdrip() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + return /* (cantdrip2) */; + al = 14; + playchannel1(); +} + +void DreamGenContext::keeper() { + STACK_CHECK; + _cmp(data.byte(kKeeperflag), 0); + if (!flags.z()) + goto notwaiting; + _cmp(data.word(kReeltowatch), 190); + if (flags.c()) + return /* (waiting) */; + _inc(data.byte(kKeeperflag)); + ah = es.byte(bx+7); + _and(ah, 127); + _cmp(ah, data.byte(kDreamnumber)); + if (flags.z()) + return /* (notdiff) */; + al = data.byte(kDreamnumber); + es.byte(bx+7) = al; + return; +notwaiting: + addtopeoplelist(); + showgamereel(); +} + +void DreamGenContext::candles1() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto candle1; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 44); + if (!flags.z()) + goto notendcandle1; + ax = 39; +notendcandle1: + es.word(bx+3) = ax; +candle1: + showgamereel(); +} + +void DreamGenContext::smallcandle() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto smallcandlef; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 37); + if (!flags.z()) + goto notendsmallcandle; + ax = 25; +notendsmallcandle: + es.word(bx+3) = ax; +smallcandlef: + showgamereel(); +} + +void DreamGenContext::intromagic1() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto introm1fin; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 145); + if (!flags.z()) + goto gotintrom1; + ax = 121; +gotintrom1: + es.word(bx+3) = ax; + _cmp(ax, 121); + if (!flags.z()) + goto introm1fin; + _inc(data.byte(kIntrocount)); + push(es); + push(bx); + intro1text(); + bx = pop(); + es = pop(); + _cmp(data.byte(kIntrocount), 8); + if (!flags.z()) + goto introm1fin; + _add(data.byte(kMapy), 10); + data.byte(kNowinnewroom) = 1; +introm1fin: + showgamereel(); +} + +void DreamGenContext::candles() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto candlesfin; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 167); + if (!flags.z()) + goto gotcandles; + ax = 162; +gotcandles: + es.word(bx+3) = ax; +candlesfin: + showgamereel(); +} + +void DreamGenContext::candles2() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto candles2fin; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 238); + if (!flags.z()) + goto gotcandles2; + ax = 233; +gotcandles2: + es.word(bx+3) = ax; +candles2fin: + showgamereel(); +} + +void DreamGenContext::gates() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto gatesfin; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 116); + if (!flags.z()) + goto notbang; + push(ax); + push(bx); + push(es); + al = 17; + playchannel1(); + es = pop(); + bx = pop(); + ax = pop(); +notbang: + _cmp(ax, 110); + if (flags.c()) + goto slowgates; + es.byte(bx+5) = 2; +slowgates: + _cmp(ax, 120); + if (!flags.z()) + goto gotgates; + data.byte(kGetback) = 1; + ax = 119; +gotgates: + es.word(bx+3) = ax; + push(es); + push(bx); + intro3text(); + bx = pop(); + es = pop(); +gatesfin: + showgamereel(); +} + +void DreamGenContext::intromagic2() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto introm2fin; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 216); + if (!flags.z()) + goto gotintrom2; + ax = 192; +gotintrom2: + es.word(bx+3) = ax; +introm2fin: + showgamereel(); +} + +void DreamGenContext::intromagic3() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto introm3fin; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 218); + if (!flags.z()) + goto gotintrom3; + data.byte(kGetback) = 1; +gotintrom3: + es.word(bx+3) = ax; +introm3fin: + showgamereel(); + al = data.byte(kMapx); + es.byte(bx+1) = al; +} + +void DreamGenContext::intromonks1() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto intromonk1fin; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 80); + if (!flags.z()) + goto notendmonk1; + _add(data.byte(kMapy), 10); + data.byte(kNowinnewroom) = 1; + showgamereel(); + return; +notendmonk1: + _cmp(ax, 30); + if (!flags.z()) + goto gotintromonk1; + _sub(data.byte(kMapy), 10); + data.byte(kNowinnewroom) = 1; + ax = 51; +gotintromonk1: + es.word(bx+3) = ax; + _cmp(ax, 5); + if (flags.z()) + goto waitstep; + _cmp(ax, 15); + if (flags.z()) + goto waitstep; + _cmp(ax, 25); + if (flags.z()) + goto waitstep; + _cmp(ax, 61); + if (flags.z()) + goto waitstep; + _cmp(ax, 71); + if (flags.z()) + goto waitstep; + goto intromonk1fin; +waitstep: + push(es); + push(bx); + intro2text(); + bx = pop(); + es = pop(); + es.byte(bx+6) = -20; +intromonk1fin: + showgamereel(); + al = data.byte(kMapy); + es.byte(bx+2) = al; +} + +void DreamGenContext::intromonks2() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto intromonk2fin; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 87); + if (!flags.z()) + goto nottalk1; + _inc(data.byte(kIntrocount)); + push(es); + push(bx); + monks2text(); + bx = pop(); + es = pop(); + _cmp(data.byte(kIntrocount), 19); + if (!flags.z()) + goto notlasttalk1; + ax = 87; + goto gotintromonk2; +notlasttalk1: + ax = 74; + goto gotintromonk2; +nottalk1: + _cmp(ax, 110); + if (!flags.z()) + goto notraisearm; + _inc(data.byte(kIntrocount)); + push(es); + push(bx); + monks2text(); + bx = pop(); + es = pop(); + _cmp(data.byte(kIntrocount), 35); + if (!flags.z()) + goto notlastraise; + ax = 111; + goto gotintromonk2; +notlastraise: + ax = 98; + goto gotintromonk2; +notraisearm: + _cmp(ax, 176); + if (!flags.z()) + goto notendmonk2; + data.byte(kGetback) = 1; + goto gotintromonk2; +notendmonk2: + _cmp(ax, 125); + if (!flags.z()) + goto gotintromonk2; + ax = 140; +gotintromonk2: + es.word(bx+3) = ax; +intromonk2fin: + showgamereel(); +} + +void DreamGenContext::handclap() { + STACK_CHECK; +} + +void DreamGenContext::monks2text() { + STACK_CHECK; + _cmp(data.byte(kIntrocount), 1); + if (!flags.z()) + goto notmonk2text1; + al = 8; + bl = 36; + bh = 160; + cx = 100; + goto gotmonks2text; +notmonk2text1: + _cmp(data.byte(kIntrocount), 4); + if (!flags.z()) + goto notmonk2text2; + al = 9; + bl = 36; + bh = 160; + cx = 100; + goto gotmonks2text; +notmonk2text2: + _cmp(data.byte(kIntrocount), 7); + if (!flags.z()) + goto notmonk2text3; + al = 10; + bl = 36; + bh = 160; + cx = 100; + goto gotmonks2text; +notmonk2text3: + _cmp(data.byte(kIntrocount), 10); + if (!flags.z()) + goto notmonk2text4; + data.byte(kIntrocount) = 12; + al = 11; + bl = 0; + bh = 105; + cx = 100; + goto gotmonks2text; +notmonk2text4: + _cmp(data.byte(kIntrocount), 13); + if (!flags.z()) + goto notmonk2text5; + data.byte(kIntrocount) = 17; + return; + al = 12; + bl = 0; + bh = 120; + cx = 100; + goto gotmonks2text; +notmonk2text5: + _cmp(data.byte(kIntrocount), 16); + if (!flags.z()) + goto notmonk2text6; + al = 13; + bl = 0; + bh = 135; + cx = 100; + goto gotmonks2text; +notmonk2text6: + _cmp(data.byte(kIntrocount), 19); + if (!flags.z()) + goto notmonk2text7; + al = 14; + bl = 36; + bh = 160; + cx = 100; + dx = 1; + ah = 82; + { setuptimedtemp(); return; }; +notmonk2text7: + _cmp(data.byte(kIntrocount), 22); + if (!flags.z()) + goto notmonk2text8; + al = 15; + bl = 36; + bh = 160; + cx = 100; + goto gotmonks2text; +notmonk2text8: + _cmp(data.byte(kIntrocount), 25); + if (!flags.z()) + goto notmonk2text9; + al = 16; + bl = 36; + bh = 160; + cx = 100; + goto gotmonks2text; +notmonk2text9: + _cmp(data.byte(kIntrocount), 27); + if (!flags.z()) + goto notmonk2text10; + al = 17; + bl = 36; + bh = 160; + cx = 100; + goto gotmonks2text; +notmonk2text10: + _cmp(data.byte(kIntrocount), 31); + if (!flags.z()) + return /* (notmonk2text11) */; + al = 18; + bl = 36; + bh = 160; + cx = 100; + goto gotmonks2text; + return; +gotmonks2text: + dx = 1; + cx = 120; + ah = 82; + setuptimedtemp(); +} + +void DreamGenContext::intro1text() { + STACK_CHECK; + _cmp(data.byte(kIntrocount), 2); + if (!flags.z()) + goto notintro1text1; + al = 40; + bl = 34; + bh = 130; + cx = 90; + goto gotintro1text; +notintro1text1: + _cmp(data.byte(kIntrocount), 4); + if (!flags.z()) + goto notintro1text2; + al = 41; + bl = 34; + bh = 130; + cx = 90; + goto gotintro1text; +notintro1text2: + _cmp(data.byte(kIntrocount), 6); + if (!flags.z()) + return /* (notintro1text3) */; + al = 42; + bl = 34; + bh = 130; + cx = 90; + goto gotintro1text; + return; +gotintro1text: + dx = 1; + ah = 82; + _cmp(data.byte(kCh1playing), 255); + if (flags.z()) + goto oktalk2; + _dec(data.byte(kIntrocount)); + return; +oktalk2: + setuptimedtemp(); +} + +void DreamGenContext::intro2text() { + STACK_CHECK; + _cmp(ax, 5); + if (!flags.z()) + goto notintro2text1; + al = 43; + bl = 34; + bh = 40; + cx = 90; + goto gotintro2text; +notintro2text1: + _cmp(ax, 15); + if (!flags.z()) + return /* (notintro2text2) */; + al = 44; + bl = 34; + bh = 40; + cx = 90; + goto gotintro2text; + return; +gotintro2text: + dx = 1; + ah = 82; + setuptimedtemp(); +} + +void DreamGenContext::intro3text() { + STACK_CHECK; + _cmp(ax, 107); + if (!flags.z()) + goto notintro3text1; + al = 45; + bl = 36; + bh = 56; + cx = 100; + goto gotintro3text; +notintro3text1: + _cmp(ax, 108); + if (!flags.z()) + return /* (notintro3text2) */; + al = 46; + bl = 36; + bh = 56; + cx = 100; + goto gotintro3text; + return; +gotintro3text: + dx = 1; + ah = 82; + setuptimedtemp(); +} + +void DreamGenContext::monkandryan() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto notmonkryan; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 83); + if (!flags.z()) + goto gotmonkryan; + _inc(data.byte(kIntrocount)); + push(es); + push(bx); + textformonk(); + bx = pop(); + es = pop(); + ax = 77; + _cmp(data.byte(kIntrocount), 57); + if (!flags.z()) + goto gotmonkryan; + data.byte(kGetback) = 1; + return; +gotmonkryan: + es.word(bx+3) = ax; +notmonkryan: + showgamereel(); +} + +void DreamGenContext::endgameseq() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto notendseq; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 51); + if (!flags.z()) + goto gotendseq; + _cmp(data.byte(kIntrocount), 140); + if (flags.z()) + goto gotendseq; + _inc(data.byte(kIntrocount)); + push(es); + push(bx); + textforend(); + bx = pop(); + es = pop(); + ax = 50; +gotendseq: + es.word(bx+3) = ax; + _cmp(ax, 134); + if (!flags.z()) + goto notfadedown; + push(es); + push(bx); + push(ax); + fadescreendownhalf(); + ax = pop(); + bx = pop(); + es = pop(); + goto notendseq; +notfadedown: + _cmp(ax, 324); + if (!flags.z()) + goto notfadeend; + push(es); + push(bx); + push(ax); + fadescreendowns(); + data.byte(kVolumeto) = 7; + data.byte(kVolumedirection) = 1; + ax = pop(); + bx = pop(); + es = pop(); +notfadeend: + _cmp(ax, 340); + if (!flags.z()) + goto notendseq; + data.byte(kGetback) = 1; +notendseq: + showgamereel(); + al = data.byte(kMapy); + es.byte(bx+2) = al; + ax = es.word(bx+3); + _cmp(ax, 145); + if (!flags.z()) + return /* (notendcreds) */; + es.word(bx+3) = 146; + rollendcredits(); +} + +void DreamGenContext::rollendcredits() { + STACK_CHECK; + al = 16; + ah = 255; + playchannel0(); + data.byte(kVolume) = 7; + data.byte(kVolumeto) = 0; + data.byte(kVolumedirection) = -1; + cl = 160; + ch = 160; + di = 75; + bx = 20; + ds = data.word(kMapstore); + si = 0; + multiget(); + es = data.word(kTextfile1); + si = 3*2; + ax = es.word(si); + si = ax; + _add(si, (66*2)); + cx = 254; +endcredits1: + push(cx); + bx = 10; + cx = data.word(kLinespacing); +endcredits2: + push(cx); + push(si); + push(di); + push(es); + push(bx); + vsync(); + cl = 160; + ch = 160; + di = 75; + bx = 20; + ds = data.word(kMapstore); + si = 0; + multiput(); + vsync(); + bx = pop(); + es = pop(); + di = pop(); + si = pop(); + push(si); + push(di); + push(es); + push(bx); + cx = 18; +onelot: + push(cx); + di = 75; + dx = 161; + ax = 0; + printdirect(); + _add(bx, data.word(kLinespacing)); + cx = pop(); + if (--cx) + goto onelot; + vsync(); + cl = 160; + ch = 160; + di = 75; + bx = 20; + multidump(); + bx = pop(); + es = pop(); + di = pop(); + si = pop(); + cx = pop(); + _dec(bx); + if (--cx) + goto endcredits2; + cx = pop(); +looknext: + al = es.byte(si); + _inc(si); + _cmp(al, ':'); + if (flags.z()) + goto gotnext; + _cmp(al, 0); + if (flags.z()) + goto gotnext; + goto looknext; +gotnext: + if (--cx) + goto endcredits1; + cx = 100; + hangon(); + paneltomap(); + fadescreenuphalf(); +} + +void DreamGenContext::priest() { + STACK_CHECK; + _cmp(es.word(bx+3), 8); + if (flags.z()) + return /* (priestspoken) */; + data.byte(kPointermode) = 0; + data.word(kWatchingtime) = 2; + checkspeed(); + if (!flags.z()) + return /* (priestwait) */; + _inc(es.word(bx+3)); + push(es); + push(bx); + priesttext(); + bx = pop(); + es = pop(); +} + +void DreamGenContext::madmanstelly() { + STACK_CHECK; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 307); + if (!flags.z()) + goto notendtelly; + ax = 300; +notendtelly: + es.word(bx+3) = ax; + showgamereel(); +} + +void DreamGenContext::madman() { + STACK_CHECK; + data.word(kWatchingtime) = 2; + checkspeed(); + if (!flags.z()) + goto nomadspeed; + ax = es.word(bx+3); + _cmp(ax, 364); + if (!flags.c()) + goto ryansded; + _cmp(ax, 10); + if (!flags.z()) + goto notfirstmad; + push(es); + push(bx); + push(ax); + dx = 2247; + loadtemptext(); + ax = pop(); + bx = pop(); + es = pop(); + data.byte(kCombatcount) = -1; + data.byte(kSpeechcount) = 0; +notfirstmad: + _inc(ax); + _cmp(ax, 294); + if (flags.z()) + goto madmanspoken; + _cmp(ax, 66); + if (!flags.z()) + goto nomadspeak; + _inc(data.byte(kCombatcount)); + push(es); + push(bx); + madmantext(); + bx = pop(); + es = pop(); + ax = 53; + _cmp(data.byte(kCombatcount), 64); + if (flags.c()) + goto nomadspeak; + _cmp(data.byte(kCombatcount), 70); + if (flags.z()) + goto killryan; + _cmp(data.byte(kLastweapon), 8); + if (!flags.z()) + goto nomadspeak; + data.byte(kCombatcount) = 72; + data.byte(kLastweapon) = -1; + data.byte(kMadmanflag) = 1; + ax = 67; + goto nomadspeak; +killryan: + ax = 310; +nomadspeak: + es.word(bx+3) = ax; +nomadspeed: + showgamereel(); + al = data.byte(kMapx); + es.byte(bx+1) = al; + madmode(); + return; +madmanspoken: + _cmp(data.byte(kWongame), 1); + if (flags.z()) + return /* (alreadywon) */; + data.byte(kWongame) = 1; + push(es); + push(bx); + getridoftemptext(); + bx = pop(); + es = pop(); + return; +ryansded: + data.byte(kMandead) = 2; + showgamereel(); +} + +void DreamGenContext::madmantext() { + STACK_CHECK; + _cmp(data.byte(kSpeechcount), 63); + if (!flags.c()) + return /* (nomadtext) */; + _cmp(data.byte(kCh1playing), 255); + if (!flags.z()) + return /* (nomadtext) */; + al = data.byte(kSpeechcount); + _inc(data.byte(kSpeechcount)); + _add(al, 47); + bl = 72; + bh = 80; + cx = 90; + dx = 1; + ah = 82; + setuptimedtemp(); +} + +void DreamGenContext::madmode() { + STACK_CHECK; + data.word(kWatchingtime) = 2; + data.byte(kPointermode) = 0; + _cmp(data.byte(kCombatcount), 65); + if (flags.c()) + return /* (iswatchmad) */; + _cmp(data.byte(kCombatcount), 70); + if (!flags.c()) + return /* (iswatchmad) */; + data.byte(kPointermode) = 2; +} + +void DreamGenContext::priesttext() { + STACK_CHECK; + _cmp(es.word(bx+3), 2); + if (flags.c()) + return /* (nopriesttext) */; + _cmp(es.word(bx+3), 7); + if (!flags.c()) + return /* (nopriesttext) */; + al = es.byte(bx+3); + _and(al, 1); + if (!flags.z()) + return /* (nopriesttext) */; + al = es.byte(bx+3); + _shr(al, 1); + _add(al, 50); + bl = 72; + bh = 80; + cx = 54; + dx = 1; + setuptimeduse(); +} + +void DreamGenContext::textforend() { + STACK_CHECK; + _cmp(data.byte(kIntrocount), 20); + if (!flags.z()) + goto notendtext1; + al = 0; + bl = 34; + bh = 20; + cx = 60; + goto gotendtext; +notendtext1: + _cmp(data.byte(kIntrocount), 50); + if (!flags.z()) + goto notendtext2; + al = 1; + bl = 34; + bh = 20; + cx = 60; + goto gotendtext; +notendtext2: + _cmp(data.byte(kIntrocount), 85); + if (!flags.z()) + return /* (notendtext3) */; + al = 2; + bl = 34; + bh = 20; + cx = 60; + goto gotendtext; + return; +gotendtext: + dx = 1; + ah = 83; + setuptimedtemp(); +} + +void DreamGenContext::textformonk() { + STACK_CHECK; + _cmp(data.byte(kIntrocount), 1); + if (!flags.z()) + goto notmonktext1; + al = 19; + bl = 68; + bh = 154; + cx = 120; + goto gotmonktext; +notmonktext1: + _cmp(data.byte(kIntrocount), 5); + if (!flags.z()) + goto notmonktext2; + al = 20; + bl = 68; + bh = 38; + cx = 120; + goto gotmonktext; +notmonktext2: + _cmp(data.byte(kIntrocount), 9); + if (!flags.z()) + goto notmonktext3; + al = 21; + bl = 48; + bh = 154; + cx = 120; + goto gotmonktext; +notmonktext3: + _cmp(data.byte(kIntrocount), 13); + if (!flags.z()) + goto notmonktext4; + al = 22; + bl = 68; + bh = 38; + cx = 120; + goto gotmonktext; +notmonktext4: + _cmp(data.byte(kIntrocount), 15); + if (!flags.z()) + goto notmonktext5; + al = 23; + bl = 68; + bh = 154; + cx = 120; + goto gotmonktext; +notmonktext5: + _cmp(data.byte(kIntrocount), 21); + if (!flags.z()) + goto notmonktext6; + al = 24; + bl = 68; + bh = 38; + cx = 120; + goto gotmonktext; +notmonktext6: + _cmp(data.byte(kIntrocount), 25); + if (!flags.z()) + goto notmonktext7; + al = 25; + bl = 68; + bh = 154; + cx = 120; + goto gotmonktext; +notmonktext7: + _cmp(data.byte(kIntrocount), 29); + if (!flags.z()) + goto notmonktext8; + al = 26; + bl = 68; + bh = 38; + cx = 120; + goto gotmonktext; +notmonktext8: + _cmp(data.byte(kIntrocount), 33); + if (!flags.z()) + goto notmonktext9; + al = 27; + bl = 68; + bh = 154; + cx = 120; + goto gotmonktext; +notmonktext9: + _cmp(data.byte(kIntrocount), 37); + if (!flags.z()) + goto notmonktext10; + al = 28; + bl = 68; + bh = 154; + cx = 120; + goto gotmonktext; +notmonktext10: + _cmp(data.byte(kIntrocount), 41); + if (!flags.z()) + goto notmonktext11; + al = 29; + bl = 68; + bh = 38; + cx = 120; + goto gotmonktext; +notmonktext11: + _cmp(data.byte(kIntrocount), 45); + if (!flags.z()) + goto notmonktext12; + al = 30; + bl = 68; + bh = 154; + cx = 120; + goto gotmonktext; +notmonktext12: + _cmp(data.byte(kIntrocount), 52); + if (!flags.z()) + goto notmonktext13; + al = 31; + bl = 68; + bh = 154; + cx = 220; + goto gotmonktext; +notmonktext13: + _cmp(data.byte(kIntrocount), 53); + if (!flags.z()) + return /* (notendtitles) */; + fadescreendowns(); + data.byte(kVolumeto) = 7; + data.byte(kVolumedirection) = 1; + return; +gotmonktext: + dx = 1; + ah = 82; + _cmp(data.byte(kCh1playing), 255); + if (flags.z()) + goto oktalk; + _dec(data.byte(kIntrocount)); + return; +oktalk: + setuptimedtemp(); +} + +void DreamGenContext::drunk() { + STACK_CHECK; + _cmp(data.byte(kGeneraldead), 0); + if (!flags.z()) + return /* (trampgone) */; + al = es.byte(bx+7); + _and(al, 127); + es.byte(bx+7) = al; + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::advisor() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto noadvisor; + goto noadvisor; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 123); + if (!flags.z()) + goto notendadvis; + ax = 106; + goto gotadvframe; +notendadvis: + _cmp(ax, 108); + if (!flags.z()) + goto gotadvframe; + push(ax); + randomnumber(); + cl = al; + ax = pop(); + _cmp(cl, 3); + if (flags.c()) + goto gotadvframe; + ax = 106; +gotadvframe: + es.word(bx+3) = ax; +noadvisor: + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::copper() { + STACK_CHECK; + checkspeed(); + if (!flags.z()) + goto nocopper; + ax = es.word(bx+3); + _inc(ax); + _cmp(ax, 94); + if (!flags.z()) + goto notendcopper; + ax = 64; + goto gotcopframe; +notendcopper: + _cmp(ax, 81); + if (flags.z()) + goto mightwait; + _cmp(ax, 66); + if (!flags.z()) + goto gotcopframe; +mightwait: + push(ax); + randomnumber(); + cl = al; + ax = pop(); + _cmp(cl, 7); + if (flags.c()) + goto gotcopframe; + _dec(ax); +gotcopframe: + es.word(bx+3) = ax; +nocopper: + showgamereel(); + addtopeoplelist(); +} + +void DreamGenContext::sparky() { + STACK_CHECK; + _cmp(data.word(kCard1money), 0); + if (flags.z()) + goto animsparky; + es.byte(bx+7) = 3; + goto animsparky; +animsparky: + checkspeed(); + if (!flags.z()) + goto finishsparky; + _cmp(es.word(bx+3), 34); + if (!flags.z()) + goto notsparky1; + randomnumber(); + _cmp(al, 30); + if (flags.c()) + goto dosparky; + es.word(bx+3) = 27; + goto finishsparky; +notsparky1: + _cmp(es.word(bx+3), 48); + if (!flags.z()) + goto dosparky; + es.word(bx+3) = 27; + goto finishsparky; +dosparky: + _inc(es.word(bx+3)); +finishsparky: + showgamereel(); + addtopeoplelist(); + al = es.byte(bx+7); + _and(al, 128); + if (flags.z()) + return /* (nottalkedsparky) */; + data.byte(kTalkedtosparky) = 1; +} + +void DreamGenContext::train() { + STACK_CHECK; + return; + ax = es.word(bx+3); + _cmp(ax, 21); + if (!flags.c()) + goto notrainyet; + _inc(ax); + goto gottrainframe; +notrainyet: + randomnumber(); + _cmp(al, 253); + if (flags.c()) + return /* (notrainatall) */; + _cmp(data.byte(kManspath), 5); + if (!flags.z()) + return /* (notrainatall) */; + _cmp(data.byte(kFinaldest), 5); + if (!flags.z()) + return /* (notrainatall) */; + ax = 5; +gottrainframe: + es.word(bx+3) = ax; + showgamereel(); +} + +void DreamGenContext::addtopeoplelist() { + STACK_CHECK; + push(es); + push(bx); + push(bx); + cl = es.byte(bx+7); + ax = es.word(bx+3); + bx = data.word(kListpos); + es = data.word(kBuffers); + es.word(bx) = ax; + ax = pop(); + es.word(bx+2) = ax; + es.byte(bx+4) = cl; + bx = pop(); + es = pop(); + _add(data.word(kListpos), 5); +} + +void DreamGenContext::showgamereel() { + STACK_CHECK; + ax = es.word(bx+3); + _cmp(ax, 512); + if (!flags.c()) + return /* (noshow) */; + data.word(kReelpointer) = ax; + push(es); + push(bx); + plotreel(); + bx = pop(); + es = pop(); + ax = data.word(kReelpointer); + es.word(bx+3) = ax; +} + +void DreamGenContext::checkspeed() { + STACK_CHECK; + _cmp(data.byte(kLastweapon), -1); + if (!flags.z()) + goto forcenext; + _inc(es.byte(bx+6)); + al = es.byte(bx+6); + _cmp(al, es.byte(bx+5)); + if (!flags.z()) + return /* (notspeed) */; + al = 0; + es.byte(bx+6) = al; + _cmp(al, al); + return; +forcenext: + _cmp(al, al); +} + +void DreamGenContext::clearsprites() { + STACK_CHECK; + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768); + al = 255; + cx = (32)*16; + _stosb(cx, true); +} + +void DreamGenContext::makesprite() { + STACK_CHECK; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768); +_tmp17: + _cmp(es.byte(bx+15), 255); + if (flags.z()) + goto _tmp17a; + _add(bx, (32)); + goto _tmp17; +_tmp17a: + es.word(bx) = cx; + es.word(bx+10) = si; + es.word(bx+6) = dx; + es.word(bx+8) = di; + es.word(bx+2) = 0x0ffff; + es.byte(bx+15) = 0; + es.byte(bx+18) = 0; +} + +void DreamGenContext::delsprite() { + STACK_CHECK; + di = bx; + cx = (32); + al = 255; + _stosb(cx, true); +} + +void DreamGenContext::spriteupdate() { + STACK_CHECK; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768); + al = data.byte(kRyanon); + es.byte(bx+31) = al; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768); + cx = 16; +_tmp18: + push(cx); + push(bx); + ax = es.word(bx); + _cmp(ax, 0x0ffff); + if (flags.z()) + goto _tmp18a; + push(es); + push(ds); + cx = es.word(bx+2); + es.word(bx+24) = cx; + __dispatch_call(ax); + ds = pop(); + es = pop(); +_tmp18a: + bx = pop(); + cx = pop(); + _cmp(data.byte(kNowinnewroom), 1); + if (flags.z()) + return /* ($18b) */; + _add(bx, (32)); + if (--cx) + goto _tmp18; +} + +void DreamGenContext::printsprites() { + STACK_CHECK; + es = data.word(kBuffers); + cx = 0; +priorityloop: + push(cx); + data.byte(kPriority) = cl; + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768); + cx = 16; +prtspriteloop: + push(cx); + push(bx); + ax = es.word(bx); + _cmp(ax, 0x0ffff); + if (flags.z()) + goto skipsprite; + al = data.byte(kPriority); + _cmp(al, es.byte(bx+23)); + if (!flags.z()) + goto skipsprite; + _cmp(es.byte(bx+31), 1); + if (flags.z()) + goto skipsprite; + printasprite(); +skipsprite: + bx = pop(); + cx = pop(); + _add(bx, (32)); + if (--cx) + goto prtspriteloop; + cx = pop(); + _inc(cx); + _cmp(cx, 7); + if (!flags.z()) + goto priorityloop; +} + +void DreamGenContext::printasprite() { + STACK_CHECK; + push(es); + push(bx); + si = bx; + ds = es.word(si+6); + al = es.byte(si+11); + ah = 0; + _cmp(al, 220); + if (flags.c()) + goto notnegative1; + ah = 255; +notnegative1: + bx = ax; + _add(bx, data.word(kMapady)); + al = es.byte(si+10); + ah = 0; + _cmp(al, 220); + if (flags.c()) + goto notnegative2; + ah = 255; +notnegative2: + di = ax; + _add(di, data.word(kMapadx)); + al = es.byte(si+15); + ah = 0; + _cmp(es.byte(si+30), 0); + if (flags.z()) + goto steadyframe; + ah = 8; +steadyframe: + _cmp(data.byte(kPriority), 6); + if (!flags.z()) + goto notquickp; +notquickp: + showframe(); + bx = pop(); + es = pop(); +} + +void DreamGenContext::checkone() { + STACK_CHECK; + push(cx); + al = ch; + ah = 0; + cl = 4; + _shr(ax, cl); + dl = al; + cx = pop(); + al = cl; + ah = 0; + cl = 4; + _shr(ax, cl); + ah = dl; + push(ax); + ch = 0; + cl = al; + push(cx); + al = ah; + ah = 0; + cx = 11; + _mul(cx); + cx = pop(); + _add(ax, cx); + cx = 3; + _mul(cx); + si = ax; + ds = data.word(kBuffers); + _add(si, (0+(180*10)+32+60+(32*32))); + _lodsw(); + cx = ax; + _lodsb(); + dx = pop(); +} + +void DreamGenContext::findsource() { + STACK_CHECK; + ax = data.word(kCurrentframe); + _cmp(ax, 160); + if (!flags.c()) + goto over1000; + ds = data.word(kReel1); + data.word(kTakeoff) = 0; + return; +over1000: + _cmp(ax, 320); + if (!flags.c()) + goto over1001; + ds = data.word(kReel2); + data.word(kTakeoff) = 160; + return; +over1001: + ds = data.word(kReel3); + data.word(kTakeoff) = 320; +} + +void DreamGenContext::initman() { + STACK_CHECK; + al = data.byte(kRyanx); + ah = data.byte(kRyany); + si = ax; + cx = 49464; + dx = data.word(kMainsprites); + di = 0; + makesprite(); + es.byte(bx+23) = 4; + es.byte(bx+22) = 0; + es.byte(bx+29) = 0; +} + +void DreamGenContext::mainman() { + STACK_CHECK; + _cmp(data.byte(kResetmanxy), 1); + if (!flags.z()) + goto notinnewroom; + data.byte(kResetmanxy) = 0; + al = data.byte(kRyanx); + ah = data.byte(kRyany); + es.word(bx+10) = ax; + es.byte(bx+29) = 0; + goto executewalk; +notinnewroom: + _dec(es.byte(bx+22)); + _cmp(es.byte(bx+22), -1); + if (flags.z()) + goto executewalk; + return; +executewalk: + es.byte(bx+22) = 0; + al = data.byte(kTurntoface); + _cmp(al, data.byte(kFacing)); + if (flags.z()) + goto facingok; + aboutturn(); + goto notwalk; +facingok: + _cmp(data.byte(kTurndirection), 0); + if (flags.z()) + goto alreadyturned; + _cmp(data.byte(kLinepointer), 254); + if (!flags.z()) + goto alreadyturned; + data.byte(kReasseschanges) = 1; + al = data.byte(kFacing); + _cmp(al, data.byte(kLeavedirection)); + if (!flags.z()) + goto alreadyturned; + checkforexit(); +alreadyturned: + data.byte(kTurndirection) = 0; + _cmp(data.byte(kLinepointer), 254); + if (!flags.z()) + goto walkman; + es.byte(bx+29) = 0; + goto notwalk; +walkman: + al = es.byte(bx+29); + _inc(al); + _cmp(al, 11); + if (!flags.z()) + goto notanimend1; + al = 1; +notanimend1: + es.byte(bx+29) = al; + walking(); + _cmp(data.byte(kLinepointer), 254); + if (flags.z()) + goto afterwalk; + al = data.byte(kFacing); + _and(al, 1); + if (flags.z()) + goto isdouble; + al = es.byte(bx+29); + _cmp(al, 2); + if (flags.z()) + goto afterwalk; + _cmp(al, 7); + if (flags.z()) + goto afterwalk; +isdouble: + walking(); +afterwalk: + _cmp(data.byte(kLinepointer), 254); + if (!flags.z()) + goto notwalk; + al = data.byte(kTurntoface); + _cmp(al, data.byte(kFacing)); + if (!flags.z()) + goto notwalk; + data.byte(kReasseschanges) = 1; + al = data.byte(kFacing); + _cmp(al, data.byte(kLeavedirection)); + if (!flags.z()) + goto notwalk; + checkforexit(); +notwalk: + al = data.byte(kFacing); + ah = 0; + di = 1105; + _add(di, ax); + al = cs.byte(di); + _add(al, es.byte(bx+29)); + es.byte(bx+15) = al; + ax = es.word(bx+10); + data.byte(kRyanx) = al; + data.byte(kRyany) = ah; +} + +void DreamGenContext::aboutturn() { + STACK_CHECK; + _cmp(data.byte(kTurndirection), 1); + if (flags.z()) + goto incdir; + _cmp(data.byte(kTurndirection), -1); + if (flags.z()) + goto decdir; + al = data.byte(kFacing); + _sub(al, data.byte(kTurntoface)); + if (!flags.c()) + goto higher; + _neg(al); + _cmp(al, 4); + if (!flags.c()) + goto decdir; + goto incdir; +higher: + _cmp(al, 4); + if (!flags.c()) + goto incdir; + goto decdir; +incdir: + data.byte(kTurndirection) = 1; + al = data.byte(kFacing); + _inc(al); + _and(al, 7); + data.byte(kFacing) = al; + es.byte(bx+29) = 0; + return; +decdir: + data.byte(kTurndirection) = -1; + al = data.byte(kFacing); + _dec(al); + _and(al, 7); + data.byte(kFacing) = al; + es.byte(bx+29) = 0; +} + +void DreamGenContext::walking() { + STACK_CHECK; + _cmp(data.byte(kLinedirection), 0); + if (flags.z()) + goto normalwalk; + al = data.byte(kLinepointer); + _dec(al); + data.byte(kLinepointer) = al; + _cmp(al, 200); + if (!flags.c()) + goto endofline; + goto continuewalk; +normalwalk: + al = data.byte(kLinepointer); + _inc(al); + data.byte(kLinepointer) = al; + _cmp(al, data.byte(kLinelength)); + if (!flags.c()) + goto endofline; +continuewalk: + ah = 0; + _add(ax, ax); + push(es); + push(bx); + dx = data; + es = dx; + bx = 8173; + _add(bx, ax); + ax = es.word(bx); + bx = pop(); + es = pop(); + es.word(bx+10) = ax; + return; +endofline: + data.byte(kLinepointer) = 254; + al = data.byte(kDestination); + data.byte(kManspath) = al; + _cmp(al, data.byte(kFinaldest)); + if (flags.z()) + goto finishedwalk; + al = data.byte(kFinaldest); + data.byte(kDestination) = al; + push(es); + push(bx); + autosetwalk(); + bx = pop(); + es = pop(); + return; +finishedwalk: + facerightway(); +} + +void DreamGenContext::facerightway() { + STACK_CHECK; + push(es); + push(bx); + getroomspaths(); + al = data.byte(kManspath); + ah = 0; + _add(ax, ax); + _add(ax, ax); + _add(ax, ax); + _add(bx, ax); + al = es.byte(bx+7); + data.byte(kTurntoface) = al; + data.byte(kLeavedirection) = al; + bx = pop(); + es = pop(); +} + +void DreamGenContext::checkforexit() { + STACK_CHECK; + cl = data.byte(kRyanx); + _add(cl, 12); + ch = data.byte(kRyany); + _add(ch, 12); + checkone(); + data.byte(kLastflag) = cl; + data.byte(kLastflagex) = ch; + data.byte(kFlagx) = dl; + data.byte(kFlagy) = dh; + al = data.byte(kLastflag); + _test(al, 64); + if (flags.z()) + goto notnewdirect; + al = data.byte(kLastflagex); + data.byte(kAutolocation) = al; + return; +notnewdirect: + _test(al, 32); + if (flags.z()) + goto notleave; + push(es); + push(bx); + _cmp(data.byte(kReallocation), 2); + if (!flags.z()) + goto notlouis; + bl = 0; + push(bx); + al = 'W'; + ah = 'E'; + cl = 'T'; + ch = 'A'; + isryanholding(); + bx = pop(); + if (flags.z()) + goto noshoe1; + _inc(bl); +noshoe1: + push(bx); + al = 'W'; + ah = 'E'; + cl = 'T'; + ch = 'B'; + isryanholding(); + bx = pop(); + if (flags.z()) + goto noshoe2; + _inc(bl); +noshoe2: + _cmp(bl, 2); + if (flags.z()) + goto notlouis; + al = 42; + _cmp(bl, 0); + if (flags.z()) + goto notravmessage; + _inc(al); +notravmessage: + cx = 80; + dx = 10; + bl = 68; + bh = 64; + setuptimeduse(); + al = data.byte(kFacing); + _add(al, 4); + _and(al, 7); + data.byte(kTurntoface) = al; + bx = pop(); + es = pop(); + return; +notlouis: + bx = pop(); + es = pop(); + data.byte(kNeedtotravel) = 1; + return; +notleave: + _test(al, 4); + if (flags.z()) + goto notaleft; + adjustleft(); + return; +notaleft: + _test(al, 2); + if (flags.z()) + goto notaright; + adjustright(); + return; +notaright: + _test(al, 8); + if (flags.z()) + goto notadown; + adjustdown(); + return; +notadown: + _test(al, 16); + if (flags.z()) + return /* (notanup) */; + adjustup(); +} + +void DreamGenContext::adjustdown() { + STACK_CHECK; + push(es); + push(bx); + _add(data.byte(kMapy), 10); + al = data.byte(kLastflagex); + cl = 16; + _mul(cl); + es.byte(bx+11) = al; + data.byte(kNowinnewroom) = 1; + bx = pop(); + es = pop(); +} + +void DreamGenContext::adjustup() { + STACK_CHECK; + push(es); + push(bx); + _sub(data.byte(kMapy), 10); + al = data.byte(kLastflagex); + cl = 16; + _mul(cl); + es.byte(bx+11) = al; + data.byte(kNowinnewroom) = 1; + bx = pop(); + es = pop(); +} + +void DreamGenContext::adjustleft() { + STACK_CHECK; + push(es); + push(bx); + data.byte(kLastflag) = 0; + _sub(data.byte(kMapx), 11); + al = data.byte(kLastflagex); + cl = 16; + _mul(cl); + es.byte(bx+10) = al; + data.byte(kNowinnewroom) = 1; + bx = pop(); + es = pop(); +} + +void DreamGenContext::adjustright() { + STACK_CHECK; + push(es); + push(bx); + _add(data.byte(kMapx), 11); + al = data.byte(kLastflagex); + cl = 16; + _mul(cl); + _sub(al, 2); + es.byte(bx+10) = al; + data.byte(kNowinnewroom) = 1; + bx = pop(); + es = pop(); +} + +void DreamGenContext::reminders() { + STACK_CHECK; + _cmp(data.byte(kReallocation), 24); + if (!flags.z()) + return /* (notinedenslift) */; + _cmp(data.byte(kMapx), 44); + if (!flags.z()) + return /* (notinedenslift) */; + _cmp(data.byte(kProgresspoints), 0); + if (!flags.z()) + return /* (notfirst) */; + al = 'D'; + ah = 'K'; + cl = 'E'; + ch = 'Y'; + isryanholding(); + if (flags.z()) + goto forgotone; + al = 'C'; + ah = 'S'; + cl = 'H'; + ch = 'R'; + findexobject(); + _cmp(al, (114)); + if (flags.z()) + goto forgotone; + ax = es.word(bx+2); + _cmp(al, 4); + if (!flags.z()) + goto forgotone; + _cmp(ah, 255); + if (flags.z()) + goto havegotcard; + cl = 'P'; + ch = 'U'; + dl = 'R'; + dh = 'S'; + _xchg(al, ah); + compare(); + if (!flags.z()) + goto forgotone; +havegotcard: + _inc(data.byte(kProgresspoints)); + return; +forgotone: + al = 50; + bl = 54; + bh = 70; + cx = 48; + dx = 8; + setuptimeduse(); +} + +void DreamGenContext::initrain() { + STACK_CHECK; + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)); + bx = 1113; +checkmorerain: + al = cs.byte(bx); + _cmp(al, 255); + if (flags.z()) + goto finishinitrain; + _cmp(al, data.byte(kReallocation)); + if (!flags.z()) + goto checkrain; + al = cs.byte(bx+1); + _cmp(al, data.byte(kMapx)); + if (!flags.z()) + goto checkrain; + al = cs.byte(bx+2); + _cmp(al, data.byte(kMapy)); + if (!flags.z()) + goto checkrain; + al = cs.byte(bx+3); + data.byte(kRainspace) = al; + goto dorain; +checkrain: + _add(bx, 4); + goto checkmorerain; +dorain: + cx = 4; +initraintop: + randomnumber(); + _and(al, 31); + _add(al, 3); + _cmp(al, data.byte(kRainspace)); + if (!flags.c()) + goto initraintop; + _add(cl, al); + _cmp(cl, data.byte(kMapxsize)); + if (!flags.c()) + goto initrainside; + push(cx); + splitintolines(); + cx = pop(); + goto initraintop; +initrainside: + cl = data.byte(kMapxsize); + _dec(cl); +initrainside2: + randomnumber(); + _and(al, 31); + _add(al, 3); + _cmp(al, data.byte(kRainspace)); + if (!flags.c()) + goto initrainside2; + _add(ch, al); + _cmp(ch, data.byte(kMapysize)); + if (!flags.c()) + goto finishinitrain; + push(cx); + splitintolines(); + cx = pop(); + goto initrainside2; +finishinitrain: + al = 255; + _stosb(); +} + +void DreamGenContext::splitintolines() { + STACK_CHECK; +lookforlinestart: + getblockofpixel(); + _cmp(al, 0); + if (!flags.z()) + goto foundlinestart; + _dec(cl); + _inc(ch); + _cmp(cl, 0); + if (flags.z()) + return /* (endofthisline) */; + _cmp(ch, data.byte(kMapysize)); + if (!flags.c()) + return /* (endofthisline) */; + goto lookforlinestart; +foundlinestart: + es.word(di) = cx; + bh = 1; +lookforlineend: + getblockofpixel(); + _cmp(al, 0); + if (flags.z()) + goto foundlineend; + _dec(cl); + _inc(ch); + _cmp(cl, 0); + if (flags.z()) + goto foundlineend; + _cmp(ch, data.byte(kMapysize)); + if (!flags.c()) + goto foundlineend; + _inc(bh); + goto lookforlineend; +foundlineend: + push(cx); + es.byte(di+2) = bh; + randomnumber(); + es.byte(di+3) = al; + randomnumber(); + es.byte(di+4) = al; + randomnumber(); + _and(al, 3); + _add(al, 4); + es.byte(di+5) = al; + _add(di, 6); + cx = pop(); + _cmp(cl, 0); + if (flags.z()) + return /* (endofthisline) */; + _cmp(ch, data.byte(kMapysize)); + if (!flags.c()) + return /* (endofthisline) */; + goto lookforlinestart; +} + +void DreamGenContext::getblockofpixel() { + STACK_CHECK; + push(cx); + push(es); + push(di); + ax = data.word(kMapxstart); + _add(cl, al); + ax = data.word(kMapystart); + _add(ch, al); + checkone(); + _and(cl, 1); + if (!flags.z()) + goto failrain; + di = pop(); + es = pop(); + cx = pop(); + return; +failrain: + di = pop(); + es = pop(); + cx = pop(); + al = 0; +} + +void DreamGenContext::showrain() { + STACK_CHECK; + ds = data.word(kMainsprites); + si = 6*58; + ax = ds.word(si+2); + si = ax; + _add(si, 2080); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)); + es = data.word(kBuffers); + _cmp(es.byte(bx), 255); + if (flags.z()) + return /* (nothunder) */; +morerain: + es = data.word(kBuffers); + _cmp(es.byte(bx), 255); + if (flags.z()) + goto finishrain; + al = es.byte(bx+1); + ah = 0; + _add(ax, data.word(kMapady)); + _add(ax, data.word(kMapystart)); + cx = 320; + _mul(cx); + cl = es.byte(bx); + ch = 0; + _add(ax, cx); + _add(ax, data.word(kMapadx)); + _add(ax, data.word(kMapxstart)); + di = ax; + cl = es.byte(bx+2); + ch = 0; + ax = es.word(bx+3); + dl = es.byte(bx+5); + dh = 0; + _sub(ax, dx); + _and(ax, 511); + es.word(bx+3) = ax; + _add(bx, 6); + push(si); + _add(si, ax); + es = data.word(kWorkspace); + ah = 0; + dx = 320-2; +rainloop: + _lodsb(); + _cmp(al, ah); + if (flags.z()) + goto noplot; + _stosb(); + _add(di, dx); + if (--cx) + goto rainloop; + si = pop(); + goto morerain; +noplot: + _add(di, 320-1); + if (--cx) + goto rainloop; + si = pop(); + goto morerain; +finishrain: + _cmp(data.word(kCh1blockstocopy), 0); + if (!flags.z()) + return /* (nothunder) */; + _cmp(data.byte(kReallocation), 2); + if (!flags.z()) + goto notlouisthund; + _cmp(data.byte(kBeenmugged), 1); + if (!flags.z()) + return /* (nothunder) */; +notlouisthund: + _cmp(data.byte(kReallocation), 55); + if (flags.z()) + return /* (nothunder) */; + randomnum1(); + _cmp(al, 1); + if (!flags.c()) + return /* (nothunder) */; + al = 7; + _cmp(data.byte(kCh0playing), 6); + if (flags.z()) + goto isthunder1; + al = 4; +isthunder1: + playchannel1(); +} + +void DreamGenContext::backobject() { + STACK_CHECK; + ds = data.word(kSetdat); + di = es.word(bx+20); + al = es.byte(bx+18); + _cmp(al, 0); + if (flags.z()) + goto _tmp48z; + _dec(al); + es.byte(bx+18) = al; + return /* (finishback) */; +_tmp48z: + al = ds.byte(di+7); + es.byte(bx+18) = al; + al = ds.byte(di+8); + _cmp(al, 6); + if (!flags.z()) + goto notwidedoor; + widedoor(); + return /* (finishback) */; +notwidedoor: + _cmp(al, 5); + if (!flags.z()) + goto notrandom; + random(); + return /* (finishback) */; +notrandom: + _cmp(al, 4); + if (!flags.z()) + goto notlockdoor; + lockeddoorway(); + return /* (finishback) */; +notlockdoor: + _cmp(al, 3); + if (!flags.z()) + goto notlift; + liftsprite(); + return /* (finishback) */; +notlift: + _cmp(al, 2); + if (!flags.z()) + goto notdoor; + doorway(); + return /* (finishback) */; +notdoor: + _cmp(al, 1); + if (!flags.z()) + goto steadyob; + constant(); + return /* (finishback) */; +steadyob: + steady(); +} + +void DreamGenContext::liftsprite() { + STACK_CHECK; + al = data.byte(kLiftflag); + _cmp(al, 0); + if (flags.z()) + goto liftclosed; + _cmp(al, 1); + if (flags.z()) + goto liftopen; + _cmp(al, 3); + if (flags.z()) + goto openlift; + al = es.byte(bx+19); + _cmp(al, 0); + if (flags.z()) + goto finishclose; + _dec(al); + _cmp(al, 11); + if (!flags.z()) + goto pokelift; + push(ax); + al = 3; + liftnoise(); + ax = pop(); + goto pokelift; +finishclose: + data.byte(kLiftflag) = 0; + return; +openlift: + al = es.byte(bx+19); + _cmp(al, 12); + if (flags.z()) + goto endoflist; + _inc(al); + _cmp(al, 1); + if (!flags.z()) + goto pokelift; + push(ax); + al = 2; + liftnoise(); + ax = pop(); +pokelift: + es.byte(bx+19) = al; + ah = 0; + push(di); + _add(di, ax); + al = ds.byte(di+18); + di = pop(); + es.byte(bx+15) = al; + ds.byte(di+17) = al; + return; +endoflist: + data.byte(kLiftflag) = 1; + return; +liftopen: + al = data.byte(kLiftpath); + push(es); + push(bx); + turnpathon(); + bx = pop(); + es = pop(); + _cmp(data.byte(kCounttoclose), 0); + if (flags.z()) + goto nocountclose; + _dec(data.byte(kCounttoclose)); + _cmp(data.byte(kCounttoclose), 0); + if (!flags.z()) + goto nocountclose; + data.byte(kLiftflag) = 2; +nocountclose: + al = 12; + goto pokelift; +liftclosed: + al = data.byte(kLiftpath); + push(es); + push(bx); + turnpathoff(); + bx = pop(); + es = pop(); + _cmp(data.byte(kCounttoopen), 0); + if (flags.z()) + goto nocountopen; + _dec(data.byte(kCounttoopen)); + _cmp(data.byte(kCounttoopen), 0); + if (!flags.z()) + goto nocountopen; + data.byte(kLiftflag) = 3; +nocountopen: + al = 0; + goto pokelift; +} + +void DreamGenContext::liftnoise() { + STACK_CHECK; + _cmp(data.byte(kReallocation), 5); + if (flags.z()) + goto hissnoise; + _cmp(data.byte(kReallocation), 21); + if (flags.z()) + goto hissnoise; + playchannel1(); + return; +hissnoise: + al = 13; + playchannel1(); +} + +void DreamGenContext::random() { + STACK_CHECK; + randomnum1(); + push(di); + _and(ax, 7); + _add(di, 18); + _add(di, ax); + al = ds.byte(di); + di = pop(); + es.byte(bx+15) = al; +} + +void DreamGenContext::steady() { + STACK_CHECK; + al = ds.byte(di+18); + ds.byte(di+17) = al; + es.byte(bx+15) = al; +} + +void DreamGenContext::constant() { + STACK_CHECK; + _inc(es.byte(bx+19)); + cl = es.byte(bx+19); + ch = 0; + _add(di, cx); + _cmp(ds.byte(di+18), 255); + if (!flags.z()) + goto gotconst; + _sub(di, cx); + cx = 0; + es.byte(bx+19) = cl; +gotconst: + al = ds.byte(di+18); + _sub(di, cx); + es.byte(bx+15) = al; + ds.byte(di+17) = al; +} + +void DreamGenContext::doorway() { + STACK_CHECK; + data.byte(kDoorcheck1) = -24; + data.byte(kDoorcheck2) = 10; + data.byte(kDoorcheck3) = -30; + data.byte(kDoorcheck4) = 10; + dodoor(); +} + +void DreamGenContext::widedoor() { + STACK_CHECK; + data.byte(kDoorcheck1) = -24; + data.byte(kDoorcheck2) = 24; + data.byte(kDoorcheck3) = -30; + data.byte(kDoorcheck4) = 24; + dodoor(); +} + +void DreamGenContext::dodoor() { + STACK_CHECK; + al = data.byte(kRyanx); + ah = data.byte(kRyany); + cl = es.byte(bx+10); + ch = es.byte(bx+11); + _cmp(al, cl); + if (!flags.c()) + goto rtofdoor; + _sub(al, cl); + _cmp(al, data.byte(kDoorcheck1)); + if (!flags.c()) + goto upordown; + goto shutdoor; +rtofdoor: + _sub(al, cl); + _cmp(al, data.byte(kDoorcheck2)); + if (!flags.c()) + goto shutdoor; +upordown: + _cmp(ah, ch); + if (!flags.c()) + goto botofdoor; + _sub(ah, ch); + _cmp(ah, data.byte(kDoorcheck3)); + if (flags.c()) + goto shutdoor; + goto opendoor; +botofdoor: + _sub(ah, ch); + _cmp(ah, data.byte(kDoorcheck4)); + if (!flags.c()) + goto shutdoor; +opendoor: + cl = es.byte(bx+19); + _cmp(data.byte(kThroughdoor), 1); + if (!flags.z()) + goto notthrough; + _cmp(cl, 0); + if (!flags.z()) + goto notthrough; + cl = 6; +notthrough: + _inc(cl); + _cmp(cl, 1); + if (!flags.z()) + goto notdoorsound2; + al = 0; + _cmp(data.byte(kReallocation), 5); + if (!flags.z()) + goto nothoteldoor2; + al = 13; +nothoteldoor2: + playchannel1(); +notdoorsound2: + ch = 0; + push(di); + _add(di, cx); + al = ds.byte(di+18); + _cmp(al, 255); + if (!flags.z()) + goto atlast1; + _dec(di); + _dec(cl); +atlast1: + es.byte(bx+19) = cl; + al = ds.byte(di+18); + di = pop(); + es.byte(bx+15) = al; + ds.byte(di+17) = al; + data.byte(kThroughdoor) = 1; + return; +shutdoor: + cl = es.byte(bx+19); + _cmp(cl, 5); + if (!flags.z()) + goto notdoorsound1; + al = 1; + _cmp(data.byte(kReallocation), 5); + if (!flags.z()) + goto nothoteldoor1; + al = 13; +nothoteldoor1: + playchannel1(); +notdoorsound1: + _cmp(cl, 0); + if (flags.z()) + goto atlast2; + _dec(cl); + es.byte(bx+19) = cl; +atlast2: + ch = 0; + push(di); + _add(di, cx); + al = ds.byte(di+18); + di = pop(); + es.byte(bx+15) = al; + ds.byte(di+17) = al; + _cmp(cl, 5); + if (!flags.z()) + return /* (notnearly) */; + data.byte(kThroughdoor) = 0; +} + +void DreamGenContext::lockeddoorway() { + STACK_CHECK; + al = data.byte(kRyanx); + ah = data.byte(kRyany); + cl = es.byte(bx+10); + ch = es.byte(bx+11); + _cmp(al, cl); + if (!flags.c()) + goto rtofdoor2; + _sub(al, cl); + _cmp(al, -24); + if (!flags.c()) + goto upordown2; + goto shutdoor2; +rtofdoor2: + _sub(al, cl); + _cmp(al, 10); + if (!flags.c()) + goto shutdoor2; +upordown2: + _cmp(ah, ch); + if (!flags.c()) + goto botofdoor2; + _sub(ah, ch); + _cmp(ah, -30); + if (flags.c()) + goto shutdoor2; + goto opendoor2; +botofdoor2: + _sub(ah, ch); + _cmp(ah, 12); + if (!flags.c()) + goto shutdoor2; +opendoor2: + _cmp(data.byte(kThroughdoor), 1); + if (flags.z()) + goto mustbeopen; + _cmp(data.byte(kLockstatus), 1); + if (flags.z()) + goto shutdoor; +mustbeopen: + cl = es.byte(bx+19); + _cmp(cl, 1); + if (!flags.z()) + goto notdoorsound4; + al = 0; + playchannel1(); +notdoorsound4: + _cmp(cl, 6); + if (!flags.z()) + goto noturnonyet; + al = data.byte(kDoorpath); + push(es); + push(bx); + turnpathon(); + bx = pop(); + es = pop(); +noturnonyet: + cl = es.byte(bx+19); + _cmp(data.byte(kThroughdoor), 1); + if (!flags.z()) + goto notthrough2; + _cmp(cl, 0); + if (!flags.z()) + goto notthrough2; + cl = 6; +notthrough2: + _inc(cl); + ch = 0; + push(di); + _add(di, cx); + al = ds.byte(di+18); + _cmp(al, 255); + if (!flags.z()) + goto atlast3; + _dec(di); + _dec(cl); +atlast3: + es.byte(bx+19) = cl; + al = ds.byte(di+18); + di = pop(); + es.byte(bx+15) = al; + ds.byte(di+17) = al; + _cmp(cl, 5); + if (!flags.z()) + return /* (justshutting) */; + data.byte(kThroughdoor) = 1; + return; +shutdoor2: + cl = es.byte(bx+19); + _cmp(cl, 5); + if (!flags.z()) + goto notdoorsound3; + al = 1; + playchannel1(); +notdoorsound3: + _cmp(cl, 0); + if (flags.z()) + goto atlast4; + _dec(cl); + es.byte(bx+19) = cl; +atlast4: + ch = 0; + data.byte(kThroughdoor) = 0; + push(di); + _add(di, cx); + al = ds.byte(di+18); + di = pop(); + es.byte(bx+15) = al; + ds.byte(di+17) = al; + _cmp(cl, 0); + if (!flags.z()) + return /* (notlocky) */; + al = data.byte(kDoorpath); + push(es); + push(bx); + turnpathoff(); + bx = pop(); + es = pop(); + data.byte(kLockstatus) = 1; +/*continuing to unbounded code: shutdoor from dodoor:60-87*/ +shutdoor: + cl = es.byte(bx+19); + _cmp(cl, 5); + if (!flags.z()) + goto notdoorsound1; + al = 1; + _cmp(data.byte(kReallocation), 5); + if (!flags.z()) + goto nothoteldoor1; + al = 13; +nothoteldoor1: + playchannel1(); +notdoorsound1: + _cmp(cl, 0); + if (flags.z()) + goto atlast2; + _dec(cl); + es.byte(bx+19) = cl; +atlast2: + ch = 0; + push(di); + _add(di, cx); + al = ds.byte(di+18); + di = pop(); + es.byte(bx+15) = al; + ds.byte(di+17) = al; + _cmp(cl, 5); + if (!flags.z()) + return /* (notnearly) */; + data.byte(kThroughdoor) = 0; +} + +void DreamGenContext::updatepeople() { + STACK_CHECK; + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)); + data.word(kListpos) = di; + cx = 12*5; + al = 255; + _stosb(cx, true); + _inc(data.word(kMaintimer)); + es = cs; + bx = 534; + di = 991; +updateloop: + al = es.byte(bx); + _cmp(al, 255); + if (flags.z()) + return /* (endupdate) */; + _cmp(al, data.byte(kReallocation)); + if (!flags.z()) + goto notinthisroom; + cx = es.word(bx+1); + _cmp(cl, data.byte(kMapx)); + if (!flags.z()) + goto notinthisroom; + _cmp(ch, data.byte(kMapy)); + if (!flags.z()) + goto notinthisroom; + push(di); + ax = cs.word(di); + __dispatch_call(ax); + di = pop(); +notinthisroom: + _add(bx, 8); + _add(di, 2); + goto updateloop; +} + +void DreamGenContext::getreelframeax() { + STACK_CHECK; + push(ds); + data.word(kCurrentframe) = ax; + findsource(); + es = ds; + ds = pop(); + ax = data.word(kCurrentframe); + _sub(ax, data.word(kTakeoff)); + _add(ax, ax); + cx = ax; + _add(ax, ax); + _add(ax, cx); + bx = ax; +} + +void DreamGenContext::reelsonscreen() { + STACK_CHECK; + reconstruct(); + updatepeople(); + watchreel(); + showrain(); + usetimedtext(); +} + +void DreamGenContext::plotreel() { + STACK_CHECK; + getreelstart(); +retryreel: + push(es); + push(si); + ax = es.word(si+2); + _cmp(al, 220); + if (flags.c()) + goto normalreel; + _cmp(al, 255); + if (flags.z()) + goto normalreel; + dealwithspecial(); + _inc(data.word(kReelpointer)); + si = pop(); + es = pop(); + _add(si, 40); + goto retryreel; +normalreel: + cx = 8; +plotloop: + push(cx); + push(es); + push(si); + ax = es.word(si); + _cmp(ax, 0x0ffff); + if (flags.z()) + goto notplot; + showreelframe(); +notplot: + si = pop(); + es = pop(); + cx = pop(); + _add(si, 5); + if (--cx) + goto plotloop; + soundonreels(); + bx = pop(); + es = pop(); +} + +void DreamGenContext::soundonreels() { + STACK_CHECK; + bl = data.byte(kReallocation); + _add(bl, bl); + _xor(bh, bh); + _add(bx, 1214); + si = cs.word(bx); +reelsoundloop: + al = cs.byte(si); + _cmp(al, 255); + if (flags.z()) + goto endreelsound; + ax = cs.word(si+1); + _cmp(ax, data.word(kReelpointer)); + if (!flags.z()) + goto skipreelsound; + _cmp(ax, data.word(kLastsoundreel)); + if (flags.z()) + goto skipreelsound; + data.word(kLastsoundreel) = ax; + al = cs.byte(si); + _cmp(al, 64); + if (flags.c()) + { playchannel1(); return; }; + _cmp(al, 128); + if (flags.c()) + goto channel0once; + _and(al, 63); + ah = 255; + { playchannel0(); return; }; +channel0once: + _and(al, 63); + ah = 0; + { playchannel0(); return; }; +skipreelsound: + _add(si, 3); + goto reelsoundloop; +endreelsound: + ax = data.word(kLastsoundreel); + _cmp(ax, data.word(kReelpointer)); + if (flags.z()) + return /* (nochange2) */; + data.word(kLastsoundreel) = -1; +} + +void DreamGenContext::reconstruct() { + STACK_CHECK; + _cmp(data.byte(kHavedoneobs), 0); + if (flags.z()) + return /* (noneedtorecon) */; + data.byte(kNewobs) = 1; + drawfloor(); + spriteupdate(); + printsprites(); + data.byte(kHavedoneobs) = 0; +} + +void DreamGenContext::dealwithspecial() { + STACK_CHECK; + _sub(al, 220); + _cmp(al, 0); + if (!flags.z()) + goto notplset; + al = ah; + placesetobject(); + data.byte(kHavedoneobs) = 1; + return; +notplset: + _cmp(al, 1); + if (!flags.z()) + goto notremset; + al = ah; + removesetobject(); + data.byte(kHavedoneobs) = 1; + return; +notremset: + _cmp(al, 2); + if (!flags.z()) + goto notplfree; + al = ah; + placefreeobject(); + data.byte(kHavedoneobs) = 1; + return; +notplfree: + _cmp(al, 3); + if (!flags.z()) + goto notremfree; + al = ah; + removefreeobject(); + data.byte(kHavedoneobs) = 1; + return; +notremfree: + _cmp(al, 4); + if (!flags.z()) + goto notryanoff; + switchryanoff(); + return; +notryanoff: + _cmp(al, 5); + if (!flags.z()) + goto notryanon; + data.byte(kTurntoface) = ah; + data.byte(kFacing) = ah; + switchryanon(); + return; +notryanon: + _cmp(al, 6); + if (!flags.z()) + goto notchangeloc; + data.byte(kNewlocation) = ah; + return; +notchangeloc: + movemap(); +} + +void DreamGenContext::movemap() { + STACK_CHECK; + _cmp(ah, 32); + if (!flags.z()) + goto notmapup2; + _sub(data.byte(kMapy), 20); + data.byte(kNowinnewroom) = 1; + return; +notmapup2: + _cmp(ah, 16); + if (!flags.z()) + goto notmapupspec; + _sub(data.byte(kMapy), 10); + data.byte(kNowinnewroom) = 1; + return; +notmapupspec: + _cmp(ah, 8); + if (!flags.z()) + goto notmapdownspec; + _add(data.byte(kMapy), 10); + data.byte(kNowinnewroom) = 1; + return; +notmapdownspec: + _cmp(ah, 2); + if (!flags.z()) + goto notmaprightspec; + _add(data.byte(kMapx), 11); + data.byte(kNowinnewroom) = 1; + return; +notmaprightspec: + _sub(data.byte(kMapx), 11); + data.byte(kNowinnewroom) = 1; +} + +void DreamGenContext::getreelstart() { + STACK_CHECK; + ax = data.word(kReelpointer); + cx = 40; + _mul(cx); + es = data.word(kReels); + si = ax; + _add(si, (0+(36*144))); +} + +void DreamGenContext::showreelframe() { + STACK_CHECK; + al = es.byte(si+2); + ah = 0; + di = ax; + _add(di, data.word(kMapadx)); + al = es.byte(si+3); + bx = ax; + _add(bx, data.word(kMapady)); + ax = es.word(si); + data.word(kCurrentframe) = ax; + findsource(); + ax = data.word(kCurrentframe); + _sub(ax, data.word(kTakeoff)); + ah = 8; + showframe(); +} + +void DreamGenContext::deleverything() { + STACK_CHECK; + al = data.byte(kMapysize); + ah = 0; + _add(ax, data.word(kMapoffsety)); + _cmp(ax, 182); + if (!flags.c()) + goto bigroom; + maptopanel(); + return; +bigroom: + _sub(data.byte(kMapysize), 8); + maptopanel(); + _add(data.byte(kMapysize), 8); +} + +void DreamGenContext::dumpeverything() { + STACK_CHECK; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)); +dumpevery1: + ax = es.word(bx); + cx = es.word(bx+2); + _cmp(ax, 0x0ffff); + if (flags.z()) + goto finishevery1; + _cmp(ax, es.word(bx+(40*5))); + if (!flags.z()) + goto notskip1; + _cmp(cx, es.word(bx+(40*5)+2)); + if (flags.z()) + goto skip1; +notskip1: + push(bx); + push(es); + push(ds); + bl = ah; + bh = 0; + ah = 0; + di = ax; + _add(di, data.word(kMapadx)); + _add(bx, data.word(kMapady)); + multidump(); + ds = pop(); + es = pop(); + bx = pop(); +skip1: + _add(bx, 5); + goto dumpevery1; +finishevery1: + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40))+(40*5); +dumpevery2: + ax = es.word(bx); + cx = es.word(bx+2); + _cmp(ax, 0x0ffff); + if (flags.z()) + return /* (finishevery2) */; + push(bx); + push(es); + push(ds); + bl = ah; + bh = 0; + ah = 0; + di = ax; + _add(di, data.word(kMapadx)); + _add(bx, data.word(kMapady)); + multidump(); + ds = pop(); + es = pop(); + bx = pop(); + _add(bx, 5); + goto dumpevery2; +} + +void DreamGenContext::allocatework() { + STACK_CHECK; + bx = 0x1000; + allocatemem(); + data.word(kWorkspace) = ax; +} + +void DreamGenContext::loadpalfromiff() { + STACK_CHECK; + dx = 2481; + openfile(); + cx = 2000; + ds = data.word(kMapstore); + dx = 0; + readfromfile(); + closefile(); + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768); + ds = data.word(kMapstore); + si = 0x30; + cx = 768; +palloop: + _lodsb(); + _shr(al, 1); + _shr(al, 1); + _cmp(data.byte(kBrightness), 1); + if (!flags.z()) + goto nought; + _cmp(al, 0); + if (flags.z()) + goto nought; + ah = al; + _shr(ah, 1); + _add(al, ah); + _shr(ah, 1); + _add(al, ah); + _cmp(al, 64); + if (flags.c()) + goto nought; + al = 63; +nought: + _stosb(); + if (--cx) + goto palloop; +} + +void DreamGenContext::paneltomap() { + STACK_CHECK; + di = data.word(kMapxstart); + _add(di, data.word(kMapadx)); + bx = data.word(kMapystart); + _add(bx, data.word(kMapady)); + ds = data.word(kMapstore); + si = 0; + cl = data.byte(kMapxsize); + ch = data.byte(kMapysize); + multiget(); +} + +void DreamGenContext::maptopanel() { + STACK_CHECK; + di = data.word(kMapxstart); + _add(di, data.word(kMapadx)); + bx = data.word(kMapystart); + _add(bx, data.word(kMapady)); + ds = data.word(kMapstore); + si = 0; + cl = data.byte(kMapxsize); + ch = data.byte(kMapysize); + multiput(); +} + +void DreamGenContext::dumpmap() { + STACK_CHECK; + di = data.word(kMapxstart); + _add(di, data.word(kMapadx)); + bx = data.word(kMapystart); + _add(bx, data.word(kMapady)); + cl = data.byte(kMapxsize); + ch = data.byte(kMapysize); + multidump(); +} + +void DreamGenContext::pixelcheckset() { + STACK_CHECK; + push(ax); + _sub(al, es.byte(bx)); + _sub(ah, es.byte(bx+1)); + push(es); + push(bx); + push(cx); + push(ax); + al = es.byte(bx+4); + getsetad(); + al = es.byte(bx+17); + es = data.word(kSetframes); + bx = (0); + ah = 0; + cx = 6; + _mul(cx); + _add(bx, ax); + ax = pop(); + push(ax); + al = ah; + ah = 0; + cl = es.byte(bx); + ch = 0; + _mul(cx); + cx = pop(); + ch = 0; + _add(ax, cx); + _add(ax, es.word(bx+2)); + bx = ax; + _add(bx, (0+2080)); + al = es.byte(bx); + dl = al; + cx = pop(); + bx = pop(); + es = pop(); + ax = pop(); + _cmp(dl, 0); +} + +void DreamGenContext::createpanel() { + STACK_CHECK; + di = 0; + bx = 8; + ds = data.word(kIcons2); + al = 0; + ah = 2; + showframe(); + di = 160; + bx = 8; + ds = data.word(kIcons2); + al = 0; + ah = 2; + showframe(); + di = 0; + bx = 104; + ds = data.word(kIcons2); + al = 0; + ah = 2; + showframe(); + di = 160; + bx = 104; + ds = data.word(kIcons2); + al = 0; + ah = 2; + showframe(); +} + +void DreamGenContext::createpanel2() { + STACK_CHECK; + createpanel(); + di = 0; + bx = 0; + ds = data.word(kIcons2); + al = 5; + ah = 2; + showframe(); + di = 160; + bx = 0; + ds = data.word(kIcons2); + al = 5; + ah = 2; + showframe(); +} + +void DreamGenContext::clearwork() { + STACK_CHECK; + ax = 0x0; + es = data.word(kWorkspace); + di = 0; + cx = (200*320)/64; +clearloop: + _stosw(32); + if (--cx) + goto clearloop; +} + +void DreamGenContext::zoom() { + STACK_CHECK; + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + return /* (inwatching) */; + _cmp(data.byte(kZoomon), 1); + if (flags.z()) + goto zoomswitch; + return; +zoomswitch: + _cmp(data.byte(kCommandtype), 199); + if (flags.c()) + goto zoomit; + putunderzoom(); + return; +zoomit: + ax = data.word(kOldpointery); + _sub(ax, 9); + cx = (320); + _mul(cx); + _add(ax, data.word(kOldpointerx)); + _sub(ax, 11); + si = ax; + ax = (132)+4; + cx = (320); + _mul(cx); + _add(ax, (8)+5); + di = ax; + es = data.word(kWorkspace); + ds = data.word(kWorkspace); + cx = 20; +zoomloop: + push(cx); + cx = 23; +zoomloop2: + _lodsb(); + ah = al; + _stosw(); + es.word(di+(320)-2) = ax; + if (--cx) + goto zoomloop2; + _add(si, (320)-23); + _add(di, (320)-46+(320)); + cx = pop(); + if (--cx) + goto zoomloop; + crosshair(); + data.byte(kDidzoom) = 1; +} + +void DreamGenContext::delthisone() { + STACK_CHECK; + push(ax); + push(ax); + al = ah; + ah = 0; + _add(ax, data.word(kMapady)); + bx = (320); + _mul(bx); + bx = pop(); + bh = 0; + _add(bx, data.word(kMapadx)); + _add(ax, bx); + di = ax; + ax = pop(); + push(ax); + al = ah; + ah = 0; + bx = 22*8; + _mul(bx); + bx = pop(); + bh = 0; + _add(ax, bx); + si = ax; + es = data.word(kWorkspace); + ds = data.word(kMapstore); + dl = cl; + dh = 0; + ax = (320); + _sub(ax, dx); + _neg(dx); + _add(dx, 22*8); +deloneloop: + push(cx); + ch = 0; + _movsb(cx, true); + cx = pop(); + _add(di, ax); + _add(si, dx); + _dec(ch); + if (!flags.z()) + goto deloneloop; +} + +void DreamGenContext::doblocks() { + STACK_CHECK; + es = data.word(kWorkspace); + ax = data.word(kMapady); + cx = (320); + _mul(cx); + di = data.word(kMapadx); + _add(di, ax); + al = data.byte(kMapy); + ah = 0; + bx = (66); + _mul(bx); + bl = data.byte(kMapx); + bh = 0; + _add(ax, bx); + si = (0); + _add(si, ax); + cx = 10; +loop120: + push(di); + push(cx); + cx = 11; +loop124: + push(cx); + push(di); + ds = data.word(kMapdata); + _lodsb(); + ds = data.word(kBackdrop); + push(si); + _cmp(al, 0); + if (flags.z()) + goto zeroblock; + ah = al; + al = 0; + si = (0+192); + _add(si, ax); + bh = 14; + bh = 4; +firstbitofblock: + _movsw(8); + _add(di, (320)-16); + _dec(bh); + if (!flags.z()) + goto firstbitofblock; + bh = 12; +loop125: + _movsw(8); + ax = 0x0dfdf; + _stosw(2); + _add(di, (320)-20); + _dec(bh); + if (!flags.z()) + goto loop125; + _add(di, 4); + ax = 0x0dfdf; + _stosw(8); + _add(di, (320)-16); + _stosw(8); + _add(di, (320)-16); + _stosw(8); + _add(di, (320)-16); + _stosw(8); +zeroblock: + si = pop(); + di = pop(); + cx = pop(); + _add(di, 16); + if (--cx) + goto loop124; + _add(si, (66)-11); + cx = pop(); + di = pop(); + _add(di, (320)*16); + if (--cx) + goto loop120; +} + +void DreamGenContext::showframe() { + STACK_CHECK; + push(dx); + push(ax); + cx = ax; + _and(cx, 511); + _add(cx, cx); + si = cx; + _add(cx, cx); + _add(si, cx); + _cmp(ds.word(si), 0); + if (!flags.z()) + goto notblankshow; + ax = pop(); + dx = pop(); + cx = 0; + return; +notblankshow: + _test(ah, 128); + if (!flags.z()) + goto skipoffsets; + al = ds.byte(si+4); + ah = 0; + _add(di, ax); + al = ds.byte(si+5); + ah = 0; + _add(bx, ax); +skipoffsets: + cx = ds.word(si+0); + ax = ds.word(si+2); + _add(ax, 2080); + si = ax; + ax = pop(); + dx = pop(); + _cmp(ah, 0); + if (flags.z()) + goto noeffects; + _test(ah, 128); + if (flags.z()) + goto notcentred; + push(ax); + al = cl; + ah = 0; + _shr(ax, 1); + _sub(di, ax); + al = ch; + ah = 0; + _shr(ax, 1); + _sub(bx, ax); + ax = pop(); +notcentred: + _test(ah, 64); + if (flags.z()) + goto notdiffdest; + push(cx); + frameoutfx(); + cx = pop(); + return; +notdiffdest: + _test(ah, 8); + if (flags.z()) + goto notprintlist; + push(ax); + ax = di; + _sub(ax, data.word(kMapadx)); + push(bx); + _sub(bx, data.word(kMapady)); + ah = bl; + bx = pop(); + ax = pop(); +notprintlist: + _test(ah, 4); + if (flags.z()) + goto notflippedx; + dx = (320); + es = data.word(kWorkspace); + push(cx); + frameoutfx(); + cx = pop(); + return; +notflippedx: + _test(ah, 2); + if (flags.z()) + goto notnomask; + dx = (320); + es = data.word(kWorkspace); + push(cx); + frameoutnm(); + cx = pop(); + return; +notnomask: + _test(ah, 32); + if (flags.z()) + goto noeffects; + dx = (320); + es = data.word(kWorkspace); + push(cx); + frameoutbh(); + cx = pop(); + return; +noeffects: + dx = (320); + es = data.word(kWorkspace); + push(cx); + frameoutv(); + cx = pop(); +} + +void DreamGenContext::frameoutv() { + STACK_CHECK; + push(dx); + ax = bx; + bx = dx; + _mul(bx); + _add(di, ax); + dx = pop(); + push(cx); + ch = 0; + _sub(dx, cx); + cx = pop(); +frameloop1: + push(cx); + ch = 0; +frameloop2: + _lodsb(); + _cmp(al, 0); + if (!flags.z()) + goto backtosolid; +backtoother: + _inc(di); + if (--cx) + goto frameloop2; + cx = pop(); + _add(di, dx); + _dec(ch); + if (!flags.z()) + goto frameloop1; + return; +frameloop3: + _lodsb(); + _cmp(al, 0); + if (flags.z()) + goto backtoother; +backtosolid: + _stosb(); + if (--cx) + goto frameloop3; + cx = pop(); + _add(di, dx); + _dec(ch); + if (!flags.z()) + goto frameloop1; +} + +void DreamGenContext::frameoutbh() { + STACK_CHECK; + push(dx); + ax = bx; + bx = dx; + _mul(bx); + _add(di, ax); + dx = pop(); + push(cx); + ch = 0; + _sub(dx, cx); + cx = pop(); +bhloop2: + push(cx); + ch = 0; + ah = 255; +bhloop1: + _cmp(es.byte(di), ah); + if (!flags.z()) + goto nofill; + _movsb(); + if (--cx) + goto bhloop1; + goto nextline; +nofill: + _inc(di); + _inc(si); + if (--cx) + goto bhloop1; +nextline: + _add(di, dx); + cx = pop(); + _dec(ch); + if (!flags.z()) + goto bhloop2; +} + +void DreamGenContext::frameoutfx() { + STACK_CHECK; + push(dx); + ax = bx; + bx = dx; + _mul(bx); + _add(di, ax); + dx = pop(); + push(cx); + ch = 0; + _add(dx, cx); + cx = pop(); +frameloopfx1: + push(cx); + ch = 0; +frameloopfx2: + _lodsb(); + _cmp(al, 0); + if (!flags.z()) + goto backtosolidfx; +backtootherfx: + _dec(di); + if (--cx) + goto frameloopfx2; + cx = pop(); + _add(di, dx); + _dec(ch); + if (!flags.z()) + goto frameloopfx1; + return; +frameloopfx3: + _lodsb(); + _cmp(al, 0); + if (flags.z()) + goto backtootherfx; +backtosolidfx: + es.byte(di) = al; + _dec(di); + if (--cx) + goto frameloopfx3; + cx = pop(); + _add(di, dx); + _dec(ch); + if (!flags.z()) + goto frameloopfx1; +} + +void DreamGenContext::transferinv() { + STACK_CHECK; + di = data.word(kExframepos); + push(di); + al = data.byte(kExpos); + ah = 0; + bx = ax; + _add(ax, ax); + _add(ax, bx); + _inc(ax); + cx = 6; + _mul(cx); + es = data.word(kExtras); + bx = (0); + _add(bx, ax); + _add(di, (0+2080)); + push(bx); + al = data.byte(kItemtotran); + ah = 0; + bx = ax; + _add(ax, ax); + _add(ax, bx); + _inc(ax); + cx = 6; + _mul(cx); + ds = data.word(kFreeframes); + bx = (0); + _add(bx, ax); + si = (0+2080); + al = ds.byte(bx); + ah = 0; + cl = ds.byte(bx+1); + ch = 0; + _add(si, ds.word(bx+2)); + dx = ds.word(bx+4); + bx = pop(); + es.byte(bx+0) = al; + es.byte(bx+1) = cl; + es.word(bx+4) = dx; + _mul(cx); + cx = ax; + push(cx); + _movsb(cx, true); + cx = pop(); + ax = pop(); + es.word(bx+2) = ax; + _add(data.word(kExframepos), cx); +} + +void DreamGenContext::transfermap() { + STACK_CHECK; + di = data.word(kExframepos); + push(di); + al = data.byte(kExpos); + ah = 0; + bx = ax; + _add(ax, ax); + _add(ax, bx); + cx = 6; + _mul(cx); + es = data.word(kExtras); + bx = (0); + _add(bx, ax); + _add(di, (0+2080)); + push(bx); + al = data.byte(kItemtotran); + ah = 0; + bx = ax; + _add(ax, ax); + _add(ax, bx); + cx = 6; + _mul(cx); + ds = data.word(kFreeframes); + bx = (0); + _add(bx, ax); + si = (0+2080); + al = ds.byte(bx); + ah = 0; + cl = ds.byte(bx+1); + ch = 0; + _add(si, ds.word(bx+2)); + dx = ds.word(bx+4); + bx = pop(); + es.byte(bx+0) = al; + es.byte(bx+1) = cl; + es.word(bx+4) = dx; + _mul(cx); + cx = ax; + push(cx); + _movsb(cx, true); + cx = pop(); + ax = pop(); + es.word(bx+2) = ax; + _add(data.word(kExframepos), cx); +} + +void DreamGenContext::dofade() { + STACK_CHECK; + _cmp(data.byte(kFadedirection), 0); + if (flags.z()) + return /* (finishfade) */; + cl = data.byte(kNumtofade); + ch = 0; + al = data.byte(kColourpos); + ah = 0; + ds = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)); + _add(si, ax); + _add(si, ax); + _add(si, ax); + showgroup(); + al = data.byte(kNumtofade); + _add(al, data.byte(kColourpos)); + data.byte(kColourpos) = al; + _cmp(al, 0); + if (!flags.z()) + return /* (finishfade) */; + fadecalculation(); +} + +void DreamGenContext::clearendpal() { + STACK_CHECK; + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); + cx = 768; + al = 0; + _stosb(cx, true); +} + +void DreamGenContext::clearpalette() { + STACK_CHECK; + data.byte(kFadedirection) = 0; + clearstartpal(); + dumpcurrent(); +} + +void DreamGenContext::fadescreenup() { + STACK_CHECK; + clearstartpal(); + paltoendpal(); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 63; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 128; +} + +void DreamGenContext::fadetowhite() { + STACK_CHECK; + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); + cx = 768; + al = 63; + _stosb(cx, true); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); + al = 0; + _stosb(3); + paltostartpal(); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 63; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 128; +} + +void DreamGenContext::fadefromwhite() { + STACK_CHECK; + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)); + cx = 768; + al = 63; + _stosb(cx, true); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)); + al = 0; + _stosb(3); + paltoendpal(); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 63; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 128; +} + +void DreamGenContext::fadescreenups() { + STACK_CHECK; + clearstartpal(); + paltoendpal(); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 63; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 64; +} + +void DreamGenContext::fadescreendownhalf() { + STACK_CHECK; + paltostartpal(); + paltoendpal(); + cx = 768; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); +halfend: + al = es.byte(bx); + _shr(al, 1); + es.byte(bx) = al; + _inc(bx); + if (--cx) + goto halfend; + ds = data.word(kBuffers); + es = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3))+(56*3); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(56*3); + cx = 3*5; + _movsb(cx, true); + si = (0+(180*10)+32+60+(32*32)+(11*10*3))+(77*3); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(77*3); + cx = 3*2; + _movsb(cx, true); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 31; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 32; +} + +void DreamGenContext::fadescreenuphalf() { + STACK_CHECK; + endpaltostart(); + paltoendpal(); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 31; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 32; +} + +void DreamGenContext::fadescreendown() { + STACK_CHECK; + paltostartpal(); + clearendpal(); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 63; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 128; +} + +void DreamGenContext::fadescreendowns() { + STACK_CHECK; + paltostartpal(); + clearendpal(); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 63; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 64; +} + +void DreamGenContext::clearstartpal() { + STACK_CHECK; + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)); + cx = 256; +wholeloop1: + ax = 0; + _stosw(); + al = 0; + _stosb(); + if (--cx) + goto wholeloop1; +} + +void DreamGenContext::showgun() { + STACK_CHECK; + data.byte(kAddtored) = 0; + data.byte(kAddtogreen) = 0; + data.byte(kAddtoblue) = 0; + paltostartpal(); + paltoendpal(); + greyscalesum(); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 63; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 128; + cx = 130; + hangon(); + endpaltostart(); + clearendpal(); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 63; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 128; + cx = 200; + hangon(); + data.byte(kRoomssample) = 34; + loadroomssample(); + data.byte(kVolume) = 0; + dx = 2351; + loadintotemp(); + createpanel2(); + ds = data.word(kTempgraphics); + al = 0; + ah = 0; + di = 100; + bx = 4; + showframe(); + ds = data.word(kTempgraphics); + al = 1; + ah = 0; + di = 158; + bx = 106; + showframe(); + worktoscreen(); + getridoftemp(); + fadescreenup(); + cx = 160; + hangon(); + al = 12; + ah = 0; + playchannel0(); + dx = 2260; + loadtemptext(); + rollendcredits2(); + getridoftemptext(); +} + +void DreamGenContext::rollendcredits2() { + STACK_CHECK; + rollem(); +} + +void DreamGenContext::rollem() { + STACK_CHECK; + cl = 160; + ch = 160; + di = 25; + bx = 20; + ds = data.word(kMapstore); + si = 0; + multiget(); + es = data.word(kTextfile1); + si = 49*2; + ax = es.word(si); + si = ax; + _add(si, (66*2)); + cx = 80; +endcredits21: + push(cx); + bx = 10; + cx = data.word(kLinespacing); +endcredits22: + push(cx); + push(si); + push(di); + push(es); + push(bx); + vsync(); + cl = 160; + ch = 160; + di = 25; + bx = 20; + ds = data.word(kMapstore); + si = 0; + multiput(); + vsync(); + bx = pop(); + es = pop(); + di = pop(); + si = pop(); + push(si); + push(di); + push(es); + push(bx); + cx = 18; +onelot2: + push(cx); + di = 25; + dx = 161; + ax = 0; + printdirect(); + _add(bx, data.word(kLinespacing)); + cx = pop(); + if (--cx) + goto onelot2; + vsync(); + cl = 160; + ch = 160; + di = 25; + bx = 20; + multidump(); + bx = pop(); + es = pop(); + di = pop(); + si = pop(); + cx = pop(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto endearly2; + _dec(bx); + if (--cx) + goto endcredits22; + cx = pop(); +looknext2: + al = es.byte(si); + _inc(si); + _cmp(al, ':'); + if (flags.z()) + goto gotnext2; + _cmp(al, 0); + if (flags.z()) + goto gotnext2; + goto looknext2; +gotnext2: + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + return /* (endearly) */; + if (--cx) + goto endcredits21; + cx = 120; + hangone(); + return; +endearly2: + cx = pop(); +} + +void DreamGenContext::fadecalculation() { + STACK_CHECK; + _cmp(data.byte(kFadecount), 0); + if (flags.z()) + goto nomorefading; + bl = data.byte(kFadecount); + es = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); + cx = 768; +fadecolloop: + al = es.byte(si); + ah = es.byte(di); + _cmp(al, ah); + if (flags.z()) + goto gotthere; + if (flags.c()) + goto lesscolour; + _dec(es.byte(si)); + goto gotthere; +lesscolour: + _cmp(bl, ah); + if (flags.z()) + goto withit; + if (!flags.c()) + goto gotthere; +withit: + _inc(es.byte(si)); +gotthere: + _inc(si); + _inc(di); + if (--cx) + goto fadecolloop; + _dec(data.byte(kFadecount)); + return; +nomorefading: + data.byte(kFadedirection) = 0; +} + +void DreamGenContext::greyscalesum() { + STACK_CHECK; + es = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); + cx = 256; +greysumloop1: + push(cx); + bx = 0; + al = es.byte(si); + ah = 0; + cx = 20; + _mul(cx); + _add(bx, ax); + al = es.byte(si+1); + ah = 0; + cx = 59; + _mul(cx); + _add(bx, ax); + al = es.byte(si+2); + ah = 0; + cx = 11; + _mul(cx); + _add(bx, ax); + al = -1; +greysumloop2: + _inc(al); + _sub(bx, 100); + if (!flags.c()) + goto greysumloop2; + bl = al; + al = bl; + ah = data.byte(kAddtored); + _cmp(al, 0); + _add(al, ah); + _stosb(); + ah = data.byte(kAddtogreen); + al = bl; + _cmp(al, 0); + if (flags.z()) + goto noaddg; + _add(al, ah); +noaddg: + _stosb(); + ah = data.byte(kAddtoblue); + al = bl; + _cmp(al, 0); + if (flags.z()) + goto noaddb; + _add(al, ah); +noaddb: + _stosb(); + _add(si, 3); + cx = pop(); + if (--cx) + goto greysumloop1; +} + +void DreamGenContext::paltostartpal() { + STACK_CHECK; + es = data.word(kBuffers); + ds = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)); + cx = 768/2; + _movsw(cx, true); +} + +void DreamGenContext::endpaltostart() { + STACK_CHECK; + es = data.word(kBuffers); + ds = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)); + cx = 768/2; + _movsw(cx, true); +} + +void DreamGenContext::startpaltoend() { + STACK_CHECK; + es = data.word(kBuffers); + ds = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)); + cx = 768/2; + _movsw(cx, true); +} + +void DreamGenContext::paltoendpal() { + STACK_CHECK; + es = data.word(kBuffers); + ds = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768); + cx = 768/2; + _movsw(cx, true); +} + +void DreamGenContext::allpalette() { + STACK_CHECK; + es = data.word(kBuffers); + ds = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768); + cx = 768/2; + _movsw(cx, true); + dumpcurrent(); +} + +void DreamGenContext::dumpcurrent() { + STACK_CHECK; + si = (0+(180*10)+32+60+(32*32)+(11*10*3)); + ds = data.word(kBuffers); + vsync(); + al = 0; + cx = 128; + showgroup(); + vsync(); + al = 128; + cx = 128; + showgroup(); +} + +void DreamGenContext::fadedownmon() { + STACK_CHECK; + paltostartpal(); + paltoendpal(); + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(231*3); + cx = 3*8; + ax = 0; + _stosb(cx, true); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(246*3); + _stosb(); + _stosw(); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 63; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 128; + cx = 64; + hangon(); +} + +void DreamGenContext::fadeupmon() { + STACK_CHECK; + paltostartpal(); + paltoendpal(); + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(231*3); + cx = 3*8; + ax = 0; + _stosb(cx, true); + di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(246*3); + _stosb(); + _stosw(); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 63; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 128; + cx = 128; + hangon(); +} + +void DreamGenContext::fadeupmonfirst() { + STACK_CHECK; + paltostartpal(); + paltoendpal(); + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(231*3); + cx = 3*8; + ax = 0; + _stosb(cx, true); + di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(246*3); + _stosb(); + _stosw(); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 63; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 128; + cx = 64; + hangon(); + al = 26; + playchannel1(); + cx = 64; + hangon(); +} + +void DreamGenContext::fadeupyellows() { + STACK_CHECK; + paltoendpal(); + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(231*3); + cx = 3*8; + ax = 0; + _stosb(cx, true); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768)+(246*3); + _stosb(); + _stosw(); + data.byte(kFadedirection) = 1; + data.byte(kFadecount) = 63; + data.byte(kColourpos) = 0; + data.byte(kNumtofade) = 128; + cx = 128; + hangon(); +} + +void DreamGenContext::initialmoncols() { + STACK_CHECK; + paltostartpal(); + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(230*3); + cx = 3*9; + ax = 0; + _stosb(cx, true); + di = (0+(180*10)+32+60+(32*32)+(11*10*3))+(246*3); + _stosb(); + _stosw(); + ds = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3))+(230*3); + al = 230; + cx = 18; + showgroup(); +} + +void DreamGenContext::titles() { + STACK_CHECK; + clearpalette(); + biblequote(); + _cmp(data.byte(kQuitrequested), 0); + if (!flags.z()) + return /* (titlesearly) */; + intro(); +} + +void DreamGenContext::endgame() { + STACK_CHECK; + dx = 2260; + loadtemptext(); + monkspeaking(); + gettingshot(); + getridoftemptext(); + data.byte(kVolumeto) = 7; + data.byte(kVolumedirection) = 1; + cx = 200; + hangon(); +} + +void DreamGenContext::monkspeaking() { + STACK_CHECK; + data.byte(kRoomssample) = 35; + loadroomssample(); + dx = 2364; + loadintotemp(); + clearwork(); + showmonk(); + worktoscreen(); + data.byte(kVolume) = 7; + data.byte(kVolumedirection) = -1; + data.byte(kVolumeto) = 5; + al = 12; + ah = 255; + playchannel0(); + fadescreenups(); + cx = 300; + hangon(); + al = 40; +loadspeech2: + push(ax); + dl = 'T'; + dh = 83; + cl = 'T'; + ah = 0; + loadspeech(); + al = 50+12; + playchannel1(); +notloadspeech2: + vsync(); + _cmp(data.byte(kCh1playing), 255); + if (!flags.z()) + goto notloadspeech2; + ax = pop(); + _inc(al); + _cmp(al, 48); + if (!flags.z()) + goto loadspeech2; + data.byte(kVolumedirection) = 1; + data.byte(kVolumeto) = 7; + fadescreendowns(); + cx = 300; + hangon(); + getridoftemp(); +} + +void DreamGenContext::showmonk() { + STACK_CHECK; + al = 0; + ah = 128; + di = 160; + bx = 72; + ds = data.word(kTempgraphics); + showframe(); +} + +void DreamGenContext::gettingshot() { + STACK_CHECK; + data.byte(kNewlocation) = 55; + clearpalette(); + loadintroroom(); + fadescreenups(); + data.byte(kVolumeto) = 0; + data.byte(kVolumedirection) = -1; + runendseq(); + clearbeforeload(); +} + +void DreamGenContext::credits() { + STACK_CHECK; + clearpalette(); + realcredits(); +} + +void DreamGenContext::biblequote() { + STACK_CHECK; + mode640x480(); + dx = 2377; + showpcx(); + fadescreenups(); + cx = 80; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto biblequotearly; + cx = 560; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto biblequotearly; + fadescreendowns(); + cx = 200; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto biblequotearly; + cancelch0(); +biblequotearly: + data.byte(kLasthardkey) = 0; +} + +void DreamGenContext::hangone() { + STACK_CHECK; +hangonloope: + push(cx); + vsync(); + cx = pop(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + return /* (hangonearly) */; + if (--cx) + goto hangonloope; +} + +void DreamGenContext::intro() { + STACK_CHECK; + dx = 2247; + loadtemptext(); + loadpalfromiff(); + setmode(); + data.byte(kNewlocation) = 50; + clearpalette(); + loadintroroom(); + data.byte(kVolume) = 7; + data.byte(kVolumedirection) = -1; + data.byte(kVolumeto) = 4; + al = 12; + ah = 255; + playchannel0(); + fadescreenups(); + runintroseq(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto introearly; + clearbeforeload(); + data.byte(kNewlocation) = 52; + loadintroroom(); + runintroseq(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto introearly; + clearbeforeload(); + data.byte(kNewlocation) = 53; + loadintroroom(); + runintroseq(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto introearly; + clearbeforeload(); + allpalette(); + data.byte(kNewlocation) = 54; + loadintroroom(); + runintroseq(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto introearly; + getridoftemptext(); + clearbeforeload(); +introearly: + data.byte(kLasthardkey) = 0; +} + +void DreamGenContext::runintroseq() { + STACK_CHECK; + data.byte(kGetback) = 0; +moreintroseq: + vsync(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto earlyendrun; + spriteupdate(); + vsync(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto earlyendrun; + deleverything(); + printsprites(); + reelsonscreen(); + afterintroroom(); + usetimedtext(); + vsync(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto earlyendrun; + dumpmap(); + dumptimedtext(); + vsync(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto earlyendrun; + _cmp(data.byte(kGetback), 1); + if (!flags.z()) + goto moreintroseq; + return; +earlyendrun: + getridoftemptext(); + clearbeforeload(); +} + +void DreamGenContext::runendseq() { + STACK_CHECK; + atmospheres(); + data.byte(kGetback) = 0; +moreendseq: + vsync(); + spriteupdate(); + vsync(); + deleverything(); + printsprites(); + reelsonscreen(); + afterintroroom(); + usetimedtext(); + vsync(); + dumpmap(); + dumptimedtext(); + vsync(); + _cmp(data.byte(kGetback), 1); + if (!flags.z()) + goto moreendseq; +} + +void DreamGenContext::loadintroroom() { + STACK_CHECK; + data.byte(kIntrocount) = 0; + data.byte(kLocation) = 255; + loadroom(); + data.word(kMapoffsetx) = 72; + data.word(kMapoffsety) = 16; + clearsprites(); + data.byte(kThroughdoor) = 0; + data.byte(kCurrentkey) = '0'; + data.byte(kMainmode) = 0; + clearwork(); + data.byte(kNewobs) = 1; + drawfloor(); + reelsonscreen(); + spriteupdate(); + printsprites(); + worktoscreen(); +} + +void DreamGenContext::realcredits() { + STACK_CHECK; + data.byte(kRoomssample) = 33; + loadroomssample(); + data.byte(kVolume) = 0; + mode640x480(); + cx = 35; + hangon(); + dx = 2390; + showpcx(); + al = 12; + ah = 0; + playchannel0(); + cx = 2; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + allpalette(); + cx = 80; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + fadescreendowns(); + cx = 256; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + dx = 2403; + showpcx(); + al = 12; + ah = 0; + playchannel0(); + cx = 2; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + allpalette(); + cx = 80; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + fadescreendowns(); + cx = 256; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + dx = 2416; + showpcx(); + al = 12; + ah = 0; + playchannel0(); + cx = 2; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + allpalette(); + cx = 80; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + fadescreendowns(); + cx = 256; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + dx = 2429; + showpcx(); + al = 12; + ah = 0; + playchannel0(); + cx = 2; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + allpalette(); + cx = 80; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + fadescreendowns(); + cx = 256; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + dx = 2442; + showpcx(); + al = 12; + ah = 0; + playchannel0(); + cx = 2; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + allpalette(); + cx = 80; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + fadescreendowns(); + cx = 256; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + dx = 2455; + showpcx(); + fadescreenups(); + cx = 60; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + al = 13; + ah = 0; + playchannel0(); + cx = 350; + hangone(); + _cmp(data.byte(kLasthardkey), 1); + if (flags.z()) + goto realcreditsearly; + fadescreendowns(); + cx = 256; + hangone(); +realcreditsearly: + data.byte(kLasthardkey) = 0; +} + +void DreamGenContext::printchar() { + STACK_CHECK; + _cmp(al, 255); + if (flags.z()) + return /* (ignoreit) */; + push(si); + push(bx); + push(di); + push(ax); + _sub(al, 32); + ah = 0; + _add(ax, data.word(kCharshift)); + showframe(); + ax = pop(); + di = pop(); + bx = pop(); + si = pop(); + _cmp(data.byte(kKerning), 0); + if (!flags.z()) + goto nokern; + kernchars(); +nokern: + push(cx); + ch = 0; + _add(di, cx); + cx = pop(); +} + +void DreamGenContext::kernchars() { + STACK_CHECK; + _cmp(al, 'a'); + if (flags.z()) + goto iskern; + _cmp(al, 'u'); + if (flags.z()) + goto iskern; + return; +iskern: + _cmp(ah, 'n'); + if (flags.z()) + goto kernit; + _cmp(ah, 't'); + if (flags.z()) + goto kernit; + _cmp(ah, 'r'); + if (flags.z()) + goto kernit; + _cmp(ah, 'i'); + if (flags.z()) + goto kernit; + _cmp(ah, 'l'); + if (flags.z()) + goto kernit; + return; +kernit: + _dec(cl); +} + +void DreamGenContext::printslow() { + STACK_CHECK; + data.byte(kPointerframe) = 1; + data.byte(kPointermode) = 3; + ds = data.word(kCharset1); +printloopslow6: + push(bx); + push(di); + push(dx); + getnumber(); + ch = 0; +printloopslow5: + push(cx); + push(si); + push(es); + ax = es.word(si); + push(bx); + push(cx); + push(es); + push(si); + push(ds); + printboth(); + ds = pop(); + si = pop(); + es = pop(); + cx = pop(); + bx = pop(); + ax = es.word(si+1); + _inc(si); + _cmp(al, 0); + if (flags.z()) + goto finishslow; + _cmp(al, ':'); + if (flags.z()) + goto finishslow; + _cmp(cl, 1); + if (flags.z()) + goto afterslow; + push(di); + push(ds); + push(bx); + push(cx); + push(es); + push(si); + data.word(kCharshift) = 91; + printboth(); + data.word(kCharshift) = 0; + si = pop(); + es = pop(); + cx = pop(); + bx = pop(); + ds = pop(); + di = pop(); + waitframes(); + _cmp(ax, 0); + if (flags.z()) + goto keepgoing; + _cmp(ax, data.word(kOldbutton)); + if (!flags.z()) + goto finishslow2; +keepgoing: + waitframes(); + _cmp(ax, 0); + if (flags.z()) + goto afterslow; + _cmp(ax, data.word(kOldbutton)); + if (!flags.z()) + goto finishslow2; +afterslow: + es = pop(); + si = pop(); + cx = pop(); + _inc(si); + if (--cx) + goto printloopslow5; + dx = pop(); + di = pop(); + bx = pop(); + _add(bx, 10); + goto printloopslow6; +finishslow: + es = pop(); + si = pop(); + cx = pop(); + dx = pop(); + di = pop(); + bx = pop(); + al = 0; + return; +finishslow2: + es = pop(); + si = pop(); + cx = pop(); + dx = pop(); + di = pop(); + bx = pop(); + al = 1; +} + +void DreamGenContext::waitframes() { + STACK_CHECK; + push(di); + push(bx); + push(es); + push(si); + push(ds); + readmouse(); + showpointer(); + vsync(); + dumppointer(); + delpointer(); + ax = data.word(kMousebutton); + ds = pop(); + si = pop(); + es = pop(); + bx = pop(); + di = pop(); +} + +void DreamGenContext::printboth() { + STACK_CHECK; + push(ax); + push(cx); + push(bx); + push(di); + printchar(); + ax = pop(); + push(di); + di = ax; + multidump(); + di = pop(); + bx = pop(); + cx = pop(); + ax = pop(); +} + +void DreamGenContext::printdirect() { + STACK_CHECK; + data.word(kLastxpos) = di; + ds = data.word(kCurrentset); +printloop6: + push(bx); + push(di); + push(dx); + getnumber(); + ch = 0; +printloop5: + ax = es.word(si); + _inc(si); + _cmp(al, 0); + if (flags.z()) + goto finishdirct; + _cmp(al, ':'); + if (flags.z()) + goto finishdirct; + push(cx); + push(es); + printchar(); + data.word(kLastxpos) = di; + es = pop(); + cx = pop(); + if (--cx) + goto printloop5; + dx = pop(); + di = pop(); + bx = pop(); + _add(bx, data.word(kLinespacing)); + goto printloop6; +finishdirct: + dx = pop(); + di = pop(); + bx = pop(); +} + +void DreamGenContext::monprint() { + STACK_CHECK; + data.byte(kKerning) = 1; + si = bx; + dl = 166; + di = data.word(kMonadx); + bx = data.word(kMonady); + ds = data.word(kTempcharset); +printloop8: + push(bx); + push(di); + push(dx); + getnumber(); + ch = 0; +printloop7: + al = es.byte(si); + _inc(si); + _cmp(al, ':'); + if (flags.z()) + goto finishmon2; + _cmp(al, 0); + if (flags.z()) + goto finishmon; + _cmp(al, 34); + if (flags.z()) + goto finishmon; + _cmp(al, '='); + if (flags.z()) + goto finishmon; + _cmp(al, '%'); + if (!flags.z()) + goto nottrigger; + ah = es.byte(si); + _inc(si); + _inc(si); + goto finishmon; +nottrigger: + push(cx); + push(es); + printchar(); + data.word(kCurslocx) = di; + data.word(kCurslocy) = bx; + data.word(kMaintimer) = 1; + printcurs(); + vsync(); + push(si); + push(dx); + push(ds); + push(es); + push(bx); + push(di); + lockmon(); + di = pop(); + bx = pop(); + es = pop(); + ds = pop(); + dx = pop(); + si = pop(); + delcurs(); + es = pop(); + cx = pop(); + if (--cx) + goto printloop7; +finishmon2: + dx = pop(); + di = pop(); + bx = pop(); + scrollmonitor(); + data.word(kCurslocx) = di; + goto printloop8; +finishmon: + dx = pop(); + di = pop(); + bx = pop(); + _cmp(al, '%'); + if (!flags.z()) + goto nottrigger2; + data.byte(kLasttrigger) = ah; +nottrigger2: + data.word(kCurslocx) = di; + scrollmonitor(); + bx = si; + data.byte(kKerning) = 0; +} + +void DreamGenContext::getnumber() { + STACK_CHECK; + cx = 0; + push(si); + push(bx); + push(di); + push(ds); + push(es); + di = si; +wordloop: + push(cx); + push(dx); + getnextword(); + dx = pop(); + cx = pop(); + _cmp(al, 1); + if (flags.z()) + goto endoftext; + al = cl; + ah = 0; + push(bx); + bh = 0; + _add(ax, bx); + bx = pop(); + _sub(ax, 10); + dh = 0; + _cmp(ax, dx); + if (!flags.c()) + goto gotoverend; + _add(cl, bl); + _add(ch, bh); + goto wordloop; +gotoverend: + al = dl; + _and(al, 1); + if (flags.z()) + goto notcentre; + push(cx); + al = dl; + _and(al, 0xfe); + ah = 0; + ch = 0; + _sub(ax, cx); + _add(ax, 20); + _shr(ax, 1); + cx = pop(); + es = pop(); + ds = pop(); + di = pop(); + bx = pop(); + si = pop(); + _add(di, ax); + cl = ch; + return; +notcentre: + es = pop(); + ds = pop(); + di = pop(); + bx = pop(); + si = pop(); + cl = ch; + return; +endoftext: + al = cl; + ah = 0; + push(bx); + bh = 0; + _add(ax, bx); + bx = pop(); + _sub(ax, 10); + dh = 0; + _cmp(ax, dx); + if (!flags.c()) + goto gotoverend2; + _add(cl, bl); + _add(ch, bh); +gotoverend2: + al = dl; + _and(al, 1); + if (flags.z()) + goto notcent2; + push(cx); + al = dl; + _and(al, 0xfe); + _add(al, 2); + ah = 0; + ch = 0; + _add(ax, 20); + _sub(ax, cx); + _shr(ax, 1); + cx = pop(); + es = pop(); + ds = pop(); + di = pop(); + bx = pop(); + si = pop(); + _add(di, ax); + cl = ch; + return; +notcent2: + es = pop(); + ds = pop(); + di = pop(); + bx = pop(); + si = pop(); + cl = ch; +} + +void DreamGenContext::getnextword() { + STACK_CHECK; + bx = 0; +getloop: + ax = es.word(di); + _inc(di); + _inc(bh); + _cmp(al, ':'); + if (flags.z()) + goto endall; + _cmp(al, 0); + if (flags.z()) + goto endall; + _cmp(al, 32); + if (flags.z()) + goto endword; + _cmp(al, 255); + if (flags.z()) + goto getloop; + push(ax); + _sub(al, 32); + ah = 0; + _add(ax, data.word(kCharshift)); + _add(ax, ax); + si = ax; + _add(ax, ax); + _add(si, ax); + cl = ds.byte(si+0); + ax = pop(); + kernchars(); + _add(bl, cl); + goto getloop; +endword: + _add(bl, 6); + al = 0; + return; +endall: + _add(bl, 6); + al = 1; +} + +void DreamGenContext::fillryan() { + STACK_CHECK; + es = data.word(kBuffers); + di = (0+(180*10)+32); + findallryan(); + si = (0+(180*10)+32); + al = data.byte(kRyanpage); + ah = 0; + cx = 20; + _mul(cx); + _add(si, ax); + di = (80); + bx = (58); + cx = 2; +ryanloop2: + push(cx); + push(di); + push(bx); + cx = 5; +ryanloop1: + push(cx); + push(di); + push(bx); + ax = es.word(si); + _add(si, 2); + push(si); + push(es); + obtoinv(); + es = pop(); + si = pop(); + bx = pop(); + di = pop(); + cx = pop(); + _add(di, (44)); + if (--cx) + goto ryanloop1; + bx = pop(); + di = pop(); + cx = pop(); + _add(bx, (44)); + if (--cx) + goto ryanloop2; + showryanpage(); +} + +void DreamGenContext::fillopen() { + STACK_CHECK; + deltextline(); + getopenedsize(); + _cmp(ah, 4); + if (flags.c()) + goto lessthanapage; + ah = 4; +lessthanapage: + al = 1; + push(ax); + es = data.word(kBuffers); + di = (0+(180*10)); + findallopen(); + si = (0+(180*10)); + di = (80); + bx = (58)+96; + cx = pop(); +openloop1: + push(cx); + push(di); + push(bx); + ax = es.word(si); + _add(si, 2); + push(si); + push(es); + _cmp(ch, cl); + if (flags.c()) + goto nextopenslot; + obtoinv(); +nextopenslot: + es = pop(); + si = pop(); + bx = pop(); + di = pop(); + cx = pop(); + _add(di, (44)); + _inc(cl); + _cmp(cl, 5); + if (!flags.z()) + goto openloop1; + undertextline(); +} + +void DreamGenContext::findallryan() { + STACK_CHECK; + push(di); + cx = 30; + ax = 0x0ffff; + _stosw(cx, true); + di = pop(); + cl = 4; + ds = data.word(kExtras); + bx = (0+2080+30000); + ch = 0; +findryanloop: + _cmp(ds.byte(bx+2), cl); + if (!flags.z()) + goto notinryaninv; + _cmp(ds.byte(bx+3), 255); + if (!flags.z()) + goto notinryaninv; + al = ds.byte(bx+4); + ah = 0; + push(di); + _add(di, ax); + _add(di, ax); + al = ch; + ah = 4; + _stosw(); + di = pop(); +notinryaninv: + _add(bx, 16); + _inc(ch); + _cmp(ch, (114)); + if (!flags.z()) + goto findryanloop; +} + +void DreamGenContext::findallopen() { + STACK_CHECK; + push(di); + cx = 16; + ax = 0x0ffff; + _stosw(cx, true); + di = pop(); + cl = data.byte(kOpenedob); + dl = data.byte(kOpenedtype); + ds = data.word(kExtras); + bx = (0+2080+30000); + ch = 0; +findopen1: + _cmp(ds.byte(bx+3), cl); + if (!flags.z()) + goto findopen2; + _cmp(ds.byte(bx+2), dl); + if (!flags.z()) + goto findopen2; + _cmp(data.byte(kOpenedtype), 4); + if (flags.z()) + goto noloccheck; + al = ds.byte(bx+5); + _cmp(al, data.byte(kReallocation)); + if (!flags.z()) + goto findopen2; +noloccheck: + al = ds.byte(bx+4); + ah = 0; + push(di); + _add(di, ax); + _add(di, ax); + al = ch; + ah = 4; + _stosw(); + di = pop(); +findopen2: + _add(bx, 16); + _inc(ch); + _cmp(ch, (114)); + if (!flags.z()) + goto findopen1; + cl = data.byte(kOpenedob); + dl = data.byte(kOpenedtype); + push(dx); + ds = data.word(kFreedat); + dx = pop(); + bx = 0; + ch = 0; +findopen1a: + _cmp(ds.byte(bx+3), cl); + if (!flags.z()) + goto findopen2a; + _cmp(ds.byte(bx+2), dl); + if (!flags.z()) + goto findopen2a; + al = ds.byte(bx+4); + ah = 0; + push(di); + _add(di, ax); + _add(di, ax); + al = ch; + ah = 2; + _stosw(); + di = pop(); +findopen2a: + _add(bx, 16); + _inc(ch); + _cmp(ch, 80); + if (!flags.z()) + goto findopen1a; +} + +void DreamGenContext::obtoinv() { + STACK_CHECK; + push(bx); + push(es); + push(si); + push(ax); + push(ax); + push(di); + push(bx); + ds = data.word(kIcons1); + _sub(di, 2); + _sub(bx, 1); + al = 10; + ah = 0; + showframe(); + bx = pop(); + di = pop(); + ax = pop(); + _cmp(al, 255); + if (flags.z()) + goto finishfill; + push(bx); + push(di); + push(ax); + ds = data.word(kExtras); + _cmp(ah, 4); + if (flags.z()) + goto isanextra; + ds = data.word(kFreeframes); +isanextra: + cl = al; + _add(al, al); + _add(al, cl); + _inc(al); + ah = 128; + _add(bx, 19); + _add(di, 18); + showframe(); + ax = pop(); + di = pop(); + bx = pop(); + push(bx); + getanyaddir(); + isitworn(); + bx = pop(); + if (!flags.z()) + goto finishfill; + ds = data.word(kIcons1); + _sub(di, 3); + _sub(bx, 2); + al = 7; + ah = 0; + showframe(); +finishfill: + ax = pop(); + si = pop(); + es = pop(); + bx = pop(); +} + +void DreamGenContext::isitworn() { + STACK_CHECK; + al = es.byte(bx+12); + _cmp(al, 'W'-'A'); + if (!flags.z()) + return /* (notworn) */; + al = es.byte(bx+13); + _cmp(al, 'E'-'A'); +} + +void DreamGenContext::makeworn() { + STACK_CHECK; + es.byte(bx+12) = 'W'-'A'; + es.byte(bx+13) = 'E'-'A'; +} + +void DreamGenContext::examineob() { + STACK_CHECK; + data.byte(kPointermode) = 0; + data.word(kTimecount) = 0; +examineagain: + data.byte(kInmaparea) = 0; + data.byte(kExamagain) = 0; + data.byte(kOpenedob) = 255; + data.byte(kOpenedtype) = 255; + data.byte(kInvopen) = 0; + al = data.byte(kCommandtype); + data.byte(kObjecttype) = al; + data.byte(kItemframe) = 0; + data.byte(kPointerframe) = 0; + createpanel(); + showpanel(); + showman(); + showexit(); + obicons(); + obpicture(); + describeob(); + undertextline(); + data.byte(kCommandtype) = 255; + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); +waitexam: + readmouse(); + showpointer(); + vsync(); + dumppointer(); + dumptextline(); + delpointer(); + data.byte(kGetback) = 0; + bx = 2494; + _cmp(data.byte(kInvopen), 0); + if (flags.z()) + goto notuseinv; + bx = 2556; + _cmp(data.byte(kInvopen), 1); + if (flags.z()) + goto notuseinv; + bx = 2618; +notuseinv: + checkcoords(); + _cmp(data.byte(kExamagain), 0); + if (flags.z()) + goto norex; + goto examineagain; +norex: + _cmp(data.byte(kGetback), 0); + if (flags.z()) + goto waitexam; + data.byte(kPickup) = 0; + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + goto iswatching; + _cmp(data.byte(kNewlocation), 255); + if (!flags.z()) + goto justgetback; +iswatching: + makemainscreen(); + data.byte(kInvopen) = 0; + data.byte(kOpenedob) = 255; + return; +justgetback: + data.byte(kInvopen) = 0; + data.byte(kOpenedob) = 255; +} + +void DreamGenContext::makemainscreen() { + STACK_CHECK; + createpanel(); + data.byte(kNewobs) = 1; + drawfloor(); + spriteupdate(); + printsprites(); + reelsonscreen(); + showicon(); + getunderzoom(); + undertextline(); + data.byte(kCommandtype) = 255; + animpointer(); + worktoscreenm(); + data.byte(kCommandtype) = 200; + data.byte(kManisoffscreen) = 0; +} + +void DreamGenContext::getbackfromob() { + STACK_CHECK; + _cmp(data.byte(kPickup), 1); + if (!flags.z()) + goto notheldob; + blank(); + return; +notheldob: + getback1(); +} + +void DreamGenContext::incryanpage() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 222); + if (flags.z()) + goto alreadyincryan; + data.byte(kCommandtype) = 222; + al = 31; + commandonly(); +alreadyincryan: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (noincryan) */; + _and(ax, 1); + if (!flags.z()) + goto doincryan; + return; +doincryan: + ax = data.word(kMousex); + _sub(ax, (80)+167); + data.byte(kRyanpage) = -1; +findnewpage: + _inc(data.byte(kRyanpage)); + _sub(ax, 18); + if (!flags.c()) + goto findnewpage; + delpointer(); + fillryan(); + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::openinv() { + STACK_CHECK; + data.byte(kInvopen) = 1; + al = 61; + di = (80); + bx = (58)-10; + dl = 240; + printmessage(); + fillryan(); + data.byte(kCommandtype) = 255; +} + +void DreamGenContext::showryanpage() { + STACK_CHECK; + ds = data.word(kIcons1); + di = (80)+167; + bx = (58)-12; + al = 12; + ah = 0; + showframe(); + al = 13; + _add(al, data.byte(kRyanpage)); + push(ax); + al = data.byte(kRyanpage); + ah = 0; + cx = 18; + _mul(cx); + ds = data.word(kIcons1); + di = (80)+167; + _add(di, ax); + bx = (58)-12; + ax = pop(); + ah = 0; + showframe(); +} + +void DreamGenContext::openob() { + STACK_CHECK; + al = data.byte(kOpenedob); + ah = data.byte(kOpenedtype); + di = 5847; + copyname(); + di = (80); + bx = (58)+86; + al = 62; + dl = 240; + printmessage(); + di = data.word(kLastxpos); + _add(di, 5); + bx = (58)+86; + es = cs; + si = 5847; + dl = 220; + al = 0; + ah = 0; + printdirect(); + fillopen(); + getopenedsize(); + al = ah; + ah = 0; + cx = (44); + _mul(cx); + _add(ax, (80)); + bx = 2588; + cs.word(bx) = ax; +} + +void DreamGenContext::obicons() { + STACK_CHECK; + al = data.byte(kCommand); + getanyad(); + _cmp(al, 255); + if (flags.z()) + goto cantopenit; + ds = data.word(kIcons2); + di = 210; + bx = 1; + al = 4; + ah = 0; + showframe(); +cantopenit: + ds = data.word(kIcons2); + di = 260; + bx = 1; + al = 1; + ah = 0; + showframe(); +} + +void DreamGenContext::examicon() { + STACK_CHECK; + ds = data.word(kIcons2); + di = 254; + bx = 5; + al = 3; + ah = 0; + showframe(); +} + +void DreamGenContext::obpicture() { + STACK_CHECK; + al = data.byte(kCommand); + ah = data.byte(kObjecttype); + _cmp(ah, 1); + if (flags.z()) + return /* (setframe) */; + _cmp(ah, 4); + if (flags.z()) + goto exframe; + ds = data.word(kFreeframes); + di = 160; + bx = 68; + cl = al; + _add(al, al); + _add(al, cl); + _inc(al); + ah = 128; + showframe(); + return; +exframe: + ds = data.word(kExtras); + di = 160; + bx = 68; + cl = al; + _add(al, al); + _add(al, cl); + _inc(al); + ah = 128; + showframe(); +} + +void DreamGenContext::describeob() { + STACK_CHECK; + getobtextstart(); + di = 33; + bx = 92; + dl = 241; + ah = 16; + data.word(kCharshift) = 91+91; + printdirect(); + data.word(kCharshift) = 0; + di = 36; + bx = 104; + dl = 241; + ah = 0; + printdirect(); + push(bx); + obsthatdothings(); + bx = pop(); + additionaltext(); +} + +void DreamGenContext::additionaltext() { + STACK_CHECK; + _add(bx, 10); + push(bx); + al = data.byte(kCommand); + ah = data.byte(kObjecttype); + cl = 'C'; + ch = 'U'; + dl = 'P'; + dh = 'E'; + compare(); + if (flags.z()) + goto emptycup; + al = data.byte(kCommand); + ah = data.byte(kObjecttype); + cl = 'C'; + ch = 'U'; + dl = 'P'; + dh = 'F'; + compare(); + if (flags.z()) + goto fullcup; + bx = pop(); + return; +emptycup: + al = 40; + findpuztext(); + bx = pop(); + di = 36; + dl = 241; + ah = 0; + printdirect(); + return; +fullcup: + al = 39; + findpuztext(); + bx = pop(); + di = 36; + dl = 241; + ah = 0; + printdirect(); +} + +void DreamGenContext::obsthatdothings() { + STACK_CHECK; + al = data.byte(kCommand); + ah = data.byte(kObjecttype); + cl = 'M'; + ch = 'E'; + dl = 'M'; + dh = 'B'; + compare(); + if (!flags.z()) + return /* (notlouiscard) */; + al = 4; + getlocation(); + _cmp(al, 1); + if (flags.z()) + return /* (seencard) */; + al = 4; + setlocation(); + lookatcard(); +} + +void DreamGenContext::getobtextstart() { + STACK_CHECK; + es = data.word(kFreedesc); + si = (0); + cx = (0+(82*2)); + _cmp(data.byte(kObjecttype), 2); + if (flags.z()) + goto describe; + es = data.word(kSetdesc); + si = (0); + cx = (0+(130*2)); + _cmp(data.byte(kObjecttype), 1); + if (flags.z()) + goto describe; + es = data.word(kExtras); + si = (0+2080+30000+(16*114)); + cx = (0+2080+30000+(16*114)+((114+2)*2)); +describe: + al = data.byte(kCommand); + ah = 0; + _add(ax, ax); + _add(si, ax); + ax = es.word(si); + _add(ax, cx); + si = ax; + bx = ax; +tryagain: + push(si); + findnextcolon(); + al = es.byte(si); + cx = si; + si = pop(); + _cmp(data.byte(kObjecttype), 1); + if (!flags.z()) + return /* (cantmakeoneup) */; + _cmp(al, 0); + if (flags.z()) + goto findsometext; + _cmp(al, ':'); + if (flags.z()) + goto findsometext; + return; +findsometext: + searchforsame(); + goto tryagain; +} + +void DreamGenContext::searchforsame() { + STACK_CHECK; + si = cx; +searchagain: + _inc(si); + al = es.byte(bx); +search: + _cmp(es.byte(si), al); + if (flags.z()) + goto gotstartletter; + _inc(cx); + _inc(si); + _cmp(si, 8000); + if (flags.c()) + goto search; + si = bx; + ax = pop(); + return; +gotstartletter: + push(bx); + push(si); +keepchecking: + _inc(si); + _inc(bx); + al = es.byte(bx); + ah = es.byte(si); + _cmp(al, ':'); + if (flags.z()) + goto foundmatch; + _cmp(al, 0); + if (flags.z()) + goto foundmatch; + _cmp(al, ah); + if (flags.z()) + goto keepchecking; + si = pop(); + bx = pop(); + goto searchagain; +foundmatch: + si = pop(); + bx = pop(); +} + +void DreamGenContext::findnextcolon() { + STACK_CHECK; +isntcolon: + al = es.byte(si); + _inc(si); + _cmp(al, 0); + if (flags.z()) + return /* (endofcolon) */; + _cmp(al, ':'); + if (!flags.z()) + goto isntcolon; +} + +void DreamGenContext::inventory() { + STACK_CHECK; + _cmp(data.byte(kMandead), 1); + if (flags.z()) + goto iswatchinv; + _cmp(data.word(kWatchingtime), 0); + if (flags.z()) + goto notwatchinv; +iswatchinv: + blank(); + return; +notwatchinv: + _cmp(data.byte(kCommandtype), 239); + if (flags.z()) + goto alreadyopinv; + data.byte(kCommandtype) = 239; + al = 32; + commandonly(); +alreadyopinv: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (cantopinv) */; + _and(ax, 1); + if (!flags.z()) + goto doopeninv; + return; +doopeninv: + data.word(kTimecount) = 0; + data.byte(kPointermode) = 0; + data.byte(kInmaparea) = 0; + animpointer(); + createpanel(); + showpanel(); + examicon(); + showman(); + showexit(); + undertextline(); + data.byte(kPickup) = 0; + data.byte(kInvopen) = 2; + openinv(); + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); + data.byte(kOpenedob) = 255; + goto waitexam; +/*continuing to unbounded code: examineagain from examineob:3-66*/ +examineagain: + data.byte(kInmaparea) = 0; + data.byte(kExamagain) = 0; + data.byte(kOpenedob) = 255; + data.byte(kOpenedtype) = 255; + data.byte(kInvopen) = 0; + al = data.byte(kCommandtype); + data.byte(kObjecttype) = al; + data.byte(kItemframe) = 0; + data.byte(kPointerframe) = 0; + createpanel(); + showpanel(); + showman(); + showexit(); + obicons(); + obpicture(); + describeob(); + undertextline(); + data.byte(kCommandtype) = 255; + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); +waitexam: + readmouse(); + showpointer(); + vsync(); + dumppointer(); + dumptextline(); + delpointer(); + data.byte(kGetback) = 0; + bx = 2494; + _cmp(data.byte(kInvopen), 0); + if (flags.z()) + goto notuseinv; + bx = 2556; + _cmp(data.byte(kInvopen), 1); + if (flags.z()) + goto notuseinv; + bx = 2618; +notuseinv: + checkcoords(); + _cmp(data.byte(kExamagain), 0); + if (flags.z()) + goto norex; + goto examineagain; +norex: + _cmp(data.byte(kGetback), 0); + if (flags.z()) + goto waitexam; + data.byte(kPickup) = 0; + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + goto iswatching; + _cmp(data.byte(kNewlocation), 255); + if (!flags.z()) + goto justgetback; +iswatching: + makemainscreen(); + data.byte(kInvopen) = 0; + data.byte(kOpenedob) = 255; + return; +justgetback: + data.byte(kInvopen) = 0; + data.byte(kOpenedob) = 255; +} + +void DreamGenContext::setpickup() { + STACK_CHECK; + _cmp(data.byte(kObjecttype), 1); + if (flags.z()) + goto cantpick; + _cmp(data.byte(kObjecttype), 3); + if (flags.z()) + goto cantpick; + getanyad(); + al = es.byte(bx+2); + _cmp(al, 4); + if (!flags.z()) + goto canpick; +cantpick: + blank(); + return; +canpick: + _cmp(data.byte(kCommandtype), 209); + if (flags.z()) + goto alreadysp; + data.byte(kCommandtype) = 209; + bl = data.byte(kCommand); + bh = data.byte(kObjecttype); + al = 33; + commandwithob(); +alreadysp: + ax = data.word(kMousebutton); + _cmp(ax, 1); + if (!flags.z()) + return /* (nosetpick) */; + _cmp(ax, data.word(kOldbutton)); + if (!flags.z()) + goto dosetpick; + return; +dosetpick: + createpanel(); + showpanel(); + showman(); + showexit(); + examicon(); + data.byte(kPickup) = 1; + data.byte(kInvopen) = 2; + _cmp(data.byte(kObjecttype), 4); + if (flags.z()) + goto pickupexob; + al = data.byte(kCommand); + data.byte(kItemframe) = al; + data.byte(kOpenedob) = 255; + transfertoex(); + data.byte(kItemframe) = al; + data.byte(kObjecttype) = 4; + geteitherad(); + es.byte(bx+2) = 20; + es.byte(bx+3) = 255; + openinv(); + worktoscreenm(); + return; +pickupexob: + al = data.byte(kCommand); + data.byte(kItemframe) = al; + data.byte(kOpenedob) = 255; + openinv(); + worktoscreenm(); +} + +void DreamGenContext::examinventory() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 249); + if (flags.z()) + goto alreadyexinv; + data.byte(kCommandtype) = 249; + al = 32; + commandonly(); +alreadyexinv: + ax = data.word(kMousebutton); + _and(ax, 1); + if (!flags.z()) + goto doexinv; + return; +doexinv: + createpanel(); + showpanel(); + showman(); + showexit(); + examicon(); + data.byte(kPickup) = 0; + data.byte(kInvopen) = 2; + openinv(); + worktoscreenm(); +} + +void DreamGenContext::reexfrominv() { + STACK_CHECK; + findinvpos(); + ax = es.word(bx); + data.byte(kCommandtype) = ah; + data.byte(kCommand) = al; + data.byte(kExamagain) = 1; + data.byte(kPointermode) = 0; +} + +void DreamGenContext::reexfromopen() { + STACK_CHECK; + return; + findopenpos(); + ax = es.word(bx); + data.byte(kCommandtype) = ah; + data.byte(kCommand) = al; + data.byte(kExamagain) = 1; + data.byte(kPointermode) = 0; +} + +void DreamGenContext::swapwithinv() { + STACK_CHECK; + al = data.byte(kItemframe); + ah = data.byte(kObjecttype); + _cmp(ax, data.word(kOldsubject)); + if (!flags.z()) + goto difsub7; + _cmp(data.byte(kCommandtype), 243); + if (flags.z()) + goto alreadyswap1; + data.byte(kCommandtype) = 243; +difsub7: + data.word(kOldsubject) = ax; + bx = ax; + al = 34; + commandwithob(); +alreadyswap1: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (cantswap1) */; + _and(ax, 1); + if (!flags.z()) + goto doswap1; + return; +doswap1: + ah = data.byte(kObjecttype); + al = data.byte(kItemframe); + push(ax); + findinvpos(); + ax = es.word(bx); + data.byte(kItemframe) = al; + data.byte(kObjecttype) = ah; + geteitherad(); + es.byte(bx+2) = 20; + es.byte(bx+3) = 255; + bl = data.byte(kItemframe); + bh = data.byte(kObjecttype); + ax = pop(); + data.byte(kObjecttype) = ah; + data.byte(kItemframe) = al; + push(bx); + findinvpos(); + delpointer(); + al = data.byte(kItemframe); + geteitherad(); + es.byte(bx+2) = 4; + es.byte(bx+3) = 255; + al = data.byte(kLastinvpos); + es.byte(bx+4) = al; + ax = pop(); + data.byte(kObjecttype) = ah; + data.byte(kItemframe) = al; + fillryan(); + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::swapwithopen() { + STACK_CHECK; + al = data.byte(kItemframe); + ah = data.byte(kObjecttype); + _cmp(ax, data.word(kOldsubject)); + if (!flags.z()) + goto difsub8; + _cmp(data.byte(kCommandtype), 242); + if (flags.z()) + goto alreadyswap2; + data.byte(kCommandtype) = 242; +difsub8: + data.word(kOldsubject) = ax; + bx = ax; + al = 34; + commandwithob(); +alreadyswap2: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (cantswap2) */; + _and(ax, 1); + if (!flags.z()) + goto doswap2; + return; +doswap2: + geteitherad(); + isitworn(); + if (!flags.z()) + goto notwornswap; + wornerror(); + return; +notwornswap: + delpointer(); + al = data.byte(kItemframe); + _cmp(al, data.byte(kOpenedob)); + if (!flags.z()) + goto isntsame2; + al = data.byte(kObjecttype); + _cmp(al, data.byte(kOpenedtype)); + if (!flags.z()) + goto isntsame2; + errormessage1(); + return; +isntsame2: + checkobjectsize(); + _cmp(al, 0); + if (flags.z()) + goto sizeok2; + return; +sizeok2: + ah = data.byte(kObjecttype); + al = data.byte(kItemframe); + push(ax); + findopenpos(); + ax = es.word(bx); + data.byte(kItemframe) = al; + data.byte(kObjecttype) = ah; + _cmp(ah, 4); + if (!flags.z()) + goto makeswapex; + geteitherad(); + es.byte(bx+2) = 20; + es.byte(bx+3) = 255; + goto actuallyswap; +makeswapex: + transfertoex(); + data.byte(kItemframe) = al; + data.byte(kObjecttype) = 4; + geteitherad(); + es.byte(bx+2) = 20; + es.byte(bx+3) = 255; +actuallyswap: + bl = data.byte(kItemframe); + bh = data.byte(kObjecttype); + ax = pop(); + data.byte(kObjecttype) = ah; + data.byte(kItemframe) = al; + push(bx); + findopenpos(); + geteitherad(); + al = data.byte(kOpenedtype); + es.byte(bx+2) = al; + al = data.byte(kOpenedob); + es.byte(bx+3) = al; + al = data.byte(kLastinvpos); + es.byte(bx+4) = al; + al = data.byte(kReallocation); + es.byte(bx+5) = al; + ax = pop(); + data.byte(kObjecttype) = ah; + data.byte(kItemframe) = al; + fillopen(); + fillryan(); + undertextline(); + readmouse(); + useopened(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::intoinv() { + STACK_CHECK; + _cmp(data.byte(kPickup), 0); + if (!flags.z()) + goto notout; + outofinv(); + return; +notout: + findinvpos(); + ax = es.word(bx); + _cmp(al, 255); + if (flags.z()) + goto canplace1; + swapwithinv(); + return; +canplace1: + al = data.byte(kItemframe); + ah = data.byte(kObjecttype); + _cmp(ax, data.word(kOldsubject)); + if (!flags.z()) + goto difsub1; + _cmp(data.byte(kCommandtype), 220); + if (flags.z()) + goto alreadyplce; + data.byte(kCommandtype) = 220; +difsub1: + data.word(kOldsubject) = ax; + bx = ax; + al = 35; + commandwithob(); +alreadyplce: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (notletgo2) */; + _and(ax, 1); + if (!flags.z()) + goto doplace; + return; +doplace: + delpointer(); + al = data.byte(kItemframe); + getexad(); + es.byte(bx+2) = 4; + es.byte(bx+3) = 255; + al = data.byte(kLastinvpos); + es.byte(bx+4) = al; + data.byte(kPickup) = 0; + fillryan(); + readmouse(); + showpointer(); + outofinv(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::deletetaken() { + STACK_CHECK; + es = data.word(kFreedat); + ah = data.byte(kReallocation); + ds = data.word(kExtras); + si = (0+2080+30000); + cx = (114); +takenloop: + al = ds.byte(si+11); + _cmp(al, ah); + if (!flags.z()) + goto notinhere; + bl = ds.byte(si+1); + bh = 0; + _add(bx, bx); + _add(bx, bx); + _add(bx, bx); + _add(bx, bx); + es.byte(bx+2) = 254; +notinhere: + _add(si, 16); + if (--cx) + goto takenloop; +} + +void DreamGenContext::outofinv() { + STACK_CHECK; + findinvpos(); + ax = es.word(bx); + _cmp(al, 255); + if (!flags.z()) + goto canpick2; + blank(); + return; +canpick2: + bx = data.word(kMousebutton); + _cmp(bx, 2); + if (!flags.z()) + goto canpick2a; + reexfrominv(); + return; +canpick2a: + _cmp(ax, data.word(kOldsubject)); + if (!flags.z()) + goto difsub3; + _cmp(data.byte(kCommandtype), 221); + if (flags.z()) + goto alreadygrab; + data.byte(kCommandtype) = 221; +difsub3: + data.word(kOldsubject) = ax; + bx = ax; + al = 36; + commandwithob(); +alreadygrab: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (notletgo) */; + _and(ax, 1); + if (!flags.z()) + goto dograb; + return; +dograb: + delpointer(); + data.byte(kPickup) = 1; + findinvpos(); + ax = es.word(bx); + data.byte(kItemframe) = al; + data.byte(kObjecttype) = ah; + getexad(); + es.byte(bx+2) = 20; + es.byte(bx+3) = 255; + fillryan(); + readmouse(); + showpointer(); + intoinv(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::getfreead() { + STACK_CHECK; + ah = 0; + cl = 4; + _shl(ax, cl); + bx = ax; + es = data.word(kFreedat); +} + +void DreamGenContext::getexad() { + STACK_CHECK; + ah = 0; + bx = 16; + _mul(bx); + bx = ax; + es = data.word(kExtras); + _add(bx, (0+2080+30000)); +} + +void DreamGenContext::geteitherad() { + STACK_CHECK; + _cmp(data.byte(kObjecttype), 4); + if (flags.z()) + goto isinexlist; + al = data.byte(kItemframe); + getfreead(); + return; +isinexlist: + al = data.byte(kItemframe); + getexad(); +} + +void DreamGenContext::getanyad() { + STACK_CHECK; + _cmp(data.byte(kObjecttype), 4); + if (flags.z()) + goto isex; + _cmp(data.byte(kObjecttype), 2); + if (flags.z()) + goto isfree; + al = data.byte(kCommand); + getsetad(); + ax = es.word(bx+4); + return; +isfree: + al = data.byte(kCommand); + getfreead(); + ax = es.word(bx+7); + return; +isex: + al = data.byte(kCommand); + getexad(); + ax = es.word(bx+7); +} + +void DreamGenContext::getanyaddir() { + STACK_CHECK; + _cmp(ah, 4); + if (flags.z()) + goto isex3; + _cmp(ah, 2); + if (flags.z()) + goto isfree3; + getsetad(); + return; +isfree3: + getfreead(); + return; +isex3: + getexad(); +} + +void DreamGenContext::getopenedsize() { + STACK_CHECK; + _cmp(data.byte(kOpenedtype), 4); + if (flags.z()) + goto isex2; + _cmp(data.byte(kOpenedtype), 2); + if (flags.z()) + goto isfree2; + al = data.byte(kOpenedob); + getsetad(); + ax = es.word(bx+3); + return; +isfree2: + al = data.byte(kOpenedob); + getfreead(); + ax = es.word(bx+7); + return; +isex2: + al = data.byte(kOpenedob); + getexad(); + ax = es.word(bx+7); +} + +void DreamGenContext::getsetad() { + STACK_CHECK; + ah = 0; + bx = 64; + _mul(bx); + bx = ax; + es = data.word(kSetdat); +} + +void DreamGenContext::findinvpos() { + STACK_CHECK; + cx = data.word(kMousex); + _sub(cx, (80)); + bx = -1; +findinv1: + _inc(bx); + _sub(cx, (44)); + if (!flags.c()) + goto findinv1; + cx = data.word(kMousey); + _sub(cx, (58)); + _sub(bx, 5); +findinv2: + _add(bx, 5); + _sub(cx, (44)); + if (!flags.c()) + goto findinv2; + al = data.byte(kRyanpage); + ah = 0; + cx = 10; + _mul(cx); + _add(bx, ax); + al = bl; + data.byte(kLastinvpos) = al; + _add(bx, bx); + es = data.word(kBuffers); + _add(bx, (0+(180*10)+32)); +} + +void DreamGenContext::findopenpos() { + STACK_CHECK; + cx = data.word(kMousex); + _sub(cx, (80)); + bx = -1; +findopenp1: + _inc(bx); + _sub(cx, (44)); + if (!flags.c()) + goto findopenp1; + al = bl; + data.byte(kLastinvpos) = al; + _add(bx, bx); + es = data.word(kBuffers); + _add(bx, (0+(180*10))); +} + +void DreamGenContext::dropobject() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 223); + if (flags.z()) + goto alreadydrop; + data.byte(kCommandtype) = 223; + _cmp(data.byte(kPickup), 0); + if (flags.z()) + { blank(); return; }; + bl = data.byte(kItemframe); + bh = data.byte(kObjecttype); + al = 37; + commandwithob(); +alreadydrop: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (nodrop) */; + _and(ax, 1); + if (!flags.z()) + goto dodrop; + return; +dodrop: + geteitherad(); + isitworn(); + if (!flags.z()) + goto nowornerror; + wornerror(); + return; +nowornerror: + _cmp(data.byte(kReallocation), 47); + if (flags.z()) + goto nodrop2; + cl = data.byte(kRyanx); + _add(cl, 12); + ch = data.byte(kRyany); + _add(ch, 12); + checkone(); + _cmp(cl, 2); + if (flags.c()) + goto nodroperror; +nodrop2: + droperror(); + return; +nodroperror: + _cmp(data.byte(kMapxsize), 64); + if (!flags.z()) + goto notinlift; + _cmp(data.byte(kMapysize), 64); + if (!flags.z()) + goto notinlift; + droperror(); + return; +notinlift: + al = data.byte(kItemframe); + ah = 4; + cl = 'G'; + ch = 'U'; + dl = 'N'; + dh = 'A'; + compare(); + if (flags.z()) + { cantdrop(); return; }; + al = data.byte(kItemframe); + ah = 4; + cl = 'S'; + ch = 'H'; + dl = 'L'; + dh = 'D'; + compare(); + if (flags.z()) + { cantdrop(); return; }; + data.byte(kObjecttype) = 4; + al = data.byte(kItemframe); + getexad(); + es.byte(bx+2) = 0; + al = data.byte(kRyanx); + _add(al, 4); + cl = 4; + _shr(al, cl); + _add(al, data.byte(kMapx)); + ah = data.byte(kRyany); + _add(ah, 8); + cl = 4; + _shr(ah, cl); + _add(ah, data.byte(kMapy)); + es.byte(bx+3) = al; + es.byte(bx+5) = ah; + al = data.byte(kRyanx); + _add(al, 4); + _and(al, 15); + ah = data.byte(kRyany); + _add(ah, 8); + _and(ah, 15); + es.byte(bx+4) = al; + es.byte(bx+6) = ah; + data.byte(kPickup) = 0; + al = data.byte(kReallocation); + es.byte(bx) = al; +} + +void DreamGenContext::droperror() { + STACK_CHECK; + data.byte(kCommandtype) = 255; + delpointer(); + di = 76; + bx = 21; + al = 56; + dl = 240; + printmessage(); + worktoscreenm(); + cx = 50; + hangonp(); + showpanel(); + showman(); + examicon(); + data.byte(kCommandtype) = 255; + worktoscreenm(); +} + +void DreamGenContext::cantdrop() { + STACK_CHECK; + data.byte(kCommandtype) = 255; + delpointer(); + di = 76; + bx = 21; + al = 24; + dl = 240; + printmessage(); + worktoscreenm(); + cx = 50; + hangonp(); + showpanel(); + showman(); + examicon(); + data.byte(kCommandtype) = 255; + worktoscreenm(); +} + +void DreamGenContext::wornerror() { + STACK_CHECK; + data.byte(kCommandtype) = 255; + delpointer(); + di = 76; + bx = 21; + al = 57; + dl = 240; + printmessage(); + worktoscreenm(); + cx = 50; + hangonp(); + showpanel(); + showman(); + examicon(); + data.byte(kCommandtype) = 255; + worktoscreenm(); +} + +void DreamGenContext::removeobfrominv() { + STACK_CHECK; + _cmp(data.byte(kCommand), 100); + if (flags.z()) + return /* (obnotexist) */; + getanyad(); + di = bx; + cl = data.byte(kCommand); + ch = 0; + deleteexobject(); +} + +void DreamGenContext::selectopenob() { + STACK_CHECK; + al = data.byte(kCommand); + getanyad(); + _cmp(al, 255); + if (!flags.z()) + goto canopenit1; + blank(); + return; +canopenit1: + _cmp(data.byte(kCommandtype), 224); + if (flags.z()) + goto alreadyopob; + data.byte(kCommandtype) = 224; + bl = data.byte(kCommand); + bh = data.byte(kObjecttype); + al = 38; + commandwithob(); +alreadyopob: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (noopenob) */; + _and(ax, 1); + if (!flags.z()) + goto doopenob; + return; +doopenob: + al = data.byte(kCommand); + data.byte(kOpenedob) = al; + al = data.byte(kObjecttype); + data.byte(kOpenedtype) = al; + createpanel(); + showpanel(); + showman(); + examicon(); + showexit(); + openinv(); + openob(); + undertextline(); + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::useopened() { + STACK_CHECK; + _cmp(data.byte(kOpenedob), 255); + if (flags.z()) + return /* (cannotuseopen) */; + _cmp(data.byte(kPickup), 0); + if (!flags.z()) + goto notout2; + outofopen(); + return; +notout2: + findopenpos(); + ax = es.word(bx); + _cmp(al, 255); + if (flags.z()) + goto canplace3; + swapwithopen(); + return; +canplace3: + _cmp(data.byte(kPickup), 1); + if (flags.z()) + goto intoopen; + blank(); + return; +intoopen: + al = data.byte(kItemframe); + ah = data.byte(kObjecttype); + _cmp(ax, data.word(kOldsubject)); + if (!flags.z()) + goto difsub2; + _cmp(data.byte(kCommandtype), 227); + if (flags.z()) + goto alreadyplc2; + data.byte(kCommandtype) = 227; +difsub2: + data.word(kOldsubject) = ax; + bx = ax; + al = 35; + commandwithob(); +alreadyplc2: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (notletgo3) */; + _cmp(ax, 1); + if (flags.z()) + goto doplace2; + return; +doplace2: + geteitherad(); + isitworn(); + if (!flags.z()) + goto notworntoopen; + wornerror(); + return; +notworntoopen: + delpointer(); + al = data.byte(kItemframe); + _cmp(al, data.byte(kOpenedob)); + if (!flags.z()) + goto isntsame; + al = data.byte(kObjecttype); + _cmp(al, data.byte(kOpenedtype)); + if (!flags.z()) + goto isntsame; + errormessage1(); + return; +isntsame: + checkobjectsize(); + _cmp(al, 0); + if (flags.z()) + goto sizeok1; + return; +sizeok1: + data.byte(kPickup) = 0; + al = data.byte(kItemframe); + geteitherad(); + al = data.byte(kOpenedtype); + es.byte(bx+2) = al; + al = data.byte(kOpenedob); + es.byte(bx+3) = al; + al = data.byte(kLastinvpos); + es.byte(bx+4) = al; + al = data.byte(kReallocation); + es.byte(bx+5) = al; + fillopen(); + undertextline(); + readmouse(); + useopened(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::errormessage1() { + STACK_CHECK; + delpointer(); + di = 76; + bx = 21; + al = 58; + dl = 240; + printmessage(); + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); + cx = 50; + hangonp(); + showpanel(); + showman(); + examicon(); + readmouse(); + useopened(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::errormessage2() { + STACK_CHECK; + data.byte(kCommandtype) = 255; + delpointer(); + di = 76; + bx = 21; + al = 59; + dl = 240; + printmessage(); + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); + cx = 50; + hangonp(); + showpanel(); + showman(); + examicon(); + readmouse(); + useopened(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::errormessage3() { + STACK_CHECK; + delpointer(); + di = 76; + bx = 21; + al = 60; + dl = 240; + printmessage(); + worktoscreenm(); + cx = 50; + hangonp(); + showpanel(); + showman(); + examicon(); + readmouse(); + useopened(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::checkobjectsize() { + STACK_CHECK; + getopenedsize(); + push(ax); + al = data.byte(kItemframe); + geteitherad(); + al = es.byte(bx+9); + cx = pop(); + _cmp(al, 255); + if (!flags.z()) + goto notunsized; + al = 6; +notunsized: + _cmp(al, 100); + if (!flags.c()) + goto specialcase; + _cmp(cl, 100); + if (flags.c()) + goto isntspecial; + errormessage3(); + goto sizewrong; +isntspecial: + _cmp(cl, al); + if (!flags.c()) + goto sizeok; +specialcase: + _sub(al, 100); + _cmp(cl, 100); + if (!flags.c()) + goto bothspecial; + _cmp(cl, al); + if (!flags.c()) + goto sizeok; + errormessage2(); + goto sizewrong; +bothspecial: + _sub(cl, 100); + _cmp(al, cl); + if (flags.z()) + goto sizeok; + errormessage3(); +sizewrong: + al = 1; + return; +sizeok: + al = 0; +} + +void DreamGenContext::outofopen() { + STACK_CHECK; + _cmp(data.byte(kOpenedob), 255); + if (flags.z()) + goto cantuseopen; + findopenpos(); + ax = es.word(bx); + _cmp(al, 255); + if (!flags.z()) + goto canpick4; +cantuseopen: + blank(); + return; +canpick4: + _cmp(ax, data.word(kOldsubject)); + if (!flags.z()) + goto difsub4; + _cmp(data.byte(kCommandtype), 228); + if (flags.z()) + goto alreadygrb; + data.byte(kCommandtype) = 228; +difsub4: + data.word(kOldsubject) = ax; + bx = ax; + al = 36; + commandwithob(); +alreadygrb: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (notletgo4) */; + _cmp(ax, 1); + if (flags.z()) + goto dogrb; + _cmp(ax, 2); + if (!flags.z()) + return /* (notletgo4) */; + reexfromopen(); + return; +dogrb: + delpointer(); + data.byte(kPickup) = 1; + findopenpos(); + ax = es.word(bx); + data.byte(kItemframe) = al; + data.byte(kObjecttype) = ah; + _cmp(ah, 4); + if (!flags.z()) + goto makeintoex; + geteitherad(); + es.byte(bx+2) = 20; + es.byte(bx+3) = 255; + goto actuallyout; +makeintoex: + transfertoex(); + data.byte(kItemframe) = al; + data.byte(kObjecttype) = 4; + geteitherad(); + es.byte(bx+2) = 20; + es.byte(bx+3) = 255; +actuallyout: + fillopen(); + undertextline(); + readmouse(); + useopened(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::transfertoex() { + STACK_CHECK; + emergencypurge(); + getexpos(); + al = data.byte(kExpos); + push(ax); + push(di); + al = data.byte(kItemframe); + ah = 0; + bx = 16; + _mul(bx); + ds = data.word(kFreedat); + si = ax; + cx = 8; + _movsw(cx, true); + di = pop(); + al = data.byte(kReallocation); + es.byte(di) = al; + es.byte(di+11) = al; + al = data.byte(kItemframe); + es.byte(di+1) = al; + es.byte(di+2) = 4; + es.byte(di+3) = 255; + al = data.byte(kLastinvpos); + es.byte(di+4) = al; + al = data.byte(kItemframe); + data.byte(kItemtotran) = al; + transfermap(); + transferinv(); + transfertext(); + al = data.byte(kItemframe); + ah = 0; + bx = 16; + _mul(bx); + ds = data.word(kFreedat); + si = ax; + ds.byte(si+2) = 254; + pickupconts(); + ax = pop(); +} + +void DreamGenContext::pickupconts() { + STACK_CHECK; + al = ds.byte(si+7); + _cmp(al, 255); + if (flags.z()) + return /* (notopenable) */; + al = data.byte(kItemframe); + ah = data.byte(kObjecttype); + dl = data.byte(kExpos); + es = data.word(kFreedat); + bx = 0; + cx = 0; +pickupcontloop: + push(cx); + push(es); + push(bx); + push(dx); + push(ax); + _cmp(es.byte(bx+2), ah); + if (!flags.z()) + goto notinsidethis; + _cmp(es.byte(bx+3), al); + if (!flags.z()) + goto notinsidethis; + data.byte(kItemtotran) = cl; + transfercontoex(); +notinsidethis: + ax = pop(); + dx = pop(); + bx = pop(); + es = pop(); + cx = pop(); + _add(bx, 16); + _inc(cx); + _cmp(cx, 80); + if (!flags.z()) + goto pickupcontloop; +} + +void DreamGenContext::transfercontoex() { + STACK_CHECK; + push(es); + push(bx); + push(dx); + push(es); + push(bx); + getexpos(); + si = pop(); + ds = pop(); + push(di); + cx = 8; + _movsw(cx, true); + di = pop(); + dx = pop(); + al = data.byte(kReallocation); + es.byte(di) = al; + es.byte(di+11) = al; + al = data.byte(kItemtotran); + es.byte(di+1) = al; + es.byte(di+3) = dl; + es.byte(di+2) = 4; + transfermap(); + transferinv(); + transfertext(); + si = pop(); + ds = pop(); + ds.byte(si+2) = 255; +} + +void DreamGenContext::transfertext() { + STACK_CHECK; + es = data.word(kExtras); + al = data.byte(kExpos); + ah = 0; + _add(ax, ax); + bx = (0+2080+30000+(16*114)); + _add(bx, ax); + di = data.word(kExtextpos); + es.word(bx) = di; + _add(di, (0+2080+30000+(16*114)+((114+2)*2))); + al = data.byte(kItemtotran); + ah = 0; + _add(ax, ax); + ds = data.word(kFreedesc); + bx = (0); + _add(bx, ax); + si = (0+(82*2)); + ax = ds.word(bx); + _add(si, ax); +moretext: + _lodsb(); + _stosb(); + _inc(data.word(kExtextpos)); + _cmp(al, 0); + if (!flags.z()) + goto moretext; +} + +void DreamGenContext::getexpos() { + STACK_CHECK; + es = data.word(kExtras); + al = 0; + di = (0+2080+30000); +tryanotherex: + _cmp(es.byte(di+2), 255); + if (flags.z()) + goto foundnewex; + _add(di, 16); + _inc(al); + _cmp(al, (114)); + if (!flags.z()) + goto tryanotherex; +foundnewex: + data.byte(kExpos) = al; +} + +void DreamGenContext::purgealocation() { + STACK_CHECK; + push(ax); + es = data.word(kExtras); + di = (0+2080+30000); + bx = pop(); + cx = 0; +purgeloc: + _cmp(bl, es.byte(di+0)); + if (!flags.z()) + goto dontpurge; + _cmp(es.byte(di+2), 0); + if (!flags.z()) + goto dontpurge; + push(di); + push(es); + push(bx); + push(cx); + deleteexobject(); + cx = pop(); + bx = pop(); + es = pop(); + di = pop(); +dontpurge: + _add(di, 16); + _inc(cx); + _cmp(cx, (114)); + if (!flags.z()) + goto purgeloc; +} + +void DreamGenContext::emergencypurge() { + STACK_CHECK; +checkpurgeagain: + ax = data.word(kExframepos); + _add(ax, 4000); + _cmp(ax, (30000)); + if (flags.c()) + goto notnearframeend; + purgeanitem(); + goto checkpurgeagain; +notnearframeend: + ax = data.word(kExtextpos); + _add(ax, 400); + _cmp(ax, (18000)); + if (flags.c()) + return /* (notneartextend) */; + purgeanitem(); + goto checkpurgeagain; +} + +void DreamGenContext::purgeanitem() { + STACK_CHECK; + es = data.word(kExtras); + di = (0+2080+30000); + bl = data.byte(kReallocation); + cx = 0; +lookforpurge: + al = es.byte(di+2); + _cmp(al, 0); + if (!flags.z()) + goto cantpurge; + _cmp(es.byte(di+12), 2); + if (flags.z()) + goto iscup; + _cmp(es.byte(di+12), 255); + if (!flags.z()) + goto cantpurge; +iscup: + _cmp(es.byte(di+11), bl); + if (flags.z()) + goto cantpurge; + deleteexobject(); + return; +cantpurge: + _add(di, 16); + _inc(cx); + _cmp(cx, (114)); + if (!flags.z()) + goto lookforpurge; + di = (0+2080+30000); + bl = data.byte(kReallocation); + cx = 0; +lookforpurge2: + al = es.byte(di+2); + _cmp(al, 0); + if (!flags.z()) + goto cantpurge2; + _cmp(es.byte(di+12), 255); + if (!flags.z()) + goto cantpurge2; + deleteexobject(); + return; +cantpurge2: + _add(di, 16); + _inc(cx); + _cmp(cx, (114)); + if (!flags.z()) + goto lookforpurge2; +} + +void DreamGenContext::deleteexobject() { + STACK_CHECK; + push(cx); + push(cx); + push(cx); + push(cx); + al = 255; + cx = 16; + _stosb(cx, true); + ax = pop(); + cl = al; + _add(al, al); + _add(al, cl); + deleteexframe(); + ax = pop(); + cl = al; + _add(al, al); + _add(al, cl); + _inc(al); + deleteexframe(); + ax = pop(); + deleteextext(); + bx = pop(); + bh = bl; + bl = 4; + di = (0+2080+30000); + cx = 0; +deleteconts: + _cmp(es.word(di+2), bx); + if (!flags.z()) + goto notinsideex; + push(bx); + push(cx); + push(di); + deleteexobject(); + di = pop(); + cx = pop(); + bx = pop(); +notinsideex: + _add(di, 16); + _inc(cx); + _cmp(cx, (114)); + if (!flags.z()) + goto deleteconts; +} + +void DreamGenContext::deleteexframe() { + STACK_CHECK; + di = (0); + ah = 0; + _add(ax, ax); + _add(di, ax); + _add(ax, ax); + _add(di, ax); + al = es.byte(di); + ah = 0; + cl = es.byte(di+1); + ch = 0; + _mul(cx); + si = es.word(di+2); + push(si); + _add(si, (0+2080)); + cx = (30000); + _sub(cx, es.word(di+2)); + di = si; + _add(si, ax); + push(ax); + ds = es; + _movsb(cx, true); + bx = pop(); + _sub(data.word(kExframepos), bx); + si = pop(); + cx = (114)*3; + di = (0); +shuffleadsdown: + ax = es.word(di+2); + _cmp(ax, si); + if (flags.c()) + goto beforethisone; + _sub(ax, bx); +beforethisone: + es.word(di+2) = ax; + _add(di, 6); + if (--cx) + goto shuffleadsdown; +} + +void DreamGenContext::deleteextext() { + STACK_CHECK; + di = (0+2080+30000+(16*114)); + ah = 0; + _add(ax, ax); + _add(di, ax); + ax = es.word(di); + si = ax; + di = ax; + _add(si, (0+2080+30000+(16*114)+((114+2)*2))); + _add(di, (0+2080+30000+(16*114)+((114+2)*2))); + ax = 0; +findlenextext: + cl = es.byte(si); + _inc(ax); + _inc(si); + _cmp(cl, 0); + if (!flags.z()) + goto findlenextext; + cx = (18000); + bx = si; + _sub(bx, (0+2080+30000+(16*114)+((114+2)*2))); + push(bx); + push(ax); + _sub(cx, bx); + _cmp(cx, 0xffff); + if (flags.z()) + goto _tmp1; + _movsb(cx, true); +_tmp1: + bx = pop(); + _sub(data.word(kExtextpos), bx); + si = pop(); + cx = (114); + di = (0+2080+30000+(16*114)); +shuffletextads: + ax = es.word(di); + _cmp(ax, si); + if (flags.c()) + goto beforethistext; + _sub(ax, bx); +beforethistext: + es.word(di) = ax; + _add(di, 2); + if (--cx) + goto shuffletextads; +} + +void DreamGenContext::blockget() { + STACK_CHECK; + ah = al; + al = 0; + ds = data.word(kBackdrop); + si = (0+192); + _add(si, ax); +} + +void DreamGenContext::drawfloor() { + STACK_CHECK; + push(es); + push(bx); + eraseoldobs(); + drawflags(); + calcmapad(); + doblocks(); + showallobs(); + showallfree(); + showallex(); + paneltomap(); + initrain(); + data.byte(kNewobs) = 0; + bx = pop(); + es = pop(); +} + +void DreamGenContext::calcmapad() { + STACK_CHECK; + getdimension(); + push(cx); + push(dx); + al = 11; + _sub(al, dl); + _sub(al, cl); + _sub(al, cl); + ax.cbw(); + bx = 8; + _mul(bx); + _add(ax, data.word(kMapoffsetx)); + data.word(kMapadx) = ax; + dx = pop(); + cx = pop(); + al = 10; + _sub(al, dh); + _sub(al, ch); + _sub(al, ch); + ax.cbw(); + bx = 8; + _mul(bx); + _add(ax, data.word(kMapoffsety)); + data.word(kMapady) = ax; +} + +void DreamGenContext::getdimension() { + STACK_CHECK; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)); + ch = 0; +dimloop1: + addalong(); + _cmp(al, 0); + if (!flags.z()) + goto finishdim1; + _inc(ch); + goto dimloop1; +finishdim1: + bx = (0+(180*10)+32+60+(32*32)); + cl = 0; +dimloop2: + push(bx); + addlength(); + bx = pop(); + _cmp(al, 0); + if (!flags.z()) + goto finishdim2; + _inc(cl); + _add(bx, 3); + goto dimloop2; +finishdim2: + bx = (0+(180*10)+32+60+(32*32))+(11*3*9); + dh = 10; +dimloop3: + push(bx); + addalong(); + bx = pop(); + _cmp(al, 0); + if (!flags.z()) + goto finishdim3; + _dec(dh); + _sub(bx, 11*3); + goto dimloop3; +finishdim3: + bx = (0+(180*10)+32+60+(32*32))+(3*10); + dl = 11; +dimloop4: + push(bx); + addlength(); + bx = pop(); + _cmp(al, 0); + if (!flags.z()) + goto finishdim4; + _dec(dl); + _sub(bx, 3); + goto dimloop4; +finishdim4: + al = cl; + ah = 0; + _shl(ax, 1); + _shl(ax, 1); + _shl(ax, 1); + _shl(ax, 1); + data.word(kMapxstart) = ax; + al = ch; + ah = 0; + _shl(ax, 1); + _shl(ax, 1); + _shl(ax, 1); + _shl(ax, 1); + data.word(kMapystart) = ax; + _sub(dl, cl); + _sub(dh, ch); + al = dl; + ah = 0; + _shl(ax, 1); + _shl(ax, 1); + _shl(ax, 1); + _shl(ax, 1); + data.byte(kMapxsize) = al; + al = dh; + ah = 0; + _shl(ax, 1); + _shl(ax, 1); + _shl(ax, 1); + _shl(ax, 1); + data.byte(kMapysize) = al; +} + +void DreamGenContext::addalong() { + STACK_CHECK; + ah = 11; +addloop: + _cmp(es.byte(bx), 0); + if (!flags.z()) + goto gotalong; + _add(bx, 3); + _dec(ah); + if (!flags.z()) + goto addloop; + al = 0; + return; +gotalong: + al = 1; +} + +void DreamGenContext::addlength() { + STACK_CHECK; + ah = 10; +addloop2: + _cmp(es.byte(bx), 0); + if (!flags.z()) + goto gotlength; + _add(bx, 3*11); + _dec(ah); + if (!flags.z()) + goto addloop2; + al = 0; + return; +gotlength: + al = 1; +} + +void DreamGenContext::drawflags() { + STACK_CHECK; + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)); + al = data.byte(kMapy); + ah = 0; + cx = (66); + _mul(cx); + bl = data.byte(kMapx); + bh = 0; + _add(ax, bx); + si = (0); + _add(si, ax); + cx = 10; +_tmp28: + push(cx); + cx = 11; +_tmp28a: + ds = data.word(kMapdata); + _lodsb(); + ds = data.word(kBackdrop); + push(si); + push(ax); + ah = 0; + _add(ax, ax); + si = (0); + _add(si, ax); + _movsw(); + ax = pop(); + _stosb(); + si = pop(); + if (--cx) + goto _tmp28a; + _add(si, (66)-11); + cx = pop(); + if (--cx) + goto _tmp28; +} + +void DreamGenContext::eraseoldobs() { + STACK_CHECK; + _cmp(data.byte(kNewobs), 0); + if (flags.z()) + return /* (donterase) */; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768); + cx = 16; +oberase: + push(cx); + push(bx); + ax = es.word(bx+20); + _cmp(ax, 0x0ffff); + if (flags.z()) + goto notthisob; + di = bx; + al = 255; + cx = (32); + _stosb(cx, true); +notthisob: + bx = pop(); + cx = pop(); + _add(bx, (32)); + if (--cx) + goto oberase; +} + +void DreamGenContext::showallobs() { + STACK_CHECK; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)); + data.word(kListpos) = bx; + di = bx; + cx = 128*5; + al = 255; + _stosb(cx, true); + es = data.word(kSetframes); + data.word(kFrsegment) = es; + ax = (0); + data.word(kDataad) = ax; + ax = (0+2080); + data.word(kFramesad) = ax; + data.byte(kCurrentob) = 0; + ds = data.word(kSetdat); + si = 0; + cx = 128; +showobsloop: + push(cx); + push(si); + push(si); + _add(si, 58); + es = data.word(kSetdat); + getmapad(); + si = pop(); + _cmp(ch, 0); + if (flags.z()) + goto blankframe; + al = es.byte(si+18); + ah = 0; + data.word(kCurrentframe) = ax; + _cmp(al, 255); + if (flags.z()) + goto blankframe; + push(es); + push(si); + calcfrframe(); + finalframe(); + si = pop(); + es = pop(); + al = es.byte(si+18); + es.byte(si+17) = al; + _cmp(es.byte(si+8), 0); + if (!flags.z()) + goto animating; + _cmp(es.byte(si+5), 5); + if (flags.z()) + goto animating; + _cmp(es.byte(si+5), 6); + if (flags.z()) + goto animating; + ax = data.word(kCurrentframe); + ah = 0; + _add(di, data.word(kMapadx)); + _add(bx, data.word(kMapady)); + showframe(); + goto drawnsetob; +animating: + makebackob(); +drawnsetob: + si = data.word(kListpos); + es = data.word(kBuffers); + al = data.byte(kSavex); + ah = data.byte(kSavey); + es.word(si) = ax; + cx = ax; + ax = data.word(kSavesize); + _add(al, cl); + _add(ah, ch); + es.word(si+2) = ax; + al = data.byte(kCurrentob); + es.byte(si+4) = al; + _add(si, 5); + data.word(kListpos) = si; +blankframe: + _inc(data.byte(kCurrentob)); + si = pop(); + cx = pop(); + _add(si, 64); + _dec(cx); + if (flags.z()) + return /* (finishedsetobs) */; + goto showobsloop; +} + +void DreamGenContext::makebackob() { + STACK_CHECK; + _cmp(data.byte(kNewobs), 0); + if (flags.z()) + return /* (nomake) */; + al = es.byte(si+5); + ah = es.byte(si+8); + push(si); + push(ax); + push(si); + ax = data.word(kObjectx); + bx = data.word(kObjecty); + ah = bl; + si = ax; + cx = 49520; + dx = data.word(kSetframes); + di = (0); + makesprite(); + ax = pop(); + es.word(bx+20) = ax; + ax = pop(); + _cmp(al, 255); + if (!flags.z()) + goto usedpriority; + al = 0; +usedpriority: + es.byte(bx+23) = al; + es.byte(bx+30) = ah; + es.byte(bx+16) = 0; + es.byte(bx+18) = 0; + es.byte(bx+19) = 0; + si = pop(); +} + +void DreamGenContext::showallfree() { + STACK_CHECK; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)); + data.word(kListpos) = bx; + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)); + cx = 80*5; + al = 255; + _stosb(cx, true); + es = data.word(kFreeframes); + data.word(kFrsegment) = es; + ax = (0); + data.word(kDataad) = ax; + ax = (0+2080); + data.word(kFramesad) = ax; + al = 0; + data.byte(kCurrentfree) = al; + ds = data.word(kFreedat); + si = 2; + cx = 0; +loop127: + push(cx); + push(si); + push(si); + es = data.word(kFreedat); + getmapad(); + si = pop(); + _cmp(ch, 0); + if (flags.z()) + goto over138; + al = data.byte(kCurrentfree); + ah = 0; + dx = ax; + _add(ax, ax); + _add(ax, dx); + data.word(kCurrentframe) = ax; + push(es); + push(si); + calcfrframe(); + es = data.word(kMapstore); + ds = data.word(kFrsegment); + finalframe(); + si = pop(); + es = pop(); + _cmp(cx, 0); + if (flags.z()) + goto over138; + ax = data.word(kCurrentframe); + ah = 0; + _add(di, data.word(kMapadx)); + _add(bx, data.word(kMapady)); + showframe(); + si = data.word(kListpos); + es = data.word(kBuffers); + al = data.byte(kSavex); + ah = data.byte(kSavey); + es.word(si) = ax; + cx = ax; + ax = data.word(kSavesize); + _add(al, cl); + _add(ah, ch); + es.word(si+2) = ax; + ax = pop(); + cx = pop(); + push(cx); + push(ax); + es.byte(si+4) = cl; + _add(si, 5); + data.word(kListpos) = si; +over138: + _inc(data.byte(kCurrentfree)); + si = pop(); + cx = pop(); + _add(si, 16); + _inc(cx); + _cmp(cx, 80); + if (flags.z()) + return /* (finfree) */; + goto loop127; +} + +void DreamGenContext::showallex() { + STACK_CHECK; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)); + data.word(kListpos) = bx; + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)); + cx = 100*5; + al = 255; + _stosb(cx, true); + es = data.word(kExtras); + data.word(kFrsegment) = es; + ax = (0); + data.word(kDataad) = ax; + ax = (0+2080); + data.word(kFramesad) = ax; + data.byte(kCurrentex) = 0; + si = (0+2080+30000)+2; + cx = 0; +exloop: + push(cx); + push(si); + es = data.word(kExtras); + push(si); + ch = 0; + _cmp(es.byte(si), 255); + if (flags.z()) + goto notinroom; + al = es.byte(si-2); + _cmp(al, data.byte(kReallocation)); + if (!flags.z()) + goto notinroom; + getmapad(); +notinroom: + si = pop(); + _cmp(ch, 0); + if (flags.z()) + goto blankex; + al = data.byte(kCurrentex); + ah = 0; + dx = ax; + _add(ax, ax); + _add(ax, dx); + data.word(kCurrentframe) = ax; + push(es); + push(si); + calcfrframe(); + es = data.word(kMapstore); + ds = data.word(kFrsegment); + finalframe(); + si = pop(); + es = pop(); + _cmp(cx, 0); + if (flags.z()) + goto blankex; + ax = data.word(kCurrentframe); + ah = 0; + _add(di, data.word(kMapadx)); + _add(bx, data.word(kMapady)); + showframe(); + si = data.word(kListpos); + es = data.word(kBuffers); + al = data.byte(kSavex); + ah = data.byte(kSavey); + es.word(si) = ax; + cx = ax; + ax = data.word(kSavesize); + _add(al, cl); + _add(ah, ch); + es.word(si+2) = ax; + ax = pop(); + cx = pop(); + push(cx); + push(ax); + es.byte(si+4) = cl; + _add(si, 5); + data.word(kListpos) = si; +blankex: + _inc(data.byte(kCurrentex)); + si = pop(); + cx = pop(); + _add(si, 16); + _inc(cx); + _cmp(cx, 100); + if (flags.z()) + return /* (finex) */; + goto exloop; +} + +void DreamGenContext::calcfrframe() { + STACK_CHECK; + dx = data.word(kFrsegment); + ax = data.word(kFramesad); + push(ax); + cx = data.word(kDataad); + ax = data.word(kCurrentframe); + ds = dx; + bx = 6; + _mul(bx); + _add(ax, cx); + bx = ax; + cx = ds.word(bx); + ax = ds.word(bx+2); + dx = ds.word(bx+4); + bx = pop(); + push(dx); + _add(ax, bx); + data.word(kSavesource) = ax; + data.word(kSavesize) = cx; + ax = pop(); + push(ax); + ah = 0; + data.word(kOffsetx) = ax; + ax = pop(); + al = ah; + ah = 0; + data.word(kOffsety) = ax; + return; + ax = pop(); + cx = 0; + data.word(kSavesize) = cx; +} + +void DreamGenContext::finalframe() { + STACK_CHECK; + ax = data.word(kObjecty); + _add(ax, data.word(kOffsety)); + bx = data.word(kObjectx); + _add(bx, data.word(kOffsetx)); + data.byte(kSavex) = bl; + data.byte(kSavey) = al; + di = data.word(kObjectx); + bx = data.word(kObjecty); +} + +void DreamGenContext::adjustlen() { + STACK_CHECK; + ah = al; + _add(al, ch); + _cmp(al, 100); + if (flags.c()) + return /* (over242) */; + al = 224; + _sub(al, ch); + ch = al; +} + +void DreamGenContext::getmapad() { + STACK_CHECK; + getxad(); + _cmp(ch, 0); + if (flags.z()) + return /* (over146) */; + data.word(kObjectx) = ax; + getyad(); + _cmp(ch, 0); + if (flags.z()) + return /* (over146) */; + data.word(kObjecty) = ax; + ch = 1; +} + +void DreamGenContext::getxad() { + STACK_CHECK; + cl = es.byte(si); + _inc(si); + al = es.byte(si); + _inc(si); + ah = es.byte(si); + _inc(si); + _cmp(cl, 0); + if (!flags.z()) + goto over148; + _sub(al, data.byte(kMapx)); + if (flags.c()) + goto over148; + _cmp(al, 11); + if (!flags.c()) + goto over148; + cl = 4; + _shl(al, cl); + _or(al, ah); + ah = 0; + ch = 1; + return; +over148: + ch = 0; +} + +void DreamGenContext::getyad() { + STACK_CHECK; + al = es.byte(si); + _inc(si); + ah = es.byte(si); + _inc(si); + _sub(al, data.byte(kMapy)); + if (flags.c()) + goto over147; + _cmp(al, 10); + if (!flags.c()) + goto over147; + cl = 4; + _shl(al, cl); + _or(al, ah); + ah = 0; + ch = 1; + return; +over147: + ch = 0; +} + +void DreamGenContext::autolook() { + STACK_CHECK; + ax = data.word(kMousex); + _cmp(ax, data.word(kOldx)); + if (!flags.z()) + goto diffmouse; + ax = data.word(kMousey); + _cmp(ax, data.word(kOldy)); + if (!flags.z()) + goto diffmouse; + _dec(data.word(kLookcounter)); + _cmp(data.word(kLookcounter), 0); + if (!flags.z()) + return /* (noautolook) */; + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + return /* (noautolook) */; + dolook(); + return; +diffmouse: + data.word(kLookcounter) = 1000; +} + +void DreamGenContext::look() { + STACK_CHECK; + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + { blank(); return; }; + _cmp(data.byte(kPointermode), 2); + if (flags.z()) + { blank(); return; }; + _cmp(data.byte(kCommandtype), 241); + if (flags.z()) + goto alreadylook; + data.byte(kCommandtype) = 241; + al = 25; + commandonly(); +alreadylook: + _cmp(data.word(kMousebutton), 1); + if (!flags.z()) + return /* (nolook) */; + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (nolook) */; + dolook(); +} + +void DreamGenContext::dolook() { + STACK_CHECK; + createpanel(); + showicon(); + undertextline(); + worktoscreenm(); + data.byte(kCommandtype) = 255; + dumptextline(); + bl = data.byte(kRoomnum); + _and(bl, 31); + bh = 0; + _add(bx, bx); + es = data.word(kRoomdesc); + _add(bx, (0)); + si = es.word(bx); + _add(si, (0+(38*2))); + findnextcolon(); + di = 66; + _cmp(data.byte(kReallocation), 50); + if (flags.c()) + goto notdream3; + di = 40; +notdream3: + bx = 80; + dl = 241; + printslow(); + _cmp(al, 1); + if (flags.z()) + goto afterlook; + cx = 400; + hangonp(); +afterlook: + data.byte(kPointermode) = 0; + data.byte(kCommandtype) = 0; + redrawmainscrn(); + worktoscreenm(); +} + +void DreamGenContext::redrawmainscrn() { + STACK_CHECK; + data.word(kTimecount) = 0; + createpanel(); + data.byte(kNewobs) = 0; + drawfloor(); + printsprites(); + reelsonscreen(); + showicon(); + getunderzoom(); + undertextline(); + readmouse(); + data.byte(kCommandtype) = 255; +} + +void DreamGenContext::getback1() { + STACK_CHECK; + _cmp(data.byte(kPickup), 0); + if (flags.z()) + goto notgotobject; + blank(); + return; +notgotobject: + _cmp(data.byte(kCommandtype), 202); + if (flags.z()) + goto alreadyget; + data.byte(kCommandtype) = 202; + al = 26; + commandonly(); +alreadyget: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (nogetback) */; + _and(ax, 1); + if (!flags.z()) + goto dogetback; + return; +dogetback: + data.byte(kGetback) = 1; + data.byte(kPickup) = 0; +} + +void DreamGenContext::talk() { + STACK_CHECK; + data.byte(kTalkpos) = 0; + data.byte(kInmaparea) = 0; + al = data.byte(kCommand); + data.byte(kCharacter) = al; + createpanel(); + showpanel(); + showman(); + showexit(); + undertextline(); + convicons(); + starttalk(); + data.byte(kCommandtype) = 255; + readmouse(); + showpointer(); + worktoscreen(); +waittalk: + delpointer(); + readmouse(); + animpointer(); + showpointer(); + vsync(); + dumppointer(); + dumptextline(); + data.byte(kGetback) = 0; + bx = 2660; + checkcoords(); + _cmp(data.byte(kGetback), 0); + if (flags.z()) + goto waittalk; + bx = data.word(kPersondata); + es = cs; + _cmp(data.byte(kTalkpos), 4); + if (flags.c()) + goto notnexttalk; + al = es.byte(bx+7); + _or(al, 128); + es.byte(bx+7) = al; +notnexttalk: + redrawmainscrn(); + worktoscreenm(); + _cmp(data.byte(kSpeechloaded), 1); + if (!flags.z()) + return /* (nospeech) */; + cancelch1(); + data.byte(kVolumedirection) = -1; + data.byte(kVolumeto) = 0; +} + +void DreamGenContext::convicons() { + STACK_CHECK; + al = data.byte(kCharacter); + _and(al, 127); + getpersframe(); + di = 234; + bx = 2; + data.word(kCurrentframe) = ax; + findsource(); + ax = data.word(kCurrentframe); + _sub(ax, data.word(kTakeoff)); + ah = 0; + showframe(); +} + +void DreamGenContext::getpersframe() { + STACK_CHECK; + ah = 0; + _add(ax, ax); + bx = ax; + es = data.word(kPeople); + _add(bx, (0)); + ax = es.word(bx); +} + +void DreamGenContext::starttalk() { + STACK_CHECK; + data.byte(kTalkmode) = 0; + al = data.byte(kCharacter); + _and(al, 127); + getpersontext(); + data.word(kCharshift) = 91+91; + di = 66; + bx = 64; + dl = 241; + al = 0; + ah = 79; + printdirect(); + data.word(kCharshift) = 0; + di = 66; + bx = 80; + dl = 241; + al = 0; + ah = 0; + printdirect(); + data.byte(kSpeechloaded) = 0; + al = data.byte(kCharacter); + _and(al, 127); + ah = 0; + cx = 64; + _mul(cx); + cl = 'C'; + dl = 'R'; + dh = data.byte(kReallocation); + loadspeech(); + _cmp(data.byte(kSpeechloaded), 1); + if (!flags.z()) + return /* (nospeech1) */; + data.byte(kVolumedirection) = 1; + data.byte(kVolumeto) = 6; + al = 50+12; + playchannel1(); +} + +void DreamGenContext::getpersontext() { + STACK_CHECK; + ah = 0; + cx = 64*2; + _mul(cx); + si = ax; + es = data.word(kPeople); + _add(si, (0+24)); + cx = (0+24+(1026*2)); + ax = es.word(si); + _add(ax, cx); + si = ax; +} + +void DreamGenContext::moretalk() { + STACK_CHECK; + _cmp(data.byte(kTalkmode), 0); + if (flags.z()) + goto canmore; + redes(); + return; +canmore: + _cmp(data.byte(kCommandtype), 215); + if (flags.z()) + goto alreadymore; + data.byte(kCommandtype) = 215; + al = 49; + commandonly(); +alreadymore: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (nomore) */; + _and(ax, 1); + if (!flags.z()) + goto domoretalk; + return; +domoretalk: + data.byte(kTalkmode) = 2; + data.byte(kTalkpos) = 4; + _cmp(data.byte(kCharacter), 100); + if (flags.c()) + goto notsecondpart; + data.byte(kTalkpos) = 48; +notsecondpart: + dosometalk(); +} + +void DreamGenContext::dosometalk() { + STACK_CHECK; +dospeech: + al = data.byte(kTalkpos); + al = data.byte(kCharacter); + _and(al, 127); + ah = 0; + cx = 64; + _mul(cx); + cx = ax; + al = data.byte(kTalkpos); + ah = 0; + _add(ax, cx); + _add(ax, ax); + si = ax; + es = data.word(kPeople); + _add(si, (0+24)); + cx = (0+24+(1026*2)); + ax = es.word(si); + _add(ax, cx); + si = ax; + _cmp(es.byte(si), 0); + if (flags.z()) + goto endheartalk; + push(es); + push(si); + createpanel(); + showpanel(); + showman(); + showexit(); + convicons(); + si = pop(); + es = pop(); + di = 164; + bx = 64; + dl = 144; + al = 0; + ah = 0; + printdirect(); + al = data.byte(kCharacter); + _and(al, 127); + ah = 0; + cx = 64; + _mul(cx); + cl = data.byte(kTalkpos); + ch = 0; + _add(ax, cx); + cl = 'C'; + dl = 'R'; + dh = data.byte(kReallocation); + loadspeech(); + _cmp(data.byte(kSpeechloaded), 0); + if (flags.z()) + goto noplay1; + al = 62; + playchannel1(); +noplay1: + data.byte(kPointermode) = 3; + worktoscreenm(); + cx = 180; + hangonpq(); + if (!flags.c()) + goto _tmp1; + return; +_tmp1: + _inc(data.byte(kTalkpos)); + al = data.byte(kTalkpos); + al = data.byte(kCharacter); + _and(al, 127); + ah = 0; + cx = 64; + _mul(cx); + cx = ax; + al = data.byte(kTalkpos); + ah = 0; + _add(ax, cx); + _add(ax, ax); + si = ax; + es = data.word(kPeople); + _add(si, (0+24)); + cx = (0+24+(1026*2)); + ax = es.word(si); + _add(ax, cx); + si = ax; + _cmp(es.byte(si), 0); + if (flags.z()) + goto endheartalk; + _cmp(es.byte(si), ':'); + if (flags.z()) + goto skiptalk2; + _cmp(es.byte(si), 32); + if (flags.z()) + goto skiptalk2; + push(es); + push(si); + createpanel(); + showpanel(); + showman(); + showexit(); + convicons(); + si = pop(); + es = pop(); + di = 48; + bx = 128; + dl = 144; + al = 0; + ah = 0; + printdirect(); + al = data.byte(kCharacter); + _and(al, 127); + ah = 0; + cx = 64; + _mul(cx); + cl = data.byte(kTalkpos); + ch = 0; + _add(ax, cx); + cl = 'C'; + dl = 'R'; + dh = data.byte(kReallocation); + loadspeech(); + _cmp(data.byte(kSpeechloaded), 0); + if (flags.z()) + goto noplay2; + al = 62; + playchannel1(); +noplay2: + data.byte(kPointermode) = 3; + worktoscreenm(); + cx = 180; + hangonpq(); + if (!flags.c()) + goto skiptalk2; + return; +skiptalk2: + _inc(data.byte(kTalkpos)); + goto dospeech; +endheartalk: + data.byte(kPointermode) = 0; +} + +void DreamGenContext::hangonpq() { + STACK_CHECK; + data.byte(kGetback) = 0; + bx = 0; +hangloopq: + push(cx); + push(bx); + delpointer(); + readmouse(); + animpointer(); + showpointer(); + vsync(); + dumppointer(); + dumptextline(); + bx = 2692; + checkcoords(); + bx = pop(); + cx = pop(); + _cmp(data.byte(kGetback), 1); + if (flags.z()) + goto quitconv; + _cmp(data.byte(kSpeechloaded), 1); + if (!flags.z()) + goto notspeaking; + _cmp(data.byte(kCh1playing), 255); + if (!flags.z()) + goto notspeaking; + _inc(bx); + _cmp(bx, 40); + if (flags.z()) + goto finishconv; +notspeaking: + _cmp(data.word(kMousebutton), 0); + if (flags.z()) + goto hangloopq; + _cmp(data.word(kOldbutton), 0); + if (!flags.z()) + goto hangloopq; +finishconv: + delpointer(); + data.byte(kPointermode) = 0; + flags._c = false; + return; +quitconv: + delpointer(); + data.byte(kPointermode) = 0; + cancelch1(); + flags._c = true; + } + +void DreamGenContext::redes() { + STACK_CHECK; + _cmp(data.byte(kCh1playing), 255); + if (!flags.z()) + goto cantredes; + _cmp(data.byte(kTalkmode), 2); + if (flags.z()) + goto canredes; +cantredes: + blank(); + return; +canredes: + _cmp(data.byte(kCommandtype), 217); + if (flags.z()) + goto alreadyreds; + data.byte(kCommandtype) = 217; + al = 50; + commandonly(); +alreadyreds: + ax = data.word(kMousebutton); + _and(ax, 1); + if (!flags.z()) + goto doredes; + return; +doredes: + delpointer(); + createpanel(); + showpanel(); + showman(); + showexit(); + convicons(); + starttalk(); + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::newplace() { + STACK_CHECK; + _cmp(data.byte(kNeedtotravel), 1); + if (flags.z()) + goto istravel; + _cmp(data.byte(kAutolocation), -1); + if (!flags.z()) + goto isautoloc; + return; +isautoloc: + al = data.byte(kAutolocation); + data.byte(kNewlocation) = al; + data.byte(kAutolocation) = -1; + return; +istravel: + data.byte(kNeedtotravel) = 0; + selectlocation(); +} + +void DreamGenContext::selectlocation() { + STACK_CHECK; + data.byte(kInmaparea) = 0; + clearbeforeload(); + data.byte(kGetback) = 0; + data.byte(kPointerframe) = 22; + readcitypic(); + showcity(); + getridoftemp(); + readdesticon(); + loadtraveltext(); + showpanel(); + showman(); + showarrows(); + showexit(); + locationpic(); + undertextline(); + data.byte(kCommandtype) = 255; + readmouse(); + data.byte(kPointerframe) = 0; + showpointer(); + worktoscreen(); + al = 9; + ah = 255; + playchannel0(); + data.byte(kNewlocation) = 255; +select: + _cmp(data.byte(kQuitrequested), 0); + if (!flags.z()) + goto quittravel; + delpointer(); + readmouse(); + showpointer(); + vsync(); + dumppointer(); + dumptextline(); + _cmp(data.byte(kGetback), 1); + if (flags.z()) + goto quittravel; + bx = 2714; + checkcoords(); + _cmp(data.byte(kNewlocation), 255); + if (flags.z()) + goto select; + al = data.byte(kNewlocation); + _cmp(al, data.byte(kLocation)); + if (flags.z()) + goto quittravel; + getridoftemp(); + getridoftemp2(); + getridoftemp3(); + es = data.word(kTraveltext); + deallocatemem(); + return; +quittravel: + al = data.byte(kReallocation); + data.byte(kNewlocation) = al; + data.byte(kGetback) = 0; + getridoftemp(); + getridoftemp2(); + getridoftemp3(); + es = data.word(kTraveltext); + deallocatemem(); +} + +void DreamGenContext::showcity() { + STACK_CHECK; + clearwork(); + ds = data.word(kTempgraphics); + di = 57; + bx = 32; + al = 0; + ah = 0; + showframe(); + ds = data.word(kTempgraphics); + di = 120+57; + bx = 32; + al = 1; + ah = 0; + showframe(); +} + +void DreamGenContext::lookatplace() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 224); + if (flags.z()) + goto alreadyinfo; + data.byte(kCommandtype) = 224; + al = 27; + commandonly(); +alreadyinfo: + ax = data.word(kMousebutton); + _and(ax, 1); + if (flags.z()) + return /* (noinfo) */; + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (noinfo) */; + bl = data.byte(kDestpos); + _cmp(bl, 15); + if (!flags.c()) + return /* (noinfo) */; + push(bx); + delpointer(); + deltextline(); + getundercentre(); + ds = data.word(kTempgraphics3); + al = 0; + ah = 0; + di = 60; + bx = 72; + showframe(); + al = 4; + ah = 0; + di = 60; + bx = 72+55; + showframe(); + bx = pop(); + bh = 0; + _add(bx, bx); + es = data.word(kTraveltext); + si = es.word(bx); + _add(si, (66*2)); + findnextcolon(); + di = 63; + bx = 84; + dl = 191; + al = 0; + ah = 0; + printdirect(); + worktoscreenm(); + cx = 500; + hangonp(); + data.byte(kPointermode) = 0; + data.byte(kPointerframe) = 0; + putundercentre(); + worktoscreenm(); +} + +void DreamGenContext::getundercentre() { + STACK_CHECK; + di = 58; + bx = 72; + ds = data.word(kMapstore); + si = 0; + cl = 254; + ch = 110; + multiget(); +} + +void DreamGenContext::putundercentre() { + STACK_CHECK; + di = 58; + bx = 72; + ds = data.word(kMapstore); + si = 0; + cl = 254; + ch = 110; + multiput(); +} + +void DreamGenContext::locationpic() { + STACK_CHECK; + getdestinfo(); + al = es.byte(si); + push(es); + push(si); + di = 0; + _cmp(al, 6); + if (!flags.c()) + goto secondlot; + ds = data.word(kTempgraphics); + _add(al, 4); + goto gotgraphic; +secondlot: + _sub(al, 6); + ds = data.word(kTempgraphics2); +gotgraphic: + _add(di, 104); + bx = 138+14; + ah = 0; + showframe(); + si = pop(); + es = pop(); + al = data.byte(kDestpos); + _cmp(al, data.byte(kReallocation)); + if (!flags.z()) + goto notinthisone; + al = 3; + di = 104; + bx = 140+14; + ds = data.word(kTempgraphics); + ah = 0; + showframe(); +notinthisone: + bl = data.byte(kDestpos); + bh = 0; + _add(bx, bx); + es = data.word(kTraveltext); + si = es.word(bx); + _add(si, (66*2)); + di = 50; + bx = 20; + dl = 241; + al = 0; + ah = 0; + printdirect(); +} + +void DreamGenContext::getdestinfo() { + STACK_CHECK; + al = data.byte(kDestpos); + ah = 0; + push(ax); + dx = data; + es = dx; + si = 8011; + _add(si, ax); + cl = es.byte(si); + ax = pop(); + push(cx); + dx = data; + es = dx; + si = 8027; + _add(si, ax); + ax = pop(); +} + +void DreamGenContext::showarrows() { + STACK_CHECK; + di = 116-12; + bx = 16; + ds = data.word(kTempgraphics); + al = 0; + ah = 0; + showframe(); + di = 226+12; + bx = 16; + ds = data.word(kTempgraphics); + al = 1; + ah = 0; + showframe(); + di = 280; + bx = 14; + ds = data.word(kTempgraphics); + al = 2; + ah = 0; + showframe(); +} + +void DreamGenContext::nextdest() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 218); + if (flags.z()) + goto alreadydu; + data.byte(kCommandtype) = 218; + al = 28; + commandonly(); +alreadydu: + ax = data.word(kMousebutton); + _and(ax, 1); + if (flags.z()) + return /* (nodu) */; + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (nodu) */; +searchdestup: + _inc(data.byte(kDestpos)); + _cmp(data.byte(kDestpos), 15); + if (!flags.z()) + goto notlastdest; + data.byte(kDestpos) = 0; +notlastdest: + getdestinfo(); + _cmp(al, 0); + if (flags.z()) + goto searchdestup; + data.byte(kNewtextline) = 1; + deltextline(); + delpointer(); + showpanel(); + showman(); + showarrows(); + locationpic(); + undertextline(); + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::lastdest() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 219); + if (flags.z()) + goto alreadydd; + data.byte(kCommandtype) = 219; + al = 29; + commandonly(); +alreadydd: + ax = data.word(kMousebutton); + _and(ax, 1); + if (flags.z()) + return /* (nodd) */; + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (nodd) */; +searchdestdown: + _dec(data.byte(kDestpos)); + _cmp(data.byte(kDestpos), -1); + if (!flags.z()) + goto notfirstdest; + data.byte(kDestpos) = 15; +notfirstdest: + getdestinfo(); + _cmp(al, 0); + if (flags.z()) + goto searchdestdown; + data.byte(kNewtextline) = 1; + deltextline(); + delpointer(); + showpanel(); + showman(); + showarrows(); + locationpic(); + undertextline(); + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::destselect() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 222); + if (flags.z()) + goto alreadytrav; + data.byte(kCommandtype) = 222; + al = 30; + commandonly(); +alreadytrav: + ax = data.word(kMousebutton); + _and(ax, 1); + if (flags.z()) + return /* (notrav) */; + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (notrav) */; + getdestinfo(); + al = data.byte(kDestpos); + data.byte(kNewlocation) = al; +} + +void DreamGenContext::getlocation() { + STACK_CHECK; + ah = 0; + bx = ax; + dx = data; + es = dx; + _add(bx, 8011); + al = es.byte(bx); +} + +void DreamGenContext::setlocation() { + STACK_CHECK; + ah = 0; + bx = ax; + dx = data; + es = dx; + _add(bx, 8011); + es.byte(bx) = 1; +} + +void DreamGenContext::resetlocation() { + STACK_CHECK; + push(ax); + _cmp(al, 5); + if (!flags.z()) + goto notdelhotel; + purgealocation(); + al = 21; + purgealocation(); + al = 22; + purgealocation(); + al = 27; + purgealocation(); + goto clearedlocations; +notdelhotel: + _cmp(al, 8); + if (!flags.z()) + goto notdeltvstud; + purgealocation(); + al = 28; + purgealocation(); + goto clearedlocations; +notdeltvstud: + _cmp(al, 6); + if (!flags.z()) + goto notdelsarters; + purgealocation(); + al = 20; + purgealocation(); + al = 25; + purgealocation(); + goto clearedlocations; +notdelsarters: + _cmp(al, 13); + if (!flags.z()) + goto notdelboathouse; + purgealocation(); + al = 29; + purgealocation(); + goto clearedlocations; +notdelboathouse: +clearedlocations: + ax = pop(); + ah = 0; + bx = ax; + dx = data; + es = dx; + _add(bx, 8011); + es.byte(bx) = 0; +} + +void DreamGenContext::readdesticon() { + STACK_CHECK; + dx = 2013; + loadintotemp(); + dx = 2026; + loadintotemp2(); + dx = 1961; + loadintotemp3(); +} + +void DreamGenContext::readcitypic() { + STACK_CHECK; + dx = 2000; + loadintotemp(); +} + +void DreamGenContext::usemon() { + STACK_CHECK; + data.byte(kLasttrigger) = 0; + es = cs; + di = 2970+1; + cx = 12; + al = 32; + _stosb(cx, true); + es = cs; + di = 2942+1; + cx = 12; + al = 32; + _stosb(cx, true); + es = cs; + di = 2836; + es.byte(di) = 1; + _add(di, 26); + cx = 3; +keyloop: + es.byte(di) = 0; + _add(di, 26); + if (--cx) + goto keyloop; + createpanel(); + showpanel(); + showicon(); + drawfloor(); + getridofall(); + dx = 1974; + loadintotemp(); + loadpersonal(); + loadnews(); + loadcart(); + dx = 1870; + loadtempcharset(); + printoutermon(); + initialmoncols(); + printlogo(); + worktoscreen(); + turnonpower(); + fadeupyellows(); + fadeupmonfirst(); + data.word(kMonadx) = 76; + data.word(kMonady) = 141; + al = 1; + monmessage(); + cx = 120; + hangoncurs(); + al = 2; + monmessage(); + cx = 60; + randomaccess(); + al = 3; + monmessage(); + cx = 100; + hangoncurs(); + printlogo(); + scrollmonitor(); + data.word(kBufferin) = 0; + data.word(kBufferout) = 0; +moreinput: + di = data.word(kMonadx); + bx = data.word(kMonady); + push(di); + push(bx); + input(); + bx = pop(); + di = pop(); + data.word(kMonadx) = di; + data.word(kMonady) = bx; + execcommand(); + _cmp(al, 0); + if (flags.z()) + goto moreinput; + getridoftemp(); + getridoftempcharset(); + es = data.word(kTextfile1); + deallocatemem(); + es = data.word(kTextfile2); + deallocatemem(); + es = data.word(kTextfile3); + deallocatemem(); + data.byte(kGetback) = 1; + al = 26; + playchannel1(); + data.byte(kManisoffscreen) = 0; + restoreall(); + redrawmainscrn(); + worktoscreenm(); +} + +void DreamGenContext::printoutermon() { + STACK_CHECK; + di = 40; + bx = 32; + ds = data.word(kTempgraphics); + al = 1; + ah = 0; + showframe(); + di = 264; + bx = 32; + ds = data.word(kTempgraphics); + al = 2; + ah = 0; + showframe(); + di = 40; + bx = 12; + ds = data.word(kTempgraphics); + al = 3; + ah = 0; + showframe(); + di = 40; + bx = 164; + ds = data.word(kTempgraphics); + al = 4; + ah = 0; + showframe(); +} + +void DreamGenContext::loadpersonal() { + STACK_CHECK; + al = data.byte(kLocation); + dx = 2052; + _cmp(al, 0); + if (flags.z()) + goto foundpersonal; + _cmp(al, 42); + if (flags.z()) + goto foundpersonal; + dx = 2065; + _cmp(al, 2); + if (flags.z()) + goto foundpersonal; +foundpersonal: + openfile(); + readheader(); + bx = es.word(di); + push(bx); + cl = 4; + _shr(bx, cl); + allocatemem(); + data.word(kTextfile1) = ax; + ds = ax; + cx = pop(); + dx = 0; + readfromfile(); + closefile(); +} + +void DreamGenContext::loadnews() { + STACK_CHECK; + al = data.byte(kNewsitem); + dx = 2078; + _cmp(al, 0); + if (flags.z()) + goto foundnews; + dx = 2091; + _cmp(al, 1); + if (flags.z()) + goto foundnews; + dx = 2104; + _cmp(al, 2); + if (flags.z()) + goto foundnews; + dx = 2117; +foundnews: + openfile(); + readheader(); + bx = es.word(di); + push(bx); + cl = 4; + _shr(bx, cl); + allocatemem(); + data.word(kTextfile2) = ax; + ds = ax; + cx = pop(); + dx = 0; + readfromfile(); + closefile(); +} + +void DreamGenContext::loadcart() { + STACK_CHECK; + lookininterface(); + dx = 2130; + _cmp(al, 0); + if (flags.z()) + goto gotcart; + dx = 2143; + _cmp(al, 1); + if (flags.z()) + goto gotcart; + dx = 2156; + _cmp(al, 2); + if (flags.z()) + goto gotcart; + dx = 2169; + _cmp(al, 3); + if (flags.z()) + goto gotcart; + dx = 2182; +gotcart: + openfile(); + readheader(); + bx = es.word(di); + push(bx); + cl = 4; + _shr(bx, cl); + allocatemem(); + data.word(kTextfile3) = ax; + ds = ax; + cx = pop(); + dx = 0; + readfromfile(); + closefile(); +} + +void DreamGenContext::lookininterface() { + STACK_CHECK; + al = 'I'; + ah = 'N'; + cl = 'T'; + ch = 'F'; + findsetobject(); + ah = 1; + checkinside(); + _cmp(cl, (114)); + if (flags.z()) + goto emptyinterface; + al = es.byte(bx+15); + _inc(al); + return; +emptyinterface: + al = 0; +} + +void DreamGenContext::turnonpower() { + STACK_CHECK; + cx = 3; +powerloop: + push(cx); + powerlighton(); + cx = 30; + hangon(); + powerlightoff(); + cx = 30; + hangon(); + cx = pop(); + if (--cx) + goto powerloop; + powerlighton(); +} + +void DreamGenContext::randomaccess() { + STACK_CHECK; +accessloop: + push(cx); + vsync(); + vsync(); + randomnum1(); + _and(al, 15); + _cmp(al, 10); + if (flags.c()) + goto off; + accesslighton(); + goto chosenaccess; +off: + accesslightoff(); +chosenaccess: + cx = pop(); + if (--cx) + goto accessloop; + accesslightoff(); +} + +void DreamGenContext::powerlighton() { + STACK_CHECK; + di = 257+4; + bx = 182; + ds = data.word(kTempgraphics); + al = 6; + ah = 0; + push(di); + push(bx); + showframe(); + bx = pop(); + di = pop(); + cl = 12; + ch = 8; + multidump(); +} + +void DreamGenContext::powerlightoff() { + STACK_CHECK; + di = 257+4; + bx = 182; + ds = data.word(kTempgraphics); + al = 5; + ah = 0; + push(di); + push(bx); + showframe(); + bx = pop(); + di = pop(); + cl = 12; + ch = 8; + multidump(); +} + +void DreamGenContext::accesslighton() { + STACK_CHECK; + di = 74; + bx = 182; + ds = data.word(kTempgraphics); + al = 8; + ah = 0; + push(di); + push(bx); + showframe(); + bx = pop(); + di = pop(); + cl = 12; + ch = 8; + multidump(); +} + +void DreamGenContext::accesslightoff() { + STACK_CHECK; + di = 74; + bx = 182; + ds = data.word(kTempgraphics); + al = 7; + ah = 0; + push(di); + push(bx); + showframe(); + bx = pop(); + di = pop(); + cl = 12; + ch = 8; + multidump(); +} + +void DreamGenContext::locklighton() { + STACK_CHECK; + di = 56; + bx = 182; + ds = data.word(kTempgraphics); + al = 10; + ah = 0; + push(di); + push(bx); + showframe(); + bx = pop(); + di = pop(); + cl = 12; + ch = 8; + multidump(); +} + +void DreamGenContext::locklightoff() { + STACK_CHECK; + di = 56; + bx = 182; + ds = data.word(kTempgraphics); + al = 9; + ah = 0; + push(di); + push(bx); + showframe(); + bx = pop(); + di = pop(); + cl = 12; + ch = 8; + multidump(); +} + +void DreamGenContext::input() { + STACK_CHECK; + es = cs; + di = 8045; + cx = 64; + al = 0; + _stosb(cx, true); + data.word(kCurpos) = 0; + al = '>'; + di = data.word(kMonadx); + bx = data.word(kMonady); + ds = data.word(kTempcharset); + ah = 0; + printchar(); + di = data.word(kMonadx); + bx = data.word(kMonady); + cl = 6; + ch = 8; + multidump(); + _add(data.word(kMonadx), 6); + ax = data.word(kMonadx); + data.word(kCurslocx) = ax; + ax = data.word(kMonady); + data.word(kCurslocy) = ax; +waitkey: + printcurs(); + vsync(); + delcurs(); + readkey(); + al = data.byte(kCurrentkey); + _cmp(al, 0); + if (flags.z()) + goto waitkey; + _cmp(al, 13); + if (flags.z()) + return /* (endofinput) */; + _cmp(al, 8); + if (!flags.z()) + goto notdel; + _cmp(data.word(kCurpos), 0); + if (flags.z()) + goto waitkey; + delchar(); + goto waitkey; +notdel: + _cmp(data.word(kCurpos), 28); + if (flags.z()) + goto waitkey; + _cmp(data.byte(kCurrentkey), 32); + if (!flags.z()) + goto notleadingspace; + _cmp(data.word(kCurpos), 0); + if (flags.z()) + goto waitkey; +notleadingspace: + makecaps(); + es = cs; + si = data.word(kCurpos); + _add(si, si); + _add(si, 8045); + es.byte(si) = al; + _cmp(al, 'Z'+1); + if (!flags.c()) + goto waitkey; + push(ax); + push(es); + push(si); + di = data.word(kMonadx); + bx = data.word(kMonady); + ds = data.word(kMapstore); + ax = data.word(kCurpos); + _xchg(al, ah); + si = ax; + cl = 8; + ch = 8; + multiget(); + si = pop(); + es = pop(); + ax = pop(); + push(es); + push(si); + di = data.word(kMonadx); + bx = data.word(kMonady); + ds = data.word(kTempcharset); + ah = 0; + printchar(); + si = pop(); + es = pop(); + es.byte(si+1) = cl; + ch = 0; + _add(data.word(kMonadx), cx); + _inc(data.word(kCurpos)); + _add(data.word(kCurslocx), cx); + goto waitkey; +} + +void DreamGenContext::makecaps() { + STACK_CHECK; + _cmp(al, 'a'); + if (flags.c()) + return /* (notupperc) */; + _sub(al, 32); +} + +void DreamGenContext::delchar() { + STACK_CHECK; + _dec(data.word(kCurpos)); + si = data.word(kCurpos); + _add(si, si); + es = cs; + _add(si, 8045); + es.byte(si) = 0; + al = es.byte(si+1); + ah = 0; + _sub(data.word(kMonadx), ax); + _sub(data.word(kCurslocx), ax); + di = data.word(kMonadx); + bx = data.word(kMonady); + ds = data.word(kMapstore); + ax = data.word(kCurpos); + _xchg(al, ah); + si = ax; + cl = 8; + ch = 8; + multiput(); + di = data.word(kMonadx); + bx = data.word(kMonady); + cl = al; + ch = 8; + multidump(); +} + +void DreamGenContext::execcommand() { + STACK_CHECK; + es = cs; + bx = 2776; + ds = cs; + si = 8045; + al = ds.byte(si); + _cmp(al, 0); + if (!flags.z()) + goto notblankinp; + scrollmonitor(); + return; +notblankinp: + cl = 0; +comloop: + push(bx); + push(si); +comloop2: + al = ds.byte(si); + _add(si, 2); + ah = es.byte(bx); + _inc(bx); + _cmp(ah, 32); + if (flags.z()) + goto foundcom; + _cmp(al, ah); + if (flags.z()) + goto comloop2; + si = pop(); + bx = pop(); + _add(bx, 10); + _inc(cl); + _cmp(cl, 6); + if (!flags.z()) + goto comloop; + neterror(); + al = 0; + return; +foundcom: + si = pop(); + bx = pop(); + _cmp(cl, 1); + if (flags.z()) + goto testcom; + _cmp(cl, 2); + if (flags.z()) + goto directory; + _cmp(cl, 3); + if (flags.z()) + goto accesscom; + _cmp(cl, 4); + if (flags.z()) + goto signoncom; + _cmp(cl, 5); + if (flags.z()) + goto keyscom; + goto quitcom; +directory: + dircom(); + al = 0; + return; +signoncom: + signon(); + al = 0; + return; +accesscom: + read(); + al = 0; + return; +keyscom: + showkeys(); + al = 0; + return; +testcom: + al = 6; + monmessage(); + al = 0; + return; +quitcom: + al = 1; +} + +void DreamGenContext::neterror() { + STACK_CHECK; + al = 5; + monmessage(); + scrollmonitor(); +} + +void DreamGenContext::dircom() { + STACK_CHECK; + cx = 30; + randomaccess(); + parser(); + _cmp(es.byte(di+1), 0); + if (flags.z()) + goto dirroot; + dirfile(); + return; +dirroot: + data.byte(kLogonum) = 0; + ds = cs; + si = 2956; + _inc(si); + es = cs; + di = 2970; + _inc(di); + cx = 12; + _movsb(cx, true); + monitorlogo(); + scrollmonitor(); + al = 9; + monmessage(); + es = data.word(kTextfile1); + searchforfiles(); + es = data.word(kTextfile2); + searchforfiles(); + es = data.word(kTextfile3); + searchforfiles(); + scrollmonitor(); +} + +void DreamGenContext::searchforfiles() { + STACK_CHECK; + bx = (66*2); +directloop1: + al = es.byte(bx); + _inc(bx); + _cmp(al, '*'); + if (flags.z()) + return /* (endofdir) */; + _cmp(al, 34); + if (!flags.z()) + goto directloop1; + monprint(); + goto directloop1; +} + +void DreamGenContext::signon() { + STACK_CHECK; + parser(); + _inc(di); + ds = cs; + si = 2836; + cx = 4; +signonloop: + push(cx); + push(si); + push(di); + _add(si, 14); + cx = 11; +signonloop2: + _lodsb(); + _cmp(al, 32); + if (flags.z()) + goto foundsign; + makecaps(); + ah = es.byte(di); + _inc(di); + _cmp(al, ah); + if (!flags.z()) + goto nomatch; + if (--cx) + goto signonloop2; +nomatch: + di = pop(); + si = pop(); + cx = pop(); + _add(si, 26); + if (--cx) + goto signonloop; + al = 13; + monmessage(); + return; +foundsign: + di = pop(); + si = pop(); + cx = pop(); + bx = si; + es = ds; + _cmp(es.byte(bx), 0); + if (flags.z()) + goto notyetassigned; + al = 17; + monmessage(); + return; +notyetassigned: + push(es); + push(bx); + scrollmonitor(); + al = 15; + monmessage(); + di = data.word(kMonadx); + bx = data.word(kMonady); + push(di); + push(bx); + input(); + bx = pop(); + di = pop(); + data.word(kMonadx) = di; + data.word(kMonady) = bx; + bx = pop(); + es = pop(); + push(es); + push(bx); + _add(bx, 2); + ds = cs; + si = 8045; +checkpass: + _lodsw(); + ah = es.byte(bx); + _inc(bx); + _cmp(ah, 32); + if (flags.z()) + goto passpassed; + _cmp(al, ah); + if (flags.z()) + goto checkpass; + bx = pop(); + es = pop(); + scrollmonitor(); + al = 16; + monmessage(); + return; +passpassed: + al = 14; + monmessage(); + bx = pop(); + es = pop(); + push(es); + push(bx); + _add(bx, 14); + monprint(); + scrollmonitor(); + bx = pop(); + es = pop(); + es.byte(bx) = 1; +} + +void DreamGenContext::showkeys() { + STACK_CHECK; + cx = 10; + randomaccess(); + scrollmonitor(); + al = 18; + monmessage(); + es = cs; + bx = 2836; + cx = 4; +keysloop: + push(cx); + push(bx); + _cmp(es.byte(bx), 0); + if (flags.z()) + goto notheld; + _add(bx, 14); + monprint(); +notheld: + bx = pop(); + cx = pop(); + _add(bx, 26); + if (--cx) + goto keysloop; + scrollmonitor(); +} + +void DreamGenContext::read() { + STACK_CHECK; + cx = 40; + randomaccess(); + parser(); + _cmp(es.byte(di+1), 0); + if (!flags.z()) + goto okcom; + neterror(); + return; +okcom: + es = cs; + di = 2970; + ax = data.word(kTextfile1); + data.word(kMonsource) = ax; + ds = ax; + si = (66*2); + searchforstring(); + _cmp(al, 0); + if (flags.z()) + goto foundfile2; + ax = data.word(kTextfile2); + data.word(kMonsource) = ax; + ds = ax; + si = (66*2); + searchforstring(); + _cmp(al, 0); + if (flags.z()) + goto foundfile2; + ax = data.word(kTextfile3); + data.word(kMonsource) = ax; + ds = ax; + si = (66*2); + searchforstring(); + _cmp(al, 0); + if (flags.z()) + goto foundfile2; + al = 7; + monmessage(); + return; +foundfile2: + getkeyandlogo(); + _cmp(al, 0); + if (flags.z()) + goto keyok1; + return; +keyok1: + es = cs; + di = 2942; + ds = data.word(kMonsource); + searchforstring(); + _cmp(al, 0); + if (flags.z()) + goto findtopictext; + al = data.byte(kOldlogonum); + data.byte(kLogonum) = al; + al = 11; + monmessage(); + return; +findtopictext: + _inc(bx); + push(es); + push(bx); + monitorlogo(); + scrollmonitor(); + bx = pop(); + es = pop(); +moretopic: + monprint(); + al = es.byte(bx); + _cmp(al, 34); + if (flags.z()) + goto endoftopic; + _cmp(al, '='); + if (flags.z()) + goto endoftopic; + _cmp(al, '*'); + if (flags.z()) + goto endoftopic; + push(es); + push(bx); + processtrigger(); + cx = 24; + randomaccess(); + bx = pop(); + es = pop(); + goto moretopic; +endoftopic: + scrollmonitor(); +} + +void DreamGenContext::dirfile() { + STACK_CHECK; + al = 34; + es.byte(di) = al; + push(es); + push(di); + ds = data.word(kTextfile1); + si = (66*2); + searchforstring(); + _cmp(al, 0); + if (flags.z()) + goto foundfile; + di = pop(); + es = pop(); + push(es); + push(di); + ds = data.word(kTextfile2); + si = (66*2); + searchforstring(); + _cmp(al, 0); + if (flags.z()) + goto foundfile; + di = pop(); + es = pop(); + push(es); + push(di); + ds = data.word(kTextfile3); + si = (66*2); + searchforstring(); + _cmp(al, 0); + if (flags.z()) + goto foundfile; + di = pop(); + es = pop(); + al = 7; + monmessage(); + return; +foundfile: + ax = pop(); + ax = pop(); + getkeyandlogo(); + _cmp(al, 0); + if (flags.z()) + goto keyok2; + return; +keyok2: + push(es); + push(bx); + ds = cs; + si = 2942+1; + es = cs; + di = 2970+1; + cx = 12; + _movsb(cx, true); + monitorlogo(); + scrollmonitor(); + al = 10; + monmessage(); + bx = pop(); + es = pop(); +directloop2: + al = es.byte(bx); + _inc(bx); + _cmp(al, 34); + if (flags.z()) + goto endofdir2; + _cmp(al, '*'); + if (flags.z()) + goto endofdir2; + _cmp(al, '='); + if (!flags.z()) + goto directloop2; + monprint(); + goto directloop2; +endofdir2: + scrollmonitor(); +} + +void DreamGenContext::getkeyandlogo() { + STACK_CHECK; + _inc(bx); + al = es.byte(bx); + _sub(al, 48); + data.byte(kNewlogonum) = al; + _add(bx, 2); + al = es.byte(bx); + _sub(al, 48); + data.byte(kKeynum) = al; + _inc(bx); + push(es); + push(bx); + al = data.byte(kKeynum); + ah = 0; + cx = 26; + _mul(cx); + es = cs; + bx = 2836; + _add(bx, ax); + al = es.byte(bx); + _cmp(al, 1); + if (flags.z()) + goto keyok; + push(bx); + push(es); + al = 12; + monmessage(); + es = pop(); + bx = pop(); + _add(bx, 14); + monprint(); + scrollmonitor(); + bx = pop(); + es = pop(); + al = 1; + return; +keyok: + bx = pop(); + es = pop(); + al = data.byte(kNewlogonum); + data.byte(kLogonum) = al; + al = 0; +} + +void DreamGenContext::searchforstring() { + STACK_CHECK; + dl = es.byte(di); + cx = di; +restartlook: + di = cx; + bx = si; + dh = 0; +keeplooking: + _lodsb(); + makecaps(); + _cmp(al, '*'); + if (flags.z()) + goto notfound; + _cmp(dl, '='); + if (!flags.z()) + goto nofindingtopic; + _cmp(al, 34); + if (flags.z()) + goto notfound; +nofindingtopic: + ah = es.byte(di); + _cmp(al, dl); + if (!flags.z()) + goto notbracket; + _inc(dh); + _cmp(dh, 2); + if (flags.z()) + goto complete; +notbracket: + _cmp(al, ah); + if (!flags.z()) + goto restartlook; + _inc(di); + goto keeplooking; +complete: + es = ds; + al = 0; + bx = si; + return; +notfound: + al = 1; +} + +void DreamGenContext::parser() { + STACK_CHECK; + es = cs; + di = 2942; + cx = 13; + al = 0; + _stosb(cx, true); + di = 2942; + al = '='; + _stosb(); + ds = cs; + si = 8045; +notspace1: + _lodsw(); + _cmp(al, 32); + if (flags.z()) + goto stillspace1; + _cmp(al, 0); + if (!flags.z()) + goto notspace1; + goto finishpars; +stillspace1: + _lodsw(); + _cmp(al, 32); + if (flags.z()) + goto stillspace1; +copyin1: + _stosb(); + _lodsw(); + _cmp(al, 0); + if (flags.z()) + goto finishpars; + _cmp(al, 32); + if (!flags.z()) + goto copyin1; +finishpars: + di = 2942; +} + +void DreamGenContext::scrollmonitor() { + STACK_CHECK; + push(ax); + push(bx); + push(cx); + push(dx); + push(di); + push(si); + push(es); + push(ds); + printlogo(); + di = data.word(kMonadx); + bx = data.word(kMonady); + printundermon(); + ax = data.word(kMonady); + worktoscreen(); + al = 25; + playchannel1(); + ds = pop(); + es = pop(); + si = pop(); + di = pop(); + dx = pop(); + cx = pop(); + bx = pop(); + ax = pop(); +} + +void DreamGenContext::lockmon() { + STACK_CHECK; + _cmp(data.byte(kLasthardkey), 57); + if (!flags.z()) + return /* (notlock) */; + locklighton(); +lockloop: + _cmp(data.byte(kLasthardkey), 57); + if (flags.z()) + goto lockloop; + locklightoff(); +} + +void DreamGenContext::monitorlogo() { + STACK_CHECK; + al = data.byte(kLogonum); + _cmp(al, data.byte(kOldlogonum)); + if (flags.z()) + goto notnewlogo; + data.byte(kOldlogonum) = al; + printlogo(); + printundermon(); + worktoscreen(); + printlogo(); + printlogo(); + al = 26; + playchannel1(); + cx = 20; + randomaccess(); + return; +notnewlogo: + printlogo(); +} + +void DreamGenContext::printlogo() { + STACK_CHECK; + di = 56; + bx = 32; + ds = data.word(kTempgraphics); + al = 0; + ah = 0; + showframe(); + showcurrentfile(); +} + +void DreamGenContext::showcurrentfile() { + STACK_CHECK; + di = 178; + bx = 37; + si = 2970+1; +curfileloop: + al = cs.byte(si); + _cmp(al, 0); + if (flags.z()) + return /* (finishfile) */; + _inc(si); + push(si); + ds = data.word(kTempcharset); + ah = 0; + printchar(); + si = pop(); + goto curfileloop; +} + +void DreamGenContext::monmessage() { + STACK_CHECK; + es = data.word(kTextfile1); + bx = (66*2); + cl = al; + ch = 0; +monmessageloop: + al = es.byte(bx); + _inc(bx); + _cmp(al, '+'); + if (!flags.z()) + goto monmessageloop; + if (--cx) + goto monmessageloop; + monprint(); +} + +void DreamGenContext::processtrigger() { + STACK_CHECK; + _cmp(data.byte(kLasttrigger), '1'); + if (!flags.z()) + goto notfirsttrigger; + al = 8; + setlocation(); + al = 45; + triggermessage(); + return; +notfirsttrigger: + _cmp(data.byte(kLasttrigger), '2'); + if (!flags.z()) + goto notsecondtrigger; + al = 9; + setlocation(); + al = 55; + triggermessage(); + return; +notsecondtrigger: + _cmp(data.byte(kLasttrigger), '3'); + if (!flags.z()) + return /* (notthirdtrigger) */; + al = 2; + setlocation(); + al = 59; + triggermessage(); +} + +void DreamGenContext::triggermessage() { + STACK_CHECK; + push(ax); + di = 174; + bx = 153; + cl = 200; + ch = 63; + ds = data.word(kMapstore); + si = 0; + multiget(); + ax = pop(); + findpuztext(); + di = 174; + bx = 156; + dl = 141; + ah = 16; + printdirect(); + cx = 140; + hangon(); + worktoscreen(); + cx = 340; + hangon(); + di = 174; + bx = 153; + cl = 200; + ch = 63; + ds = data.word(kMapstore); + si = 0; + multiput(); + worktoscreen(); + data.byte(kLasttrigger) = 0; +} + +void DreamGenContext::printcurs() { + STACK_CHECK; + push(si); + push(di); + push(ds); + push(dx); + push(bx); + push(es); + di = data.word(kCurslocx); + bx = data.word(kCurslocy); + cl = 6; + ch = 8; + ds = data.word(kBuffers); + si = (0); + push(di); + push(bx); + multiget(); + bx = pop(); + di = pop(); + push(bx); + push(di); + _inc(data.word(kMaintimer)); + ax = data.word(kMaintimer); + _and(al, 16); + if (!flags.z()) + goto flashcurs; + al = '/'; + _sub(al, 32); + ah = 0; + ds = data.word(kTempcharset); + showframe(); +flashcurs: + di = pop(); + bx = pop(); + _sub(di, 6); + cl = 12; + ch = 8; + multidump(); + es = pop(); + bx = pop(); + dx = pop(); + ds = pop(); + di = pop(); + si = pop(); +} + +void DreamGenContext::delcurs() { + STACK_CHECK; + push(es); + push(bx); + push(di); + push(ds); + push(dx); + push(si); + di = data.word(kCurslocx); + bx = data.word(kCurslocy); + cl = 6; + ch = 8; + push(di); + push(bx); + push(cx); + ds = data.word(kBuffers); + si = (0); + multiput(); + cx = pop(); + bx = pop(); + di = pop(); + multidump(); + si = pop(); + dx = pop(); + ds = pop(); + di = pop(); + bx = pop(); + es = pop(); +} + +void DreamGenContext::useobject() { + STACK_CHECK; + data.byte(kWithobject) = 255; + _cmp(data.byte(kCommandtype), 229); + if (flags.z()) + goto alreadyuse; + data.byte(kCommandtype) = 229; + bl = data.byte(kCommand); + bh = data.byte(kObjecttype); + al = 51; + commandwithob(); +alreadyuse: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (nouse) */; + _and(ax, 1); + if (!flags.z()) + goto douse; + return; +douse: + useroutine(); +} + +void DreamGenContext::useroutine() { + STACK_CHECK; + _cmp(data.byte(kReallocation), 50); + if (flags.c()) + goto nodream7; + _cmp(data.byte(kPointerpower), 0); + if (!flags.z()) + goto powerok; + return; +powerok: + data.byte(kPointerpower) = 0; +nodream7: + getanyad(); + dx = data; + ds = dx; + si = 2984; +checkuselist: + push(si); + _lodsb(); + _sub(al, 'A'); + _cmp(al, es.byte(bx+12)); + if (!flags.z()) + goto failed; + _lodsb(); + _sub(al, 'A'); + _cmp(al, es.byte(bx+13)); + if (!flags.z()) + goto failed; + _lodsb(); + _sub(al, 'A'); + _cmp(al, es.byte(bx+14)); + if (!flags.z()) + goto failed; + _lodsb(); + _sub(al, 'A'); + _cmp(al, es.byte(bx+15)); + if (!flags.z()) + goto failed; + _lodsw(); + si = pop(); + __dispatch_call(ax); + return; +failed: + si = pop(); + _add(si, 6); + _cmp(ds.byte(si), 140); + if (!flags.z()) + goto checkuselist; + delpointer(); + getobtextstart(); + findnextcolon(); + _cmp(al, 0); + if (flags.z()) + goto cantuse2; + findnextcolon(); + _cmp(al, 0); + if (flags.z()) + goto cantuse2; + al = es.byte(si); + _cmp(al, 0); + if (flags.z()) + goto cantuse2; + usetext(); + cx = 400; + hangonp(); + putbackobstuff(); + return; +cantuse2: + createpanel(); + showpanel(); + showman(); + showexit(); + obicons(); + di = 33; + bx = 100; + al = 63; + dl = 241; + printmessage(); + worktoscreenm(); + cx = 50; + hangonp(); + putbackobstuff(); + data.byte(kCommandtype) = 255; +} + +void DreamGenContext::wheelsound() { + STACK_CHECK; + al = 17; + playchannel1(); + showfirstuse(); + putbackobstuff(); +} + +void DreamGenContext::runtap() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto tapwith; + withwhat(); + return; +tapwith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'C'; + ch = 'U'; + dl = 'P'; + dh = 'E'; + compare(); + if (flags.z()) + goto fillcupfromtap; + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'C'; + ch = 'U'; + dl = 'P'; + dh = 'F'; + compare(); + if (flags.z()) + goto cupfromtapfull; + cx = 300; + al = 56; + showpuztext(); + putbackobstuff(); + return; +fillcupfromtap: + al = data.byte(kWithobject); + getexad(); + es.byte(bx+15) = 'F'-'A'; + al = 8; + playchannel1(); + cx = 300; + al = 57; + showpuztext(); + putbackobstuff(); + return; +cupfromtapfull: + cx = 300; + al = 58; + showpuztext(); + putbackobstuff(); +} + +void DreamGenContext::playguitar() { + STACK_CHECK; + al = 14; + playchannel1(); + showfirstuse(); + putbackobstuff(); +} + +void DreamGenContext::hotelcontrol() { + STACK_CHECK; + _cmp(data.byte(kReallocation), 21); + if (!flags.z()) + goto notrightcont; + _cmp(data.byte(kMapx), 33); + if (!flags.z()) + goto notrightcont; + showfirstuse(); + putbackobstuff(); + return; +notrightcont: + showseconduse(); + putbackobstuff(); +} + +void DreamGenContext::hotelbell() { + STACK_CHECK; + al = 12; + playchannel1(); + showfirstuse(); + putbackobstuff(); +} + +void DreamGenContext::opentomb() { + STACK_CHECK; + _inc(data.byte(kProgresspoints)); + showfirstuse(); + data.word(kWatchingtime) = 35*2; + data.word(kReeltowatch) = 1; + data.word(kEndwatchreel) = 33; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; +} + +void DreamGenContext::usetrainer() { + STACK_CHECK; + getanyad(); + _cmp(es.byte(bx+2), 4); + if (!flags.z()) + goto notheldtrainer; + _inc(data.byte(kProgresspoints)); + makeworn(); + showseconduse(); + putbackobstuff(); + return; +notheldtrainer: + nothelderror(); +} + +void DreamGenContext::nothelderror() { + STACK_CHECK; + createpanel(); + showpanel(); + showman(); + showexit(); + obicons(); + di = 64; + bx = 100; + al = 63; + ah = 1; + dl = 201; + printmessage2(); + worktoscreenm(); + cx = 50; + hangonp(); + putbackobstuff(); +} + +void DreamGenContext::usepipe() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto pipewith; + withwhat(); + return; +pipewith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'C'; + ch = 'U'; + dl = 'P'; + dh = 'E'; + compare(); + if (flags.z()) + goto fillcup; + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'C'; + ch = 'U'; + dl = 'P'; + dh = 'F'; + compare(); + if (flags.z()) + goto alreadyfull; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +fillcup: + cx = 300; + al = 36; + showpuztext(); + putbackobstuff(); + al = data.byte(kWithobject); + getexad(); + es.byte(bx+15) = 'F'-'A'; + return; +alreadyfull: + cx = 300; + al = 35; + showpuztext(); + putbackobstuff(); +} + +void DreamGenContext::usefullcart() { + STACK_CHECK; + _inc(data.byte(kProgresspoints)); + al = 2; + ah = data.byte(kRoomnum); + _add(ah, 6); + turnanypathon(); + data.byte(kManspath) = 4; + data.byte(kFacing) = 4; + data.byte(kTurntoface) = 4; + data.byte(kFinaldest) = 4; + findxyfrompath(); + data.byte(kResetmanxy) = 1; + showfirstuse(); + data.word(kWatchingtime) = 72*2; + data.word(kReeltowatch) = 58; + data.word(kEndwatchreel) = 142; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; +} + +void DreamGenContext::useplinth() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto plinthwith; + withwhat(); + return; +plinthwith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'D'; + ch = 'K'; + dl = 'E'; + dh = 'Y'; + compare(); + if (flags.z()) + goto isrightkey; + showfirstuse(); + putbackobstuff(); + return; +isrightkey: + _inc(data.byte(kProgresspoints)); + showseconduse(); + data.word(kWatchingtime) = 220; + data.word(kReeltowatch) = 0; + data.word(kEndwatchreel) = 104; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; + al = data.byte(kRoomafterdream); + data.byte(kNewlocation) = al; +} + +void DreamGenContext::chewy() { + STACK_CHECK; + showfirstuse(); + getanyad(); + es.byte(bx+2) = 255; + data.byte(kGetback) = 1; +} + +void DreamGenContext::useladder() { + STACK_CHECK; + showfirstuse(); + _sub(data.byte(kMapx), 11); + findroominloc(); + data.byte(kFacing) = 6; + data.byte(kTurntoface) = 6; + data.byte(kManspath) = 0; + data.byte(kDestination) = 0; + data.byte(kFinaldest) = 0; + findxyfrompath(); + data.byte(kResetmanxy) = 1; + data.byte(kGetback) = 1; +} + +void DreamGenContext::useladderb() { + STACK_CHECK; + showfirstuse(); + _add(data.byte(kMapx), 11); + findroominloc(); + data.byte(kFacing) = 2; + data.byte(kTurntoface) = 2; + data.byte(kManspath) = 1; + data.byte(kDestination) = 1; + data.byte(kFinaldest) = 1; + findxyfrompath(); + data.byte(kResetmanxy) = 1; + data.byte(kGetback) = 1; +} + +void DreamGenContext::slabdoora() { + STACK_CHECK; + showfirstuse(); + data.byte(kGetback) = 1; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.word(kReeltowatch) = 13; + _cmp(data.byte(kDreamnumber), 3); + if (!flags.z()) + goto slabawrong; + _inc(data.byte(kProgresspoints)); + data.word(kWatchingtime) = 60; + data.word(kEndwatchreel) = 42; + data.byte(kNewlocation) = 47; + return; +slabawrong: + data.word(kWatchingtime) = 40; + data.word(kEndwatchreel) = 34; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; +} + +void DreamGenContext::slabdoorb() { + STACK_CHECK; + _cmp(data.byte(kDreamnumber), 1); + if (!flags.z()) + goto slabbwrong; + al = 'S'; + ah = 'H'; + cl = 'L'; + ch = 'D'; + isryanholding(); + if (!flags.z()) + goto gotcrystal; + al = 44; + cx = 200; + showpuztext(); + putbackobstuff(); + return; +gotcrystal: + showfirstuse(); + _inc(data.byte(kProgresspoints)); + data.byte(kGetback) = 1; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.word(kReeltowatch) = 44; + data.word(kWatchingtime) = 60; + data.word(kEndwatchreel) = 71; + data.byte(kNewlocation) = 47; + return; +slabbwrong: + showfirstuse(); + data.byte(kGetback) = 1; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.word(kReeltowatch) = 44; + data.word(kWatchingtime) = 40; + data.word(kEndwatchreel) = 63; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; +} + +void DreamGenContext::slabdoord() { + STACK_CHECK; + showfirstuse(); + data.byte(kGetback) = 1; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.word(kReeltowatch) = 75; + _cmp(data.byte(kDreamnumber), 0); + if (!flags.z()) + goto slabcwrong; + _inc(data.byte(kProgresspoints)); + data.word(kWatchingtime) = 60; + data.word(kEndwatchreel) = 102; + data.byte(kNewlocation) = 47; + return; +slabcwrong: + data.word(kWatchingtime) = 40; + data.word(kEndwatchreel) = 94; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; +} + +void DreamGenContext::slabdoorc() { + STACK_CHECK; + showfirstuse(); + data.byte(kGetback) = 1; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.word(kReeltowatch) = 108; + _cmp(data.byte(kDreamnumber), 4); + if (!flags.z()) + goto slabdwrong; + _inc(data.byte(kProgresspoints)); + data.word(kWatchingtime) = 60; + data.word(kEndwatchreel) = 135; + data.byte(kNewlocation) = 47; + return; +slabdwrong: + data.word(kWatchingtime) = 40; + data.word(kEndwatchreel) = 127; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; +} + +void DreamGenContext::slabdoore() { + STACK_CHECK; + showfirstuse(); + data.byte(kGetback) = 1; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.word(kReeltowatch) = 141; + _cmp(data.byte(kDreamnumber), 5); + if (!flags.z()) + goto slabewrong; + _inc(data.byte(kProgresspoints)); + data.word(kWatchingtime) = 60; + data.word(kEndwatchreel) = 168; + data.byte(kNewlocation) = 47; + return; +slabewrong: + data.word(kWatchingtime) = 40; + data.word(kEndwatchreel) = 160; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; +} + +void DreamGenContext::slabdoorf() { + STACK_CHECK; + showfirstuse(); + data.byte(kGetback) = 1; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.word(kReeltowatch) = 171; + _cmp(data.byte(kDreamnumber), 2); + if (!flags.z()) + goto slabfwrong; + _inc(data.byte(kProgresspoints)); + data.word(kWatchingtime) = 60; + data.word(kEndwatchreel) = 197; + data.byte(kNewlocation) = 47; + return; +slabfwrong: + data.word(kWatchingtime) = 40; + data.word(kEndwatchreel) = 189; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; +} + +void DreamGenContext::useslab() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto slabwith; + withwhat(); + return; +slabwith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'J'; + ch = 'E'; + dl = 'W'; + dh = 'L'; + compare(); + if (flags.z()) + goto nextslab; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +nextslab: + al = data.byte(kWithobject); + getexad(); + es.byte(bx+2) = 0; + al = data.byte(kCommand); + push(ax); + removesetobject(); + ax = pop(); + _inc(al); + push(ax); + placesetobject(); + ax = pop(); + _cmp(al, 54); + if (!flags.z()) + goto notlastslab; + al = 0; + turnpathon(); + data.word(kWatchingtime) = 22; + data.word(kReeltowatch) = 35; + data.word(kEndwatchreel) = 48; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; +notlastslab: + _inc(data.byte(kProgresspoints)); + showfirstuse(); + data.byte(kGetback) = 1; +} + +void DreamGenContext::usecart() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto cartwith; + withwhat(); + return; +cartwith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'R'; + ch = 'O'; + dl = 'C'; + dh = 'K'; + compare(); + if (flags.z()) + goto nextcart; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +nextcart: + al = data.byte(kWithobject); + getexad(); + es.byte(bx+2) = 0; + al = data.byte(kCommand); + push(ax); + removesetobject(); + ax = pop(); + _inc(al); + placesetobject(); + _inc(data.byte(kProgresspoints)); + al = 17; + playchannel1(); + showfirstuse(); + data.byte(kGetback) = 1; +} + +void DreamGenContext::useclearbox() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto clearboxwith; + withwhat(); + return; +clearboxwith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'R'; + ch = 'A'; + dl = 'I'; + dh = 'L'; + compare(); + if (flags.z()) + goto openbox; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +openbox: + _inc(data.byte(kProgresspoints)); + showfirstuse(); + data.word(kWatchingtime) = 80; + data.word(kReeltowatch) = 67; + data.word(kEndwatchreel) = 105; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; +} + +void DreamGenContext::usecoveredbox() { + STACK_CHECK; + _inc(data.byte(kProgresspoints)); + showfirstuse(); + data.word(kWatchingtime) = 50; + data.word(kReeltowatch) = 41; + data.word(kEndwatchreel) = 66; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; +} + +void DreamGenContext::userailing() { + STACK_CHECK; + showfirstuse(); + data.word(kWatchingtime) = 80; + data.word(kReeltowatch) = 0; + data.word(kEndwatchreel) = 30; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; + data.byte(kMandead) = 4; +} + +void DreamGenContext::useopenbox() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto openboxwith; + withwhat(); + return; +openboxwith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'C'; + ch = 'U'; + dl = 'P'; + dh = 'F'; + compare(); + if (flags.z()) + goto destoryopenbox; + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'C'; + ch = 'U'; + dl = 'P'; + dh = 'E'; + compare(); + if (flags.z()) + goto openboxwrong; + showfirstuse(); + return; +destoryopenbox: + _inc(data.byte(kProgresspoints)); + cx = 300; + al = 37; + showpuztext(); + al = data.byte(kWithobject); + getexad(); + es.byte(bx+15) = 'E'-'A'; + data.word(kWatchingtime) = 140; + data.word(kReeltowatch) = 105; + data.word(kEndwatchreel) = 181; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + al = 4; + turnpathon(); + data.byte(kGetback) = 1; + return; +openboxwrong: + cx = 300; + al = 38; + showpuztext(); + putbackobstuff(); +} + +void DreamGenContext::wearwatch() { + STACK_CHECK; + _cmp(data.byte(kWatchon), 1); + if (flags.z()) + goto wearingwatch; + showfirstuse(); + data.byte(kWatchon) = 1; + data.byte(kGetback) = 1; + getanyad(); + makeworn(); + return; +wearingwatch: + showseconduse(); + putbackobstuff(); +} + +void DreamGenContext::wearshades() { + STACK_CHECK; + _cmp(data.byte(kShadeson), 1); + if (flags.z()) + goto wearingshades; + data.byte(kShadeson) = 1; + showfirstuse(); + data.byte(kGetback) = 1; + getanyad(); + makeworn(); + return; +wearingshades: + showseconduse(); + putbackobstuff(); +} + +void DreamGenContext::sitdowninbar() { + STACK_CHECK; + _cmp(data.byte(kWatchmode), -1); + if (!flags.z()) + goto satdown; + showfirstuse(); + data.word(kWatchingtime) = 50; + data.word(kReeltowatch) = 55; + data.word(kEndwatchreel) = 71; + data.word(kReeltohold) = 73; + data.word(kEndofholdreel) = 83; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; + return; +satdown: + showseconduse(); + putbackobstuff(); +} + +void DreamGenContext::usechurchhole() { + STACK_CHECK; + showfirstuse(); + data.byte(kGetback) = 1; + data.word(kWatchingtime) = 28; + data.word(kReeltowatch) = 13; + data.word(kEndwatchreel) = 26; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; +} + +void DreamGenContext::usehole() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto holewith; + withwhat(); + return; +holewith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'H'; + ch = 'N'; + dl = 'D'; + dh = 'A'; + compare(); + if (flags.z()) + goto righthand; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +righthand: + showfirstuse(); + al = 86; + removesetobject(); + al = data.byte(kWithobject); + getexad(); + es.byte(bx+2) = 255; + data.byte(kCanmovealtar) = 1; + data.byte(kGetback) = 1; +} + +void DreamGenContext::usealtar() { + STACK_CHECK; + al = 'C'; + ah = 'N'; + cl = 'D'; + ch = 'A'; + findexobject(); + _cmp(al, (114)); + if (flags.z()) + goto thingsonaltar; + al = 'C'; + ah = 'N'; + cl = 'D'; + ch = 'B'; + findexobject(); + _cmp(al, (114)); + if (flags.z()) + goto thingsonaltar; + _cmp(data.byte(kCanmovealtar), 1); + if (flags.z()) + goto movealtar; + cx = 300; + al = 23; + showpuztext(); + data.byte(kGetback) = 1; + return; +movealtar: + _inc(data.byte(kProgresspoints)); + showseconduse(); + data.word(kWatchingtime) = 160; + data.word(kReeltowatch) = 81; + data.word(kEndwatchreel) = 174; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + al = 47; + bl = 52; + bh = 76; + cx = 32; + dx = 98; + setuptimeduse(); + data.byte(kGetback) = 1; + return; +thingsonaltar: + showfirstuse(); + data.byte(kGetback) = 1; +} + +void DreamGenContext::opentvdoor() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto tvdoorwith; + withwhat(); + return; +tvdoorwith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'U'; + ch = 'L'; + dl = 'O'; + dh = 'K'; + compare(); + if (flags.z()) + goto keyontv; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +keyontv: + showfirstuse(); + data.byte(kLockstatus) = 0; + data.byte(kGetback) = 1; +} + +void DreamGenContext::usedryer() { + STACK_CHECK; + al = 12; + playchannel1(); + showfirstuse(); + data.byte(kGetback) = 1; +} + +void DreamGenContext::openlouis() { + STACK_CHECK; + al = 5; + ah = 2; + cl = 3; + ch = 8; + entercode(); + data.byte(kGetback) = 1; +} + +void DreamGenContext::nextcolon() { + STACK_CHECK; +lookcolon: + al = es.byte(si); + _inc(si); + _cmp(al, ':'); + if (!flags.z()) + goto lookcolon; +} + +void DreamGenContext::openyourneighbour() { + STACK_CHECK; + al = 255; + ah = 255; + cl = 255; + ch = 255; + entercode(); + data.byte(kGetback) = 1; +} + +void DreamGenContext::usewindow() { + STACK_CHECK; + _cmp(data.byte(kManspath), 6); + if (!flags.z()) + goto notonbalc; + _inc(data.byte(kProgresspoints)); + showfirstuse(); + data.byte(kNewlocation) = 29; + data.byte(kGetback) = 1; + return; +notonbalc: + showseconduse(); + putbackobstuff(); +} + +void DreamGenContext::usebalcony() { + STACK_CHECK; + showfirstuse(); + al = 6; + turnpathon(); + al = 0; + turnpathoff(); + al = 1; + turnpathoff(); + al = 2; + turnpathoff(); + al = 3; + turnpathoff(); + al = 4; + turnpathoff(); + al = 5; + turnpathoff(); + _inc(data.byte(kProgresspoints)); + data.byte(kManspath) = 6; + data.byte(kDestination) = 6; + data.byte(kFinaldest) = 6; + findxyfrompath(); + switchryanoff(); + data.byte(kResetmanxy) = 1; + data.word(kWatchingtime) = 30*2; + data.word(kReeltowatch) = 183; + data.word(kEndwatchreel) = 212; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; +} + +void DreamGenContext::openryan() { + STACK_CHECK; + al = 5; + ah = 1; + cl = 0; + ch = 6; + entercode(); + data.byte(kGetback) = 1; +} + +void DreamGenContext::openpoolboss() { + STACK_CHECK; + al = 5; + ah = 2; + cl = 2; + ch = 2; + entercode(); + data.byte(kGetback) = 1; +} + +void DreamGenContext::openeden() { + STACK_CHECK; + al = 2; + ah = 8; + cl = 6; + ch = 5; + entercode(); + data.byte(kGetback) = 1; +} + +void DreamGenContext::opensarters() { + STACK_CHECK; + al = 7; + ah = 8; + cl = 3; + ch = 3; + entercode(); + data.byte(kGetback) = 1; +} + +void DreamGenContext::isitright() { + STACK_CHECK; + bx = data; + es = bx; + bx = 8573; + _cmp(es.byte(bx+0), al); + if (!flags.z()) + return /* (notright) */; + _cmp(es.byte(bx+1), ah); + if (!flags.z()) + return /* (notright) */; + _cmp(es.byte(bx+2), cl); + if (!flags.z()) + return /* (notright) */; + _cmp(es.byte(bx+3), ch); +} + +void DreamGenContext::drawitall() { + STACK_CHECK; + createpanel(); + drawfloor(); + printsprites(); + showicon(); +} + +void DreamGenContext::openhoteldoor() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto hoteldoorwith; + withwhat(); + return; +hoteldoorwith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'K'; + ch = 'E'; + dl = 'Y'; + dh = 'A'; + compare(); + if (flags.z()) + goto keyonhotel1; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +keyonhotel1: + al = 16; + playchannel1(); + showfirstuse(); + data.byte(kLockstatus) = 0; + data.byte(kGetback) = 1; +} + +void DreamGenContext::openhoteldoor2() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto hoteldoorwith2; + withwhat(); + return; +hoteldoorwith2: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'K'; + ch = 'E'; + dl = 'Y'; + dh = 'A'; + compare(); + if (flags.z()) + goto keyonhotel2; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +keyonhotel2: + al = 16; + playchannel1(); + showfirstuse(); + putbackobstuff(); +} + +void DreamGenContext::grafittidoor() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto grafwith; + withwhat(); + return; +grafwith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'A'; + ch = 'P'; + dl = 'E'; + dh = 'N'; + compare(); + if (flags.z()) + goto dograf; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +dograf: + showfirstuse(); + putbackobstuff(); +} + +void DreamGenContext::trapdoor() { + STACK_CHECK; + _inc(data.byte(kProgresspoints)); + showfirstuse(); + switchryanoff(); + data.word(kWatchingtime) = 20*2; + data.word(kReeltowatch) = 181; + data.word(kEndwatchreel) = 197; + data.byte(kNewlocation) = 26; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; +} + +void DreamGenContext::callhotellift() { + STACK_CHECK; + al = 12; + playchannel1(); + showfirstuse(); + data.byte(kCounttoopen) = 8; + data.byte(kGetback) = 1; + data.byte(kDestination) = 5; + data.byte(kFinaldest) = 5; + autosetwalk(); + al = 4; + turnpathon(); +} + +void DreamGenContext::calledenslift() { + STACK_CHECK; + showfirstuse(); + data.byte(kCounttoopen) = 8; + data.byte(kGetback) = 1; + al = 2; + turnpathon(); +} + +void DreamGenContext::calledensdlift() { + STACK_CHECK; + _cmp(data.byte(kLiftflag), 1); + if (flags.z()) + goto edensdhere; + showfirstuse(); + data.byte(kCounttoopen) = 8; + data.byte(kGetback) = 1; + al = 2; + turnpathon(); + return; +edensdhere: + showseconduse(); + putbackobstuff(); +} + +void DreamGenContext::usepoolreader() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto poolwith; + withwhat(); + return; +poolwith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'M'; + ch = 'E'; + dl = 'M'; + dh = 'B'; + compare(); + if (flags.z()) + goto openpool; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +openpool: + _cmp(data.byte(kTalkedtoattendant), 1); + if (flags.z()) + goto canopenpool; + showseconduse(); + putbackobstuff(); + return; +canopenpool: + al = 17; + playchannel1(); + showfirstuse(); + data.byte(kCounttoopen) = 6; + data.byte(kGetback) = 1; +} + +void DreamGenContext::uselighter() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto gotlighterwith; + withwhat(); + return; +gotlighterwith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'S'; + ch = 'M'; + dl = 'K'; + dh = 'E'; + compare(); + if (flags.z()) + goto cigarette; + showfirstuse(); + putbackobstuff(); + return; +cigarette: + cx = 300; + al = 9; + showpuztext(); + al = data.byte(kWithobject); + getexad(); + es.byte(bx+2) = 255; + data.byte(kGetback) = 1; +} + +void DreamGenContext::showseconduse() { + STACK_CHECK; + getobtextstart(); + nextcolon(); + nextcolon(); + nextcolon(); + usetext(); + cx = 400; + hangonp(); +} + +void DreamGenContext::usecardreader1() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto gotreader1with; + withwhat(); + return; +gotreader1with: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'C'; + ch = 'S'; + dl = 'H'; + dh = 'R'; + compare(); + if (flags.z()) + goto correctcard; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +correctcard: + _cmp(data.byte(kTalkedtosparky), 0); + if (flags.z()) + goto notyet; + _cmp(data.word(kCard1money), 0); + if (flags.z()) + goto getscash; + cx = 300; + al = 17; + showpuztext(); + putbackobstuff(); + return; +getscash: + al = 16; + playchannel1(); + cx = 300; + al = 18; + showpuztext(); + _inc(data.byte(kProgresspoints)); + data.word(kCard1money) = 12432; + data.byte(kGetback) = 1; + return; +notyet: + showfirstuse(); + putbackobstuff(); +} + +void DreamGenContext::usecardreader2() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto gotreader2with; + withwhat(); + return; +gotreader2with: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'C'; + ch = 'S'; + dl = 'H'; + dh = 'R'; + compare(); + if (flags.z()) + goto correctcard2; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +correctcard2: + _cmp(data.byte(kTalkedtoboss), 0); + if (flags.z()) + goto notyetboss; + _cmp(data.word(kCard1money), 0); + if (flags.z()) + goto nocash; + _cmp(data.byte(kGunpassflag), 2); + if (flags.z()) + goto alreadygotnew; + al = 18; + playchannel1(); + cx = 300; + al = 19; + showpuztext(); + al = 94; + placesetobject(); + data.byte(kGunpassflag) = 1; + _sub(data.word(kCard1money), 2000); + _inc(data.byte(kProgresspoints)); + data.byte(kGetback) = 1; + return; +nocash: + cx = 300; + al = 20; + showpuztext(); + putbackobstuff(); + return; +alreadygotnew: + cx = 300; + al = 22; + showpuztext(); + putbackobstuff(); + return; +notyetboss: + showfirstuse(); + putbackobstuff(); +} + +void DreamGenContext::usecardreader3() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto gotreader3with; + withwhat(); + return; +gotreader3with: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'C'; + ch = 'S'; + dl = 'H'; + dh = 'R'; + compare(); + if (flags.z()) + goto rightcard; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +rightcard: + _cmp(data.byte(kTalkedtorecep), 0); + if (flags.z()) + goto notyetrecep; + _cmp(data.byte(kCardpassflag), 0); + if (!flags.z()) + goto alreadyusedit; + al = 16; + playchannel1(); + cx = 300; + al = 25; + showpuztext(); + _inc(data.byte(kProgresspoints)); + _sub(data.word(kCard1money), 8300); + data.byte(kCardpassflag) = 1; + data.byte(kGetback) = 1; + return; +alreadyusedit: + cx = 300; + al = 26; + showpuztext(); + putbackobstuff(); + return; +notyetrecep: + showfirstuse(); + putbackobstuff(); +} + +void DreamGenContext::usecashcard() { + STACK_CHECK; + getridofreels(); + loadkeypad(); + createpanel(); + showpanel(); + showexit(); + showman(); + di = 114; + bx = 120; + ds = data.word(kTempgraphics); + al = 39; + ah = 0; + showframe(); + ax = data.word(kCard1money); + moneypoke(); + getobtextstart(); + nextcolon(); + nextcolon(); + di = 36; + bx = 98; + dl = 241; + al = 0; + ah = 0; + printdirect(); + di = 160; + bx = 155; + es = cs; + si = 3474; + data.word(kCharshift) = 91*2+75; + al = 0; + ah = 0; + dl = 240; + printdirect(); + di = 187; + bx = 155; + es = cs; + si = 3479; + data.word(kCharshift) = 91*2+85; + al = 0; + ah = 0; + dl = 240; + printdirect(); + data.word(kCharshift) = 0; + worktoscreenm(); + cx = 400; + hangonp(); + getridoftemp(); + restorereels(); + putbackobstuff(); +} + +void DreamGenContext::lookatcard() { + STACK_CHECK; + data.byte(kManisoffscreen) = 1; + getridofreels(); + loadkeypad(); + createpanel2(); + di = 160; + bx = 80; + ds = data.word(kTempgraphics); + al = 42; + ah = 128; + showframe(); + getobtextstart(); + findnextcolon(); + findnextcolon(); + findnextcolon(); + di = 36; + bx = 124; + dl = 241; + al = 0; + ah = 0; + printdirect(); + push(es); + push(si); + worktoscreenm(); + cx = 280; + hangonw(); + createpanel2(); + di = 160; + bx = 80; + ds = data.word(kTempgraphics); + al = 42; + ah = 128; + showframe(); + si = pop(); + es = pop(); + di = 36; + bx = 130; + dl = 241; + al = 0; + ah = 0; + printdirect(); + worktoscreenm(); + cx = 200; + hangonw(); + data.byte(kManisoffscreen) = 0; + getridoftemp(); + restorereels(); + putbackobstuff(); +} + +void DreamGenContext::moneypoke() { + STACK_CHECK; + bx = 3474; + cl = 48-1; +numberpoke0: + _inc(cl); + _sub(ax, 10000); + if (!flags.c()) + goto numberpoke0; + _add(ax, 10000); + cs.byte(bx) = cl; + _inc(bx); + cl = 48-1; +numberpoke1: + _inc(cl); + _sub(ax, 1000); + if (!flags.c()) + goto numberpoke1; + _add(ax, 1000); + cs.byte(bx) = cl; + _inc(bx); + cl = 48-1; +numberpoke2: + _inc(cl); + _sub(ax, 100); + if (!flags.c()) + goto numberpoke2; + _add(ax, 100); + cs.byte(bx) = cl; + _inc(bx); + cl = 48-1; +numberpoke3: + _inc(cl); + _sub(ax, 10); + if (!flags.c()) + goto numberpoke3; + _add(ax, 10); + cs.byte(bx) = cl; + bx = 3479; + _add(al, 48); + cs.byte(bx) = al; +} + +void DreamGenContext::usecontrol() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto gotcontrolwith; + withwhat(); + return; +gotcontrolwith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'K'; + ch = 'E'; + dl = 'Y'; + dh = 'A'; + compare(); + if (flags.z()) + goto rightkey; + _cmp(data.byte(kReallocation), 21); + if (!flags.z()) + goto balls; + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'K'; + ch = 'N'; + dl = 'F'; + dh = 'E'; + compare(); + if (flags.z()) + goto jimmycontrols; + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'A'; + ch = 'X'; + dl = 'E'; + dh = 'D'; + compare(); + if (flags.z()) + goto axeoncontrols; +balls: + showfirstuse(); + putbackobstuff(); + return; +rightkey: + al = 16; + playchannel1(); + _cmp(data.byte(kLocation), 21); + if (flags.z()) + goto goingdown; + cx = 300; + al = 0; + showpuztext(); + data.byte(kNewlocation) = 21; + data.byte(kCounttoclose) = 8; + data.byte(kCounttoopen) = 0; + data.word(kWatchingtime) = 80; + data.byte(kGetback) = 1; + return; +goingdown: + cx = 300; + al = 3; + showpuztext(); + data.byte(kNewlocation) = 30; + data.byte(kCounttoclose) = 8; + data.byte(kCounttoopen) = 0; + data.word(kWatchingtime) = 80; + data.byte(kGetback) = 1; + return; +jimmycontrols: + al = 50; + placesetobject(); + al = 51; + placesetobject(); + al = 26; + placesetobject(); + al = 30; + placesetobject(); + al = 16; + removesetobject(); + al = 17; + removesetobject(); + al = 14; + playchannel1(); + cx = 300; + al = 10; + showpuztext(); + _inc(data.byte(kProgresspoints)); + data.byte(kGetback) = 1; + return; +axeoncontrols: + cx = 300; + al = 16; + showpuztext(); + _inc(data.byte(kProgresspoints)); + putbackobstuff(); +} + +void DreamGenContext::usehatch() { + STACK_CHECK; + showfirstuse(); + data.byte(kNewlocation) = 40; + data.byte(kGetback) = 1; +} + +void DreamGenContext::usewire() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto gotwirewith; + withwhat(); + return; +gotwirewith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'K'; + ch = 'N'; + dl = 'F'; + dh = 'E'; + compare(); + if (flags.z()) + goto wireknife; + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'A'; + ch = 'X'; + dl = 'E'; + dh = 'D'; + compare(); + if (flags.z()) + goto wireaxe; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +wireaxe: + cx = 300; + al = 16; + showpuztext(); + putbackobstuff(); + return; +wireknife: + al = 51; + removesetobject(); + al = 52; + placesetobject(); + cx = 300; + al = 11; + showpuztext(); + _inc(data.byte(kProgresspoints)); + data.byte(kGetback) = 1; +} + +void DreamGenContext::usehandle() { + STACK_CHECK; + al = 'C'; + ah = 'U'; + cl = 'T'; + ch = 'W'; + findsetobject(); + al = es.byte(bx+58); + _cmp(al, 255); + if (!flags.z()) + goto havecutwire; + cx = 300; + al = 12; + showpuztext(); + data.byte(kGetback) = 1; + return; +havecutwire: + cx = 300; + al = 13; + showpuztext(); + data.byte(kNewlocation) = 22; + data.byte(kGetback) = 1; +} + +void DreamGenContext::useelevator1() { + STACK_CHECK; + showfirstuse(); + selectlocation(); + data.byte(kGetback) = 1; +} + +void DreamGenContext::showfirstuse() { + STACK_CHECK; + getobtextstart(); + findnextcolon(); + findnextcolon(); + usetext(); + cx = 400; + hangonp(); +} + +void DreamGenContext::useelevator3() { + STACK_CHECK; + showfirstuse(); + data.byte(kCounttoclose) = 20; + data.byte(kNewlocation) = 34; + data.word(kReeltowatch) = 46; + data.word(kEndwatchreel) = 63; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.word(kWatchingtime) = 80; + data.byte(kGetback) = 1; +} + +void DreamGenContext::useelevator4() { + STACK_CHECK; + showfirstuse(); + data.word(kReeltowatch) = 0; + data.word(kEndwatchreel) = 11; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kCounttoclose) = 20; + data.word(kWatchingtime) = 80; + data.byte(kGetback) = 1; + data.byte(kNewlocation) = 24; +} + +void DreamGenContext::useelevator2() { + STACK_CHECK; + _cmp(data.byte(kLocation), 23); + if (flags.z()) + goto inpoolhall; + showfirstuse(); + data.byte(kNewlocation) = 23; + data.byte(kCounttoclose) = 20; + data.byte(kCounttoopen) = 0; + data.word(kWatchingtime) = 80; + data.byte(kGetback) = 1; + return; +inpoolhall: + showfirstuse(); + data.byte(kNewlocation) = 31; + data.byte(kCounttoclose) = 20; + data.byte(kCounttoopen) = 0; + data.word(kWatchingtime) = 80; + data.byte(kGetback) = 1; +} + +void DreamGenContext::useelevator5() { + STACK_CHECK; + al = 4; + placesetobject(); + al = 0; + removesetobject(); + data.byte(kNewlocation) = 20; + data.word(kWatchingtime) = 80; + data.byte(kLiftflag) = 1; + data.byte(kCounttoclose) = 8; + data.byte(kGetback) = 1; +} + +void DreamGenContext::usekey() { + STACK_CHECK; + _cmp(data.byte(kLocation), 5); + if (flags.z()) + goto usekey1; + _cmp(data.byte(kLocation), 30); + if (flags.z()) + goto usekey1; + _cmp(data.byte(kLocation), 21); + if (flags.z()) + goto usekey2; + cx = 200; + al = 1; + showpuztext(); + putbackobstuff(); + return; +usekey1: + _cmp(data.byte(kMapx), 22); + if (!flags.z()) + goto wrongroom1; + _cmp(data.byte(kMapy), 10); + if (!flags.z()) + goto wrongroom1; + cx = 300; + al = 0; + showpuztext(); + data.byte(kCounttoclose) = 100; + data.byte(kGetback) = 1; + return; +usekey2: + _cmp(data.byte(kMapx), 11); + if (!flags.z()) + goto wrongroom1; + _cmp(data.byte(kMapy), 10); + if (!flags.z()) + goto wrongroom1; + cx = 300; + al = 3; + showpuztext(); + data.byte(kNewlocation) = 30; + al = 2; + fadescreendown(); + showfirstuse(); + putbackobstuff(); + return; +wrongroom1: + cx = 200; + al = 2; + showpuztext(); + putbackobstuff(); +} + +void DreamGenContext::usestereo() { + STACK_CHECK; + _cmp(data.byte(kLocation), 0); + if (flags.z()) + goto stereook; + cx = 400; + al = 4; + showpuztext(); + putbackobstuff(); + return; +stereook: + _cmp(data.byte(kMapx), 11); + if (!flags.z()) + goto stereonotok; + _cmp(data.byte(kMapy), 0); + if (flags.z()) + goto stereook2; +stereonotok: + cx = 400; + al = 5; + showpuztext(); + putbackobstuff(); + return; +stereook2: + al = 'C'; + ah = 'D'; + cl = 'P'; + ch = 'L'; + findsetobject(); + ah = 1; + checkinside(); + _cmp(cl, (114)); + if (!flags.z()) + goto cdinside; + al = 6; + cx = 400; + showpuztext(); + putbackobstuff(); + getanyad(); + al = 255; + es.byte(bx+10) = al; + return; +cdinside: + getanyad(); + al = es.byte(bx+10); + _xor(al, 1); + es.byte(bx+10) = al; + _cmp(al, 255); + if (flags.z()) + goto stereoon; + al = 7; + cx = 400; + showpuztext(); + putbackobstuff(); + return; +stereoon: + al = 8; + cx = 400; + showpuztext(); + putbackobstuff(); +} + +void DreamGenContext::usecooker() { + STACK_CHECK; + al = data.byte(kCommand); + ah = data.byte(kObjecttype); + checkinside(); + _cmp(cl, (114)); + if (!flags.z()) + goto foodinside; + showfirstuse(); + putbackobstuff(); + return; +foodinside: + showseconduse(); + putbackobstuff(); +} + +void DreamGenContext::useaxe() { + STACK_CHECK; + _cmp(data.byte(kReallocation), 22); + if (!flags.z()) + goto notinpool; + _cmp(data.byte(kMapy), 10); + if (flags.z()) + goto axeondoor; + showseconduse(); + _inc(data.byte(kProgresspoints)); + data.byte(kLastweapon) = 2; + data.byte(kGetback) = 1; + removeobfrominv(); + return; +notinpool: + showfirstuse(); +/*continuing to unbounded code: axeondoor from useelvdoor:19-29*/ +axeondoor: + al = 15; + cx = 300; + showpuztext(); + _inc(data.byte(kProgresspoints)); + data.word(kWatchingtime) = 46*2; + data.word(kReeltowatch) = 31; + data.word(kEndwatchreel) = 77; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; +} + +void DreamGenContext::useelvdoor() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto gotdoorwith; + withwhat(); + return; +gotdoorwith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'A'; + ch = 'X'; + dl = 'E'; + dh = 'D'; + compare(); + if (flags.z()) + goto axeondoor; + al = 14; + cx = 300; + showpuztext(); + putbackobstuff(); + return; +axeondoor: + al = 15; + cx = 300; + showpuztext(); + _inc(data.byte(kProgresspoints)); + data.word(kWatchingtime) = 46*2; + data.word(kReeltowatch) = 31; + data.word(kEndwatchreel) = 77; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; +} + +void DreamGenContext::withwhat() { + STACK_CHECK; + createpanel(); + showpanel(); + showman(); + showexit(); + al = data.byte(kCommand); + ah = data.byte(kObjecttype); + es = cs; + di = 5847; + copyname(); + di = 100; + bx = 21; + dl = 200; + al = 63; + ah = 2; + printmessage2(); + di = data.word(kLastxpos); + _add(di, 5); + bx = 21; + es = cs; + si = 5847; + dl = 220; + al = 0; + ah = 0; + printdirect(); + di = data.word(kLastxpos); + _add(di, 5); + bx = 21; + dl = 200; + al = 63; + ah = 3; + printmessage2(); + fillryan(); + data.byte(kCommandtype) = 255; + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); + data.byte(kInvopen) = 2; +} + +void DreamGenContext::selectob() { + STACK_CHECK; + findinvpos(); + ax = es.word(bx); + _cmp(al, 255); + if (!flags.z()) + goto canselectob; + blank(); + return; +canselectob: + data.byte(kWithobject) = al; + data.byte(kWithtype) = ah; + _cmp(ax, data.word(kOldsubject)); + if (!flags.z()) + goto diffsub3; + _cmp(data.byte(kCommandtype), 221); + if (flags.z()) + goto alreadyselob; + data.byte(kCommandtype) = 221; +diffsub3: + data.word(kOldsubject) = ax; + bx = ax; + al = 0; + commandwithob(); +alreadyselob: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (notselob) */; + _and(ax, 1); + if (!flags.z()) + goto doselob; + return; +doselob: + delpointer(); + data.byte(kInvopen) = 0; + useroutine(); +} + +void DreamGenContext::compare() { + STACK_CHECK; + _sub(dl, 'A'); + _sub(dh, 'A'); + _sub(cl, 'A'); + _sub(ch, 'A'); + push(cx); + push(dx); + getanyaddir(); + dx = pop(); + cx = pop(); + _cmp(es.word(bx+12), cx); + if (!flags.z()) + return /* (comparefin) */; + _cmp(es.word(bx+14), dx); +} + +void DreamGenContext::findsetobject() { + STACK_CHECK; + _sub(al, 'A'); + _sub(ah, 'A'); + _sub(cl, 'A'); + _sub(ch, 'A'); + es = data.word(kSetdat); + bx = 0; + dl = 0; +findsetloop: + _cmp(al, es.byte(bx+12)); + if (!flags.z()) + goto nofind; + _cmp(ah, es.byte(bx+13)); + if (!flags.z()) + goto nofind; + _cmp(cl, es.byte(bx+14)); + if (!flags.z()) + goto nofind; + _cmp(ch, es.byte(bx+15)); + if (!flags.z()) + goto nofind; + al = dl; + return; +nofind: + _add(bx, 64); + _inc(dl); + _cmp(dl, 128); + if (!flags.z()) + goto findsetloop; + al = dl; +} + +void DreamGenContext::findexobject() { + STACK_CHECK; + _sub(al, 'A'); + _sub(ah, 'A'); + _sub(cl, 'A'); + _sub(ch, 'A'); + es = data.word(kExtras); + bx = (0+2080+30000); + dl = 0; +findexloop: + _cmp(al, es.byte(bx+12)); + if (!flags.z()) + goto nofindex; + _cmp(ah, es.byte(bx+13)); + if (!flags.z()) + goto nofindex; + _cmp(cl, es.byte(bx+14)); + if (!flags.z()) + goto nofindex; + _cmp(ch, es.byte(bx+15)); + if (!flags.z()) + goto nofindex; + al = dl; + return; +nofindex: + _add(bx, 16); + _inc(dl); + _cmp(dl, (114)); + if (!flags.z()) + goto findexloop; + al = dl; +} + +void DreamGenContext::isryanholding() { + STACK_CHECK; + _sub(al, 'A'); + _sub(ah, 'A'); + _sub(cl, 'A'); + _sub(ch, 'A'); + es = data.word(kExtras); + bx = (0+2080+30000); + dl = 0; +searchinv: + _cmp(es.byte(bx+2), 4); + if (!flags.z()) + goto nofindininv; + _cmp(al, es.byte(bx+12)); + if (!flags.z()) + goto nofindininv; + _cmp(ah, es.byte(bx+13)); + if (!flags.z()) + goto nofindininv; + _cmp(cl, es.byte(bx+14)); + if (!flags.z()) + goto nofindininv; + _cmp(ch, es.byte(bx+15)); + if (!flags.z()) + goto nofindininv; + al = dl; + _cmp(al, (114)); + return; +nofindininv: + _add(bx, 16); + _inc(dl); + _cmp(dl, (114)); + if (!flags.z()) + goto searchinv; + al = dl; + _cmp(al, (114)); +} + +void DreamGenContext::checkinside() { + STACK_CHECK; + es = data.word(kExtras); + bx = (0+2080+30000); + cl = 0; +insideloop: + _cmp(al, es.byte(bx+3)); + if (!flags.z()) + goto notfoundinside; + _cmp(ah, es.byte(bx+2)); + if (!flags.z()) + goto notfoundinside; + return; +notfoundinside: + _add(bx, 16); + _inc(cl); + _cmp(cl, (114)); + if (!flags.z()) + goto insideloop; +} + +void DreamGenContext::usetext() { + STACK_CHECK; + push(es); + push(si); + createpanel(); + showpanel(); + showman(); + showexit(); + obicons(); + si = pop(); + es = pop(); + di = 36; + bx = 104; + dl = 241; + al = 0; + ah = 0; + printdirect(); + worktoscreenm(); +} + +void DreamGenContext::putbackobstuff() { + STACK_CHECK; + createpanel(); + showpanel(); + showman(); + obicons(); + showexit(); + obpicture(); + describeob(); + undertextline(); + data.byte(kCommandtype) = 255; + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::showpuztext() { + STACK_CHECK; + push(cx); + findpuztext(); + push(es); + push(si); + createpanel(); + showpanel(); + showman(); + showexit(); + obicons(); + si = pop(); + es = pop(); + di = 36; + bx = 104; + dl = 241; + ah = 0; + printdirect(); + worktoscreenm(); + cx = pop(); + hangonp(); +} + +void DreamGenContext::findpuztext() { + STACK_CHECK; + ah = 0; + si = ax; + _add(si, si); + es = data.word(kPuzzletext); + ax = es.word(si); + _add(ax, (66*2)); + si = ax; +} + +void DreamGenContext::placesetobject() { + STACK_CHECK; + push(es); + push(bx); + cl = 0; + ch = 0; + findormake(); + getsetad(); + es.byte(bx+58) = 0; + bx = pop(); + es = pop(); +} + +void DreamGenContext::removesetobject() { + STACK_CHECK; + push(es); + push(bx); + cl = 255; + ch = 0; + findormake(); + getsetad(); + es.byte(bx+58) = 255; + bx = pop(); + es = pop(); +} + +void DreamGenContext::issetobonmap() { + STACK_CHECK; + push(es); + push(bx); + getsetad(); + al = es.byte(bx+58); + bx = pop(); + es = pop(); + _cmp(al, 0); +} + +void DreamGenContext::placefreeobject() { + STACK_CHECK; + push(es); + push(bx); + cl = 0; + ch = 1; + findormake(); + getfreead(); + es.byte(bx+2) = 0; + bx = pop(); + es = pop(); +} + +void DreamGenContext::removefreeobject() { + STACK_CHECK; + push(es); + push(bx); + getfreead(); + es.byte(bx+2) = 255; + bx = pop(); + es = pop(); +} + +void DreamGenContext::findormake() { + STACK_CHECK; + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)); + push(ax); + es = data.word(kBuffers); + ah = data.byte(kReallocation); +changeloop: + _cmp(es.byte(bx), 255); + if (flags.z()) + goto haventfound; + _cmp(ax, es.word(bx)); + if (!flags.z()) + goto nofoundchange; + _cmp(ch, es.byte(bx+3)); + if (flags.z()) + goto foundchange; +nofoundchange: + _add(bx, 4); + goto changeloop; +foundchange: + ax = pop(); + es.byte(bx+2) = cl; + return; +haventfound: + es.word(bx) = ax; + es.word(bx+2) = cx; + ax = pop(); +} + +void DreamGenContext::switchryanon() { + STACK_CHECK; + data.byte(kRyanon) = 255; +} + +void DreamGenContext::switchryanoff() { + STACK_CHECK; + data.byte(kRyanon) = 1; +} + +void DreamGenContext::setallchanges() { + STACK_CHECK; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)); +setallloop: + ax = es.word(bx); + _cmp(al, 255); + if (flags.z()) + return /* (endsetloop) */; + cx = es.word(bx+2); + _add(bx, 4); + _cmp(ah, data.byte(kReallocation)); + if (!flags.z()) + goto setallloop; + push(es); + push(bx); + dochange(); + bx = pop(); + es = pop(); + goto setallloop; +} + +void DreamGenContext::dochange() { + STACK_CHECK; + _cmp(ch, 0); + if (flags.z()) + goto object; + _cmp(ch, 1); + if (flags.z()) + goto freeobject; + push(cx); + ah = 0; + _add(ax, ax); + _add(ax, ax); + _add(ax, ax); + push(ax); + al = ch; + _sub(al, 100); + ah = 0; + cx = 144; + _mul(cx); + bx = pop(); + _add(bx, ax); + _add(bx, (0)); + es = data.word(kReels); + cx = pop(); + es.byte(bx+6) = cl; + return; +object: + push(cx); + getsetad(); + cx = pop(); + es.byte(bx+58) = cl; + return; +freeobject: + push(cx); + getfreead(); + cx = pop(); + _cmp(es.byte(bx+2), 255); + if (!flags.z()) + return /* (beenpickedup) */; + es.byte(bx+2) = cl; +} + +void DreamGenContext::autoappear() { + STACK_CHECK; + _cmp(data.byte(kLocation), 32); + if (!flags.z()) + goto notinalley; + al = 5; + resetlocation(); + al = 10; + setlocation(); + data.byte(kDestpos) = 10; + return; +notinalley: + _cmp(data.byte(kReallocation), 24); + if (!flags.z()) + goto notinedens; + _cmp(data.byte(kGeneraldead), 1); + if (!flags.z()) + goto edenspart2; + _inc(data.byte(kGeneraldead)); + al = 44; + placesetobject(); + al = 18; + placesetobject(); + al = 93; + placesetobject(); + al = 92; + removesetobject(); + al = 55; + removesetobject(); + al = 75; + removesetobject(); + al = 84; + removesetobject(); + al = 85; + removesetobject(); + return; +edenspart2: + _cmp(data.byte(kSartaindead), 1); + if (!flags.z()) + return /* (notedens2) */; + al = 44; + removesetobject(); + al = 93; + removesetobject(); + al = 55; + placesetobject(); + _inc(data.byte(kSartaindead)); + return; +notinedens: + _cmp(data.byte(kReallocation), 25); + if (!flags.z()) + goto notonsartroof; + data.byte(kNewsitem) = 3; + al = 6; + resetlocation(); + al = 11; + setlocation(); + data.byte(kDestpos) = 11; + return; +notonsartroof: + _cmp(data.byte(kReallocation), 2); + if (!flags.z()) + return /* (notinlouiss) */; + _cmp(data.byte(kRockstardead), 0); + if (flags.z()) + return /* (notinlouiss) */; + al = 23; + placesetobject(); +} + +void DreamGenContext::getundertimed() { + STACK_CHECK; + al = data.byte(kTimedy); + ah = 0; + bx = ax; + al = data.byte(kTimedx); + ah = 0; + di = ax; + ch = (24); + cl = 240; + ds = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)); + multiget(); +} + +void DreamGenContext::putundertimed() { + STACK_CHECK; + al = data.byte(kTimedy); + ah = 0; + bx = ax; + al = data.byte(kTimedx); + ah = 0; + di = ax; + ch = (24); + cl = 240; + ds = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)); + multiput(); +} + +void DreamGenContext::dumptimedtext() { + STACK_CHECK; + _cmp(data.byte(kNeedtodumptimed), 1); + if (!flags.z()) + return /* (nodumptimed) */; + al = data.byte(kTimedy); + ah = 0; + bx = ax; + al = data.byte(kTimedx); + ah = 0; + di = ax; + cl = 240; + ch = (24); + multidump(); + data.byte(kNeedtodumptimed) = 0; +} + +void DreamGenContext::setuptimeduse() { + STACK_CHECK; + _cmp(data.word(kTimecount), 0); + if (!flags.z()) + return /* (cantsetup) */; + data.byte(kTimedy) = bh; + data.byte(kTimedx) = bl; + data.word(kCounttotimed) = cx; + _add(dx, cx); + data.word(kTimecount) = dx; + bl = al; + bh = 0; + _add(bx, bx); + es = data.word(kPuzzletext); + cx = (66*2); + ax = es.word(bx); + _add(ax, cx); + bx = ax; + data.word(kTimedseg) = es; + data.word(kTimedoffset) = bx; +} + +void DreamGenContext::setuptimedtemp() { + STACK_CHECK; + _cmp(ah, 0); + if (flags.z()) + goto notloadspeech3; + dl = 'T'; + dh = ah; + cl = 'T'; + ah = 0; + loadspeech(); + _cmp(data.byte(kSpeechloaded), 1); + if (!flags.z()) + goto notloadspeech3; + al = 50+12; + playchannel1(); + return; +notloadspeech3: + _cmp(data.word(kTimecount), 0); + if (!flags.z()) + return /* (cantsetup2) */; + data.byte(kTimedy) = bh; + data.byte(kTimedx) = bl; + data.word(kCounttotimed) = cx; + _add(dx, cx); + data.word(kTimecount) = dx; + bl = al; + bh = 0; + _add(bx, bx); + es = data.word(kTextfile1); + cx = (66*2); + ax = es.word(bx); + _add(ax, cx); + bx = ax; + data.word(kTimedseg) = es; + data.word(kTimedoffset) = bx; +} + +void DreamGenContext::usetimedtext() { + STACK_CHECK; + _cmp(data.word(kTimecount), 0); + if (flags.z()) + return /* (notext) */; + _dec(data.word(kTimecount)); + _cmp(data.word(kTimecount), 0); + if (flags.z()) + goto deltimedtext; + ax = data.word(kTimecount); + _cmp(ax, data.word(kCounttotimed)); + if (flags.z()) + goto firsttimed; + if (!flags.c()) + return /* (notext) */; + goto notfirsttimed; +firsttimed: + getundertimed(); +notfirsttimed: + bl = data.byte(kTimedy); + bh = 0; + al = data.byte(kTimedx); + ah = 0; + di = ax; + es = data.word(kTimedseg); + si = data.word(kTimedoffset); + dl = 237; + ah = 0; + printdirect(); + data.byte(kNeedtodumptimed) = 1; + return; +deltimedtext: + putundertimed(); + data.byte(kNeedtodumptimed) = 1; +} + +void DreamGenContext::edenscdplayer() { + STACK_CHECK; + showfirstuse(); + data.word(kWatchingtime) = 18*2; + data.word(kReeltowatch) = 25; + data.word(kEndwatchreel) = 42; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; +} + +void DreamGenContext::usewall() { + STACK_CHECK; + showfirstuse(); + _cmp(data.byte(kManspath), 3); + if (flags.z()) + goto gobackover; + data.word(kWatchingtime) = 30*2; + data.word(kReeltowatch) = 2; + data.word(kEndwatchreel) = 31; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; + al = 3; + turnpathon(); + al = 4; + turnpathon(); + al = 0; + turnpathoff(); + al = 1; + turnpathoff(); + al = 2; + turnpathoff(); + al = 5; + turnpathoff(); + data.byte(kManspath) = 3; + data.byte(kFinaldest) = 3; + findxyfrompath(); + data.byte(kResetmanxy) = 1; + switchryanoff(); + return; +gobackover: + data.word(kWatchingtime) = 30*2; + data.word(kReeltowatch) = 34; + data.word(kEndwatchreel) = 60; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; + al = 3; + turnpathoff(); + al = 4; + turnpathoff(); + al = 0; + turnpathon(); + al = 1; + turnpathon(); + al = 2; + turnpathon(); + al = 5; + turnpathon(); + data.byte(kManspath) = 5; + data.byte(kFinaldest) = 5; + findxyfrompath(); + data.byte(kResetmanxy) = 1; + switchryanoff(); +} + +void DreamGenContext::usechurchgate() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto gatewith; + withwhat(); + return; +gatewith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'C'; + ch = 'U'; + dl = 'T'; + dh = 'T'; + compare(); + if (flags.z()) + goto cutgate; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +cutgate: + showfirstuse(); + data.word(kWatchingtime) = 64*2; + data.word(kReeltowatch) = 4; + data.word(kEndwatchreel) = 70; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; + _inc(data.byte(kProgresspoints)); + al = 3; + turnpathon(); + _cmp(data.byte(kAidedead), 0); + if (flags.z()) + return /* (notopenchurch) */; + al = 2; + turnpathon(); +} + +void DreamGenContext::usegun() { + STACK_CHECK; + _cmp(data.byte(kObjecttype), 4); + if (flags.z()) + goto istakengun; + showseconduse(); + putbackobstuff(); + return; +istakengun: + _cmp(data.byte(kReallocation), 22); + if (!flags.z()) + goto notinpoolroom; + cx = 300; + al = 34; + showpuztext(); + data.byte(kLastweapon) = 1; + data.byte(kCombatcount) = 39; + data.byte(kGetback) = 1; + _inc(data.byte(kProgresspoints)); + return; +notinpoolroom: + _cmp(data.byte(kReallocation), 25); + if (!flags.z()) + goto nothelicopter; + cx = 300; + al = 34; + showpuztext(); + data.byte(kLastweapon) = 1; + data.byte(kCombatcount) = 19; + data.byte(kGetback) = 1; + data.byte(kDreamnumber) = 2; + data.byte(kRoomafterdream) = 38; + data.byte(kSartaindead) = 1; + _inc(data.byte(kProgresspoints)); + return; +nothelicopter: + _cmp(data.byte(kReallocation), 27); + if (!flags.z()) + goto notinrockroom; + cx = 300; + al = 46; + showpuztext(); + data.byte(kPointermode) = 2; + data.byte(kRockstardead) = 1; + data.byte(kLastweapon) = 1; + data.byte(kNewsitem) = 1; + data.byte(kGetback) = 1; + data.byte(kRoomafterdream) = 32; + data.byte(kDreamnumber) = 0; + _inc(data.byte(kProgresspoints)); + return; +notinrockroom: + _cmp(data.byte(kReallocation), 8); + if (!flags.z()) + goto notbystudio; + _cmp(data.byte(kMapx), 22); + if (!flags.z()) + goto notbystudio; + _cmp(data.byte(kMapy), 40); + if (!flags.z()) + goto notbystudio; + al = 92; + issetobonmap(); + if (flags.z()) + goto notbystudio; + _cmp(data.byte(kManspath), 9); + if (flags.z()) + goto notbystudio; + data.byte(kDestination) = 9; + data.byte(kFinaldest) = 9; + autosetwalk(); + data.byte(kLastweapon) = 1; + data.byte(kGetback) = 1; + _inc(data.byte(kProgresspoints)); + return; +notbystudio: + _cmp(data.byte(kReallocation), 6); + if (!flags.z()) + goto notsarters; + _cmp(data.byte(kMapx), 11); + if (!flags.z()) + goto notsarters; + _cmp(data.byte(kMapy), 20); + if (!flags.z()) + goto notsarters; + al = 5; + issetobonmap(); + if (!flags.z()) + goto notsarters; + data.byte(kDestination) = 1; + data.byte(kFinaldest) = 1; + autosetwalk(); + al = 5; + removesetobject(); + al = 6; + placesetobject(); + al = 1; + ah = data.byte(kRoomnum); + _dec(ah); + turnanypathon(); + data.byte(kLiftflag) = 1; + data.word(kWatchingtime) = 40*2; + data.word(kReeltowatch) = 4; + data.word(kEndwatchreel) = 43; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; + _inc(data.byte(kProgresspoints)); + return; +notsarters: + _cmp(data.byte(kReallocation), 29); + if (!flags.z()) + goto notaide; + data.byte(kGetback) = 1; + al = 13; + resetlocation(); + al = 12; + setlocation(); + data.byte(kDestpos) = 12; + data.byte(kDestination) = 2; + data.byte(kFinaldest) = 2; + autosetwalk(); + data.word(kWatchingtime) = 164*2; + data.word(kReeltowatch) = 3; + data.word(kEndwatchreel) = 164; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kAidedead) = 1; + data.byte(kDreamnumber) = 3; + data.byte(kRoomafterdream) = 33; + _inc(data.byte(kProgresspoints)); + return; +notaide: + _cmp(data.byte(kReallocation), 23); + if (!flags.z()) + goto notwithboss; + _cmp(data.byte(kMapx), 0); + if (!flags.z()) + goto notwithboss; + _cmp(data.byte(kMapy), 50); + if (!flags.z()) + goto notwithboss; + _cmp(data.byte(kManspath), 5); + if (flags.z()) + goto pathokboss; + data.byte(kDestination) = 5; + data.byte(kFinaldest) = 5; + autosetwalk(); +pathokboss: + data.byte(kLastweapon) = 1; + data.byte(kGetback) = 1; + return; +notwithboss: + _cmp(data.byte(kReallocation), 8); + if (!flags.z()) + goto nottvsoldier; + _cmp(data.byte(kMapx), 11); + if (!flags.z()) + goto nottvsoldier; + _cmp(data.byte(kMapy), 10); + if (!flags.z()) + goto nottvsoldier; + _cmp(data.byte(kManspath), 2); + if (flags.z()) + goto pathoktv; + data.byte(kDestination) = 2; + data.byte(kFinaldest) = 2; + autosetwalk(); +pathoktv: + data.byte(kLastweapon) = 1; + data.byte(kGetback) = 1; + return; +nottvsoldier: + showfirstuse(); + putbackobstuff(); +} + +void DreamGenContext::useshield() { + STACK_CHECK; + _cmp(data.byte(kReallocation), 20); + if (!flags.z()) + goto notinsartroom; + _cmp(data.byte(kCombatcount), 0); + if (flags.z()) + goto notinsartroom; + data.byte(kLastweapon) = 3; + showseconduse(); + data.byte(kGetback) = 1; + _inc(data.byte(kProgresspoints)); + removeobfrominv(); + return; +notinsartroom: + showfirstuse(); + putbackobstuff(); +} + +void DreamGenContext::usebuttona() { + STACK_CHECK; + al = 95; + issetobonmap(); + if (flags.z()) + goto donethisbit; + showfirstuse(); + al = 0; + ah = data.byte(kRoomnum); + _dec(ah); + turnanypathon(); + al = 9; + removesetobject(); + al = 95; + placesetobject(); + data.word(kWatchingtime) = 15*2; + data.word(kReeltowatch) = 71; + data.word(kEndwatchreel) = 85; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kGetback) = 1; + _inc(data.byte(kProgresspoints)); + return; +donethisbit: + showseconduse(); + putbackobstuff(); +} + +void DreamGenContext::useplate() { + STACK_CHECK; + _cmp(data.byte(kWithobject), 255); + if (!flags.z()) + goto platewith; + withwhat(); + return; +platewith: + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'S'; + ch = 'C'; + dl = 'R'; + dh = 'W'; + compare(); + if (flags.z()) + goto unscrewplate; + al = data.byte(kWithobject); + ah = data.byte(kWithtype); + cl = 'K'; + ch = 'N'; + dl = 'F'; + dh = 'E'; + compare(); + if (flags.z()) + goto triedknife; + cx = 300; + al = 14; + showpuztext(); + putbackobstuff(); + return; +unscrewplate: + al = 20; + playchannel1(); + showfirstuse(); + al = 28; + placesetobject(); + al = 24; + placesetobject(); + al = 25; + removesetobject(); + al = 0; + placefreeobject(); + _inc(data.byte(kProgresspoints)); + data.byte(kGetback) = 1; + return; +triedknife: + cx = 300; + al = 54; + showpuztext(); + putbackobstuff(); +} + +void DreamGenContext::usewinch() { + STACK_CHECK; + al = 40; + ah = 1; + checkinside(); + _cmp(cl, (114)); + if (flags.z()) + goto nowinch; + al = cl; + ah = 4; + cl = 'F'; + ch = 'U'; + dl = 'S'; + dh = 'E'; + compare(); + if (!flags.z()) + goto nowinch; + data.word(kWatchingtime) = 217*2; + data.word(kReeltowatch) = 0; + data.word(kEndwatchreel) = 217; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + data.byte(kDestpos) = 1; + data.byte(kNewlocation) = 45; + data.byte(kDreamnumber) = 1; + data.byte(kRoomafterdream) = 44; + data.byte(kGeneraldead) = 1; + data.byte(kNewsitem) = 2; + data.byte(kGetback) = 1; + _inc(data.byte(kProgresspoints)); + return; +nowinch: + showfirstuse(); + putbackobstuff(); +} + +void DreamGenContext::entercode() { + STACK_CHECK; + data.word(kKeypadax) = ax; + data.word(kKeypadcx) = cx; + getridofreels(); + loadkeypad(); + createpanel(); + showicon(); + showouterpad(); + showkeypad(); + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); + data.word(kPresspointer) = 0; + data.byte(kGetback) = 0; +keypadloop: + delpointer(); + readmouse(); + showkeypad(); + showpointer(); + _cmp(data.byte(kPresscount), 0); + if (flags.z()) + goto nopresses; + _dec(data.byte(kPresscount)); + goto afterpress; +nopresses: + data.byte(kPressed) = 255; + data.byte(kGraphicpress) = 255; + vsync(); +afterpress: + dumppointer(); + dumpkeypad(); + dumptextline(); + bx = 3482; + checkcoords(); + _cmp(data.byte(kGetback), 1); + if (flags.z()) + goto numberright; + _cmp(data.byte(kLightcount), 1); + if (!flags.z()) + goto notendkey; + _cmp(data.byte(kLockstatus), 0); + if (flags.z()) + goto numberright; + goto keypadloop; +notendkey: + _cmp(data.byte(kPresscount), 40); + if (!flags.z()) + goto keypadloop; + addtopresslist(); + _cmp(data.byte(kPressed), 11); + if (!flags.z()) + goto keypadloop; + ax = data.word(kKeypadax); + cx = data.word(kKeypadcx); + isitright(); + if (!flags.z()) + goto incorrect; + data.byte(kLockstatus) = 0; + al = 11; + playchannel1(); + data.byte(kLightcount) = 120; + data.word(kPresspointer) = 0; + goto keypadloop; +incorrect: + al = 11; + playchannel1(); + data.byte(kLightcount) = 120; + data.word(kPresspointer) = 0; + goto keypadloop; +numberright: + data.byte(kManisoffscreen) = 0; + getridoftemp(); + restorereels(); + redrawmainscrn(); + worktoscreenm(); +} + +void DreamGenContext::loadkeypad() { + STACK_CHECK; + dx = 1948; + loadintotemp(); +} + +void DreamGenContext::quitkey() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 222); + if (flags.z()) + goto alreadyqk; + data.byte(kCommandtype) = 222; + al = 4; + commandonly(); +alreadyqk: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (notqk) */; + _and(ax, 1); + if (!flags.z()) + goto doqk; + return; +doqk: + data.byte(kGetback) = 1; +} + +void DreamGenContext::addtopresslist() { + STACK_CHECK; + _cmp(data.word(kPresspointer), 5); + if (flags.z()) + return /* (nomorekeys) */; + al = data.byte(kPressed); + _cmp(al, 10); + if (!flags.z()) + goto not10; + al = 0; +not10: + bx = data.word(kPresspointer); + dx = data; + es = dx; + _add(bx, 8573); + es.byte(bx) = al; + _inc(data.word(kPresspointer)); +} + +void DreamGenContext::buttonone() { + STACK_CHECK; + cl = 1; + buttonpress(); +} + +void DreamGenContext::buttontwo() { + STACK_CHECK; + cl = 2; + buttonpress(); +} + +void DreamGenContext::buttonthree() { + STACK_CHECK; + cl = 3; + buttonpress(); +} + +void DreamGenContext::buttonfour() { + STACK_CHECK; + cl = 4; + buttonpress(); +} + +void DreamGenContext::buttonfive() { + STACK_CHECK; + cl = 5; + buttonpress(); +} + +void DreamGenContext::buttonsix() { + STACK_CHECK; + cl = 6; + buttonpress(); +} + +void DreamGenContext::buttonseven() { + STACK_CHECK; + cl = 7; + buttonpress(); +} + +void DreamGenContext::buttoneight() { + STACK_CHECK; + cl = 8; + buttonpress(); +} + +void DreamGenContext::buttonnine() { + STACK_CHECK; + cl = 9; + buttonpress(); +} + +void DreamGenContext::buttonnought() { + STACK_CHECK; + cl = 10; + buttonpress(); +} + +void DreamGenContext::buttonenter() { + STACK_CHECK; + cl = 11; + buttonpress(); +} + +void DreamGenContext::buttonpress() { + STACK_CHECK; + ch = cl; + _add(ch, 100); + _cmp(data.byte(kCommandtype), ch); + if (flags.z()) + goto alreadyb; + data.byte(kCommandtype) = ch; + al = cl; + _add(al, 4); + push(cx); + commandonly(); + cx = pop(); +alreadyb: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (notb) */; + _and(ax, 1); + if (!flags.z()) + goto dob; + return; +dob: + data.byte(kPressed) = cl; + _add(cl, 21); + data.byte(kGraphicpress) = cl; + data.byte(kPresscount) = 40; + _cmp(cl, 32); + if (flags.z()) + return /* (nonoise) */; + al = 10; + playchannel1(); +} + +void DreamGenContext::showouterpad() { + STACK_CHECK; + di = (36+112)-3; + bx = (72)-4; + ds = data.word(kTempgraphics); + al = 1; + ah = 0; + showframe(); + di = (36+112)+74; + bx = (72)+76; + ds = data.word(kTempgraphics); + al = 37; + ah = 0; + showframe(); +} + +void DreamGenContext::showkeypad() { + STACK_CHECK; + al = 22; + di = (36+112)+9; + bx = (72)+5; + singlekey(); + al = 23; + di = (36+112)+31; + bx = (72)+5; + singlekey(); + al = 24; + di = (36+112)+53; + bx = (72)+5; + singlekey(); + al = 25; + di = (36+112)+9; + bx = (72)+23; + singlekey(); + al = 26; + di = (36+112)+31; + bx = (72)+23; + singlekey(); + al = 27; + di = (36+112)+53; + bx = (72)+23; + singlekey(); + al = 28; + di = (36+112)+9; + bx = (72)+41; + singlekey(); + al = 29; + di = (36+112)+31; + bx = (72)+41; + singlekey(); + al = 30; + di = (36+112)+53; + bx = (72)+41; + singlekey(); + al = 31; + di = (36+112)+9; + bx = (72)+59; + singlekey(); + al = 32; + di = (36+112)+31; + bx = (72)+59; + singlekey(); + _cmp(data.byte(kLightcount), 0); + if (flags.z()) + return /* (notenter) */; + _dec(data.byte(kLightcount)); + al = 36; + bx = (72)-1+63; + _cmp(data.byte(kLockstatus), 0); + if (!flags.z()) + goto changelight; + al = 41; + bx = (72)+4+63; +changelight: + _cmp(data.byte(kLightcount), 60); + if (flags.c()) + goto gotlight; + _cmp(data.byte(kLightcount), 100); + if (!flags.c()) + goto gotlight; + _dec(al); +gotlight: + ds = data.word(kTempgraphics); + ah = 0; + di = (36+112)+60; + showframe(); +} + +void DreamGenContext::singlekey() { + STACK_CHECK; + _cmp(data.byte(kGraphicpress), al); + if (!flags.z()) + goto gotkey; + _add(al, 11); + _cmp(data.byte(kPresscount), 8); + if (!flags.c()) + goto gotkey; + _sub(al, 11); +gotkey: + ds = data.word(kTempgraphics); + _sub(al, 20); + ah = 0; + showframe(); +} + +void DreamGenContext::dumpkeypad() { + STACK_CHECK; + di = (36+112)-3; + bx = (72)-4; + cl = 120; + ch = 90; + multidump(); +} + +void DreamGenContext::usemenu() { + STACK_CHECK; + getridofreels(); + loadmenu(); + createpanel(); + showpanel(); + showicon(); + data.byte(kNewobs) = 0; + drawfloor(); + printsprites(); + al = 4; + ah = 0; + di = (80+40)-48; + bx = (60)-4; + ds = data.word(kTempgraphics2); + showframe(); + getundermenu(); + al = 5; + ah = 0; + di = (80+40)+54; + bx = (60)+72; + ds = data.word(kTempgraphics2); + showframe(); + worktoscreenm(); + data.byte(kGetback) = 0; +menuloop: + delpointer(); + putundermenu(); + showmenu(); + readmouse(); + showpointer(); + vsync(); + dumppointer(); + dumpmenu(); + dumptextline(); + bx = 3614; + checkcoords(); + _cmp(data.byte(kGetback), 1); + if (!flags.z()) + goto menuloop; + data.byte(kManisoffscreen) = 0; + redrawmainscrn(); + getridoftemp(); + getridoftemp2(); + restorereels(); + worktoscreenm(); +} + +void DreamGenContext::dumpmenu() { + STACK_CHECK; + di = (80+40); + bx = (60); + cl = 48; + ch = 48; + multidump(); +} + +void DreamGenContext::getundermenu() { + STACK_CHECK; + di = (80+40); + bx = (60); + cl = 48; + ch = 48; + ds = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)); + multiget(); +} + +void DreamGenContext::putundermenu() { + STACK_CHECK; + di = (80+40); + bx = (60); + cl = 48; + ch = 48; + ds = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)); + multiput(); +} + +void DreamGenContext::showoutermenu() { + STACK_CHECK; + al = 40; + ah = 0; + di = (80+40)-34; + bx = (60)-40; + ds = data.word(kTempgraphics); + showframe(); + al = 41; + ah = 0; + di = (80+40)+64-34; + bx = (60)-40; + ds = data.word(kTempgraphics); + showframe(); + al = 42; + ah = 0; + di = (80+40)-26; + bx = (60)+57-40; + ds = data.word(kTempgraphics); + showframe(); + al = 43; + ah = 0; + di = (80+40)+64-26; + bx = (60)+57-40; + ds = data.word(kTempgraphics); + showframe(); +} + +void DreamGenContext::showmenu() { + STACK_CHECK; + _inc(data.byte(kMenucount)); + _cmp(data.byte(kMenucount), 37*2); + if (!flags.z()) + goto menuframeok; + data.byte(kMenucount) = 0; +menuframeok: + al = data.byte(kMenucount); + _shr(al, 1); + ah = 0; + di = (80+40); + bx = (60); + ds = data.word(kTempgraphics); + showframe(); +} + +void DreamGenContext::loadmenu() { + STACK_CHECK; + dx = 1832; + loadintotemp(); + dx = 1987; + loadintotemp2(); +} + +void DreamGenContext::viewfolder() { + STACK_CHECK; + data.byte(kManisoffscreen) = 1; + getridofall(); + loadfolder(); + data.byte(kFolderpage) = 0; + showfolder(); + worktoscreenm(); + data.byte(kGetback) = 0; +folderloop: + delpointer(); + readmouse(); + showpointer(); + vsync(); + dumppointer(); + dumptextline(); + bx = 3636; + checkcoords(); + _cmp(data.byte(kGetback), 0); + if (flags.z()) + goto folderloop; + data.byte(kManisoffscreen) = 0; + getridoftemp(); + getridoftemp2(); + getridoftemp3(); + getridoftempcharset(); + restoreall(); + redrawmainscrn(); + worktoscreenm(); +} + +void DreamGenContext::nextfolder() { + STACK_CHECK; + _cmp(data.byte(kFolderpage), 12); + if (!flags.z()) + goto cannextf; + blank(); + return; +cannextf: + _cmp(data.byte(kCommandtype), 201); + if (flags.z()) + goto alreadynextf; + data.byte(kCommandtype) = 201; + al = 16; + commandonly(); +alreadynextf: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (notnextf) */; + _cmp(ax, 1); + if (flags.z()) + goto donextf; + return; +donextf: + _inc(data.byte(kFolderpage)); + folderhints(); + delpointer(); + showfolder(); + data.word(kMousebutton) = 0; + bx = 3636; + checkcoords(); + worktoscreenm(); +} + +void DreamGenContext::folderhints() { + STACK_CHECK; + _cmp(data.byte(kFolderpage), 5); + if (!flags.z()) + goto notaideadd; + _cmp(data.byte(kAidedead), 1); + if (flags.z()) + goto notaideadd; + al = 13; + getlocation(); + _cmp(al, 1); + if (flags.z()) + goto notaideadd; + al = 13; + setlocation(); + showfolder(); + al = 30; + findtext1(); + di = 0; + bx = 86; + dl = 141; + ah = 16; + printdirect(); + worktoscreenm(); + cx = 200; + hangonp(); + return; +notaideadd: + _cmp(data.byte(kFolderpage), 9); + if (!flags.z()) + return /* (notaristoadd) */; + al = 7; + getlocation(); + _cmp(al, 1); + if (flags.z()) + return /* (notaristoadd) */; + al = 7; + setlocation(); + showfolder(); + al = 31; + findtext1(); + di = 0; + bx = 86; + dl = 141; + ah = 16; + printdirect(); + worktoscreenm(); + cx = 200; + hangonp(); +} + +void DreamGenContext::lastfolder() { + STACK_CHECK; + _cmp(data.byte(kFolderpage), 0); + if (!flags.z()) + goto canlastf; + blank(); + return; +canlastf: + _cmp(data.byte(kCommandtype), 202); + if (flags.z()) + goto alreadylastf; + data.byte(kCommandtype) = 202; + al = 17; + commandonly(); +alreadylastf: + _cmp(data.byte(kFolderpage), 0); + if (flags.z()) + return /* (notlastf) */; + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (notlastf) */; + _cmp(ax, 1); + if (flags.z()) + goto dolastf; + return; +dolastf: + _dec(data.byte(kFolderpage)); + delpointer(); + showfolder(); + data.word(kMousebutton) = 0; + bx = 3636; + checkcoords(); + worktoscreenm(); +} + +void DreamGenContext::loadfolder() { + STACK_CHECK; + dx = 2299; + loadintotemp(); + dx = 2312; + loadintotemp2(); + dx = 2325; + loadintotemp3(); + dx = 1883; + loadtempcharset(); + dx = 2195; + loadtemptext(); +} + +void DreamGenContext::showfolder() { + STACK_CHECK; + data.byte(kCommandtype) = 255; + _cmp(data.byte(kFolderpage), 0); + if (flags.z()) + goto closedfolder; + usetempcharset(); + createpanel2(); + ds = data.word(kTempgraphics); + di = 0; + bx = 0; + al = 0; + ah = 0; + showframe(); + ds = data.word(kTempgraphics); + di = 143; + bx = 0; + al = 1; + ah = 0; + showframe(); + ds = data.word(kTempgraphics); + di = 0; + bx = 92; + al = 2; + ah = 0; + showframe(); + ds = data.word(kTempgraphics); + di = 143; + bx = 92; + al = 3; + ah = 0; + showframe(); + folderexit(); + _cmp(data.byte(kFolderpage), 1); + if (flags.z()) + goto noleftpage; + showleftpage(); +noleftpage: + _cmp(data.byte(kFolderpage), 12); + if (flags.z()) + goto norightpage; + showrightpage(); +norightpage: + usecharset1(); + undertextline(); + return; +closedfolder: + createpanel2(); + ds = data.word(kTempgraphics3); + di = 143-28; + bx = 0; + al = 0; + ah = 0; + showframe(); + ds = data.word(kTempgraphics3); + di = 143-28; + bx = 92; + al = 1; + ah = 0; + showframe(); + folderexit(); + undertextline(); +} + +void DreamGenContext::folderexit() { + STACK_CHECK; + ds = data.word(kTempgraphics2); + di = 296; + bx = 178; + al = 6; + ah = 0; + showframe(); +} + +void DreamGenContext::showleftpage() { + STACK_CHECK; + ds = data.word(kTempgraphics2); + di = 0; + bx = 12; + al = 3; + ah = 0; + showframe(); + bx = 12+5; + cx = 9; +leftpageloop: + push(cx); + push(bx); + ds = data.word(kTempgraphics2); + di = 0; + al = 4; + ah = 0; + showframe(); + bx = pop(); + cx = pop(); + _add(bx, 16); + if (--cx) + goto leftpageloop; + ds = data.word(kTempgraphics2); + di = 0; + al = 5; + ah = 0; + showframe(); + data.word(kLinespacing) = 8; + data.word(kCharshift) = 91; + data.byte(kKerning) = 1; + bl = data.byte(kFolderpage); + _dec(bl); + _dec(bl); + _add(bl, bl); + bh = 0; + _add(bx, bx); + es = data.word(kTextfile1); + si = es.word(bx); + _add(si, 66*2); + di = 2; + bx = 48; + dl = 140; + cx = 2; +twolotsleft: + push(cx); +contleftpage: + printdirect(); + _add(bx, data.word(kLinespacing)); + _cmp(al, 0); + if (!flags.z()) + goto contleftpage; + cx = pop(); + if (--cx) + goto twolotsleft; + data.byte(kKerning) = 0; + data.word(kCharshift) = 0; + data.word(kLinespacing) = 10; + es = data.word(kWorkspace); + ds = data.word(kWorkspace); + di = (48*320)+2; + si = (48*320)+2+130; + cx = 120; +flipfolder: + push(cx); + push(di); + push(si); + cx = 65; +flipfolderline: + al = es.byte(di); + ah = es.byte(si); + es.byte(di) = ah; + es.byte(si) = al; + _dec(si); + _inc(di); + if (--cx) + goto flipfolderline; + si = pop(); + di = pop(); + cx = pop(); + _add(si, 320); + _add(di, 320); + if (--cx) + goto flipfolder; +} + +void DreamGenContext::showrightpage() { + STACK_CHECK; + ds = data.word(kTempgraphics2); + di = 143; + bx = 12; + al = 0; + ah = 0; + showframe(); + bx = 12+37; + cx = 7; +rightpageloop: + push(cx); + push(bx); + ds = data.word(kTempgraphics2); + di = 143; + al = 1; + ah = 0; + showframe(); + bx = pop(); + cx = pop(); + _add(bx, 16); + if (--cx) + goto rightpageloop; + ds = data.word(kTempgraphics2); + di = 143; + al = 2; + ah = 0; + showframe(); + data.word(kLinespacing) = 8; + data.byte(kKerning) = 1; + bl = data.byte(kFolderpage); + _dec(bl); + _add(bl, bl); + bh = 0; + _add(bx, bx); + es = data.word(kTextfile1); + si = es.word(bx); + _add(si, 66*2); + di = 152; + bx = 48; + dl = 140; + cx = 2; +twolotsright: + push(cx); +contrightpage: + printdirect(); + _add(bx, data.word(kLinespacing)); + _cmp(al, 0); + if (!flags.z()) + goto contrightpage; + cx = pop(); + if (--cx) + goto twolotsright; + data.byte(kKerning) = 0; + data.word(kLinespacing) = 10; +} + +void DreamGenContext::entersymbol() { + STACK_CHECK; + data.byte(kManisoffscreen) = 1; + getridofreels(); + dx = 2338; + loadintotemp(); + data.byte(kSymboltopx) = 24; + data.byte(kSymboltopdir) = 0; + data.byte(kSymbolbotx) = 24; + data.byte(kSymbolbotdir) = 0; + redrawmainscrn(); + showsymbol(); + undertextline(); + worktoscreenm(); + data.byte(kGetback) = 0; +symbolloop: + delpointer(); + updatesymboltop(); + updatesymbolbot(); + showsymbol(); + readmouse(); + showpointer(); + vsync(); + dumppointer(); + dumptextline(); + dumpsymbol(); + bx = 3678; + checkcoords(); + _cmp(data.byte(kGetback), 0); + if (flags.z()) + goto symbolloop; + _cmp(data.byte(kSymbolbotnum), 3); + if (!flags.z()) + goto symbolwrong; + _cmp(data.byte(kSymboltopnum), 5); + if (!flags.z()) + goto symbolwrong; + al = 43; + removesetobject(); + al = 46; + placesetobject(); + ah = data.byte(kRoomnum); + _add(ah, 12); + al = 0; + turnanypathon(); + data.byte(kManisoffscreen) = 0; + redrawmainscrn(); + getridoftemp(); + restorereels(); + worktoscreenm(); + al = 13; + playchannel1(); + return; +symbolwrong: + al = 46; + removesetobject(); + al = 43; + placesetobject(); + ah = data.byte(kRoomnum); + _add(ah, 12); + al = 0; + turnanypathoff(); + data.byte(kManisoffscreen) = 0; + redrawmainscrn(); + getridoftemp(); + restorereels(); + worktoscreenm(); +} + +void DreamGenContext::quitsymbol() { + STACK_CHECK; + _cmp(data.byte(kSymboltopx), 24); + if (!flags.z()) + { blank(); return; }; + _cmp(data.byte(kSymbolbotx), 24); + if (!flags.z()) + { blank(); return; }; + _cmp(data.byte(kCommandtype), 222); + if (flags.z()) + goto alreadyqs; + data.byte(kCommandtype) = 222; + al = 18; + commandonly(); +alreadyqs: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (notqs) */; + _and(ax, 1); + if (!flags.z()) + goto doqs; + return; +doqs: + data.byte(kGetback) = 1; +} + +void DreamGenContext::settopleft() { + STACK_CHECK; + _cmp(data.byte(kSymboltopdir), 0); + if (!flags.z()) + { blank(); return; }; + _cmp(data.byte(kCommandtype), 210); + if (flags.z()) + goto alreadytopl; + data.byte(kCommandtype) = 210; + al = 19; + commandonly(); +alreadytopl: + _cmp(data.word(kMousebutton), 0); + if (flags.z()) + return /* (notopleft) */; + data.byte(kSymboltopdir) = -1; +} + +void DreamGenContext::settopright() { + STACK_CHECK; + _cmp(data.byte(kSymboltopdir), 0); + if (!flags.z()) + { blank(); return; }; + _cmp(data.byte(kCommandtype), 211); + if (flags.z()) + goto alreadytopr; + data.byte(kCommandtype) = 211; + al = 20; + commandonly(); +alreadytopr: + _cmp(data.word(kMousebutton), 0); + if (flags.z()) + return /* (notopright) */; + data.byte(kSymboltopdir) = 1; +} + +void DreamGenContext::setbotleft() { + STACK_CHECK; + _cmp(data.byte(kSymbolbotdir), 0); + if (!flags.z()) + { blank(); return; }; + _cmp(data.byte(kCommandtype), 212); + if (flags.z()) + goto alreadybotl; + data.byte(kCommandtype) = 212; + al = 21; + commandonly(); +alreadybotl: + _cmp(data.word(kMousebutton), 0); + if (flags.z()) + return /* (nobotleft) */; + data.byte(kSymbolbotdir) = -1; +} + +void DreamGenContext::setbotright() { + STACK_CHECK; + _cmp(data.byte(kSymbolbotdir), 0); + if (!flags.z()) + { blank(); return; }; + _cmp(data.byte(kCommandtype), 213); + if (flags.z()) + goto alreadybotr; + data.byte(kCommandtype) = 213; + al = 22; + commandonly(); +alreadybotr: + _cmp(data.word(kMousebutton), 0); + if (flags.z()) + return /* (nobotright) */; + data.byte(kSymbolbotdir) = 1; +} + +void DreamGenContext::dumpsymbol() { + STACK_CHECK; + data.byte(kNewtextline) = 0; + di = (64); + bx = (56)+20; + cl = 104; + ch = 60; + multidump(); +} + +void DreamGenContext::showsymbol() { + STACK_CHECK; + al = 12; + ah = 0; + di = (64); + bx = (56); + ds = data.word(kTempgraphics); + showframe(); + al = data.byte(kSymboltopx); + ah = 0; + di = ax; + _add(di, (64)-44); + al = data.byte(kSymboltopnum); + bx = (56)+20; + ds = data.word(kTempgraphics); + ah = 32; + push(ax); + push(di); + push(bx); + push(ds); + showframe(); + ds = pop(); + bx = pop(); + di = pop(); + ax = pop(); + nextsymbol(); + _add(di, 49); + push(ax); + push(di); + push(bx); + push(ds); + showframe(); + ds = pop(); + bx = pop(); + di = pop(); + ax = pop(); + nextsymbol(); + _add(di, 49); + showframe(); + al = data.byte(kSymbolbotx); + ah = 0; + di = ax; + _add(di, (64)-44); + al = data.byte(kSymbolbotnum); + _add(al, 6); + bx = (56)+49; + ds = data.word(kTempgraphics); + ah = 32; + push(ax); + push(di); + push(bx); + push(ds); + showframe(); + ds = pop(); + bx = pop(); + di = pop(); + ax = pop(); + nextsymbol(); + _add(di, 49); + push(ax); + push(di); + push(bx); + push(ds); + showframe(); + ds = pop(); + bx = pop(); + di = pop(); + ax = pop(); + nextsymbol(); + _add(di, 49); + showframe(); +} + +void DreamGenContext::nextsymbol() { + STACK_CHECK; + _inc(al); + _cmp(al, 6); + if (flags.z()) + goto topwrap; + _cmp(al, 12); + if (flags.z()) + goto botwrap; + return; +topwrap: + al = 0; + return; +botwrap: + al = 6; +} + +void DreamGenContext::updatesymboltop() { + STACK_CHECK; + _cmp(data.byte(kSymboltopdir), 0); + if (flags.z()) + return /* (topfinished) */; + _cmp(data.byte(kSymboltopdir), -1); + if (flags.z()) + goto backwards; + _inc(data.byte(kSymboltopx)); + _cmp(data.byte(kSymboltopx), 49); + if (!flags.z()) + goto notwrapfor; + data.byte(kSymboltopx) = 0; + _dec(data.byte(kSymboltopnum)); + _cmp(data.byte(kSymboltopnum), -1); + if (!flags.z()) + return /* (topfinished) */; + data.byte(kSymboltopnum) = 5; + return; +notwrapfor: + _cmp(data.byte(kSymboltopx), 24); + if (!flags.z()) + return /* (topfinished) */; + data.byte(kSymboltopdir) = 0; + return; +backwards: + _dec(data.byte(kSymboltopx)); + _cmp(data.byte(kSymboltopx), -1); + if (!flags.z()) + goto notwrapback; + data.byte(kSymboltopx) = 48; + _inc(data.byte(kSymboltopnum)); + _cmp(data.byte(kSymboltopnum), 6); + if (!flags.z()) + return /* (topfinished) */; + data.byte(kSymboltopnum) = 0; + return; +notwrapback: + _cmp(data.byte(kSymboltopx), 24); + if (!flags.z()) + return /* (topfinished) */; + data.byte(kSymboltopdir) = 0; +} + +void DreamGenContext::updatesymbolbot() { + STACK_CHECK; + _cmp(data.byte(kSymbolbotdir), 0); + if (flags.z()) + return /* (botfinished) */; + _cmp(data.byte(kSymbolbotdir), -1); + if (flags.z()) + goto backwardsbot; + _inc(data.byte(kSymbolbotx)); + _cmp(data.byte(kSymbolbotx), 49); + if (!flags.z()) + goto notwrapforb; + data.byte(kSymbolbotx) = 0; + _dec(data.byte(kSymbolbotnum)); + _cmp(data.byte(kSymbolbotnum), -1); + if (!flags.z()) + return /* (botfinished) */; + data.byte(kSymbolbotnum) = 5; + return; +notwrapforb: + _cmp(data.byte(kSymbolbotx), 24); + if (!flags.z()) + return /* (botfinished) */; + data.byte(kSymbolbotdir) = 0; + return; +backwardsbot: + _dec(data.byte(kSymbolbotx)); + _cmp(data.byte(kSymbolbotx), -1); + if (!flags.z()) + goto notwrapbackb; + data.byte(kSymbolbotx) = 48; + _inc(data.byte(kSymbolbotnum)); + _cmp(data.byte(kSymbolbotnum), 6); + if (!flags.z()) + return /* (botfinished) */; + data.byte(kSymbolbotnum) = 0; + return; +notwrapbackb: + _cmp(data.byte(kSymbolbotx), 24); + if (!flags.z()) + return /* (botfinished) */; + data.byte(kSymbolbotdir) = 0; +} + +void DreamGenContext::dumpsymbox() { + STACK_CHECK; + _cmp(data.word(kDumpx), -1); + if (flags.z()) + return /* (nodumpsym) */; + di = data.word(kDumpx); + bx = data.word(kDumpy); + cl = 30; + ch = 77; + multidump(); + data.word(kDumpx) = -1; +} + +void DreamGenContext::usediary() { + STACK_CHECK; + getridofreels(); + dx = 2039; + loadintotemp(); + dx = 2208; + loadtemptext(); + dx = 1883; + loadtempcharset(); + createpanel(); + showicon(); + showdiary(); + undertextline(); + showdiarypage(); + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); + data.byte(kGetback) = 0; +diaryloop: + delpointer(); + readmouse(); + showdiarykeys(); + showpointer(); + vsync(); + dumppointer(); + dumpdiarykeys(); + dumptextline(); + bx = 3740; + checkcoords(); + _cmp(data.byte(kGetback), 0); + if (flags.z()) + goto diaryloop; + getridoftemp(); + getridoftemptext(); + getridoftempcharset(); + restorereels(); + data.byte(kManisoffscreen) = 0; + redrawmainscrn(); + worktoscreenm(); +} + +void DreamGenContext::showdiary() { + STACK_CHECK; + al = 1; + ah = 0; + di = (68+24); + bx = (48+12)+37; + ds = data.word(kTempgraphics); + showframe(); + al = 2; + ah = 0; + di = (68+24)+176; + bx = (48+12)+108; + ds = data.word(kTempgraphics); + showframe(); +} + +void DreamGenContext::showdiarykeys() { + STACK_CHECK; + _cmp(data.byte(kPresscount), 0); + if (flags.z()) + return /* (nokeyatall) */; + _dec(data.byte(kPresscount)); + _cmp(data.byte(kPresscount), 0); + if (flags.z()) + return /* (nokeyatall) */; + _cmp(data.byte(kPressed), 'N'); + if (!flags.z()) + goto nokeyn; + al = 3; + _cmp(data.byte(kPresscount), 1); + if (flags.z()) + goto gotkeyn; + al = 4; +gotkeyn: + ah = 0; + di = (68+24)+94; + bx = (48+12)+97; + ds = data.word(kTempgraphics); + showframe(); + _cmp(data.byte(kPresscount), 1); + if (!flags.z()) + return /* (notshown) */; + showdiarypage(); + return; +nokeyn: + al = 5; + _cmp(data.byte(kPresscount), 1); + if (flags.z()) + goto gotkeyp; + al = 6; +gotkeyp: + ah = 0; + di = (68+24)+151; + bx = (48+12)+71; + ds = data.word(kTempgraphics); + showframe(); + _cmp(data.byte(kPresscount), 1); + if (!flags.z()) + return /* (notshowp) */; + showdiarypage(); +} + +void DreamGenContext::dumpdiarykeys() { + STACK_CHECK; + _cmp(data.byte(kPresscount), 1); + if (!flags.z()) + goto notdumpdiary; + _cmp(data.byte(kSartaindead), 1); + if (flags.z()) + goto notsartadd; + _cmp(data.byte(kDiarypage), 5); + if (!flags.z()) + goto notsartadd; + _cmp(data.byte(kDiarypage), 5); + if (!flags.z()) + goto notsartadd; + al = 6; + getlocation(); + _cmp(al, 1); + if (flags.z()) + goto notsartadd; + al = 6; + setlocation(); + delpointer(); + al = 12; + findtext1(); + di = 70; + bx = 106; + dl = 241; + ah = 16; + printdirect(); + worktoscreenm(); + cx = 200; + hangonp(); + createpanel(); + showicon(); + showdiary(); + showdiarypage(); + worktoscreenm(); + showpointer(); + return; +notsartadd: + di = (68+24)+48; + bx = (48+12)+15; + cl = 200; + ch = 16; + multidump(); +notdumpdiary: + di = (68+24)+94; + bx = (48+12)+97; + cl = 16; + ch = 16; + multidump(); + di = (68+24)+151; + bx = (48+12)+71; + cl = 16; + ch = 16; + multidump(); +} + +void DreamGenContext::diarykeyp() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 214); + if (flags.z()) + goto alreadykeyp; + data.byte(kCommandtype) = 214; + al = 23; + commandonly(); +alreadykeyp: + _cmp(data.word(kMousebutton), 0); + if (flags.z()) + return /* (notkeyp) */; + ax = data.word(kOldbutton); + _cmp(ax, data.word(kMousebutton)); + if (flags.z()) + return /* (notkeyp) */; + _cmp(data.byte(kPresscount), 0); + if (!flags.z()) + return /* (notkeyp) */; + al = 16; + playchannel1(); + data.byte(kPresscount) = 12; + data.byte(kPressed) = 'P'; + _dec(data.byte(kDiarypage)); + _cmp(data.byte(kDiarypage), -1); + if (!flags.z()) + return /* (notkeyp) */; + data.byte(kDiarypage) = 11; +} + +void DreamGenContext::diarykeyn() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 213); + if (flags.z()) + goto alreadykeyn; + data.byte(kCommandtype) = 213; + al = 23; + commandonly(); +alreadykeyn: + _cmp(data.word(kMousebutton), 0); + if (flags.z()) + return /* (notkeyn) */; + ax = data.word(kOldbutton); + _cmp(ax, data.word(kMousebutton)); + if (flags.z()) + return /* (notkeyn) */; + _cmp(data.byte(kPresscount), 0); + if (!flags.z()) + return /* (notkeyn) */; + al = 16; + playchannel1(); + data.byte(kPresscount) = 12; + data.byte(kPressed) = 'N'; + _inc(data.byte(kDiarypage)); + _cmp(data.byte(kDiarypage), 12); + if (!flags.z()) + return /* (notkeyn) */; + data.byte(kDiarypage) = 0; +} + +void DreamGenContext::showdiarypage() { + STACK_CHECK; + al = 0; + ah = 0; + di = (68+24); + bx = (48+12); + ds = data.word(kTempgraphics); + showframe(); + al = data.byte(kDiarypage); + findtext1(); + data.byte(kKerning) = 1; + usetempcharset(); + di = (68+24)+48; + bx = (48+12)+16; + dl = 240; + ah = 16; + data.word(kCharshift) = 91+91; + printdirect(); + di = (68+24)+129; + bx = (48+12)+16; + dl = 240; + ah = 16; + printdirect(); + di = (68+24)+48; + bx = (48+12)+23; + dl = 240; + ah = 16; + printdirect(); + data.byte(kKerning) = 0; + data.word(kCharshift) = 0; + usecharset1(); +} + +void DreamGenContext::findtext1() { + STACK_CHECK; + ah = 0; + si = ax; + _add(si, si); + es = data.word(kTextfile1); + ax = es.word(si); + _add(ax, (66*2)); + si = ax; +} + +void DreamGenContext::zoomonoff() { + STACK_CHECK; + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + { blank(); return; }; + _cmp(data.byte(kPointermode), 2); + if (flags.z()) + { blank(); return; }; + _cmp(data.byte(kCommandtype), 222); + if (flags.z()) + goto alreadyonoff; + data.byte(kCommandtype) = 222; + al = 39; + commandonly(); +alreadyonoff: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (nozoomonoff) */; + _and(ax, 1); + if (!flags.z()) + goto dozoomonoff; + return; +dozoomonoff: + al = data.byte(kZoomon); + _xor(al, 1); + data.byte(kZoomon) = al; + createpanel(); + data.byte(kNewobs) = 0; + drawfloor(); + printsprites(); + reelsonscreen(); + showicon(); + getunderzoom(); + undertextline(); + al = 39; + commandonly(); + readmouse(); + worktoscreenm(); +} + +void DreamGenContext::saveload() { + STACK_CHECK; + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + { blank(); return; }; + _cmp(data.byte(kPointermode), 2); + if (flags.z()) + { blank(); return; }; + _cmp(data.byte(kCommandtype), 253); + if (flags.z()) + goto alreadyops; + data.byte(kCommandtype) = 253; + al = 43; + commandonly(); +alreadyops: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (noops) */; + _and(ax, 1); + if (flags.z()) + return /* (noops) */; + dosaveload(); +} + +void DreamGenContext::dosaveload() { + STACK_CHECK; + data.byte(kPointerframe) = 0; + data.word(kTextaddressx) = 70; + data.word(kTextaddressy) = 182-8; + data.byte(kTextlen) = 181; + data.byte(kManisoffscreen) = 1; + clearwork(); + createpanel2(); + undertextline(); + getridofall(); + loadsavebox(); + showopbox(); + showmainops(); + worktoscreen(); + goto donefirstops; +restartops: + showopbox(); + showmainops(); + worktoscreenm(); +donefirstops: + data.byte(kGetback) = 0; +waitops: + _cmp(data.byte(kQuitrequested), 0); + if (!flags.z()) + goto justret; + readmouse(); + showpointer(); + vsync(); + dumppointer(); + dumptextline(); + delpointer(); + bx = 3782; + checkcoords(); + _cmp(data.byte(kGetback), 0); + if (flags.z()) + goto waitops; + _cmp(data.byte(kGetback), 2); + if (flags.z()) + goto restartops; + data.word(kTextaddressx) = 13; + data.word(kTextaddressy) = 182; + data.byte(kTextlen) = 240; + _cmp(data.byte(kGetback), 4); + if (flags.z()) + goto justret; + getridoftemp(); + restoreall(); + redrawmainscrn(); + worktoscreenm(); + data.byte(kCommandtype) = 200; +justret: + data.byte(kManisoffscreen) = 0; +} + +void DreamGenContext::getbackfromops() { + STACK_CHECK; + _cmp(data.byte(kMandead), 2); + if (flags.z()) + goto opsblock1; + getback1(); + return; +opsblock1: + blank(); +} + +void DreamGenContext::showmainops() { + STACK_CHECK; + ds = data.word(kTempgraphics); + di = (60)+10; + bx = (52)+10; + al = 8; + ah = 0; + showframe(); + ds = data.word(kTempgraphics); + di = (60)+59; + bx = (52)+30; + al = 7; + ah = 0; + showframe(); + ds = data.word(kTempgraphics); + di = (60)+128+4; + bx = (52)+12; + al = 1; + ah = 0; + showframe(); +} + +void DreamGenContext::showdiscops() { + STACK_CHECK; + ds = data.word(kTempgraphics); + di = (60)+128+4; + bx = (52)+12; + al = 1; + ah = 0; + showframe(); + ds = data.word(kTempgraphics); + di = (60)+10; + bx = (52)+10; + al = 9; + ah = 0; + showframe(); + ds = data.word(kTempgraphics); + di = (60)+59; + bx = (52)+30; + al = 10; + ah = 0; + showframe(); + ds = data.word(kTempgraphics); + di = (60)+176+2; + bx = (52)+60-4; + al = 5; + ah = 0; + showframe(); +} + +void DreamGenContext::loadsavebox() { + STACK_CHECK; + dx = 1961; + loadintotemp(); +} + +void DreamGenContext::loadgame() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 246); + if (flags.z()) + goto alreadyload; + data.byte(kCommandtype) = 246; + al = 41; + commandonly(); +alreadyload: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (noload) */; + _cmp(ax, 1); + if (flags.z()) + goto doload; + return; +doload: + data.byte(kLoadingorsave) = 1; + showopbox(); + showloadops(); + data.byte(kCurrentslot) = 0; + showslots(); + shownames(); + data.byte(kPointerframe) = 0; + worktoscreenm(); + namestoold(); + data.byte(kGetback) = 0; +loadops: + _cmp(data.byte(kQuitrequested), 0); + if (!flags.z()) + return /* (quitloaded) */; + delpointer(); + readmouse(); + showpointer(); + vsync(); + dumppointer(); + dumptextline(); + bx = 3824; + checkcoords(); + _cmp(data.byte(kGetback), 0); + if (flags.z()) + goto loadops; + _cmp(data.byte(kGetback), 2); + if (flags.z()) + return /* (quitloaded) */; + getridoftemp(); + dx = data; + es = dx; + bx = 7979; + startloading(); + loadroomssample(); + data.byte(kRoomloaded) = 1; + data.byte(kNewlocation) = 255; + clearsprites(); + initman(); + initrain(); + data.word(kTextaddressx) = 13; + data.word(kTextaddressy) = 182; + data.byte(kTextlen) = 240; + startup(); + worktoscreen(); + data.byte(kGetback) = 4; +} + +void DreamGenContext::getbacktoops() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 201); + if (flags.z()) + goto alreadygetops; + data.byte(kCommandtype) = 201; + al = 42; + commandonly(); +alreadygetops: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (nogetbackops) */; + _and(ax, 1); + if (!flags.z()) + goto dogetbackops; + return; +dogetbackops: + oldtonames(); + data.byte(kGetback) = 2; +} + +void DreamGenContext::discops() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 249); + if (flags.z()) + goto alreadydiscops; + data.byte(kCommandtype) = 249; + al = 43; + commandonly(); +alreadydiscops: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (nodiscops) */; + _and(ax, 1); + if (!flags.z()) + goto dodiscops; + return; +dodiscops: + scanfornames(); + data.byte(kLoadingorsave) = 2; + showopbox(); + showdiscops(); + data.byte(kCurrentslot) = 0; + worktoscreenm(); + data.byte(kGetback) = 0; +discopsloop: + _cmp(data.byte(kQuitrequested), 0); + if (!flags.z()) + return /* (quitdiscops) */; + delpointer(); + readmouse(); + showpointer(); + vsync(); + dumppointer(); + dumptextline(); + bx = 3866; + checkcoords(); + _cmp(data.byte(kGetback), 0); + if (flags.z()) + goto discopsloop; +} + +void DreamGenContext::savegame() { + STACK_CHECK; + _cmp(data.byte(kMandead), 2); + if (!flags.z()) + goto cansaveok; + blank(); + return; +cansaveok: + _cmp(data.byte(kCommandtype), 247); + if (flags.z()) + goto alreadysave; + data.byte(kCommandtype) = 247; + al = 44; + commandonly(); +alreadysave: + ax = data.word(kMousebutton); + _and(ax, 1); + if (!flags.z()) + goto dosave; + return; +dosave: + data.byte(kLoadingorsave) = 2; + showopbox(); + showsaveops(); + data.byte(kCurrentslot) = 0; + showslots(); + shownames(); + worktoscreenm(); + namestoold(); + data.word(kBufferin) = 0; + data.word(kBufferout) = 0; + data.byte(kGetback) = 0; +saveops: + _cmp(data.byte(kQuitrequested), 0); + if (!flags.z()) + return /* (quitsavegame) */; + delpointer(); + checkinput(); + readmouse(); + showpointer(); + vsync(); + dumppointer(); + dumptextline(); + bx = 3908; + checkcoords(); + _cmp(data.byte(kGetback), 0); + if (flags.z()) + goto saveops; +} + +void DreamGenContext::actualsave() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 222); + if (flags.z()) + goto alreadyactsave; + data.byte(kCommandtype) = 222; + al = 44; + commandonly(); +alreadyactsave: + ax = data.word(kMousebutton); + _and(ax, 1); + if (flags.z()) + return /* (noactsave) */; + dx = data; + ds = dx; + si = 8579; + al = data.byte(kCurrentslot); + ah = 0; + cx = 17; + _mul(cx); + _add(si, ax); + _inc(si); + _cmp(ds.byte(si), 0); + if (flags.z()) + return /* (noactsave) */; + al = data.byte(kLocation); + ah = 0; + cx = 32; + _mul(cx); + ds = cs; + si = 6187; + _add(si, ax); + di = 7979; + bx = di; + es = cs; + cx = 16; + _movsw(cx, true); + al = data.byte(kRoomssample); + es.byte(bx+13) = al; + al = data.byte(kMapx); + es.byte(bx+15) = al; + al = data.byte(kMapy); + es.byte(bx+16) = al; + al = data.byte(kLiftflag); + es.byte(bx+20) = al; + al = data.byte(kManspath); + es.byte(bx+21) = al; + al = data.byte(kFacing); + es.byte(bx+22) = al; + al = 255; + es.byte(bx+27) = al; + saveposition(); + getridoftemp(); + restoreall(); + data.word(kTextaddressx) = 13; + data.word(kTextaddressy) = 182; + data.byte(kTextlen) = 240; + redrawmainscrn(); + worktoscreenm(); + data.byte(kGetback) = 4; +} + +void DreamGenContext::actualload() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 221); + if (flags.z()) + goto alreadyactload; + data.byte(kCommandtype) = 221; + al = 41; + commandonly(); +alreadyactload: + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (notactload) */; + _cmp(ax, 1); + if (!flags.z()) + return /* (notactload) */; + dx = data; + ds = dx; + si = 8579; + al = data.byte(kCurrentslot); + ah = 0; + cx = 17; + _mul(cx); + _add(si, ax); + _inc(si); + _cmp(ds.byte(si), 0); + if (flags.z()) + return /* (notactload) */; + loadposition(); + data.byte(kGetback) = 1; +} + +void DreamGenContext::selectslot2() { + STACK_CHECK; + _cmp(data.word(kMousebutton), 0); + if (flags.z()) + goto noselslot2; + data.byte(kLoadingorsave) = 2; +noselslot2: + selectslot(); +} + +void DreamGenContext::checkinput() { + STACK_CHECK; + _cmp(data.byte(kLoadingorsave), 3); + if (flags.z()) + return /* (nokeypress) */; + readkey(); + al = data.byte(kCurrentkey); + _cmp(al, 0); + if (flags.z()) + return /* (nokeypress) */; + _cmp(al, 13); + if (!flags.z()) + goto notret; + data.byte(kLoadingorsave) = 3; + goto afterkey; +notret: + _cmp(al, 8); + if (!flags.z()) + goto nodel2; + _cmp(data.byte(kCursorpos), 0); + if (flags.z()) + return /* (nokeypress) */; + getnamepos(); + _dec(data.byte(kCursorpos)); + es.byte(bx) = 0; + es.byte(bx+1) = 1; + goto afterkey; +nodel2: + _cmp(data.byte(kCursorpos), 14); + if (flags.z()) + return /* (nokeypress) */; + getnamepos(); + _inc(data.byte(kCursorpos)); + al = data.byte(kCurrentkey); + es.byte(bx+1) = al; + es.byte(bx+2) = 0; + es.byte(bx+3) = 1; + goto afterkey; + return; +afterkey: + showopbox(); + shownames(); + showslots(); + showsaveops(); + worktoscreenm(); +} + +void DreamGenContext::getnamepos() { + STACK_CHECK; + al = data.byte(kCurrentslot); + ah = 0; + cx = 17; + _mul(cx); + dx = data; + es = dx; + bx = 8579; + _add(bx, ax); + al = data.byte(kCursorpos); + ah = 0; + _add(bx, ax); +} + +void DreamGenContext::showopbox() { + STACK_CHECK; + ds = data.word(kTempgraphics); + di = (60); + bx = (52); + al = 0; + ah = 0; + showframe(); + ds = data.word(kTempgraphics); + di = (60); + bx = (52)+55; + al = 4; + ah = 0; + showframe(); +} + +void DreamGenContext::showloadops() { + STACK_CHECK; + ds = data.word(kTempgraphics); + di = (60)+128+4; + bx = (52)+12; + al = 1; + ah = 0; + showframe(); + ds = data.word(kTempgraphics); + di = (60)+176+2; + bx = (52)+60-4; + al = 5; + ah = 0; + showframe(); + di = (60)+104; + bx = (52)+14; + al = 55; + dl = 101; + printmessage(); +} + +void DreamGenContext::showsaveops() { + STACK_CHECK; + ds = data.word(kTempgraphics); + di = (60)+128+4; + bx = (52)+12; + al = 1; + ah = 0; + showframe(); + ds = data.word(kTempgraphics); + di = (60)+176+2; + bx = (52)+60-4; + al = 5; + ah = 0; + showframe(); + di = (60)+104; + bx = (52)+14; + al = 54; + dl = 101; + printmessage(); +} + +void DreamGenContext::selectslot() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 244); + if (flags.z()) + goto alreadysel; + data.byte(kCommandtype) = 244; + al = 45; + commandonly(); +alreadysel: + ax = data.word(kMousebutton); + _cmp(ax, 1); + if (!flags.z()) + return /* (noselslot) */; + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (noselslot) */; + _cmp(data.byte(kLoadingorsave), 3); + if (!flags.z()) + goto notnocurs; + _dec(data.byte(kLoadingorsave)); +notnocurs: + oldtonames(); + ax = data.word(kMousey); + _sub(ax, (52)+4); + cl = -1; +getslotnum: + _inc(cl); + _sub(ax, 11); + if (!flags.c()) + goto getslotnum; + data.byte(kCurrentslot) = cl; + delpointer(); + showopbox(); + showslots(); + shownames(); + _cmp(data.byte(kLoadingorsave), 1); + if (flags.z()) + goto isloadmode; + showsaveops(); + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); + return; +isloadmode: + showloadops(); + readmouse(); + showpointer(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::showslots() { + STACK_CHECK; + di = (60)+7; + bx = (52)+8; + al = 2; + ds = data.word(kTempgraphics); + ah = 0; + showframe(); + di = (60)+10; + bx = (52)+11; + cl = 0; +slotloop: + push(cx); + push(di); + push(bx); + _cmp(cl, data.byte(kCurrentslot)); + if (!flags.z()) + goto nomatchslot; + al = 3; + ds = data.word(kTempgraphics); + ah = 0; + showframe(); +nomatchslot: + bx = pop(); + di = pop(); + cx = pop(); + _add(bx, 10); + _inc(cl); + _cmp(cl, 7); + if (!flags.z()) + goto slotloop; +} + +void DreamGenContext::shownames() { + STACK_CHECK; + dx = data; + es = dx; + si = 8579+1; + di = (60)+21; + bx = (52)+10; + cl = 0; +shownameloop: + push(cx); + push(di); + push(es); + push(bx); + push(si); + al = 4; + _cmp(cl, data.byte(kCurrentslot)); + if (!flags.z()) + goto nomatchslot2; + _cmp(data.byte(kLoadingorsave), 2); + if (!flags.z()) + goto loadmode; + dx = si; + cx = 15; + _add(si, 15); +zerostill: + _dec(si); + _dec(cl); + _cmp(es.byte(si), 1); + if (!flags.z()) + goto foundcharacter; + goto zerostill; +foundcharacter: + data.byte(kCursorpos) = cl; + es.byte(si) = '/'; + es.byte(si+1) = 0; + push(si); + si = dx; + dl = 200; + ah = 0; + printdirect(); + si = pop(); + es.byte(si) = 0; + es.byte(si+1) = 1; + goto afterprintname; +loadmode: + al = 0; + dl = 200; + ah = 0; + data.word(kCharshift) = 91; + printdirect(); + data.word(kCharshift) = 0; + goto afterprintname; +nomatchslot2: + dl = 200; + ah = 0; + printdirect(); +afterprintname: + si = pop(); + bx = pop(); + es = pop(); + di = pop(); + cx = pop(); + _add(si, 17); + _add(bx, 10); + _inc(cl); + _cmp(cl, 7); + if (!flags.z()) + goto shownameloop; +} + +void DreamGenContext::namestoold() { + STACK_CHECK; + ds = cs; + si = 8579; + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)); + es = data.word(kBuffers); + cx = 17*4; + _movsb(cx, true); +} + +void DreamGenContext::oldtonames() { + STACK_CHECK; + es = cs; + di = 8579; + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)); + ds = data.word(kBuffers); + cx = 17*4; + _movsb(cx, true); +} + +void DreamGenContext::saveposition() { + STACK_CHECK; + makeheader(); + al = data.byte(kCurrentslot); + ah = 0; + push(ax); + cx = 13; + _mul(cx); + dx = data; + ds = dx; + dx = 8698; + _add(dx, ax); + openforsave(); + dx = data; + ds = dx; + dx = 6091; + cx = (6187-6091); + savefilewrite(); + dx = data; + es = dx; + di = 6141; + ax = pop(); + cx = 17; + _mul(cx); + dx = data; + ds = dx; + dx = 8579; + _add(dx, ax); + saveseg(); + dx = data; + ds = dx; + dx = 0; + saveseg(); + ds = data.word(kExtras); + dx = (0); + saveseg(); + ds = data.word(kBuffers); + dx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)); + saveseg(); + dx = data; + ds = dx; + dx = 7979; + saveseg(); + dx = data; + ds = dx; + dx = 534; + saveseg(); + closefile(); +} + +void DreamGenContext::loadposition() { + STACK_CHECK; + data.word(kTimecount) = 0; + clearchanges(); + al = data.byte(kCurrentslot); + ah = 0; + push(ax); + cx = 13; + _mul(cx); + dx = data; + ds = dx; + dx = 8698; + _add(dx, ax); + openfilefromc(); + ds = cs; + dx = 6091; + cx = (6187-6091); + savefileread(); + es = cs; + di = 6141; + ax = pop(); + cx = 17; + _mul(cx); + dx = data; + ds = dx; + dx = 8579; + _add(dx, ax); + loadseg(); + dx = data; + ds = dx; + dx = 0; + loadseg(); + ds = data.word(kExtras); + dx = (0); + loadseg(); + ds = data.word(kBuffers); + dx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)); + loadseg(); + dx = data; + ds = dx; + dx = 7979; + loadseg(); + ds = cs; + dx = 534; + loadseg(); + closefile(); +} + +void DreamGenContext::makeheader() { + STACK_CHECK; + dx = data; + es = dx; + di = 6141; + ax = 17; + storeit(); + ax = (68-0); + storeit(); + ax = (0+2080+30000+(16*114)+((114+2)*2)+18000); + storeit(); + ax = (250)*4; + storeit(); + ax = 48; + storeit(); + ax = (991-534); + storeit(); +} + +void DreamGenContext::storeit() { + STACK_CHECK; + _cmp(ax, 0); + if (!flags.z()) + goto isntblank; + _inc(ax); +isntblank: + _stosw(); +} + +void DreamGenContext::findlen() { + STACK_CHECK; + _dec(bx); + _add(bx, ax); +nextone: + _cmp(cl, ds.byte(bx)); + if (!flags.z()) + return /* (foundlen) */; + _dec(bx); + _dec(ax); + _cmp(ax, 0); + if (!flags.z()) + goto nextone; +} + +void DreamGenContext::scanfornames() { + STACK_CHECK; + dx = data; + es = dx; + di = 8579; + dx = data; + ds = dx; + dx = 8698; + cx = 7; +scanloop: + push(es); + push(ds); + push(di); + push(dx); + push(cx); + openfilefromc(); + if (flags.c()) + goto notexist; + cx = pop(); + _inc(ch); + push(cx); + push(di); + push(es); + dx = data; + ds = dx; + dx = 6091; + cx = (6187-6091); + savefileread(); + dx = data; + es = dx; + di = 6141; + ds = pop(); + dx = pop(); + loadseg(); + bx = data.word(kHandle); + closefile(); +notexist: + cx = pop(); + dx = pop(); + di = pop(); + ds = pop(); + es = pop(); + _add(dx, 13); + _add(di, 17); + _dec(cl); + if (!flags.z()) + goto scanloop; + al = ch; +} + +void DreamGenContext::decide() { + STACK_CHECK; + setmode(); + loadpalfromiff(); + clearpalette(); + data.byte(kPointermode) = 0; + data.word(kWatchingtime) = 0; + data.byte(kPointerframe) = 0; + data.word(kTextaddressx) = 70; + data.word(kTextaddressy) = 182-8; + data.byte(kTextlen) = 181; + data.byte(kManisoffscreen) = 1; + loadsavebox(); + showdecisions(); + worktoscreen(); + fadescreenup(); + data.byte(kGetback) = 0; +waitdecide: + _cmp(data.byte(kQuitrequested), 0); + if (flags.z()) + goto _tmp1; + return; +_tmp1: + readmouse(); + showpointer(); + vsync(); + dumppointer(); + dumptextline(); + delpointer(); + bx = 5057; + checkcoords(); + _cmp(data.byte(kGetback), 0); + if (flags.z()) + goto waitdecide; + _cmp(data.byte(kGetback), 4); + if (flags.z()) + goto hasloadedroom; + getridoftemp(); +hasloadedroom: + data.word(kTextaddressx) = 13; + data.word(kTextaddressy) = 182; + data.byte(kTextlen) = 240; +} + +void DreamGenContext::showdecisions() { + STACK_CHECK; + createpanel2(); + showopbox(); + ds = data.word(kTempgraphics); + di = (60)+17; + bx = (52)+13; + al = 6; + ah = 0; + showframe(); + undertextline(); +} + +void DreamGenContext::newgame() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 251); + if (flags.z()) + goto alreadynewgame; + data.byte(kCommandtype) = 251; + al = 47; + commandonly(); +alreadynewgame: + ax = data.word(kMousebutton); + _cmp(ax, 1); + if (!flags.z()) + return /* (nonewgame) */; + data.byte(kGetback) = 3; +} + +void DreamGenContext::doload() { + STACK_CHECK; + showopbox(); + showloadops(); + data.byte(kCurrentslot) = 0; + showslots(); + shownames(); + data.byte(kPointerframe) = 0; + worktoscreenm(); + namestoold(); + data.byte(kGetback) = 0; +loadops: + _cmp(data.byte(kQuitrequested), 0); + if (!flags.z()) + return /* (quitloaded) */; + delpointer(); + readmouse(); + showpointer(); + vsync(); + dumppointer(); + dumptextline(); + bx = 3824; + checkcoords(); + _cmp(data.byte(kGetback), 0); + if (flags.z()) + goto loadops; + _cmp(data.byte(kGetback), 2); + if (flags.z()) + return /* (quitloaded) */; + getridoftemp(); + dx = data; + es = dx; + bx = 7979; + startloading(); + loadroomssample(); + data.byte(kRoomloaded) = 1; + data.byte(kNewlocation) = 255; + clearsprites(); + initman(); + initrain(); + data.word(kTextaddressx) = 13; + data.word(kTextaddressy) = 182; + data.byte(kTextlen) = 240; + startup(); + worktoscreen(); + data.byte(kGetback) = 4; +} + +void DreamGenContext::loadold() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 252); + if (flags.z()) + goto alreadyloadold; + data.byte(kCommandtype) = 252; + al = 48; + commandonly(); +alreadyloadold: + ax = data.word(kMousebutton); + _and(ax, 1); + if (flags.z()) + return /* (noloadold) */; + doload(); + _cmp(data.byte(kGetback), 4); + if (flags.z()) + return /* (noloadold) */; + _cmp(data.byte(kQuitrequested), 0); + if (!flags.z()) + return /* (noloadold) */; + showdecisions(); + worktoscreenm(); + data.byte(kGetback) = 0; +} + +void DreamGenContext::createname() { + STACK_CHECK; + push(ax); + di = 5105; + cs.byte(di+0) = dl; + cs.byte(di+3) = cl; + al = dh; + ah = '0'-1; +findten: + _inc(ah); + _sub(al, 10); + if (!flags.c()) + goto findten; + cs.byte(di+1) = ah; + _add(al, 10+'0'); + cs.byte(di+2) = al; + ax = pop(); + cl = '0'-1; +thousandsc: + _inc(cl); + _sub(ax, 1000); + if (!flags.c()) + goto thousandsc; + _add(ax, 1000); + cs.byte(di+4) = cl; + cl = '0'-1; +hundredsc: + _inc(cl); + _sub(ax, 100); + if (!flags.c()) + goto hundredsc; + _add(ax, 100); + cs.byte(di+5) = cl; + cl = '0'-1; +tensc: + _inc(cl); + _sub(ax, 10); + if (!flags.c()) + goto tensc; + _add(ax, 10); + cs.byte(di+6) = cl; + _add(al, '0'); + cs.byte(di+7) = al; +} + +void DreamGenContext::trysoundalloc() { + STACK_CHECK; + _cmp(data.byte(kNeedsoundbuff), 1); + if (flags.z()) + return /* (gotsoundbuff) */; + _inc(data.byte(kSoundtimes)); + bx = (16384+2048)/16; + allocatemem(); + data.word(kSoundbuffer) = ax; + push(ax); + al = ah; + cl = 4; + _shr(al, cl); + data.byte(kSoundbufferpage) = al; + ax = pop(); + cl = 4; + _shl(ax, cl); + data.word(kSoundbufferad) = ax; + _cmp(ax, 0x0b7ff); + if (!flags.c()) + goto soundfail; + es = data.word(kSoundbuffer); + di = 0; + cx = 16384/2; + ax = 0x7f7f; + _stosw(cx, true); + data.byte(kNeedsoundbuff) = 1; + return; +soundfail: + es = data.word(kSoundbuffer); + deallocatemem(); +} + +void DreamGenContext::playchannel0() { + STACK_CHECK; + _cmp(data.byte(kSoundint), 255); + if (flags.z()) + return /* (dontbother4) */; + push(es); + push(ds); + push(bx); + push(cx); + push(di); + push(si); + data.byte(kCh0playing) = al; + es = data.word(kSounddata); + _cmp(al, 12); + if (flags.c()) + goto notsecondbank; + es = data.word(kSounddata2); + _sub(al, 12); +notsecondbank: + data.byte(kCh0repeat) = ah; + ah = 0; + _add(ax, ax); + bx = ax; + _add(ax, ax); + _add(bx, ax); + al = es.byte(bx); + ah = 0; + data.word(kCh0emmpage) = ax; + ax = es.word(bx+1); + data.word(kCh0offset) = ax; + ax = es.word(bx+3); + data.word(kCh0blockstocopy) = ax; + _cmp(data.byte(kCh0repeat), 0); + if (flags.z()) + goto nosetloop; + ax = data.word(kCh0emmpage); + data.word(kCh0oldemmpage) = ax; + ax = data.word(kCh0offset); + data.word(kCh0oldoffset) = ax; + ax = data.word(kCh0blockstocopy); + data.word(kCh0oldblockstocopy) = ax; +nosetloop: + si = pop(); + di = pop(); + cx = pop(); + bx = pop(); + ds = pop(); + es = pop(); +} + +void DreamGenContext::playchannel1() { + STACK_CHECK; + _cmp(data.byte(kSoundint), 255); + if (flags.z()) + return /* (dontbother5) */; + _cmp(data.byte(kCh1playing), 7); + if (flags.z()) + return /* (dontbother5) */; + push(es); + push(ds); + push(bx); + push(cx); + push(di); + push(si); + data.byte(kCh1playing) = al; + es = data.word(kSounddata); + _cmp(al, 12); + if (flags.c()) + goto notsecondbank1; + es = data.word(kSounddata2); + _sub(al, 12); +notsecondbank1: + ah = 0; + _add(ax, ax); + bx = ax; + _add(ax, ax); + _add(bx, ax); + al = es.byte(bx); + ah = 0; + data.word(kCh1emmpage) = ax; + ax = es.word(bx+1); + data.word(kCh1offset) = ax; + ax = es.word(bx+3); + data.word(kCh1blockstocopy) = ax; + si = pop(); + di = pop(); + cx = pop(); + bx = pop(); + ds = pop(); + es = pop(); +} + +void DreamGenContext::makenextblock() { + STACK_CHECK; + volumeadjust(); + loopchannel0(); + _cmp(data.word(kCh1blockstocopy), 0); + if (flags.z()) + goto mightbeonlych0; + _cmp(data.word(kCh0blockstocopy), 0); + if (flags.z()) + goto mightbeonlych1; + _dec(data.word(kCh0blockstocopy)); + _dec(data.word(kCh1blockstocopy)); + bothchannels(); + return; +mightbeonlych1: + data.byte(kCh0playing) = 255; + _cmp(data.word(kCh1blockstocopy), 0); + if (flags.z()) + return /* (notch1only) */; + _dec(data.word(kCh1blockstocopy)); + channel1only(); + return; +mightbeonlych0: + data.byte(kCh1playing) = 255; + _cmp(data.word(kCh0blockstocopy), 0); + if (flags.z()) + goto notch0only; + _dec(data.word(kCh0blockstocopy)); + channel0only(); + return; +notch0only: + es = data.word(kSoundbuffer); + di = data.word(kSoundbufferwrite); + cx = 1024; + ax = 0x7f7f; + _stosw(cx, true); + _and(di, 16384-1); + data.word(kSoundbufferwrite) = di; +} + +void DreamGenContext::volumeadjust() { + STACK_CHECK; + al = data.byte(kVolumedirection); + _cmp(al, 0); + if (flags.z()) + return /* (volok) */; + al = data.byte(kVolume); + _cmp(al, data.byte(kVolumeto)); + if (flags.z()) + goto volfinish; + _add(data.byte(kVolumecount), 64); + if (!flags.z()) + return /* (volok) */; + al = data.byte(kVolume); + _add(al, data.byte(kVolumedirection)); + data.byte(kVolume) = al; + return; +volfinish: + data.byte(kVolumedirection) = 0; +} + +void DreamGenContext::loopchannel0() { + STACK_CHECK; + _cmp(data.word(kCh0blockstocopy), 0); + if (!flags.z()) + return /* (notloop) */; + _cmp(data.byte(kCh0repeat), 0); + if (flags.z()) + return /* (notloop) */; + _cmp(data.byte(kCh0repeat), 255); + if (flags.z()) + goto endlessloop; + _dec(data.byte(kCh0repeat)); +endlessloop: + ax = data.word(kCh0oldemmpage); + data.word(kCh0emmpage) = ax; + ax = data.word(kCh0oldoffset); + data.word(kCh0offset) = ax; + ax = data.word(kCh0blockstocopy); + _add(ax, data.word(kCh0oldblockstocopy)); + data.word(kCh0blockstocopy) = ax; +} + +void DreamGenContext::cancelch0() { + STACK_CHECK; + data.byte(kCh0repeat) = 0; + data.word(kCh0blockstocopy) = 0; + data.byte(kCh0playing) = 255; +} + +void DreamGenContext::cancelch1() { + STACK_CHECK; + data.word(kCh1blockstocopy) = 0; + data.byte(kCh1playing) = 255; +} + +void DreamGenContext::channel0tran() { + STACK_CHECK; + _cmp(data.byte(kVolume), 0); + if (!flags.z()) + goto lowvolumetran; + cx = 1024; + _movsw(cx, true); + return; +lowvolumetran: + cx = 1024; + bh = data.byte(kVolume); + bl = 0; + _add(bx, 16384-256); +volloop: + _lodsw(); + bl = al; + al = es.byte(bx); + bl = ah; + ah = es.byte(bx); + _stosw(); + if (--cx) + goto volloop; +} + +void DreamGenContext::domix() { + STACK_CHECK; + _cmp(data.byte(kVolume), 0); + if (!flags.z()) + goto lowvolumemix; +slow: + _lodsb(); + ah = ds.byte(bx); + _inc(bx); + _cmp(al, dh); + if (!flags.c()) + goto toplot; + _cmp(ah, dh); + if (!flags.c()) + goto nodistort; + _add(al, ah); + if (flags.s()) + goto botok; + _xor(al, al); + _stosb(); + if (--cx) + goto slow; + return /* (doneit) */; +botok: + _xor(al, dh); + _stosb(); + if (--cx) + goto slow; + return /* (doneit) */; +toplot: + _cmp(ah, dh); + if (flags.c()) + goto nodistort; + _add(al, ah); + if (!flags.s()) + goto topok; + al = dl; + _stosb(); + if (--cx) + goto slow; + return /* (doneit) */; +topok: + _xor(al, dh); + _stosb(); + if (--cx) + goto slow; + return /* (doneit) */; +nodistort: + _add(al, ah); + _xor(al, dh); + _stosb(); + if (--cx) + goto slow; + return /* (doneit) */; +lowvolumemix: + _lodsb(); + push(bx); + bh = data.byte(kVolume); + _add(bh, 63); + bl = al; + al = es.byte(bx); + bx = pop(); + ah = ds.byte(bx); + _inc(bx); + _cmp(al, dh); + if (!flags.c()) + goto toplotv; + _cmp(ah, dh); + if (!flags.c()) + goto nodistortv; + _add(al, ah); + if (flags.s()) + goto botokv; + _xor(al, al); + _stosb(); + if (--cx) + goto lowvolumemix; + return /* (doneit) */; +botokv: + _xor(al, dh); + _stosb(); + if (--cx) + goto lowvolumemix; + return /* (doneit) */; +toplotv: + _cmp(ah, dh); + if (flags.c()) + goto nodistortv; + _add(al, ah); + if (!flags.s()) + goto topokv; + al = dl; + _stosb(); + if (--cx) + goto lowvolumemix; + return /* (doneit) */; +topokv: + _xor(al, dh); + _stosb(); + if (--cx) + goto lowvolumemix; + return /* (doneit) */; +nodistortv: + _add(al, ah); + _xor(al, dh); + _stosb(); + if (--cx) + goto lowvolumemix; +} + +void DreamGenContext::entrytexts() { + STACK_CHECK; + _cmp(data.byte(kLocation), 21); + if (!flags.z()) + goto notloc15; + al = 28; + cx = 60; + dx = 11; + bl = 68; + bh = 64; + setuptimeduse(); + return; +notloc15: + _cmp(data.byte(kLocation), 30); + if (!flags.z()) + goto notloc43; + al = 27; + cx = 60; + dx = 11; + bl = 68; + bh = 64; + setuptimeduse(); + return; +notloc43: + _cmp(data.byte(kLocation), 23); + if (!flags.z()) + goto notloc23; + al = 29; + cx = 60; + dx = 11; + bl = 68; + bh = 64; + setuptimeduse(); + return; +notloc23: + _cmp(data.byte(kLocation), 31); + if (!flags.z()) + goto notloc44; + al = 30; + cx = 60; + dx = 11; + bl = 68; + bh = 64; + setuptimeduse(); + return; +notloc44: + _cmp(data.byte(kLocation), 20); + if (!flags.z()) + goto notsarters2; + al = 31; + cx = 60; + dx = 11; + bl = 68; + bh = 64; + setuptimeduse(); + return; +notsarters2: + _cmp(data.byte(kLocation), 24); + if (!flags.z()) + goto notedenlob; + al = 32; + cx = 60; + dx = 3; + bl = 68; + bh = 64; + setuptimeduse(); + return; +notedenlob: + _cmp(data.byte(kLocation), 34); + if (!flags.z()) + return /* (noteden2) */; + al = 33; + cx = 60; + dx = 3; + bl = 68; + bh = 64; + setuptimeduse(); +} + +void DreamGenContext::entryanims() { + STACK_CHECK; + data.word(kReeltowatch) = -1; + data.byte(kWatchmode) = -1; + _cmp(data.byte(kLocation), 33); + if (!flags.z()) + goto notinthebeach; + switchryanoff(); + data.word(kWatchingtime) = 76*2; + data.word(kReeltowatch) = 0; + data.word(kEndwatchreel) = 76; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + return; +notinthebeach: + _cmp(data.byte(kLocation), 44); + if (!flags.z()) + goto notsparkys; + al = 8; + resetlocation(); + data.word(kWatchingtime) = 50*2; + data.word(kReeltowatch) = 247; + data.word(kEndwatchreel) = 297; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + switchryanoff(); + return; +notsparkys: + _cmp(data.byte(kLocation), 22); + if (!flags.z()) + goto notinthelift; + data.word(kWatchingtime) = 31*2; + data.word(kReeltowatch) = 0; + data.word(kEndwatchreel) = 30; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + switchryanoff(); + return; +notinthelift: + _cmp(data.byte(kLocation), 26); + if (!flags.z()) + goto notunderchurch; + data.byte(kSymboltopnum) = 2; + data.byte(kSymbolbotnum) = 1; + return; +notunderchurch: + _cmp(data.byte(kLocation), 45); + if (!flags.z()) + goto notenterdream; + data.byte(kKeeperflag) = 0; + data.word(kWatchingtime) = 296; + data.word(kReeltowatch) = 45; + data.word(kEndwatchreel) = 198; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + switchryanoff(); + return; +notenterdream: + _cmp(data.byte(kReallocation), 46); + if (!flags.z()) + goto notcrystal; + _cmp(data.byte(kSartaindead), 1); + if (!flags.z()) + goto notcrystal; + al = 0; + removefreeobject(); + return; +notcrystal: + _cmp(data.byte(kLocation), 9); + if (!flags.z()) + goto nottopchurch; + al = 2; + checkifpathison(); + if (flags.z()) + goto nottopchurch; + _cmp(data.byte(kAidedead), 0); + if (flags.z()) + goto nottopchurch; + al = 3; + checkifpathison(); + if (!flags.z()) + goto makedoorsopen; + al = 2; + turnpathon(); +makedoorsopen: + al = 4; + removesetobject(); + al = 5; + placesetobject(); + return; +nottopchurch: + _cmp(data.byte(kLocation), 47); + if (!flags.z()) + goto notdreamcentre; + al = 4; + placesetobject(); + al = 5; + placesetobject(); + return; +notdreamcentre: + _cmp(data.byte(kLocation), 38); + if (!flags.z()) + goto notcarpark; + data.word(kWatchingtime) = 57*2; + data.word(kReeltowatch) = 4; + data.word(kEndwatchreel) = 57; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + switchryanoff(); + return; +notcarpark: + _cmp(data.byte(kLocation), 32); + if (!flags.z()) + goto notalley; + data.word(kWatchingtime) = 66*2; + data.word(kReeltowatch) = 0; + data.word(kEndwatchreel) = 66; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + switchryanoff(); + return; +notalley: + _cmp(data.byte(kLocation), 24); + if (!flags.z()) + return /* (notedensagain) */; + al = 2; + ah = data.byte(kRoomnum); + _dec(ah); + turnanypathon(); +} + +void DreamGenContext::initialinv() { + STACK_CHECK; + _cmp(data.byte(kReallocation), 24); + if (flags.z()) + goto isedens; + return; +isedens: + al = 11; + ah = 5; + pickupob(); + al = 12; + ah = 6; + pickupob(); + al = 13; + ah = 7; + pickupob(); + al = 14; + ah = 8; + pickupob(); + al = 18; + al = 18; + ah = 0; + pickupob(); + al = 19; + ah = 1; + pickupob(); + al = 20; + ah = 9; + pickupob(); + al = 16; + ah = 2; + pickupob(); + data.byte(kWatchmode) = 1; + data.word(kReeltohold) = 0; + data.word(kEndofholdreel) = 6; + data.byte(kWatchspeed) = 1; + data.byte(kSpeedcount) = 1; + switchryanoff(); +} + +void DreamGenContext::pickupob() { + STACK_CHECK; + data.byte(kLastinvpos) = ah; + data.byte(kObjecttype) = 2; + data.byte(kItemframe) = al; + data.byte(kCommand) = al; + getanyad(); + transfertoex(); +} + +void DreamGenContext::checkforemm() { + STACK_CHECK; +} + +void DreamGenContext::checkbasemem() { + STACK_CHECK; + bx = data.word(kHowmuchalloc); + _cmp(bx, 0x9360); + if (!flags.c()) + return /* (enoughmem) */; + data.byte(kGameerror) = 5; + { quickquit(); return; }; +} + +void DreamGenContext::allocatebuffers() { + STACK_CHECK; + bx = (0+2080+30000+(16*114)+((114+2)*2)+18000)/16; + allocatemem(); + data.word(kExtras) = ax; + trysoundalloc(); + bx = (0+(66*60))/16; + allocatemem(); + data.word(kMapdata) = ax; + trysoundalloc(); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534+68-0)/16; + allocatemem(); + data.word(kBuffers) = ax; + trysoundalloc(); + bx = (16*80)/16; + allocatemem(); + data.word(kFreedat) = ax; + trysoundalloc(); + bx = (64*128)/16; + allocatemem(); + data.word(kSetdat) = ax; + trysoundalloc(); + bx = (22*8*20*8)/16; + allocatemem(); + data.word(kMapstore) = ax; + allocatework(); + bx = 2048/16; + allocatemem(); + data.word(kSounddata) = ax; + bx = 2048/16; + allocatemem(); + data.word(kSounddata2) = ax; +} + +void DreamGenContext::clearbuffers() { + STACK_CHECK; + es = data.word(kBuffers); + cx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534+68-0)/2; + ax = 0; + di = 0; + _stosw(cx, true); + es = data.word(kExtras); + cx = (0+2080+30000+(16*114)+((114+2)*2)+18000)/2; + ax = 0x0ffff; + di = 0; + _stosw(cx, true); + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)); + ds = cs; + si = 534; + cx = (991-534); + _movsb(cx, true); + es = data.word(kBuffers); + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534); + ds = cs; + si = 0; + cx = (68-0); + _movsb(cx, true); + clearchanges(); +} + +void DreamGenContext::clearchanges() { + STACK_CHECK; + es = data.word(kBuffers); + cx = (250)*2; + ax = 0x0ffff; + di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)); + _stosw(cx, true); + ds = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)); + es = cs; + di = 534; + cx = (991-534); + _movsb(cx, true); + ds = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534); + es = cs; + di = 0; + cx = (68-0); + _movsb(cx, true); + data.byte(kExpos) = 0; + data.word(kExframepos) = 0; + data.word(kExtextpos) = 0; + es = data.word(kExtras); + cx = (0+2080+30000+(16*114)+((114+2)*2)+18000)/2; + ax = 0x0ffff; + di = 0; + _stosw(cx, true); + es = cs; + di = 8011; + al = 1; + _stosb(2); + al = 0; + _stosb(); + al = 1; + _stosb(); + ax = 0; + cx = 6; + _stosw(cx, true); +} + +void DreamGenContext::clearbeforeload() { + STACK_CHECK; + _cmp(data.byte(kRoomloaded), 1); + if (!flags.z()) + return /* (noclear) */; + clearreels(); + clearrest(); + data.byte(kRoomloaded) = 0; +} + +void DreamGenContext::clearreels() { + STACK_CHECK; + es = data.word(kReel1); + deallocatemem(); + es = data.word(kReel2); + deallocatemem(); + es = data.word(kReel3); + deallocatemem(); +} + +void DreamGenContext::clearrest() { + STACK_CHECK; + es = data.word(kMapdata); + cx = (66*60)/2; + ax = 0; + di = (0); + _stosw(cx, true); + es = data.word(kBackdrop); + deallocatemem(); + es = data.word(kSetframes); + deallocatemem(); + es = data.word(kReels); + deallocatemem(); + es = data.word(kPeople); + deallocatemem(); + es = data.word(kSetdesc); + deallocatemem(); + es = data.word(kBlockdesc); + deallocatemem(); + es = data.word(kRoomdesc); + deallocatemem(); + es = data.word(kFreeframes); + deallocatemem(); + es = data.word(kFreedesc); + deallocatemem(); +} + +void DreamGenContext::parseblaster() { + STACK_CHECK; +lookattail: + al = es.byte(bx); + _cmp(al, 0); + if (flags.z()) + return /* (endtail) */; + _cmp(al, 13); + if (flags.z()) + return /* (endtail) */; + _cmp(al, 'i'); + if (flags.z()) + goto issoundint; + _cmp(al, 'I'); + if (flags.z()) + goto issoundint; + _cmp(al, 'b'); + if (flags.z()) + goto isbright; + _cmp(al, 'B'); + if (flags.z()) + goto isbright; + _cmp(al, 'a'); + if (flags.z()) + goto isbaseadd; + _cmp(al, 'A'); + if (flags.z()) + goto isbaseadd; + _cmp(al, 'n'); + if (flags.z()) + goto isnosound; + _cmp(al, 'N'); + if (flags.z()) + goto isnosound; + _cmp(al, 'd'); + if (flags.z()) + goto isdma; + _cmp(al, 'D'); + if (flags.z()) + goto isdma; + _inc(bx); + if (--cx) + goto lookattail; + return; +issoundint: + al = es.byte(bx+1); + _sub(al, '0'); + data.byte(kSoundint) = al; + _inc(bx); + goto lookattail; +isdma: + al = es.byte(bx+1); + _sub(al, '0'); + data.byte(kSounddmachannel) = al; + _inc(bx); + goto lookattail; +isbaseadd: + push(cx); + al = es.byte(bx+2); + _sub(al, '0'); + ah = 0; + cl = 4; + _shl(ax, cl); + _add(ax, 0x200); + data.word(kSoundbaseadd) = ax; + cx = pop(); + _inc(bx); + goto lookattail; +isbright: + data.byte(kBrightness) = 1; + _inc(bx); + goto lookattail; +isnosound: + data.byte(kSoundint) = 255; + _inc(bx); + goto lookattail; +} + +void DreamGenContext::startup() { + STACK_CHECK; + data.byte(kCurrentkey) = 0; + data.byte(kMainmode) = 0; + createpanel(); + data.byte(kNewobs) = 1; + drawfloor(); + showicon(); + getunderzoom(); + spriteupdate(); + printsprites(); + undertextline(); + reelsonscreen(); + atmospheres(); +} + +void DreamGenContext::startup1() { + STACK_CHECK; + clearpalette(); + data.byte(kThroughdoor) = 0; + data.byte(kCurrentkey) = '0'; + data.byte(kMainmode) = 0; + createpanel(); + data.byte(kNewobs) = 1; + drawfloor(); + showicon(); + getunderzoom(); + spriteupdate(); + printsprites(); + undertextline(); + reelsonscreen(); + atmospheres(); + worktoscreen(); + fadescreenup(); +} + +void DreamGenContext::screenupdate() { + STACK_CHECK; + newplace(); + mainscreen(); + animpointer(); + showpointer(); + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + goto iswatchingmode; + _cmp(data.byte(kNewlocation), 255); + if (!flags.z()) + return /* (finishearly) */; +iswatchingmode: + vsync(); + readmouse1(); + dumppointer(); + dumptextline(); + delpointer(); + autolook(); + spriteupdate(); + watchcount(); + zoom(); + showpointer(); + _cmp(data.byte(kWongame), 0); + if (!flags.z()) + return /* (finishearly) */; + vsync(); + readmouse2(); + dumppointer(); + dumpzoom(); + delpointer(); + deleverything(); + printsprites(); + reelsonscreen(); + afternewroom(); + showpointer(); + vsync(); + readmouse3(); + dumppointer(); + dumpmap(); + dumptimedtext(); + delpointer(); + showpointer(); + vsync(); + readmouse4(); + dumppointer(); + dumpwatch(); + delpointer(); +} + +void DreamGenContext::watchreel() { + STACK_CHECK; + _cmp(data.word(kReeltowatch), -1); + if (flags.z()) + goto notplayingreel; + al = data.byte(kManspath); + _cmp(al, data.byte(kFinaldest)); + if (!flags.z()) + return /* (waitstopwalk) */; + al = data.byte(kTurntoface); + _cmp(al, data.byte(kFacing)); + if (flags.z()) + goto notwatchpath; + return; +notwatchpath: + _dec(data.byte(kSpeedcount)); + _cmp(data.byte(kSpeedcount), -1); + if (!flags.z()) + goto showwatchreel; + al = data.byte(kWatchspeed); + data.byte(kSpeedcount) = al; + ax = data.word(kReeltowatch); + _cmp(ax, data.word(kEndwatchreel)); + if (!flags.z()) + goto ismorereel; + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + goto showwatchreel; + data.word(kReeltowatch) = -1; + data.byte(kWatchmode) = -1; + _cmp(data.word(kReeltohold), -1); + if (flags.z()) + return /* (nomorereel) */; + data.byte(kWatchmode) = 1; + goto notplayingreel; +ismorereel: + _inc(data.word(kReeltowatch)); +showwatchreel: + ax = data.word(kReeltowatch); + data.word(kReelpointer) = ax; + plotreel(); + ax = data.word(kReelpointer); + data.word(kReeltowatch) = ax; + checkforshake(); + return; +notplayingreel: + _cmp(data.byte(kWatchmode), 1); + if (!flags.z()) + goto notholdingreel; + ax = data.word(kReeltohold); + data.word(kReelpointer) = ax; + plotreel(); + return; +notholdingreel: + _cmp(data.byte(kWatchmode), 2); + if (!flags.z()) + return /* (notreleasehold) */; + _dec(data.byte(kSpeedcount)); + _cmp(data.byte(kSpeedcount), -1); + if (!flags.z()) + goto notlastspeed2; + al = data.byte(kWatchspeed); + data.byte(kSpeedcount) = al; + _inc(data.word(kReeltohold)); +notlastspeed2: + ax = data.word(kReeltohold); + _cmp(ax, data.word(kEndofholdreel)); + if (!flags.z()) + goto ismorereel2; + data.word(kReeltohold) = -1; + data.byte(kWatchmode) = -1; + al = data.byte(kDestafterhold); + data.byte(kDestination) = al; + data.byte(kFinaldest) = al; + autosetwalk(); + return; +ismorereel2: + ax = data.word(kReeltohold); + data.word(kReelpointer) = ax; + plotreel(); +} + +void DreamGenContext::checkforshake() { + STACK_CHECK; + _cmp(data.byte(kReallocation), 26); + if (!flags.z()) + return /* (notstartshake) */; + _cmp(ax, 104); + if (!flags.z()) + return /* (notstartshake) */; + data.byte(kShakecounter) = -1; +} + +void DreamGenContext::watchcount() { + STACK_CHECK; + _cmp(data.byte(kWatchon), 0); + if (flags.z()) + return /* (nowatchworn) */; + _inc(data.byte(kTimercount)); + _cmp(data.byte(kTimercount), 9); + if (flags.z()) + goto flashdots; + _cmp(data.byte(kTimercount), 18); + if (flags.z()) + goto uptime; + return; +flashdots: + ax = 91*3+21; + di = 268+4; + bx = 21; + ds = data.word(kCharset1); + showframe(); + goto finishwatch; +uptime: + data.byte(kTimercount) = 0; + _add(data.byte(kSecondcount), 1); + _cmp(data.byte(kSecondcount), 60); + if (!flags.z()) + goto finishtime; + data.byte(kSecondcount) = 0; + _inc(data.byte(kMinutecount)); + _cmp(data.byte(kMinutecount), 60); + if (!flags.z()) + goto finishtime; + data.byte(kMinutecount) = 0; + _inc(data.byte(kHourcount)); + _cmp(data.byte(kHourcount), 24); + if (!flags.z()) + goto finishtime; + data.byte(kHourcount) = 0; +finishtime: + showtime(); +finishwatch: + data.byte(kWatchdump) = 1; +} + +void DreamGenContext::showtime() { + STACK_CHECK; + _cmp(data.byte(kWatchon), 0); + if (flags.z()) + return /* (nowatch) */; + al = data.byte(kSecondcount); + cl = 0; + twodigitnum(); + push(ax); + al = ah; + ah = 0; + _add(ax, 91*3+10); + ds = data.word(kCharset1); + di = 282+5; + bx = 21; + showframe(); + ax = pop(); + ah = 0; + _add(ax, 91*3+10); + ds = data.word(kCharset1); + di = 282+9; + bx = 21; + showframe(); + al = data.byte(kMinutecount); + cl = 0; + twodigitnum(); + push(ax); + al = ah; + ah = 0; + _add(ax, 91*3); + ds = data.word(kCharset1); + di = 270+5; + bx = 21; + showframe(); + ax = pop(); + ah = 0; + _add(ax, 91*3); + ds = data.word(kCharset1); + di = 270+11; + bx = 21; + showframe(); + al = data.byte(kHourcount); + cl = 0; + twodigitnum(); + push(ax); + al = ah; + ah = 0; + _add(ax, 91*3); + ds = data.word(kCharset1); + di = 256+5; + bx = 21; + showframe(); + ax = pop(); + ah = 0; + _add(ax, 91*3); + ds = data.word(kCharset1); + di = 256+11; + bx = 21; + showframe(); + ax = 91*3+20; + ds = data.word(kCharset1); + di = 267+5; + bx = 21; + showframe(); +} + +void DreamGenContext::dumpwatch() { + STACK_CHECK; + _cmp(data.byte(kWatchdump), 1); + if (!flags.z()) + return /* (nodumpwatch) */; + di = 256; + bx = 21; + cl = 40; + ch = 12; + multidump(); + data.byte(kWatchdump) = 0; +} + +void DreamGenContext::showbyte() { + STACK_CHECK; + dl = al; + _shr(dl, 1); + _shr(dl, 1); + _shr(dl, 1); + _shr(dl, 1); + onedigit(); + es.byte(di) = dl; + dl = al; + _and(dl, 15); + onedigit(); + es.byte(di+1) = dl; + _add(di, 3); +} + +void DreamGenContext::onedigit() { + STACK_CHECK; + _cmp(dl, 10); + if (!flags.c()) + goto morethan10; + _add(dl, '0'); + return; +morethan10: + _sub(dl, 10); + _add(dl, 'A'); +} + +void DreamGenContext::twodigitnum() { + STACK_CHECK; + ah = cl; + _dec(ah); +numloop1: + _inc(ah); + _sub(al, 10); + if (!flags.c()) + goto numloop1; + _add(al, 10); + _add(al, cl); +} + +void DreamGenContext::showword() { + STACK_CHECK; + ch = 0; + bx = 10000; + cl = 47; +word1: + _inc(cl); + _sub(ax, bx); + if (!flags.c()) + goto word1; + _add(ax, bx); + convnum(); + cs.byte(di) = cl; + bx = 1000; + cl = 47; +word2: + _inc(cl); + _sub(ax, bx); + if (!flags.c()) + goto word2; + _add(ax, bx); + convnum(); + cs.byte(di+1) = cl; + bx = 100; + cl = 47; +word3: + _inc(cl); + _sub(ax, bx); + if (!flags.c()) + goto word3; + _add(ax, bx); + convnum(); + cs.byte(di+2) = cl; + bx = 10; + cl = 47; +word4: + _inc(cl); + _sub(ax, bx); + if (!flags.c()) + goto word4; + _add(ax, bx); + convnum(); + cs.byte(di+3) = cl; + _add(al, 48); + cl = al; + convnum(); + cs.byte(di+4) = cl; +} + +void DreamGenContext::convnum() { + STACK_CHECK; + _cmp(ch, 0); + if (!flags.z()) + return /* (noconvnum) */; + _cmp(cl, '0'); + if (!flags.z()) + goto notzeronum; + cl = 32; + return /* (noconvnum) */; +notzeronum: + ch = 1; +} + +void DreamGenContext::walkandexamine() { + STACK_CHECK; + finishedwalking(); + if (!flags.z()) + return /* (noobselect) */; + al = data.byte(kWalkexamtype); + data.byte(kCommandtype) = al; + al = data.byte(kWalkexamnum); + data.byte(kCommand) = al; + data.byte(kWalkandexam) = 0; + _cmp(data.byte(kCommandtype), 5); + if (flags.z()) + return /* (noobselect) */; + examineob(); + return; +wantstowalk: + setwalk(); + data.byte(kReasseschanges) = 1; + return; +diff: + data.byte(kCommand) = al; + data.byte(kCommandtype) = ah; + _cmp(data.byte(kLinepointer), 254); + if (!flags.z()) + goto middleofwalk; + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + goto middleofwalk; + al = data.byte(kFacing); + _cmp(al, data.byte(kTurntoface)); + if (!flags.z()) + goto middleofwalk; + _cmp(data.byte(kCommandtype), 3); + if (!flags.z()) + goto notblock; + bl = data.byte(kManspath); + _cmp(bl, data.byte(kPointerspath)); + if (!flags.z()) + goto dontcheck; + cl = data.byte(kRyanx); + _add(cl, 12); + ch = data.byte(kRyany); + _add(ch, 12); + checkone(); + _cmp(cl, 2); + if (flags.c()) + goto isblock; +dontcheck: + getflagunderp(); + _cmp(data.byte(kLastflag), 2); + if (flags.c()) + goto isblock; + _cmp(data.byte(kLastflag), 128); + if (!flags.c()) + goto isblock; + goto toofaraway; +notblock: + bl = data.byte(kManspath); + _cmp(bl, data.byte(kPointerspath)); + if (!flags.z()) + goto toofaraway; + _cmp(data.byte(kCommandtype), 3); + if (flags.z()) + goto isblock; + _cmp(data.byte(kCommandtype), 5); + if (flags.z()) + goto isaperson; + examineobtext(); + return; +middleofwalk: + blocknametext(); + return; +isblock: + blocknametext(); + return; +isaperson: + personnametext(); + return; +toofaraway: + walktotext(); +} + +void DreamGenContext::mainscreen() { + STACK_CHECK; + data.byte(kInmaparea) = 0; + bx = 5122; + _cmp(data.byte(kWatchon), 1); + if (flags.z()) + goto checkmain; + bx = 5184; +checkmain: + checkcoords(); + _cmp(data.byte(kWalkandexam), 0); + if (flags.z()) + return /* (finishmain) */; + walkandexamine(); +} + +void DreamGenContext::madmanrun() { + STACK_CHECK; + _cmp(data.byte(kLocation), 14); + if (!flags.z()) + { identifyob(); return; }; + _cmp(data.byte(kMapx), 22); + if (!flags.z()) + { identifyob(); return; }; + _cmp(data.byte(kPointermode), 2); + if (!flags.z()) + { identifyob(); return; }; + _cmp(data.byte(kMadmanflag), 0); + if (!flags.z()) + { identifyob(); return; }; + _cmp(data.byte(kCommandtype), 211); + if (flags.z()) + goto alreadyrun; + data.byte(kCommandtype) = 211; + al = 52; + commandonly(); +alreadyrun: + _cmp(data.word(kMousebutton), 1); + if (!flags.z()) + return /* (norun) */; + ax = data.word(kMousebutton); + _cmp(ax, data.word(kOldbutton)); + if (flags.z()) + return /* (norun) */; + data.byte(kLastweapon) = 8; +} + +void DreamGenContext::checkcoords() { + STACK_CHECK; + _cmp(data.byte(kNewlocation), 255); + if (flags.z()) + goto loop048; + return; +loop048: + ax = cs.word(bx); + _cmp(ax, 0x0ffff); + if (flags.z()) + return /* (nonefound) */; + push(bx); + _cmp(data.word(kMousex), ax); + if (flags.l()) + goto over045; + ax = cs.word(bx+2); + _cmp(data.word(kMousex), ax); + if (!flags.l()) + goto over045; + ax = cs.word(bx+4); + _cmp(data.word(kMousey), ax); + if (flags.l()) + goto over045; + ax = cs.word(bx+6); + _cmp(data.word(kMousey), ax); + if (!flags.l()) + goto over045; + ax = cs.word(bx+8); + __dispatch_call(ax); + ax = pop(); + return; +over045: + bx = pop(); + _add(bx, 10); + goto loop048; +} + +void DreamGenContext::identifyob() { + STACK_CHECK; + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + { blank(); return; }; + ax = data.word(kMousex); + _sub(ax, data.word(kMapadx)); + _cmp(ax, 22*8); + if (flags.c()) + goto notover1; + blank(); + return; +notover1: + bx = data.word(kMousey); + _sub(bx, data.word(kMapady)); + _cmp(bx, 20*8); + if (flags.c()) + goto notover2; + blank(); + return; +notover2: + data.byte(kInmaparea) = 1; + ah = bl; + push(ax); + findpathofpoint(); + data.byte(kPointerspath) = dl; + ax = pop(); + push(ax); + findfirstpath(); + data.byte(kPointerfirstpath) = al; + ax = pop(); + checkifex(); + if (!flags.z()) + return /* (finishidentify) */; + checkiffree(); + if (!flags.z()) + return /* (finishidentify) */; + checkifperson(); + if (!flags.z()) + return /* (finishidentify) */; + checkifset(); + if (!flags.z()) + return /* (finishidentify) */; + ax = data.word(kMousex); + _sub(ax, data.word(kMapadx)); + cl = al; + ax = data.word(kMousey); + _sub(ax, data.word(kMapady)); + ch = al; + checkone(); + _cmp(al, 0); + if (flags.z()) + goto nothingund; + _cmp(data.byte(kMandead), 1); + if (flags.z()) + goto nothingund; + ah = 3; + obname(); + return; +nothingund: + blank(); +} + +void DreamGenContext::checkifperson() { + STACK_CHECK; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)); + cx = 12; +identifyreel: + push(cx); + _cmp(es.byte(bx+4), 255); + if (flags.z()) + goto notareelid; + push(es); + push(bx); + push(ax); + ax = es.word(bx+0); + data.word(kReelpointer) = ax; + getreelstart(); + _cmp(es.word(si+2), 0x0ffff); + if (!flags.z()) + goto notblankpers; + _add(si, 5); +notblankpers: + cx = es.word(si+2); + ax = es.word(si+0); + push(cx); + getreelframeax(); + cx = pop(); + _add(cl, es.byte(bx+4)); + _add(ch, es.byte(bx+5)); + dx = cx; + _add(dl, es.byte(bx+0)); + _add(dh, es.byte(bx+1)); + ax = pop(); + bx = pop(); + es = pop(); + _cmp(al, cl); + if (flags.c()) + goto notareelid; + _cmp(ah, ch); + if (flags.c()) + goto notareelid; + _cmp(al, dl); + if (!flags.c()) + goto notareelid; + _cmp(ah, dh); + if (!flags.c()) + goto notareelid; + cx = pop(); + ax = es.word(bx+2); + data.word(kPersondata) = ax; + al = es.byte(bx+4); + ah = 5; + obname(); + al = 0; + _cmp(al, 1); + return; +notareelid: + cx = pop(); + _add(bx, 5); + _dec(cx); + if (!flags.z()) + goto identifyreel; +} + +void DreamGenContext::checkifset() { + STACK_CHECK; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32))+(127*5); + cx = 127; +identifyset: + _cmp(es.byte(bx+4), 255); + if (flags.z()) + goto notasetid; + _cmp(al, es.byte(bx)); + if (flags.c()) + goto notasetid; + _cmp(al, es.byte(bx+2)); + if (!flags.c()) + goto notasetid; + _cmp(ah, es.byte(bx+1)); + if (flags.c()) + goto notasetid; + _cmp(ah, es.byte(bx+3)); + if (!flags.c()) + goto notasetid; + pixelcheckset(); + if (flags.z()) + goto notasetid; + isitdescribed(); + if (flags.z()) + goto notasetid; + al = es.byte(bx+4); + ah = 1; + obname(); + al = 0; + _cmp(al, 1); + return; +notasetid: + _sub(bx, 5); + _dec(cx); + _cmp(cx, -1); + if (!flags.z()) + goto identifyset; +} + +void DreamGenContext::checkifex() { + STACK_CHECK; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5))+(99*5); + cx = 99; +identifyex: + _cmp(es.byte(bx+4), 255); + if (flags.z()) + goto notanexid; + _cmp(al, es.byte(bx)); + if (flags.c()) + goto notanexid; + _cmp(al, es.byte(bx+2)); + if (!flags.c()) + goto notanexid; + _cmp(ah, es.byte(bx+1)); + if (flags.c()) + goto notanexid; + _cmp(ah, es.byte(bx+3)); + if (!flags.c()) + goto notanexid; + al = es.byte(bx+4); + ah = 4; + obname(); + al = 1; + _cmp(al, 0); + return; +notanexid: + _sub(bx, 5); + _dec(cx); + _cmp(cx, -1); + if (!flags.z()) + goto identifyex; +} + +void DreamGenContext::checkiffree() { + STACK_CHECK; + es = data.word(kBuffers); + bx = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5))+(79*5); + cx = 79; +identifyfree: + _cmp(es.byte(bx+4), 255); + if (flags.z()) + goto notafreeid; + _cmp(al, es.byte(bx)); + if (flags.c()) + goto notafreeid; + _cmp(al, es.byte(bx+2)); + if (!flags.c()) + goto notafreeid; + _cmp(ah, es.byte(bx+1)); + if (flags.c()) + goto notafreeid; + _cmp(ah, es.byte(bx+3)); + if (!flags.c()) + goto notafreeid; + al = es.byte(bx+4); + ah = 2; + obname(); + al = 0; + _cmp(al, 1); + return; +notafreeid: + _sub(bx, 5); + _dec(cx); + _cmp(cx, -1); + if (!flags.z()) + goto identifyfree; +} + +void DreamGenContext::isitdescribed() { + STACK_CHECK; + push(ax); + push(cx); + push(es); + push(bx); + al = es.byte(bx+4); + ah = 0; + _add(ax, ax); + bx = ax; + es = data.word(kSetdesc); + _add(bx, (0)); + ax = es.word(bx); + _add(ax, (0+(130*2))); + bx = ax; + dl = es.byte(bx); + bx = pop(); + es = pop(); + cx = pop(); + ax = pop(); + _cmp(dl, 0); +} + +void DreamGenContext::findpathofpoint() { + STACK_CHECK; + push(ax); + bx = (0); + es = data.word(kReels); + al = data.byte(kRoomnum); + ah = 0; + cx = 144; + _mul(cx); + _add(bx, ax); + cx = pop(); + dl = 0; +pathloop: + al = es.byte(bx+6); + _cmp(al, 255); + if (!flags.z()) + goto flunkedit; + ax = es.word(bx+2); + _cmp(ax, 0x0ffff); + if (flags.z()) + goto flunkedit; + _cmp(cl, al); + if (flags.c()) + goto flunkedit; + _cmp(ch, ah); + if (flags.c()) + goto flunkedit; + ax = es.word(bx+4); + _cmp(cl, al); + if (!flags.c()) + goto flunkedit; + _cmp(ch, ah); + if (!flags.c()) + goto flunkedit; + return /* (gotvalidpath) */; +flunkedit: + _add(bx, 8); + _inc(dl); + _cmp(dl, 12); + if (!flags.z()) + goto pathloop; + dl = 255; +} + +void DreamGenContext::findfirstpath() { + STACK_CHECK; + push(ax); + bx = (0); + es = data.word(kReels); + al = data.byte(kRoomnum); + ah = 0; + cx = 144; + _mul(cx); + _add(bx, ax); + cx = pop(); + dl = 0; +fpathloop: + ax = es.word(bx+2); + _cmp(ax, 0x0ffff); + if (flags.z()) + goto nofirst; + _cmp(cl, al); + if (flags.c()) + goto nofirst; + _cmp(ch, ah); + if (flags.c()) + goto nofirst; + ax = es.word(bx+4); + _cmp(cl, al); + if (!flags.c()) + goto nofirst; + _cmp(ch, ah); + if (!flags.c()) + goto nofirst; + goto gotfirst; +nofirst: + _add(bx, 8); + _inc(dl); + _cmp(dl, 12); + if (!flags.z()) + goto fpathloop; + al = 0; + return; +gotfirst: + al = es.byte(bx+6); +} + +void DreamGenContext::turnpathon() { + STACK_CHECK; + push(ax); + push(ax); + cl = 255; + ch = data.byte(kRoomnum); + _add(ch, 100); + findormake(); + ax = pop(); + getroomspaths(); + ax = pop(); + _cmp(al, 255); + if (flags.z()) + return /* (nopathon) */; + ah = 0; + _add(ax, ax); + _add(ax, ax); + _add(ax, ax); + _add(bx, ax); + al = 255; + es.byte(bx+6) = al; +} + +void DreamGenContext::turnpathoff() { + STACK_CHECK; + push(ax); + push(ax); + cl = 0; + ch = data.byte(kRoomnum); + _add(ch, 100); + findormake(); + ax = pop(); + getroomspaths(); + ax = pop(); + _cmp(al, 255); + if (flags.z()) + return /* (nopathoff) */; + ah = 0; + _add(ax, ax); + _add(ax, ax); + _add(ax, ax); + _add(bx, ax); + al = 0; + es.byte(bx+6) = al; +} + +void DreamGenContext::turnanypathon() { + STACK_CHECK; + push(ax); + push(ax); + cl = 255; + ch = ah; + _add(ch, 100); + findormake(); + ax = pop(); + al = ah; + ah = 0; + cx = 144; + _mul(cx); + es = data.word(kReels); + bx = (0); + _add(bx, ax); + ax = pop(); + ah = 0; + _add(ax, ax); + _add(ax, ax); + _add(ax, ax); + _add(bx, ax); + al = 255; + es.byte(bx+6) = al; +} + +void DreamGenContext::turnanypathoff() { + STACK_CHECK; + push(ax); + push(ax); + cl = 0; + ch = ah; + _add(ch, 100); + findormake(); + ax = pop(); + al = ah; + ah = 0; + cx = 144; + _mul(cx); + es = data.word(kReels); + bx = (0); + _add(bx, ax); + ax = pop(); + ah = 0; + _add(ax, ax); + _add(ax, ax); + _add(ax, ax); + _add(bx, ax); + al = 0; + es.byte(bx+6) = al; +} + +void DreamGenContext::checkifpathison() { + STACK_CHECK; + push(ax); + getroomspaths(); + ax = pop(); + ah = 0; + _add(ax, ax); + _add(ax, ax); + _add(ax, ax); + _add(bx, ax); + al = es.byte(bx+6); + _cmp(al, 255); +} + +void DreamGenContext::afternewroom() { + STACK_CHECK; + _cmp(data.byte(kNowinnewroom), 0); + if (flags.z()) + return /* (notnew) */; + data.word(kTimecount) = 0; + createpanel(); + data.byte(kCommandtype) = 0; + findroominloc(); + _cmp(data.byte(kRyanon), 1); + if (flags.z()) + goto ryansoff; + al = data.byte(kRyanx); + _add(al, 12); + ah = data.byte(kRyany); + _add(ah, 12); + findpathofpoint(); + data.byte(kManspath) = dl; + findxyfrompath(); + data.byte(kResetmanxy) = 1; +ryansoff: + data.byte(kNewobs) = 1; + drawfloor(); + data.word(kLookcounter) = 160; + data.byte(kNowinnewroom) = 0; + showicon(); + spriteupdate(); + printsprites(); + undertextline(); + reelsonscreen(); + mainscreen(); + getunderzoom(); + zoom(); + worktoscreenm(); + walkintoroom(); + reminders(); + atmospheres(); +} + +void DreamGenContext::atmospheres() { + STACK_CHECK; + cl = data.byte(kMapx); + ch = data.byte(kMapy); + bx = 5246; +nextatmos: + al = cs.byte(bx); + _cmp(al, 255); + if (flags.z()) + goto nomoreatmos; + _cmp(al, data.byte(kReallocation)); + if (!flags.z()) + goto wrongatmos; + ax = cs.word(bx+1); + _cmp(ax, cx); + if (!flags.z()) + goto wrongatmos; + ax = cs.word(bx+3); + _cmp(al, data.byte(kCh0playing)); + if (flags.z()) + goto playingalready; + _cmp(data.byte(kLocation), 45); + if (!flags.z()) + goto notweb; + _cmp(data.word(kReeltowatch), 45); + if (flags.z()) + goto wrongatmos; +notweb: + playchannel0(); + _cmp(data.byte(kReallocation), 2); + _cmp(data.byte(kMapy), 0); + if (flags.z()) + goto fullvol; + if (!flags.z()) + goto notlouisvol; + _cmp(data.byte(kMapy), 10); + if (!flags.z()) + goto notlouisvol; + _cmp(data.byte(kMapx), 22); + if (!flags.z()) + goto notlouisvol; + data.byte(kVolume) = 5; +notlouisvol: + _cmp(data.byte(kReallocation), 14); + if (!flags.z()) + goto notmad1; + _cmp(data.byte(kMapx), 33); + if (flags.z()) + goto ismad2; + _cmp(data.byte(kMapx), 22); + if (!flags.z()) + goto notmad1; + data.byte(kVolume) = 5; + return; +ismad2: + data.byte(kVolume) = 0; + return; +notmad1: +playingalready: + _cmp(data.byte(kReallocation), 2); + if (!flags.z()) + return /* (notlouisvol2) */; + _cmp(data.byte(kMapx), 22); + if (flags.z()) + goto louisvol; + _cmp(data.byte(kMapx), 11); + if (!flags.z()) + return /* (notlouisvol2) */; +fullvol: + data.byte(kVolume) = 0; + return; +louisvol: + data.byte(kVolume) = 5; + return; +wrongatmos: + _add(bx, 5); + goto nextatmos; +nomoreatmos: + cancelch0(); +} + +void DreamGenContext::walkintoroom() { + STACK_CHECK; + _cmp(data.byte(kLocation), 14); + if (!flags.z()) + return /* (notlair) */; + _cmp(data.byte(kMapx), 22); + if (!flags.z()) + return /* (notlair) */; + data.byte(kDestination) = 1; + data.byte(kFinaldest) = 1; + autosetwalk(); +} + +void DreamGenContext::afterintroroom() { + STACK_CHECK; + _cmp(data.byte(kNowinnewroom), 0); + if (flags.z()) + return /* (notnewintro) */; + clearwork(); + findroominloc(); + data.byte(kNewobs) = 1; + drawfloor(); + reelsonscreen(); + spriteupdate(); + printsprites(); + worktoscreen(); + data.byte(kNowinnewroom) = 0; +} + +void DreamGenContext::obname() { + STACK_CHECK; + _cmp(data.byte(kReasseschanges), 0); + if (flags.z()) + goto notnewpath; + data.byte(kReasseschanges) = 0; + goto diff; +notnewpath: + _cmp(ah, data.byte(kCommandtype)); + if (flags.z()) + goto notdiffob; + goto diff; +notdiffob: + _cmp(al, data.byte(kCommand)); + if (!flags.z()) + goto diff; + _cmp(data.byte(kWalkandexam), 1); + if (flags.z()) + goto walkandexamine; + _cmp(data.word(kMousebutton), 0); + if (flags.z()) + return /* (noobselect) */; + _cmp(data.byte(kCommandtype), 3); + if (!flags.z()) + goto isntblock; + _cmp(data.byte(kLastflag), 2); + if (flags.c()) + return /* (noobselect) */; +isntblock: + bl = data.byte(kManspath); + _cmp(bl, data.byte(kPointerspath)); + if (!flags.z()) + goto wantstowalk; + _cmp(data.byte(kCommandtype), 3); + if (flags.z()) + goto wantstowalk; + finishedwalking(); + if (!flags.z()) + return /* (noobselect) */; + _cmp(data.byte(kCommandtype), 5); + if (flags.z()) + goto wantstotalk; + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + return /* (noobselect) */; + examineob(); + return; +wantstotalk: + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + return /* (noobselect) */; + talk(); + return; +walkandexamine: + finishedwalking(); + if (!flags.z()) + return /* (noobselect) */; + al = data.byte(kWalkexamtype); + data.byte(kCommandtype) = al; + al = data.byte(kWalkexamnum); + data.byte(kCommand) = al; + data.byte(kWalkandexam) = 0; + _cmp(data.byte(kCommandtype), 5); + if (flags.z()) + return /* (noobselect) */; + examineob(); + return; +wantstowalk: + setwalk(); + data.byte(kReasseschanges) = 1; + return; +diff: + data.byte(kCommand) = al; + data.byte(kCommandtype) = ah; + _cmp(data.byte(kLinepointer), 254); + if (!flags.z()) + goto middleofwalk; + _cmp(data.word(kWatchingtime), 0); + if (!flags.z()) + goto middleofwalk; + al = data.byte(kFacing); + _cmp(al, data.byte(kTurntoface)); + if (!flags.z()) + goto middleofwalk; + _cmp(data.byte(kCommandtype), 3); + if (!flags.z()) + goto notblock; + bl = data.byte(kManspath); + _cmp(bl, data.byte(kPointerspath)); + if (!flags.z()) + goto dontcheck; + cl = data.byte(kRyanx); + _add(cl, 12); + ch = data.byte(kRyany); + _add(ch, 12); + checkone(); + _cmp(cl, 2); + if (flags.c()) + goto isblock; +dontcheck: + getflagunderp(); + _cmp(data.byte(kLastflag), 2); + if (flags.c()) + goto isblock; + _cmp(data.byte(kLastflag), 128); + if (!flags.c()) + goto isblock; + goto toofaraway; +notblock: + bl = data.byte(kManspath); + _cmp(bl, data.byte(kPointerspath)); + if (!flags.z()) + goto toofaraway; + _cmp(data.byte(kCommandtype), 3); + if (flags.z()) + goto isblock; + _cmp(data.byte(kCommandtype), 5); + if (flags.z()) + goto isaperson; + examineobtext(); + return; +middleofwalk: + blocknametext(); + return; +isblock: + blocknametext(); + return; +isaperson: + personnametext(); + return; +toofaraway: + walktotext(); +} + +void DreamGenContext::finishedwalking() { + STACK_CHECK; + _cmp(data.byte(kLinepointer), 254); + if (!flags.z()) + return /* (iswalking) */; + al = data.byte(kFacing); + _cmp(al, data.byte(kTurntoface)); +} + +void DreamGenContext::examineobtext() { + STACK_CHECK; + bl = data.byte(kCommand); + bh = data.byte(kCommandtype); + al = 1; + commandwithob(); +} + +void DreamGenContext::commandwithob() { + STACK_CHECK; + push(ax); + push(ax); + push(bx); + push(cx); + push(dx); + push(es); + push(ds); + push(si); + push(di); + deltextline(); + di = pop(); + si = pop(); + ds = pop(); + es = pop(); + dx = pop(); + cx = pop(); + bx = pop(); + ax = pop(); + push(bx); + ah = 0; + _add(ax, ax); + bx = ax; + es = data.word(kCommandtext); + ax = es.word(bx); + _add(ax, (66*2)); + si = ax; + di = data.word(kTextaddressx); + bx = data.word(kTextaddressy); + dl = data.byte(kTextlen); + al = 0; + ah = 0; + printdirect(); + ax = pop(); + di = 5847; + copyname(); + ax = pop(); + di = data.word(kLastxpos); + _cmp(al, 0); + if (flags.z()) + goto noadd; + _add(di, 5); +noadd: + bx = data.word(kTextaddressy); + es = cs; + si = 5847; + dl = data.byte(kTextlen); + al = 0; + ah = 0; + printdirect(); + data.byte(kNewtextline) = 1; +} + +void DreamGenContext::commandonly() { + STACK_CHECK; + push(ax); + push(bx); + push(cx); + push(dx); + push(es); + push(ds); + push(si); + push(di); + deltextline(); + di = pop(); + si = pop(); + ds = pop(); + es = pop(); + dx = pop(); + cx = pop(); + bx = pop(); + ax = pop(); + ah = 0; + _add(ax, ax); + bx = ax; + es = data.word(kCommandtext); + ax = es.word(bx); + _add(ax, (66*2)); + si = ax; + di = data.word(kTextaddressx); + bx = data.word(kTextaddressy); + dl = data.byte(kTextlen); + al = 0; + ah = 0; + printdirect(); + data.byte(kNewtextline) = 1; +} + +void DreamGenContext::printmessage() { + STACK_CHECK; + push(dx); + push(bx); + push(di); + ah = 0; + _add(ax, ax); + bx = ax; + es = data.word(kCommandtext); + ax = es.word(bx); + _add(ax, (66*2)); + si = ax; + di = pop(); + bx = pop(); + dx = pop(); + al = 0; + ah = 0; + printdirect(); +} + +void DreamGenContext::printmessage2() { + STACK_CHECK; + push(dx); + push(bx); + push(di); + push(ax); + ah = 0; + _add(ax, ax); + bx = ax; + es = data.word(kCommandtext); + ax = es.word(bx); + _add(ax, (66*2)); + si = ax; + ax = pop(); +searchmess: + push(ax); + findnextcolon(); + ax = pop(); + _dec(ah); + if (!flags.z()) + goto searchmess; + di = pop(); + bx = pop(); + dx = pop(); + al = 0; + ah = 0; + printdirect(); +} + +void DreamGenContext::blocknametext() { + STACK_CHECK; + bl = data.byte(kCommand); + bh = data.byte(kCommandtype); + al = 0; + commandwithob(); +} + +void DreamGenContext::personnametext() { + STACK_CHECK; + bl = data.byte(kCommand); + _and(bl, 127); + bh = data.byte(kCommandtype); + al = 2; + commandwithob(); +} + +void DreamGenContext::walktotext() { + STACK_CHECK; + bl = data.byte(kCommand); + bh = data.byte(kCommandtype); + al = 3; + commandwithob(); +} + +void DreamGenContext::getflagunderp() { + STACK_CHECK; + cx = data.word(kMousex); + _sub(cx, data.word(kMapadx)); + ax = data.word(kMousey); + _sub(ax, data.word(kMapady)); + ch = al; + checkone(); + data.byte(kLastflag) = cl; + data.byte(kLastflagex) = ch; +} + +void DreamGenContext::setwalk() { + STACK_CHECK; + _cmp(data.byte(kLinepointer), 254); + if (!flags.z()) + goto alreadywalking; + al = data.byte(kPointerspath); + _cmp(al, data.byte(kManspath)); + if (flags.z()) + goto cantwalk2; + _cmp(data.byte(kWatchmode), 1); + if (flags.z()) + goto holdingreel; + _cmp(data.byte(kWatchmode), 2); + if (flags.z()) + return /* (cantwalk) */; + data.byte(kDestination) = al; + data.byte(kFinaldest) = al; + _cmp(data.word(kMousebutton), 2); + if (!flags.z()) + goto notwalkandexam; + _cmp(data.byte(kCommandtype), 3); + if (flags.z()) + goto notwalkandexam; + data.byte(kWalkandexam) = 1; + al = data.byte(kCommandtype); + data.byte(kWalkexamtype) = al; + al = data.byte(kCommand); + data.byte(kWalkexamnum) = al; +notwalkandexam: + autosetwalk(); + return; +cantwalk2: + facerightway(); + return; +alreadywalking: + al = data.byte(kPointerspath); + data.byte(kFinaldest) = al; + return; +holdingreel: + data.byte(kDestafterhold) = al; + data.byte(kWatchmode) = 2; +} + +void DreamGenContext::autosetwalk() { + STACK_CHECK; + al = data.byte(kManspath); + _cmp(data.byte(kFinaldest), al); + if (!flags.z()) + goto notsamealready; + return; +notsamealready: + getroomspaths(); + checkdest(); + push(bx); + al = data.byte(kManspath); + ah = 0; + _add(ax, ax); + _add(ax, ax); + _add(ax, ax); + _add(bx, ax); + al = es.byte(bx); + ah = 0; + _sub(ax, 12); + data.word(kLinestartx) = ax; + al = es.byte(bx+1); + ah = 0; + _sub(ax, 12); + data.word(kLinestarty) = ax; + bx = pop(); + al = data.byte(kDestination); + ah = 0; + _add(ax, ax); + _add(ax, ax); + _add(ax, ax); + _add(bx, ax); + al = es.byte(bx); + ah = 0; + _sub(ax, 12); + data.word(kLineendx) = ax; + al = es.byte(bx+1); + ah = 0; + _sub(ax, 12); + data.word(kLineendy) = ax; + bresenhams(); + _cmp(data.byte(kLinedirection), 0); + if (flags.z()) + goto normalline; + al = data.byte(kLinelength); + _dec(al); + data.byte(kLinepointer) = al; + data.byte(kLinedirection) = 1; + return; +normalline: + data.byte(kLinepointer) = 0; +} + +void DreamGenContext::checkdest() { + STACK_CHECK; + push(bx); + _add(bx, 12*8); + ah = data.byte(kManspath); + cl = 4; + _shl(ah, cl); + al = data.byte(kDestination); + cl = 24; + ch = data.byte(kDestination); +checkdestloop: + dh = es.byte(bx); + _and(dh, 0xf0); + dl = es.byte(bx); + _and(dl, 0xf); + _cmp(ax, dx); + if (!flags.z()) + goto nextcheck; + al = es.byte(bx+1); + _and(al, 15); + data.byte(kDestination) = al; + bx = pop(); + return; +nextcheck: + dl = es.byte(bx); + _and(dl, 0xf0); + _shr(dl, 1); + _shr(dl, 1); + _shr(dl, 1); + _shr(dl, 1); + dh = es.byte(bx); + _and(dh, 0xf); + _shl(dh, 1); + _shl(dh, 1); + _shl(dh, 1); + _shl(dh, 1); + _cmp(ax, dx); + if (!flags.z()) + goto nextcheck2; + ch = es.byte(bx+1); + _and(ch, 15); +nextcheck2: + _add(bx, 2); + _dec(cl); + if (!flags.z()) + goto checkdestloop; + data.byte(kDestination) = ch; + bx = pop(); +} + +void DreamGenContext::bresenhams() { + STACK_CHECK; + workoutframes(); + dx = data; + es = dx; + di = 8173; + si = 1; + data.byte(kLinedirection) = 0; + cx = data.word(kLineendx); + _sub(cx, data.word(kLinestartx)); + if (flags.z()) + goto vertline; + if (!flags.s()) + goto line1; + _neg(cx); + bx = data.word(kLineendx); + _xchg(bx, data.word(kLinestartx)); + data.word(kLineendx) = bx; + bx = data.word(kLineendy); + _xchg(bx, data.word(kLinestarty)); + data.word(kLineendy) = bx; + data.byte(kLinedirection) = 1; +line1: + bx = data.word(kLineendy); + _sub(bx, data.word(kLinestarty)); + if (flags.z()) + goto horizline; + if (!flags.s()) + goto line3; + _neg(bx); + _neg(si); +line3: + push(si); + data.byte(kLineroutine) = 0; + _cmp(bx, cx); + if (flags.le()) + goto line4; + data.byte(kLineroutine) = 1; + _xchg(bx, cx); +line4: + _shl(bx, 1); + data.word(kIncrement1) = bx; + _sub(bx, cx); + si = bx; + _sub(bx, cx); + data.word(kIncrement2) = bx; + ax = data.word(kLinestartx); + bx = data.word(kLinestarty); + ah = bl; + _inc(cx); + bx = pop(); + _cmp(data.byte(kLineroutine), 1); + if (flags.z()) + goto hislope; + goto loslope; +vertline: + ax = data.word(kLinestarty); + bx = data.word(kLineendy); + cx = bx; + _sub(cx, ax); + if (!flags.l()) + goto line31; + _neg(cx); + ax = bx; + data.byte(kLinedirection) = 1; +line31: + _inc(cx); + bx = data.word(kLinestartx); + _xchg(ax, bx); + ah = bl; + bx = si; +line32: + _stosw(); + _add(ah, bl); + if (--cx) + goto line32; + goto lineexit; +horizline: + ax = data.word(kLinestartx); + bx = data.word(kLinestarty); + ah = bl; + _inc(cx); +horizloop: + _stosw(); + _inc(al); + if (--cx) + goto horizloop; + goto lineexit; +loslope: +loloop: + _stosw(); + _inc(al); + _or(si, si); + if (!flags.s()) + goto line12; + _add(si, data.word(kIncrement1)); + if (--cx) + goto loloop; + goto lineexit; +line12: + _add(si, data.word(kIncrement2)); + _add(ah, bl); + if (--cx) + goto loloop; + goto lineexit; +hislope: +hiloop: + _stosw(); + _add(ah, bl); + _or(si, si); + if (!flags.s()) + goto line23; + _add(si, data.word(kIncrement1)); + if (--cx) + goto hiloop; + goto lineexit; +line23: + _add(si, data.word(kIncrement2)); + _inc(al); + if (--cx) + goto hiloop; +lineexit: + _sub(di, 8173); + ax = di; + _shr(ax, 1); + data.byte(kLinelength) = al; +} + +void DreamGenContext::workoutframes() { + STACK_CHECK; + bx = data.word(kLinestartx); + _add(bx, 32); + ax = data.word(kLineendx); + _add(ax, 32); + _sub(bx, ax); + if (!flags.c()) + goto notneg1; + _neg(bx); +notneg1: + cx = data.word(kLinestarty); + _add(cx, 32); + ax = data.word(kLineendy); + _add(ax, 32); + _sub(cx, ax); + if (!flags.c()) + goto notneg2; + _neg(cx); +notneg2: + _cmp(bx, cx); + if (!flags.c()) + goto tendstohoriz; + dl = 2; + ax = cx; + _shr(ax, 1); + _cmp(bx, ax); + if (flags.c()) + goto gotquad; + dl = 1; + goto gotquad; +tendstohoriz: + dl = 0; + ax = bx; + _shr(ax, 1); + _cmp(cx, ax); + if (flags.c()) + goto gotquad; + dl = 1; + goto gotquad; +gotquad: + bx = data.word(kLinestartx); + _add(bx, 32); + ax = data.word(kLineendx); + _add(ax, 32); + _sub(bx, ax); + if (flags.c()) + goto isinright; + cx = data.word(kLinestarty); + _add(cx, 32); + ax = data.word(kLineendy); + _add(ax, 32); + _sub(cx, ax); + if (!flags.c()) + goto topleft; + _cmp(dl, 1); + if (flags.z()) + goto noswap1; + _xor(dl, 2); +noswap1: + _add(dl, 4); + goto success; +topleft: + _add(dl, 6); + goto success; +isinright: + cx = data.word(kLinestarty); + _add(cx, 32); + ax = data.word(kLineendy); + _add(ax, 32); + _sub(cx, ax); + if (!flags.c()) + goto botright; + _add(dl, 2); + goto success; +botright: + _cmp(dl, 1); + if (flags.z()) + goto noswap2; + _xor(dl, 2); +noswap2: +success: + _and(dl, 7); + data.byte(kTurntoface) = dl; + data.byte(kTurndirection) = 0; +} + +void DreamGenContext::getroomspaths() { + STACK_CHECK; + al = data.byte(kRoomnum); + ah = 0; + cx = 144; + _mul(cx); + es = data.word(kReels); + bx = (0); + _add(bx, ax); +} + +void DreamGenContext::copyname() { + STACK_CHECK; + push(di); + findobname(); + di = pop(); + es = cs; + cx = 28; +make: + _lodsb(); + _cmp(al, ':'); + if (flags.z()) + goto finishmakename; + _cmp(al, 0); + if (flags.z()) + goto finishmakename; + _stosb(); + if (--cx) + goto make; +finishmakename: + _inc(cx); + al = 0; + _stosb(); + return; + al = 255; + _stosb(cx, true); +} + +void DreamGenContext::findobname() { + STACK_CHECK; + push(ax); + ah = 0; + _add(ax, ax); + bx = ax; + ax = pop(); + _cmp(ah, 5); + if (!flags.z()) + goto notpersonname; + push(ax); + _and(al, 127); + ah = 0; + bx = 64*2; + _mul(bx); + si = ax; + ds = data.word(kPeople); + _add(si, (0+24)); + cx = (0+24+(1026*2)); + ax = ds.word(si); + _add(ax, cx); + si = ax; + ax = pop(); + return; +notpersonname: + _cmp(ah, 4); + if (!flags.z()) + goto notextraname; + ds = data.word(kExtras); + _add(bx, (0+2080+30000+(16*114))); + ax = ds.word(bx); + _add(ax, (0+2080+30000+(16*114)+((114+2)*2))); + si = ax; + return; +notextraname: + _cmp(ah, 2); + if (!flags.z()) + goto notfreename; + ds = data.word(kFreedesc); + _add(bx, (0)); + ax = ds.word(bx); + _add(ax, (0+(82*2))); + si = ax; + return; +notfreename: + _cmp(ah, 1); + if (!flags.z()) + goto notsetname; + ds = data.word(kSetdesc); + _add(bx, (0)); + ax = ds.word(bx); + _add(ax, (0+(130*2))); + si = ax; + return; +notsetname: + ds = data.word(kBlockdesc); + _add(bx, (0)); + ax = ds.word(bx); + _add(ax, (0+(98*2))); + si = ax; +} + +void DreamGenContext::showicon() { + STACK_CHECK; + _cmp(data.byte(kReallocation), 50); + if (!flags.c()) + goto isdream1; + showpanel(); + showman(); + roomname(); + panelicons1(); + zoomicon(); + return; +isdream1: + ds = data.word(kTempsprites); + di = 72; + bx = 2; + al = 45; + ah = 0; + showframe(); + ds = data.word(kTempsprites); + di = 72+47; + bx = 2; + al = 46; + ah = 0; + showframe(); + ds = data.word(kTempsprites); + di = 69-10; + bx = 21; + al = 49; + ah = 0; + showframe(); + ds = data.word(kTempsprites); + di = 160+88; + bx = 2; + al = 45; + ah = 4; + showframe(); + ds = data.word(kTempsprites); + di = 160+43; + bx = 2; + al = 46; + ah = 4; + showframe(); + ds = data.word(kTempsprites); + di = 160+101; + bx = 21; + al = 49; + ah = 4; + showframe(); + middlepanel(); +} + +void DreamGenContext::middlepanel() { + STACK_CHECK; + ds = data.word(kTempsprites); + di = 72+47+20; + bx = 0; + al = 48; + ah = 0; + showframe(); + ds = data.word(kTempsprites); + di = 72+19; + bx = 21; + al = 47; + ah = 0; + showframe(); + ds = data.word(kTempsprites); + di = 160+23; + bx = 0; + al = 48; + ah = 4; + showframe(); + ds = data.word(kTempsprites); + di = 160+71; + bx = 21; + al = 47; + ah = 4; + showframe(); +} + +void DreamGenContext::showman() { + STACK_CHECK; + ds = data.word(kIcons1); + di = 0; + bx = 0; + al = 0; + ah = 0; + showframe(); + ds = data.word(kIcons1); + di = 0; + bx = 114; + al = 1; + ah = 0; + showframe(); + _cmp(data.byte(kShadeson), 0); + if (flags.z()) + return /* (notverycool) */; + ds = data.word(kIcons1); + di = 28; + bx = 25; + al = 2; + ah = 0; + showframe(); +} + +void DreamGenContext::showpanel() { + STACK_CHECK; + ds = data.word(kIcons1); + di = 72; + bx = 0; + al = 19; + ah = 0; + showframe(); + ds = data.word(kIcons1); + di = 192; + bx = 0; + al = 19; + ah = 0; + showframe(); +} + +void DreamGenContext::roomname() { + STACK_CHECK; + di = 88; + bx = 18; + al = 53; + dl = 240; + printmessage(); + bl = data.byte(kRoomnum); + _cmp(bl, 32); + if (flags.c()) + goto notover32; + _sub(bl, 32); +notover32: + bh = 0; + _add(bx, bx); + es = data.word(kRoomdesc); + _add(bx, (0)); + ax = es.word(bx); + _add(ax, (0+(38*2))); + si = ax; + data.word(kLinespacing) = 7; + di = 88; + bx = 25; + dl = 120; + _cmp(data.byte(kWatchon), 1); + if (flags.z()) + goto gotpl; + dl = 160; +gotpl: + al = 0; + ah = 0; + printdirect(); + data.word(kLinespacing) = 10; + usecharset1(); +} + +void DreamGenContext::usecharset1() { + STACK_CHECK; + ax = data.word(kCharset1); + data.word(kCurrentset) = ax; +} + +void DreamGenContext::usetempcharset() { + STACK_CHECK; + ax = data.word(kTempcharset); + data.word(kCurrentset) = ax; +} + +void DreamGenContext::showexit() { + STACK_CHECK; + ds = data.word(kIcons1); + di = 274; + bx = 154; + al = 11; + ah = 0; + showframe(); +} + +void DreamGenContext::panelicons1() { + STACK_CHECK; + di = 0; + _cmp(data.byte(kWatchon), 1); + if (flags.z()) + goto watchison; + di = 48; +watchison: + push(di); + ds = data.word(kIcons2); + _add(di, 204); + bx = 4; + al = 2; + ah = 0; + showframe(); + di = pop(); + push(di); + _cmp(data.byte(kZoomon), 1); + if (flags.z()) + goto zoomisoff; + ds = data.word(kIcons1); + _add(di, 228); + bx = 8; + al = 5; + ah = 0; + showframe(); +zoomisoff: + di = pop(); + showwatch(); +} + +void DreamGenContext::showwatch() { + STACK_CHECK; + _cmp(data.byte(kWatchon), 0); + if (flags.z()) + return /* (nowristwatch) */; + ds = data.word(kIcons1); + di = 250; + bx = 1; + al = 6; + ah = 0; + showframe(); + showtime(); +} + +void DreamGenContext::zoomicon() { + STACK_CHECK; + _cmp(data.byte(kZoomon), 0); + if (flags.z()) + return /* (nozoom1) */; + ds = data.word(kIcons1); + di = (8); + bx = (132)-1; + al = 8; + ah = 0; + showframe(); +} + +void DreamGenContext::showblink() { + STACK_CHECK; + _cmp(data.byte(kManisoffscreen), 1); + if (flags.z()) + return /* (finblink1) */; + _inc(data.byte(kBlinkcount)); + _cmp(data.byte(kShadeson), 0); + if (!flags.z()) + return /* (finblink1) */; + _cmp(data.byte(kReallocation), 50); + if (!flags.c()) + return /* (eyesshut) */; + al = data.byte(kBlinkcount); + _cmp(al, 3); + if (!flags.z()) + return /* (finblink1) */; + data.byte(kBlinkcount) = 0; + al = data.byte(kBlinkframe); + _inc(al); + data.byte(kBlinkframe) = al; + _cmp(al, 6); + if (flags.c()) + goto nomorethan6; + al = 6; +nomorethan6: + ah = 0; + bx = 5888; + _add(bx, ax); + al = cs.byte(bx); + ds = data.word(kIcons1); + di = 44; + bx = 32; + ah = 0; + showframe(); +} + +void DreamGenContext::dumpblink() { + STACK_CHECK; + _cmp(data.byte(kShadeson), 0); + if (!flags.z()) + return /* (nodumpeye) */; + _cmp(data.byte(kBlinkcount), 0); + if (!flags.z()) + return /* (nodumpeye) */; + al = data.byte(kBlinkframe); + _cmp(al, 6); + if (!flags.c()) + return /* (nodumpeye) */; + push(ds); + di = 44; + bx = 32; + cl = 16; + ch = 12; + multidump(); + ds = pop(); +} + +void DreamGenContext::worktoscreenm() { + STACK_CHECK; + animpointer(); + readmouse(); + showpointer(); + vsync(); + worktoscreen(); + delpointer(); +} + +void DreamGenContext::blank() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 199); + if (flags.z()) + return /* (alreadyblnk) */; + data.byte(kCommandtype) = 199; + al = 0; + commandonly(); +} + +void DreamGenContext::allpointer() { + STACK_CHECK; + readmouse(); + showpointer(); + dumppointer(); +} + +void DreamGenContext::hangonp() { + STACK_CHECK; + push(cx); + _add(cx, cx); + ax = pop(); + _add(cx, ax); + data.word(kMaintimer) = 0; + al = data.byte(kPointerframe); + ah = data.byte(kPickup); + push(ax); + data.byte(kPointermode) = 3; + data.byte(kPickup) = 0; + push(cx); + data.byte(kCommandtype) = 255; + readmouse(); + animpointer(); + showpointer(); + vsync(); + dumppointer(); + cx = pop(); +hangloop: + push(cx); + delpointer(); + readmouse(); + animpointer(); + showpointer(); + vsync(); + dumppointer(); + cx = pop(); + ax = data.word(kMousebutton); + _cmp(ax, 0); + if (flags.z()) + goto notpressed; + _cmp(ax, data.word(kOldbutton)); + if (!flags.z()) + goto getoutofit; +notpressed: + if (--cx) + goto hangloop; +getoutofit: + delpointer(); + ax = pop(); + data.byte(kPointerframe) = al; + data.byte(kPickup) = ah; + data.byte(kPointermode) = 0; +} + +void DreamGenContext::hangonw() { + STACK_CHECK; +hangloopw: + push(cx); + delpointer(); + readmouse(); + animpointer(); + showpointer(); + vsync(); + dumppointer(); + cx = pop(); + if (--cx) + goto hangloopw; +} + +void DreamGenContext::hangoncurs() { + STACK_CHECK; +monloop1: + push(cx); + printcurs(); + vsync(); + delcurs(); + cx = pop(); + if (--cx) + goto monloop1; +} + +void DreamGenContext::getunderzoom() { + STACK_CHECK; + di = (8)+5; + bx = (132)+4; + ds = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)); + cl = 46; + ch = 40; + multiget(); +} + +void DreamGenContext::dumpzoom() { + STACK_CHECK; + _cmp(data.byte(kZoomon), 1); + if (!flags.z()) + return /* (notzoomon) */; + di = (8)+5; + bx = (132)+4; + cl = 46; + ch = 40; + multidump(); +} + +void DreamGenContext::putunderzoom() { + STACK_CHECK; + di = (8)+5; + bx = (132)+4; + ds = data.word(kBuffers); + si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)); + cl = 46; + ch = 40; + multiput(); +} + +void DreamGenContext::crosshair() { + STACK_CHECK; + _cmp(data.byte(kCommandtype), 3); + if (flags.z()) + goto nocross; + _cmp(data.byte(kCommandtype), 10); + if (!flags.c()) + goto nocross; + es = data.word(kWorkspace); + ds = data.word(kIcons1); + di = (8)+24; + bx = (132)+19; + al = 9; + ah = 0; + showframe(); + return; +nocross: + es = data.word(kWorkspace); + ds = data.word(kIcons1); + di = (8)+24; + bx = (132)+19; + al = 29; + ah = 0; + showframe(); +} + +void DreamGenContext::showpointer() { + STACK_CHECK; + showblink(); + di = data.word(kMousex); + data.word(kOldpointerx) = di; + bx = data.word(kMousey); + data.word(kOldpointery) = bx; + _cmp(data.byte(kPickup), 1); + if (flags.z()) + goto itsanobject; + push(bx); + push(di); + ds = data.word(kIcons1); + al = data.byte(kPointerframe); + _add(al, 20); + ah = 0; + _add(ax, ax); + si = ax; + _add(ax, ax); + _add(si, ax); + cx = ds.word(si); + _cmp(cl, 12); + if (!flags.c()) + goto notsmallx; + cl = 12; +notsmallx: + _cmp(ch, 12); + if (!flags.c()) + goto notsmally; + ch = 12; +notsmally: + data.byte(kPointerxs) = cl; + data.byte(kPointerys) = ch; + push(ds); + ds = data.word(kBuffers); + si = (0+(180*10)+32+60); + multiget(); + ds = pop(); + di = pop(); + bx = pop(); + push(di); + push(bx); + al = data.byte(kPointerframe); + _add(al, 20); + ah = 0; + showframe(); + bx = pop(); + di = pop(); + return; +itsanobject: + al = data.byte(kItemframe); + ds = data.word(kExtras); + _cmp(data.byte(kObjecttype), 4); + if (flags.z()) + goto itsfrominv; + ds = data.word(kFreeframes); +itsfrominv: + cl = al; + _add(al, al); + _add(al, cl); + _inc(al); + ah = 0; + push(ax); + _add(ax, ax); + si = ax; + _add(ax, ax); + _add(si, ax); + ax = 2080; + cx = ds.word(si); + _cmp(cl, 12); + if (!flags.c()) + goto notsmallx2; + cl = 12; +notsmallx2: + _cmp(ch, 12); + if (!flags.c()) + goto notsmally2; + ch = 12; +notsmally2: + data.byte(kPointerxs) = cl; + data.byte(kPointerys) = ch; + ax = pop(); + push(di); + push(bx); + push(ax); + push(bx); + push(di); + push(ds); + al = cl; + ah = 0; + _shr(ax, 1); + _sub(data.word(kOldpointerx), ax); + _sub(di, ax); + al = ch; + _shr(ax, 1); + _sub(data.word(kOldpointery), ax); + _sub(bx, ax); + ds = data.word(kBuffers); + si = (0+(180*10)+32+60); + multiget(); + ds = pop(); + di = pop(); + bx = pop(); + ax = pop(); + ah = 128; + showframe(); + bx = pop(); + di = pop(); + ds = data.word(kIcons1); + al = 3; + ah = 128; + showframe(); +} + +void DreamGenContext::delpointer() { + STACK_CHECK; + ax = data.word(kOldpointerx); + _cmp(ax, 0x0ffff); + if (flags.z()) + return /* (nevershown) */; + data.word(kDelherex) = ax; + ax = data.word(kOldpointery); + data.word(kDelherey) = ax; + cl = data.byte(kPointerxs); + data.byte(kDelxs) = cl; + ch = data.byte(kPointerys); + data.byte(kDelys) = ch; + ds = data.word(kBuffers); + si = (0+(180*10)+32+60); + di = data.word(kDelherex); + bx = data.word(kDelherey); + multiput(); +} + +void DreamGenContext::dumppointer() { + STACK_CHECK; + dumpblink(); + cl = data.byte(kDelxs); + ch = data.byte(kDelys); + di = data.word(kDelherex); + bx = data.word(kDelherey); + multidump(); + bx = data.word(kOldpointery); + di = data.word(kOldpointerx); + _cmp(di, data.word(kDelherex)); + if (!flags.z()) + goto difffound; + _cmp(bx, data.word(kDelherey)); + if (flags.z()) + return /* (notboth) */; +difffound: + cl = data.byte(kPointerxs); + ch = data.byte(kPointerys); + multidump(); +} + +void DreamGenContext::undertextline() { + STACK_CHECK; + di = data.word(kTextaddressx); + bx = data.word(kTextaddressy); + ds = data.word(kBuffers); + si = (0); + cl = (180); + ch = (10); + multiget(); +} + +void DreamGenContext::deltextline() { + STACK_CHECK; + di = data.word(kTextaddressx); + bx = data.word(kTextaddressy); + ds = data.word(kBuffers); + si = (0); + cl = (180); + ch = (10); + multiput(); +} + +void DreamGenContext::dumptextline() { + STACK_CHECK; + _cmp(data.byte(kNewtextline), 1); + if (!flags.z()) + return /* (nodumptextline) */; + data.byte(kNewtextline) = 0; + di = data.word(kTextaddressx); + bx = data.word(kTextaddressy); + cl = (180); + ch = (10); + multidump(); +} + +void DreamGenContext::animpointer() { + STACK_CHECK; + _cmp(data.byte(kPointermode), 2); + if (flags.z()) + goto combathand; + _cmp(data.byte(kPointermode), 3); + if (flags.z()) + goto mousehand; + _cmp(data.word(kWatchingtime), 0); + if (flags.z()) + goto notwatchpoint; + data.byte(kPointerframe) = 11; + return; +notwatchpoint: + data.byte(kPointerframe) = 0; + _cmp(data.byte(kInmaparea), 0); + if (flags.z()) + return /* (gothand) */; + _cmp(data.byte(kPointerfirstpath), 0); + if (flags.z()) + return /* (gothand) */; + getflagunderp(); + _cmp(cl, 2); + if (flags.c()) + return /* (gothand) */; + _cmp(cl, 128); + if (!flags.c()) + return /* (gothand) */; + data.byte(kPointerframe) = 3; + _test(cl, 4); + if (!flags.z()) + return /* (gothand) */; + data.byte(kPointerframe) = 4; + _test(cl, 16); + if (!flags.z()) + return /* (gothand) */; + data.byte(kPointerframe) = 5; + _test(cl, 2); + if (!flags.z()) + return /* (gothand) */; + data.byte(kPointerframe) = 6; + _test(cl, 8); + if (!flags.z()) + return /* (gothand) */; + data.byte(kPointerframe) = 8; + return; +mousehand: + _cmp(data.byte(kPointerspeed), 0); + if (flags.z()) + goto rightspeed3; + _dec(data.byte(kPointerspeed)); + goto finflashmouse; +rightspeed3: + data.byte(kPointerspeed) = 5; + _inc(data.byte(kPointercount)); + _cmp(data.byte(kPointercount), 16); + if (!flags.z()) + goto finflashmouse; + data.byte(kPointercount) = 0; +finflashmouse: + al = data.byte(kPointercount); + ah = 0; + bx = 5895; + _add(bx, ax); + al = cs.byte(bx); + data.byte(kPointerframe) = al; + return; +combathand: + data.byte(kPointerframe) = 0; + _cmp(data.byte(kReallocation), 14); + if (!flags.z()) + return /* (notarrow) */; + _cmp(data.byte(kCommandtype), 211); + if (!flags.z()) + return /* (notarrow) */; + data.byte(kPointerframe) = 5; +} + +void DreamGenContext::readmouse() { + STACK_CHECK; + ax = data.word(kMousebutton); + data.word(kOldbutton) = ax; + ax = data.word(kMousex); + data.word(kOldx) = ax; + ax = data.word(kMousey); + data.word(kOldy) = ax; + mousecall(); + data.word(kMousex) = cx; + data.word(kMousey) = dx; + data.word(kMousebutton) = bx; +} + +void DreamGenContext::readmouse1() { + STACK_CHECK; + ax = data.word(kMousex); + data.word(kOldx) = ax; + ax = data.word(kMousey); + data.word(kOldy) = ax; + mousecall(); + data.word(kMousex) = cx; + data.word(kMousey) = dx; + data.word(kMousebutton1) = bx; +} + +void DreamGenContext::readmouse2() { + STACK_CHECK; + ax = data.word(kMousex); + data.word(kOldx) = ax; + ax = data.word(kMousey); + data.word(kOldy) = ax; + mousecall(); + data.word(kMousex) = cx; + data.word(kMousey) = dx; + data.word(kMousebutton2) = bx; +} + +void DreamGenContext::readmouse3() { + STACK_CHECK; + ax = data.word(kMousex); + data.word(kOldx) = ax; + ax = data.word(kMousey); + data.word(kOldy) = ax; + mousecall(); + data.word(kMousex) = cx; + data.word(kMousey) = dx; + data.word(kMousebutton3) = bx; +} + +void DreamGenContext::readmouse4() { + STACK_CHECK; + ax = data.word(kMousebutton); + data.word(kOldbutton) = ax; + ax = data.word(kMousex); + data.word(kOldx) = ax; + ax = data.word(kMousey); + data.word(kOldy) = ax; + mousecall(); + data.word(kMousex) = cx; + data.word(kMousey) = dx; + ax = data.word(kMousebutton1); + _or(ax, data.word(kMousebutton2)); + _or(ax, data.word(kMousebutton3)); + _or(bx, ax); + data.word(kMousebutton) = bx; +} + +void DreamGenContext::readkey() { + STACK_CHECK; + bx = data.word(kBufferout); + _cmp(bx, data.word(kBufferin)); + if (flags.z()) + goto nokey; + _inc(bx); + _and(bx, 15); + data.word(kBufferout) = bx; + di = 5912; + _add(di, bx); + al = cs.byte(di); + data.byte(kCurrentkey) = al; + return; +nokey: + data.byte(kCurrentkey) = 0; +} + +void DreamGenContext::randomnum1() { + STACK_CHECK; + push(ds); + push(es); + push(di); + push(bx); + push(cx); + randomnumber(); + cx = pop(); + bx = pop(); + di = pop(); + es = pop(); + ds = pop(); +} + +void DreamGenContext::randomnum2() { + STACK_CHECK; + push(ds); + push(es); + push(di); + push(bx); + push(ax); + randomnumber(); + cl = al; + ax = pop(); + bx = pop(); + di = pop(); + es = pop(); + ds = pop(); +} + +void DreamGenContext::hangon() { + STACK_CHECK; +hangonloop: + push(cx); + vsync(); + cx = pop(); + if (--cx) + goto hangonloop; +} + +void DreamGenContext::loadtraveltext() { + STACK_CHECK; + dx = 2234; + standardload(); + data.word(kTraveltext) = ax; +} + +void DreamGenContext::loadintotemp() { + STACK_CHECK; + ds = cs; + standardload(); + data.word(kTempgraphics) = ax; +} + +void DreamGenContext::loadintotemp2() { + STACK_CHECK; + ds = cs; + standardload(); + data.word(kTempgraphics2) = ax; +} + +void DreamGenContext::loadintotemp3() { + STACK_CHECK; + ds = cs; + standardload(); + data.word(kTempgraphics3) = ax; +} + +void DreamGenContext::loadtempcharset() { + STACK_CHECK; + standardload(); + data.word(kTempcharset) = ax; +} + +void DreamGenContext::standardload() { + STACK_CHECK; + openfile(); + readheader(); + bx = es.word(di); + push(bx); + cl = 4; + _shr(bx, cl); + allocatemem(); + ds = ax; + cx = pop(); + push(ax); + dx = 0; + readfromfile(); + closefile(); + ax = pop(); +} + +void DreamGenContext::loadtemptext() { + STACK_CHECK; + standardload(); + data.word(kTextfile1) = ax; +} + +void DreamGenContext::loadroom() { + STACK_CHECK; + data.byte(kRoomloaded) = 1; + data.word(kTimecount) = 0; + data.word(kMaintimer) = 0; + data.word(kMapoffsetx) = 104; + data.word(kMapoffsety) = 38; + data.word(kTextaddressx) = 13; + data.word(kTextaddressy) = 182; + data.byte(kTextlen) = 240; + al = data.byte(kNewlocation); + data.byte(kLocation) = al; + getroomdata(); + startloading(); + loadroomssample(); + switchryanon(); + drawflags(); + getdimension(); +} + +void DreamGenContext::loadroomssample() { + STACK_CHECK; + al = data.byte(kRoomssample); + _cmp(al, 255); + if (flags.z()) + return /* (loadedalready) */; + _cmp(al, data.byte(kCurrentsample)); + if (flags.z()) + return /* (loadedalready) */; + data.byte(kCurrentsample) = al; + al = data.byte(kCurrentsample); + cl = '0'; + twodigitnum(); + di = 1896; + _xchg(al, ah); + cs.word(di+10) = ax; + dx = di; + loadsecondsample(); +} + +void DreamGenContext::getridofreels() { + STACK_CHECK; + _cmp(data.byte(kRoomloaded), 0); + if (flags.z()) + return /* (dontgetrid) */; + es = data.word(kReel1); + deallocatemem(); + es = data.word(kReel2); + deallocatemem(); + es = data.word(kReel3); + deallocatemem(); +} + +void DreamGenContext::getridofall() { + STACK_CHECK; + es = data.word(kBackdrop); + deallocatemem(); + es = data.word(kSetframes); + deallocatemem(); + es = data.word(kReel1); + deallocatemem(); + es = data.word(kReel2); + deallocatemem(); + es = data.word(kReel3); + deallocatemem(); + es = data.word(kReels); + deallocatemem(); + es = data.word(kPeople); + deallocatemem(); + es = data.word(kSetdesc); + deallocatemem(); + es = data.word(kBlockdesc); + deallocatemem(); + es = data.word(kRoomdesc); + deallocatemem(); + es = data.word(kFreeframes); + deallocatemem(); + es = data.word(kFreedesc); + deallocatemem(); +} + +void DreamGenContext::restorereels() { + STACK_CHECK; + _cmp(data.byte(kRoomloaded), 0); + if (flags.z()) + return /* (dontrestore) */; + al = data.byte(kReallocation); + getroomdata(); + dx = bx; + openfile(); + readheader(); + dontloadseg(); + dontloadseg(); + dontloadseg(); + dontloadseg(); + allocateload(); + data.word(kReel1) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kReel2) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kReel3) = ax; + ds = ax; + dx = 0; + loadseg(); + closefile(); +} + +void DreamGenContext::restoreall() { + STACK_CHECK; + al = data.byte(kLocation); + getroomdata(); + dx = bx; + openfile(); + readheader(); + allocateload(); + ds = ax; + data.word(kBackdrop) = ax; + dx = (0); + loadseg(); + ds = data.word(kWorkspace); + dx = (0); + cx = 132*66; + al = 0; + fillspace(); + loadseg(); + sortoutmap(); + allocateload(); + data.word(kSetframes) = ax; + ds = ax; + dx = (0); + loadseg(); + dontloadseg(); + allocateload(); + data.word(kReel1) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kReel2) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kReel3) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kReels) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kPeople) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kSetdesc) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kBlockdesc) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kRoomdesc) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kFreeframes) = ax; + ds = ax; + dx = 0; + loadseg(); + dontloadseg(); + allocateload(); + data.word(kFreedesc) = ax; + ds = ax; + dx = (0); + loadseg(); + closefile(); + setallchanges(); +} + +void DreamGenContext::sortoutmap() { + STACK_CHECK; + push(es); + push(di); + ds = data.word(kWorkspace); + si = 0; + es = data.word(kMapdata); + di = 0; + cx = (60); +blimey: + push(cx); + push(si); + cx = (66); + _movsb(cx, true); + si = pop(); + cx = pop(); + _add(si, 132); + if (--cx) + goto blimey; + di = pop(); + es = pop(); +} + +void DreamGenContext::startloading() { + STACK_CHECK; + data.byte(kCombatcount) = 0; + al = cs.byte(bx+13); + data.byte(kRoomssample) = al; + al = cs.byte(bx+15); + data.byte(kMapx) = al; + al = cs.byte(bx+16); + data.byte(kMapy) = al; + al = cs.byte(bx+20); + data.byte(kLiftflag) = al; + al = cs.byte(bx+21); + data.byte(kManspath) = al; + data.byte(kDestination) = al; + data.byte(kFinaldest) = al; + al = cs.byte(bx+22); + data.byte(kFacing) = al; + data.byte(kTurntoface) = al; + al = cs.byte(bx+23); + data.byte(kCounttoopen) = al; + al = cs.byte(bx+24); + data.byte(kLiftpath) = al; + al = cs.byte(bx+25); + data.byte(kDoorpath) = al; + data.byte(kLastweapon) = -1; + al = cs.byte(bx+27); + push(ax); + al = cs.byte(bx+31); + ah = data.byte(kReallocation); + data.byte(kReallocation) = al; + dx = bx; + openfile(); + readheader(); + allocateload(); + ds = ax; + data.word(kBackdrop) = ax; + dx = (0); + loadseg(); + ds = data.word(kWorkspace); + dx = (0); + cx = 132*66; + al = 0; + fillspace(); + loadseg(); + sortoutmap(); + allocateload(); + data.word(kSetframes) = ax; + ds = ax; + dx = (0); + loadseg(); + ds = data.word(kSetdat); + dx = 0; + cx = (64*128); + al = 255; + fillspace(); + loadseg(); + allocateload(); + data.word(kReel1) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kReel2) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kReel3) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kReels) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kPeople) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kSetdesc) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kBlockdesc) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kRoomdesc) = ax; + ds = ax; + dx = 0; + loadseg(); + allocateload(); + data.word(kFreeframes) = ax; + ds = ax; + dx = 0; + loadseg(); + ds = data.word(kFreedat); + dx = 0; + cx = (16*80); + al = 255; + fillspace(); + loadseg(); + allocateload(); + data.word(kFreedesc) = ax; + ds = ax; + dx = (0); + loadseg(); + closefile(); + findroominloc(); + deletetaken(); + setallchanges(); + autoappear(); + al = data.byte(kNewlocation); + getroomdata(); + data.byte(kLastweapon) = -1; + data.byte(kMandead) = 0; + data.word(kLookcounter) = 160; + data.byte(kNewlocation) = 255; + data.byte(kLinepointer) = 254; + ax = pop(); + _cmp(al, 255); + if (flags.z()) + goto dontwalkin; + data.byte(kManspath) = al; + push(bx); + autosetwalk(); + bx = pop(); +dontwalkin: + findxyfrompath(); +} + +void DreamGenContext::disablepath() { + STACK_CHECK; + push(cx); + _xchg(al, ah); + cx = -6; +looky2: + _add(cx, 6); + _sub(al, 10); + if (!flags.c()) + goto looky2; + al = ah; + _dec(cx); +lookx2: + _inc(cx); + _sub(al, 11); + if (!flags.c()) + goto lookx2; + al = cl; + ah = 0; + cx = 144; + _mul(cx); + es = data.word(kReels); + bx = (0); + _add(bx, ax); + ax = pop(); + ah = 0; + _add(ax, ax); + _add(ax, ax); + _add(ax, ax); + _add(bx, ax); + al = 0; + es.byte(bx+6) = al; +} + +void DreamGenContext::findxyfrompath() { + STACK_CHECK; + getroomspaths(); + al = data.byte(kManspath); + ah = 0; + _add(ax, ax); + _add(ax, ax); + _add(ax, ax); + _add(bx, ax); + ax = es.word(bx); + _sub(al, 12); + _sub(ah, 12); + data.byte(kRyanx) = al; + data.byte(kRyany) = ah; +} + +void DreamGenContext::findroominloc() { + STACK_CHECK; + al = data.byte(kMapy); + cx = -6; +looky: + _add(cx, 6); + _sub(al, 10); + if (!flags.c()) + goto looky; + al = data.byte(kMapx); + _dec(cx); +lookx: + _inc(cx); + _sub(al, 11); + if (!flags.c()) + goto lookx; + data.byte(kRoomnum) = cl; +} + +void DreamGenContext::getroomdata() { + STACK_CHECK; + ah = 0; + cx = 32; + _mul(cx); + bx = 6187; + _add(bx, ax); +} + +void DreamGenContext::readheader() { + STACK_CHECK; + ds = cs; + dx = 6091; + cx = (6187-6091); + readfromfile(); + es = cs; + di = 6141; +} + +void DreamGenContext::allocateload() { + STACK_CHECK; + push(es); + push(di); + bx = es.word(di); + cl = 4; + _shr(bx, cl); + allocatemem(); + di = pop(); + es = pop(); +} + +void DreamGenContext::fillspace() { + STACK_CHECK; + push(es); + push(ds); + push(dx); + push(di); + push(bx); + di = dx; + es = ds; + _stosb(cx, true); + bx = pop(); + di = pop(); + dx = pop(); + ds = pop(); + es = pop(); +} + +void DreamGenContext::getridoftemp() { + STACK_CHECK; + es = data.word(kTempgraphics); + deallocatemem(); +} + +void DreamGenContext::getridoftemptext() { + STACK_CHECK; + es = data.word(kTextfile1); + deallocatemem(); +} + +void DreamGenContext::getridoftemp2() { + STACK_CHECK; + es = data.word(kTempgraphics2); + deallocatemem(); +} + +void DreamGenContext::getridoftemp3() { + STACK_CHECK; + es = data.word(kTempgraphics3); + deallocatemem(); +} + +void DreamGenContext::getridoftempcharset() { + STACK_CHECK; + es = data.word(kTempcharset); + deallocatemem(); +} + +void DreamGenContext::getridoftempsp() { + STACK_CHECK; + es = data.word(kTempsprites); + deallocatemem(); +} + +void DreamGenContext::readsetdata() { + STACK_CHECK; + dx = 1857; + standardload(); + data.word(kCharset1) = ax; + dx = 1922; + standardload(); + data.word(kIcons1) = ax; + dx = 1935; + standardload(); + data.word(kIcons2) = ax; + dx = 1819; + standardload(); + data.word(kMainsprites) = ax; + dx = 2221; + standardload(); + data.word(kPuzzletext) = ax; + dx = 2273; + standardload(); + data.word(kCommandtext) = ax; + ax = data.word(kCharset1); + data.word(kCurrentset) = ax; + _cmp(data.byte(kSoundint), 255); + if (flags.z()) + return /* (novolumeload) */; + dx = 2286; + openfile(); + cx = 2048-256; + ds = data.word(kSoundbuffer); + dx = 16384; + readfromfile(); + closefile(); +} + +void DreamGenContext::makename() { + STACK_CHECK; + si = dx; + di = 6061; +transfer: + al = cs.byte(si); + cs.byte(di) = al; + _inc(si); + _inc(di); + _cmp(al, 0); + if (!flags.z()) + goto transfer; + dx = 6059; +} + +void DreamGenContext::dreamweb() { + STACK_CHECK; + seecommandtail(); + checkbasemem(); + soundstartup(); + setkeyboardint(); + setupemm(); + allocatebuffers(); + setmouse(); + fadedos(); + gettime(); + clearbuffers(); + clearpalette(); + set16colpalette(); + readsetdata(); + data.byte(kWongame) = 0; + dx = 1909; + loadsample(); + setsoundoff(); + scanfornames(); + _cmp(al, 0); + if (!flags.z()) + goto dodecisions; + setmode(); + loadpalfromiff(); + titles(); + credits(); + goto playgame; +dodecisions: + cls(); + setmode(); + decide(); + _cmp(data.byte(kQuitrequested), 0); + if (!flags.z()) + return /* (exitgame) */; + _cmp(data.byte(kGetback), 4); + if (flags.z()) + goto mainloop; + titles(); + _cmp(data.byte(kQuitrequested), 0); + if (!flags.z()) + return /* (exitgame) */; + credits(); +playgame: + _cmp(data.byte(kQuitrequested), 0); + if (!flags.z()) + return /* (exitgame) */; + clearchanges(); + setmode(); + loadpalfromiff(); + data.byte(kLocation) = 255; + data.byte(kRoomafterdream) = 1; + data.byte(kNewlocation) = 35; + data.byte(kVolume) = 7; + loadroom(); + clearsprites(); + initman(); + entrytexts(); + entryanims(); + data.byte(kDestpos) = 3; + initialinv(); + data.byte(kLastflag) = 32; + startup1(); + data.byte(kVolumeto) = 0; + data.byte(kVolumedirection) = -1; + data.byte(kCommandtype) = 255; + goto mainloop; +loadnew: + clearbeforeload(); + loadroom(); + clearsprites(); + initman(); + entrytexts(); + entryanims(); + data.byte(kNewlocation) = 255; + startup(); + data.byte(kCommandtype) = 255; + worktoscreenm(); + goto mainloop; + data.byte(kNewlocation) = 255; + clearsprites(); + initman(); + startup(); + data.byte(kCommandtype) = 255; +mainloop: + _cmp(data.byte(kQuitrequested), 0); + if (!flags.z()) + return /* (exitgame) */; + screenupdate(); + _cmp(data.byte(kWongame), 0); + if (!flags.z()) + goto endofgame; + _cmp(data.byte(kMandead), 1); + if (flags.z()) + goto gameover; + _cmp(data.byte(kMandead), 2); + if (flags.z()) + goto gameover; + _cmp(data.word(kWatchingtime), 0); + if (flags.z()) + goto notwatching; + al = data.byte(kFinaldest); + _cmp(al, data.byte(kManspath)); + if (!flags.z()) + goto mainloop; + _dec(data.word(kWatchingtime)); + if (!flags.z()) + goto mainloop; +notwatching: + _cmp(data.byte(kMandead), 4); + if (flags.z()) + goto gameover; + _cmp(data.byte(kNewlocation), 255); + if (!flags.z()) + goto loadnew; + goto mainloop; +gameover: + clearbeforeload(); + showgun(); + fadescreendown(); + cx = 100; + hangon(); + goto dodecisions; +endofgame: + clearbeforeload(); + fadescreendowns(); + cx = 200; + hangon(); + endgame(); + { quickquit2(); return; }; +} + + + +void DreamGenContext::__start() { + static const uint8 src[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x00, 0x00, 0x00, 0xff, 0x00, + 0xff, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0xb6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x2c, 0x00, 0x14, 0x00, 0x02, 0x00, 0x01, 0x01, 0x37, + 0x00, 0x00, 0x00, 0x32, 0x14, 0x00, 0x18, 0x16, 0x00, 0x4a, 0x00, 0x01, 0x00, 0x00, 0x18, 0x21, + 0x0a, 0x4b, 0x00, 0x01, 0x00, 0x01, 0x01, 0x2c, 0x00, 0x1b, 0x00, 0x02, 0x00, 0x02, 0x01, 0x2c, + 0x00, 0x60, 0x00, 0x03, 0x00, 0x04, 0x01, 0x2c, 0x00, 0x76, 0x00, 0x02, 0x00, 0x05, 0x01, 0x2c, + 0x0a, 0x00, 0x00, 0x02, 0x00, 0x00, 0x05, 0x16, 0x14, 0x35, 0x00, 0x03, 0x00, 0x00, 0x05, 0x16, + 0x14, 0x28, 0x00, 0x01, 0x00, 0x02, 0x05, 0x16, 0x14, 0x32, 0x00, 0x01, 0x00, 0x03, 0x02, 0x0b, + 0x0a, 0xc0, 0x00, 0x01, 0x00, 0x00, 0x02, 0x0b, 0x0a, 0xb6, 0x00, 0x02, 0x00, 0x01, 0x08, 0x0b, + 0x0a, 0x00, 0x00, 0x02, 0x00, 0x01, 0x17, 0x00, 0x32, 0x00, 0x00, 0x03, 0x00, 0x00, 0x1c, 0x0b, + 0x14, 0xfa, 0x00, 0x04, 0x00, 0x00, 0x17, 0x00, 0x32, 0x2b, 0x00, 0x02, 0x00, 0x08, 0x17, 0x0b, + 0x28, 0x82, 0x00, 0x02, 0x00, 0x01, 0x17, 0x16, 0x28, 0x7a, 0x00, 0x02, 0x00, 0x02, 0x17, 0x16, + 0x28, 0x69, 0x00, 0x02, 0x00, 0x03, 0x17, 0x16, 0x28, 0x51, 0x00, 0x02, 0x00, 0x04, 0x17, 0x0b, + 0x28, 0x87, 0x00, 0x02, 0x00, 0x05, 0x17, 0x16, 0x28, 0x91, 0x00, 0x02, 0x00, 0x06, 0x04, 0x16, + 0x1e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x2d, 0x16, 0x1e, 0xc8, 0x00, 0x00, 0x00, 0x14, 0x2d, 0x16, + 0x1e, 0x27, 0x00, 0x02, 0x00, 0x00, 0x2d, 0x16, 0x1e, 0x19, 0x00, 0x02, 0x00, 0x00, 0x08, 0x16, + 0x28, 0x20, 0x00, 0x02, 0x00, 0x00, 0x07, 0x0b, 0x14, 0x40, 0x00, 0x02, 0x00, 0x00, 0x16, 0x16, + 0x14, 0x52, 0x00, 0x02, 0x00, 0x00, 0x1b, 0x0b, 0x1e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x14, 0x00, + 0x1e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0e, 0x21, 0x28, 0x15, 0x00, 0x01, 0x00, 0x00, 0x1d, 0x0b, + 0x0a, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x16, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x19, 0x00, + 0x32, 0x04, 0x00, 0x02, 0x00, 0x00, 0x32, 0x16, 0x1e, 0x79, 0x00, 0x02, 0x00, 0x00, 0x32, 0x16, + 0x1e, 0x00, 0x00, 0x14, 0x00, 0x00, 0x34, 0x16, 0x1e, 0xc0, 0x00, 0x02, 0x00, 0x00, 0x34, 0x16, + 0x1e, 0xe9, 0x00, 0x02, 0x00, 0x00, 0x32, 0x16, 0x28, 0x68, 0x00, 0x37, 0x00, 0x00, 0x35, 0x21, + 0x00, 0x63, 0x00, 0x02, 0x00, 0x00, 0x32, 0x16, 0x28, 0x00, 0x00, 0x03, 0x00, 0x00, 0x32, 0x16, + 0x1e, 0xa2, 0x00, 0x02, 0x00, 0x00, 0x34, 0x16, 0x1e, 0x39, 0x00, 0x02, 0x00, 0x00, 0x34, 0x16, + 0x1e, 0x00, 0x00, 0x02, 0x00, 0x00, 0x36, 0x00, 0x00, 0x48, 0x00, 0x03, 0x00, 0x00, 0x37, 0x2c, + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x0e, 0x16, + 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x0e, 0x16, 0x00, 0x2c, 0x01, 0x01, 0x00, 0x00, 0x0a, 0x16, + 0x1e, 0xae, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x16, 0x14, 0x00, 0x00, 0x01, 0x00, 0x00, 0x0b, 0x0b, + 0x14, 0x00, 0x00, 0x32, 0x14, 0x00, 0x0b, 0x0b, 0x1e, 0x00, 0x00, 0x32, 0x14, 0x00, 0x0b, 0x16, + 0x14, 0x00, 0x00, 0x32, 0x14, 0x00, 0x0e, 0x21, 0x28, 0x00, 0x00, 0x32, 0x14, 0x00, 0xff, 0x7c, + 0xc0, 0x80, 0xc0, 0x1c, 0xc0, 0x20, 0xc0, 0x00, 0xc1, 0x10, 0xc0, 0x18, 0xc0, 0xf4, 0xc0, 0x0c, + 0xc0, 0x24, 0xc0, 0x28, 0xc0, 0x2c, 0xc0, 0x30, 0xc0, 0x54, 0xc0, 0x78, 0xc0, 0x50, 0xc0, 0x74, + 0xc0, 0x34, 0xc0, 0x38, 0xc0, 0x40, 0xc0, 0x44, 0xc0, 0x48, 0xc0, 0x3c, 0xc0, 0x14, 0xc0, 0x88, + 0xc0, 0x8c, 0xc0, 0x90, 0xc0, 0x70, 0xc0, 0xfc, 0xc0, 0x6c, 0xc0, 0x58, 0xc0, 0x68, 0xc0, 0x04, + 0xc1, 0x64, 0xc0, 0x60, 0xc0, 0x5c, 0xc0, 0x94, 0xc0, 0x04, 0xc0, 0xa4, 0xc0, 0x9c, 0xc0, 0xa0, + 0xc0, 0xa8, 0xc0, 0xac, 0xc0, 0x98, 0xc0, 0xb0, 0xc0, 0xb4, 0xc0, 0xc8, 0xc0, 0xcc, 0xc0, 0xd4, + 0xc0, 0xdc, 0xc0, 0xd8, 0xc0, 0x00, 0xc0, 0x08, 0xc0, 0x84, 0xc0, 0x84, 0xc0, 0x84, 0xc0, 0x84, + 0xc0, 0x00, 0x3c, 0x21, 0x47, 0x0b, 0x52, 0x16, 0x5d, 0x01, 0x2c, 0x0a, 0x10, 0x04, 0x0b, 0x1e, + 0x0e, 0x04, 0x16, 0x1e, 0x0e, 0x03, 0x21, 0x0a, 0x0e, 0x0a, 0x21, 0x1e, 0x0e, 0x0a, 0x16, 0x1e, + 0x18, 0x09, 0x16, 0x0a, 0x0e, 0x02, 0x21, 0x00, 0x0e, 0x02, 0x16, 0x00, 0x0e, 0x06, 0x0b, 0x1e, + 0x0e, 0x07, 0x0b, 0x14, 0x12, 0x07, 0x00, 0x14, 0x12, 0x07, 0x00, 0x1e, 0x12, 0x37, 0x2c, 0x00, + 0x0e, 0x05, 0x16, 0x1e, 0x0e, 0x08, 0x00, 0x0a, 0x12, 0x08, 0x0b, 0x0a, 0x12, 0x08, 0x16, 0x0a, + 0x12, 0x08, 0x21, 0x0a, 0x12, 0x08, 0x21, 0x14, 0x12, 0x08, 0x21, 0x1e, 0x12, 0x08, 0x21, 0x28, + 0x12, 0x08, 0x16, 0x28, 0x12, 0x08, 0x0b, 0x28, 0x12, 0x15, 0x2c, 0x14, 0x12, 0xff, 0x2e, 0x05, + 0x2f, 0x05, 0x33, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x46, 0x05, 0x2e, 0x05, 0x4d, 0x05, + 0x5d, 0x05, 0x64, 0x05, 0x68, 0x05, 0x6c, 0x05, 0x70, 0x05, 0x7d, 0x05, 0x2e, 0x05, 0x2e, 0x05, + 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x9f, 0x05, 0x2e, 0x05, 0xb5, 0x05, 0xd4, 0x05, 0x2e, 0x05, + 0xe1, 0x05, 0xf7, 0x05, 0x0d, 0x06, 0x26, 0x06, 0x39, 0x06, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, + 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, + 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x49, 0x06, 0x50, 0x06, 0x75, 0x06, 0x2e, 0x05, + 0x2e, 0x05, 0x2e, 0x05, 0x2e, 0x05, 0x82, 0x06, 0x86, 0x06, 0x2e, 0x05, 0x8d, 0x06, 0xff, 0x0f, + 0x01, 0x01, 0xff, 0x0c, 0x05, 0x00, 0x0d, 0x15, 0x00, 0x0f, 0x23, 0x00, 0x11, 0x32, 0x00, 0x12, + 0x67, 0x00, 0x13, 0x6c, 0x00, 0xff, 0x12, 0x13, 0x00, 0x13, 0x17, 0x00, 0xff, 0x0c, 0x33, 0x00, + 0x0d, 0x35, 0x00, 0x0e, 0x0e, 0x00, 0x0f, 0x14, 0x00, 0x00, 0x4e, 0x00, 0xff, 0x0c, 0x77, 0x00, + 0x0c, 0x91, 0x00, 0xff, 0x0d, 0x10, 0x00, 0xff, 0x0d, 0x14, 0x00, 0xff, 0x0e, 0x10, 0x00, 0xff, + 0x0f, 0x04, 0x00, 0x10, 0x08, 0x00, 0x11, 0x86, 0x00, 0x12, 0x99, 0x00, 0xff, 0x0d, 0x6c, 0x00, + 0x0f, 0x46, 0x01, 0x0f, 0x4b, 0x01, 0x0f, 0x50, 0x01, 0x0f, 0x56, 0x01, 0x0f, 0x5c, 0x01, 0x0f, + 0x62, 0x01, 0x12, 0x9f, 0x00, 0x12, 0xb2, 0x00, 0x93, 0xd9, 0x00, 0x54, 0xe4, 0x00, 0xff, 0x0d, + 0x14, 0x00, 0x0d, 0x15, 0x00, 0x0f, 0x22, 0x00, 0x0d, 0x34, 0x00, 0x0d, 0x37, 0x00, 0x19, 0x39, + 0x00, 0x15, 0x49, 0x00, 0xff, 0x0d, 0xc4, 0x00, 0x0d, 0xea, 0x00, 0x0d, 0x9c, 0x00, 0x0e, 0x81, + 0x00, 0x0d, 0x7c, 0x00, 0x0f, 0xa2, 0x00, 0x0f, 0xc8, 0x00, 0x0f, 0xef, 0x00, 0x11, 0x63, 0x00, + 0x0c, 0x34, 0x00, 0xff, 0x0f, 0x38, 0x00, 0x10, 0x40, 0x00, 0x13, 0x16, 0x00, 0x14, 0x21, 0x00, + 0xff, 0x14, 0x0b, 0x00, 0x14, 0x0f, 0x00, 0x0f, 0x1c, 0x00, 0x0d, 0x50, 0x00, 0x15, 0x52, 0x00, + 0x93, 0x57, 0x00, 0x57, 0x80, 0x00, 0xff, 0x0c, 0x0d, 0x00, 0x0e, 0x27, 0x00, 0x0c, 0x43, 0x00, + 0x0c, 0x4b, 0x00, 0x0c, 0x53, 0x00, 0x0c, 0x5b, 0x00, 0x0f, 0x66, 0x00, 0xff, 0x16, 0x24, 0x00, + 0x0d, 0x7d, 0x00, 0x12, 0x58, 0x00, 0x0f, 0x6b, 0x00, 0x0e, 0x7f, 0x00, 0x0e, 0x9a, 0x00, 0x93, + 0xaa, 0x00, 0x57, 0xe8, 0x00, 0xff, 0x15, 0x10, 0x00, 0x15, 0x48, 0x00, 0x15, 0xcd, 0x00, 0x16, + 0x3f, 0x00, 0x97, 0x63, 0x00, 0x58, 0x9e, 0x00, 0xff, 0x0d, 0x15, 0x00, 0x0e, 0x18, 0x00, 0x93, + 0x32, 0x00, 0x57, 0x4b, 0x00, 0x18, 0x80, 0x00, 0xff, 0x53, 0x2e, 0x00, 0x10, 0xa7, 0x00, 0xff, + 0x10, 0x13, 0x00, 0x0e, 0x24, 0x00, 0x10, 0x32, 0x00, 0x0e, 0x41, 0x00, 0x10, 0x51, 0x00, 0x0e, + 0x60, 0x00, 0x10, 0x72, 0x00, 0x0e, 0x81, 0x00, 0x10, 0x93, 0x00, 0x0e, 0xa2, 0x00, 0x10, 0xb1, + 0x00, 0x0e, 0xbf, 0x00, 0xff, 0x0d, 0x30, 0x00, 0x0e, 0x29, 0x00, 0x0f, 0x4e, 0x00, 0x10, 0x5c, + 0x00, 0xff, 0x10, 0x73, 0x00, 0xff, 0x15, 0x67, 0x00, 0x14, 0xc7, 0x00, 0xff, 0x11, 0x35, 0x00, + 0x11, 0x36, 0x00, 0x11, 0x37, 0x00, 0x11, 0x38, 0x00, 0x11, 0x39, 0x00, 0x11, 0x3a, 0x00, 0x11, + 0x3b, 0x00, 0x11, 0x3d, 0x00, 0x11, 0x3f, 0x00, 0x11, 0x40, 0x00, 0x11, 0x41, 0x00, 0xff, 0x9c, + 0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9e, 0x9c, 0x9a, 0x9f, 0x9a, 0x9c, + 0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9e, 0x9c, 0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d, + 0x99, 0x9f, 0x9e, 0x9c, 0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9e, 0x9c, + 0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9e, 0x9c, 0x9a, 0x9f, 0x9a, 0x9c, + 0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9e, 0x9c, 0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d, + 0x99, 0x9f, 0x9e, 0x9c, 0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9e, 0x9c, + 0x9a, 0x9f, 0x9a, 0x9c, 0x9e, 0xa0, 0x9b, 0x9d, 0x99, 0x9f, 0x9c, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x53, 0x30, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, + 0x2e, 0x53, 0x30, 0x32, 0x00, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x2e, 0x44, 0x41, 0x54, + 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x43, 0x30, 0x30, 0x00, 0x44, 0x52, + 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x43, 0x30, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x43, 0x30, 0x32, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, + 0x2e, 0x56, 0x30, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x56, 0x39, + 0x39, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x30, 0x00, 0x44, + 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41, + 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x32, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, + 0x42, 0x2e, 0x47, 0x30, 0x38, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, + 0x30, 0x33, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x37, 0x00, + 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x34, 0x00, 0x44, 0x52, 0x45, + 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x35, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, + 0x45, 0x42, 0x2e, 0x47, 0x30, 0x36, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, + 0x47, 0x31, 0x34, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x30, 0x31, + 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x30, 0x32, 0x00, 0x44, 0x52, + 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x31, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x54, 0x31, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, + 0x2e, 0x54, 0x31, 0x32, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x31, + 0x33, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x32, 0x30, 0x00, 0x44, + 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x32, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41, + 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x32, 0x32, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, + 0x42, 0x2e, 0x54, 0x32, 0x33, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, + 0x32, 0x34, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x35, 0x30, 0x00, + 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x35, 0x31, 0x00, 0x44, 0x52, 0x45, + 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x38, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, + 0x45, 0x42, 0x2e, 0x54, 0x38, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, + 0x54, 0x38, 0x32, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x38, 0x33, + 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x54, 0x38, 0x34, 0x00, 0x44, 0x52, + 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x56, 0x4f, 0x4c, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x47, 0x30, 0x39, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, + 0x2e, 0x47, 0x31, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x31, + 0x31, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x31, 0x32, 0x00, 0x44, + 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x31, 0x33, 0x00, 0x44, 0x52, 0x45, 0x41, + 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x47, 0x31, 0x35, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, + 0x42, 0x2e, 0x49, 0x30, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x49, + 0x30, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x49, 0x30, 0x32, 0x00, + 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x49, 0x30, 0x33, 0x00, 0x44, 0x52, 0x45, + 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x49, 0x30, 0x34, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, + 0x45, 0x42, 0x2e, 0x49, 0x30, 0x35, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, + 0x49, 0x30, 0x36, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x49, 0x30, 0x37, + 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x50, 0x41, 0x4c, 0x00, 0x11, 0x01, + 0x40, 0x01, 0x9d, 0x00, 0xc6, 0x00, 0x44, 0xc3, 0x04, 0x01, 0x2c, 0x01, 0x00, 0x00, 0x2c, 0x00, + 0x80, 0xc5, 0xd2, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x2c, 0x00, 0xdc, 0xc3, 0x90, 0x00, 0xb0, 0x00, + 0x40, 0x00, 0x60, 0x00, 0x80, 0xc3, 0x00, 0x00, 0x32, 0x00, 0x32, 0x00, 0xc8, 0x00, 0x84, 0xc3, + 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x11, 0x01, 0x40, 0x01, + 0x9d, 0x00, 0xc6, 0x00, 0x44, 0xc3, 0xff, 0x00, 0x26, 0x01, 0x00, 0x00, 0x18, 0x00, 0xc8, 0xc3, + 0xf7, 0x00, 0x2d, 0x01, 0x28, 0x00, 0x38, 0x00, 0x48, 0xc3, 0x50, 0x00, 0x00, 0x01, 0x9e, 0x00, + 0xca, 0x00, 0xe0, 0xc3, 0x50, 0x00, 0x2c, 0x01, 0x3a, 0x00, 0x92, 0x00, 0x98, 0xc3, 0x00, 0x00, + 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x11, 0x01, 0x40, 0x01, 0x9d, 0x00, + 0xc6, 0x00, 0x44, 0xc3, 0xf7, 0x00, 0x2d, 0x01, 0x28, 0x00, 0x38, 0x00, 0x48, 0xc3, 0x50, 0x00, + 0x2c, 0x01, 0x3a, 0x00, 0x92, 0x00, 0xbc, 0xc6, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, + 0xa0, 0xca, 0xff, 0xff, 0x11, 0x01, 0x40, 0x01, 0x9d, 0x00, 0xc6, 0x00, 0x7c, 0xc4, 0xf0, 0x00, + 0x22, 0x01, 0x02, 0x00, 0x2c, 0x00, 0x94, 0xc4, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, + 0xa0, 0xca, 0xff, 0xff, 0x11, 0x01, 0x40, 0x01, 0x9d, 0x00, 0xc6, 0x00, 0x7c, 0xc4, 0x00, 0x00, + 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0xee, 0x00, 0x02, 0x01, 0x04, 0x00, + 0x2c, 0x00, 0xc8, 0xc4, 0x68, 0x00, 0x7c, 0x00, 0x04, 0x00, 0x2c, 0x00, 0xcc, 0xc4, 0x18, 0x01, + 0x34, 0x01, 0x04, 0x00, 0x2c, 0x00, 0xb0, 0xc4, 0x68, 0x00, 0xd8, 0x00, 0x8a, 0x00, 0xc0, 0x00, + 0xd0, 0xc4, 0x11, 0x01, 0x40, 0x01, 0x9d, 0x00, 0xc6, 0x00, 0x7c, 0xc4, 0x00, 0x00, 0x40, 0x01, + 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x45, 0x58, 0x49, 0x54, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x48, 0x45, 0x4c, 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x49, 0x53, 0x54, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x45, 0x41, 0x44, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4c, 0x4f, 0x47, 0x4f, 0x4e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4b, 0x45, 0x59, 0x53, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x01, 0x00, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, + 0x42, 0x4c, 0x41, 0x43, 0x4b, 0x44, 0x52, 0x41, 0x47, 0x4f, 0x4e, 0x20, 0x52, 0x59, 0x41, 0x4e, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x48, 0x45, 0x4e, 0x44, 0x52, 0x49, + 0x58, 0x20, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x4f, 0x55, 0x49, 0x53, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x00, 0x00, 0x00, 0x53, 0x45, 0x50, 0x54, 0x49, 0x4d, 0x55, 0x53, 0x20, 0x20, 0x20, 0x20, + 0x42, 0x45, 0x43, 0x4b, 0x45, 0x54, 0x54, 0x20, 0x20, 0x20, 0x20, 0x00, 0xff, 0xff, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x22, 0x52, 0x4f, 0x4f, + 0x54, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x4e, 0x45, 0x54, 0x57, 0xe8, 0xc4, 0x45, 0x4c, + 0x56, 0x41, 0x8c, 0xc6, 0x45, 0x4c, 0x56, 0x42, 0x9c, 0xc6, 0x45, 0x4c, 0x56, 0x43, 0x94, 0xc6, + 0x45, 0x4c, 0x56, 0x45, 0x98, 0xc6, 0x45, 0x4c, 0x56, 0x46, 0xa0, 0xc6, 0x43, 0x47, 0x41, 0x54, + 0x30, 0xc7, 0x52, 0x45, 0x4d, 0x4f, 0xa8, 0xc6, 0x42, 0x55, 0x54, 0x41, 0x3c, 0xc7, 0x43, 0x42, + 0x4f, 0x58, 0x44, 0xc7, 0x4c, 0x49, 0x54, 0x45, 0x5c, 0xc6, 0x50, 0x4c, 0x41, 0x54, 0x40, 0xc7, + 0x4c, 0x49, 0x46, 0x54, 0x7c, 0xc6, 0x57, 0x49, 0x52, 0x45, 0x84, 0xc6, 0x48, 0x4e, 0x44, 0x4c, + 0x88, 0xc6, 0x48, 0x41, 0x43, 0x48, 0x80, 0xc6, 0x44, 0x4f, 0x4f, 0x52, 0xb4, 0xc6, 0x43, 0x53, + 0x48, 0x52, 0x70, 0xc6, 0x47, 0x55, 0x4e, 0x41, 0x34, 0xc7, 0x43, 0x52, 0x41, 0x41, 0x64, 0xc6, + 0x43, 0x52, 0x42, 0x42, 0x68, 0xc6, 0x43, 0x52, 0x43, 0x43, 0x6c, 0xc6, 0x53, 0x45, 0x41, 0x54, + 0xf8, 0xc5, 0x4d, 0x45, 0x4e, 0x55, 0x98, 0xc7, 0x43, 0x4f, 0x4f, 0x4b, 0xac, 0xc6, 0x45, 0x4c, + 0x43, 0x41, 0x4c, 0xc6, 0x45, 0x44, 0x43, 0x41, 0x50, 0xc6, 0x44, 0x44, 0x43, 0x41, 0x54, 0xc6, + 0x41, 0x4c, 0x54, 0x52, 0x04, 0xc6, 0x4c, 0x4f, 0x4b, 0x41, 0x3c, 0xc6, 0x4c, 0x4f, 0x4b, 0x42, + 0x40, 0xc6, 0x45, 0x4e, 0x54, 0x41, 0x10, 0xc6, 0x45, 0x4e, 0x54, 0x42, 0x24, 0xc6, 0x45, 0x4e, + 0x54, 0x45, 0x28, 0xc6, 0x45, 0x4e, 0x54, 0x43, 0x18, 0xc6, 0x45, 0x4e, 0x54, 0x44, 0x2c, 0xc6, + 0x45, 0x4e, 0x54, 0x48, 0x30, 0xc6, 0x57, 0x57, 0x41, 0x54, 0xf0, 0xc5, 0x50, 0x4f, 0x4f, 0x4c, + 0x58, 0xc6, 0x57, 0x53, 0x48, 0x44, 0xf4, 0xc5, 0x47, 0x52, 0x41, 0x46, 0x44, 0xc6, 0x54, 0x52, + 0x41, 0x50, 0x48, 0xc6, 0x43, 0x44, 0x50, 0x45, 0x28, 0xc7, 0x44, 0x4c, 0x4f, 0x4b, 0x08, 0xc6, + 0x48, 0x4f, 0x4c, 0x45, 0x00, 0xc6, 0x44, 0x52, 0x59, 0x52, 0x0c, 0xc6, 0x48, 0x4f, 0x4c, 0x59, + 0xfc, 0xc5, 0x57, 0x41, 0x4c, 0x4c, 0x2c, 0xc7, 0x42, 0x4f, 0x4f, 0x4b, 0x08, 0xc8, 0x41, 0x58, + 0x45, 0x44, 0xb0, 0xc6, 0x53, 0x48, 0x4c, 0x44, 0x38, 0xc7, 0x42, 0x43, 0x4e, 0x59, 0xe8, 0xc5, + 0x4c, 0x49, 0x44, 0x43, 0xe4, 0xc5, 0x4c, 0x49, 0x44, 0x55, 0xe0, 0xc5, 0x4c, 0x49, 0x44, 0x4f, + 0xec, 0xc5, 0x50, 0x49, 0x50, 0x45, 0xa8, 0xc5, 0x42, 0x41, 0x4c, 0x43, 0x20, 0xc6, 0x57, 0x49, + 0x4e, 0x44, 0x1c, 0xc6, 0x50, 0x41, 0x50, 0x52, 0xb4, 0xc7, 0x55, 0x57, 0x54, 0x41, 0xa0, 0xc5, + 0x55, 0x57, 0x54, 0x42, 0xa0, 0xc5, 0x53, 0x54, 0x41, 0x54, 0xd8, 0xc7, 0x54, 0x4c, 0x49, 0x44, + 0x9c, 0xc5, 0x53, 0x4c, 0x41, 0x42, 0xd8, 0xc5, 0x43, 0x41, 0x52, 0x54, 0xdc, 0xc5, 0x46, 0x43, + 0x41, 0x52, 0xac, 0xc5, 0x53, 0x4c, 0x42, 0x41, 0xc0, 0xc5, 0x53, 0x4c, 0x42, 0x42, 0xc4, 0xc5, + 0x53, 0x4c, 0x42, 0x43, 0xcc, 0xc5, 0x53, 0x4c, 0x42, 0x44, 0xc8, 0xc5, 0x53, 0x4c, 0x42, 0x45, + 0xd0, 0xc5, 0x53, 0x4c, 0x42, 0x46, 0xd4, 0xc5, 0x50, 0x4c, 0x49, 0x4e, 0xb0, 0xc5, 0x4c, 0x41, + 0x44, 0x44, 0xb8, 0xc5, 0x4c, 0x41, 0x44, 0x42, 0xbc, 0xc5, 0x47, 0x55, 0x4d, 0x41, 0xb4, 0xc5, + 0x53, 0x51, 0x45, 0x45, 0x88, 0xc5, 0x54, 0x41, 0x50, 0x50, 0x8c, 0xc5, 0x47, 0x55, 0x49, 0x54, + 0x90, 0xc5, 0x43, 0x4f, 0x4e, 0x54, 0x94, 0xc5, 0x42, 0x45, 0x4c, 0x4c, 0x98, 0xc5, 0x8c, 0x8c, + 0x8c, 0x8c, 0x30, 0x30, 0x30, 0x30, 0x00, 0x30, 0x30, 0x00, 0x9d, 0x00, 0xb2, 0x00, 0x51, 0x00, + 0x5e, 0x00, 0x58, 0xc7, 0xb3, 0x00, 0xc8, 0x00, 0x51, 0x00, 0x5e, 0x00, 0x5c, 0xc7, 0xc9, 0x00, + 0xde, 0x00, 0x51, 0x00, 0x5e, 0x00, 0x60, 0xc7, 0x9d, 0x00, 0xb2, 0x00, 0x5f, 0x00, 0x70, 0x00, + 0x64, 0xc7, 0xb3, 0x00, 0xc8, 0x00, 0x5f, 0x00, 0x70, 0x00, 0x68, 0xc7, 0xc9, 0x00, 0xde, 0x00, + 0x5f, 0x00, 0x70, 0x00, 0x6c, 0xc7, 0x9d, 0x00, 0xb2, 0x00, 0x71, 0x00, 0x82, 0x00, 0x70, 0xc7, + 0xb3, 0x00, 0xc8, 0x00, 0x71, 0x00, 0x82, 0x00, 0x74, 0xc7, 0xc9, 0x00, 0xde, 0x00, 0x71, 0x00, + 0x82, 0x00, 0x78, 0xc7, 0x9d, 0x00, 0xb2, 0x00, 0x83, 0x00, 0x91, 0x00, 0x7c, 0xc7, 0xb3, 0x00, + 0xde, 0x00, 0x83, 0x00, 0x91, 0x00, 0x80, 0xc7, 0xdc, 0x00, 0xea, 0x00, 0x98, 0x00, 0xa6, 0x00, + 0x50, 0xc7, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0xae, 0x00, + 0xbc, 0x00, 0x84, 0x00, 0x94, 0x00, 0x50, 0xc7, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, + 0xa0, 0xca, 0xff, 0xff, 0x18, 0x01, 0x40, 0x01, 0xa0, 0x00, 0xc8, 0x00, 0x50, 0xc7, 0x8f, 0x00, + 0x2c, 0x01, 0x06, 0x00, 0xc2, 0x00, 0xb8, 0xc7, 0x00, 0x00, 0x8f, 0x00, 0x06, 0x00, 0xc2, 0x00, + 0xc0, 0xc7, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x68, 0x00, + 0x80, 0x00, 0x3a, 0x00, 0x48, 0x00, 0xdc, 0xc7, 0x40, 0x00, 0x74, 0x00, 0x4c, 0x00, 0x6a, 0x00, + 0xe0, 0xc7, 0x74, 0x00, 0xa8, 0x00, 0x4c, 0x00, 0x6a, 0x00, 0xe4, 0xc7, 0x40, 0x00, 0x74, 0x00, + 0x6a, 0x00, 0x88, 0x00, 0xe8, 0xc7, 0x74, 0x00, 0xa8, 0x00, 0x6a, 0x00, 0x88, 0x00, 0xec, 0xc7, + 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0xba, 0x00, 0xca, 0x00, + 0x9d, 0x00, 0xad, 0x00, 0x1c, 0xc8, 0xf3, 0x00, 0x03, 0x01, 0x83, 0x00, 0x93, 0x00, 0x18, 0xc8, + 0x0c, 0x01, 0x1c, 0x01, 0xa8, 0x00, 0xb8, 0x00, 0x50, 0xc7, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, + 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x77, 0x00, 0xae, 0x00, 0x52, 0x00, 0x80, 0x00, 0x34, 0xc8, + 0x46, 0x00, 0x89, 0x00, 0x3e, 0x00, 0x6f, 0x00, 0x80, 0xc8, 0xbc, 0x00, 0xfa, 0x00, 0x44, 0x00, + 0x98, 0x00, 0x4c, 0xc8, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, + 0xec, 0x00, 0xfc, 0x00, 0x70, 0x00, 0x80, 0x00, 0x48, 0xc8, 0xbc, 0x00, 0xfa, 0x00, 0x40, 0x00, + 0x98, 0x00, 0x58, 0xc8, 0x3e, 0x00, 0x98, 0x00, 0x38, 0x00, 0x85, 0x00, 0x74, 0xc8, 0x00, 0x00, + 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x77, 0x00, 0xae, 0x00, 0x52, 0x00, + 0x80, 0x00, 0x44, 0xc8, 0x46, 0x00, 0x8b, 0x00, 0x3e, 0x00, 0x6f, 0x00, 0x50, 0xc8, 0xec, 0x00, + 0xfc, 0x00, 0x70, 0x00, 0x80, 0x00, 0x48, 0xc8, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, + 0xa0, 0xca, 0xff, 0xff, 0xec, 0x00, 0xfc, 0x00, 0x70, 0x00, 0x80, 0x00, 0x48, 0xc8, 0xbc, 0x00, + 0xfa, 0x00, 0x40, 0x00, 0x98, 0x00, 0x54, 0xc8, 0x3e, 0x00, 0x98, 0x00, 0x38, 0x00, 0x85, 0x00, + 0x74, 0xc8, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x0d, 0x0a, + 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, + 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a, 0x55, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x20, 0x45, 0x78, 0x70, + 0x61, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2e, 0x0d, 0x0a, 0x0d, + 0x0a, 0x24, 0x0d, 0x0a, 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20, 0x68, + 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a, 0x53, 0x6f, + 0x75, 0x6e, 0x64, 0x20, 0x42, 0x6c, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x63, 0x61, 0x72, 0x64, + 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x61, 0x74, 0x20, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x32, 0x32, 0x30, 0x20, 0x48, 0x65, 0x78, 0x2e, 0x0d, 0x0a, + 0x0d, 0x0a, 0x24, 0x0d, 0x0a, 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20, + 0x68, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a, 0x4f, + 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x42, 0x61, 0x73, 0x65, 0x20, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x2e, 0x0d, 0x0a, 0x0d, 0x0a, 0x24, 0x0d, 0x0a, 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, + 0x77, 0x65, 0x62, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x3a, 0x0d, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x44, 0x65, 0x61, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x2e, 0x0d, + 0x0a, 0x0d, 0x0a, 0x24, 0x0d, 0x0a, 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, + 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a, + 0x41, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74, 0x20, 0x35, 0x39, 0x30, 0x4b, 0x20, 0x6f, 0x66, + 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x69, 0x73, 0x20, + 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x0d, 0x0a, 0x0d, 0x0a, 0x24, 0x0d, 0x0a, + 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, + 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a, 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x20, + 0x42, 0x6c, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, + 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x75, 0x70, 0x74, 0x20, 0x30, 0x0d, + 0x0a, 0x0d, 0x0a, 0x24, 0x0d, 0x0a, 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, + 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a, + 0x55, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x20, 0x45, 0x4d, 0x4d, 0x20, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x0d, 0x0a, 0x0d, 0x0a, 0x24, 0x0d, + 0x0a, 0x0d, 0x0a, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20, 0x68, 0x61, 0x73, 0x20, + 0x61, 0x6e, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x0d, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x20, + 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x2e, 0x63, 0x0d, 0x0a, 0x0d, 0x0a, 0x24, + 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x73, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x53, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x42, 0x6c, 0x61, 0x73, 0x74, 0x65, 0x72, + 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x0d, + 0x0a, 0x74, 0x68, 0x65, 0x20, 0x42, 0x4c, 0x41, 0x53, 0x54, 0x45, 0x52, 0x20, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x20, 0x28, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, 0x41, 0x55, 0x54, 0x4f, 0x45, + 0x58, 0x45, 0x43, 0x2e, 0x42, 0x41, 0x54, 0x29, 0x0d, 0x0a, 0x0d, 0x0a, 0x49, 0x66, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x49, 0x52, 0x51, 0x20, 0x37, 0x2c, 0x20, 0x44, 0x4d, 0x41, + 0x20, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, + 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x32, 0x32, 0x30, + 0x68, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x64, 0x2e, 0x0d, 0x0a, + 0x0d, 0x0a, 0x54, 0x6f, 0x20, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6f, + 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x0d, 0x0a, 0x6f, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x69, 0x6e, + 0x65, 0x2e, 0x20, 0x46, 0x6f, 0x72, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x3a, 0x0d, + 0x0a, 0x0d, 0x0a, 0x54, 0x79, 0x70, 0x65, 0x20, 0x20, 0x20, 0x20, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x20, 0x49, 0x37, 0x20, 0x41, 0x32, 0x32, 0x30, 0x20, 0x44, 0x31, 0x20, 0x20, + 0x20, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, + 0x62, 0x20, 0x6f, 0x6e, 0x20, 0x49, 0x52, 0x51, 0x20, 0x37, 0x2c, 0x20, 0x44, 0x4d, 0x41, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x20, 0x31, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x61, + 0x73, 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x32, 0x32, 0x30, 0x68, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, + 0x42, 0x20, 0x49, 0x35, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x20, 0x44, 0x72, 0x65, 0x61, 0x6d, 0x77, 0x65, 0x62, 0x20, + 0x6f, 0x6e, 0x20, 0x49, 0x52, 0x51, 0x20, 0x35, 0x20, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x6f, 0x66, 0x20, + 0x32, 0x32, 0x30, 0x68, 0x2c, 0x20, 0x44, 0x4d, 0x41, 0x20, 0x31, 0x0d, 0x0a, 0x0d, 0x0a, 0x24, + 0x0d, 0x0a, 0x0d, 0x0a, 0x54, 0x72, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x44, 0x72, 0x65, 0x61, + 0x6d, 0x77, 0x65, 0x62, 0x20, 0x43, 0x44, 0x20, 0x69, 0x6e, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20, + 0x73, 0x74, 0x65, 0x72, 0x65, 0x6f, 0x2e, 0x2e, 0x2e, 0x2e, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, + 0x24, 0x81, 0x00, 0xb8, 0x00, 0x52, 0x00, 0x80, 0x00, 0xc0, 0xc8, 0x50, 0x00, 0x93, 0x00, 0x3e, + 0x00, 0x6f, 0x00, 0x80, 0xc8, 0xb7, 0x00, 0xfa, 0x00, 0x3e, 0x00, 0x6f, 0x00, 0xc4, 0xc8, 0x00, + 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xa0, 0xca, 0xff, 0xff, 0x53, 0x50, 0x45, 0x45, 0x43, + 0x48, 0x52, 0x32, 0x34, 0x43, 0x30, 0x30, 0x30, 0x35, 0x2e, 0x52, 0x41, 0x57, 0x00, 0x87, 0x83, + 0x81, 0x82, 0x2c, 0x00, 0x46, 0x00, 0x20, 0x00, 0x2e, 0x00, 0x70, 0xc4, 0x00, 0x00, 0x32, 0x00, + 0x00, 0x00, 0xb4, 0x00, 0x7c, 0xc3, 0xe2, 0x00, 0xf4, 0x00, 0x0a, 0x00, 0x1a, 0x00, 0x28, 0xc8, + 0xe2, 0x00, 0xf4, 0x00, 0x1a, 0x00, 0x28, 0x00, 0x2c, 0xc8, 0xf0, 0x00, 0x04, 0x01, 0x64, 0x00, + 0x7c, 0x00, 0xcc, 0xc9, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xd4, 0xc9, 0xff, 0xff, + 0x2c, 0x00, 0x46, 0x00, 0x20, 0x00, 0x2e, 0x00, 0x70, 0xc4, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, + 0xb4, 0x00, 0x7c, 0xc3, 0x12, 0x01, 0x24, 0x01, 0x0a, 0x00, 0x1a, 0x00, 0x28, 0xc8, 0x12, 0x01, + 0x24, 0x01, 0x1a, 0x00, 0x28, 0x00, 0x2c, 0xc8, 0xf0, 0x00, 0x04, 0x01, 0x64, 0x00, 0x7c, 0x00, + 0xcc, 0xc9, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0xc8, 0x00, 0xd4, 0xc9, 0xff, 0xff, 0x00, 0x21, + 0x0a, 0x0f, 0xff, 0x00, 0x16, 0x0a, 0x0f, 0xff, 0x00, 0x16, 0x00, 0x0f, 0xff, 0x00, 0x0b, 0x00, + 0x0f, 0xff, 0x00, 0x0b, 0x0a, 0x0f, 0xff, 0x00, 0x00, 0x0a, 0x0f, 0xff, 0x01, 0x2c, 0x0a, 0x06, + 0xff, 0x01, 0x2c, 0x00, 0x0d, 0xff, 0x02, 0x21, 0x00, 0x06, 0xff, 0x02, 0x16, 0x00, 0x05, 0xff, + 0x02, 0x16, 0x0a, 0x10, 0xff, 0x02, 0x0b, 0x0a, 0x10, 0xff, 0x03, 0x2c, 0x00, 0x0f, 0xff, 0x03, + 0x21, 0x0a, 0x06, 0xff, 0x03, 0x21, 0x00, 0x05, 0xff, 0x04, 0x0b, 0x1e, 0x06, 0xff, 0x04, 0x16, + 0x1e, 0x05, 0xff, 0x04, 0x16, 0x14, 0x0d, 0xff, 0x0a, 0x21, 0x1e, 0x06, 0xff, 0x0a, 0x16, 0x1e, + 0x06, 0xff, 0x09, 0x16, 0x0a, 0x06, 0xff, 0x09, 0x16, 0x14, 0x10, 0xff, 0x09, 0x16, 0x1e, 0x10, + 0xff, 0x09, 0x16, 0x28, 0x10, 0xff, 0x09, 0x16, 0x32, 0x10, 0xff, 0x06, 0x0b, 0x1e, 0x06, 0xff, + 0x06, 0x00, 0x0a, 0x0f, 0xff, 0x06, 0x00, 0x14, 0x0f, 0xff, 0x06, 0x0b, 0x14, 0x0f, 0xff, 0x06, + 0x16, 0x14, 0x0f, 0xff, 0x07, 0x0b, 0x14, 0x06, 0xff, 0x07, 0x00, 0x14, 0x06, 0xff, 0x07, 0x00, + 0x1e, 0x06, 0xff, 0x37, 0x2c, 0x00, 0x05, 0xff, 0x37, 0x2c, 0x0a, 0x05, 0xff, 0x05, 0x16, 0x1e, + 0x06, 0xff, 0x05, 0x16, 0x14, 0x0f, 0xff, 0x05, 0x16, 0x0a, 0x0f, 0xff, 0x18, 0x16, 0x00, 0x0f, + 0xff, 0x18, 0x21, 0x00, 0x0f, 0xff, 0x18, 0x2c, 0x00, 0x0f, 0xff, 0x18, 0x21, 0x0a, 0x0f, 0xff, + 0x08, 0x00, 0x0a, 0x06, 0xff, 0x08, 0x0b, 0x0a, 0x06, 0xff, 0x08, 0x16, 0x0a, 0x06, 0xff, 0x08, + 0x21, 0x0a, 0x06, 0xff, 0x08, 0x21, 0x14, 0x06, 0xff, 0x08, 0x21, 0x1e, 0x06, 0xff, 0x08, 0x21, + 0x28, 0x06, 0xff, 0x08, 0x16, 0x28, 0x06, 0xff, 0x08, 0x0b, 0x28, 0x06, 0xff, 0x0b, 0x0b, 0x14, + 0x0c, 0xff, 0x0b, 0x0b, 0x1e, 0x0c, 0xff, 0x0b, 0x16, 0x14, 0x0c, 0xff, 0x0b, 0x16, 0x1e, 0x0c, + 0xff, 0x0c, 0x16, 0x14, 0x0c, 0xff, 0x0d, 0x16, 0x14, 0x0c, 0xff, 0x0d, 0x21, 0x14, 0x0c, 0xff, + 0x0e, 0x2c, 0x14, 0x0c, 0xff, 0x0e, 0x21, 0x00, 0x0c, 0xff, 0x0e, 0x21, 0x0a, 0x0c, 0xff, 0x0e, + 0x21, 0x14, 0x0c, 0xff, 0x0e, 0x21, 0x1e, 0x0c, 0xff, 0x0e, 0x21, 0x28, 0x0c, 0xff, 0x0e, 0x16, + 0x00, 0x10, 0xff, 0x13, 0x00, 0x00, 0x0c, 0xff, 0x14, 0x00, 0x14, 0x10, 0xff, 0x14, 0x00, 0x1e, + 0x10, 0xff, 0x14, 0x0b, 0x1e, 0x10, 0xff, 0x14, 0x00, 0x28, 0x10, 0xff, 0x14, 0x0b, 0x28, 0x10, + 0xff, 0x15, 0x0b, 0x0a, 0x0f, 0xff, 0x15, 0x0b, 0x14, 0x0f, 0xff, 0x15, 0x00, 0x14, 0x0f, 0xff, + 0x15, 0x16, 0x14, 0x0f, 0xff, 0x15, 0x21, 0x14, 0x0f, 0xff, 0x15, 0x2c, 0x14, 0x0f, 0xff, 0x15, + 0x2c, 0x0a, 0x0f, 0xff, 0x16, 0x16, 0x0a, 0x10, 0xff, 0x16, 0x16, 0x14, 0x10, 0xff, 0x17, 0x16, + 0x1e, 0x0d, 0xff, 0x17, 0x16, 0x28, 0x0d, 0xff, 0x17, 0x21, 0x28, 0x0d, 0xff, 0x17, 0x0b, 0x28, + 0x0d, 0xff, 0x17, 0x00, 0x28, 0x0d, 0xff, 0x17, 0x00, 0x32, 0x0d, 0xff, 0x19, 0x0b, 0x28, 0x10, + 0xff, 0x19, 0x0b, 0x32, 0x10, 0xff, 0x19, 0x00, 0x32, 0x10, 0xff, 0x1b, 0x0b, 0x14, 0x10, 0xff, + 0x1b, 0x0b, 0x1e, 0x10, 0xff, 0x1d, 0x0b, 0x0a, 0x10, 0xff, 0x2d, 0x16, 0x1e, 0x0c, 0xff, 0x2d, + 0x16, 0x28, 0x0c, 0xff, 0x2d, 0x16, 0x32, 0x0c, 0xff, 0x2e, 0x16, 0x28, 0x0c, 0xff, 0x2e, 0x0b, + 0x32, 0x0c, 0xff, 0x2e, 0x16, 0x32, 0x0c, 0xff, 0x2e, 0x21, 0x32, 0x0c, 0xff, 0x2f, 0x00, 0x00, + 0x0c, 0xff, 0x1a, 0x16, 0x14, 0x10, 0xff, 0x1a, 0x21, 0x0a, 0x10, 0xff, 0x1a, 0x21, 0x14, 0x10, + 0xff, 0x1a, 0x21, 0x1e, 0x10, 0xff, 0x1a, 0x2c, 0x1e, 0x10, 0xff, 0x1a, 0x16, 0x1e, 0x10, 0xff, + 0x1a, 0x0b, 0x1e, 0x10, 0xff, 0x1a, 0x0b, 0x14, 0x10, 0xff, 0x1a, 0x00, 0x14, 0x10, 0xff, 0x1a, + 0x0b, 0x28, 0x10, 0xff, 0x1a, 0x00, 0x28, 0x10, 0xff, 0x1a, 0x16, 0x28, 0x10, 0xff, 0x1a, 0x0b, + 0x32, 0x10, 0xff, 0x1c, 0x00, 0x1e, 0x0f, 0xff, 0x1c, 0x00, 0x14, 0x0f, 0xff, 0x1c, 0x00, 0x28, + 0x0f, 0xff, 0x1c, 0x0b, 0x1e, 0x0f, 0xff, 0x1c, 0x0b, 0x14, 0x0f, 0xff, 0x1c, 0x16, 0x1e, 0x0f, + 0xff, 0x1c, 0x16, 0x14, 0x0f, 0xff, 0xff, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x20, 0x4e, 0x41, + 0x4d, 0x45, 0x20, 0x4f, 0x4e, 0x45, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, + 0x10, 0x12, 0x12, 0x11, 0x10, 0x10, 0x10, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, + 0x37, 0x38, 0x39, 0x30, 0x2d, 0x00, 0x08, 0x00, 0x51, 0x57, 0x45, 0x52, 0x54, 0x59, 0x55, 0x49, + 0x4f, 0x50, 0x00, 0x00, 0x0d, 0x00, 0x41, 0x53, 0x44, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4c, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5a, 0x58, 0x43, 0x56, 0x42, 0x4e, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x3a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x20, 0x44, 0x41, 0x54, 0x41, 0x20, 0x46, 0x49, 0x4c, 0x45, 0x20, 0x43, 0x4f, + 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x20, 0x31, 0x39, 0x39, 0x32, 0x20, 0x43, 0x52, 0x45, + 0x41, 0x54, 0x49, 0x56, 0x45, 0x20, 0x52, 0x45, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x30, 0x00, 0x05, 0xff, 0x21, 0x0a, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x06, 0x02, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x31, 0x00, 0x01, 0xff, 0x2c, 0x0a, 0xff, 0xff, 0xff, 0x00, + 0x07, 0x02, 0xff, 0xff, 0xff, 0xff, 0x06, 0xff, 0xff, 0xff, 0x01, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x32, 0x00, 0x02, 0xff, 0x21, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x00, 0xff, 0xff, 0x01, 0xff, 0x03, 0xff, 0xff, 0xff, 0x02, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x33, 0x00, 0x05, 0xff, 0x21, 0x0a, 0xff, 0xff, 0xff, 0x00, + 0x02, 0x02, 0x00, 0x02, 0x04, 0xff, 0x00, 0xff, 0xff, 0xff, 0x03, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x34, 0x00, 0x17, 0xff, 0x0b, 0x1e, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x04, 0x00, 0x05, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x04, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x35, 0x00, 0x05, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x02, 0x00, 0x04, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0x05, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x36, 0x00, 0x05, 0xff, 0x0b, 0x1e, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x00, 0x00, 0x01, 0x02, 0xff, 0x00, 0xff, 0xff, 0xff, 0x06, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x37, 0x00, 0xff, 0xff, 0x00, 0x14, 0xff, 0xff, 0xff, 0x00, + 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x07, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x38, 0x00, 0x08, 0xff, 0x00, 0x0a, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x02, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0b, 0x28, 0x00, 0x08, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x39, 0x00, 0x09, 0xff, 0x16, 0x0a, 0xff, 0xff, 0xff, 0x00, + 0x04, 0x06, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x09, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x30, 0x00, 0x0a, 0xff, 0x21, 0x1e, 0xff, 0xff, 0xff, 0x00, + 0x02, 0x00, 0xff, 0xff, 0x02, 0x02, 0x04, 0x16, 0x1e, 0xff, 0x0a, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x31, 0x00, 0x0b, 0xff, 0x0b, 0x14, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x32, 0x00, 0x0c, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x33, 0x00, 0x0c, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0d, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x34, 0x00, 0x0e, 0xff, 0x2c, 0x14, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x39, 0x00, 0x13, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x30, 0x00, 0x16, 0xff, 0x00, 0x14, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x04, 0x02, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x31, 0x00, 0x05, 0xff, 0x0b, 0x0a, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x04, 0x02, 0x0f, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x15, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x32, 0x00, 0x16, 0xff, 0x16, 0x0a, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x04, 0xff, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x33, 0x00, 0x17, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x04, 0x02, 0x0f, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0x17, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x34, 0x00, 0x05, 0xff, 0x2c, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x06, 0x02, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x18, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x35, 0x00, 0x16, 0xff, 0x0b, 0x28, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x19, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x36, 0x00, 0x09, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00, + 0x04, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x37, 0x00, 0x16, 0xff, 0x0b, 0x14, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1b, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x38, 0x00, 0x05, 0xff, 0x0b, 0x1e, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x39, 0x00, 0x16, 0xff, 0x0b, 0x0a, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1d, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x35, 0x00, 0x05, 0xff, 0x16, 0x0a, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x04, 0x01, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x05, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x34, 0x00, 0x17, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x04, 0x02, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x30, 0x00, 0x0a, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00, + 0x03, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x32, 0x00, 0x0c, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x33, 0x00, 0x05, 0xff, 0x2c, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x06, 0x02, 0xff, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x34, 0x00, 0x05, 0xff, 0x16, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x03, 0x06, 0x00, 0xff, 0xff, 0xff, 0xff, 0x21, 0x00, 0x03, 0x18, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x32, 0x00, 0x16, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x32, 0x00, 0x16, 0xff, 0x16, 0x14, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x31, 0x00, 0x0b, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0b, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x38, 0x00, 0x05, 0xff, 0x0b, 0x14, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x06, 0xff, 0xff, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1c, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x31, 0x00, 0x05, 0xff, 0x0b, 0x0a, 0xff, 0xff, 0xff, 0x00, + 0x01, 0x04, 0x02, 0x0f, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x15, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x32, 0x36, 0x00, 0x09, 0xff, 0x00, 0x28, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1a, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x31, 0x39, 0x00, 0x13, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x02, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x13, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x38, 0x00, 0x08, 0xff, 0x0b, 0x28, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x08, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x30, 0x31, 0x00, 0x01, 0xff, 0x2c, 0x0a, 0xff, 0xff, 0xff, 0x00, + 0x03, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x34, 0x35, 0x00, 0x23, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x06, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x34, 0x36, 0x00, 0x23, 0xff, 0x16, 0x28, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2e, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x34, 0x37, 0x00, 0x23, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x34, 0x35, 0x00, 0x23, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00, + 0x04, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2d, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x34, 0x36, 0x00, 0x23, 0xff, 0x16, 0x32, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x2e, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x35, 0x30, 0x00, 0x23, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x32, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x35, 0x31, 0x00, 0x23, 0xff, 0x0b, 0x1e, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x33, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x35, 0x32, 0x00, 0x23, 0xff, 0x16, 0x1e, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x35, 0x33, 0x00, 0x23, 0xff, 0x21, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x35, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x35, 0x34, 0x00, 0x23, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x36, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x52, 0x35, 0x35, 0x00, 0x0e, 0xff, 0x2c, 0x00, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x02, 0x04, + 0x01, 0x0a, 0x09, 0x08, 0x06, 0x0b, 0x04, 0x07, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, + 0x45, 0x42, 0x2e, 0x44, 0x30, 0x30, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, + 0x44, 0x30, 0x31, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x44, 0x30, 0x32, + 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x44, 0x30, 0x33, 0x00, 0x44, 0x52, + 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x44, 0x30, 0x34, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, + 0x57, 0x45, 0x42, 0x2e, 0x44, 0x30, 0x35, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, + 0x2e, 0x44, 0x30, 0x36, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x2e, 0x44, 0x45, + 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, }; + ds.assign(src, src + sizeof(src)); +dreamweb(); +} + +void DreamGenContext::__dispatch_call(uint16 addr) { + switch(addr) { + case 0xc000: alleybarksound(); break; + case 0xc004: intromusic(); break; + case 0xc008: foghornsound(); break; + case 0xc00c: receptionist(); break; + case 0xc010: smokebloke(); break; + case 0xc014: attendant(); break; + case 0xc018: manasleep(); break; + case 0xc01c: eden(); break; + case 0xc020: edeninbath(); break; + case 0xc024: malefan(); break; + case 0xc028: femalefan(); break; + case 0xc02c: louis(); break; + case 0xc030: louischair(); break; + case 0xc034: manasleep2(); break; + case 0xc038: mansatstill(); break; + case 0xc03c: tattooman(); break; + case 0xc040: drinker(); break; + case 0xc044: bartender(); break; + case 0xc048: othersmoker(); break; + case 0xc04c: barwoman(); break; + case 0xc050: interviewer(); break; + case 0xc054: soldier1(); break; + case 0xc058: rockstar(); break; + case 0xc05c: helicopter(); break; + case 0xc060: mugger(); break; + case 0xc064: aide(); break; + case 0xc068: businessman(); break; + case 0xc06c: poolguard(); break; + case 0xc070: security(); break; + case 0xc074: heavy(); break; + case 0xc078: bossman(); break; + case 0xc07c: gamer(); break; + case 0xc080: sparkydrip(); break; + case 0xc084: carparkdrip(); break; + case 0xc088: keeper(); break; + case 0xc08c: candles1(); break; + case 0xc090: smallcandle(); break; + case 0xc094: intromagic1(); break; + case 0xc098: candles(); break; + case 0xc09c: candles2(); break; + case 0xc0a0: gates(); break; + case 0xc0a4: intromagic2(); break; + case 0xc0a8: intromagic3(); break; + case 0xc0ac: intromonks1(); break; + case 0xc0b0: intromonks2(); break; + case 0xc0b4: handclap(); break; + case 0xc0b8: monks2text(); break; + case 0xc0bc: intro1text(); break; + case 0xc0c0: intro2text(); break; + case 0xc0c4: intro3text(); break; + case 0xc0c8: monkandryan(); break; + case 0xc0cc: endgameseq(); break; + case 0xc0d0: rollendcredits(); break; + case 0xc0d4: priest(); break; + case 0xc0d8: madmanstelly(); break; + case 0xc0dc: madman(); break; + case 0xc0e0: madmantext(); break; + case 0xc0e4: madmode(); break; + case 0xc0e8: priesttext(); break; + case 0xc0ec: textforend(); break; + case 0xc0f0: textformonk(); break; + case 0xc0f4: drunk(); break; + case 0xc0f8: advisor(); break; + case 0xc0fc: copper(); break; + case 0xc100: sparky(); break; + case 0xc104: train(); break; + case 0xc108: addtopeoplelist(); break; + case 0xc10c: showgamereel(); break; + case 0xc110: checkspeed(); break; + case 0xc114: clearsprites(); break; + case 0xc118: makesprite(); break; + case 0xc11c: delsprite(); break; + case 0xc120: spriteupdate(); break; + case 0xc124: printsprites(); break; + case 0xc128: printasprite(); break; + case 0xc12c: checkone(); break; + case 0xc130: findsource(); break; + case 0xc134: initman(); break; + case 0xc138: mainman(); break; + case 0xc13c: aboutturn(); break; + case 0xc140: walking(); break; + case 0xc144: facerightway(); break; + case 0xc148: checkforexit(); break; + case 0xc14c: adjustdown(); break; + case 0xc150: adjustup(); break; + case 0xc154: adjustleft(); break; + case 0xc158: adjustright(); break; + case 0xc15c: reminders(); break; + case 0xc160: initrain(); break; + case 0xc164: splitintolines(); break; + case 0xc168: getblockofpixel(); break; + case 0xc16c: showrain(); break; + case 0xc170: backobject(); break; + case 0xc174: liftsprite(); break; + case 0xc178: liftnoise(); break; + case 0xc17c: random(); break; + case 0xc180: steady(); break; + case 0xc184: constant(); break; + case 0xc188: doorway(); break; + case 0xc18c: widedoor(); break; + case 0xc190: dodoor(); break; + case 0xc194: lockeddoorway(); break; + case 0xc198: updatepeople(); break; + case 0xc19c: getreelframeax(); break; + case 0xc1a0: reelsonscreen(); break; + case 0xc1a4: plotreel(); break; + case 0xc1a8: soundonreels(); break; + case 0xc1ac: reconstruct(); break; + case 0xc1b0: dealwithspecial(); break; + case 0xc1b4: movemap(); break; + case 0xc1b8: getreelstart(); break; + case 0xc1bc: showreelframe(); break; + case 0xc1c0: deleverything(); break; + case 0xc1c4: dumpeverything(); break; + case 0xc1c8: allocatework(); break; + case 0xc1cc: showpcx(); break; + case 0xc1d8: loadpalfromiff(); break; + case 0xc1dc: setmode(); break; + case 0xc1ec: paneltomap(); break; + case 0xc1f0: maptopanel(); break; + case 0xc1f4: dumpmap(); break; + case 0xc1f8: pixelcheckset(); break; + case 0xc1fc: createpanel(); break; + case 0xc200: createpanel2(); break; + case 0xc204: clearwork(); break; + case 0xc208: vsync(); break; + case 0xc20c: doshake(); break; + case 0xc210: zoom(); break; + case 0xc214: delthisone(); break; + case 0xc228: doblocks(); break; + case 0xc22c: showframe(); break; + case 0xc230: frameoutv(); break; + case 0xc238: frameoutbh(); break; + case 0xc23c: frameoutfx(); break; + case 0xc240: transferinv(); break; + case 0xc244: transfermap(); break; + case 0xc248: fadedos(); break; + case 0xc24c: dofade(); break; + case 0xc250: clearendpal(); break; + case 0xc254: clearpalette(); break; + case 0xc258: fadescreenup(); break; + case 0xc25c: fadetowhite(); break; + case 0xc260: fadefromwhite(); break; + case 0xc264: fadescreenups(); break; + case 0xc268: fadescreendownhalf(); break; + case 0xc26c: fadescreenuphalf(); break; + case 0xc270: fadescreendown(); break; + case 0xc274: fadescreendowns(); break; + case 0xc278: clearstartpal(); break; + case 0xc27c: showgun(); break; + case 0xc280: rollendcredits2(); break; + case 0xc284: rollem(); break; + case 0xc288: fadecalculation(); break; + case 0xc28c: greyscalesum(); break; + case 0xc290: showgroup(); break; + case 0xc294: paltostartpal(); break; + case 0xc298: endpaltostart(); break; + case 0xc29c: startpaltoend(); break; + case 0xc2a0: paltoendpal(); break; + case 0xc2a4: allpalette(); break; + case 0xc2a8: dumpcurrent(); break; + case 0xc2ac: fadedownmon(); break; + case 0xc2b0: fadeupmon(); break; + case 0xc2b4: fadeupmonfirst(); break; + case 0xc2b8: fadeupyellows(); break; + case 0xc2bc: initialmoncols(); break; + case 0xc2c0: titles(); break; + case 0xc2c4: endgame(); break; + case 0xc2c8: monkspeaking(); break; + case 0xc2cc: showmonk(); break; + case 0xc2d0: gettingshot(); break; + case 0xc2d4: credits(); break; + case 0xc2d8: biblequote(); break; + case 0xc2dc: hangone(); break; + case 0xc2e0: intro(); break; + case 0xc2e4: runintroseq(); break; + case 0xc2e8: runendseq(); break; + case 0xc2ec: loadintroroom(); break; + case 0xc2f0: mode640x480(); break; + case 0xc2f4: set16colpalette(); break; + case 0xc2f8: realcredits(); break; + case 0xc2fc: printchar(); break; + case 0xc300: kernchars(); break; + case 0xc304: printslow(); break; + case 0xc308: waitframes(); break; + case 0xc30c: printboth(); break; + case 0xc310: printdirect(); break; + case 0xc314: monprint(); break; + case 0xc318: getnumber(); break; + case 0xc31c: getnextword(); break; + case 0xc320: fillryan(); break; + case 0xc324: fillopen(); break; + case 0xc328: findallryan(); break; + case 0xc32c: findallopen(); break; + case 0xc330: obtoinv(); break; + case 0xc334: isitworn(); break; + case 0xc338: makeworn(); break; + case 0xc33c: examineob(); break; + case 0xc340: makemainscreen(); break; + case 0xc344: getbackfromob(); break; + case 0xc348: incryanpage(); break; + case 0xc34c: openinv(); break; + case 0xc350: showryanpage(); break; + case 0xc354: openob(); break; + case 0xc358: obicons(); break; + case 0xc35c: examicon(); break; + case 0xc360: obpicture(); break; + case 0xc364: describeob(); break; + case 0xc368: additionaltext(); break; + case 0xc36c: obsthatdothings(); break; + case 0xc370: getobtextstart(); break; + case 0xc374: searchforsame(); break; + case 0xc378: findnextcolon(); break; + case 0xc37c: inventory(); break; + case 0xc380: setpickup(); break; + case 0xc384: examinventory(); break; + case 0xc388: reexfrominv(); break; + case 0xc38c: reexfromopen(); break; + case 0xc390: swapwithinv(); break; + case 0xc394: swapwithopen(); break; + case 0xc398: intoinv(); break; + case 0xc39c: deletetaken(); break; + case 0xc3a0: outofinv(); break; + case 0xc3a4: getfreead(); break; + case 0xc3a8: getexad(); break; + case 0xc3ac: geteitherad(); break; + case 0xc3b0: getanyad(); break; + case 0xc3b4: getanyaddir(); break; + case 0xc3b8: getopenedsize(); break; + case 0xc3bc: getsetad(); break; + case 0xc3c0: findinvpos(); break; + case 0xc3c4: findopenpos(); break; + case 0xc3c8: dropobject(); break; + case 0xc3cc: droperror(); break; + case 0xc3d0: cantdrop(); break; + case 0xc3d4: wornerror(); break; + case 0xc3d8: removeobfrominv(); break; + case 0xc3dc: selectopenob(); break; + case 0xc3e0: useopened(); break; + case 0xc3e4: errormessage1(); break; + case 0xc3e8: errormessage2(); break; + case 0xc3ec: errormessage3(); break; + case 0xc3f0: checkobjectsize(); break; + case 0xc3f4: outofopen(); break; + case 0xc3f8: transfertoex(); break; + case 0xc3fc: pickupconts(); break; + case 0xc400: transfercontoex(); break; + case 0xc404: transfertext(); break; + case 0xc408: getexpos(); break; + case 0xc40c: purgealocation(); break; + case 0xc410: emergencypurge(); break; + case 0xc414: purgeanitem(); break; + case 0xc418: deleteexobject(); break; + case 0xc41c: deleteexframe(); break; + case 0xc420: deleteextext(); break; + case 0xc424: blockget(); break; + case 0xc428: drawfloor(); break; + case 0xc42c: calcmapad(); break; + case 0xc430: getdimension(); break; + case 0xc434: addalong(); break; + case 0xc438: addlength(); break; + case 0xc43c: drawflags(); break; + case 0xc440: eraseoldobs(); break; + case 0xc444: showallobs(); break; + case 0xc448: makebackob(); break; + case 0xc44c: showallfree(); break; + case 0xc450: showallex(); break; + case 0xc454: calcfrframe(); break; + case 0xc458: finalframe(); break; + case 0xc45c: adjustlen(); break; + case 0xc460: getmapad(); break; + case 0xc464: getxad(); break; + case 0xc468: getyad(); break; + case 0xc46c: autolook(); break; + case 0xc470: look(); break; + case 0xc474: dolook(); break; + case 0xc478: redrawmainscrn(); break; + case 0xc47c: getback1(); break; + case 0xc480: talk(); break; + case 0xc484: convicons(); break; + case 0xc488: getpersframe(); break; + case 0xc48c: starttalk(); break; + case 0xc490: getpersontext(); break; + case 0xc494: moretalk(); break; + case 0xc498: dosometalk(); break; + case 0xc49c: hangonpq(); break; + case 0xc4a0: redes(); break; + case 0xc4a4: newplace(); break; + case 0xc4a8: selectlocation(); break; + case 0xc4ac: showcity(); break; + case 0xc4b0: lookatplace(); break; + case 0xc4b4: getundercentre(); break; + case 0xc4b8: putundercentre(); break; + case 0xc4bc: locationpic(); break; + case 0xc4c0: getdestinfo(); break; + case 0xc4c4: showarrows(); break; + case 0xc4c8: nextdest(); break; + case 0xc4cc: lastdest(); break; + case 0xc4d0: destselect(); break; + case 0xc4d4: getlocation(); break; + case 0xc4d8: setlocation(); break; + case 0xc4dc: resetlocation(); break; + case 0xc4e0: readdesticon(); break; + case 0xc4e4: readcitypic(); break; + case 0xc4e8: usemon(); break; + case 0xc4ec: printoutermon(); break; + case 0xc4f0: loadpersonal(); break; + case 0xc4f4: loadnews(); break; + case 0xc4f8: loadcart(); break; + case 0xc4fc: lookininterface(); break; + case 0xc500: turnonpower(); break; + case 0xc504: randomaccess(); break; + case 0xc508: powerlighton(); break; + case 0xc50c: powerlightoff(); break; + case 0xc510: accesslighton(); break; + case 0xc514: accesslightoff(); break; + case 0xc518: locklighton(); break; + case 0xc51c: locklightoff(); break; + case 0xc520: input(); break; + case 0xc524: makecaps(); break; + case 0xc528: delchar(); break; + case 0xc52c: execcommand(); break; + case 0xc530: neterror(); break; + case 0xc534: dircom(); break; + case 0xc538: searchforfiles(); break; + case 0xc53c: signon(); break; + case 0xc540: showkeys(); break; + case 0xc544: read(); break; + case 0xc548: dirfile(); break; + case 0xc54c: getkeyandlogo(); break; + case 0xc550: searchforstring(); break; + case 0xc554: parser(); break; + case 0xc558: scrollmonitor(); break; + case 0xc55c: lockmon(); break; + case 0xc560: monitorlogo(); break; + case 0xc564: printlogo(); break; + case 0xc568: showcurrentfile(); break; + case 0xc56c: monmessage(); break; + case 0xc570: processtrigger(); break; + case 0xc574: triggermessage(); break; + case 0xc578: printcurs(); break; + case 0xc57c: delcurs(); break; + case 0xc580: useobject(); break; + case 0xc584: useroutine(); break; + case 0xc588: wheelsound(); break; + case 0xc58c: runtap(); break; + case 0xc590: playguitar(); break; + case 0xc594: hotelcontrol(); break; + case 0xc598: hotelbell(); break; + case 0xc59c: opentomb(); break; + case 0xc5a0: usetrainer(); break; + case 0xc5a4: nothelderror(); break; + case 0xc5a8: usepipe(); break; + case 0xc5ac: usefullcart(); break; + case 0xc5b0: useplinth(); break; + case 0xc5b4: chewy(); break; + case 0xc5b8: useladder(); break; + case 0xc5bc: useladderb(); break; + case 0xc5c0: slabdoora(); break; + case 0xc5c4: slabdoorb(); break; + case 0xc5c8: slabdoord(); break; + case 0xc5cc: slabdoorc(); break; + case 0xc5d0: slabdoore(); break; + case 0xc5d4: slabdoorf(); break; + case 0xc5d8: useslab(); break; + case 0xc5dc: usecart(); break; + case 0xc5e0: useclearbox(); break; + case 0xc5e4: usecoveredbox(); break; + case 0xc5e8: userailing(); break; + case 0xc5ec: useopenbox(); break; + case 0xc5f0: wearwatch(); break; + case 0xc5f4: wearshades(); break; + case 0xc5f8: sitdowninbar(); break; + case 0xc5fc: usechurchhole(); break; + case 0xc600: usehole(); break; + case 0xc604: usealtar(); break; + case 0xc608: opentvdoor(); break; + case 0xc60c: usedryer(); break; + case 0xc610: openlouis(); break; + case 0xc614: nextcolon(); break; + case 0xc618: openyourneighbour(); break; + case 0xc61c: usewindow(); break; + case 0xc620: usebalcony(); break; + case 0xc624: openryan(); break; + case 0xc628: openpoolboss(); break; + case 0xc62c: openeden(); break; + case 0xc630: opensarters(); break; + case 0xc634: isitright(); break; + case 0xc638: drawitall(); break; + case 0xc63c: openhoteldoor(); break; + case 0xc640: openhoteldoor2(); break; + case 0xc644: grafittidoor(); break; + case 0xc648: trapdoor(); break; + case 0xc64c: callhotellift(); break; + case 0xc650: calledenslift(); break; + case 0xc654: calledensdlift(); break; + case 0xc658: usepoolreader(); break; + case 0xc65c: uselighter(); break; + case 0xc660: showseconduse(); break; + case 0xc664: usecardreader1(); break; + case 0xc668: usecardreader2(); break; + case 0xc66c: usecardreader3(); break; + case 0xc670: usecashcard(); break; + case 0xc674: lookatcard(); break; + case 0xc678: moneypoke(); break; + case 0xc67c: usecontrol(); break; + case 0xc680: usehatch(); break; + case 0xc684: usewire(); break; + case 0xc688: usehandle(); break; + case 0xc68c: useelevator1(); break; + case 0xc690: showfirstuse(); break; + case 0xc694: useelevator3(); break; + case 0xc698: useelevator4(); break; + case 0xc69c: useelevator2(); break; + case 0xc6a0: useelevator5(); break; + case 0xc6a4: usekey(); break; + case 0xc6a8: usestereo(); break; + case 0xc6ac: usecooker(); break; + case 0xc6b0: useaxe(); break; + case 0xc6b4: useelvdoor(); break; + case 0xc6b8: withwhat(); break; + case 0xc6bc: selectob(); break; + case 0xc6c0: compare(); break; + case 0xc6c4: findsetobject(); break; + case 0xc6c8: findexobject(); break; + case 0xc6cc: isryanholding(); break; + case 0xc6d0: checkinside(); break; + case 0xc6d4: usetext(); break; + case 0xc6d8: putbackobstuff(); break; + case 0xc6dc: showpuztext(); break; + case 0xc6e0: findpuztext(); break; + case 0xc6e4: placesetobject(); break; + case 0xc6e8: removesetobject(); break; + case 0xc6ec: issetobonmap(); break; + case 0xc6f0: placefreeobject(); break; + case 0xc6f4: removefreeobject(); break; + case 0xc6f8: findormake(); break; + case 0xc6fc: switchryanon(); break; + case 0xc700: switchryanoff(); break; + case 0xc704: setallchanges(); break; + case 0xc708: dochange(); break; + case 0xc70c: autoappear(); break; + case 0xc710: getundertimed(); break; + case 0xc714: putundertimed(); break; + case 0xc718: dumptimedtext(); break; + case 0xc71c: setuptimeduse(); break; + case 0xc720: setuptimedtemp(); break; + case 0xc724: usetimedtext(); break; + case 0xc728: edenscdplayer(); break; + case 0xc72c: usewall(); break; + case 0xc730: usechurchgate(); break; + case 0xc734: usegun(); break; + case 0xc738: useshield(); break; + case 0xc73c: usebuttona(); break; + case 0xc740: useplate(); break; + case 0xc744: usewinch(); break; + case 0xc748: entercode(); break; + case 0xc74c: loadkeypad(); break; + case 0xc750: quitkey(); break; + case 0xc754: addtopresslist(); break; + case 0xc758: buttonone(); break; + case 0xc75c: buttontwo(); break; + case 0xc760: buttonthree(); break; + case 0xc764: buttonfour(); break; + case 0xc768: buttonfive(); break; + case 0xc76c: buttonsix(); break; + case 0xc770: buttonseven(); break; + case 0xc774: buttoneight(); break; + case 0xc778: buttonnine(); break; + case 0xc77c: buttonnought(); break; + case 0xc780: buttonenter(); break; + case 0xc784: buttonpress(); break; + case 0xc788: showouterpad(); break; + case 0xc78c: showkeypad(); break; + case 0xc790: singlekey(); break; + case 0xc794: dumpkeypad(); break; + case 0xc798: usemenu(); break; + case 0xc79c: dumpmenu(); break; + case 0xc7a0: getundermenu(); break; + case 0xc7a4: putundermenu(); break; + case 0xc7a8: showoutermenu(); break; + case 0xc7ac: showmenu(); break; + case 0xc7b0: loadmenu(); break; + case 0xc7b4: viewfolder(); break; + case 0xc7b8: nextfolder(); break; + case 0xc7bc: folderhints(); break; + case 0xc7c0: lastfolder(); break; + case 0xc7c4: loadfolder(); break; + case 0xc7c8: showfolder(); break; + case 0xc7cc: folderexit(); break; + case 0xc7d0: showleftpage(); break; + case 0xc7d4: showrightpage(); break; + case 0xc7d8: entersymbol(); break; + case 0xc7dc: quitsymbol(); break; + case 0xc7e0: settopleft(); break; + case 0xc7e4: settopright(); break; + case 0xc7e8: setbotleft(); break; + case 0xc7ec: setbotright(); break; + case 0xc7f0: dumpsymbol(); break; + case 0xc7f4: showsymbol(); break; + case 0xc7f8: nextsymbol(); break; + case 0xc7fc: updatesymboltop(); break; + case 0xc800: updatesymbolbot(); break; + case 0xc804: dumpsymbox(); break; + case 0xc808: usediary(); break; + case 0xc80c: showdiary(); break; + case 0xc810: showdiarykeys(); break; + case 0xc814: dumpdiarykeys(); break; + case 0xc818: diarykeyp(); break; + case 0xc81c: diarykeyn(); break; + case 0xc820: showdiarypage(); break; + case 0xc824: findtext1(); break; + case 0xc828: zoomonoff(); break; + case 0xc82c: saveload(); break; + case 0xc830: dosaveload(); break; + case 0xc834: getbackfromops(); break; + case 0xc838: showmainops(); break; + case 0xc83c: showdiscops(); break; + case 0xc840: loadsavebox(); break; + case 0xc844: loadgame(); break; + case 0xc848: getbacktoops(); break; + case 0xc84c: discops(); break; + case 0xc850: savegame(); break; + case 0xc854: actualsave(); break; + case 0xc858: actualload(); break; + case 0xc85c: selectslot2(); break; + case 0xc860: checkinput(); break; + case 0xc864: getnamepos(); break; + case 0xc868: showopbox(); break; + case 0xc86c: showloadops(); break; + case 0xc870: showsaveops(); break; + case 0xc874: selectslot(); break; + case 0xc878: showslots(); break; + case 0xc87c: shownames(); break; + case 0xc880: dosreturn(); break; + case 0xc884: error(); break; + case 0xc888: namestoold(); break; + case 0xc88c: oldtonames(); break; + case 0xc890: savefilewrite(); break; + case 0xc894: savefileread(); break; + case 0xc898: saveposition(); break; + case 0xc89c: loadposition(); break; + case 0xc8a0: loadseg(); break; + case 0xc8a4: makeheader(); break; + case 0xc8a8: storeit(); break; + case 0xc8ac: saveseg(); break; + case 0xc8b0: findlen(); break; + case 0xc8b4: scanfornames(); break; + case 0xc8b8: decide(); break; + case 0xc8bc: showdecisions(); break; + case 0xc8c0: newgame(); break; + case 0xc8c4: loadold(); break; + case 0xc8c8: loadspeech(); break; + case 0xc8cc: createname(); break; + case 0xc8d0: loadsample(); break; + case 0xc8d4: loadsecondsample(); break; + case 0xc8d8: soundstartup(); break; + case 0xc8dc: trysoundalloc(); break; + case 0xc8e0: setsoundoff(); break; + case 0xc8e4: checksoundint(); break; + case 0xc8e8: enablesoundint(); break; + case 0xc8ec: disablesoundint(); break; + case 0xc8f0: interupttest(); break; + case 0xc8f4: soundend(); break; + case 0xc8f8: out22c(); break; + case 0xc8fc: playchannel0(); break; + case 0xc900: playchannel1(); break; + case 0xc904: makenextblock(); break; + case 0xc908: volumeadjust(); break; + case 0xc90c: loopchannel0(); break; + case 0xc910: cancelch0(); break; + case 0xc914: cancelch1(); break; + case 0xc918: channel0only(); break; + case 0xc91c: channel1only(); break; + case 0xc920: channel0tran(); break; + case 0xc924: bothchannels(); break; + case 0xc928: saveems(); break; + case 0xc92c: restoreems(); break; + case 0xc930: domix(); break; + case 0xc934: dmaend(); break; + case 0xc938: startdmablock(); break; + case 0xc93c: setuppit(); break; + case 0xc940: getridofpit(); break; + case 0xc944: pitinterupt(); break; + case 0xc948: dreamweb(); break; + case 0xc94c: entrytexts(); break; + case 0xc950: entryanims(); break; + case 0xc954: initialinv(); break; + case 0xc958: pickupob(); break; + case 0xc95c: setupemm(); break; + case 0xc960: removeemm(); break; + case 0xc964: checkforemm(); break; + case 0xc968: checkbasemem(); break; + case 0xc96c: allocatebuffers(); break; + case 0xc970: clearbuffers(); break; + case 0xc974: clearchanges(); break; + case 0xc978: clearbeforeload(); break; + case 0xc97c: clearreels(); break; + case 0xc980: clearrest(); break; + case 0xc984: deallocatemem(); break; + case 0xc988: allocatemem(); break; + case 0xc990: parseblaster(); break; + case 0xc994: startup(); break; + case 0xc998: startup1(); break; + case 0xc99c: screenupdate(); break; + case 0xc9a0: watchreel(); break; + case 0xc9a4: checkforshake(); break; + case 0xc9a8: watchcount(); break; + case 0xc9ac: showtime(); break; + case 0xc9b0: dumpwatch(); break; + case 0xc9b4: showbyte(); break; + case 0xc9b8: onedigit(); break; + case 0xc9bc: twodigitnum(); break; + case 0xc9c0: showword(); break; + case 0xc9c4: convnum(); break; + case 0xc9c8: mainscreen(); break; + case 0xc9cc: madmanrun(); break; + case 0xc9d0: checkcoords(); break; + case 0xc9d4: identifyob(); break; + case 0xc9d8: checkifperson(); break; + case 0xc9dc: checkifset(); break; + case 0xc9e0: checkifex(); break; + case 0xc9e4: checkiffree(); break; + case 0xc9e8: isitdescribed(); break; + case 0xc9ec: findpathofpoint(); break; + case 0xc9f0: findfirstpath(); break; + case 0xc9f4: turnpathon(); break; + case 0xc9f8: turnpathoff(); break; + case 0xc9fc: turnanypathon(); break; + case 0xca00: turnanypathoff(); break; + case 0xca04: checkifpathison(); break; + case 0xca08: afternewroom(); break; + case 0xca0c: atmospheres(); break; + case 0xca10: walkintoroom(); break; + case 0xca14: afterintroroom(); break; + case 0xca18: obname(); break; + case 0xca1c: finishedwalking(); break; + case 0xca20: examineobtext(); break; + case 0xca24: commandwithob(); break; + case 0xca28: commandonly(); break; + case 0xca2c: printmessage(); break; + case 0xca30: printmessage2(); break; + case 0xca34: blocknametext(); break; + case 0xca38: personnametext(); break; + case 0xca3c: walktotext(); break; + case 0xca40: getflagunderp(); break; + case 0xca44: setwalk(); break; + case 0xca48: autosetwalk(); break; + case 0xca4c: checkdest(); break; + case 0xca50: bresenhams(); break; + case 0xca54: workoutframes(); break; + case 0xca58: getroomspaths(); break; + case 0xca5c: copyname(); break; + case 0xca60: findobname(); break; + case 0xca64: showicon(); break; + case 0xca68: middlepanel(); break; + case 0xca6c: showman(); break; + case 0xca70: showpanel(); break; + case 0xca74: roomname(); break; + case 0xca78: usecharset1(); break; + case 0xca7c: usetempcharset(); break; + case 0xca80: showexit(); break; + case 0xca84: panelicons1(); break; + case 0xca88: showwatch(); break; + case 0xca8c: gettime(); break; + case 0xca90: zoomicon(); break; + case 0xca94: showblink(); break; + case 0xca98: dumpblink(); break; + case 0xca9c: worktoscreenm(); break; + case 0xcaa0: blank(); break; + case 0xcaa4: allpointer(); break; + case 0xcaa8: hangonp(); break; + case 0xcaac: hangonw(); break; + case 0xcab0: hangoncurs(); break; + case 0xcab4: getunderzoom(); break; + case 0xcab8: dumpzoom(); break; + case 0xcabc: putunderzoom(); break; + case 0xcac0: crosshair(); break; + case 0xcac4: showpointer(); break; + case 0xcac8: delpointer(); break; + case 0xcacc: dumppointer(); break; + case 0xcad0: undertextline(); break; + case 0xcad4: deltextline(); break; + case 0xcad8: dumptextline(); break; + case 0xcadc: animpointer(); break; + case 0xcae0: setmouse(); break; + case 0xcae4: readmouse(); break; + case 0xcae8: mousecall(); break; + case 0xcaec: readmouse1(); break; + case 0xcaf0: readmouse2(); break; + case 0xcaf4: readmouse3(); break; + case 0xcaf8: readmouse4(); break; + case 0xcafc: readkey(); break; + case 0xcb04: randomnum1(); break; + case 0xcb08: randomnum2(); break; + case 0xcb10: hangon(); break; + case 0xcb14: loadtraveltext(); break; + case 0xcb18: loadintotemp(); break; + case 0xcb1c: loadintotemp2(); break; + case 0xcb20: loadintotemp3(); break; + case 0xcb24: loadtempcharset(); break; + case 0xcb28: standardload(); break; + case 0xcb2c: loadtemptext(); break; + case 0xcb30: loadroom(); break; + case 0xcb34: loadroomssample(); break; + case 0xcb38: getridofreels(); break; + case 0xcb3c: getridofall(); break; + case 0xcb40: restorereels(); break; + case 0xcb44: restoreall(); break; + case 0xcb48: sortoutmap(); break; + case 0xcb4c: startloading(); break; + case 0xcb50: disablepath(); break; + case 0xcb54: findxyfrompath(); break; + case 0xcb58: findroominloc(); break; + case 0xcb5c: getroomdata(); break; + case 0xcb60: readheader(); break; + case 0xcb64: dontloadseg(); break; + case 0xcb68: allocateload(); break; + case 0xcb6c: fillspace(); break; + case 0xcb70: getridoftemp(); break; + case 0xcb74: getridoftemptext(); break; + case 0xcb78: getridoftemp2(); break; + case 0xcb7c: getridoftemp3(); break; + case 0xcb80: getridoftempcharset(); break; + case 0xcb84: getridoftempsp(); break; + case 0xcb88: readsetdata(); break; + case 0xcb8c: createfile(); break; + case 0xcb90: openfile(); break; + case 0xcb94: openfilefromc(); break; + case 0xcb98: makename(); break; + case 0xcb9c: openfilenocheck(); break; + case 0xcba0: openforsave(); break; + case 0xcba4: closefile(); break; + case 0xcba8: readfromfile(); break; + case 0xcbac: setkeyboardint(); break; + case 0xcbb0: resetkeyboard(); break; + case 0xcbb4: keyboardread(); break; + case 0xcbb8: walkandexamine(); break; + case 0xcbbc: doload(); break; + case 0xcbc0: generalerror(); break; + default: ::error("invalid call to %04x dispatched", (uint16)ax); + } +} + +} /*namespace*/ diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h new file mode 100644 index 0000000000..2d05f9c791 --- /dev/null +++ b/engines/dreamweb/dreamgen.h @@ -0,0 +1,1342 @@ +#ifndef TASMRECOVER_DREAMGEN_STUBS_H__ +#define TASMRECOVER_DREAMGEN_STUBS_H__ + +/* PLEASE DO NOT MODIFY THIS FILE. ALL CHANGES WILL BE LOST! LOOK FOR README FOR DETAILS */ + + +#include "dreamweb/runtime.h" + +namespace DreamGen { + +class DreamGenContext : public Context { +public: + void __start(); + void __dispatch_call(uint16 addr); + + const static uint16 kStartvars = 0; + const static uint16 kProgresspoints = 1; + const static uint16 kWatchon = 2; + const static uint16 kShadeson = 3; + const static uint16 kSecondcount = 4; + const static uint16 kMinutecount = 5; + const static uint16 kHourcount = 6; + const static uint16 kZoomon = 7; + const static uint16 kLocation = 8; + const static uint16 kExpos = 9; + const static uint16 kExframepos = 10; + const static uint16 kExtextpos = 12; + const static uint16 kCard1money = 14; + const static uint16 kListpos = 16; + const static uint16 kRyanpage = 18; + const static uint16 kWatchingtime = 19; + const static uint16 kReeltowatch = 21; + const static uint16 kEndwatchreel = 23; + const static uint16 kSpeedcount = 25; + const static uint16 kWatchspeed = 26; + const static uint16 kReeltohold = 27; + const static uint16 kEndofholdreel = 29; + const static uint16 kWatchmode = 31; + const static uint16 kDestafterhold = 32; + const static uint16 kNewsitem = 33; + const static uint16 kLiftflag = 34; + const static uint16 kLiftpath = 35; + const static uint16 kLockstatus = 36; + const static uint16 kDoorpath = 37; + const static uint16 kCounttoopen = 38; + const static uint16 kCounttoclose = 39; + const static uint16 kRockstardead = 40; + const static uint16 kGeneraldead = 41; + const static uint16 kSartaindead = 42; + const static uint16 kAidedead = 43; + const static uint16 kBeenmugged = 44; + const static uint16 kGunpassflag = 45; + const static uint16 kCanmovealtar = 46; + const static uint16 kTalkedtoattendant = 47; + const static uint16 kTalkedtosparky = 48; + const static uint16 kTalkedtoboss = 49; + const static uint16 kTalkedtorecep = 50; + const static uint16 kCardpassflag = 51; + const static uint16 kMadmanflag = 52; + const static uint16 kKeeperflag = 53; + const static uint16 kLasttrigger = 54; + const static uint16 kMandead = 55; + const static uint16 kSeed = 56; + const static uint16 kNeedtotravel = 59; + const static uint16 kThroughdoor = 60; + const static uint16 kNewobs = 61; + const static uint16 kRyanon = 62; + const static uint16 kCombatcount = 63; + const static uint16 kLastweapon = 64; + const static uint16 kDreamnumber = 65; + const static uint16 kRoomafterdream = 66; + const static uint16 kShakecounter = 67; + const static uint16 kSpeechcount = 68; + const static uint16 kCharshift = 69; + const static uint16 kKerning = 71; + const static uint16 kBrightness = 72; + const static uint16 kRoomloaded = 73; + const static uint16 kDidzoom = 74; + const static uint16 kLinespacing = 75; + const static uint16 kTextaddressx = 77; + const static uint16 kTextaddressy = 79; + const static uint16 kTextlen = 81; + const static uint16 kLastxpos = 82; + const static uint16 kIcontop = 84; + const static uint16 kIconleft = 86; + const static uint16 kItemframe = 88; + const static uint16 kItemtotran = 89; + const static uint16 kRoomad = 90; + const static uint16 kOldsubject = 92; + const static uint16 kWithobject = 94; + const static uint16 kWithtype = 95; + const static uint16 kLookcounter = 96; + const static uint16 kCommand = 98; + const static uint16 kCommandtype = 99; + const static uint16 kOldcommandtype = 100; + const static uint16 kObjecttype = 101; + const static uint16 kGetback = 102; + const static uint16 kInvopen = 103; + const static uint16 kMainmode = 104; + const static uint16 kPickup = 105; + const static uint16 kLastinvpos = 106; + const static uint16 kExamagain = 107; + const static uint16 kNewtextline = 108; + const static uint16 kOpenedob = 109; + const static uint16 kOpenedtype = 110; + const static uint16 kOldmapadx = 111; + const static uint16 kOldmapady = 113; + const static uint16 kMapadx = 115; + const static uint16 kMapady = 117; + const static uint16 kMapoffsetx = 119; + const static uint16 kMapoffsety = 121; + const static uint16 kMapxstart = 123; + const static uint16 kMapystart = 125; + const static uint16 kMapxsize = 127; + const static uint16 kMapysize = 128; + const static uint16 kHavedoneobs = 129; + const static uint16 kManisoffscreen = 130; + const static uint16 kRainspace = 131; + const static uint16 kFacing = 132; + const static uint16 kLeavedirection = 133; + const static uint16 kTurntoface = 134; + const static uint16 kTurndirection = 135; + const static uint16 kMaintimer = 136; + const static uint16 kIntrocount = 138; + const static uint16 kArrowad = 139; + const static uint16 kCurrentkey = 141; + const static uint16 kOldkey = 142; + const static uint16 kUseddirection = 143; + const static uint16 kCurrentkey2 = 144; + const static uint16 kTimercount = 145; + const static uint16 kOldtimercount = 146; + const static uint16 kMapx = 147; + const static uint16 kMapy = 148; + const static uint16 kNewscreen = 149; + const static uint16 kRyanx = 150; + const static uint16 kRyany = 151; + const static uint16 kLastflag = 152; + const static uint16 kLastflagex = 153; + const static uint16 kFlagx = 154; + const static uint16 kFlagy = 155; + const static uint16 kCurrentex = 156; + const static uint16 kCurrentfree = 157; + const static uint16 kCurrentframe = 158; + const static uint16 kFramesad = 160; + const static uint16 kDataad = 162; + const static uint16 kFrsegment = 164; + const static uint16 kObjectx = 166; + const static uint16 kObjecty = 168; + const static uint16 kOffsetx = 170; + const static uint16 kOffsety = 172; + const static uint16 kSavesize = 174; + const static uint16 kSavesource = 176; + const static uint16 kSavex = 178; + const static uint16 kSavey = 179; + const static uint16 kCurrentob = 180; + const static uint16 kPriority = 181; + const static uint16 kDestpos = 182; + const static uint16 kReallocation = 183; + const static uint16 kRoomnum = 184; + const static uint16 kNowinnewroom = 185; + const static uint16 kResetmanxy = 186; + const static uint16 kNewlocation = 187; + const static uint16 kAutolocation = 188; + const static uint16 kMustload = 189; + const static uint16 kAnswered = 190; + const static uint16 kSaidno = 191; + const static uint16 kDoorcheck1 = 192; + const static uint16 kDoorcheck2 = 193; + const static uint16 kDoorcheck3 = 194; + const static uint16 kDoorcheck4 = 195; + const static uint16 kMousex = 196; + const static uint16 kMousey = 198; + const static uint16 kMousebutton = 200; + const static uint16 kMousebutton1 = 202; + const static uint16 kMousebutton2 = 204; + const static uint16 kMousebutton3 = 206; + const static uint16 kMousebutton4 = 208; + const static uint16 kOldbutton = 210; + const static uint16 kOldx = 212; + const static uint16 kOldy = 214; + const static uint16 kLastbutton = 216; + const static uint16 kOldpointerx = 218; + const static uint16 kOldpointery = 220; + const static uint16 kDelherex = 222; + const static uint16 kDelherey = 224; + const static uint16 kPointerxs = 226; + const static uint16 kPointerys = 227; + const static uint16 kDelxs = 228; + const static uint16 kDelys = 229; + const static uint16 kPointerframe = 230; + const static uint16 kPointerpower = 231; + const static uint16 kAuxpointerframe = 232; + const static uint16 kPointermode = 233; + const static uint16 kPointerspeed = 234; + const static uint16 kPointercount = 235; + const static uint16 kInmaparea = 236; + const static uint16 kReelpointer = 237; + const static uint16 kSlotdata = 239; + const static uint16 kThisslot = 240; + const static uint16 kSlotflags = 241; + const static uint16 kTakeoff = 242; + const static uint16 kTalkmode = 244; + const static uint16 kTalkpos = 245; + const static uint16 kCharacter = 246; + const static uint16 kPersondata = 247; + const static uint16 kTalknum = 249; + const static uint16 kNumberinroom = 250; + const static uint16 kCurrentcel = 251; + const static uint16 kOldselection = 252; + const static uint16 kStopwalking = 253; + const static uint16 kMouseon = 254; + const static uint16 kPlayed = 255; + const static uint16 kTimer1 = 257; + const static uint16 kTimer2 = 258; + const static uint16 kTimer3 = 259; + const static uint16 kWholetimer = 260; + const static uint16 kTimer1to = 262; + const static uint16 kTimer2to = 263; + const static uint16 kTimer3to = 264; + const static uint16 kWatchdump = 265; + const static uint16 kCurrentset = 266; + const static uint16 kLogonum = 268; + const static uint16 kOldlogonum = 269; + const static uint16 kNewlogonum = 270; + const static uint16 kNetseg = 271; + const static uint16 kNetpoint = 273; + const static uint16 kKeynum = 275; + const static uint16 kCursorstate = 276; + const static uint16 kPressed = 277; + const static uint16 kPresspointer = 278; + const static uint16 kGraphicpress = 280; + const static uint16 kPresscount = 281; + const static uint16 kKeypadax = 282; + const static uint16 kKeypadcx = 284; + const static uint16 kLightcount = 286; + const static uint16 kFolderpage = 287; + const static uint16 kDiarypage = 288; + const static uint16 kMenucount = 289; + const static uint16 kSymboltopx = 290; + const static uint16 kSymboltopnum = 291; + const static uint16 kSymboltopdir = 292; + const static uint16 kSymbolbotx = 293; + const static uint16 kSymbolbotnum = 294; + const static uint16 kSymbolbotdir = 295; + const static uint16 kSymboltolight = 296; + const static uint16 kSymbol1 = 297; + const static uint16 kSymbol2 = 298; + const static uint16 kSymbol3 = 299; + const static uint16 kSymbolnum = 300; + const static uint16 kDumpx = 301; + const static uint16 kDumpy = 303; + const static uint16 kWalkandexam = 305; + const static uint16 kWalkexamtype = 306; + const static uint16 kWalkexamnum = 307; + const static uint16 kCursloc = 308; + const static uint16 kCurslocx = 310; + const static uint16 kCurslocy = 312; + const static uint16 kCurpos = 314; + const static uint16 kMonadx = 316; + const static uint16 kMonady = 318; + const static uint16 kGotfrom = 320; + const static uint16 kMonsource = 322; + const static uint16 kNumtodo = 324; + const static uint16 kTimecount = 326; + const static uint16 kCounttotimed = 328; + const static uint16 kTimedseg = 330; + const static uint16 kTimedoffset = 332; + const static uint16 kTimedy = 334; + const static uint16 kTimedx = 335; + const static uint16 kNeedtodumptimed = 336; + const static uint16 kHandle = 337; + const static uint16 kLoadingorsave = 339; + const static uint16 kCurrentslot = 340; + const static uint16 kCursorpos = 341; + const static uint16 kColourpos = 342; + const static uint16 kFadedirection = 343; + const static uint16 kNumtofade = 344; + const static uint16 kFadecount = 345; + const static uint16 kAddtogreen = 346; + const static uint16 kAddtored = 347; + const static uint16 kAddtoblue = 348; + const static uint16 kLastsoundreel = 349; + const static uint16 kSoundbuffer = 351; + const static uint16 kSoundbufferad = 353; + const static uint16 kSoundbufferpage = 355; + const static uint16 kSoundtimes = 356; + const static uint16 kNeedsoundbuff = 357; + const static uint16 kOldint9seg = 358; + const static uint16 kOldint9add = 360; + const static uint16 kOldint8seg = 362; + const static uint16 kOldint8add = 364; + const static uint16 kOldsoundintseg = 366; + const static uint16 kOldsoundintadd = 368; + const static uint16 kSoundbaseadd = 370; + const static uint16 kDsp_status = 372; + const static uint16 kDsp_write = 374; + const static uint16 kDmaaddress = 376; + const static uint16 kSoundint = 377; + const static uint16 kSounddmachannel = 378; + const static uint16 kSampleplaying = 379; + const static uint16 kTestresult = 380; + const static uint16 kCurrentirq = 381; + const static uint16 kSpeechloaded = 382; + const static uint16 kSpeechlength = 383; + const static uint16 kVolume = 385; + const static uint16 kVolumeto = 386; + const static uint16 kVolumedirection = 387; + const static uint16 kVolumecount = 388; + const static uint16 kPlayblock = 389; + const static uint16 kWongame = 390; + const static uint16 kLasthardkey = 391; + const static uint16 kBufferin = 392; + const static uint16 kBufferout = 394; + const static uint16 kExtras = 396; + const static uint16 kWorkspace = 398; + const static uint16 kMapstore = 400; + const static uint16 kCharset1 = 402; + const static uint16 kTempcharset = 404; + const static uint16 kIcons1 = 406; + const static uint16 kIcons2 = 408; + const static uint16 kBuffers = 410; + const static uint16 kMainsprites = 412; + const static uint16 kBackdrop = 414; + const static uint16 kMapdata = 416; + const static uint16 kSounddata = 418; + const static uint16 kSounddata2 = 420; + const static uint16 kRecordspace = 422; + const static uint16 kFreedat = 424; + const static uint16 kSetdat = 426; + const static uint16 kReel1 = 428; + const static uint16 kReel2 = 430; + const static uint16 kReel3 = 432; + const static uint16 kRoomdesc = 434; + const static uint16 kFreedesc = 436; + const static uint16 kSetdesc = 438; + const static uint16 kBlockdesc = 440; + const static uint16 kSetframes = 442; + const static uint16 kFreeframes = 444; + const static uint16 kPeople = 446; + const static uint16 kReels = 448; + const static uint16 kCommandtext = 450; + const static uint16 kPuzzletext = 452; + const static uint16 kTraveltext = 454; + const static uint16 kTempgraphics = 456; + const static uint16 kTempgraphics2 = 458; + const static uint16 kTempgraphics3 = 460; + const static uint16 kTempsprites = 462; + const static uint16 kTextfile1 = 464; + const static uint16 kTextfile2 = 466; + const static uint16 kTextfile3 = 468; + const static uint16 kBlinkframe = 470; + const static uint16 kBlinkcount = 471; + const static uint16 kReasseschanges = 472; + const static uint16 kPointerspath = 473; + const static uint16 kManspath = 474; + const static uint16 kPointerfirstpath = 475; + const static uint16 kFinaldest = 476; + const static uint16 kDestination = 477; + const static uint16 kLinestartx = 478; + const static uint16 kLinestarty = 480; + const static uint16 kLineendx = 482; + const static uint16 kLineendy = 484; + const static uint16 kIncrement1 = 486; + const static uint16 kIncrement2 = 488; + const static uint16 kLineroutine = 490; + const static uint16 kLinepointer = 491; + const static uint16 kLinedirection = 492; + const static uint16 kLinelength = 493; + const static uint16 kLiftsoundcount = 494; + const static uint16 kEmmhandle = 495; + const static uint16 kEmmpageframe = 497; + const static uint16 kEmmhardwarepage = 499; + const static uint16 kCh0emmpage = 500; + const static uint16 kCh0offset = 502; + const static uint16 kCh0blockstocopy = 504; + const static uint16 kCh0playing = 506; + const static uint16 kCh0repeat = 507; + const static uint16 kCh0oldemmpage = 508; + const static uint16 kCh0oldoffset = 510; + const static uint16 kCh0oldblockstocopy = 512; + const static uint16 kCh1playing = 514; + const static uint16 kCh1emmpage = 515; + const static uint16 kCh1offset = 517; + const static uint16 kCh1blockstocopy = 519; + const static uint16 kCh1blocksplayed = 521; + const static uint16 kSoundbufferwrite = 523; + const static uint16 kSoundemmpage = 525; + const static uint16 kSpeechemmpage = 527; + const static uint16 kCurrentsample = 529; + const static uint16 kRoomssample = 530; + const static uint16 kGameerror = 531; + const static uint16 kHowmuchalloc = 532; + const static uint16 kReelroutines = 534; + const static uint16 kReelcalls = 991; + const static uint16 kRoombyroom = 1214; + const static uint16 kR0 = 1326; + const static uint16 kR1 = 1327; + const static uint16 kR2 = 1331; + const static uint16 kR6 = 1350; + const static uint16 kR8 = 1357; + const static uint16 kR9 = 1373; + const static uint16 kR10 = 1380; + const static uint16 kR11 = 1384; + const static uint16 kR12 = 1388; + const static uint16 kR13 = 1392; + const static uint16 kR14 = 1405; + const static uint16 kR20 = 1439; + const static uint16 kR22 = 1461; + const static uint16 kR23 = 1492; + const static uint16 kR25 = 1505; + const static uint16 kR26 = 1527; + const static uint16 kR27 = 1549; + const static uint16 kR28 = 1574; + const static uint16 kR29 = 1593; + const static uint16 kR45 = 1609; + const static uint16 kR46 = 1616; + const static uint16 kR47 = 1653; + const static uint16 kR52 = 1666; + const static uint16 kR53 = 1670; + const static uint16 kR55 = 1677; + const static uint16 kSpritename1 = 1819; + const static uint16 kSpritename3 = 1832; + const static uint16 kIdname = 1845; + const static uint16 kCharacterset1 = 1857; + const static uint16 kCharacterset2 = 1870; + const static uint16 kCharacterset3 = 1883; + const static uint16 kSamplename = 1896; + const static uint16 kBasicsample = 1909; + const static uint16 kIcongraphics0 = 1922; + const static uint16 kIcongraphics1 = 1935; + const static uint16 kExtragraphics1 = 1948; + const static uint16 kIcongraphics8 = 1961; + const static uint16 kMongraphicname = 1974; + const static uint16 kMongraphics2 = 1987; + const static uint16 kCityname = 2000; + const static uint16 kTravelgraphic1 = 2013; + const static uint16 kTravelgraphic2 = 2026; + const static uint16 kDiarygraphic = 2039; + const static uint16 kMonitorfile1 = 2052; + const static uint16 kMonitorfile2 = 2065; + const static uint16 kMonitorfile10 = 2078; + const static uint16 kMonitorfile11 = 2091; + const static uint16 kMonitorfile12 = 2104; + const static uint16 kMonitorfile13 = 2117; + const static uint16 kMonitorfile20 = 2130; + const static uint16 kMonitorfile21 = 2143; + const static uint16 kMonitorfile22 = 2156; + const static uint16 kMonitorfile23 = 2169; + const static uint16 kMonitorfile24 = 2182; + const static uint16 kFoldertext = 2195; + const static uint16 kDiarytext = 2208; + const static uint16 kPuzzletextname = 2221; + const static uint16 kTraveltextname = 2234; + const static uint16 kIntrotextname = 2247; + const static uint16 kEndtextname = 2260; + const static uint16 kCommandtextname = 2273; + const static uint16 kVolumetabname = 2286; + const static uint16 kFoldergraphic1 = 2299; + const static uint16 kFoldergraphic2 = 2312; + const static uint16 kFoldergraphic3 = 2325; + const static uint16 kSymbolgraphic = 2338; + const static uint16 kGungraphic = 2351; + const static uint16 kMonkface = 2364; + const static uint16 kTitle0graphics = 2377; + const static uint16 kTitle1graphics = 2390; + const static uint16 kTitle2graphics = 2403; + const static uint16 kTitle3graphics = 2416; + const static uint16 kTitle4graphics = 2429; + const static uint16 kTitle5graphics = 2442; + const static uint16 kTitle6graphics = 2455; + const static uint16 kTitle7graphics = 2468; + const static uint16 kPalettescreen = 2481; + const static uint16 kCurrentfile = 2970; + const static uint16 kDmaaddresses = 5118; + const static uint16 kFileheader = 6091; + const static uint16 kFiledata = 6141; + const static uint16 kExtradata = 6181; + const static uint16 kRoomdata = 6187; + const static uint16 kMadeuproomdat = 7979; + const static uint16 kRoomscango = 8011; + const static uint16 kRoompics = 8027; + const static uint16 kOplist = 8042; + const static uint16 kInputline = 8045; + const static uint16 kLinedata = 8173; + const static uint16 kPresslist = 8573; + const static uint16 kSavenames = 8579; + const static uint16 kSavefiles = 8698; + const static uint16 kRecname = 8789; + const static uint16 kQuitrequested = 8802; + const static uint16 kStak = 8803; + const static uint16 kBlocktextdat = (0); + const static uint16 kPersonframes = (0); + const static uint16 kDebuglevel1 = (0); + const static uint16 kDebuglevel2 = (0); + const static uint16 kPlayback = (0); + const static uint16 kMap = (0); + const static uint16 kSettextdat = (0); + const static uint16 kSpanish = (0); + const static uint16 kFramedata = (0); + const static uint16 kRecording = (0); + const static uint16 kFlags = (0); + const static uint16 kGerman = (0); + const static uint16 kTextunder = (0); + const static uint16 kForeign = (0); + const static uint16 kPathdata = (0); + const static uint16 kDemo = (0); + const static uint16 kExframedata = (0); + const static uint16 kIntextdat = (0); + const static uint16 kFreetextdat = (0); + const static uint16 kFrframedata = (0); + const static uint16 kSettext = (0+(130*2)); + const static uint16 kOpeninvlist = (0+(180*10)); + const static uint16 kRyaninvlist = (0+(180*10)+32); + const static uint16 kPointerback = (0+(180*10)+32+60); + const static uint16 kMapflags = (0+(180*10)+32+60+(32*32)); + const static uint16 kStartpal = (0+(180*10)+32+60+(32*32)+(11*10*3)); + const static uint16 kEndpal = (0+(180*10)+32+60+(32*32)+(11*10*3)+768); + const static uint16 kMaingamepal = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768); + const static uint16 kSpritetable = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768); + const static uint16 kSetlist = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)); + const static uint16 kFreelist = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)); + const static uint16 kExlist = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)); + const static uint16 kPeoplelist = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)); + const static uint16 kZoomspace = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)); + const static uint16 kPrintedlist = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)); + const static uint16 kListofchanges = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)); + const static uint16 kUndertimedtext = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)); + const static uint16 kRainlist = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)); + const static uint16 kInitialreelrouts = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)); + const static uint16 kInitialvars = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534); + const static uint16 kLengthofbuffer = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*24)+(6*64)+991-534+68-0); + const static uint16 kReellist = (0+(36*144)); + const static uint16 kIntext = (0+(38*2)); + const static uint16 kLengthofmap = (0+(66*60)); + const static uint16 kFreetext = (0+(82*2)); + const static uint16 kBlocktext = (0+(98*2)); + const static uint16 kBlocks = (0+192); + const static uint16 kFrframes = (0+2080); + const static uint16 kExframes = (0+2080); + const static uint16 kFrames = (0+2080); + const static uint16 kExdata = (0+2080+30000); + const static uint16 kExtextdat = (0+2080+30000+(16*114)); + const static uint16 kExtext = (0+2080+30000+(16*114)+((114+2)*2)); + const static uint16 kLengthofextra = (0+2080+30000+(16*114)+((114+2)*2)+18000); + const static uint16 kPersontxtdat = (0+24); + const static uint16 kPersontext = (0+24+(1026*2)); + const static uint16 kInputport = (0x63); + const static uint16 kCd = (1); + const static uint16 kUndertextsizey = (10); + const static uint16 kNumexobjects = (114); + const static uint16 kZoomy = (132); + const static uint16 kFreedatlen = (16*80); + const static uint16 kUndertextsizex = (180); + const static uint16 kExtextlen = (18000); + const static uint16 kLenofmapstore = (22*8*20*8); + const static uint16 kUndertimedysize = (24); + const static uint16 kNumchanges = (250); + const static uint16 kExframeslen = (30000); + const static uint16 kTablesize = (32); + const static uint16 kScreenwidth = (320); + const static uint16 kKeypadx = (36+112); + const static uint16 kItempicsize = (44); + const static uint16 kDiaryy = (48+12); + const static uint16 kOpsy = (52); + const static uint16 kSymboly = (56); + const static uint16 kInventy = (58); + const static uint16 kMenuy = (60); + const static uint16 kOpsx = (60); + const static uint16 kMaplength = (60); + const static uint16 kHeaderlen = (6187-6091); + const static uint16 kSymbolx = (64); + const static uint16 kSetdatlen = (64*128); + const static uint16 kMapwidth = (66); + const static uint16 kTextstart = (66*2); + const static uint16 kMaplen = (66*60); + const static uint16 kDiaryx = (68+24); + const static uint16 kLengthofvars = (68-0); + const static uint16 kKeypady = (72); + const static uint16 kZoomx = (8); + const static uint16 kInventx = (80); + const static uint16 kMenux = (80+40); + const static uint16 kLenofreelrouts = (991-534); + + void bothchannels(); + void usewire(); + void getnamepos(); + void drawitall(); + void clearstartpal(); + void femalefan(); + void greyscalesum(); + void showgamereel(); + void identifyob(); + void trysoundalloc(); + void uselighter(); + void showmenu(); + void usepoolreader(); + void showgroup(); + void startdmablock(); + void useopenbox(); + void clearbuffers(); + void neterror(); + void storeit(); + void isitworn(); + void putundertimed(); + void dumpmap(); + void multidump(); + void channel0only(); + void worktoscreenm(); + void removeemm(); + void mansatstill(); + void getobtextstart(); + void loadfolder(); + void decide(); + void dumppointer(); + void reelsonscreen(); + void getridofreels(); + void readkey(); + void louis(); + void entrytexts(); + void getreelstart(); + void buttonenter(); + void checkinput(); + void crosshair(); + void bresenhams(); + void getbackfromops(); + void frameoutv(); + void restoreall(); + void screenupdate(); + void addlength(); + void usetimedtext(); + void putundercentre(); + void checkobjectsize(); + void commandonly(); + void adjustlen(); + void deallocatemem(); + void mainscreen(); + void watchreel(); + void showfolder(); + void turnanypathoff(); + void openfilefromc(); + void gettime(); + void clearwork(); + void loadtraveltext(); + void worktoscreen(); + void getexpos(); + void fadedos(); + void multiget(); + void fadeupmonfirst(); + void drawfloor(); + void loadkeypad(); + void findsource(); + void clearendpal(); + void findtext1(); + void isryanholding(); + void interupttest(); + void usecashcard(); + void usewall(); + void opentomb(); + void buttonfour(); + void animpointer(); + void lockmon(); + void dochange(); + void getanyaddir(); + void showsaveops(); + void intromonks1(); + void resetlocation(); + void oldtonames(); + void showdiscops(); + void advisor(); + void additionaltext(); + void kernchars(); + void othersmoker(); + void autosetwalk(); + void setuptimedtemp(); + void blocknametext(); + void useelevator5(); + void useelevator4(); + void useelevator1(); + void attendant(); + void useelevator3(); + void useelevator2(); + void buttonone(); + void keyboardread(); + void deltextline(); + void entercode(); + void getopenedsize(); + void getpersframe(); + void doshake(); + void resetkeyboard(); + void showpanel(); + void soundstartup(); + void slabdoora(); + void fadeupyellows(); + void slabdoorc(); + void slabdoorb(); + void slabdoore(); + void slabdoord(); + void adjustup(); + void readsetdata(); + void loadintotemp(); + void loadintroroom(); + void saveseg(); + void showblink(); + void mousecall(); + void train(); + void watchcount(); + void fadedownmon(); + void loadcart(); + void splitintolines(); + void bartender(); + void eden(); + void showdiary(); + void purgealocation(); + void updatepeople(); + void slabdoorf(); + void addtopeoplelist(); + void hangoncurs(); + void sparkydrip(); + void compare(); + void printcurs(); + void convertkey(); + void outofopen(); + void dealwithspecial(); + void dircom(); + void liftsprite(); + void dumpkeypad(); + void dumpzoom(); + void endgameseq(); + void cancelch0(); + void setbotleft(); + void findfirstpath(); + void showallfree(); + void loadold(); + void loadtempcharset(); + void useslab(); + void aboutturn(); + void usealtar(); + void createpanel2(); + void turnonpower(); + void manasleep2(); + void moretalk(); + void printslow(); + void loadroom(); + void starttalk(); + void delchar(); + void getanyad(); + void endgame(); + void monprint(); + void usepipe(); + void startloading(); + void getunderzoom(); + void candles(); + void backobject(); + void rollendcredits2(); + void reminders(); + void selectslot2(); + void runtap(); + void domix(); + void priesttext(); + void paneltomap(); + void obname(); + void getridoftemp3(); + void getridoftemp2(); + void usebalcony(); + void runendseq(); + void dumpdiarykeys(); + void disablesoundint(); + void checkifset(); + void showallex(); + void showrain(); + void openpoolboss(); + void buttontwo(); + void fillopen(); + void delsprite(); + void getroomspaths(); + void dumptextline(); + void fadescreendownhalf(); + void useplate(); + void candles1(); + void lookininterface(); + void manasleep(); + void isitdescribed(); + void hotelbell(); + void loadspeech(); + void cls(); + void printsprites(); + void dumptimedtext(); + void showallobs(); + void getnumber(); + void adjustleft(); + void calledenslift(); + void useclearbox(); + void entryanims(); + void nextfolder(); + void getfreead(); + void showarrows(); + void walkintoroom(); + void getridoftemptext(); + void printoutermon(); + void setuppit(); + void showpcx(); + void showdecisions(); + void checkspeed(); + void printchar(); + void showkeypad(); + void obtoinv(); + void removeobfrominv(); + void usecoveredbox(); + void openyourneighbour(); + void fadescreenuphalf(); + void getridoftempcharset(); + void heavy(); + void endpaltostart(); + void showkeys(); + void usekey(); + void locklighton(); + void useladderb(); + void spriteupdate(); + void usetempcharset(); + void discops(); + void printdirect(); + void delthisone(); + void makebackob(); + void middlepanel(); + void dumpwatch(); + void saveload(); + void monitorlogo(); + void loadposition(); + void wornerror(); + void entersymbol(); + void showword(); + void dirfile(); + void setmode(); + void walktotext(); + void pickupconts(); + void locklightoff(); + void wearwatch(); + void runintroseq(); + void doblocks(); + void showbyte(); + void allpalette(); + void findormake(); + void nextsymbol(); + void monks2text(); + void poolguard(); + void clearpalette(); + void cantdrop(); + void maptopanel(); + void calcmapad(); + void getridofall(); + void copper(); + void folderhints(); + void openhoteldoor(); + void removesetobject(); + void checkifperson(); + void frameoutfx(); + void blank(); + void drinker(); + void nextcolon(); + void placefreeobject(); + void delpointer(); + void loopchannel0(); + void initrain(); + void showleftpage(); + void rockstar(); + void adjustright(); + void putunderzoom(); + void vsync(); + void turnpathoff(); + void findinvpos(); + void usetext(); + void hangonpq(); + void liftnoise(); + void workoutframes(); + void getbackfromob(); + void dumpsymbox(); + void loadgame(); + void getridoftemp(); + void showcity(); + void dumpsymbol(); + void disablepath(); + void buttonsix(); + void intro2text(); + void showouterpad(); + void getkeyandlogo(); + void selectob(); + void checkcoords(); + void dumpmenu(); + void chewy(); + void accesslighton(); + void dosreturn(); + void titles(); + void quickquit(); + void showpointer(); + void usecooker(); + void loadmenu(); + void checkforemm(); + void checkifpathison(); + void smallcandle(); + void receptionist(); + void selectslot(); + void edenscdplayer(); + void readoneblock(); + void fadeupmon(); + void paltoendpal(); + void fadetowhite(); + void textformonk(); + void loadsavebox(); + void fadescreenup(); + void soundend(); + void redes(); + void errormessage1(); + void clearchanges(); + void errormessage3(); + void deletetaken(); + void putundermenu(); + void checkifex(); + void intromagic2(); + void findobname(); + void edeninbath(); + void intromagic1(); + void showdiarypage(); + void useshield(); + void getbacktoops(); + void rollendcredits(); + void intro1text(); + void getmapad(); + void playchannel1(); + void playchannel0(); + void usemon(); + void steady(); + void pixelcheckset(); + void reexfrominv(); + void fillspace(); + void talk(); + void usedryer(); + void dumpeverything(); + void usehatch(); + void zoom(); + void outofinv(); + void viewfolder(); + void walking(); + void diarykeyp(); + void readabyte(); + void showframe(); + void random(); + void obicons(); + void frameoutbh(); + void channel1only(); + void playguitar(); + void lastfolder(); + void transfermap(); + void showreelframe(); + void showmonk(); + void diarykeyn(); + void set16colpalette(); + void sparky(); + void interviewer(); + void purgeanitem(); + void madman(); + void createpanel(); + void turnpathon(); + void showmainops(); + void madmanstelly(); + void constant(); + void loadroomssample(); + void getblockofpixel(); + void paltostartpal(); + void bossman(); + void getridofpit(); + void convnum(); + void nothelderror(); + void readheader(); + void getsetad(); + void getyad(); + void reconstruct(); + void soldier1(); + void getundercentre(); + void checkforexit(); + void loadseg(); + void makeheader(); + void setkeyboardint(); + void priest(); + void readmouse(); + void powerlighton(); + void savefilewrite(); + void printmessage2(); + void loadnews(); + void rollem(); + void makeworn(); + void examineobtext(); + void startup(); + void savegame(); + void startpaltoend(); + void showicon(); + void findopenpos(); + void describeob(); + void deleteexframe(); + void folderexit(); + void useplinth(); + void wheelsound(); + void actualsave(); + void autolook(); + void checkbasemem(); + void transfertext(); + void searchforsame(); + void enablesoundint(); + void getback1(); + void setlocation(); + void fadefromwhite(); + void checksoundint(); + void usewindow(); + void wearshades(); + void onedigit(); + void pitinterupt(); + void deleverything(); + void fadescreendown(); + void findxyfrompath(); + void namestoold(); + void getxad(); + void openinv(); + void lookatplace(); + void useaxe(); + void examineob(); + void buttonnought(); + void useelvdoor(); + void putbackobstuff(); + void useladder(); + void realcredits(); + void handclap(); + void smokebloke(); + void showexit(); + void printundermon(); + void buttonnine(); + void findallopen(); + void loadintotemp3(); + void loadintotemp2(); + void gamer(); + void personnametext(); + void quitsymbol(); + void readfromfile(); + void initialinv(); + void showslots(); + void dofade(); + void hangon(); + void settopright(); + void findsetobject(); + void singlekey(); + void seecommandtail(); + void getundertimed(); + void hangone(); + void carparkdrip(); + void usediary(); + void deleteexobject(); + void frameoutnm(); + void moneypoke(); + void destselect(); + void restoreems(); + void lastdest(); + void removefreeobject(); + void trapdoor(); + void openlouis(); + void buttonthree(); + void getundermenu(); + void randomnumber(); + void lookatcard(); + void helicopter(); + void scrollmonitor(); + void setsoundoff(); + void setpickup(); + void dropobject(); + void printmessage(); + void reexfromopen(); + void fillryan(); + void loadtemptext(); + void usestereo(); + void showcurrentfile(); + void copyname(); + void look(); + void setmouse(); + void checkone(); + void transferinv(); + void candles2(); + void pickupob(); + void error(); + void showopbox(); + void clearbeforeload(); + void biblequote(); + void doload(); + void afterintroroom(); + void blockget(); + void usetrainer(); + void allocatework(); + void addtopresslist(); + void walkandexamine(); + void dmaend(); + void quickquit2(); + void twodigitnum(); + void madmantext(); + void dumpcurrent(); + void textforend(); + void showdiarykeys(); + void dontloadseg(); + void madmode(); + void intro3text(); + void allocatemem(); + void sortoutmap(); + void doorway(); + void useopened(); + void inventory(); + void powerlightoff(); + void getroomdata(); + void showoutermenu(); + void signon(); + void deleteextext(); + void foghornsound(); + void showrightpage(); + void openhoteldoor2(); + void examicon(); + void showgun(); + void switchryanon(); + void louischair(); + void saveems(); + void locationpic(); + void getflagunderp(); + void dolook(); + void opentvdoor(); + void triggermessage(); + void finalframe(); + void plotreel(); + void swapwithopen(); + void makesprite(); + void dreamweb(); + void droperror(); + void openfilenocheck(); + void calledensdlift(); + void checkinside(); + void gates(); + void selectlocation(); + void showwatch(); + void turnanypathon(); + void restorereels(); + void setwalk(); + void printboth(); + void useroutine(); + void zoomicon(); + void hotelcontrol(); + void findpathofpoint(); + void issetobonmap(); + void getdestinfo(); + void drunk(); + void dumpblink(); + void setuptimeduse(); + void grafittidoor(); + void input(); + void nextdest(); + void getdimension(); + void makecaps(); + void read(); + void fadescreenups(); + void checkdest(); + void initman(); + void loadpalfromiff(); + void facerightway(); + void startup1(); + void findlen(); + void showsymbol(); + void mugger(); + void atmospheres(); + void out22c(); + void loadpersonal(); + void gettingshot(); + void settopleft(); + void searchforstring(); + void clearsprites(); + void obpicture(); + void selectopenob(); + void widedoor(); + void security(); + void printasprite(); + void buttonfive(); + void soundonreels(); + void usegun(); + void autoappear(); + void findnextcolon(); + void readmouse4(); + void openryan(); + void readmouse1(); + void showman(); + void readmouse2(); + void newplace(); + void movemap(); + void loadsample(); + void usecardreader1(); + void usecardreader2(); + void usecardreader3(); + void tattooman(); + void usehandle(); + void quitkey(); + void openfile(); + void usecharset1(); + void makenextblock(); + void showpuztext(); + void addalong(); + void width160(); + void incryanpage(); + void dodoor(); + void eraseoldobs(); + void buttoneight(); + void opensarters(); + void findexobject(); + void errormessage2(); + void usechurchhole(); + void searchforfiles(); + void monkspeaking(); + void fadecalculation(); + void waitframes(); + void clearrest(); + void getreelframeax(); + void barwoman(); + void roomname(); + void credits(); + void madmanrun(); + void randomnum1(); + void keeper(); + void afternewroom(); + void getexad(); + void aide(); + void openforsave(); + void closefile(); + void delcurs(); + void randomaccess(); + void calcfrframe(); + void intromagic3(); + void initialmoncols(); + void checkforshake(); + void usebuttona(); + void cancelch1(); + void getnextword(); + void generalerror(); + void actualload(); + void allocateload(); + void saveposition(); + void mode640x480(); + void openeden(); + void execcommand(); + void obsthatdothings(); + void updatesymbolbot(); + void findpuztext(); + void usechurchgate(); + void monkandryan(); + void allocatebuffers(); + void convicons(); + void swapwithinv(); + void usecontrol(); + void buttonseven(); + void redrawmainscrn(); + void finishedwalking(); + void findallryan(); + void lockeddoorway(); + void channel0tran(); + void buttonpress(); + void parseblaster(); + void callhotellift(); + void makemainscreen(); + void intromonks2(); + void usewinch(); + void setbotright(); + void readmouse3(); + void showfirstuse(); + void setupemm(); + void usefullcart(); + void transfertoex(); + void getlocation(); + void geteitherad(); + void placesetobject(); + void drawflags(); + void zoomonoff(); + void updatesymboltop(); + void showryanpage(); + void printlogo(); + void allpointer(); + void showseconduse(); + void clearreels(); + void malefan(); + void dosaveload(); + void createname(); + void readcitypic(); + void getpersontext(); + void intoinv(); + void showtime(); + void parser(); + void hangonw(); + void intro(); + void hangonp(); + void fadescreendowns(); + void showloadops(); + void getridoftempsp(); + void scanfornames(); + void setallchanges(); + void newgame(); + void examinventory(); + void standardload(); + void undertextline(); + void findroominloc(); + void sitdowninbar(); + void shownames(); + void savefileread(); + void emergencypurge(); + void usemenu(); + void alleybarksound(); + void dosometalk(); + void usecart(); + void intromusic(); + void makename(); + void processtrigger(); + void monmessage(); + void readdesticon(); + void randomnum2(); + void loadsecondsample(); + void transfercontoex(); + void multiput(); + void isitright(); + void businessman(); + void switchryanoff(); + void commandwithob(); + void panelicons1(); + void adjustdown(); + void withwhat(); + void openob(); + void createfile(); + void userailing(); + void accesslightoff(); + void usehole(); + void useobject(); + void mainman(); + void volumeadjust(); + void checkiffree(); +}; +} + +#endif diff --git a/engines/dreamweb/dreamweb.cpp b/engines/dreamweb/dreamweb.cpp new file mode 100644 index 0000000000..8be02dc90e --- /dev/null +++ b/engines/dreamweb/dreamweb.cpp @@ -0,0 +1,572 @@ +/* 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. + * + * $URL: https://svn.scummvm.org:4444/svn/dreamweb/dreamweb.cpp $ + * $Id: dreamweb.cpp 79 2011-06-05 08:26:54Z eriktorbjorn $ + * + */ + +#include "common/config-manager.h" +#include "common/debug-channels.h" +#include "common/events.h" +#include "common/EventRecorder.h" +#include "common/file.h" +#include "common/func.h" +#include "common/system.h" +#include "common/timer.h" +#include "common/util.h" + +#include "audio/mixer.h" +#include "audio/decoders/raw.h" + +#include "graphics/palette.h" +#include "graphics/surface.h" + +#include "dreamweb/dreamweb.h" +#include "dreamweb/dreamgen.h" + +namespace DreamWeb { + +DreamWebEngine::DreamWebEngine(OSystem *syst, const DreamWebGameDescription *gameDesc) : + Engine(syst), _gameDescription(gameDesc), _rnd("dreamweb") { + + _context.engine = this; + // 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")); + + _vSyncInterrupt = false; + + _console = 0; + DebugMan.addDebugChannel(kDebugAnimation, "Animation", "Animation Debug Flag"); + DebugMan.addDebugChannel(kDebugSaveLoad, "SaveLoad", "Track Save/Load Function"); + _outSaveFile = 0; + _inSaveFile = 0; + _speed = 1; + _turbo = false; + _oldMouseState = 0; + _channel0 = 0; + _channel1 = 0; +} + +DreamWebEngine::~DreamWebEngine() { + DebugMan.clearAllDebugChannels(); + delete _console; +} + +static void vSyncInterrupt(void *refCon) { + DreamWebEngine *vm = (DreamWebEngine *)refCon; + + if (!vm->isPaused()) { + vm->setVSyncInterrupt(true); + } +} + +void DreamWebEngine::setVSyncInterrupt(bool flag) { + _vSyncInterrupt = flag; +} + +void DreamWebEngine::waitForVSync() { + processEvents(); + + if (!_turbo) { + while (!_vSyncInterrupt) { + _system->delayMillis(10); + } + setVSyncInterrupt(false); + } + + _context.doshake(); + _context.dofade(); + _system->updateScreen(); +} + +void DreamWebEngine::quit() { + _context.data.byte(DreamGen::DreamGenContext::kQuitrequested) = 1; + _context.data.byte(DreamGen::DreamGenContext::kLasthardkey) = 1; +} + +void DreamWebEngine::processEvents() { + Common::EventManager *event_manager = _system->getEventManager(); + if (event_manager->shouldQuit()) { + quit(); + return; + } + + if (_enableSavingOrLoading && _loadSavefile >= 0 && _loadSavefile <= 6) { + debug(1, "loading save state %d", _loadSavefile); + _context.data.byte(_context.kCurrentslot) = _loadSavefile; + _loadSavefile = -1; + _context.loadposition(); + _context.data.byte(_context.kGetback) = 1; + } + + soundHandler(); + Common::Event event; + int softKey, hardKey; + while (event_manager->pollEvent(event)) { + switch(event.type) { + case Common::EVENT_RTL: + quit(); + break; + case Common::EVENT_KEYDOWN: + if (event.kbd.flags & Common::KBD_CTRL) { + switch (event.kbd.keycode) { + + case Common::KEYCODE_d: + _console->attach(); + _console->onFrame(); + break; + + case Common::KEYCODE_f: + setSpeed(_speed != 20? 20: 1); + break; + + case Common::KEYCODE_g: + _turbo = !_turbo; + break; + + case Common::KEYCODE_c: //skip statue puzzle + _context.data.byte(DreamGen::DreamGenContext::kSymbolbotnum) = 3; + _context.data.byte(DreamGen::DreamGenContext::kSymboltopnum) = 5; + break; + + default: + break; + } + + return; //do not pass ctrl + key to the engine + } + + // Some parts of the ASM code uses the hardware key + // code directly. We don't have that code, so we fake + // it for the keys where it's needed and assume it's + // 0 (which is actually an invalid value, as far as I + // know) otherwise. + + hardKey = 0; + + switch (event.kbd.keycode) { + case Common::KEYCODE_ESCAPE: + hardKey = 1; + break; + case Common::KEYCODE_SPACE: + hardKey = 57; + break; + default: + hardKey = 0; + break; + } + + _context.data.byte(DreamGen::DreamGenContext::kLasthardkey) = hardKey; + + // The rest of the keys are converted to ASCII. This + // is fairly restrictive, and eventually we may want + // to let through more keys. I think this is mostly to + // keep weird glyphs out of savegame names. + + softKey = 0; + + if (event.kbd.keycode >= Common::KEYCODE_a && event.kbd.keycode <= Common::KEYCODE_z) { + softKey = event.kbd.ascii & ~0x20; + } else if (event.kbd.keycode == Common::KEYCODE_MINUS || + event.kbd.keycode == Common::KEYCODE_SPACE || + (event.kbd.keycode >= Common::KEYCODE_0 && event.kbd.keycode <= Common::KEYCODE_9)) { + softKey = event.kbd.ascii; + } else if (event.kbd.keycode >= Common::KEYCODE_KP0 && event.kbd.keycode <= Common::KEYCODE_KP9) { + softKey = event.kbd.keycode - Common::KEYCODE_KP0 + '0'; + } else if (event.kbd.keycode == Common::KEYCODE_KP_MINUS) { + softKey = '-'; + } else if (event.kbd.keycode == Common::KEYCODE_BACKSPACE || + event.kbd.keycode == Common::KEYCODE_DELETE) { + softKey = 8; + } else if (event.kbd.keycode == Common::KEYCODE_RETURN + || event.kbd.keycode == Common::KEYCODE_KP_ENTER) { + softKey = 13; + } + + if (softKey) + keyPressed(softKey); + break; + default: + break; + } + } +} + + +Common::Error DreamWebEngine::run() { + _console = new DreamWebConsole(this); + + _loadSavefile = Common::ConfigManager::instance().getInt("save_slot"); + + getTimerManager()->installTimerProc(vSyncInterrupt, 1000000 / 70, this); + //http://martin.hinner.info/vga/timing.html + + _context.__start(); + _context.data.byte(DreamGen::DreamGenContext::kQuitrequested) = 0; + + getTimerManager()->removeTimerProc(vSyncInterrupt); + + return Common::kNoError; +} + +void DreamWebEngine::setSpeed(uint speed) { + debug(0, "setting speed %u", speed); + _speed = speed; + getTimerManager()->removeTimerProc(vSyncInterrupt); + getTimerManager()->installTimerProc(vSyncInterrupt, 1000000 / 70 / speed, this); +} + +void DreamWebEngine::openFile(const Common::String &name) { + processEvents(); + closeFile(); + if (_file.open(name)) + return; + _inSaveFile = _system->getSavefileManager()->openForLoading(name); + if (_inSaveFile) + return; + error("cannot open file %s", name.c_str()); +} + +uint32 DreamWebEngine::skipBytes(uint32 bytes) { + if (!_file.seek(bytes, SEEK_CUR)) + error("seek failed"); + return _file.pos(); +} + +uint32 DreamWebEngine::readFromFile(uint8 *dst, unsigned size) { + processEvents(); + if (_file.isOpen()) + return _file.read(dst, size); + if (_inSaveFile) + return _inSaveFile->read(dst, size); + error("file was not opened (read before open)"); +} + +void DreamWebEngine::closeFile() { + processEvents(); + if (_file.isOpen()) + _file.close(); + delete _inSaveFile; + _inSaveFile = 0; + delete _outSaveFile; + _outSaveFile = 0; +} + +void DreamWebEngine::openSaveFileForWriting(const Common::String &name) { + processEvents(); + delete _outSaveFile; + _outSaveFile = _system->getSavefileManager()->openForSaving(name); +} + +bool DreamWebEngine::openSaveFileForReading(const Common::String &name) { + processEvents(); + delete _inSaveFile; + _inSaveFile = _system->getSavefileManager()->openForLoading(name); + return _inSaveFile != 0; +} + +uint DreamWebEngine::writeToSaveFile(const uint8 *data, uint size) { + processEvents(); + if (!_outSaveFile) + error("save file was not opened for writing"); + return _outSaveFile->write(data, size); +} + +uint DreamWebEngine::readFromSaveFile(uint8 *data, uint size) { + processEvents(); + if (!_inSaveFile) + error("save file was not opened for reading"); + return _inSaveFile->read(data, size); +} + + +void DreamWebEngine::keyPressed(uint16 ascii) { + debug(2, "key pressed = %04x", ascii); + uint8* keybuf = _context.data.ptr(5912, 16); //fixme: some hardcoded offsets are not added as consts + uint16 in = (_context.data.word(DreamGen::DreamGenContext::kBufferin) + 1) & 0x0f; + uint16 out = _context.data.word(DreamGen::DreamGenContext::kBufferout); + if (in == out) { + warning("keyboard buffer is full"); + return; + } + _context.data.word(DreamGen::DreamGenContext::kBufferin) = in; + keybuf[in] = ascii; +} + +void DreamWebEngine::mouseCall() { + processEvents(); + Common::EventManager *eventMan = _system->getEventManager(); + Common::Point pos = eventMan->getMousePos(); + if (pos.x > 298) + pos.x = 298; + if (pos.x < 15) + pos.x = 15; + if (pos.y < 15) + pos.y = 15; + if (pos.y > 184) + pos.y = 184; + _context.cx = pos.x; + _context.dx = pos.y; + + unsigned state = eventMan->getButtonState(); + _context.bx = state == _oldMouseState? 0: state; + _oldMouseState = state; + _context.flags._c = false; +} + +void DreamWebEngine::fadeDos() { + _context.ds = _context.es = _context.data.word(DreamGen::DreamGenContext::kBuffers); + return; //fixme later + waitForVSync(); + //processEvents will be called from vsync + uint8 *dst = _context.es.ptr(DreamGen::DreamGenContext::kStartpal, 768); + getPalette(dst, 0, 64); + for(int fade = 0; fade < 64; ++fade) { + for(int c = 0; c < 768; ++c) { //original sources decrement 768 values -> 256 colors + if (dst[c]) { + --dst[c]; + } + } + setPalette(dst, 0, 64); + waitForVSync(); + } +} + +void DreamWebEngine::setPalette() { + processEvents(); + unsigned n = (uint16)_context.cx; + uint8 *src = _context.ds.ptr(_context.si, n * 3); + setPalette(src, _context.al, n); + _context.si += n * 3; + _context.cx = 0; +} + +void DreamWebEngine::getPalette(uint8 *data, uint start, uint count) { + _system->getPaletteManager()->grabPalette(data, start, count); + while(count--) + *data++ >>= 2; +} + +void DreamWebEngine::setPalette(const uint8 *data, uint start, uint count) { + assert(start + count <= 256); + uint8 fixed[768]; + for(uint i = 0; i < count * 3; ++i) { + fixed[i] = data[i] << 2; + } + _system->getPaletteManager()->setPalette(fixed, start, count); +} + + +void DreamWebEngine::blit(const uint8 *src, int pitch, int x, int y, int w, int h) { + if (y + h > 200) + h = 200 - y; + if (x + w > 320) + w = 320 - x; + if (h <= 0 || w <= 0) + return; + _system->copyRectToScreen(src, pitch, x, y, w, h); +} + +void DreamWebEngine::printUnderMonitor() { + _context.es = _context.data.word(DreamGen::DreamGenContext::kWorkspace); + _context.di = DreamGen::DreamGenContext::kScreenwidth * 43 + 76; + _context.si = _context.di + 8 * DreamGen::DreamGenContext::kScreenwidth; + + Graphics::Surface *s = _system->lockScreen(); + if (!s) + error("lockScreen failed"); + + for(uint y = 0; y < 104; ++y) { + uint8 *src = (uint8 *)s->getBasePtr(76, 43 + 8 + y); + uint8 *dst = _context.es.ptr(_context.di, 170); + for(uint x = 0; x < 170; ++x) { + if (*src < 231) + *dst++ = *src++; + else { + ++dst; ++src; + } + } + _context._add(_context.di, DreamGen::DreamGenContext::kScreenwidth); + _context._add(_context.si, DreamGen::DreamGenContext::kScreenwidth); + } + _context.cx = 0; + _system->unlockScreen(); +} + +void DreamWebEngine::cls() { + _system->fillScreen(0); +} + +void DreamWebEngine::playSound(uint8 channel, uint8 id, uint8 loops) { + debug(1, "playSound(%u, %u, %u)", channel, id, loops); + const SoundData &data = _soundData[id >= 12? 1: 0]; + + Audio::Mixer::SoundType type; + bool speech = id == 62; //actually 50 + if (id >= 12) { + id -= 12; + type = Audio::Mixer::kSFXSoundType; + } else if (speech) + type = Audio::Mixer::kSpeechSoundType; + else + type = Audio::Mixer::kMusicSoundType; + + Audio::SeekableAudioStream *raw; + if (!speech) { + if (id >= data.samples.size() || data.samples[id].size == 0) { + warning("invalid sample #%u played", id); + return; + } + + const Sample &sample = data.samples[id]; + uint8 *buffer = (uint8 *)malloc(sample.size); + if (!buffer) + error("out of memory: cannot allocate memory for sound(%u bytes)", sample.size); + memcpy(buffer, data.data.begin() + sample.offset, sample.size); + + raw = Audio::makeRawStream( + buffer, + sample.size, 22050, Audio::FLAG_UNSIGNED); + } else { + uint8 *buffer = (uint8 *)malloc(_speechData.size()); + memcpy(buffer, _speechData.begin(), _speechData.size()); + if (!buffer) + error("out of memory: cannot allocate memory for sound(%u bytes)", _speechData.size()); + raw = Audio::makeRawStream( + buffer, + _speechData.size(), 22050, Audio::FLAG_UNSIGNED); + + } + + Audio::AudioStream *stream; + if (loops > 1) { + stream = new Audio::LoopingAudioStream(raw, loops < 255? loops: 0); + } else + stream = raw; + + if (_mixer->isSoundHandleActive(_channelHandle[channel])) + _mixer->stopHandle(_channelHandle[channel]); + _mixer->playStream(type, &_channelHandle[channel], stream); +} + +bool DreamWebEngine::loadSpeech(const Common::String &filename) { + Common::File file; + if (!file.open("speech/" + filename)) + return false; + + debug(1, "loadSpeech(%s)", filename.c_str()); + + uint size = file.size(); + _speechData.resize(size); + file.read(_speechData.begin(), size); + file.close(); + return true; +} + + +void DreamWebEngine::soundHandler() { + _context.push(_context.ax); + _context.volumeadjust(); + _context.ax = _context.pop(); + + uint volume = _context.data.byte(DreamGen::DreamGenContext::kVolume); + //.vol file loaded into soundbuf:0x4000 + //volume table at (volume * 0x100 + 0x3f00) + //volume value could be from 1 to 7 + //1 - 0x10-0xff + //2 - 0x1f-0xdf + //3 - 0x2f-0xd0 + //4 - 0x3e-0xc1 + //5 - 0x4d-0xb2 + //6 - 0x5d-0xa2 + //7 - 0x6f-0x91 + if (volume >= 8) + volume = 7; + volume = (8 - volume) * Audio::Mixer::kMaxChannelVolume / 8; + _mixer->setChannelVolume(_channelHandle[0], volume); + + uint8 ch0 = _context.data.byte(DreamGen::DreamGenContext::kCh0playing); + if (ch0 == 255) + ch0 = 0; + uint8 ch1 = _context.data.byte(DreamGen::DreamGenContext::kCh1playing); + if (ch1 == 255) + ch1 = 0; + uint8 ch0loop = _context.data.byte(DreamGen::DreamGenContext::kCh0repeat); + + if (_channel0 != ch0) { + _channel0 = ch0; + if (ch0) { + playSound(0, ch0, ch0loop); + } + } + if (_channel1 != ch1) { + _channel1 = ch1; + if (ch1) { + playSound(1, ch1, 1); + } + } + if (!_mixer->isSoundHandleActive(_channelHandle[0])) { + _context.data.byte(DreamGen::DreamGenContext::kCh0playing) = 255; + _channel0 = 0; + } + if (!_mixer->isSoundHandleActive(_channelHandle[1])) { + _context.data.byte(DreamGen::DreamGenContext::kCh1playing) = 255; + _channel1 = 0; + } + +} + +void DreamWebEngine::loadSounds(uint bank, const Common::String &filename) { + debug(1, "loadSounds(%u, %s)", bank, filename.c_str()); + Common::File file; + if (!file.open(filename)) { + warning("cannot open %s", filename.c_str()); + return; + } + + uint8 header[0x60]; + file.read(header, sizeof(header)); + uint tablesize = READ_LE_UINT16(header + 0x32); + debug(1, "table size = %u", tablesize); + + SoundData &soundData = _soundData[bank]; + soundData.samples.resize(tablesize / 6); + uint total = 0; + for(uint i = 0; i < tablesize / 6; ++i) { + uint8 entry[6]; + Sample &sample = soundData.samples[i]; + file.read(entry, sizeof(entry)); + sample.offset = entry[0] * 0x4000 + READ_LE_UINT16(entry + 1); + sample.size = READ_LE_UINT16(entry + 3) * 0x800; + total += sample.size; + debug(1, "offset: %08x, size: %u", sample.offset, sample.size); + } + soundData.data.resize(total); + file.read(soundData.data.begin(), total); + file.close(); +} + + +} // End of namespace DreamWeb + + diff --git a/engines/dreamweb/dreamweb.h b/engines/dreamweb/dreamweb.h new file mode 100644 index 0000000000..e0797bc96b --- /dev/null +++ b/engines/dreamweb/dreamweb.h @@ -0,0 +1,150 @@ +/* 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. + * + * $URL: https://svn.scummvm.org:4444/svn/dreamweb/dreamweb.h $ + * $Id: dreamweb.h 77 2011-05-18 14:26:43Z digitall $ + * + */ + +#ifndef DREAMWEB_H +#define DREAMWEB_H + +#include "common/error.h" +#include "common/file.h" +#include "common/random.h" +#include "common/rect.h" +#include "common/savefile.h" +#include "common/scummsys.h" +#include "common/system.h" + +#include "audio/audiostream.h" +#include "audio/mixer.h" + +#include "engines/engine.h" +#include "dreamweb/dreamgen.h" +#include "dreamweb/console.h" + +namespace DreamWeb { + +// Engine Debug Flags +enum { + kDebugAnimation = (1 << 0), + kDebugSaveLoad = (1 << 1) +}; + +struct DreamWebGameDescription; + +class DreamWebEngine : public Engine { +private: + DreamWebConsole *_console; + bool _vSyncInterrupt; + +protected: + // Engine APIs + virtual Common::Error run(); + virtual bool hasFeature(EngineFeature f) const; + +public: + DreamWebEngine(OSystem *syst, const DreamWebGameDescription *gameDesc); + virtual ~DreamWebEngine(); + + void setVSyncInterrupt(bool flag); + void waitForVSync(); + + Common::Error loadGameState(int slot); + Common::Error saveGameState(int slot, const Common::String &desc); + + bool canLoadGameStateCurrently(); + bool canSaveGameStateCurrently(); + + uint8 randomNumber() { return _rnd.getRandomNumber(255); } + + void openFile(const Common::String &name); + uint32 readFromFile(uint8 *data, unsigned size); + uint32 skipBytes(uint32 bytes); + void closeFile(); + + void mouseCall(); //fill mouse pos and button state + void processEvents(); + void setPalette(); + void fadeDos(); + void blit(const uint8 *src, int pitch, int x, int y, int w, int h); + void cls(); + + void getPalette(uint8 *data, uint start, uint count); + void setPalette(const uint8 *data, uint start, uint count); + + void openSaveFileForWriting(const Common::String &name); + uint writeToSaveFile(const uint8 *data, uint size); + + bool openSaveFileForReading(const Common::String &name); + uint readFromSaveFile(uint8 *data, uint size); + + void setShakePos(int pos) { _system->setShakePos(pos); } + void printUnderMonitor(); + + void quit(); + + void loadSounds(uint bank, const Common::String &file); + bool loadSpeech(const Common::String &filename); + + void enableSavingOrLoading(bool enable = true) { _enableSavingOrLoading = enable; } + +private: + void keyPressed(uint16 ascii); + void setSpeed(uint speed); + void soundHandler(); + void playSound(uint8 channel, uint8 id, uint8 loops); + + const DreamWebGameDescription *_gameDescription; + Common::RandomSource _rnd; + + Common::File _file; + Common::OutSaveFile *_outSaveFile; + Common::InSaveFile *_inSaveFile; + + uint _speed; + bool _turbo; + uint _oldMouseState; + int _loadSavefile; + bool _enableSavingOrLoading; + + struct Sample { + uint offset; + uint size; + Sample(): offset(), size() {} + }; + + struct SoundData { + Common::Array<Sample> samples; + Common::Array<uint8> data; + }; + SoundData _soundData[2]; + Common::Array<uint8> _speechData; + + Audio::SoundHandle _channelHandle[2]; + uint8 _channel0, _channel1; + + DreamGen::DreamGenContext _context; +}; + +} // End of namespace DreamWeb + +#endif diff --git a/engines/dreamweb/module.mk b/engines/dreamweb/module.mk new file mode 100644 index 0000000000..3b0c7f3325 --- /dev/null +++ b/engines/dreamweb/module.mk @@ -0,0 +1,16 @@ +MODULE := engines/dreamweb + +MODULE_OBJS := \ + console.o \ + detection.o \ + dreamweb.o \ + dreamgen.o \ + stubs.o + +# This module can be built as a plugin +ifeq ($(ENABLE_DREAMWEB), DYNAMIC_PLUGIN) +PLUGIN := 1 +endif + +# Include common rules +include $(srcdir)/rules.mk diff --git a/engines/dreamweb/runtime.h b/engines/dreamweb/runtime.h new file mode 100644 index 0000000000..724d5e4053 --- /dev/null +++ b/engines/dreamweb/runtime.h @@ -0,0 +1,563 @@ +#ifndef ENGINES_DREAMGEN_RUNTIME_H__ +#define ENGINES_DREAMGEN_RUNTIME_H__ + +#include <assert.h> +#include "common/scummsys.h" +#include "common/array.h" +#include "common/debug.h" +#include "common/hashmap.h" +#include "common/list.h" +#include "common/ptr.h" + +namespace DreamWeb { + class DreamWebEngine; +} + +namespace DreamGen { + +//fixme: name clash +#undef random + +struct Register { + union { + uint16 _value; + uint8 _part[2]; + }; + inline Register(): _value() {} + inline Register& operator=(uint16 v) { _value = v; return *this; } + inline operator uint16&() { return _value; } + inline void cbw() { + if (_value & 0x80) + _value |= 0xff00; + else + _value &= 0x7f; + } +}; + +template<int kIndex> //from low to high +struct RegisterPart { + uint8 &_value; + + explicit inline RegisterPart(Register ®) : _value(reg._part[kIndex]) {} + + inline operator uint8&() { + return _value; + } + + inline RegisterPart& operator=(const RegisterPart& o) { + _value = o._value; + return *this; + } + + inline RegisterPart& operator=(uint8 v) { + _value = v; + return *this; + } +}; + +#ifdef SCUMM_LITTLE_ENDIAN + typedef RegisterPart<0> LowPartOfRegister; + typedef RegisterPart<1> HighPartOfRegister; +#else + typedef RegisterPart<1> LowPartOfRegister; + typedef RegisterPart<0> HighPartOfRegister; +#endif + +class WordRef { + uint8 *_data; + unsigned _index; + uint16 _value; + +public: + inline WordRef(Common::Array<uint8> &data, unsigned index) : _data(data.begin() + index), _index(index) { + assert(index + 1 < data.size()); + _value = _data[0] | (_data[1] << 8); + } + + inline WordRef& operator=(const WordRef &ref) { + _value = ref._value; + return *this; + } + + inline WordRef& operator=(uint16 v) { + _value = v; + return *this; + } + + inline operator uint16&() { + return _value; + } + + inline ~WordRef() { + _data[0] = _value & 0xff; + _data[1] = _value >> 8; + _value = _data[0] | (_data[1] << 8); + } +}; + +struct Segment { + Common::Array<uint8> data; + + inline void assign(const uint8 *b, const uint8 *e) { + data.assign(b, e); + } + + inline uint8 &byte(unsigned index) { + assert(index < data.size()); + return data[index]; + } + + inline WordRef word(unsigned index) { + return WordRef(data, index); + } + + inline uint8* ptr(unsigned index, unsigned size) { + assert(index + size <= data.size()); + return data.begin() + index; + } +}; + +typedef Common::SharedPtr<Segment> SegmentPtr; + +class Context; + +class SegmentRef { + Context *_context; + uint16 _value; + SegmentPtr _segment; + +public: + SegmentRef(Context *ctx, uint16 value = 0, SegmentPtr segment = SegmentPtr()): _context(ctx), _value(value), _segment(segment) { + } + + inline void reset(uint16 value); + + inline SegmentRef& operator=(const uint16 id) { + reset(id); + return *this; + } + + inline SegmentRef& operator=(const SegmentRef &ref) { + _context = ref._context; + _value = ref._value; + _segment = ref._segment; + return *this; + } + + inline uint8 &byte(unsigned index) { + assert(_segment != 0); + return _segment->byte(index); + } + + inline operator uint16() const { + return _value; + } + + inline WordRef word(unsigned index) { + //debug(1, "getting word ref for %04x:%d", _value, index); + assert(_segment != 0); + return _segment->word(index); + } + + inline void assign(const uint8 *b, const uint8 *e) { + assert(_segment != 0); + _segment->assign(b, e); + } + + inline uint8* ptr(unsigned index, unsigned size) { + assert(_segment != 0); + return _segment->ptr(index, size); + } +}; + +struct Flags { + bool _z, _c, _s, _o; + inline Flags(): _z(true), _c(false), _s(false), _o(false) {} + + inline bool z() const { return _z; } + inline bool c() const { return _c; } + inline bool s() const { return _s; } + + inline bool l() const { return _o != _s; } + inline bool le() const { return _o != _s|| _z; } + + inline void update_zs(uint8 v) { + _s = v & 0x80; + _z = v == 0; + } + + inline void update_zs(uint16 v) { + _s = v & 0x8000; + _z = v == 0; + } + + inline void update_o(uint8 v, uint8 a, uint8 b) { + uint8 s1 = a & 0x80, s2 = b & 0x80; + _o = (s1 == s2) && (v & 0x80) != s1; + } + + inline void update_o(uint16 v, uint16 a, uint16 b) { + uint16 s1 = a & 0x8000, s2 = b & 0x8000; + _o = (s1 == s2) && (v & 0x8000) != s1; + } +}; + +class Context { + typedef Common::HashMap<uint16, SegmentPtr> SegmentMap; + SegmentMap _segments; + + typedef Common::List<uint16> FreeSegmentList; + FreeSegmentList _freeSegments; + +public: + DreamWeb::DreamWebEngine *engine; + + enum { kDefaultDataSegment = 0x1000 }; + + Register ax, dx, bx, cx, si, di; + LowPartOfRegister al; + HighPartOfRegister ah; + LowPartOfRegister bl; + HighPartOfRegister bh; + LowPartOfRegister cl; + HighPartOfRegister ch; + LowPartOfRegister dl; + HighPartOfRegister dh; + + SegmentRef cs, ds, es, data; + //data == fake segment register always pointing to data segment + Flags flags; + + inline Context(): engine(0), al(ax), ah(ax), bl(bx), bh(bx), cl(cx), ch(cx), dl(dx), dh(dx), + cs(this), ds(this), es(this), data(this) { + _segments[kDefaultDataSegment] = SegmentPtr(new Segment()); + cs.reset(kDefaultDataSegment); + ds.reset(kDefaultDataSegment); + es.reset(kDefaultDataSegment); + data.reset(kDefaultDataSegment); + } + + SegmentRef getSegment(uint16 value) { + SegmentMap::iterator i = _segments.find(value); + assert(i != _segments.end()); + return SegmentRef(this, value, i->_value); + } + + SegmentRef allocateSegment(uint size) { + unsigned id; + if (_freeSegments.empty()) + id = kDefaultDataSegment + _segments.size(); + else { + id = _freeSegments.front(); + _freeSegments.pop_front(); + } + assert(!_segments.contains(id)); + SegmentPtr seg(new Segment()); + seg->data.resize(size); + _segments[id] = seg; + return SegmentRef(this, id, seg); + } + + void deallocateSegment(uint16 id) { + SegmentMap::iterator i = _segments.find(id); + assert(i != _segments.end()); + _segments.erase(i); + _freeSegments.push_back(id); + } + + inline void _cmp(uint8 a, uint8 b) { + _sub(a, b); + } + + inline void _cmp(uint16 a, uint16 b) { + _sub(a, b); + } + + inline void _test(uint8 a, uint8 b) { + _and(a, b); + } + + inline void _test(uint16 a, uint16 b) { + _and(a, b); + } + + inline void _add(uint8 &dst, uint8 src) { + unsigned r = (unsigned)dst + src; + flags.update_o((uint8)r, dst, src); + flags._c = r >= 0x100; + dst = r; + flags.update_zs(dst); + } + + inline void _add(uint16 &dst, uint16 src) { + unsigned r = (unsigned)dst + src; + flags.update_o((uint16)r, dst, src); + flags._c = r >= 0x10000; + dst = r; + flags.update_zs(dst); + } + + inline void _sub(uint8 &dst, uint8 src) { + flags.update_o(uint8(dst - src), dst, (uint8)-src); + flags._c = dst < src; + dst -= src; + flags.update_zs(dst); + } + + inline void _sub(uint16 &dst, uint16 src) { + flags.update_o(uint16(dst - src), dst, (uint16)-src); + flags._c = dst < src; + dst -= src; + flags.update_zs(dst); + } + + inline void _inc(uint8 &dst) { + flags.update_o((uint8)(dst + 1), dst, 1); + ++dst; + flags.update_zs(dst); + } + + inline void _inc(uint16 &dst) { + flags.update_o((uint16)(dst + 1), dst, 1); + ++dst; + flags.update_zs(dst); + } + + inline void _dec(uint8 &dst) { + flags.update_o(uint8(dst - 1), dst, 1); + --dst; + flags.update_zs(dst); + } + + inline void _dec(uint16 &dst) { + flags.update_o(uint16(dst - 1), dst, 1); + --dst; + flags.update_zs(dst); + } + + inline void _and(uint8 &dst, uint8 src) { + dst &= src; + flags.update_zs(dst); + flags._c = flags._o = false; + } + + inline void _and(uint16 &dst, uint16 src) { + dst &= src; + flags.update_zs(dst); + flags._c = flags._o = false; + } + + inline void _or(uint8 &dst, uint8 src) { + dst |= src; + flags.update_zs(dst); + flags._c = flags._o = false; + } + + inline void _or(uint16 &dst, uint16 src) { + dst |= src; + flags.update_zs(dst); + flags._c = flags._o = false; + } + + inline void _xor(uint8 &dst, uint8 src) { + dst ^= src; + flags.update_zs(dst); + flags._c = flags._o = false; + } + + inline void _xor(uint16 &dst, uint16 src) { + dst ^= src; + flags.update_zs(dst); + flags._c = flags._o = false; + } + + inline void _shr(uint8 &dst, uint8 src) { + src &= 0x1f; + if (src > 0) { + dst >>= (src - 1); + flags._c = dst & 1; + dst >>= 1; + flags.update_zs(dst); + } + if (src == 1) + flags._o = dst & 0x80; + } + + inline void _shr(uint16 &dst, uint8 src) { + src &= 0x1f; + if (src > 0) { + dst >>= (src - 1); + flags._c = dst & 1; + dst >>= 1; + flags.update_zs(dst); + } + if (src == 1) + flags._o = dst & 0x8000; + } + + inline void _shl(uint8 &dst, uint8 src) { + src &= 0x1f; + if (src > 0) { + dst <<= (src - 1); + flags._c = dst & 0x80; + dst <<= 1; + flags.update_zs(dst); + } + if (src == 1) + flags._o = ((dst & 0x80) != 0) == flags._c; + } + inline void _shl(uint16 &dst, uint8 src) { + src &= 0x1f; + if (src > 0) { + dst <<= (src - 1); + flags._c = dst & 0x8000; + dst <<= 1; + flags.update_zs(dst); + } + if (src == 1) + flags._o = ((dst & 0x8000) != 0) == flags._c; + } + + inline void _mul(uint8 src) { + unsigned r = unsigned(al) * src; + ax = (uint16)r; + flags._c = r >= 0x10000; + flags._z = r == 0; + flags._s = r & 0x8000; + flags._o = ah != 0; + } + + inline void _mul(uint16 src) { + unsigned r = unsigned(ax) * src; //assuming here that we have at least 32 bits + dx = (r >> 16) & 0xffff; + ax = r & 0xffff; + flags._c = false; + flags._z = r == 0; + flags._s = r & 0x80000000; + flags._o = dx != 0; + } + + inline void _neg(uint8 &src) { + uint8 r = 0; + _sub(r, src); + src = r; + } + + inline void _neg(uint16 &src) { + uint16 r = 0; + _sub(r, src); + src = r; + } + + inline void _lodsb() { + al = ds.byte(si++); + } + + inline void _lodsw() { + ax = ds.word(si); + si += 2; + } + + inline void _movsb() { + es.byte(di++) = ds.byte(si++); + } + + inline void _movsb(uint size, bool clear_cx = false) { + assert(size != 0xffff); + uint8 *dst = es.ptr(di, size); + uint8 *src = ds.ptr(si, size); + memcpy(dst, src, size); + di += size; + si += size; + if (clear_cx) + cx = 0; + } + + inline void _movsw() { + _movsb(); + _movsb(); + } + + inline void _movsw(uint size, bool clear_cx = false) { + assert(size != 0xffff); + _movsb(size * 2, clear_cx); + } + + inline void _stosb() { + es.byte(di++) = al; + } + + inline void _stosb(uint size, bool clear_cx = false) { + assert(size != 0xffff); + uint8 *dst = es.ptr(di, size); + memset(dst, al, size); + di += size; + if (clear_cx) + cx = 0; + } + + inline void _stosw() { + es.byte(di++) = al; + es.byte(di++) = ah; + } + + inline void _stosw(uint size, bool clear_cx = false) { + assert(size != 0xffff); + uint8 *dst = es.ptr(di, size * 2); + di += 2 * size; + while(size--) { + *dst++ = al; + *dst++ = ah; + } + if (clear_cx) + cx = 0; + } + + inline void _xchg(uint16 &a, uint16 &b) { + uint16 x = a; + a = b; + b = x; + } + + inline void _xchg(uint8 &a, uint8 &b) { + uint8 t = a; + a = b; + b = t; + } + + Common::Array<uint16> stack; + inline void push(uint16 v) { + stack.push_back(v); + } + + inline uint16 pop() { + assert(!stack.empty()); + uint16 v = stack.back(); + stack.pop_back(); + return v; + } +}; + +inline void SegmentRef::reset(uint16 value) { + *this = _context->getSegment(value); +} + +class StackChecker { + const Context &_context; + const uint _stackDepth; + +public: + StackChecker(const Context &context): _context(context), _stackDepth(context.stack.size()) {} + ~StackChecker() { assert(_context.stack.size() == _stackDepth); } +}; + +#ifndef NDEBUG +# define STACK_CHECK StackChecker checker(*this) +#else +# define STACK_CHECK do {} while (0) +#endif + +} + +#endif + diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp new file mode 100644 index 0000000000..eebfbeb0d4 --- /dev/null +++ b/engines/dreamweb/stubs.cpp @@ -0,0 +1,506 @@ +#include "dreamweb/dreamweb.h" +#include "engines/util.h" +#include "graphics/surface.h" + +namespace DreamGen { + +Common::String getFilename(Context &context) { + uint16 name_ptr = context.dx; + Common::String name; + uint8 c; + while((c = context.cs.byte(name_ptr++)) != 0) + name += (char)c; + return name; +} + +void DreamGenContext::multiget() { + unsigned w = (uint8)cl, h = (uint8)ch; + unsigned x = (uint16)di, y = (uint16)bx; + unsigned src = x + y * kScreenwidth; + unsigned dst = (uint16)si; + es = ds; + ds = data.word(kWorkspace); + if (y + h > 200) + h = 200 - y; + if (x + w > 320) + w = 320 - x; + //debug(1, "multiget %u,%u %ux%u -> segment: %04x->%04x", x, y, w, h, (uint16)ds, (uint16)es); + for(unsigned l = 0; l < h; ++l) { + uint8 *src_p = ds.ptr(src + kScreenwidth * l, w); + uint8 *dst_p = es.ptr(dst + w * l, w); + memcpy(dst_p, src_p, w); + } + si += w * h; + di = src + kScreenwidth * h; + cx = 0; +} + +void DreamGenContext::multiput() { + unsigned w = (uint8)cl, h = (uint8)ch; + unsigned x = (uint16)di, y = (uint16)bx; + unsigned src = (uint16)si; + unsigned dst = x + y * kScreenwidth; + es = data.word(kWorkspace); + if (y + h > 200) + h = 200 - y; + if (x + w > 320) + w = 320 - x; + //debug(1, "multiput %ux%u -> segment: %04x->%04x", w, h, (uint16)ds, (uint16)es); + for(unsigned l = 0; l < h; ++l) { + uint8 *src_p = ds.ptr(src + w * l, w); + uint8 *dst_p = es.ptr(dst + kScreenwidth * l, w); + memcpy(dst_p, src_p, w); + } + si += w * h; + di = dst + kScreenwidth * h; + cx = 0; +} + +void DreamGenContext::multidump() { + ds = data.word(kWorkspace); + int w = (uint8)cl, h = (uint8)ch; + int x = (int16)di, y = (int16)bx; + unsigned offset = x + y * kScreenwidth; + //debug(1, "multidump %ux%u(segment: %04x) -> %d,%d(address: %d)", w, h, (uint16)ds, x, y, offset); + engine->blit(ds.ptr(offset, w * h), kScreenwidth, x, y, w, h); + si = di = offset + h * kScreenwidth; + cx = 0; +} + +void DreamGenContext::worktoscreen() { + ds = data.word(kWorkspace); + uint size = 320 * 200; + engine->blit(ds.ptr(0, size), 320, 0, 0, 320, 200); + di = si = size; + cx = 0; +} + +void DreamGenContext::printundermon() { + engine->printUnderMonitor(); +} + +void DreamGenContext::cls() { + engine->cls(); +} + +void DreamGenContext::frameoutnm() { + unsigned w = (uint8)cl, h = (uint8)ch; + unsigned pitch = (uint16)dx; + unsigned src = (uint16)si; + int x = (uint16)di, y = (uint16)bx; + unsigned dst = x + y * pitch; + //debug(1, "framenm %ux%u[pitch: %u]-> %d,%d, segment: %04x->%04x", w, h, pitch, x, y, (uint16)ds, (uint16)es); + for(unsigned l = 0; l < h; ++l) { + uint8 *src_p = ds.ptr(src + w * l, w); + uint8 *dst_p = es.ptr(dst + pitch * l, w); + memcpy(dst_p, src_p, w); + } + di += dst + pitch * h; + si += w * h; + cx = 0; +} + +void DreamGenContext::seecommandtail() { + data.word(kSoundbaseadd) = 0x220; + data.byte(kSoundint) = 5; + data.byte(kSounddmachannel) = 1; + data.byte(kBrightness) = 1; + data.word(kHowmuchalloc) = 0x9360; +} + +void DreamGenContext::randomnumber() { + al = engine->randomNumber(); +} + +void DreamGenContext::quickquit() { + engine->quit(); +} + +void DreamGenContext::quickquit2() { + engine->quit(); +} + +void DreamGenContext::keyboardread() { + ::error("keyboardread"); //this keyboard int handler, must never be called +} + +void DreamGenContext::resetkeyboard() { +} + +void DreamGenContext::setkeyboardint() { +} + +void DreamGenContext::readfromfile() { + uint16 dst_offset = dx; + uint16 size = cx; + debug(1, "readfromfile(%04x:%u, %u)", (uint16)ds, dst_offset, size); + ax = engine->readFromFile(ds.ptr(dst_offset, size), size); + flags._c = false; +} + +void DreamGenContext::closefile() { + engine->closeFile(); + data.byte(kHandle) = 0; +} + +void DreamGenContext::openforsave() { + const char *name = (const char *)ds.ptr(dx, 13); + debug(1, "openforsave(%s)", name); + engine->openSaveFileForWriting(name); +} + +void DreamGenContext::openfilenocheck() { + const char *name = (const char *)ds.ptr(dx, 13); + debug(1, "checksavefile(%s)", name); + bool ok = engine->openSaveFileForReading(name); + flags._c = !ok; +} + +void DreamGenContext::openfilefromc() { + openfilenocheck(); +} + +void DreamGenContext::openfile() { + Common::String name = getFilename(*this); + debug(1, "opening file: %s", name.c_str()); + engine->openFile(name); + cs.word(kHandle) = 1; //only one handle + flags._c = false; +} + +void DreamGenContext::createfile() { + ::error("createfile"); +} + +void DreamGenContext::dontloadseg() { + ax = es.word(di); + _add(di, 2); + dx = ax; + cx = 0; + unsigned pos = engine->skipBytes(dx); + dx = pos >> 16; + ax = pos & 0xffff; + flags._c = false; +} + +void DreamGenContext::mousecall() { + engine->mouseCall(); +} + +void DreamGenContext::setmouse() { + data.word(kOldpointerx) = 0xffff; +} + +void DreamGenContext::gettime() { + TimeDate t; + g_system->getTimeAndDate(t); + debug(1, "\tgettime: %02d:%02d:%02d", t.tm_hour, t.tm_min, t.tm_sec); + ch = t.tm_hour; + cl = t.tm_min; + dh = t.tm_sec; + data.byte(kSecondcount) = dh; + data.byte(kMinutecount) = cl; + data.byte(kHourcount) = ch; +} + +void DreamGenContext::allocatemem() { + uint size = (bx + 2) * 16; + debug(1, "allocate mem, %u bytes", size); + flags._c = false; + SegmentRef seg = allocateSegment(size); + ax = (uint16)seg; + debug(1, "\tsegment address -> %04x", (uint16)ax); +} + +void DreamGenContext::deallocatemem() { + uint16 id = (uint16)es; + debug(1, "deallocating segment %04x", id); + deallocateSegment(id); + + //fixing invalid entries in the sprite table + es = data; + uint tsize = 16 * 32; + uint16 bseg = data.word(kBuffers); + if (!bseg) + return; + SegmentRef buffers(this); + buffers = bseg; + uint8 *ptr = buffers.ptr(kSpritetable, tsize); + for(uint i = 0; i < tsize; i += 32) { + uint16 seg = READ_LE_UINT16(ptr + i + 6); + //debug(1, "sprite segment = %04x", seg); + if (seg == id) + memset(ptr + i, 0xff, 32); + } +} + +void DreamGenContext::removeemm() { + ::error("removeemm"); +} + +void DreamGenContext::setupemm() { +} + +void DreamGenContext::pitinterupt() { + ::error("pitinterupt"); +} + +void DreamGenContext::getridofpit() { + ::error("getridofpit"); +} + +void DreamGenContext::setuppit() { + ::error("setuppit"); +} + +void DreamGenContext::startdmablock() { + ::error("startdmablock"); +} + +void DreamGenContext::dmaend() { + ::error("dmaend"); +} + +void DreamGenContext::restoreems() { + ::error("restoreems"); +} + +void DreamGenContext::saveems() { + ::error("saveems"); +} + +void DreamGenContext::bothchannels() { + ::error("bothchannels"); +} + +void DreamGenContext::channel1only() { + ::error("channel1only"); +} + +void DreamGenContext::channel0only() { + ::error("channel0only"); +} + +void DreamGenContext::out22c() { + ::error("out22c"); +} + +void DreamGenContext::soundstartup() {} +void DreamGenContext::soundend() {} +void DreamGenContext::interupttest() {} +void DreamGenContext::disablesoundint() {} +void DreamGenContext::enablesoundint() {} +void DreamGenContext::checksoundint() { + data.byte(kTestresult) = 1; +} + +void DreamGenContext::setsoundoff() { + warning("setsoundoff: STUB"); +} + +void DreamGenContext::loadsample() { + engine->loadSounds(0, (const char *)data.ptr(dx, 13)); +} + +void DreamGenContext::loadsecondsample() { + uint8 ch0 = data.byte(kCh0playing); + if (ch0 >= 12 && ch0 != 255) + cancelch0(); + uint8 ch1 = data.byte(kCh1playing); + if (ch1 >= 12) + cancelch1(); + engine->loadSounds(1, (const char *)data.ptr(dx, 13)); +} + +void DreamGenContext::loadspeech() { + cancelch1(); + data.byte(kSpeechloaded) = 0; + createname(); + const char *name = (const char *)data.ptr(di, 13); + //warning("name = %s", name); + if (engine->loadSpeech(name)) + data.byte(kSpeechloaded) = 1; +} + +void DreamGenContext::saveseg() { + cx = es.word(di); + _add(di, 2); + savefilewrite(); +} + +void DreamGenContext::savefilewrite() { + ax = engine->writeToSaveFile(ds.ptr(dx, cx), cx); +} + +void DreamGenContext::savefileread() { + ax = engine->readFromSaveFile(ds.ptr(dx, cx), cx); +} + +void DreamGenContext::loadseg() { + ax = es.word(di); + di += 2; + + uint16 dst_offset = dx; + uint16 size = ax; + + debug(1, "loadseg(%04x:%u, %u)", (uint16)ds, dst_offset, size); + ax = engine->readFromFile(ds.ptr(dst_offset, size), size); + flags._c = false; +} + +void DreamGenContext::error() { + ::error("error"); +} + +void DreamGenContext::generalerror() { + ::error("generalerror"); +} + +void DreamGenContext::dosreturn() { + + _cmp(data.byte(kCommandtype), 250); + if (!flags.z()) { + data.byte(kCommandtype) = 250; + al = 46; + commandonly(); + } + + ax = data.word(kMousebutton); + _and(ax, 1); + if (flags.z()) + return; + + data.word(kMousebutton) = 0; + engine->quit(); +} + +void DreamGenContext::set16colpalette() { + //fixme: this is a bit hackish, set16colpalette called after initialization and nearly before main loop. + engine->enableSavingOrLoading(); +} + +void DreamGenContext::mode640x480() { + // Video mode 12h: 640x480 pixels, 16 colors, I believe + al = 0x12 + 128; + ah = 0; + initGraphics(640, 480, true); +} + +void DreamGenContext::showgroup() { + engine->setPalette(); +} + +void DreamGenContext::fadedos() { + engine->fadeDos(); +} + +void DreamGenContext::doshake() { + uint8 &counter = data.byte(kShakecounter); + _cmp(counter, 48); + if (flags.z()) + return; + + _add(counter, 1); + static const int shakeTable[] = { + 0, -2, 3, -2, 0, 2, 4, -1, + 1, -3, 3, 2, 0, -2, 3, -2, + 0, 2, 4, -1, 1, -3, 3, 2, + 0, -2, 3, -2, 0, 2, 4, -1, + + 1, -3, 3, 2, 0, -2, 3, -2, + 0, 2, 4, -1, 1, -3, 3, 2, + 0, -2, 3, -2, 0, 2, 4, -1, + 1, -3, 3, 2, 0, -2, 3, -2, + + 0, 2, 4, -1, 1, -3, 3, 2, + 0, -2, 3, -2, 0, 2, 4, -1, + 1, -3, 3, 2, 0, -2, 3, -2, + 0, 2, 4, -1, 1, -3, 3, 2, + + 0, -2, 3, -2, 0, 2, 4, -1, + 1, -3, 3, 0, + }; + int offset = shakeTable[counter]; + engine->setShakePos(offset >= 0? offset: -offset); +} + +void DreamGenContext::vsync() { + engine->waitForVSync(); +} + +void DreamGenContext::setmode() { + vsync(); + initGraphics(320, 200, false); +} + +void DreamGenContext::showpcx() { + Common::String name = getFilename(*this); + Common::File pcxFile; + + if (!pcxFile.open(name)) { + warning("showpcx: Could not open '%s'", name.c_str()); + return; + } + + uint8 *maingamepal; + int i, j; + + // Read the 16-color palette into the 'maingamepal' buffer. Note that + // the color components have to be adjusted from 8 to 6 bits. + + pcxFile.seek(16, SEEK_SET); + es = data.word(kBuffers); + maingamepal = es.ptr(kMaingamepal, 768); + pcxFile.read(maingamepal, 48); + + memset(maingamepal + 48, 0xff, 720); + for (i = 0; i < 48; i++) { + maingamepal[i] >>= 2; + } + + // Decode the image data. + + Graphics::Surface *s = g_system->lockScreen(); + Common::Rect rect(640, 480); + + s->fillRect(rect, 0); + pcxFile.seek(128, SEEK_SET); + + for (int y = 0; y < 480; y++) { + byte *dst = (byte *)s->getBasePtr(0, y); + int decoded = 0; + + while (decoded < 320) { + byte col = pcxFile.readByte(); + byte len; + + if ((col & 0xc0) == 0xc0) { + len = col & 0x3f; + col = pcxFile.readByte(); + } else { + len = 1; + } + + // The image uses 16 colors and is stored as four bit + // planes, one for each bit of the color, least + // significant bit plane first. + + for (i = 0; i < len; i++) { + int plane = decoded / 80; + int pos = decoded % 80; + + for (j = 0; j < 8; j++) { + byte bit = (col >> (7 - j)) & 1; + dst[8 * pos + j] |= (bit << plane); + } + + decoded++; + } + } + } + + g_system->unlockScreen(); + pcxFile.close(); +} + +} /*namespace dreamgen */ diff --git a/engines/engine.cpp b/engines/engine.cpp index dc30b4bd0d..dde5064dc4 100644 --- a/engines/engine.cpp +++ b/engines/engine.cpp @@ -400,6 +400,17 @@ void Engine::openMainMenuDialog() { syncSoundSettings(); } +bool Engine::warnUserAboutUnsupportedGame() { + if (ConfMan.getBool("enable_unsupported_game_warning")) { + GUI::MessageDialog alert(_("WARNING: The game you are about to start is" + " not yet fully supported by ScummVM. As such, it is likely to be" + " unstable, and any saves you make might not work in future" + " versions of ScummVM."), _("Start anyway"), _("Cancel")); + return alert.runModal() == GUI::kMessageOK; + } + return true; +} + uint32 Engine::getTotalPlayTime() const { if (!_pauseLevel) return _system->getMillis() - _engineStartTime; diff --git a/engines/engine.h b/engines/engine.h index d7d971ad97..06b7f7dedd 100644 --- a/engines/engine.h +++ b/engines/engine.h @@ -252,6 +252,13 @@ public: void openMainMenuDialog(); /** + * Display a warning to the user that the game is not fully supported. + * + * @return true if the user chose to start anyway, false otherwise + */ + static bool warnUserAboutUnsupportedGame(); + + /** * Get the total play time. * * @return How long the player has been playing in ms. diff --git a/engines/engines.mk b/engines/engines.mk index f8ff823c13..dc09fbd54e 100644 --- a/engines/engines.mk +++ b/engines/engines.mk @@ -46,6 +46,11 @@ DEFINES += -DENABLE_DRASCULA=$(ENABLE_DRASCULA) MODULES += engines/drascula endif +ifdef ENABLE_DREAMWEB +DEFINES += -DENABLE_DREAMWEB=$(ENABLE_DREAMWEB) +MODULES += engines/dreamweb +endif + ifdef ENABLE_GOB DEFINES += -DENABLE_GOB=$(ENABLE_GOB) MODULES += engines/gob diff --git a/engines/game.cpp b/engines/game.cpp index c6d9905b52..8ea68bb681 100644 --- a/engines/game.cpp +++ b/engines/game.cpp @@ -46,7 +46,7 @@ GameDescriptor::GameDescriptor(const PlainGameDescriptor &pgd, uint32 guioptions setVal("guioptions", Common::getGameGUIOptionsDescription(guioptions)); } -GameDescriptor::GameDescriptor(const Common::String &g, const Common::String &d, Common::Language l, Common::Platform p, uint32 guioptions) { +GameDescriptor::GameDescriptor(const Common::String &g, const Common::String &d, Common::Language l, Common::Platform p, uint32 guioptions, GameSupportLevel gsl) { setVal("gameid", g); setVal("description", d); if (l != Common::UNK_LANG) @@ -55,6 +55,8 @@ GameDescriptor::GameDescriptor(const Common::String &g, const Common::String &d, setVal("platform", Common::getPlatformCode(p)); if (guioptions != 0) setVal("guioptions", Common::getGameGUIOptionsDescription(guioptions)); + + setSupportLevel(gsl); } void GameDescriptor::setGUIOptions(uint32 guioptions) { @@ -69,9 +71,6 @@ void GameDescriptor::appendGUIOptions(const Common::String &str) { } void GameDescriptor::updateDesc(const char *extra) { - // TODO: The format used here (LANG/PLATFORM/EXTRA) is not set in stone. - // We may want to change the order (PLATFORM/EXTRA/LANG, anybody?), or - // the seperator (instead of '/' use ', ' or ' '). const bool hasCustomLanguage = (language() != Common::UNK_LANG); const bool hasCustomPlatform = (platform() != Common::kPlatformUnknown); const bool hasExtraDesc = (extra && extra[0]); @@ -97,3 +96,30 @@ void GameDescriptor::updateDesc(const char *extra) { setVal("description", descr); } } + +GameSupportLevel GameDescriptor::getSupportLevel() { + GameSupportLevel gsl = kStableGame; + if (contains("gsl")) { + Common::String gslString = getVal("gsl"); + if (gslString.equals("unstable")) + gsl = kUnstableGame; + else if (gslString.equals("testing")) + gsl = kTestingGame; + } + return gsl; +} + +void GameDescriptor::setSupportLevel(GameSupportLevel gsl) { + switch (gsl) { + case kUnstableGame: + setVal("gsl", "unstable"); + break; + case kTestingGame: + setVal("gsl", "testing"); + break; + case kStableGame: + // Fall Through intended + default: + erase("gsl"); + } +} diff --git a/engines/game.h b/engines/game.h index 3216cfb628..9082d93793 100644 --- a/engines/game.h +++ b/engines/game.h @@ -47,6 +47,15 @@ struct PlainGameDescriptor { const PlainGameDescriptor *findPlainGameDescriptor(const char *gameid, const PlainGameDescriptor *list); /** + * Ths is an enum to describe how done a game is. This also indicates what level of support is expected. + */ +enum GameSupportLevel { + kStableGame = 0, // the game is fully supported + kTestingGame, // the game is not supposed to end up in releases yet but is ready for public testing + kUnstableGame // the game is not even ready for public testing yet +}; + +/** * A hashmap describing details about a given game. In a sense this is a refined * version of PlainGameDescriptor, as it also contains a gameid and a description string. * But in addition, platform and language settings, as well as arbitrary other settings, @@ -61,16 +70,25 @@ public: const Common::String &description, Common::Language language = Common::UNK_LANG, Common::Platform platform = Common::kPlatformUnknown, - uint32 guioptions = 0); + uint32 guioptions = 0, + GameSupportLevel gsl = kStableGame); /** - * Update the description string by appending (LANG/PLATFORM/EXTRA) to it. + * Update the description string by appending (EXTRA/PLATFORM/LANG) to it. + * Values that are missing are omitted, so e.g. (EXTRA/LANG) would be + * added if no platform has been specified but a language and an extra string. */ void updateDesc(const char *extra = 0); void setGUIOptions(uint32 options); void appendGUIOptions(const Common::String &str); + /** + * What level of support is expected of this game + */ + GameSupportLevel getSupportLevel(); + void setSupportLevel(GameSupportLevel gsl); + Common::String &gameid() { return getVal("gameid"); } Common::String &description() { return getVal("description"); } const Common::String &gameid() const { return getVal("gameid"); } diff --git a/engines/gob/inter_fascin.cpp b/engines/gob/inter_fascin.cpp index bab1975abc..081b48fbad 100644 --- a/engines/gob/inter_fascin.cpp +++ b/engines/gob/inter_fascin.cpp @@ -174,7 +174,7 @@ void Inter_Fascination::oFascin_assign(OpFuncParams ¶ms) { case TYPE_VAR_INT32_AS_INT16: case TYPE_ARRAY_INT16: - WRITE_VARO_UINT16(dest + i * 2, _vm->_game->_script->getResultInt()); + WRITE_VARO_UINT16(dest + i * 2, _vm->_game->_script->getResultInt()); break; case TYPE_VAR_INT32: diff --git a/engines/gob/video_v6.cpp b/engines/gob/video_v6.cpp index e2c952952d..7fb3104162 100644 --- a/engines/gob/video_v6.cpp +++ b/engines/gob/video_v6.cpp @@ -124,7 +124,7 @@ void Video_v6::drawYUV(Surface &destDesc, int16 x, int16 y, Pixel dstRow = dst; int nextChromaLine = (i < ((height - 1) & ~3) ) ? dataWidth : 0; - + for (int j = 0; j < width; j++, dstRow++) { int nextChromaColumn = (j < ((width - 1) & ~3)) ? 1 : 0; diff --git a/engines/groovie/detection.cpp b/engines/groovie/detection.cpp index 2065307ca9..62887bac1e 100644 --- a/engines/groovie/detection.cpp +++ b/engines/groovie/detection.cpp @@ -131,7 +131,7 @@ static const GroovieGameDescription gameDescriptions[] = { { "11h", "", AD_ENTRY1s("disk.1", "5c0428cd3659fc7bbcd0aa16485ed5da", 227), - Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM }, kGroovieV2, 1 @@ -142,7 +142,7 @@ static const GroovieGameDescription gameDescriptions[] = { { "11h", "Demo", AD_ENTRY1s("disk.1", "aacb32ce07e0df2894bd83a3dee40c12", 70), - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, Common::GUIO_NOLAUNCHLOAD | + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, Common::GUIO_NOLAUNCHLOAD | Common::GUIO_MIDIADLIB | Common::GUIO_MIDIMT32 | Common::GUIO_MIDIGM }, kGroovieV2, 1 @@ -153,7 +153,7 @@ static const GroovieGameDescription gameDescriptions[] = { { "11h", "Making Of", AD_ENTRY1s("disk.1", "5c0428cd3659fc7bbcd0aa16485ed5da", 227), - Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, Common::GUIO_NOMIDI | Common::GUIO_NOLAUNCHLOAD + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, Common::GUIO_NOMIDI | Common::GUIO_NOLAUNCHLOAD }, kGroovieV2, 2 }, @@ -163,7 +163,7 @@ static const GroovieGameDescription gameDescriptions[] = { { "clandestiny", "Trailer", AD_ENTRY1s("disk.1", "5c0428cd3659fc7bbcd0aa16485ed5da", 227), - Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, Common::GUIO_NOMIDI | Common::GUIO_NOLAUNCHLOAD + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, Common::GUIO_NOMIDI | Common::GUIO_NOLAUNCHLOAD }, kGroovieV2, 3 }, @@ -173,7 +173,7 @@ static const GroovieGameDescription gameDescriptions[] = { { "clandestiny", "", AD_ENTRY1s("disk.1", "f79fc1515174540fef6a34132efc4c53", 76), - Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, Common::GUIO_NOMIDI + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, Common::GUIO_NOMIDI }, kGroovieV2, 1 }, @@ -183,7 +183,7 @@ static const GroovieGameDescription gameDescriptions[] = { { "unclehenry", "", AD_ENTRY1s("disk.1", "0e1b1d3cecc4fc7efa62a968844d1f7a", 72), - Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, Common::GUIO_NOMIDI + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, Common::GUIO_NOMIDI }, kGroovieV2, 1 }, @@ -193,7 +193,7 @@ static const GroovieGameDescription gameDescriptions[] = { { "tlc", "", AD_ENTRY1s("disk.1", "32a1afa68478f1f9d2b25eeea427f2e3", 84), - Common::EN_ANY, Common::kPlatformPC, ADGF_NO_FLAGS, Common::GUIO_NOMIDI + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, Common::GUIO_NOMIDI }, kGroovieV2, 1 }, diff --git a/engines/groovie/music.cpp b/engines/groovie/music.cpp index 33fc986193..c6e990dfcf 100644 --- a/engines/groovie/music.cpp +++ b/engines/groovie/music.cpp @@ -801,17 +801,17 @@ bool MusicPlayerIOS::load(uint32 fileref, bool loop) { 19468 ambient (but not 69, amb b. odd) 19470 puzzle 19471 - 19473 + 19473 19475 coffins or blood pump 19476 blood pump or coffins 19493 19499 chapel 19509 downstair ambient 19510 bedroom 'skip 3 and 5' puzzle (should loop from partway?) - 19514 + 19514 19515 bathroom drain teeth */ - if ((fileref >= 19462 && fileref <= 19468) || + if ((fileref >= 19462 && fileref <= 19468) || fileref == 19470 || fileref == 19471 || fileref == 19473 || fileref == 19475 || fileref == 19476 || fileref == 19493 || @@ -849,7 +849,7 @@ bool MusicPlayerIOS::load(uint32 fileref, bool loop) { updateVolume(); // Play! - _vm->_system->getMixer()->playStream(Audio::Mixer::kMusicSoundType, &_handle, audStream); + _vm->_system->getMixer()->playStream(Audio::Mixer::kMusicSoundType, &_handle, audStream); return true; } diff --git a/engines/groovie/player.h b/engines/groovie/player.h index d8135a99b2..c9258ffdbd 100644 --- a/engines/groovie/player.h +++ b/engines/groovie/player.h @@ -53,8 +53,8 @@ protected: Common::SeekableReadStream *_file; uint16 _flags; Audio::QueuingAudioStream *_audioStream; - - + + private: // Synchronization stuff bool _begunPlaying; diff --git a/engines/hugo/console.cpp b/engines/hugo/console.cpp index 0a67b5cd0a..19fd91e3fa 100644 --- a/engines/hugo/console.cpp +++ b/engines/hugo/console.cpp @@ -64,8 +64,8 @@ bool HugoConsole::Cmd_gotoScreen(int argc, const char **argv) { if ((argc != 2) || (strToInt(argv[1]) > _vm->_numScreens)){ DebugPrintf("Usage: %s <screen number>\n", argv[0]); return true; - } - + } + _vm->_scheduler->newScreen(strToInt(argv[1])); return false; } @@ -78,7 +78,7 @@ bool HugoConsole::Cmd_listScreens(int argc, const char **argv) { DebugPrintf("Usage: %s\n", argv[0]); return true; } - + DebugPrintf("Available screens for this game are:\n"); for (int i = 0; i < _vm->_numScreens; i++) DebugPrintf("%2d - %s\n", i, _vm->_text->getScreenNames(i)); @@ -93,7 +93,7 @@ bool HugoConsole::Cmd_listObjects(int argc, const char **argv) { DebugPrintf("Usage: %s\n", argv[0]); return true; } - + DebugPrintf("Available objects for this game are:\n"); for (int i = 0; i < _vm->_object->_numObj; i++) { if (_vm->_object->_objects[i].genericCmd & TAKE) @@ -110,7 +110,7 @@ bool HugoConsole::Cmd_getObject(int argc, const char **argv) { DebugPrintf("Usage: %s <object number>\n", argv[0]); return true; } - + if (_vm->_object->_objects[strToInt(argv[1])].genericCmd & TAKE) _vm->_parser->takeObject(&_vm->_object->_objects[strToInt(argv[1])]); else @@ -127,7 +127,7 @@ bool HugoConsole::Cmd_getAllObjects(int argc, const char **argv) { DebugPrintf("Usage: %s\n", argv[0]); return true; } - + for (int i = 0; i < _vm->_object->_numObj; i++) { if (_vm->_object->_objects[i].genericCmd & TAKE) _vm->_parser->takeObject(&_vm->_object->_objects[i]); diff --git a/engines/hugo/dialogs.cpp b/engines/hugo/dialogs.cpp index 6c816141f7..c43cdd7b46 100644 --- a/engines/hugo/dialogs.cpp +++ b/engines/hugo/dialogs.cpp @@ -95,15 +95,15 @@ void TopMenu::reflowLayout() { _recallButton->resize(x * scale, y * scale, kButtonWidth * scale, kButtonHeight * scale); x += kButtonWidth + kButtonPad; - + _turboButton->resize(x * scale, y * scale, kButtonWidth * scale, kButtonHeight * scale); x += kButtonWidth + kButtonPad; x += kButtonSpace; - + _lookButton->resize(x * scale, y * scale, kButtonWidth * scale, kButtonHeight * scale); x += kButtonWidth + kButtonPad; - + _inventButton->resize(x * scale, y * scale, kButtonWidth * scale, kButtonHeight * scale); x += kButtonWidth + kButtonPad; @@ -133,7 +133,7 @@ void TopMenu::loadBmpArr(Common::SeekableReadStream &in) { arrayBmp[i * 2 + 1]->create(arrayBmp[i * 2]->w * 2, arrayBmp[i * 2]->h * 2, g_system->getOverlayFormat()); byte *src = (byte *)arrayBmp[i * 2]->pixels; byte *dst = (byte *)arrayBmp[i * 2 + 1]->pixels; - + for (int j = 0; j < arrayBmp[i * 2]->h; j++) { src = (byte *)arrayBmp[i * 2]->getBasePtr(0, j); dst = (byte *)arrayBmp[i * 2 + 1]->getBasePtr(0, j * 2); @@ -153,7 +153,7 @@ void TopMenu::loadBmpArr(Common::SeekableReadStream &in) { *dst++ = *src++; } } - + in.skip(bmpSize); } } diff --git a/engines/hugo/display.cpp b/engines/hugo/display.cpp index c716e80d87..2d35bb0448 100644 --- a/engines/hugo/display.cpp +++ b/engines/hugo/display.cpp @@ -736,7 +736,7 @@ overlayState_t Screen_v1d::findOvl(seq_t *seq_p, image_pt dst_p, uint16 y) { uint16 index = (uint16)(dst_p - _frontBuffer) >> 3; for (int i = 0; i < seq_p->lines-y; i++) { // Each line in object - if (_vm->_object->getBaseBoundary(index)) // If any overlay base byte is non-zero then the object is foreground, else back. + if (_vm->_object->getBaseBoundary(index)) // If any overlay base byte is non-zero then the object is foreground, else back. return kOvlForeground; index += kCompLineSize; } diff --git a/engines/hugo/hugo.cpp b/engines/hugo/hugo.cpp index 10d61f25a2..7b54c7701d 100644 --- a/engines/hugo/hugo.cpp +++ b/engines/hugo/hugo.cpp @@ -299,7 +299,7 @@ Common::Error HugoEngine::run() { _status.helpFl = false; _file->instructions(); } - + _mouse->mouseHandler(); // Mouse activity - adds to display list _screen->displayList(kDisplayDisplay); // Blit the display list to screen _status.doQuitFl |= shouldQuit(); // update game quit flag @@ -315,7 +315,7 @@ void HugoEngine::initMachine() { _object->readObjectImages(); // Read all object images if (_platform == Common::kPlatformWindows) _file->readUIFImages(); // Read all uif images (only in Win versions) - + _sound->initPcspkrPlayer(); } diff --git a/engines/hugo/hugo.h b/engines/hugo/hugo.h index 81d194f1d6..125819a39b 100644 --- a/engines/hugo/hugo.h +++ b/engines/hugo/hugo.h @@ -177,7 +177,7 @@ struct status_t { // Game status (not saved) bool recallFl; // Toolbar "recall" button pressed bool newScreenFl; // New screen just loaded in dib_a bool godModeFl; // Allow DEBUG features in live version - bool showBoundariesFl; // Flag used to show and hide boundaries, + bool showBoundariesFl; // Flag used to show and hide boundaries, // used by the console bool doQuitFl; bool skipIntroFl; diff --git a/engines/hugo/inventory.h b/engines/hugo/inventory.h index de9e4cd1f0..666cc37b51 100644 --- a/engines/hugo/inventory.h +++ b/engines/hugo/inventory.h @@ -56,7 +56,7 @@ private: HugoEngine *_vm; static const int kStepDy = 8; // Pixels per step movement - + int16 _firstIconId; // Index of first icon to display int16 *_invent; istate_t _inventoryState; // Inventory icon bar state diff --git a/engines/hugo/object.cpp b/engines/hugo/object.cpp index e888a1d998..e5c7b4bf90 100644 --- a/engines/hugo/object.cpp +++ b/engines/hugo/object.cpp @@ -157,7 +157,7 @@ void ObjectHandler::useObject(int16 objId) { if (inventObjId == use->objId) { // Look for secondary object, if found use matching verb bool foundFl = false; - + for (target_t *target = use->targets; target->nounIndex != 0; target++) if (target->nounIndex == obj->nounIndex) { foundFl = true; @@ -425,7 +425,7 @@ void ObjectHandler::loadObjectUses(Common::ReadStream &in) { } for (int i = 0; i < numElem; i++) { - if (varnt == _vm->_gameVariant) + if (varnt == _vm->_gameVariant) readUse(in, _uses[i]); else { readUse(in, tmpUse); diff --git a/engines/hugo/parser.cpp b/engines/hugo/parser.cpp index 4a53d67377..5cb97f2dc5 100644 --- a/engines/hugo/parser.cpp +++ b/engines/hugo/parser.cpp @@ -60,7 +60,7 @@ Parser::~Parser() { uint16 Parser::getCmdDefaultVerbIdx(const uint16 index) const { return _cmdList[index][0].verbIndex; } - + /** * Read a cmd structure from Hugo.dat */ @@ -391,6 +391,8 @@ void Parser::command(const char *format, ...) { va_list marker; va_start(marker, format); +// TODO: +// _vm->_line = Common::String::vformat(format, marker); vsprintf(_vm->_line, format, marker); va_end(marker); diff --git a/engines/hugo/parser.h b/engines/hugo/parser.h index faa6dc2303..f8b9d9f13b 100644 --- a/engines/hugo/parser.h +++ b/engines/hugo/parser.h @@ -81,9 +81,9 @@ public: virtual ~Parser(); bool isWordPresent(char **wordArr) const; - + uint16 getCmdDefaultVerbIdx(const uint16 index) const; - + void charHandler(); void command(const char *format, ...); void freeParser(); diff --git a/engines/hugo/schedule.cpp b/engines/hugo/schedule.cpp index a099bec21c..d1b4aa6a9c 100644 --- a/engines/hugo/schedule.cpp +++ b/engines/hugo/schedule.cpp @@ -1040,7 +1040,7 @@ void Scheduler::saveActions(Common::WriteStream *f) const { * Find the index in the action list to be able to serialize the action to save game */ void Scheduler::findAction(const act* action, int16* index, int16* subElem) { - + assert(index && subElem); if (!action) { *index = -1; @@ -1106,7 +1106,7 @@ void Scheduler::restoreEvents(Common::ReadStream *f) { else _events[i].action = (act*)&_actListArr[index][subElem]; - _events[i].localActionFl = (f->readByte() == 1) ? true : false; + _events[i].localActionFl = (f->readByte() == 1) ? true : false; _events[i].time = f->readUint32BE(); int16 prevIndex = f->readSint16BE(); diff --git a/engines/hugo/schedule.h b/engines/hugo/schedule.h index e3107809cf..60d51f0673 100644 --- a/engines/hugo/schedule.h +++ b/engines/hugo/schedule.h @@ -616,7 +616,7 @@ public: protected: virtual const char *getCypher() const; - + void promptAction(act *action); }; diff --git a/engines/hugo/sound.cpp b/engines/hugo/sound.cpp index 9473536a47..1fea1f4343 100644 --- a/engines/hugo/sound.cpp +++ b/engines/hugo/sound.cpp @@ -127,7 +127,7 @@ SoundHandler::SoundHandler(HugoEngine *vm) : _vm(vm) { curPriority = 0; pcspkrTimer = 0; pcspkrOctave = 3; - pcspkrNoteDuration = 2; + pcspkrNoteDuration = 2; } SoundHandler::~SoundHandler() { @@ -290,7 +290,7 @@ void SoundHandler::pcspkr_player() { } else if (pcspkrTimer >= 0) { // Note still going return; } - + // Time to play next note do { cmd_note = true; diff --git a/engines/kyra/gui.cpp b/engines/kyra/gui.cpp index b9477c950a..f58ca0117c 100644 --- a/engines/kyra/gui.cpp +++ b/engines/kyra/gui.cpp @@ -643,32 +643,31 @@ void MainMenu::printString(const char *format, int x, int y, int col1, int col2, if (!format) return; - char string[512]; va_list vaList; va_start(vaList, flags); - vsprintf(string, format, vaList); + Common::String string = Common::String::vformat(format, vaList); va_end(vaList); if (flags & 1) - x -= _screen->getTextWidth(string) >> 1; + x -= _screen->getTextWidth(string.c_str()) >> 1; if (flags & 2) - x -= _screen->getTextWidth(string); + x -= _screen->getTextWidth(string.c_str()); if (_vm->gameFlags().use16ColorMode) flags &= 3; if (flags & 4) { - _screen->printText(string, x - 1, y, _static.altColor, col2); - _screen->printText(string, x, y + 1, _static.altColor, col2); + _screen->printText(string.c_str(), x - 1, y, _static.altColor, col2); + _screen->printText(string.c_str(), x, y + 1, _static.altColor, col2); } if (flags & 8) { - _screen->printText(string, x - 1, y, 227, col2); - _screen->printText(string, x, y + 1, 227, col2); + _screen->printText(string.c_str(), x - 1, y, 227, col2); + _screen->printText(string.c_str(), x, y + 1, 227, col2); } - _screen->printText(string, x, y, col1, col2); + _screen->printText(string.c_str(), x, y, col1, col2); } } // End of namespace Kyra diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h index 943bb7f8d5..06a4f29f63 100644 --- a/engines/kyra/lol.h +++ b/engines/kyra/lol.h @@ -717,7 +717,7 @@ private: int olol_setScriptTimer(EMCState *script); int olol_createHandItem(EMCState *script); int olol_playAttackSound(EMCState *script); - int olol_characterJoinsParty(EMCState *script); + int olol_addRemoveCharacter(EMCState *script); int olol_giveItem(EMCState *script); int olol_loadTimScript(EMCState *script); int olol_runTimScript(EMCState *script); diff --git a/engines/kyra/script_lol.cpp b/engines/kyra/script_lol.cpp index 695528b8d1..1afefcffa4 100644 --- a/engines/kyra/script_lol.cpp +++ b/engines/kyra/script_lol.cpp @@ -1088,33 +1088,27 @@ int LoLEngine::olol_playAttackSound(EMCState *script) { return 1; } -int LoLEngine::olol_characterJoinsParty(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_characterJoinsParty(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); +int LoLEngine::olol_addRemoveCharacter(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::olol_addRemoveCharacter(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); int16 id = stackPos(0); - if (id < 0) + if (id < 0) { id = -id; + for (int i = 0; i < 4; i++) { + if (!(_characters[i].flags & 1) || _characters[i].id != id) + continue; - for (int i = 0; i < 4; i++) { - if (!(_characters[i].flags & 1) || _characters[i].id != id) - continue; - - _characters[i].flags &= 0xfffe; - calcCharPortraitXpos(); + _characters[i].flags &= 0xfffe; + calcCharPortraitXpos(); - if (!_updateFlags) { - gui_enableDefaultPlayfieldButtons(); - gui_drawPlayField(); + if (_selectedCharacter == i) + _selectedCharacter = 0; + break; } - - if (_selectedCharacter == i) - _selectedCharacter = 0; - - return 1; + } else { + addCharacter(id); } - addCharacter(id); - if (!_updateFlags) { gui_enableDefaultPlayfieldButtons(); gui_drawPlayField(); @@ -2823,7 +2817,7 @@ void LoLEngine::setupOpcodeTable() { Opcode(olol_setScriptTimer); Opcode(olol_createHandItem); Opcode(olol_playAttackSound); - Opcode(olol_characterJoinsParty); + Opcode(olol_addRemoveCharacter); // 0x4C Opcode(olol_giveItem); diff --git a/engines/kyra/sequences_lol.cpp b/engines/kyra/sequences_lol.cpp index 01bf3c5e26..27f3951faf 100644 --- a/engines/kyra/sequences_lol.cpp +++ b/engines/kyra/sequences_lol.cpp @@ -202,7 +202,7 @@ void LoLEngine::setupPrologueData(bool load) { void LoLEngine::showIntro() { _tim = new TIMInterpreter(this, _screen, _system); assert(_tim); - + if (_flags.platform == Common::kPlatformPC98) showStarcraftLogo(); @@ -1115,7 +1115,7 @@ void LoLEngine::showOutro(int character, bool maxDifficulty) { showCredits(); _eventList.clear(); - + if (!shouldQuit()) { switch (character) { case 0: diff --git a/engines/kyra/sound_intern.h b/engines/kyra/sound_intern.h index 2ba0890789..be3c09de96 100644 --- a/engines/kyra/sound_intern.h +++ b/engines/kyra/sound_intern.h @@ -140,7 +140,7 @@ private: uint8 _sfxChannel; TownsEuphonyDriver *_driver; - + bool _cdaPlaying; const uint8 *_musicFadeTable; diff --git a/engines/kyra/sound_towns.cpp b/engines/kyra/sound_towns.cpp index 73d435f3e5..012f1f5d7d 100644 --- a/engines/kyra/sound_towns.cpp +++ b/engines/kyra/sound_towns.cpp @@ -107,11 +107,11 @@ void SoundTowns::haltTrack() { g_system->getAudioCDManager()->stop(); g_system->getAudioCDManager()->updateCD(); _cdaPlaying = false; - + for (int i = 0; i < 6; i++) _driver->chanVolume(i, 0); for (int i = 0x40; i < 0x46; i++) - _driver->chanVolume(i, 0); + _driver->chanVolume(i, 0); for (int i = 0; i < 32; i++) _driver->configChan_enable(i, 0); _driver->stopParser(); @@ -128,7 +128,7 @@ void SoundTowns::loadSoundFile(uint file) { void SoundTowns::playSoundEffect(uint8 track) { if (!_sfxEnabled || !_sfxFileData) return; - + if (track == 0 || track == 10) { stopAllSoundEffects(); return; @@ -258,13 +258,13 @@ void SoundTowns::beginFadeOut() { uint16 fadeVolCur[12]; uint16 fadeVolStep[12]; - + for (int i = 0; i < 6; i++) { fadeVolCur[i] = READ_LE_UINT16(&_musicFadeTable[(_lastTrack * 12 + i) * 2]); fadeVolStep[i] = fadeVolCur[i] / 50; fadeVolCur[i + 6] = READ_LE_UINT16(&_musicFadeTable[(_lastTrack * 12 + 6 + i) * 2]); fadeVolStep[i + 6] = fadeVolCur[i + 6] / 30; - } + } for (int i = 0; i < 12; i++) { for (int ii = 0; ii < 6; ii++) @@ -344,7 +344,7 @@ void SoundTowns::playEuphonyTrack(uint32 offset, int loop) { uint32 trackSize = READ_LE_UINT32(_musicTrackData + 2048); uint8 startTick = _musicTrackData[2052]; - + _driver->setMusicTempo(_musicTrackData[2053]); src = _musicTrackData + 2054; diff --git a/engines/lastexpress/detection.cpp b/engines/lastexpress/detection.cpp index 369d815543..de80e75341 100644 --- a/engines/lastexpress/detection.cpp +++ b/engines/lastexpress/detection.cpp @@ -47,7 +47,7 @@ static const ADGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, @@ -65,7 +65,7 @@ static const ADGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, @@ -83,7 +83,7 @@ static const ADGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, @@ -98,7 +98,7 @@ static const ADGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformUnknown, - ADGF_DEMO, + ADGF_DEMO | ADGF_UNSTABLE, Common::GUIO_NONE }, @@ -116,7 +116,7 @@ static const ADGameDescription gameDescriptions[] = { }, Common::FR_FRA, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, @@ -134,7 +134,7 @@ static const ADGameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, @@ -152,7 +152,7 @@ static const ADGameDescription gameDescriptions[] = { }, Common::ES_ESP, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, @@ -170,7 +170,7 @@ static const ADGameDescription gameDescriptions[] = { }, Common::IT_ITA, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, diff --git a/engines/lure/res_struct.h b/engines/lure/res_struct.h index 49b6ef78ba..8d6c557297 100644 --- a/engines/lure/res_struct.h +++ b/engines/lure/res_struct.h @@ -470,7 +470,7 @@ public: bool isEmpty() const { return _actions.begin() == _actions.end(); } void clear() { _actions.clear(); } CurrentActionEntry &top() { return **_actions.begin(); } - CurrentActionEntry &bottom() { + CurrentActionEntry &bottom() { ActionsList::iterator i = _actions.end(); --i; return **i; diff --git a/engines/m4/animation.cpp b/engines/m4/animation.cpp index 39a3f175cd..4f315dd396 100644 --- a/engines/m4/animation.cpp +++ b/engines/m4/animation.cpp @@ -91,7 +91,7 @@ void MadsAnimation::initialize(const Common::String &filename, uint16 flags, M4S _scrollY = animStream->readSint16LE(); _scrollTicks = animStream->readUint16LE(); animStream->skip(8); - + animStream->read(buffer, FILENAME_SIZE); buffer[FILENAME_SIZE] = '\0'; _interfaceFile = Common::String(buffer); @@ -230,7 +230,7 @@ void MadsAnimation::initialize(const Common::String &filename, uint16 flags, M4S // Load all the sprite sets for the animation for (int i = 0; i < spriteListCount; ++i) { if (_field12 && (i == _spriteListIndex)) - // Skip over field, since it's manually loaded + // Skip over field, since it's manually loaded continue; _spriteListIndexes[i] = _view->_spriteSlots.addSprites(_spriteSetNames[i].c_str()); @@ -242,7 +242,7 @@ void MadsAnimation::initialize(const Common::String &filename, uint16 flags, M4S if (madsRes) resName += "*"; resName += _spriteSetNames[_spriteListIndex]; - + _spriteListIndexes[_spriteListIndex] = _view->_spriteSlots.addSprites(resName.c_str()); } @@ -298,7 +298,7 @@ void MadsAnimation::update() { if (_field12) { int spriteListIndex = _spriteListIndexes[_spriteListIndex]; int newIndex = -1; - + for (uint idx = _oldFrameEntry; idx < _frameEntries.size(); ++idx) { if (_frameEntries[idx].frameNumber > _currentFrame) break; @@ -378,7 +378,7 @@ void MadsAnimation::update() { if (_frameEntries[_oldFrameEntry].frameNumber > _currentFrame) break; else if (_frameEntries[_oldFrameEntry].frameNumber == _currentFrame) { - // Found the correct frame + // Found the correct frame int spriteSlotIndex = 0; int index = 0; @@ -393,14 +393,14 @@ void MadsAnimation::update() { } ++index; continue; - } - + } + if (spriteSlotIndex == 0) { int slotIndex = _view->_spriteSlots.getIndex(); MadsSpriteSlot &slot = _view->_spriteSlots[slotIndex]; slot.copy(_frameEntries[_oldFrameEntry].spriteSlot); slot.seqIndex = _frameEntries[_oldFrameEntry].seqIndex + 0x80; - + SpriteAsset &spriteSet = _view->_spriteSlots.getSprite( _view->_spriteSlots[slotIndex].spriteListIndex); slot.spriteType = spriteSet.isBackground() ? BACKGROUND_SPRITE : FOREGROUND_SPRITE; @@ -408,7 +408,7 @@ void MadsAnimation::update() { break; } } - + ++_oldFrameEntry; } diff --git a/engines/m4/assets.cpp b/engines/m4/assets.cpp index 8ffdeb53e0..d6cc71e133 100644 --- a/engines/m4/assets.cpp +++ b/engines/m4/assets.cpp @@ -97,8 +97,8 @@ long *DataAsset::getRow(int index) { return &_data[_recSize * index]; } -SpriteAsset::SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name, - bool asStream, int flags) : +SpriteAsset::SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name, + bool asStream, int flags) : BaseAsset(vm) { _stream = stream; _palInterface = NULL; @@ -285,7 +285,7 @@ void SpriteAsset::loadMadsSpriteAsset(MadsM4Engine *vm, Common::SeekableReadStre // Load the frame Common::MemoryReadStream *rs = new Common::MemoryReadStream(destData, frameSizes[curFrame]); - _frames[curFrame].frame = new M4Sprite(rs, _frames[curFrame].x, _frames[curFrame].y, + _frames[curFrame].frame = new M4Sprite(rs, _frames[curFrame].x, _frames[curFrame].y, _frames[curFrame].w, _frames[curFrame].h, false); delete rs; @@ -634,7 +634,7 @@ MadsSpriteSetCharInfo::MadsSpriteSetCharInfo(Common::SeekableReadStream *s) { _totalFrames = s->readByte(); s->skip(1); _numEntries = s->readUint16LE(); - + for (int i = 0; i < 16; ++i) _frameList[i] = s->readUint16LE(); for (int i = 0; i < 16; ++i) diff --git a/engines/m4/assets.h b/engines/m4/assets.h index 90670dde53..25996a421e 100644 --- a/engines/m4/assets.h +++ b/engines/m4/assets.h @@ -115,7 +115,7 @@ public: class SpriteAsset : public BaseAsset { public: - SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name, + SpriteAsset(MadsM4Engine *vm, Common::SeekableReadStream* stream, int size, const char *name, bool asStream = false, int flags = 0); SpriteAsset(MadsM4Engine *vm, const char *name); ~SpriteAsset(); @@ -151,7 +151,7 @@ protected: Common::Array<uint32> _frameOffsets; Common::Array<SpriteAssetFrame> _frames; uint32 _frameStartOffset; - + // MADS sprite set fields uint8 _mode; bool _isBackground; diff --git a/engines/m4/detection.cpp b/engines/m4/detection.cpp index 02ed967777..9c359c081f 100644 --- a/engines/m4/detection.cpp +++ b/engines/m4/detection.cpp @@ -79,7 +79,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NONE }, GType_Burger, @@ -95,7 +95,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NONE }, GType_Burger, @@ -111,7 +111,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::RU_RUS, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NONE }, GType_Burger, @@ -127,7 +127,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_DEMO, + ADGF_DEMO | ADGF_UNSTABLE, GUIO_NONE }, GType_Burger, @@ -143,7 +143,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_DEMO, + ADGF_DEMO | ADGF_UNSTABLE, GUIO_NONE }, GType_Burger, @@ -159,7 +159,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NONE }, GType_Riddle, @@ -175,7 +175,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NONE }, GType_Riddle, @@ -191,7 +191,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::DE_DEU, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NONE }, GType_Riddle, @@ -207,7 +207,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::FR_FRA, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NONE }, GType_Riddle, @@ -223,7 +223,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::ES_ESP, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NONE }, GType_Riddle, @@ -239,7 +239,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_DEMO, + ADGF_DEMO | ADGF_UNSTABLE, GUIO_NONE }, GType_Riddle, @@ -255,7 +255,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NOSPEECH }, GType_RexNebular, @@ -271,7 +271,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_DEMO, + ADGF_DEMO | ADGF_UNSTABLE, GUIO_NONE }, GType_RexNebular, @@ -287,7 +287,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NOSPEECH }, GType_DragonSphere, @@ -304,7 +304,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NONE }, GType_DragonSphere, @@ -320,7 +320,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_DEMO, + ADGF_DEMO | ADGF_UNSTABLE, GUIO_NONE }, GType_DragonSphere, @@ -336,7 +336,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NOSPEECH }, GType_Phantom, @@ -352,7 +352,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NONE }, GType_Phantom, @@ -368,7 +368,7 @@ static const M4GameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_DEMO, + ADGF_DEMO | ADGF_UNSTABLE, GUIO_NONE }, GType_Phantom, diff --git a/engines/m4/dialogs.cpp b/engines/m4/dialogs.cpp index afe2692753..390ca711d1 100644 --- a/engines/m4/dialogs.cpp +++ b/engines/m4/dialogs.cpp @@ -532,7 +532,7 @@ void Dialog::display(MadsM4Engine *vm, int widthChars, const char **descEntries) } dlg->_lines[0].underline = true; - + dlg->draw(); vm->_viewManager->addView(dlg); vm->_viewManager->moveToFront(dlg); @@ -554,7 +554,7 @@ void Dialog::getValue(MadsM4Engine *vm, const char *title, const char *text, int vm->_viewManager->moveToFront(dlg); // TODO: How to wait until the dialog is closed - + } } // End of namespace M4 diff --git a/engines/m4/events.cpp b/engines/m4/events.cpp index f8225fba3e..b476d08c9c 100644 --- a/engines/m4/events.cpp +++ b/engines/m4/events.cpp @@ -253,7 +253,7 @@ bool Mouse::setCursorNum(int cursorIndex) { _cursor = _cursorSprites->getFrame(cursorIndex); // Set the cursor to the sprite - CursorMan.replaceCursor((const byte *)_cursor->getBasePtr(), _cursor->width(), _cursor->height(), + CursorMan.replaceCursor((const byte *)_cursor->getBasePtr(), _cursor->width(), _cursor->height(), _cursor->xOffset, _cursor->yOffset, TRANSPARENT_COLOR_INDEX); return true; diff --git a/engines/m4/font.h b/engines/m4/font.h index b00a393811..5a9c73e5d5 100644 --- a/engines/m4/font.h +++ b/engines/m4/font.h @@ -108,7 +108,7 @@ public: Font *getFont(const char *filename); void setFont(const char *filename); - Font *current() { + Font *current() { assert(_currentFont); return _currentFont; } diff --git a/engines/m4/globals.cpp b/engines/m4/globals.cpp index bf2c3abe1c..f4aab8ae8f 100644 --- a/engines/m4/globals.cpp +++ b/engines/m4/globals.cpp @@ -414,7 +414,7 @@ const char *MadsGlobals::loadMessage(uint index) { } /** - * Adds the specified scene number to list of scenes previously visited + * Adds the specified scene number to list of scenes previously visited */ void MadsGlobals::addVisitedScene(int newSceneNumber) { if (!isSceneVisited(newSceneNumber)) @@ -539,7 +539,7 @@ void MadsObject::load(Common::SeekableReadStream *stream) { } void MadsObject::setRoom(int roomNumber) { - + } } // End of namespace M4 diff --git a/engines/m4/graphics.cpp b/engines/m4/graphics.cpp index 786c975850..4c272de32c 100644 --- a/engines/m4/graphics.cpp +++ b/engines/m4/graphics.cpp @@ -408,7 +408,7 @@ void M4Surface::copyFrom(M4Surface *src, const Common::Rect &srcBounds, int dest * Copies a given image onto a destination surface with scaling, transferring only pixels that meet * the specified depth requirement on a secondary surface contain depth information */ -void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, +void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, M4Surface *depthsSurface, int scale, int transparentColor) { if (scale == 100) { @@ -451,7 +451,7 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, } src->freeData(); - depthsSurface->freeData(); + depthsSurface->freeData(); return; } @@ -501,7 +501,7 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, widthAmount -= destRight; if (widthAmount > 0) spriteWidth -= widthAmount; - + int spriteRight = spriteLeft + spriteWidth; if (spriteWidth <= 0) return; @@ -568,7 +568,7 @@ void M4Surface::copyFrom(M4Surface *src, int destX, int destY, int depth, } src->freeData(); - depthsSurface->freeData(); + depthsSurface->freeData(); this->freeData(); } @@ -919,7 +919,7 @@ void M4Surface::scrollY(int yAmount) { // Vertically shift all the lines Common::copy(pixelsP + (pitch * ySize), pixelsP + (pitch * height()), pixelsP); // Transfer the buffered lines to the bottom of the screen - Common::copy(tempData, tempData + blockSize, pixelsP + (pitch * (height() - ySize))); + Common::copy(tempData, tempData + blockSize, pixelsP + (pitch * (height() - ySize))); } ::free(tempData); @@ -945,7 +945,7 @@ void M4Surface::translate(RGBList *list, bool isTransparent) { M4Surface *M4Surface::flipHorizontal() const { M4Surface *dest = new M4Surface(width(), height()); dest->_rgbList = (this->_rgbList == NULL) ? NULL : this->_rgbList->clone(); - + byte *destP = dest->getBasePtr(); for (int y = 0; y < height(); ++y) { diff --git a/engines/m4/graphics.h b/engines/m4/graphics.h index 242857ba1a..f3dde454f3 100644 --- a/engines/m4/graphics.h +++ b/engines/m4/graphics.h @@ -170,7 +170,7 @@ public: void frameRect(const Common::Rect &r, uint8 color); void fillRect(const Common::Rect &r, uint8 color); void copyFrom(M4Surface *src, const Common::Rect &srcBounds, int destX, int destY, int transparentColor = -1); - void copyFrom(M4Surface *src, int destX, int destY, int depth, M4Surface *depthSurface, + void copyFrom(M4Surface *src, int destX, int destY, int depth, M4Surface *depthSurface, int scale, int transparentColor = -1); void update() { diff --git a/engines/m4/m4.cpp b/engines/m4/m4.cpp index 93f5ab4cba..efc7943114 100644 --- a/engines/m4/m4.cpp +++ b/engines/m4/m4.cpp @@ -259,7 +259,7 @@ void MadsM4Engine::dumpFile(const char *filename, bool uncompress) { Common::DumpFile f; byte buffer[DUMP_BUFFER_SIZE]; Common::SeekableReadStream *fileS = res()->get(filename); - + if (!f.open(filename)) error("Could not open '%s' for writing", filename); diff --git a/engines/m4/m4.h b/engines/m4/m4.h index 18c3936db8..46107cb20a 100644 --- a/engines/m4/m4.h +++ b/engines/m4/m4.h @@ -94,7 +94,7 @@ class Animation; enum M4GameType { GType_Riddle = 1, GType_Burger = 2, - GType_RexNebular = 3, + GType_RexNebular = 3, GType_DragonSphere = 4, GType_Phantom = 5 }; diff --git a/engines/m4/m4_views.cpp b/engines/m4/m4_views.cpp index 4eb84a7488..78c409252b 100644 --- a/engines/m4/m4_views.cpp +++ b/engines/m4/m4_views.cpp @@ -217,7 +217,7 @@ const char *INTERFACE_SERIES = "999intr"; #define SPR(x) _sprites->getFrame(x) -M4InterfaceView::M4InterfaceView(MadsM4Engine *vm): +M4InterfaceView::M4InterfaceView(MadsM4Engine *vm): GameInterfaceView(vm, Common::Rect(0, vm->_screen->height() - INTERFACE_HEIGHT, vm->_screen->width(), vm->_screen->height())), _statusText(GUITextField(this, Common::Rect(200, 1, 450, 21))), diff --git a/engines/m4/mads_anim.cpp b/engines/m4/mads_anim.cpp index d35b31943a..2ea576dfa4 100644 --- a/engines/m4/mads_anim.cpp +++ b/engines/m4/mads_anim.cpp @@ -536,7 +536,7 @@ void AnimviewView::updateState() { // Clear up current background and sprites _backgroundSurface.reset(); clearLists(); - + // Reset flags _startFrame = -1; diff --git a/engines/m4/mads_logic.cpp b/engines/m4/mads_logic.cpp index b1e57bd7f3..cc28a26e68 100644 --- a/engines/m4/mads_logic.cpp +++ b/engines/m4/mads_logic.cpp @@ -177,7 +177,7 @@ void MadsSceneLogic::initializeDataMap() { uint32 MadsSceneLogic::getDataValue(int dataId) { switch (dataId) { - case 1: + case 1: return _madsVm->scene()->_abortTimersMode2; case 2: return _madsVm->scene()->_abortTimers; @@ -208,7 +208,7 @@ uint32 MadsSceneLogic::getDataValue(int dataId) { void MadsSceneLogic::setDataValue(int dataId, uint16 dataValue) { switch (dataId) { - case 1: + case 1: _madsVm->scene()->_abortTimersMode2 = (AbortTimerMode)dataValue; break; case 2: @@ -297,7 +297,7 @@ uint16 MadsSceneLogic::startReversibleSpriteSequence(uint16 srcSpriteIdx, bool f uint8 depth = _madsVm->_rails->getDepth(Common::Point(spriteFrame->x + (spriteFrame->width() / 2), spriteFrame->y + (spriteFrame->height() / 2))); - return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, flipped, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, + return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, flipped, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, true, 100, depth - 1, 1, ANIMTYPE_REVERSIBLE, 0, 0); } @@ -306,7 +306,7 @@ uint16 MadsSceneLogic::startCycledSpriteSequence(uint16 srcSpriteIdx, bool flipp uint8 depth = _madsVm->_rails->getDepth(Common::Point(spriteFrame->x + (spriteFrame->width() / 2), spriteFrame->y + (spriteFrame->height() / 2))); - return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, flipped, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, + return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, flipped, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, true, 100, depth - 1, 1, ANIMTYPE_CYCLED, 0, 0); } @@ -315,7 +315,7 @@ uint16 MadsSceneLogic::startSpriteSequence3(uint16 srcSpriteIdx, bool flipped, i uint8 depth = _madsVm->_rails->getDepth(Common::Point(spriteFrame->x + (spriteFrame->width() / 2), spriteFrame->y + (spriteFrame->height() / 2))); - return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, flipped, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, + return _madsVm->scene()->_sequenceList.add(srcSpriteIdx, flipped, 1, triggerCountdown, timeoutTicks, extraTicks, numTicks, 0, 0, true, 100, depth - 1, -1, ANIMTYPE_CYCLED, 0, 0); } @@ -335,11 +335,11 @@ void MadsSceneLogic::getPlayerSpritesPrefix() { strcpy(_madsVm->_player._spritesPrefix, "RXSM"); else if (_madsVm->globals()->_nextSceneId == 112) strcpy(_madsVm->_player._spritesPrefix, ""); - + if (strcmp(oldName, _madsVm->_player._spritesPrefix) != 0) _madsVm->_player._spritesChanged = true; - if ((_madsVm->globals()->_nextSceneId == 105) || + if ((_madsVm->globals()->_nextSceneId == 105) || ((_madsVm->globals()->_nextSceneId == 109) && (_madsVm->globals()->_globals[15] != 0))) { // TODO: unknown flag setting _madsVm->_player._spritesChanged = true; @@ -420,7 +420,7 @@ void MadsSceneLogic::initializeScripts() { if ((language != 1) || (_madsVm->getLanguage() != Common::EN_ANY)) continue; - // Found script block for the given game and language. + // Found script block for the given game and language. _scriptsSize = (i < (offsets.size() - 1)) ? offsets[i + 1] - offsets[i] : f.size() - offsets[i]; break; } @@ -433,7 +433,7 @@ void MadsSceneLogic::initializeScripts() { // Load up the list of subroutines into a hash map uint32 blockOffset = f.pos() - 3; - uint32 subsStart = 0; + uint32 subsStart = 0; for (;;) { // Get next entry Common::String subName; @@ -593,12 +593,12 @@ void MadsSceneLogic::execute(uint32 subOffset) { } case OP_DSTORE: { // Stores data variable - param = getParam(scriptOffset, opcode); + param = getParam(scriptOffset, opcode); ScriptVar v = stack.pop(); setDataValue(param, v.isInt() ? v.get() : 0); break; } - + case OP_LOAD: // loads local variable onto stack param = getParam(scriptOffset, opcode); stack.push(locals[param]); @@ -621,7 +621,7 @@ void MadsSceneLogic::execute(uint32 subOffset) { case OP_GSTORE: // pops stack and stores in global variable param = getParam(scriptOffset, opcode); - assert(param < TOTAL_NUM_VARIABLES); + assert(param < TOTAL_NUM_VARIABLES); _madsVm->globals()->_globals[param] = stack.pop().get(); break; @@ -647,7 +647,7 @@ void MadsSceneLogic::execute(uint32 subOffset) { // Condition satisfied - do the jump scriptOffset = param; break; - + case OP_JMPTRUE: // conditional jump param = subOffset + getParam(scriptOffset, opcode); if (stack.pop().get() != 0) @@ -708,7 +708,7 @@ void MadsSceneLogic::execute(uint32 subOffset) { case OP_OR: param1 |= param2; break; case OP_EOR: param1 ^= param2; break; } - + stack.push(ScriptVar(param1)); } break; @@ -774,7 +774,7 @@ uint32 MadsSceneLogic::getParam(uint32 &scriptOffset, int opcode) { */ void MadsSceneLogic::getCallParameters(int numParams, Common::Stack<ScriptVar> &stack, ScriptVar *callParams) { assert(numParams <= MAX_CALL_PARAMS); - for (int i = 0; i < numParams; ++i, ++callParams) + for (int i = 0; i < numParams; ++i, ++callParams) *callParams = stack.pop(); } @@ -881,7 +881,7 @@ void MadsSceneLogic::callSubroutine(int subIndex, Common::Stack<ScriptVar> &stac case 14: { // DynamicHotspots_add EXTRACT_PARAMS(7); - int idx = _madsVm->scene()->_dynamicHotspots.add(p[0], p[1], p[2], + int idx = _madsVm->scene()->_dynamicHotspots.add(p[0], p[1], p[2], Common::Rect(p[6], p[5], p[6] + p[4], p[5] + p[3])); stack.push(ScriptVar(idx)); break; diff --git a/engines/m4/mads_logic.h b/engines/m4/mads_logic.h index 3132094252..4f0b0d5ba2 100644 --- a/engines/m4/mads_logic.h +++ b/engines/m4/mads_logic.h @@ -19,8 +19,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * The MADS game logic is all hard-coded into the games, although for Rex at least - * it seems to use only a fairly basic set of instructions and function calls, so it should be - * possible + * it seems to use only a fairly basic set of instructions and function calls, so it should be + * possible */ #ifndef M4_MADS_LOGIC_H diff --git a/engines/m4/mads_menus.cpp b/engines/m4/mads_menus.cpp index fa65329d76..8a2ab67f11 100644 --- a/engines/m4/mads_menus.cpp +++ b/engines/m4/mads_menus.cpp @@ -210,7 +210,7 @@ void RexMainMenuView::updateState() { M4Sprite *spr = _menuItem->getFrame(0); itemSize = _menuItem->getFrame(0)->height(); spr->copyTo(this, _menuItemPosList[_menuItemIndex - 1].x, - _menuItemPosList[_menuItemIndex - 1].y + row + (itemSize / 2) - (spr->height() / 2), + _menuItemPosList[_menuItemIndex - 1].y + row + (itemSize / 2) - (spr->height() / 2), spr->getTransparencyIndex()); delete _menuItem; @@ -876,7 +876,7 @@ void RexDialogView::addLine(const char *msg_p, Font *font, MadsTextAlignment ali } break; } - + case RIGHT_ALIGN: // Right align (moving left from given passed left) rec->pos.x = left - font->getWidth(rec->text); @@ -920,7 +920,7 @@ void RexDialogView::setClickableLines() { for (int i = 0; i < DIALOG_LINES_SIZE; ++i) { if (_dialogText[i].in_use) { // Add an entry for the line - _screenObjects.add(Common::Rect(_dialogText[i].pos.x, _dialogText[i].pos.y, + _screenObjects.add(Common::Rect(_dialogText[i].pos.x, _dialogText[i].pos.y, _dialogText[i].pos.x + _dialogText[i].font->getWidth(_dialogText[i].text, _dialogText[i].widthAdjust), _dialogText[i].pos.y + _dialogText[i].font->getHeight()), 19, i, 1); } @@ -988,7 +988,7 @@ RexGameMenuDialog::RexGameMenuDialog(): RexDialogView() { void RexGameMenuDialog::addLines() { // Add the title int top = MADS_Y_OFFSET - 2 - ((((_vm->_font->current()->getHeight() + 2) * 6) >> 1) - 78); - + addQuote(_vm->_font->current(), ALIGN_CENTER, 0, top, 10); // Loop for adding the option lines of the dialog @@ -1163,7 +1163,7 @@ bool RexOptionsDialog::onEvent(M4EventType eventType, int32 param1, int x, int y return true; } - // Update the option selections + // Update the option selections reload(); } diff --git a/engines/m4/mads_player.cpp b/engines/m4/mads_player.cpp index 0b83b54ff5..73480088ee 100644 --- a/engines/m4/mads_player.cpp +++ b/engines/m4/mads_player.cpp @@ -46,7 +46,7 @@ MadsPlayer::MadsPlayer() { _unk4 = false; _spritesChanged = true; - + _direction = 0; _newDirection = 0; _priorTimer = 0; @@ -131,7 +131,7 @@ void MadsPlayer::update() { // Figure out the depth for the sprite int newDepth = 1; int yp = MIN(_playerPos.y, (int16)155); - + for (int idx = 1; idx < 15; ++idx) { if (_madsVm->scene()->getSceneResources()._depthBands[newDepth] >= yp) newDepth = idx + 1; @@ -199,7 +199,7 @@ void MadsPlayer::updateFrame() { _unk2 = 0; } else { _unk2 = _actionList2[_actionIndex]; - + if (_actionIndex > 0) --_actionIndex; } @@ -237,7 +237,7 @@ void MadsPlayer::setupFrame() { _frameCount = spriteSet.getCount(); _yScale = spriteSet._charInfo->_yScale; - + if ((_frameNum <= 0) || (_frameNum > _frameCount)) _frameNum = 1; _forceRefresh = true; @@ -336,7 +336,7 @@ void MadsPlayer::setDest(int destX, int destY, int facing) { setTicksAmount(); _moving = true; _destFacing = facing; - + _madsVm->scene()->getSceneResources().setRouteNode(_madsVm->scene()->getSceneResources()._nodes.size() - 2, _playerPos, _madsVm->scene()->_depthSurface); _madsVm->scene()->getSceneResources().setRouteNode(_madsVm->scene()->getSceneResources()._nodes.size() - 1, @@ -448,7 +448,7 @@ void MadsPlayer::move() { bool routeFlag = false; if (_moving) { - int idx = _routeCount; + int idx = _routeCount; while (!_v844C0 && (_destPos.x == _playerPos.x) && (_destPos.y == _playerPos.y)) { if (idx != 0) { --idx; @@ -650,7 +650,7 @@ int MadsPlayer::scanPath(M4Surface *depthSurface, const Common::Point &srcPos, c srcP += xDirection; } - + return 0; } @@ -730,12 +730,12 @@ void MadsPlayer::startMovement() { int majorChange = MAX(xDiff, yDiff); _v84530 = (majorChange == 0) ? 0 : _hypotenuse / majorChange; - + if (_playerPos.x > _destPos.x) _v8452C = MAX(_posChange.x, _posChange.y); else _v8452C = 0; - + _hypotenuse /= 100; _v8452E = -_v84530; } diff --git a/engines/m4/mads_scene.cpp b/engines/m4/mads_scene.cpp index a0acbdd69d..5f160aa300 100644 --- a/engines/m4/mads_scene.cpp +++ b/engines/m4/mads_scene.cpp @@ -169,7 +169,7 @@ void MadsScene::loadScene(int sceneNumber) { } _abortTimers = 0; _abortTimersMode2 = ABORTMODE_1; - + // Do any scene specific setup if (_vm->getGameType() == GType_RexNebular) @@ -376,7 +376,7 @@ void MadsScene::updateState() { if (_madsVm->globals()->_config.easyMouse) _action.refresh(); - + if ((_activeAnimation) && !_abortTimers) { _activeAnimation->update(); if (((MadsAnimation *) _activeAnimation)->freeFlag() || freeFlag) { @@ -598,7 +598,7 @@ void MadsScene::loadAnimation(const Common::String &animName, int abortTimers) { bool MadsScene::getDepthHighBit(const Common::Point &pt) { const byte *p = _depthSurface->getBasePtr(pt.x, pt.y); - if (_sceneResources._depthStyle == 2) + if (_sceneResources._depthStyle == 2) return ((*p << 4) & 0x80) != 0; return (*p & 0x80) != 0; @@ -653,7 +653,7 @@ void MadsSceneResources::load(int sceneNumber, const char *resName, int v0, M4Su _depthStyle = stream->readUint16LE(); _width = stream->readUint16LE(); _height = stream->readUint16LE(); - + stream->skip(24); int nodeCount = stream->readUint16LE(); @@ -771,7 +771,7 @@ void MadsSceneResources::setRouteNode(int nodeIndex, const Common::Point &pt, M4 if (hypotenuse >= 0x3FFF) // Shouldn't ever be this large hypotenuse = 0x3FFF; - + entry = hypotenuse | flags; _nodes[idx].indexes[nodeIndex] = entry; _nodes[nodeIndex].indexes[idx] = entry; @@ -794,7 +794,7 @@ int MadsSceneResources::getRouteFlags(const Common::Point &src, const Common::Po ++yDiff; byte *srcP = depthSurface->getBasePtr(src.x, src.y); - + int totalCtr = majorDiff; for (int xCtr = 0; xCtr < xDiff; ++xCtr, srcP += xDirection) { totalCtr += yDiff; @@ -837,7 +837,7 @@ int MadsSceneResources::getRouteFlags(const Common::Point &src, const Common::Po *-------------------------------------------------------------------------- */ -MadsInterfaceView::MadsInterfaceView(MadsM4Engine *vm): GameInterfaceView(vm, +MadsInterfaceView::MadsInterfaceView(MadsM4Engine *vm): GameInterfaceView(vm, Common::Rect(0, MADS_SURFACE_HEIGHT, vm->_screen->width(), vm->_screen->height())) { _screenType = VIEWID_INTERFACE; _highlightedElement = -1; @@ -1078,7 +1078,7 @@ bool MadsInterfaceView::onEvent(M4EventType eventType, int32 param1, int x, int // A standard action was selected int verbId = kVerbLook + (_highlightedElement - ACTIONS_START); warning("Selected action #%d", verbId); - + } else if ((_highlightedElement >= VOCAB_START) && (_highlightedElement < (VOCAB_START + 5))) { // A vocab action was selected MadsObject *obj = _madsVm->globals()->getObject(_selectedObject); @@ -1259,8 +1259,8 @@ void MadsInterfaceView::leaveScene() { //-------------------------------------------------------------------------- -int getActiveAnimationBool() { - return (_madsVm->scene()->activeAnimation()) ? 1 : 0; +int getActiveAnimationBool() { + return (_madsVm->scene()->activeAnimation()) ? 1 : 0; } int getAnimationCurrentFrame() { diff --git a/engines/m4/mads_views.cpp b/engines/m4/mads_views.cpp index b66591a207..0521903c95 100644 --- a/engines/m4/mads_views.cpp +++ b/engines/m4/mads_views.cpp @@ -99,7 +99,7 @@ void MadsAction::set() { // Use/to action int selectedObject = _madsVm->scene()->getInterface()->getSelectedObject(); MadsObject *objEntry = _madsVm->globals()->getObject(selectedObject); - + _action.objectNameId = objEntry->_descId; _currentAction = objEntry->_vocabList[_selectedRow].vocabId; @@ -244,7 +244,7 @@ void MadsAction::refresh() { // Add a new text display entry to display the status text at the bottom of the screen area uint colors = (_vm->getGameType() == GType_DragonSphere) ? 0x0300 : 0x0003; - _statusTextIndex = _owner._textDisplay.add(160 - (strWidth / 2), + _statusTextIndex = _owner._textDisplay.add(160 - (strWidth / 2), MADS_SURFACE_HEIGHT + _owner._posAdjust.y - 13, colors, textSpacing, _statusText, font); } } @@ -476,7 +476,7 @@ void MadsSpriteSlots::drawBackground() { if (slot.depth > 1) { // Draw the frame with depth processing - _owner._bgSurface->copyFrom(frame, xp, yp, slot.depth, _owner._depthSurface, 100, + _owner._bgSurface->copyFrom(frame, xp, yp, slot.depth, _owner._depthSurface, 100, frame->getTransparencyIndex()); } else { // No depth, so simply draw the image @@ -526,7 +526,7 @@ void MadsSpriteSlots::drawForeground(M4Surface *viewport) { if ((slot.scale < 100) && (slot.scale != -1)) { // Minimalised drawing - viewport->copyFrom(spr, slot.xp, slot.yp, slot.depth, _owner._depthSurface, slot.scale, + viewport->copyFrom(spr, slot.xp, slot.yp, slot.depth, _owner._depthSurface, slot.scale, sprite->getTransparencyIndex()); } else { int xp, yp; @@ -665,7 +665,7 @@ void MadsTextDisplay::draw(M4Surface *view) { for (uint idx = 0; idx < _entries.size(); ++idx) { if (_entries[idx].active && (_entries[idx].expire >= 0)) { _entries[idx].font->setColors(_entries[idx].color1, _entries[idx].color2, 0); - _entries[idx].font->writeString(view, _entries[idx].msg, + _entries[idx].font->writeString(view, _entries[idx].msg, _entries[idx].bounds.left, _entries[idx].bounds.top, _entries[idx].bounds.width(), _entries[idx].spacing); } @@ -728,7 +728,7 @@ int MadsKernelMessageList::add(const Common::Point &pt, uint fontColor, uint8 fl rec.frameTimer = _madsVm->_currentTimer; rec.abortTimers = abortTimers; rec.abortMode = _owner._abortTimersMode2; - + for (int i = 0; i < 3; ++i) rec.actionNouns[i] = _madsVm->globals()->actionNouns[i]; @@ -850,7 +850,7 @@ void MadsKernelMessageList::processText(int msgIndex) { y1 = seqEntry.msgPos.y; } } - + if (msg.flags & KMSG_PLAYER_TIMEOUT) { if (word_8469E != 0) { // TODO: Figure out various flags @@ -867,7 +867,7 @@ void MadsKernelMessageList::processText(int msgIndex) { msg.msg[msg.msgOffset] = msg.asciiChar; char *msgP = &msg.msg[++msg.msgOffset]; *msgP = msg.asciiChar2; - + msg.asciiChar = *msgP; msg.asciiChar2 = *(msgP + 1); @@ -884,7 +884,7 @@ void MadsKernelMessageList::processText(int msgIndex) { flag = true; } - int strWidth = _talkFont->getWidth(msg.msg, _owner._textSpacing); + int strWidth = _talkFont->getWidth(msg.msg, _owner._textSpacing); if (msg.flags & (KMSG_RIGHT_ALIGN | KMSG_CENTER_ALIGN)) { x1 -= (msg.flags & KMSG_CENTER_ALIGN) ? strWidth / 2 : strWidth; @@ -935,7 +935,7 @@ ScreenObjects::ScreenObjects(MadsView &owner): _owner(owner) { _category = 0; _objectIndex = 0; } - + /** * Clears the entries list */ @@ -1153,7 +1153,7 @@ void MadsDirtyAreas::setSpriteSlot(int dirtyIdx, const MadsSpriteSlot &spriteSlo SpriteAsset &spriteSet = _owner._spriteSlots.getSprite(spriteSlot.spriteListIndex); M4Sprite *frame = spriteSet.getFrame(((spriteSlot.frameNumber & 0x7fff) - 1) & 0x7f); - + if (spriteSlot.scale == -1) { width = frame->width(); height = frame->height(); @@ -1270,8 +1270,8 @@ bool MadsSequenceList::addSubEntry(int index, SequenceSubEntryMode mode, int fra return false; } -int MadsSequenceList::add(int spriteListIndex, bool flipped, int frameIndex, int triggerCountdown, int delayTicks, int extraTicks, int numTicks, - int msgX, int msgY, bool nonFixed, char scale, uint8 depth, int frameInc, SpriteAnimType animType, int numSprites, +int MadsSequenceList::add(int spriteListIndex, bool flipped, int frameIndex, int triggerCountdown, int delayTicks, int extraTicks, int numTicks, + int msgX, int msgY, bool nonFixed, char scale, uint8 depth, int frameInc, SpriteAnimType animType, int numSprites, int frameStart) { // Find a free slot @@ -1340,7 +1340,7 @@ void MadsSequenceList::setSpriteSlot(int seqIndex, MadsSpriteSlot &spriteSlot) { spriteSlot.frameNumber = (timerEntry.flipped ? 0x8000 : 0) | timerEntry.frameIndex; spriteSlot.depth = timerEntry.depth; spriteSlot.scale = timerEntry.scale; - + if (!timerEntry.nonFixed) { spriteSlot.xp = timerEntry.msgPos.x; spriteSlot.yp = timerEntry.msgPos.y; @@ -1420,7 +1420,7 @@ bool MadsSequenceList::loadSprites(int seqIndex) { seqEntry.frameInc = 1; } else { // Otherwise reset back to last sprite for further reverse animating - seqEntry.frameIndex = seqEntry.numSprites; + seqEntry.frameIndex = seqEntry.numSprites; } } @@ -1478,7 +1478,7 @@ void MadsSequenceList::tick() { continue; // Set the next timeout for the timer entry - seqEntry.timeout = currentTimer + seqEntry.numTicks; + seqEntry.timeout = currentTimer + seqEntry.numTicks; // Action the sprite if (loadSprites(idx)) { @@ -1509,7 +1509,7 @@ void MadsSequenceList::setAnimRange(int seqIndex, int startVal, int endVal) { tempStart = 1; break; } - + switch (endVal) { case -2: case 0: @@ -1558,7 +1558,7 @@ Animation::~Animation() { MadsView::MadsView(View *view): _view(view), _dynamicHotspots(*this), _sequenceList(*this), _kernelMessages(*this), _spriteSlots(*this), _dirtyAreas(*this), _textDisplay(*this), _screenObjects(*this), _action(*this) { - + _textSpacing = -1; _newTimeout = 0; _abortTimers = 0; @@ -1590,8 +1590,8 @@ void MadsView::refresh() { // Merge any identified dirty areas _dirtyAreas.merge(1, DIRTY_AREAS_SIZE); - - // Copy dirty areas to the main display surface + + // Copy dirty areas to the main display surface _dirtyAreas.copy(_viewport, _bgSurface, _posAdjust); // Handle dirty areas for foreground objects diff --git a/engines/m4/mads_views.h b/engines/m4/mads_views.h index 6be2283a32..41caaa2ded 100644 --- a/engines/m4/mads_views.h +++ b/engines/m4/mads_views.h @@ -208,7 +208,7 @@ public: #define TIMED_TEXT_SIZE 10 #define INDEFINITE_TIMEOUT 9999999 -enum KernelMessageFlags {KMSG_QUOTED = 1, KMSG_PLAYER_TIMEOUT = 2, KMSG_SEQ_ENTRY = 4, KMSG_SCROLL = 8, KMSG_RIGHT_ALIGN = 0x10, +enum KernelMessageFlags {KMSG_QUOTED = 1, KMSG_PLAYER_TIMEOUT = 2, KMSG_SEQ_ENTRY = 4, KMSG_SCROLL = 8, KMSG_RIGHT_ALIGN = 0x10, KMSG_CENTER_ALIGN = 0x20, KMSG_EXPIRE = 0x40, KMSG_ACTIVE = 0x80}; class MadsKernelMessageEntry { @@ -388,7 +388,7 @@ struct MadsSequenceEntry { int8 active; int8 spriteListIndex; bool flipped; - + int frameIndex; int frameStart; int numSprites; @@ -402,7 +402,7 @@ struct MadsSequenceEntry { bool nonFixed; int field_13; - + Common::Point msgPos; int triggerCountdown; bool doneFlag; @@ -424,10 +424,10 @@ private: public: MadsSequenceList(MadsView &owner); - MadsSequenceEntry &operator[](int index) { return _entries[index]; } + MadsSequenceEntry &operator[](int index) { return _entries[index]; } void clear(); bool addSubEntry(int index, SequenceSubEntryMode mode, int frameIndex, int abortVal); - int add(int spriteListIndex, bool flipped, int frameIndex, int triggerCountdown, int delayTicks, + int add(int spriteListIndex, bool flipped, int frameIndex, int triggerCountdown, int delayTicks, int extraTicks, int numTicks, int msgX, int msgY, bool nonFixed, char scale, uint8 depth, int frameInc, SpriteAnimType animType, int numSprites, int frameStart); void remove(int seqIndex); @@ -452,7 +452,7 @@ public: virtual void setCurrentFrame(int frameNumber) = 0; virtual int getCurrentFrame() = 0; }; - + class MadsView { private: diff --git a/engines/m4/resource.cpp b/engines/m4/resource.cpp index 2ae29ca0bb..f5b2050052 100644 --- a/engines/m4/resource.cpp +++ b/engines/m4/resource.cpp @@ -313,7 +313,7 @@ const char *MADSResourceManager::getResourceFilename(const char *resourceName) { /** * Forms a resource name based on the passed specifiers */ -const char *MADSResourceManager::getResourceName(char asciiCh, int prefix, ExtensionType extType, +const char *MADSResourceManager::getResourceName(char asciiCh, int prefix, ExtensionType extType, const char *suffix, int index) { static char resourceName[100]; diff --git a/engines/m4/resource.h b/engines/m4/resource.h index 00c54a3680..c13c293544 100644 --- a/engines/m4/resource.h +++ b/engines/m4/resource.h @@ -109,7 +109,7 @@ public: enum ResourceType {RESTYPE_ROOM, RESTYPE_SC, RESTYPE_TEXT, RESTYPE_QUO, RESTYPE_I, RESTYPE_OB, RESTYPE_FONT, RESTYPE_SOUND, RESTYPE_SPEECH, RESTYPE_HAS_EXT, RESTYPE_NO_EXT}; -enum ExtensionType {EXTTYPE_SS = 1, EXTTYPE_AA = 2, EXTTYPE_DAT = 3, EXTTYPE_HH = 4, EXTTYPE_ART = 5, +enum ExtensionType {EXTTYPE_SS = 1, EXTTYPE_AA = 2, EXTTYPE_DAT = 3, EXTTYPE_HH = 4, EXTTYPE_ART = 5, EXTTYPE_INT = 6, EXTTYPE_NONE = -1}; enum ResourcePrefixType {RESPREFIX_GL = 1, RESPREFIX_SC = 2, RESPREFIX_RM = 3}; diff --git a/engines/m4/scene.cpp b/engines/m4/scene.cpp index a38be20086..be49dcb13f 100644 --- a/engines/m4/scene.cpp +++ b/engines/m4/scene.cpp @@ -36,7 +36,7 @@ namespace M4 { -Scene::Scene(MadsM4Engine *vm, SceneResources *res): View(vm, Common::Rect(0, 0, vm->_screen->width(), +Scene::Scene(MadsM4Engine *vm, SceneResources *res): View(vm, Common::Rect(0, 0, vm->_screen->width(), vm->_screen->height())), _sceneResources(res) { _screenType = VIEWID_SCENE; @@ -142,7 +142,7 @@ void Scene::showCodes() { // Show the walk areas for the M4 engine in black and white const byte *srcP = (const byte *)_walkSurface->getBasePtr(0, 0); byte *destP = _backgroundSurface->getBasePtr(0, 0); - + for (int i = 0; i < _walkSurface->width() * _walkSurface->height(); i++) destP[i] = (srcP[i] & 0x10) ? 0xFF : 0; @@ -154,7 +154,7 @@ void Scene::showCodes() { _vm->_palette->setPalette(colors, 0, 256); } else { // MADS handling - + // copy the walk data to the background, in whatever current palette is active _walkSurface->copyTo(_backgroundSurface); diff --git a/engines/m4/sound.cpp b/engines/m4/sound.cpp index d10dea5cad..76eae8a661 100644 --- a/engines/m4/sound.cpp +++ b/engines/m4/sound.cpp @@ -97,8 +97,8 @@ void Sound::playSound(const char *soundName, int volume, bool loop, int channel) _mixer->playStream(Audio::Mixer::kSFXSoundType, &handle->handle, stream, -1, volume); } -void Sound::playSound(int soundNum) { - warning("TODO: playSound(%d)", soundNum); +void Sound::playSound(int soundNum) { + warning("TODO: playSound(%d)", soundNum); } void Sound::pauseSound() { diff --git a/engines/m4/sprite.cpp b/engines/m4/sprite.cpp index 1a3228d1bb..d0741732f3 100644 --- a/engines/m4/sprite.cpp +++ b/engines/m4/sprite.cpp @@ -182,7 +182,7 @@ void M4Sprite::loadMadsSprite(Common::SeekableReadStream* source) { } } } - + // Check if we need to scan forward to find the end of the line if (!newLine) { do { diff --git a/engines/made/database.cpp b/engines/made/database.cpp index 1151339d49..004f1462a6 100644 --- a/engines/made/database.cpp +++ b/engines/made/database.cpp @@ -511,7 +511,7 @@ int16 GameDatabaseV2::loadgame(const char *filename, int16 version) { _objects[i]->load(*in); } delete in; - + _objectPropertyCache.clear(); // make sure to clear cache return result; } @@ -642,7 +642,7 @@ void GameDatabaseV3::load(Common::SeekableReadStream &sourceS) { void GameDatabaseV3::reloadFromStream(Common::SeekableReadStream &sourceS) { sourceS.seek(_gameStateOffs); sourceS.read(_gameState, _gameStateSize); - + _objectPropertyCache.clear(); // make sure to clear cache } @@ -734,9 +734,9 @@ int16 GameDatabaseV3::loadgame(const char *filename, int16 version) { in->skip(64); // skip savegame description in->read(_gameState, _gameStateSize); delete in; - + _objectPropertyCache.clear(); // make sure to clear cache - + return 0; } diff --git a/engines/mohawk/bitmap.cpp b/engines/mohawk/bitmap.cpp index d54e2dac6b..f61516c91d 100644 --- a/engines/mohawk/bitmap.cpp +++ b/engines/mohawk/bitmap.cpp @@ -910,7 +910,7 @@ void DOSBitmap::expandEGAPlanes(Graphics::Surface *surface, Common::SeekableRead j = -1; x++; } - } + } dst += surface->w; } diff --git a/engines/mohawk/console.cpp b/engines/mohawk/console.cpp index 4e5b7186ff..05012bec3d 100644 --- a/engines/mohawk/console.cpp +++ b/engines/mohawk/console.cpp @@ -632,7 +632,7 @@ bool RivenConsole::Cmd_Combos(int argc, const char **argv) { uint32 teleCombo = _vm->_vars["tcorrectorder"]; uint32 prisonCombo = _vm->_vars["pcorrectorder"]; uint32 domeCombo = _vm->_vars["adomecombo"]; - + DebugPrintf("Telescope Combo:\n "); for (int i = 0; i < 5; i++) DebugPrintf("%d ", _vm->_externalScriptHandler->getComboDigit(teleCombo, i)); diff --git a/engines/mohawk/cursors.cpp b/engines/mohawk/cursors.cpp index f95084de8e..a797e4e127 100644 --- a/engines/mohawk/cursors.cpp +++ b/engines/mohawk/cursors.cpp @@ -274,6 +274,7 @@ void PECursorManager::setCursor(uint16 id) { Graphics::WinCursor *cursor = cursorGroup->cursors[0].cursor; CursorMan.replaceCursor(cursor->getSurface(), cursor->getWidth(), cursor->getHeight(), cursor->getHotspotX(), cursor->getHotspotY(), cursor->getKeyColor()); CursorMan.replaceCursorPalette(cursor->getPalette(), 0, 256); + delete cursorGroup; return; } } diff --git a/engines/mohawk/detection_tables.h b/engines/mohawk/detection_tables.h index 2cf80377f6..2243dd1c1d 100644 --- a/engines/mohawk/detection_tables.h +++ b/engines/mohawk/detection_tables.h @@ -33,7 +33,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("MYST.DAT", "ae3258c9c90128d274aa6a790b3ad181"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MYST, @@ -51,7 +51,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("DEMO.DAT", "c39303dd53fb5c4e7f3c23231c606cd0"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_DEMO, + ADGF_DEMO | ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MYST, @@ -69,7 +69,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("MYST.DAT", "4beb3366ed3f3b9bfb6e81a14a43bdcc"), Common::DE_DEU, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MYST, @@ -87,7 +87,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("MYST.DAT", "e0937cca1ab125e48e30dc3cd5046ddf"), Common::DE_DEU, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MYST, @@ -105,7 +105,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("MYST.DAT", "f7e7d7ca69934f1351b5acd4fe4d44c2"), Common::ES_ESP, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MYST, @@ -123,7 +123,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("MYST.DAT", "032c88e3b7e8db4ca475e7b7db9a66bb"), Common::JA_JPN, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MYST, @@ -141,7 +141,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("MYST.DAT", "d631d42567a941c67c78f2e491f4ea58"), Common::FR_FRA, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MYST, @@ -159,7 +159,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("MAKING.DAT", "f6387e8f0f7b8a3e42c95294315d6a0e"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MAKINGOF, @@ -177,7 +177,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("MAKING.DAT", "03ff62607e64419ab2b6ebf7b7bcdf63"), Common::JA_JPN, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MAKINGOF, @@ -195,7 +195,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("MYST.DAT", "c4cae9f143b5947262e6cb2397e1617e"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MYST, @@ -213,7 +213,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("MYST.DAT", "c4cae9f143b5947262e6cb2397e1617e"), Common::EN_ANY, Common::kPlatformMacintosh, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MYST, @@ -231,7 +231,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("MYST.DAT", "f88e0ace66dbca78eebdaaa1d3314ceb"), Common::DE_DEU, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MYST, @@ -249,7 +249,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("MYST.DAT", "aea81633b2d2ae498f09072fb87263b6"), Common::FR_FRA, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MYST, @@ -267,7 +267,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("a_Data.MHK", "71145fdecbd68a0cfc292c2fbddf8e08"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_RIVEN, @@ -285,7 +285,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("a_Data.MHK", "d8ccae34a0e3c709135a73f449b783be"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_RIVEN, @@ -303,7 +303,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("a_Data.MHK", "249e8c995d191b03ee94c892c0eac775"), Common::ES_ESP, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_RIVEN, @@ -321,7 +321,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("a_Data.MHK", "08fcaa5d5a2a01d7a5a6960f497212fe"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_RIVEN, @@ -339,7 +339,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("a_Data.MHK", "a5fe1c91a6033eb6ee54b287578b74b9"), Common::DE_DEU, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_RIVEN, @@ -357,7 +357,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("a_Data.MHK", "aff2a384aaa9a0e0ec51010f708c5c04"), Common::FR_FRA, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_RIVEN, @@ -375,7 +375,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("a_Data.MHK", "bae6b03bd8d6eb350d35fd13f0e3139f"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_DEMO, + ADGF_DEMO | ADGF_UNSTABLE, Common::GUIO_NONE }, GType_RIVEN, @@ -390,7 +390,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("signin.mhk", "410b4ce8d1a8702971e4d1ffba9b965d"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_CSTIME, @@ -405,7 +405,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("iface.mhk", "5c1203712a16513bd158dc3c1b6cebd7"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_DEMO, + ADGF_DEMO | ADGF_UNSTABLE, Common::GUIO_NONE }, GType_CSTIME, @@ -421,7 +421,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("ZOOMBINI.MHK", "98b758fec55104c096cfd129048be9a6"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_ZOOMBINI, @@ -436,6 +436,21 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("ZOOMBINI.MHK", "0672f65c40dd065840c896e41c13f980"), Common::EN_ANY, Common::kPlatformWindows, + ADGF_UNSTABLE, + Common::GUIO_NONE + }, + GType_ZOOMBINI, + GF_HASMIDI, + 0 + }, + + { + { + "zoombini", + "v2.0", + AD_ENTRY1("ZOOMBINI.MHK", "506b1122ffa740e2566cf0b583d24478"), + Common::EN_ANY, + Common::kPlatformWindows, ADGF_NO_FLAGS, Common::GUIO_NONE }, @@ -451,7 +466,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("ZOOMBINI.MHK", "6ae0bdf791266b1fe3d4fabbf44c3faa"), Common::DE_DEU, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_ZOOMBINI, @@ -466,7 +481,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("ZOOMBINI.MHK", "8231e58525143ccf6e8b747df34b139f"), Common::FR_FRA, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_ZOOMBINI, @@ -481,7 +496,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("C2K.MHK", "605fe88380848031bbd0ff84ade6fe40"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_CSWORLD, @@ -496,7 +511,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("C2K.MHK", "d4857aeb0f5e2e0c4ac556aa74f38c23"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_CSWORLD, @@ -511,7 +526,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("AMTRAK.MHK", "2f95301f0bb950d555bb7b0e3b1b7eb1"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_CSAMTRAK, @@ -645,7 +660,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("Outline.txt", "67abce5dcda969c23f367a98c90439bc"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV5, @@ -660,7 +675,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("Outline.txt", "6a281eefe72987afb0f8fb6cf84553f5"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV5, @@ -675,7 +690,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("Outline", "b7dc6e65fa9e80784a5bb8b557aa37c4"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV3, @@ -690,7 +705,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("BookOutline", "1ce006d7daaa26cf61040203856b88f1"), Common::EN_ANY, Common::kPlatformMacintosh, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV3, @@ -705,7 +720,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("BRODER.MHK", "007299da8b2c6e8ec1cde9598c243024"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_JAMESMATH, @@ -721,7 +736,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("BRODER.MHK", "53c000938a50dca92860fd9b546dd276"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_JAMESMATH, @@ -736,7 +751,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("MAINROOM.MHK", "12f51894d7f838af639ea9bf1bc8f45b"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_TREEHOUSE, @@ -858,7 +873,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("AL236_1.MHK", "3ba145492a7b8b4dee0ef4222c5639c3"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_1STDEGREE, @@ -876,7 +891,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("AL236_1.MHK", "0e0c70b1b702b6ddca61a1192ada1282"), Common::FR_FRA, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_1STDEGREE, @@ -891,7 +906,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("USAC2K.MHK", "b8c9d3a2586f62bce3a48b50d7a700e9"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_CSUSA, @@ -1435,7 +1450,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("RACE.LB", "1645f36bcb36e440d928e920aa48c373"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV3, @@ -1451,7 +1466,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("RACE32.LB", "292a05bc48c1dd9583821a4181a02ef2"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV3, @@ -1686,7 +1701,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("Outline", "0b5ab6dd7c08cf23066efa709fa48bbc"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV3, @@ -1701,7 +1716,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("BookOutline", "e139903eee98f0b0c3f39247a23b8f10"), Common::EN_ANY, Common::kPlatformMacintosh, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV3, @@ -1716,7 +1731,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("outline", "525be248363fe27d50d750632c1e759e"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV4, @@ -1731,7 +1746,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("BookOutline", "54a324ee6f8260258bff7043a05b0004"), Common::EN_ANY, Common::kPlatformMacintosh, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV4, @@ -1749,7 +1764,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("outline", "36225e0b4986a80135cfdd9643cc7030"), Common::FR_FRA, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV4, @@ -1825,7 +1840,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("outline", "d239506f969ff68fa886f084082e9158"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV3, @@ -1840,7 +1855,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("BookOutline", "6dd1c0606f1db3b71207121b4370e487"), Common::EN_ANY, Common::kPlatformMacintosh, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV3, @@ -1934,7 +1949,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("OUTLINE", "dec4d1a05449f81b6012706932658326"), Common::EN_ANY, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV4, @@ -1949,7 +1964,7 @@ static const MohawkGameDescription gameDescriptions[] = { AD_ENTRY1("BookOutline", "87bf1f9113340ce1c6c880932e815882"), Common::EN_ANY, Common::kPlatformMacintosh, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_LIVINGBOOKSV4, @@ -2150,7 +2165,7 @@ static const MohawkGameDescription fallbackDescs[] = { AD_ENTRY1(0, 0), Common::UNK_LANG, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MYST, @@ -2165,7 +2180,7 @@ static const MohawkGameDescription fallbackDescs[] = { AD_ENTRY1(0, 0), Common::UNK_LANG, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MAKINGOF, @@ -2180,7 +2195,7 @@ static const MohawkGameDescription fallbackDescs[] = { AD_ENTRY1(0, 0), Common::UNK_LANG, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_MYST, @@ -2195,7 +2210,7 @@ static const MohawkGameDescription fallbackDescs[] = { AD_ENTRY1(0, 0), Common::UNK_LANG, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_RIVEN, @@ -2210,7 +2225,7 @@ static const MohawkGameDescription fallbackDescs[] = { AD_ENTRY1(0, 0), Common::UNK_LANG, Common::kPlatformWindows, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_RIVEN, diff --git a/engines/mohawk/livingbooks.h b/engines/mohawk/livingbooks.h index de84b0f13f..56107ad97b 100644 --- a/engines/mohawk/livingbooks.h +++ b/engines/mohawk/livingbooks.h @@ -459,7 +459,7 @@ public: void setGlobalVisible(bool visible); void startPhase(uint phase); void stop(); - + protected: bool _starting; diff --git a/engines/mohawk/myst_stacks/demo.cpp b/engines/mohawk/myst_stacks/demo.cpp index 53d946dd66..5788f4b3a3 100644 --- a/engines/mohawk/myst_stacks/demo.cpp +++ b/engines/mohawk/myst_stacks/demo.cpp @@ -69,7 +69,7 @@ void Demo::disablePersistentScripts() { void Demo::runPersistentScripts() { Intro::runPersistentScripts(); - + if (_enabled201) { // Used on Card 2001, 2002 and 2003 diff --git a/engines/mohawk/myst_stacks/myst.cpp b/engines/mohawk/myst_stacks/myst.cpp index 70abf0ccd3..66492d1200 100644 --- a/engines/mohawk/myst_stacks/myst.cpp +++ b/engines/mohawk/myst_stacks/myst.cpp @@ -397,7 +397,7 @@ uint16 Myst::getVar(uint16 var) { else return 0; case 25: // Fireplace Red Page Present - if (_globals.ending != 4) + if (_globals.ending != 4) return !(_globals.redPagesInBook & 32) && (_globals.heldPage != 12); else return 0; @@ -3269,7 +3269,7 @@ void Myst::generatorControlRoom_run(void) { if (_generatorVoltage == _state.generatorVoltage) { generatorRedrawRocket(); } else { - // Animate generator gauge + // Animate generator gauge if (_generatorVoltage > _state.generatorVoltage) _generatorVoltage--; else diff --git a/engines/mohawk/resource.cpp b/engines/mohawk/resource.cpp index 3a95b83199..37fc73de67 100644 --- a/engines/mohawk/resource.cpp +++ b/engines/mohawk/resource.cpp @@ -79,12 +79,12 @@ bool MohawkArchive::open(Common::SeekableReadStream *stream) { } _rsrc.version = _mhk->readUint16BE(); - + if (_rsrc.version != 0x100) { warning("Unsupported Mohawk resource version %d.%d", (_rsrc.version >> 8) & 0xff, _rsrc.version & 0xff); return false; } - + _rsrc.compaction = _mhk->readUint16BE(); // Only used in creation, not in reading _rsrc.filesize = _mhk->readUint32BE(); _rsrc.abs_offset = _mhk->readUint32BE(); diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index 3514afdb61..8f8bc15990 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -178,7 +178,7 @@ Common::Error MohawkEngine_Riven::run() { changeToCard(1); } - + while (!_gameOver && !shouldQuit()) handleEvents(); @@ -436,7 +436,7 @@ void MohawkEngine_Riven::loadCard(uint16 id) { void MohawkEngine_Riven::loadHotspots(uint16 id) { // Clear old hotspots delete[] _hotspots; - + // NOTE: The hotspot scripts are cleared by the RivenScriptManager automatically. Common::SeekableReadStream *inStream = getResource(ID_HSPT, id); @@ -460,8 +460,8 @@ void MohawkEngine_Riven::loadHotspots(uint16 id) { // - tspit 371 (DVD: 377), hotspot 4 if (left >= right || top >= bottom) { warning("%s %d hotspot %d is invalid: (%d, %d, %d, %d)", getStackName(_curStack).c_str(), _curCard, i, left, top, right, bottom); - left = top = right = bottom = 0; - _hotspots[i].enabled = 0; + left = top = right = bottom = 0; + _hotspots[i].enabled = 0; } _hotspots[i].rect = Common::Rect(left, top, right, bottom); diff --git a/engines/mohawk/riven_external.cpp b/engines/mohawk/riven_external.cpp index 8ad05ded13..60e94ea795 100644 --- a/engines/mohawk/riven_external.cpp +++ b/engines/mohawk/riven_external.cpp @@ -244,7 +244,7 @@ void RivenExternal::runCredits(uint16 video, uint32 delay) { _vm->_gfx->updateCredits(); } } else if (_vm->_video->updateMovies()) - _vm->_system->updateScreen(); + _vm->_system->updateScreen(); Common::Event event; while (_vm->_system->getEventManager()->pollEvent(event)) @@ -2060,7 +2060,7 @@ void RivenExternal::xbookclick(uint16 argc, uint16 *argv) { _vm->_cursor->setCursor(kRivenMainCursor); _vm->_system->updateScreen(); - + // OK, Gehn has opened the trap book and has asked us to go in. Let's watch // and see what the player will do... while (_vm->_video->getElapsedTime(video) < endTime && !_vm->shouldQuit()) { @@ -2216,7 +2216,7 @@ void RivenExternal::xgwatch(uint16 argc, uint16 *argv) { curSound++; soundTime = _vm->_system->getMillis(); } - + // Poll events just to check for quitting Common::Event event; while (_vm->_system->getEventManager()->pollEvent(event)) {} @@ -2525,7 +2525,7 @@ static Common::Rect generateMarbleGridRect(uint16 x, uint16 y) { } void RivenExternal::xt7500_checkmarbles(uint16 argc, uint16 *argv) { - // Set apower if the marbles are in their correct spot. + // Set apower if the marbles are in their correct spot. bool valid = true; static const uint32 marbleFinalValues[] = { 1114121, 1441798, 0, 65552, 65558, 262146 }; diff --git a/engines/mohawk/riven_scripts.cpp b/engines/mohawk/riven_scripts.cpp index 161acb665f..6e3e9a34dc 100644 --- a/engines/mohawk/riven_scripts.cpp +++ b/engines/mohawk/riven_scripts.cpp @@ -546,7 +546,7 @@ void RivenScript::storeMovieOpcode(uint16 op, uint16 argc, uint16 *argv) { byte *scriptBuf = (byte *)malloc(scriptSize); WRITE_BE_UINT16(scriptBuf, 1); // One command WRITE_BE_UINT16(scriptBuf + 2, argv[3]); // One opcode - WRITE_BE_UINT16(scriptBuf + 4, argc - 4); // argc - 4 args + WRITE_BE_UINT16(scriptBuf + 4, argc - 4); // argc - 4 args for (int i = 0; i < argc - 4; i++) WRITE_BE_UINT16(scriptBuf + 6 + (i * 2), argv[i + 4]); diff --git a/engines/mohawk/video.cpp b/engines/mohawk/video.cpp index eec6256276..cd8fc8ef80 100644 --- a/engines/mohawk/video.cpp +++ b/engines/mohawk/video.cpp @@ -436,22 +436,22 @@ VideoHandle VideoManager::createVideoHandle(const Common::String &filename, uint entry.filename = filename; entry.loop = loop; entry.enabled = true; - + Common::File *file = new Common::File(); if (!file->open(filename)) { delete file; return NULL_VID_HANDLE; } - + entry->loadStream(file); - + // Search for any deleted videos so we can take a formerly used slot for (uint32 i = 0; i < _videoStreams.size(); i++) if (!_videoStreams[i].video) { _videoStreams[i] = entry; return i; } - + // Otherwise, just add it to the list _videoStreams.push_back(entry); return _videoStreams.size() - 1; diff --git a/engines/parallaction/dialogue.cpp b/engines/parallaction/dialogue.cpp index 880d41a8a3..a908152bf8 100644 --- a/engines/parallaction/dialogue.cpp +++ b/engines/parallaction/dialogue.cpp @@ -52,7 +52,7 @@ struct BalloonPositions { class DialogueManager { - + Parallaction *_vm; Dialogue *_dialogue; @@ -81,10 +81,10 @@ protected: bool _isKeyDown; uint16 _downKey; -protected: +protected: Gfx *_gfx; BalloonManager *_balloonMan; - + public: DialogueManager(Parallaction *vm, ZonePtr z); virtual ~DialogueManager(); @@ -108,11 +108,11 @@ protected: NEXT_ANSWER, DIALOGUE_OVER } _state; - + static const int NO_ANSWER_SELECTED = -1; void transitionToState(DialogueState newState); - + bool displayQuestion(); void displayAnswers(); bool testAnswerFlags(Answer *a); @@ -132,7 +132,7 @@ protected: DialogueManager::DialogueManager(Parallaction *vm, ZonePtr z) : _vm(vm), _z(z) { _gfx = _vm->_gfx; _balloonMan = _vm->_balloonMan; - + _dialogue = _z->u._speakDialogue; isNpc = !_z->u._filename.empty() && _z->u._filename.compareToIgnoreCase("yourself"); _questioner = isNpc ? _vm->_disk->loadTalk(_z->u._filename.c_str()) : _vm->_char._talk; @@ -166,11 +166,11 @@ void DialogueManager::transitionToState(DialogueState newState) { "nextanswer", "over" }; - + if (_state != newState) { debugC(3, kDebugDialogue, "DialogueManager moved to state '%s'", dialogueStates[newState]); - if (DebugMan.isDebugChannelEnabled(kDebugDialogue) && gDebugLevel == 9) { + if (DebugMan.isDebugChannelEnabled(kDebugDialogue) && gDebugLevel == 9) { switch (newState) { case RUN_QUESTION: debug(" Q : %s", _q->_text.c_str()); @@ -188,7 +188,7 @@ void DialogueManager::transitionToState(DialogueState newState) { _state = newState; } - + bool DialogueManager::testAnswerFlags(Answer *a) { uint32 flags = _vm->getLocationFlags(); if (a->_yesFlags & kFlagsGlobal) @@ -240,7 +240,7 @@ int16 DialogueManager::selectAnswerN() { VisibleAnswer *oldAnswer = &_visAnswers[_oldSelection]; VisibleAnswer *answer = &_visAnswers[_selection]; - + if (_selection != _oldSelection) { if (_oldSelection != NO_ANSWER_SELECTED) { _balloonMan->setBalloonText(oldAnswer->_balloon, oldAnswer->_a->_text, BalloonManager::kUnselectedColor); @@ -286,7 +286,7 @@ void DialogueManager::nextAnswer() { return; } - // try and check if there are any suitable answers, + // try and check if there are any suitable answers, // given the current game state. addVisibleAnswers(_q); if (!_numVisAnswers) { @@ -294,9 +294,9 @@ void DialogueManager::nextAnswer() { transitionToState(DIALOGUE_OVER); return; } - + if (_visAnswers[0]._a->textIsNull()) { - // if the first answer is null (it's implied that it's the + // if the first answer is null (it's implied that it's the // only one because we already called addVisibleAnswers), // then jump to the next question _answerId = _visAnswers[0]._index; @@ -547,7 +547,7 @@ void Parallaction::runDialogueFrame() { if (_input->_inputMode != Input::kInputModeDialogue) { return; } - + _dialogueMan->run(); if (_dialogueMan->isOver()) { diff --git a/engines/parallaction/exec_br.cpp b/engines/parallaction/exec_br.cpp index 0ec1675c48..658ef5af82 100644 --- a/engines/parallaction/exec_br.cpp +++ b/engines/parallaction/exec_br.cpp @@ -530,11 +530,11 @@ DECLARE_INSTRUCTION_OPCODE(endif) { DECLARE_INSTRUCTION_OPCODE(stop) { ZonePtr z = ctxt._inst->_z; - - // Prevent execution if zone is missing. The known case is "PART2/insegui.scr", which has + + // Prevent execution if zone is missing. The known case is "PART2/insegui.scr", which has // "STOP insegui", which doesn't exist (see ticket #3021744 for the gory details) if (!z) return; - + if (ACTIONTYPE(z) == kZoneHear) { warning("Parallaction_br::instOp_stop not yet implemented for HEAR zones"); // TODO: stop music or sound effects generated by a zone. diff --git a/engines/parallaction/gfxbase.cpp b/engines/parallaction/gfxbase.cpp index 24544f46dd..48d84ed101 100644 --- a/engines/parallaction/gfxbase.cpp +++ b/engines/parallaction/gfxbase.cpp @@ -296,19 +296,19 @@ void Gfx::bltMaskScale(const Common::Rect& r, byte *data, Graphics::Surface *sur // clipped scaled destination rectangle Common::Rect dstRect(scaledWidth, scaledHeight); dstRect.moveTo(scaledLeft, scaledTop); - - Common::Rect clipper(surf->w, surf->h); + + Common::Rect clipper(surf->w, surf->h); dstRect.clip(clipper); if (!dstRect.isValidRect()) return; - - + + // clipped source rectangle Common::Rect srcRect; srcRect.left = (dstRect.left - scaledLeft) * 100 / scale; srcRect.top = (dstRect.top - scaledTop) * 100 / scale; srcRect.setWidth(dstRect.width() * 100 / scale); srcRect.setHeight(dstRect.height() * 100 / scale); - if (!srcRect.isValidRect()) return; + if (!srcRect.isValidRect()) return; Common::Point dp; dp.x = dstRect.left; diff --git a/engines/parallaction/graphics.cpp b/engines/parallaction/graphics.cpp index cf0cf13333..1da61b68ae 100644 --- a/engines/parallaction/graphics.cpp +++ b/engines/parallaction/graphics.cpp @@ -565,7 +565,7 @@ void Gfx::showFloatingLabel(GfxObj *label) { label->x = -1000; label->y = -1000; label->setFlags(kGfxObjVisible); - + _floatingLabel = label; _labels.push_back(label); } @@ -673,7 +673,7 @@ void Gfx::showLabel(GfxObj *label, int16 x, int16 y) { label->x = x; label->y = y; - + _labels.push_back(label); } @@ -695,7 +695,7 @@ void Gfx::unregisterLabel(GfxObj *label) { _labels.remove_at(i); break; } - } + } } diff --git a/engines/parallaction/gui_br.cpp b/engines/parallaction/gui_br.cpp index c520ad4f25..d1361a6e8c 100644 --- a/engines/parallaction/gui_br.cpp +++ b/engines/parallaction/gui_br.cpp @@ -223,10 +223,10 @@ public: } break; - default: + default: _vm->_nextPart = _firstLocation[selection].part; _vm->scheduleLocationSwitch(_firstLocation[selection].location); - + } _vm->_system->showMouse(false); diff --git a/engines/parallaction/gui_ns.cpp b/engines/parallaction/gui_ns.cpp index ef1a8a6e7e..3794aeae29 100644 --- a/engines/parallaction/gui_ns.cpp +++ b/engines/parallaction/gui_ns.cpp @@ -122,7 +122,7 @@ public: _dosLanguageSelectBlocks[1] = Common::Rect( 129, 85, 177, 155 ); // French _dosLanguageSelectBlocks[2] = Common::Rect( 178, 60, 226, 130 ); // English _dosLanguageSelectBlocks[3] = Common::Rect( 227, 35, 275, 105 ); // German - + _amigaLanguageSelectBlocks[0] = Common::Rect( -1, -1, -1, -1 ); // Italian: not supported by Amiga multi-lingual version _amigaLanguageSelectBlocks[1] = Common::Rect( 129, 85, 177, 155 ); // French _amigaLanguageSelectBlocks[2] = Common::Rect( 178, 60, 226, 130 ); // English @@ -149,7 +149,7 @@ public: _language = -1; _allowChoice = true; } - + ~ChooseLanguageInputState_NS() { destroyLabels(); } @@ -222,15 +222,15 @@ public: _nextState[0] = "newgame"; _nextState[1] = "loadgame"; - + _labels[0] = 0; _labels[1] = 0; } - + ~SelectGameInputState_NS() { destroyLabels(); } - + void destroyLabels() { _vm->_gfx->unregisterLabel(_labels[0]); _vm->_gfx->unregisterLabel(_labels[1]); @@ -326,7 +326,7 @@ public: _labels[2] = 0; _labels[3] = 0; } - + ~NewGameInputState_NS() { destroyLabels(); } @@ -475,7 +475,7 @@ public: _block.create(BLOCK_WIDTH, BLOCK_HEIGHT, Graphics::PixelFormat::createFormatCLUT8()); _labels[0] = 0; _labels[1] = 0; - + _codeSelectBlocks[0] = Common::Rect( 111, 129, 127, 153 ); // na _codeSelectBlocks[1] = Common::Rect( 128, 120, 144, 144 ); // wa _codeSelectBlocks[2] = Common::Rect( 145, 111, 161, 135 ); // ra @@ -698,7 +698,7 @@ public: _vm->_gfx->unregisterLabel(_labels[0]); _vm->_gfx->unregisterLabel(_labels[1]); delete _labels[0]; - delete _labels[1]; + delete _labels[1]; _labels[0] = 0; _labels[1] = 0; } @@ -827,18 +827,18 @@ public: _labels[2] = 0; _labels[3] = 0; } - + void destroyLabels() { _vm->_gfx->unregisterLabel(_labels[0]); _vm->_gfx->unregisterLabel(_labels[1]); _vm->_gfx->unregisterLabel(_labels[2]); _vm->_gfx->unregisterLabel(_labels[3]); - + delete _labels[0]; delete _labels[1]; delete _labels[2]; delete _labels[3]; - + _labels[0] = 0; _labels[1] = 0; _labels[2] = 0; diff --git a/engines/parallaction/objects.cpp b/engines/parallaction/objects.cpp index 3750602076..22406013a1 100644 --- a/engines/parallaction/objects.cpp +++ b/engines/parallaction/objects.cpp @@ -264,7 +264,7 @@ bool Answer::textIsNull() { int Answer::speakerMood() { return _mood & 0xF; } - + Question::Question(const Common::String &name) : _name(name), _mood(0) { memset(_answers, 0, sizeof(_answers)); } @@ -278,16 +278,16 @@ Question::~Question() { bool Question::textIsNull() { return (_text.equalsIgnoreCase("NULL")); } - + int Question::speakerMood() { return _mood & 0xF; } int Question::balloonWinding() { - return _mood & 0x10; + return _mood & 0x10; } - + Instruction::Instruction() { _index = 0; _flags = 0; diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp index 9bbc7d0c57..a37c4439a1 100644 --- a/engines/parallaction/parallaction.cpp +++ b/engines/parallaction/parallaction.cpp @@ -627,7 +627,7 @@ bool Parallaction::checkSpecialZoneBox(ZonePtr z, uint32 type, uint x, uint y) { return false; } } - + // WORKAROUND: this huge condition is needed because we made TypeData a collection of structs // instead of an union. So, merge->_obj1 and get->_icon were just aliases in the original engine, // but we need to check it separately here. The same workaround is applied in freeZones. @@ -659,14 +659,14 @@ bool Parallaction::checkZoneType(ZonePtr z, uint32 type) { if (_gameType == GType_BRA) { if (type == 0) { - if (ITEMTYPE(z) == 0) { + if (ITEMTYPE(z) == 0) { if (ACTIONTYPE(z) != kZonePath) { return true; } - } + } if (ACTIONTYPE(z) == kZoneDoor) { return true; - } + } } } @@ -751,7 +751,7 @@ ZonePtr Parallaction::hitZone(uint32 type, uint16 x, uint16 y) { AnimationPtr a = *ait; _a = (a->_flags & kFlagsActive) ? 1 : 0; // _a: active Animation - + if (!_a) { if (_gameType == GType_BRA && ACTIONTYPE(a) != kZoneTrap) { continue; diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp index 64cf1b437d..0b92db1f0a 100644 --- a/engines/parallaction/parallaction_ns.cpp +++ b/engines/parallaction/parallaction_ns.cpp @@ -351,7 +351,7 @@ void Parallaction_ns::changeLocation() { // prevent music changes during the introduction _soundManI->playLocationMusic(location); } - + _input->stopHovering(); // this is still needed to remove the floatingLabel _gfx->freeLabels(); @@ -471,7 +471,7 @@ void Parallaction_ns::changeCharacter(const char *name) { // prevent music changes during the introduction _soundManI->playCharacterMusic(_char.getBaseName()); } - + // The original engine used to reload 'common' only on loadgames. We are reloading here since 'common' // contains character specific stuff. This causes crashes like bug #1816899, because parseLocation tries // to reload scripts but the data archive selected is occasionally wrong. This has been solved by having diff --git a/engines/parallaction/parser_br.cpp b/engines/parallaction/parser_br.cpp index e4be53022e..f53d71caec 100644 --- a/engines/parallaction/parser_br.cpp +++ b/engines/parallaction/parser_br.cpp @@ -824,12 +824,12 @@ void LocationParser_br::parseHearData(ZonePtr z) { } void LocationParser_br::parseNoneData(ZonePtr z) { - /* the only case we have to handle here is that of "scende2", which is the only Animation with + /* the only case we have to handle here is that of "scende2", which is the only Animation with a command list following the type marker. */ if (!scumm_stricmp(_tokens[0], "commands")) { parseCommands(z->_commands); - } + } } diff --git a/engines/parallaction/parser_ns.cpp b/engines/parallaction/parser_ns.cpp index 69763affc8..213f0ae191 100644 --- a/engines/parallaction/parser_ns.cpp +++ b/engines/parallaction/parser_ns.cpp @@ -1412,9 +1412,9 @@ void LocationParser_ns::parseSpeakData(ZonePtr z) { } void LocationParser_ns::parseNoneData(ZonePtr z) { - // "None" zones should have no content, but some - // inconsistently define their command list after - // the TYPE marker. This routine catches these + // "None" zones should have no content, but some + // inconsistently define their command list after + // the TYPE marker. This routine catches these // command lists that would be lost otherwise. if (!scumm_stricmp(_tokens[0], "commands")) { parseCommands(z->_commands); @@ -1423,7 +1423,7 @@ void LocationParser_ns::parseNoneData(ZonePtr z) { _script->readLineToken(true); _parser->parseStatement(); } while (!ctxt.endcommands); - + // no need to parse one more line here, as // it is done by the caller } diff --git a/engines/parallaction/sound.h b/engines/parallaction/sound.h index baca5a7213..d0b5e5c175 100644 --- a/engines/parallaction/sound.h +++ b/engines/parallaction/sound.h @@ -131,11 +131,11 @@ class DosSoundMan_ns : public SoundMan_ns { MidiPlayer *_midiPlayer; bool _playing; - + bool isLocationSilent(const char *locationName); bool locationHasOwnSoftMusic(const char *locationName); - + public: DosSoundMan_ns(Parallaction_ns *vm); ~DosSoundMan_ns(); diff --git a/engines/parallaction/sound_ns.cpp b/engines/parallaction/sound_ns.cpp index 917d310738..b5d4c72ea4 100644 --- a/engines/parallaction/sound_ns.cpp +++ b/engines/parallaction/sound_ns.cpp @@ -140,7 +140,7 @@ void DosSoundMan_ns::playMusic() { Common::SeekableReadStream *stream = _vm->_disk->loadMusic(_musicFile); _midiPlayer->play(stream); _midiPlayer->setVolume(255); - + _playing = true; } @@ -159,7 +159,7 @@ void DosSoundMan_ns::pause(bool p) { bool DosSoundMan_ns::locationHasOwnSoftMusic(const char *locationName) { return !scumm_stricmp(locationName, "night") || !scumm_stricmp(locationName, "intsushi"); } - + void DosSoundMan_ns::playCharacterMusic(const char *character) { if (!character || locationHasOwnSoftMusic(_vm->_location._name)) { return; @@ -167,7 +167,7 @@ void DosSoundMan_ns::playCharacterMusic(const char *character) { char *name = const_cast<char*>(character); const char *newMusicFile = 0; - + if (!scumm_stricmp(name, _dinoName)) { newMusicFile = "dino"; } else @@ -200,7 +200,7 @@ void DosSoundMan_ns::playLocationMusic(const char *location) { debugC(2, kDebugExec, "changeLocation: music stopped"); } else { playCharacterMusic(_vm->_char.getBaseName()); - } + } } diff --git a/engines/parallaction/walk.cpp b/engines/parallaction/walk.cpp index 21ee5ee5d9..5d5695ace4 100644 --- a/engines/parallaction/walk.cpp +++ b/engines/parallaction/walk.cpp @@ -590,14 +590,14 @@ void PathWalker_BR::doWalk(State &s) { int xStep = (scale * 16) / 100 + 1; int yStep = (scale * 10) / 100 + 1; - /* WORKAROUND: in the balloon scene, the position of the balloon (which is implemented as a + /* WORKAROUND: in the balloon scene, the position of the balloon (which is implemented as a Character) is controlled by the user (for movement, via this walking code) and by the scripts (to simulate the balloon floating in the air, in a neverending loop that alters the position coordinates). When the two step sizes are equal in magnitude and opposite in direction, then the walk code enters an infinite loop without giving control back to the user (this happens quite frequently - when navigating the balloon near the borders of the screen, where the calculated step is - forcibly small because of clipping). Since the "floating" script (part1/scripts/mongolo.scr) + when navigating the balloon near the borders of the screen, where the calculated step is + forcibly small because of clipping). Since the "floating" script (part1/scripts/mongolo.scr) uses increments of 3 for both x and y, we tweak the calculated steps accordingly here. */ if (xStep == 3) xStep--; if (yStep == 3) yStep--; diff --git a/engines/saga/actor.cpp b/engines/saga/actor.cpp index 86606855e3..862a0b4d64 100644 --- a/engines/saga/actor.cpp +++ b/engines/saga/actor.cpp @@ -340,7 +340,7 @@ void Actor::loadActorSpriteList(ActorData *actor) { uint lastFrame = 0; uint curFrameIndex; int resourceId = actor->_spriteListResourceId; - + if (actor->_frames != NULL) { for (ActorFrameSequences::const_iterator i = actor->_frames->begin(); i != actor->_frames->end(); ++i) { for (int orient = 0; orient < ACTOR_DIRECTIONS_COUNT; orient++) { diff --git a/engines/saga/actor.h b/engines/saga/actor.h index 451497986d..a4f475660d 100644 --- a/engines/saga/actor.h +++ b/engines/saga/actor.h @@ -321,7 +321,7 @@ public: _screenDepth = in->readSint32LE(); _screenScale = in->readSint32LE(); } - + CommonObjectData() { _index = 0; _id = 0; @@ -463,7 +463,7 @@ public: void cmdActorWalkTo(int argc, const char **argv); bool validActorId(uint16 id) { - return (id == ID_PROTAG) || ((id >= objectIndexToId(kGameObjectActor, 0)) && (id < objectIndexToId(kGameObjectActor, _actors.size()))); + return (id == ID_PROTAG) || ((id >= objectIndexToId(kGameObjectActor, 0)) && (id < objectIndexToId(kGameObjectActor, _actors.size()))); } int actorIdToIndex(uint16 id) { return (id == ID_PROTAG) ? 0 : objectIdToIndex(id); } uint16 actorIndexToId(int index) { return (index == 0) ? ID_PROTAG : objectIndexToId(kGameObjectActor, index); } diff --git a/engines/saga/animation.cpp b/engines/saga/animation.cpp index 7ec4a59398..8b2d1e9dad 100644 --- a/engines/saga/animation.cpp +++ b/engines/saga/animation.cpp @@ -169,7 +169,7 @@ int Anim::playCutaway(int cut, bool fade) { ByteArray resourceData; _vm->_resource->loadResource(context, _cutawayList[cut].animResourceId, resourceData); load(MAX_ANIMATIONS + cutawaySlot, resourceData); - + setCycles(MAX_ANIMATIONS + cutawaySlot, _cutawayList[cut].cycles); setFrameTime(MAX_ANIMATIONS + cutawaySlot, 1000 / _cutawayList[cut].frameRate); @@ -414,7 +414,7 @@ void Anim::load(uint16 animId, const ByteArray &resourceData) { } anim->resourceData.resize(resourceData.size() - dataOffset); - + memcpy(anim->resourceData.getBuffer(), resourceData.getBuffer() + dataOffset, anim->resourceData.size()); // Cache frame offsets diff --git a/engines/saga/detection_tables.h b/engines/saga/detection_tables.h index f63efd206b..ab73fcba6e 100644 --- a/engines/saga/detection_tables.h +++ b/engines/saga/detection_tables.h @@ -821,7 +821,7 @@ static const SAGAGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NONE }, GID_DINO, @@ -851,7 +851,7 @@ static const SAGAGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, GUIO_NONE }, GID_FTA2, diff --git a/engines/saga/events.cpp b/engines/saga/events.cpp index 35f41e30ab..ec3ef2f6f9 100644 --- a/engines/saga/events.cpp +++ b/engines/saga/events.cpp @@ -557,7 +557,7 @@ int Events::handleInterval(Event *event) { } EventColumns *Events::chain(EventColumns *eventColumns, const Event &event) { - + if (eventColumns == NULL) { EventColumns tmp; diff --git a/engines/saga/introproc_saga2.cpp b/engines/saga/introproc_saga2.cpp index 80d53a2794..bdf8936a55 100644 --- a/engines/saga/introproc_saga2.cpp +++ b/engines/saga/introproc_saga2.cpp @@ -113,7 +113,7 @@ void Scene::playMovie(const char *filename) { _vm->_system->updateScreen(); } } - + Common::Event event; while (_vm->_system->getEventManager()->pollEvent(event)) { if ((event.type == Common::EVENT_KEYDOWN && event.kbd.keycode == Common::KEYCODE_ESCAPE) || event.type == Common::EVENT_LBUTTONUP) diff --git a/engines/saga/isomap.cpp b/engines/saga/isomap.cpp index adea59ca9a..e886f0df82 100644 --- a/engines/saga/isomap.cpp +++ b/engines/saga/isomap.cpp @@ -836,7 +836,7 @@ void IsoMap::drawTile(uint16 tileIndex, const Point &point, const Location *loca count = colDiff; col += colDiff; } - + colDiff = _tileClip.right - col; if (colDiff > 0) { int countDiff = fgRunCount - count; diff --git a/engines/saga/palanim.cpp b/engines/saga/palanim.cpp index 1fefad93ab..021a4c9bac 100644 --- a/engines/saga/palanim.cpp +++ b/engines/saga/palanim.cpp @@ -53,7 +53,7 @@ void PalAnim::loadPalAnim(const ByteArray &resourceData) { debug(3, "PalAnim::loadPalAnim(): Loading %d PALANIM entries.", _entries.size()); for (Common::Array<PalanimEntry>::iterator i = _entries.begin(); i != _entries.end(); ++i) { - + i->cycle = 0; i->colors.resize(readS.readUint16()); @@ -139,7 +139,7 @@ void PalAnim::cycleStep(int vectortime) { void PalAnim::clear() { debug(3, "PalAnim::clear()"); - + _entries.clear(); } diff --git a/engines/saga/saga.cpp b/engines/saga/saga.cpp index 15bd2aff72..d168605e99 100644 --- a/engines/saga/saga.cpp +++ b/engines/saga/saga.cpp @@ -451,7 +451,7 @@ void SagaEngine::loadStrings(StringsTable &stringsTable, const ByteArray &string error("SagaEngine::loadStrings() Wrong offset"); } stringsTable.strings[ui] = &stringsTable.buffer[offset]; - + debug(9, "string[%i]=%s", ui, stringsTable.strings[ui]); } } diff --git a/engines/saga/scene.h b/engines/saga/scene.h index adac3b622a..6e2cb12380 100644 --- a/engines/saga/scene.h +++ b/engines/saga/scene.h @@ -126,7 +126,7 @@ struct SceneDescription { uint16 sceneScriptEntrypointNumber; uint16 startScriptEntrypointNumber; int16 musicResourceId; - + void reset() { flags = resourceListResourceId = endSlope = beginSlope = scriptModuleNumber = sceneScriptEntrypointNumber = startScriptEntrypointNumber = musicResourceId = 0; } diff --git a/engines/saga/sprite.cpp b/engines/saga/sprite.cpp index 81893c7480..2895c6800c 100644 --- a/engines/saga/sprite.cpp +++ b/engines/saga/sprite.cpp @@ -207,7 +207,7 @@ void Sprite::drawClip(const Point &spritePointer, int width, int height, const b const byte *srcPointer; int backBufferPitch = _vm->_gfx->getBackBufferPitch(); - + //find Rects intersection yDiff = clipRect.top - spritePointer.y; if (yDiff > 0) { @@ -247,10 +247,10 @@ void Sprite::drawClip(const Point &spritePointer, int width, int height, const b } bufRowPointer = _vm->_gfx->getBackBufferPixels() + backBufferPitch * yDstOffset + xDstOffset; srcRowPointer = spriteBuffer + width * ySrcOffset + xSrcOffset; - + // validate src, dst buffers assert(_vm->_gfx->getBackBufferPixels() <= bufRowPointer); - assert((_vm->_gfx->getBackBufferPixels() + (_vm->getDisplayInfo().width * _vm->getDisplayInfo().height)) >= + assert((_vm->_gfx->getBackBufferPixels() + (_vm->getDisplayInfo().width * _vm->getDisplayInfo().height)) >= (byte *)(bufRowPointer + backBufferPitch * (cHeight - 1) + cWidth)); assert((const byte *)spriteBuffer <= srcRowPointer); assert(((const byte *)spriteBuffer + (width * height)) >= (const byte *)(srcRowPointer + width * (cHeight - 1) + cWidth)); @@ -469,7 +469,7 @@ void Sprite::scaleBuffer(const byte *src, int width, int height, int scale, size _decodeBuf.resize(outLength); byte *dst = &_decodeBuf.front(); - + memset(dst, 0, _decodeBuf.size()); for (int i = 0; i < height; i++) { diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index b1b5f81995..2f69d5caa1 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -255,7 +255,7 @@ void Console::postEnter() { videoDecoder = new RobotDecoder(g_system->getMixer(), _engine->getPlatform() == Common::kPlatformMacintosh); } else if (_videoFile.hasSuffix(".duk")) { duckMode = true; - videoDecoder = new Video::AviDecoder(g_system->getMixer()); + videoDecoder = new Video::AviDecoder(g_system->getMixer()); #endif } else if (_videoFile.hasSuffix(".avi")) { videoDecoder = new Video::AviDecoder(g_system->getMixer()); @@ -895,7 +895,7 @@ bool Console::cmdVerifyScripts(int argc, const char **argv) { return true; } -// Same as in sound/drivers/midi.cpp +// Same as in sound/drivers/midi.cpp uint8 getGmInstrument(const Mt32ToGmMap &Mt32Ins) { if (Mt32Ins.gmInstr == MIDI_MAPPED_TO_RHYTHM) return Mt32Ins.gmRhythmKey + 0x80; @@ -913,7 +913,7 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { MidiPlayer *player = MidiPlayer_Midi_create(doSoundVersion); MidiParser_SCI *parser = new MidiParser_SCI(doSoundVersion, 0); parser->setMidiDriver(player); - + Common::List<ResourceId> *resources = _engine->getResMan()->listResources(kResourceTypeSound); Common::sort(resources->begin(), resources->end()); Common::List<ResourceId>::iterator itr = resources->begin(); @@ -984,7 +984,7 @@ bool Console::cmdShowInstruments(int argc, const char **argv) { if (channel != 15) { // SCI special byte instrument = *channelData++; if (!firstOneShown) - firstOneShown = true; + firstOneShown = true; else DebugPrintf(","); @@ -1577,7 +1577,7 @@ bool Console::cmdPlayVideo(int argc, const char **argv) { Common::String filename = argv[1]; filename.toLowercase(); - if (filename.hasSuffix(".seq") || filename.hasSuffix(".avi") || filename.hasSuffix(".vmd") || + if (filename.hasSuffix(".seq") || filename.hasSuffix(".avi") || filename.hasSuffix(".vmd") || filename.hasSuffix(".rbt") || filename.hasSuffix(".duk")) { _videoFile = filename; _videoFrameDelay = (argc == 2) ? 10 : atoi(argv[2]); @@ -1699,7 +1699,7 @@ bool Console::cmdShowSavedBits(int argc, const char **argv) { return true; } - // Now we _finally_ know these are valid saved bits + // Now we _finally_ know these are valid saved bits Common::Rect rect; byte mask; @@ -1829,7 +1829,7 @@ bool Console::cmdPrintSegmentTable(int argc, const char **argv) { case SEG_TYPE_STRING: DebugPrintf("T SCI32 strings (%d)", (*(StringTable *)mobj).entries_used); break; -#endif +#endif default: DebugPrintf("I Invalid (type = %x)", mobj->getType()); @@ -2954,8 +2954,8 @@ void Console::printKernelCallsFound(int kernelFuncNum, bool showFoundScripts) { uint16 argc2 = opparams[1]; if (kFuncNum == kernelFuncNum) { - DebugPrintf("Called from script %d, object %s, method %s(%d) with %d bytes for arguments\n", - itr->getNumber(), objName, + DebugPrintf("Called from script %d, object %s, method %s(%d) with %d bytes for arguments\n", + itr->getNumber(), objName, _engine->getKernel()->getSelectorName(obj->getFuncSelector(i)).c_str(), i, argc2); } } diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp index 7bc9699e9b..2285e512bd 100644 --- a/engines/sci/detection.cpp +++ b/engines/sci/detection.cpp @@ -23,6 +23,7 @@ #include "engines/advancedDetector.h" #include "base/plugins.h" #include "common/file.h" +#include "common/ptr.h" #include "common/savefile.h" #include "common/system.h" #include "graphics/thumbnail.h" @@ -224,6 +225,7 @@ static const OldNewIdTableEntry s_oldNewTable[] = { { "emc", "funseeker", SCI_VERSION_NONE }, { "gk", "gk1", SCI_VERSION_NONE }, // gk2 is the same + { "gk2demo", "gk2", SCI_VERSION_NONE }, { "hoyledemo", "hoyle1", SCI_VERSION_NONE }, { "cardgames", "hoyle1", SCI_VERSION_NONE }, { "solitare", "hoyle2", SCI_VERSION_NONE }, @@ -235,7 +237,7 @@ static const OldNewIdTableEntry s_oldNewTable[] = { { "kq4", "kq4sci", SCI_VERSION_NONE }, // kq5 is the same // kq6 is the same - // kq7 is the same + { "kq7cd", "kq7", SCI_VERSION_NONE }, { "mm1", "laurabow", SCI_VERSION_NONE }, { "cb1", "laurabow", SCI_VERSION_NONE }, { "lb2", "laurabow2", SCI_VERSION_NONE }, @@ -323,7 +325,7 @@ Common::String convertSierraGameId(Common::String sierraId, uint32 *gameFlags, R for (const OldNewIdTableEntry *cur = s_oldNewTable; cur->oldId[0]; ++cur) { if (sierraId == cur->oldId) { - // Distinguish same IDs from the SCI version + // Distinguish same IDs via the SCI version if (cur->version != SCI_VERSION_NONE && cur->version != getSciVersion()) continue; @@ -428,64 +430,57 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles, s_fallbackDesc.flags = ADGF_NO_FLAGS; s_fallbackDesc.platform = Common::kPlatformPC; // default to PC platform s_fallbackDesc.gameid = "sci"; + s_fallbackDesc.guioptions = Common::GUIO_NONE; - // First grab all filenames - // TODO: Consider using allFiles instead of fslist - for (Common::FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { - if (file->isDirectory()) - continue; - - Common::String filename = file->getName(); - filename.toLowercase(); + if (allFiles.contains("resource.map") || allFiles.contains("Data1") + || allFiles.contains("resmap.001") || allFiles.contains("resmap.001")) { + foundResMap = true; + } - if (filename.contains("resource.map") || filename.contains("resmap.00") || filename.contains("Data1")) { - foundResMap = true; + // Determine if we got a CD version and set the CD flag accordingly, by checking for + // resource.aud for SCI1.1 CD games, or audio001.002 for SCI1 CD games. We assume that + // the file should be over 10MB, as it contains all the game speech and is usually + // around 450MB+. The size check is for some floppy game versions like KQ6 floppy, which + // also have a small resource.aud file + if (allFiles.contains("resource.aud") || allFiles.contains("audio001.002")) { + Common::FSNode file = allFiles.contains("resource.aud") ? allFiles["resource.aud"] : allFiles["audio001.002"]; + Common::SeekableReadStream *tmpStream = file.createReadStream(); + if (tmpStream->size() > 10 * 1024 * 1024) { + // We got a CD version, so set the CD flag accordingly + s_fallbackDesc.flags |= ADGF_CD; } + delete tmpStream; + } - // Determine if we got a CD version and set the CD flag accordingly, by checking for - // resource.aud for SCI1.1 CD games, or audio001.002 for SCI1 CD games. We assume that - // the file should be over 10MB, as it contains all the game speech and is usually - // around 450MB+. The size check is for some floppy game versions like KQ6 floppy, which - // also have a small resource.aud file - if (filename.contains("resource.aud") || filename.contains("audio001.002")) { - Common::SeekableReadStream *tmpStream = file->createReadStream(); - if (tmpStream->size() > 10 * 1024 * 1024) { - // We got a CD version, so set the CD flag accordingly - s_fallbackDesc.flags |= ADGF_CD; - s_fallbackDesc.extra = "CD"; - } - delete tmpStream; - } + if (allFiles.contains("resource.000") || allFiles.contains("resource.001") + || allFiles.contains("ressci.000") || allFiles.contains("ressci.001")) + foundRes000 = true; - if (filename.contains("resource.000") || filename.contains("resource.001") - || filename.contains("ressci.000") || filename.contains("ressci.001")) - foundRes000 = true; + // Data1 contains both map and volume for SCI1.1+ Mac games + if (allFiles.contains("Data1")) { + foundResMap = foundRes000 = true; + s_fallbackDesc.platform = Common::kPlatformMacintosh; + } - // Data1 contains both map and volume for SCI1.1+ Mac games - if (filename.contains("Data1")) { - foundResMap = foundRes000 = true; - s_fallbackDesc.platform = Common::kPlatformMacintosh; - } + // Determine the game platform + // The existence of any of these files indicates an Amiga game + if (allFiles.contains("9.pat") || allFiles.contains("spal") || + allFiles.contains("patch.005") || allFiles.contains("bank.001")) + s_fallbackDesc.platform = Common::kPlatformAmiga; - // Determine the game platform - // The existence of any of these files indicates an Amiga game - if (filename.contains("9.pat") || filename.contains("spal") || - filename.contains("patch.005") || filename.contains("bank.001")) - s_fallbackDesc.platform = Common::kPlatformAmiga; + // The existence of 7.pat or patch.200 indicates a Mac game + if (allFiles.contains("7.pat") || allFiles.contains("patch.200")) + s_fallbackDesc.platform = Common::kPlatformMacintosh; - // The existence of 7.pat or patch.200 indicates a Mac game - if (filename.contains("7.pat") || filename.contains("patch.200")) - s_fallbackDesc.platform = Common::kPlatformMacintosh; + // The data files for Atari ST versions are the same as their DOS counterparts - // The data files for Atari ST versions are the same as their DOS counterparts - } // If these files aren't found, it can't be SCI if (!foundResMap && !foundRes000) { return 0; } - ResourceManager *resMan = new ResourceManager(); + Common::ScopedPtr<ResourceManager> resMan(new ResourceManager()); assert(resMan); resMan->addAppropriateSources(fslist); resMan->init(true); @@ -495,7 +490,6 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles, // Is SCI32 compiled in? If not, and this is a SCI32 game, // stop here if (getSciVersion() >= SCI_VERSION_2) { - delete resMan; return (const ADGameDescription *)&s_fallbackDesc; } #endif @@ -506,7 +500,6 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles, // Can't be SCI (or unsupported SCI views). Pinball Creep by sierra also uses resource.map/resource.000 files // but doesnt share sci format at all, if we dont return 0 here we will detect this game as SCI if (gameViews == kViewUnknown) { - delete resMan; return 0; } @@ -519,7 +512,6 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles, // If we don't have a game id, the game is not SCI if (sierraGameId.empty()) { - delete resMan; return 0; } @@ -558,24 +550,43 @@ const ADGameDescription *SciMetaEngine::fallbackDetect(const FileMap &allFiles, } - // Fill in extras field + // Fill in "extra" field + + // Is this an EGA version that might have a VGA pendant? Then we want + // to mark it as such in the "extra" field. + const bool markAsEGA = (gameViews == kViewEga && s_fallbackDesc.platform != Common::kPlatformAmiga + && getSciVersion() > SCI_VERSION_1_EGA_ONLY); + + const bool isDemo = (s_fallbackDesc.flags & ADGF_DEMO); + const bool isCD = (s_fallbackDesc.flags & ADGF_CD); + + if (!isCD) + s_fallbackDesc.guioptions |= Common::GUIO_NOSPEECH; if (gameId.hasSuffix("sci")) { s_fallbackDesc.extra = "SCI"; // Differentiate EGA versions from the VGA ones, where needed - if (gameViews == kViewEga && s_fallbackDesc.platform != Common::kPlatformAmiga) + if (markAsEGA) s_fallbackDesc.extra = "SCI/EGA"; + + // Mark as demo. + // Note: This overwrites the 'EGA' info, if it was previously set. + if (isDemo) + s_fallbackDesc.extra = "SCI/Demo"; } else { - if (gameViews == kViewEga && s_fallbackDesc.platform != Common::kPlatformAmiga) + if (markAsEGA) s_fallbackDesc.extra = "EGA"; - } - - // Add "demo" to the description for demos - if (s_fallbackDesc.flags & ADGF_DEMO) - s_fallbackDesc.extra = (gameId.hasSuffix("sci")) ? "SCI/Demo" : "Demo"; - delete resMan; + // Set "CD" and "Demo" as appropriate. + // Note: This overwrites the 'EGA' info, if it was previously set. + if (isDemo && isCD) + s_fallbackDesc.extra = "CD Demo"; + else if (isDemo) + s_fallbackDesc.extra = "Demo"; + else if (isCD) + s_fallbackDesc.extra = "CD"; + } return (const ADGameDescription *)&s_fallbackDesc; } diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h index def3879945..4634edb1a8 100644 --- a/engines/sci/detection_tables.h +++ b/engines/sci/detection_tables.h @@ -617,7 +617,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10783}, {"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Gabriel Knight - English DOS Floppy (supplied my markcoolio in bug report #2723777) // SCI interpreter version 2.000.000 @@ -625,7 +625,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "65e8c14092e4c9b3b3538b7602c8c5ec", 10783}, {"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Gabriel Knight - English DOS Floppy // SCI interpreter version 2.000.000, VERSION file reports "1.0\nGabriel Knight\n11/22/10:33 pm\n\x1A" @@ -633,7 +633,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "ef41df08cf2c1f680216cdbeed0f8311", 10783}, {"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 13022630}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Gabriel Knight - German DOS Floppy (supplied my markcoolio in bug report #2723775) // SCI interpreter version 2.000.000 @@ -641,7 +641,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "ad6508b0296b25c07b1f58828dc33696", 10789}, {"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13077029}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Gabriel Knight - English DOS CD (from jvprat) // Executable scanning reports "2.000.000", VERSION file reports "01.100.000" @@ -649,7 +649,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10996}, {"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 12581736}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE }, // Gabriel Knight - English Windows CD (from jvprat) // Executable scanning reports "2.000.000", VERSION file reports "01.100.000" @@ -657,7 +657,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "372d059f75856afa6d73dd84cbb8913d", 10996}, {"resource.000", 0, "69b7516962510f780d38519cc15fcc7c", 12581736}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE }, // Gabriel Knight - German DOS CD (from Tobis87) // SCI interpreter version 2.000.000 @@ -665,7 +665,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "a7d3e55114c65647310373cb390815ba", 11392}, {"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13400497}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, ADGF_CD, GUIO_NONE }, + Common::DE_DEU, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE }, // Gabriel Knight - Spanish DOS CD (from jvprat) // Executable scanning reports "2.000.000", VERSION file reports "1.000.000, April 13, 1995" @@ -673,7 +673,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "7cb6e9bba15b544ec7a635c45bde9953", 11404}, {"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13381599}, AD_LISTEND}, - Common::ES_ESP, Common::kPlatformPC, ADGF_CD, GUIO_NONE }, + Common::ES_ESP, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE }, // Gabriel Knight - French DOS CD (from Hkz) // VERSION file reports "1.000.000, May 3, 1994" @@ -681,7 +681,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "55f909ba93a2515042a08d8a2da8414e", 11392}, {"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13325145}, AD_LISTEND}, - Common::FR_FRA, Common::kPlatformPC, ADGF_CD, GUIO_NONE }, + Common::FR_FRA, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE }, // Gabriel Knight - German Windows CD (from Tobis87) // SCI interpreter version 2.000.000 @@ -689,7 +689,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "a7d3e55114c65647310373cb390815ba", 11392}, {"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13400497}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformWindows, ADGF_CD, GUIO_NONE }, + Common::DE_DEU, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE }, // Gabriel Knight - Spanish Windows CD (from jvprat) // Executable scanning reports "2.000.000", VERSION file reports "1.000.000, April 13, 1995" @@ -697,7 +697,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "7cb6e9bba15b544ec7a635c45bde9953", 11404}, {"resource.000", 0, "091cf08910780feabc56f8551b09cb36", 13381599}, AD_LISTEND}, - Common::ES_ESP, Common::kPlatformWindows, ADGF_CD, GUIO_NONE }, + Common::ES_ESP, Common::kPlatformWindows, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE }, // Gabriel Knight - English Macintosh {"gk1", "", { @@ -706,7 +706,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"Data3", 0, "f25068b408b09275d8b698866462f578", 3677599}, {"Data4", 0, "1cceebbe411b26c860a74f91c337fdf3", 3230086}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO_NONE }, // Gabriel Knight 2 - English Windows Non-Interactive Demo // Executable scanning reports "2.100.002" @@ -714,7 +714,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "e0effce11c4908f4b91838741716c83d", 1351}, {"resource.000", 0, "d04cfc7f04b6f74d13025378be49ec2b", 4640330}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH }, // Gabriel Knight 2 - English DOS (from jvprat) // Executable scanning reports "2.100.002", VERSION file reports "1.1" @@ -732,7 +732,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.006", 0, "ce9359037277b7d7976da185c2fa0aad", 2977}, {"ressci.006", 0, "8e44e03890205a7be12f45aaba9644b4", 60659424}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Gabriel Knight 2 - French DOS (6-CDs Sierra Originals reedition) // Executable scanning reports "2.100.002", VERSION file reports "1.0" @@ -750,7 +750,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.006", 0, "11b2e722170b8c93fdaa5428e2c7676f", 3001}, {"ressci.006", 0, "4037d941aec39d2e654e20960429aefc", 60568486}, AD_LISTEND}, - Common::FR_FRA, Common::kPlatformPC, 0, + Common::FR_FRA, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Gabriel Knight 2 - English Macintosh @@ -763,7 +763,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"Data4", 0, "8b843c62eb53136a855d6e0087e3cb0d", 5889553}, {"Data5", 0, "f9fcf9ab2eb13b2125c33a1cda03a093", 14349984}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO_NONE }, #endif // ENABLE_SCI32 @@ -1446,7 +1446,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.000", 0, "4948e4e1506f1e1c4e1d47abfa06b7f8", 204385195}, {"resource.map", 0, "40ccafb2195301504eba2e4f4f2c7f3d", 18925}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH }, // King's Quest 7 - English Windows (from the King's Quest Collection) // Executable scanning reports "2.100.002", VERSION file reports "1.4" @@ -1454,7 +1454,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "2be9ab94429c721af8e05c507e048a15", 18697}, {"resource.000", 0, "eb63ea3a2c2469dc2d777d351c626404", 203882535}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH }, // King's Quest 7 - English DOS (from FRG) // SCI interpreter version 2.100.002, VERSION file reports "2.00b" @@ -1462,7 +1462,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "8676b0fbbd7362989a029fe72fea14c6", 18709}, {"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // King's Quest 7 - English Windows (from FRG) // SCI interpreter version 2.100.002, VERSION file reports "2.00b" @@ -1470,7 +1470,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "8676b0fbbd7362989a029fe72fea14c6", 18709}, {"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH }, // King's Quest 7 - German Windows (supplied by markcoolio in bug report #2727402) // SCI interpreter version 2.100.002 @@ -1478,7 +1478,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "838b9ff132bd6962026fee832e8a7ddb", 18697}, {"resource.000", 0, "eb63ea3a2c2469dc2d777d351c626404", 206626576}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // King's Quest 7 - Spanish DOS (from jvprat) // Executable scanning reports "2.100.002", VERSION file reports "2.00" @@ -1486,7 +1486,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "0b62693cbe87e3aaca3e8655a437f27f", 18709}, {"resource.000", 0, "51c1ead1163e19a2de8f121c39df7a76", 200764100}, AD_LISTEND}, - Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::ES_ESP, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // King's Quest 7 - English DOS Non-Interactive Demo // SCI interpreter version 2.100.002 @@ -1494,7 +1494,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "b44f774108d63faa1d021101221c5a54", 1690}, {"resource.000", 0, "d9659d2cf0c269c6a9dc776707f5bea0", 2433827}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH }, #endif // ENABLE_SCI32 @@ -2087,7 +2087,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "0c0804434ea62278dd15032b1947426c", 8872}, {"resource.000", 0, "9a9f4870504444cda863dd14d077a680", 18520872}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE }, // Larry 6 - German DOS CD - HIRES (provided by richiefs in bug report #2670691) // SCI interpreter version 2.100.002 @@ -2095,7 +2095,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "badfdf446ffed569a310d2c63a249421", 8896}, {"resource.000", 0, "bd944d2b06614a5b39f1586906f0ee88", 18534274}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NONE }, + Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE }, // Larry 6 - French DOS CD - HIRES (provided by richiefs in bug report #2670691) // SCI interpreter version 2.100.002 @@ -2103,7 +2103,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "d184e9aa4f2d4b5670ddb3669db82cda", 8896}, {"resource.000", 0, "bd944d2b06614a5b39f1586906f0ee88", 18538987}, AD_LISTEND}, - Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NONE }, + Common::FR_FRA, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE }, // Larry 7 - English DOS Demo (provided by richiefs in bug report #2670691) // SCI interpreter version 2.100.002 @@ -2111,7 +2111,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.000", 0, "5cc6159688b2dc03790a67c90ccc67f9", 10195878}, {"resmap.000", 0, "6a2b2811eef82e87cde91cf1de845af8", 2695}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH }, #ifdef ENABLE_SCI3_GAMES // Larry 7 - English DOS CD (from spookypeanut) @@ -2120,7 +2120,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "eae93e1b1d1ccc58b4691c371281c95d", 8188}, {"ressci.000", 0, "89353723488219e25589165d73ed663e", 66965678}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE }, // Larry 7 - German DOS (from Tobis87) // SCI interpreter version 3.000.000 @@ -2128,7 +2128,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "c11e6bfcfc2f2d05da47e5a7df3e9b1a", 8188}, {"ressci.000", 0, "a8c6817bb94f332ff498a71c8b47f893", 66971724}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Larry 7 - French DOS (provided by richiefs in bug report #2670691) // SCI interpreter version 3.000.000 @@ -2136,7 +2136,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "4407849fd52fe3efb0c30fba60cd5cd4", 8206}, {"ressci.000", 0, "dc37c3055fffbefb494ff22b145d377b", 66964472}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Larry 7 - Italian DOS CD (from glorifindel) // SCI interpreter version 3.000.000 @@ -2144,7 +2144,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "9852a97141f789413f29bf956052acdb", 8212}, {"ressci.000", 0, "440b9fed89590abb4e4386ed6f948ee2", 67140181}, AD_LISTEND}, - Common::IT_ITA, Common::kPlatformPC, 0, GUIO_NONE }, + Common::IT_ITA, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE }, // Larry 7 - Spanish DOS (from the Leisure Suit Larry Collection) // Executable scanning reports "3.000.000", VERSION file reports "1.0s" @@ -2152,7 +2152,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "8f3d603e1acc834a5d598b30cdfc93f3", 8188}, {"ressci.000", 0, "32792f9bc1bf3633a88b382bb3f6e40d", 67071418}, AD_LISTEND}, - Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::ES_ESP, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, #endif // Lighthouse - English Windows Demo (from jvprat) @@ -2161,7 +2161,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "543124606352bfa5e07696ddf2a669be", 64}, {"resource.000", 0, "5d7714416b612463d750fb9c5690c859", 28952}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH }, #ifdef ENABLE_SCI3_GAMES // Lighthouse - English Windows Demo @@ -2170,7 +2170,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "3bdee7a16926975a4729f75cf6b80a92", 1525}, {"ressci.000", 0, "3c585827fa4a82f4c04a56a0bc52ccee", 11494351}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH }, // Lighthouse - English DOS (from jvprat) // Executable scanning reports "3.000.000", VERSION file reports "1.1" @@ -2180,7 +2180,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.002", 0, "c68db5333f152fea6ca2dfc75cad8b34", 7573}, {"ressci.002", 0, "175468431a979b9f317c294ce3bc1430", 94628315}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Lighthouse - Spanish DOS (from jvprat) // Executable scanning reports "3.000.000", VERSION file reports "1.1" @@ -2190,7 +2190,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.002", 0, "e7dc85884a2417e2eff9de0c63dd65fa", 7630}, {"ressci.002", 0, "3c8d627c555b0e3e4f1d9955bc0f0df4", 94631127}, AD_LISTEND}, - Common::ES_ESP, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::ES_ESP, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, #endif // ENABLE_SCI3_GAMES #endif // ENABLE_SCI32 @@ -2307,7 +2307,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "5159a1578c4306bfe070a3e4d8c2e1d3", 4741}, {"resource.000", 0, "1926925c95d82f0999590e93b02887c5", 15150768}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE }, // Mixed-Up Mother Goose Deluxe - Multilingual Windows CD (English/French/German/Spanish) // Executable scanning reports "2.100.002" @@ -2315,7 +2315,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "ef611af561898dcfea87846919ebf3eb", 4969}, {"ressci.000", 0, "227685bc59d90821978d330713e44a7a", 17205800}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE }, #endif // ENABLE_SCI32 // Ms. Astro Chicken - English DOS @@ -2345,15 +2345,15 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.007", 0, "afbd16ea77869a720afa1c5371de107d", 7972}, //{"ressci.007", 0, "3aae6559aa1df273bc542d5ac6330d75", 25859038}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, - + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, + // Phantasmagoria - English DOS Demo // Executable scanning reports "2.100.002" {"phantasmagoria", "Demo", { {"resmap.001", 0, "416138651ea828219ca454cae18341a3", 11518}, {"ressci.001", 0, "3aae6559aa1df273bc542d5ac6330d75", 65844612}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH }, // Phantasmagoria - English DOS/Windows (GOG version) - ressci.* merged in ressci.000 // Windows executable scanning reports "2.100.002" - "Sep 19 1995 15:09:43" @@ -2364,7 +2364,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.000", 0, "cd5967f9b9586e3380645961c0765be3", 116822037}, {"resmap.000", 0, "3cafc1c6a53945c1f3babbfd6380c64c", 16468}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Phantasmagoria - English Macintosh // NOTE: This only contains disc 1 files (as well as the two persistent files: @@ -2380,7 +2380,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { // Data8-12 are empty {"Data13", 0, "6d2c450fca19a69b5af74ed5b03c0a17", 14923328}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformMacintosh, ADGF_MACRESFORK | ADGF_UNSTABLE, GUIO_NONE }, #ifdef ENABLE_SCI3_GAMES // Phantasmagoria 2 - English Windows (from jvprat) @@ -2397,7 +2397,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.005", 0, "8bd5ceeedcbe16dfe55d1b90dcd4be84", 1942}, {"ressci.005", 0, "05f9fe2bee749659acb3cd2c90252fc5", 67905112}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Phantasmagoria 2 - English DOS (GOG version) - ressci.* merged in ressci.000 // Executable scanning reports "3.000.000" - "Dec 07 1996 09:29:03" @@ -2407,7 +2407,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.000", 0, "c54f26d9f43f908151263254b6d97053", 108134481}, {"resmap.000", 0, "de154a223a9ef4ea7358b76adc38ef5b", 2956}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH }, #endif // ENABLE_SCI3_GAMES #endif // ENABLE_SCI32 @@ -2614,7 +2614,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "379dfe80ed6bd16c47e4b950c4722eac", 11374}, {"resource.000", 0, "fd316a09b628b7032248139003369022", 18841068}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE }, // Police Quest 4 - English DOS // SCI interpreter version 2.000.000 (a guess?) @@ -2622,7 +2622,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "aed9643158ccf01b71f359db33137f82", 9895}, {"resource.000", 0, "da383857b3be1e4514daeba2524359e0", 15141432}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Police Quest 4 - French DOS (supplied by abevi in bug report #2612718) // SCI interpreter version 2.000.000 @@ -2630,7 +2630,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "008030846edcc7c5c7a812c7f4ae4ceb", 9256}, {"resource.000", 0, "6ba98bd2e436739d87ecd2a9b99cabb4", 14730153}, AD_LISTEND}, - Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::FR_FRA, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Police Quest 4 - German DOS (supplied by markcoolio in bug report #2723840) // SCI interpreter version 2.000.000 (a guess?) @@ -2638,7 +2638,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "2393ee728ab930b2762cb5889f9b5aff", 9256}, {"resource.000", 0, "6ba98bd2e436739d87ecd2a9b99cabb4", 14730155}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Police Quest: SWAT - English DOS/Windows Demo (from jvprat) // Executable scanning reports "2.100.002", VERSION file reports "0.001.200" @@ -2646,7 +2646,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "8c96733ef94c21526792f7ca4e3f2120", 1648}, {"resource.000", 0, "d8892f1b8c56c8f7704325460f49b300", 3676175}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH }, // Police Quest: SWAT - English DOS (from GOG.com) // Executable scanning reports "2.100.002", VERSION file reports "1.0c" @@ -2654,7 +2654,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "1c2563fee189885e29d9348f37306d94", 12175}, {"ressci.000", 0, "b2e1826ca81ce2e7e764587f5a14eee9", 127149181}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE }, // Police Quest: SWAT - English Windows (from the Police Quest Collection) // Executable scanning reports "2.100.002", VERSION file reports "1.0c" @@ -2669,7 +2669,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.004", 0, "4228038906f041623e65789500b22285", 6835}, {"ressci.004", 0, "b7e619e6ecf62fe65d5116a3a422e5f0", 46223872}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE }, #endif // ENABLE_SCI32 // Quest for Glory 1 / Hero's Quest - English DOS 3.5" Floppy (supplied by merkur in bug report #2718784) @@ -2980,7 +2980,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "685bdb1ed47bbbb0e5e25db392da83ce", 9301}, {"resource.000", 0, "f64fd6aa3977939a86ff30783dd677e1", 11004993}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Quest for Glory 4 1.1 Floppy - English DOS (supplied by abevi in bug report #2612718) // SCI interpreter version 2.000.000 @@ -2988,7 +2988,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "d10a4cc177d2091d744e2ad8c049b0ae", 9295}, {"resource.000", 0, "f64fd6aa3977939a86ff30783dd677e1", 11003589}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Quest for Glory 4 1.1 Floppy - German DOS (supplied by markcool in bug report #2723850) // Executable scanning reports "2.000.000", VERSION file reports "1.1" @@ -2996,7 +2996,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "9e0abba8746f40565bc7eb5720522ecd", 9301}, {"resource.000", 0, "57f22cdc54eeb35fce1f26b31b5c3ee1", 11076197}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Quest for Glory 4 CD - English DOS/Windows (from jvprat) // Executable scanning reports "2.100.002", VERSION file reports "1.0" @@ -3004,7 +3004,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "aba367f2102e81782d961b14fbe3d630", 10246}, {"resource.000", 0, "263dce4aa34c49d3ad29bec889007b1c", 11571394}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_CD, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformPC, ADGF_CD | ADGF_UNSTABLE, GUIO_NONE }, // RAMA - English DOS/Windows Demo // Executable scanning reports "2.100.002", VERSION file reports "000.000.008" @@ -3012,7 +3012,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.001", 0, "775304e9b2a545156be4d94209550094", 1393}, {"ressci.001", 0, "259437fd75fdf51e8207fda8c01fa4fd", 2334384}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NONE }, #ifdef ENABLE_SCI3_GAMES // RAMA - English Windows (from jvprat) @@ -3025,7 +3025,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.003", 0, "31ef4c0621711585d031f0ae81707251", 1636}, {"ressci.003", 0, "2a68edd064e5e4937b5e9c74b38f2082", 6860492}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE }, // RAMA - English Windows (from Quietust, in bug report #2850645) {"rama", "", { @@ -3036,7 +3036,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.003", 0, "48841e4b84ef1b98b48d43566fda9e13", 1636}, {"ressci.003", 0, "2a68edd064e5e4937b5e9c74b38f2082", 6870356}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE }, // RAMA - Italian Windows CD (from glorifindel) // SCI interpreter version 3.000.000 (a guess?) @@ -3044,7 +3044,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.001", 0, "2a68edd064e5e4937b5e9c74b38f2082", 70611091}, {"resmap.001", 0, "70ba2ff04a2b7fb2c52420ba7fbd47c2", 8338}, AD_LISTEND}, - Common::IT_ITA, Common::kPlatformWindows, 0, GUIO_NONE }, + Common::IT_ITA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE }, #endif // ENABLE_SCI3_GAMES // Shivers - English Windows (from jvprat) @@ -3053,14 +3053,14 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "f2ead37749ed8f6535a2445a7d05a0cc", 46525}, {"ressci.000", 0, "4294c6d7510935f2e0a52e302073c951", 262654836}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE }, // Shivers - German Windows (from Tobis87) {"shivers", "", { {"resmap.000", 0, "f483d0a1f78334c18052e92785c3086e", 46537}, {"ressci.000", 0, "6751b144671e2deed919eb9d284b07eb", 262390692}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformWindows, 0, GUIO_NONE }, + Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE }, // Shivers - English Windows Demo // Executable scanning reports "2.100.002" @@ -3068,7 +3068,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "d9e0bc5eddefcbe47f528760085d8927", 1186}, {"ressci.000", 0, "3a93c6340b54e07e65d0e5583354d186", 10505469}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NONE }, // Shivers 2 doesn't contain SCI scripts. The whole game logic has // been reimplemented from SCI in native code placed in DLL files. @@ -3086,7 +3086,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "d8659188b84beaef076bd869837cd530", 634}, {"ressci.000", 0, "7fbac0807a044c9543e8ac376d200e59", 4925003}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NONE }, // Shivers 2 - English Windows (from abevi) // VERSION.TXT Version 1.0 (3/25/97) @@ -3094,7 +3094,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.001", 0, "a79d03d6eb75be0a79324f14e3d2ace4", 95346793}, {"resmap.001", 0, "a4804d436d90c4ec2e46b537f5e954db", 6268}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH }, #endif @@ -3479,7 +3479,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { // Space Quest 4 - English Macintosh // Executable scanning reports "x.yyy.zzz" - // VERSION file reports "1.148" + // VERSION file reports "1.148" {"sq4", "", { {"resource.map", 0, "6ffc6f76c4127d140759a512ab9a07be", 6042}, {"resource.000", 0, "6a538b389705232cf9b2d7de2cf9c0a7", 224833}, @@ -3572,7 +3572,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "6dddfa3a8f3a3a513ec9dfdfae955005", 10528}, {"resource.000", 0, "c4259ab7355aead07773397b1052827d", 41150806}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE }, // Space Quest 6 - English DOS/Win3.11 CD ver 1.11 (from FRG) // SCI interpreter version 2.100.002 (just a guess) @@ -3580,7 +3580,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "e0615d6e4e10e37ae42e6a2a95aaf145", 10528}, {"resource.000", 0, "c4259ab7355aead07773397b1052827d", 41150806}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, 0, GUIO_NONE }, + Common::EN_ANY, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE }, // Space Quest 6 - French DOS/Win3.11 CD (from French magazine Joystick - September 1997) // Executable scanning reports "2.100.002", VERSION file reports "1.0" @@ -3588,7 +3588,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "3c831625931d5079b73ae8c275f52c95", 10534}, {"resource.000", 0, "4195ca940f759424f62b90e262cc1737", 40932397}, AD_LISTEND}, - Common::FR_FRA, Common::kPlatformPC, 0, GUIO_NONE }, + Common::FR_FRA, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE }, // Space Quest 6 - German DOS (from Tobis87, updated info from markcoolio in bug report #2723884) // SCI interpreter version 2.100.002 (just a guess) @@ -3596,7 +3596,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "664d797415484f85c90b1b45aedc7686", 10534}, {"resource.000", 0, "ba87ba91e5bdabb4169dd0df75777722", 40933685}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformPC, 0, GUIO_NONE }, + Common::DE_DEU, Common::kPlatformPC, ADGF_UNSTABLE, GUIO_NONE }, // Space Quest 6 - English DOS/Win3.11 Interactive Demo (from FRG) // SCI interpreter version 2.100.002 (just a guess) @@ -3604,7 +3604,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resource.map", 0, "368f07b07433db3f819fa3fa0e5efee5", 2572}, {"resource.000", 0, "ab12724e078dea34b624e0d2a38dcd7c", 2272050}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH }, #endif // ENABLE_SCI32 // The Island of Dr. Brain - English DOS CD (from jvprat) @@ -3638,7 +3638,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "9a3e172cde9963d0a969f26469318cec", 3403}, {"ressci.000", 0, "db3e290481c35c3224e9602e71e4a1f1", 5073868}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_DEMO | ADGF_UNSTABLE, GUIO_NOSPEECH }, // Torin's Passage - English Windows // SCI interpreter version 2.100.002 (just a guess) @@ -3646,7 +3646,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799}, {"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887}, AD_LISTEND}, - Common::EN_ANY, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, + Common::EN_ANY, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Torin's Passage - Spanish Windows (from jvprat) // Executable scanning reports "2.100.002", VERSION file reports "1.0" @@ -3655,7 +3655,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887}, // TODO: depend on one of the patches? AD_LISTEND}, - Common::ES_ESP, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, + Common::ES_ESP, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Torin's Passage - French Windows // SCI interpreter version 2.100.002 (just a guess) @@ -3663,7 +3663,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799}, {"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887}, AD_LISTEND}, - Common::FR_FRA, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, + Common::FR_FRA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Torin's Passage - German Windows // SCI interpreter version 2.100.002 (just a guess) @@ -3671,7 +3671,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799}, {"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887}, AD_LISTEND}, - Common::DE_DEU, Common::kPlatformWindows, 0, GUIO_NOSPEECH }, + Common::DE_DEU, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NOSPEECH }, // Torin's Passage - Italian Windows CD (from glorifindel) // SCI interpreter version 2.100.002 (just a guess) @@ -3679,7 +3679,7 @@ static const struct ADGameDescription SciGameDescriptions[] = { {"resmap.000", 0, "bb3b0b22ff08df54fbe2d06263409be6", 9799}, {"ressci.000", 0, "693a259d346c9360f4a0c11fdaae430a", 55973887}, AD_LISTEND}, - Common::IT_ITA, Common::kPlatformWindows, 0, GUIO_NONE }, + Common::IT_ITA, Common::kPlatformWindows, ADGF_UNSTABLE, GUIO_NONE }, #endif // ENABLE_SCI32 // SCI Fanmade Games diff --git a/engines/sci/engine/features.h b/engines/sci/engine/features.h index 07ba626d15..4592c5be9c 100644 --- a/engines/sci/engine/features.h +++ b/engines/sci/engine/features.h @@ -75,7 +75,7 @@ public: * @return Message function type, SCI_VERSION_1_LATE / SCI_VERSION_1_1 */ SciVersion detectMessageFunctionType(); - + #ifdef ENABLE_SCI32 /** * Autodetects the kernel functions used in SCI2.1 diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 68b1601580..ff3c67c84b 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -272,7 +272,7 @@ private: // Kernel-related lists Common::StringArray _selectorNames; Common::StringArray _kernelNames; - + const Common::String _invalid; }; diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 31ef64d109..0c5d4e680d 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -558,16 +558,16 @@ static SciKernelMapEntry s_kernelMap[] = { // SetWindowsOption is used to set Windows specific options, like for example the title bar visibility of // the game window in Phantasmagoria 2. We ignore these settings completely. { MAP_EMPTY(SetWindowsOption), SIG_EVERYWHERE, "ii", NULL, NULL }, - + // Used by the Windows version of Phantasmagoria 1 to get the video speed setting. This is called after - // kGetConfig and overrides the setting obtained by it. It is a dummy function in the DOS Version. We can + // kGetConfig and overrides the setting obtained by it. It is a dummy function in the DOS Version. We can // just use GetConfig and mark this one as empty, like the DOS version does. { MAP_EMPTY(GetSierraProfileInt), SIG_EVERYWHERE, "(.*)", NULL, NULL }, // Unused / debug SCI2.1 unused functions, always mapped to kDummy // The debug functions are called from the inbuilt debugger or polygon - // editor in SCI2.1 games. Related objects are: PEditor, EditablePolygon, + // editor in SCI2.1 games. Related objects are: PEditor, EditablePolygon, // aeDisplayClass and scalerCode { MAP_DUMMY(FindSelector), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_DUMMY(FindClass), SIG_EVERYWHERE, "(.*)", NULL, NULL }, diff --git a/engines/sci/engine/kevent.cpp b/engines/sci/engine/kevent.cpp index 2cd6b198de..df3b3efd57 100644 --- a/engines/sci/engine/kevent.cpp +++ b/engines/sci/engine/kevent.cpp @@ -194,7 +194,7 @@ reg_t kGetEvent(EngineState *s, int argc, reg_t *argv) { // Wait a bit here, so that the CPU isn't maxed out when the game // is waiting for user input (e.g. when showing text boxes) - bug // #3037874. Make sure that we're not delaying while the game is - // benchmarking, as that will affect the final benchmarked result - + // benchmarking, as that will affect the final benchmarked result - // check bugs #3058865 and #3127824 if (s->_gameIsBenchmarking) { // Game is benchmarking, don't add a delay diff --git a/engines/sci/engine/kfile.cpp b/engines/sci/engine/kfile.cpp index e1e52215d2..1bd6754ca5 100644 --- a/engines/sci/engine/kfile.cpp +++ b/engines/sci/engine/kfile.cpp @@ -208,7 +208,7 @@ reg_t kFClose(EngineState *s, int argc, reg_t *argv) { reg_t kFPuts(EngineState *s, int argc, reg_t *argv) { int handle = argv[0].toUint16(); Common::String data = s->_segMan->getString(argv[1]); - + FileHandle *f = getFileFromHandle(s, handle); if (f) f->_out->write(data.c_str(), data.size()); @@ -812,7 +812,7 @@ reg_t kFileIOReadRaw(EngineState *s, int argc, reg_t *argv) { int bytesRead = 0; char *buf = new char[size]; debugC(kDebugLevelFile, "kFileIO(readRaw): %d, %d", handle, size); - + FileHandle *f = getFileFromHandle(s, handle); if (f) { bytesRead = f->_in->read(buf, size); @@ -910,7 +910,7 @@ reg_t kFileIOSeek(EngineState *s, int argc, reg_t *argv) { int offset = argv[1].toUint16(); int whence = argv[2].toUint16(); debugC(kDebugLevelFile, "kFileIO(seek): %d, %d, %d", handle, offset, whence); - + FileHandle *f = getFileFromHandle(s, handle); if (f) diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp index 6c96266922..36de767464 100644 --- a/engines/sci/engine/kgraphics.cpp +++ b/engines/sci/engine/kgraphics.cpp @@ -151,7 +151,7 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { case 2: pos.y = argv[1].toSint16(); pos.x = argv[0].toSint16(); - + g_sci->_gfxCursor->kernelSetPos(pos); break; case 4: { @@ -192,7 +192,7 @@ static reg_t kSetCursorSci11(EngineState *s, int argc, reg_t *argv) { break; case 10: // Freddy pharkas, when using the whiskey glass to read the prescription (bug #3034973) - g_sci->_gfxCursor->kernelSetZoomZone(argv[0].toUint16(), + g_sci->_gfxCursor->kernelSetZoomZone(argv[0].toUint16(), Common::Rect(argv[1].toUint16(), argv[2].toUint16(), argv[3].toUint16(), argv[4].toUint16()), argv[5].toUint16(), argv[6].toUint16(), argv[7].toUint16(), argv[8].toUint16(), argv[9].toUint16()); @@ -428,7 +428,7 @@ reg_t kCanBeHere(EngineState *s, int argc, reg_t *argv) { reg_t kCantBeHere(EngineState *s, int argc, reg_t *argv) { reg_t curObject = argv[0]; reg_t listReference = (argc > 1) ? argv[1] : NULL_REG; - + reg_t canBeHere = g_sci->_gfxCompare->kernelCanBeHere(curObject, listReference); return canBeHere; } @@ -1279,7 +1279,7 @@ reg_t kCantBeHere32(EngineState *s, int argc, reg_t *argv) { // TODO // reg_t curObject = argv[0]; // reg_t listReference = (argc > 1) ? argv[1] : NULL_REG; - + return NULL_REG; } @@ -1642,8 +1642,8 @@ reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv) { reg_t kSetFontRes(EngineState *s, int argc, reg_t *argv) { // TODO: This defines the resolution that the fonts are supposed to be displayed // in. Currently, this is only used for showing high-res fonts in GK1 Mac, but - // should be extended to handle other font resolutions such as those - + // should be extended to handle other font resolutions such as those + int xResolution = argv[0].toUint16(); //int yResolution = argv[1].toUint16(); diff --git a/engines/sci/engine/kmisc.cpp b/engines/sci/engine/kmisc.cpp index daed248db1..e6837242e4 100644 --- a/engines/sci/engine/kmisc.cpp +++ b/engines/sci/engine/kmisc.cpp @@ -75,11 +75,11 @@ reg_t kGameIsRestarting(EngineState *s, int argc, reg_t *argv) { } break; case GID_SQ4: - // In SQ4 (floppy and CD) the sequel police appear way too quickly in + // In SQ4 (floppy and CD) the sequel police appear way too quickly in // the Skate-o-rama rooms, resulting in all sorts of timer issues, like // #3109139 (which occurs because a police officer instantly teleports // just before Roger exits and shoots him). We throttle these scenes a - // bit more, in order to prevent timer bugs related to the sequel police + // bit more, in order to prevent timer bugs related to the sequel police if (s->currentRoomNumber() == 405 || s->currentRoomNumber() == 406 || s->currentRoomNumber() == 410 || s->currentRoomNumber() == 411) { s->_throttleTrigger = true; @@ -186,7 +186,7 @@ reg_t kSetDebug(EngineState *s, int argc, reg_t *argv) { if (g_sci->getGameId() != GID_GK1) { debug("Debug mode activated"); - + g_sci->getDebugger()->attach(); } diff --git a/engines/sci/engine/kmovement.cpp b/engines/sci/engine/kmovement.cpp index 31715f19d3..14f7db47a0 100644 --- a/engines/sci/engine/kmovement.cpp +++ b/engines/sci/engine/kmovement.cpp @@ -239,7 +239,7 @@ reg_t kInitBresen(EngineState *s, int argc, reg_t *argv) { client_step--; if (!client_step) - error("kInitBresen failed"); + error("kInitBresen failed"); client_xStep--; } @@ -440,7 +440,7 @@ reg_t kDoAvoider(EngineState *s, int argc, reg_t *argv) { invokeSelector(s, clientLooper, SELECTOR(doit), argc, argv, 2, params); } s->r_acc = SIGNAL_REG; - + } else { // is blocked if (avoiderHeading == -1) diff --git a/engines/sci/engine/kpathing.cpp b/engines/sci/engine/kpathing.cpp index 8904a48978..375aeaa06b 100644 --- a/engines/sci/engine/kpathing.cpp +++ b/engines/sci/engine/kpathing.cpp @@ -1110,7 +1110,7 @@ static Polygon *convert_polygon(EngineState *s, reg_t polygon) { // Make sure that we have enough points if (pointList.maxSize < size * POLY_POINT_SIZE) { warning("convert_polygon: Not enough memory allocated for polygon points. " - "Expected %d, got %d. Skipping polygon", + "Expected %d, got %d. Skipping polygon", size * POLY_POINT_SIZE, pointList.maxSize); return NULL; } @@ -1202,7 +1202,7 @@ static PathfindingState *convert_polygon_set(EngineState *s, reg_t poly_list, Co change_polygons_opt_0(pf_s); Common::Point *new_start = fixup_start_point(pf_s, start); - + if (!new_start) { warning("AvoidPath: Couldn't fixup start position for pathfinding"); delete pf_s; @@ -1210,7 +1210,7 @@ static PathfindingState *convert_polygon_set(EngineState *s, reg_t poly_list, Co } Common::Point *new_end = fixup_end_point(pf_s, end); - + if (!new_end) { warning("AvoidPath: Couldn't fixup end position for pathfinding"); delete new_start; diff --git a/engines/sci/engine/kscripts.cpp b/engines/sci/engine/kscripts.cpp index d83254b2c4..93c1fffe3c 100644 --- a/engines/sci/engine/kscripts.cpp +++ b/engines/sci/engine/kscripts.cpp @@ -163,7 +163,7 @@ reg_t kClone(EngineState *s, int argc, reg_t *argv) { // extend the internal storage size. if (infoSelector & kInfoFlagClone) parentObj = s->_segMan->getObject(parentAddr); - + *cloneObj = *parentObj; // Mark as clone diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index c3c10bd2a2..07b87a7cbc 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -427,7 +427,7 @@ reg_t kGetFarText(EngineState *s, int argc, reg_t *argv) { } seeker = (char *)textres->data; - + // The second parameter (counter) determines the number of the string // inside the text resource. while (counter--) { @@ -715,7 +715,7 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { // triggers an assert when doing string2[i + index2]. for (uint16 i = 0; i < count; i++) string1->setValue(i + index1, string2[i + index2]); - + return strAddress; } case 7: { // Cmp @@ -781,14 +781,14 @@ reg_t kString(EngineState *s, int argc, reg_t *argv) { return NULL_REG; case 15: { // upper Common::String string = s->_segMan->getString(argv[1]); - + string.toUppercase(); s->_segMan->strcpy(argv[1], string.c_str()); return NULL_REG; } case 16: { // lower Common::String string = s->_segMan->getString(argv[1]); - + string.toLowercase(); s->_segMan->strcpy(argv[1], string.c_str()); return NULL_REG; diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp index 9a60f39c85..6d810d516c 100644 --- a/engines/sci/engine/kvideo.cpp +++ b/engines/sci/engine/kvideo.cpp @@ -65,7 +65,7 @@ void playVideo(Video::VideoDecoder *videoDecoder, VideoState videoState) { scaleBuffer = new byte[width * height * bytesPerPixel]; } - uint16 x, y; + uint16 x, y; // Sanity check... if (videoState.x > 0 && videoState.y > 0 && isVMD) { @@ -94,7 +94,7 @@ void playVideo(Video::VideoDecoder *videoDecoder, VideoState videoState) { if (frame) { if (scaleBuffer) { - // TODO: Probably should do aspect ratio correction in e.g. GK1 Windows + // TODO: Probably should do aspect ratio correction in e.g. GK1 Windows g_sci->_gfxScreen->scale2x((byte *)frame->pixels, scaleBuffer, videoDecoder->getWidth(), videoDecoder->getHeight(), bytesPerPixel); g_system->copyRectToScreen(scaleBuffer, pitch, x, y, width, height); } else { @@ -130,7 +130,7 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) { uint16 screenWidth = g_system->getWidth(); uint16 screenHeight = g_system->getHeight(); - + Video::VideoDecoder *videoDecoder = 0; if (argv[0].segment != 0) { diff --git a/engines/sci/engine/object.cpp b/engines/sci/engine/object.cpp index f09f18298a..a1854a2723 100644 --- a/engines/sci/engine/object.cpp +++ b/engines/sci/engine/object.cpp @@ -259,13 +259,13 @@ void Object::initSelectorsSci3(const byte *buf) { // two selectors are always reserved (because their storage // space is used by the typeMask). // We don't know beforehand how many methods and properties - // there are, so we count them first. + // there are, so we count them first. for (int groupNr = 0; groupNr < groups; ++groupNr) { byte groupLocation = groupInfo[groupNr]; const byte *seeker = selectorBase + groupLocation * 32 * 2; if (groupLocation != 0) { - // This object actually has selectors belonging to this group + // This object actually has selectors belonging to this group int typeMask = READ_SCI11ENDIAN_UINT32(seeker); for (int bit = 2; bit < 32; ++bit) { @@ -277,7 +277,7 @@ void Object::initSelectorsSci3(const byte *buf) { } else { // Undefined selector } - + } } } @@ -296,7 +296,7 @@ void Object::initSelectorsSci3(const byte *buf) { const byte *seeker = selectorBase + groupLocation * 32 * 2; if (groupLocation != 0) { - // This object actually has selectors belonging to this group + // This object actually has selectors belonging to this group int typeMask = READ_SCI11ENDIAN_UINT32(seeker); int groupBaseId = groupNr * 32; @@ -323,7 +323,7 @@ void Object::initSelectorsSci3(const byte *buf) { } else { // Undefined selector } - + } } } diff --git a/engines/sci/engine/object.h b/engines/sci/engine/object.h index 80c8e9e83d..0ca16b48a2 100644 --- a/engines/sci/engine/object.h +++ b/engines/sci/engine/object.h @@ -79,7 +79,7 @@ public: } reg_t getSpeciesSelector() const { - if (getSciVersion() <= SCI_VERSION_2_1) + if (getSciVersion() <= SCI_VERSION_2_1) return _variables[_offset]; else // SCI3 return _speciesSelectorSci3; @@ -93,7 +93,7 @@ public: } reg_t getSuperClassSelector() const { - if (getSciVersion() <= SCI_VERSION_2_1) + if (getSciVersion() <= SCI_VERSION_2_1) return _variables[_offset + 1]; else // SCI3 return _superClassPosSci3; diff --git a/engines/sci/engine/savegame.h b/engines/sci/engine/savegame.h index fbd77eb076..1d899b0d37 100644 --- a/engines/sci/engine/savegame.h +++ b/engines/sci/engine/savegame.h @@ -51,7 +51,7 @@ struct EngineState; * 19 - exportsAreWide * 18 - SCI32 arrays/strings * 17 - sound - * + * */ enum { diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp index a38aa06bc4..01e1afe5ea 100644 --- a/engines/sci/engine/script.cpp +++ b/engines/sci/engine/script.cpp @@ -160,7 +160,7 @@ void Script::load(ResourceManager *resMan) { _numExports = 0; _synonyms = 0; _numSynonyms = 0; - + if (getSciVersion() <= SCI_VERSION_1_LATE) { _exportTable = (const uint16 *)findBlockSCI0(SCI_OBJ_EXPORTS); if (_exportTable) { diff --git a/engines/sci/engine/script_patches.cpp b/engines/sci/engine/script_patches.cpp index 2d3d8f6155..a714980a35 100644 --- a/engines/sci/engine/script_patches.cpp +++ b/engines/sci/engine/script_patches.cpp @@ -209,7 +209,7 @@ const byte ecoquest2SignatureEcorderTutorial[] = { const uint16 ecoquest2PatchEcorderTutorial[] = { 0x31, 0x23, // bnt [next state] (save 1 byte) - // The parameter count below should be 7, but we're out of bytes + // The parameter count below should be 7, but we're out of bytes // to patch! A workaround has been added because of this 0x78, // push1 (parameter count) //0x39, 0x07, // pushi 07 (parameter count) @@ -221,7 +221,7 @@ const uint16 ecoquest2PatchEcorderTutorial[] = { 0x78, // push1 (visual screen) 0x39, 0x17, // pushi 17 (color) 0x43, 0x6c, 0x0e, // call kGraph - // The parameter count below should be 5, but we're out of bytes + // The parameter count below should be 5, but we're out of bytes // to patch! A workaround has been added because of this 0x78, // push1 (parameter count) //0x39, 0x05, // pushi 05 (parameter count) @@ -697,7 +697,7 @@ const SciScriptSignature laurabow2Signatures[] = { // =========================================================================== // Mother Goose SCI1/SCI1.1 -// MG::replay somewhat calculates the savedgame-id used when saving again +// MG::replay somewhat calculates the savedgame-id used when saving again // this doesn't work right and we remove the code completely. // We set the savedgame-id directly right after restoring in kRestoreGame. const byte mothergoose256SignatureReplay[] = { @@ -1034,7 +1034,7 @@ const uint16 sq1vgaPatchEgoShowsCard[] = { // script, description, magic DWORD, adjust const SciScriptSignature sq1vgaSignatures[] = { - { 58, "Sarien armory droid zapping ego first time", 1, PATCH_MAGICDWORD( 0x72, 0x88, 0x15, 0x36 ), -70, + { 58, "Sarien armory droid zapping ego first time", 1, PATCH_MAGICDWORD( 0x72, 0x88, 0x15, 0x36 ), -70, sq1vgaSignatureEgoShowsCard, sq1vgaPatchEgoShowsCard }, SCI_SIGNATUREENTRY_TERMINATOR}; @@ -1087,7 +1087,7 @@ void Script::applyPatch(const uint16 *patch, byte *scriptData, const uint32 scri } patch++; patchWord = *patch; - } + } } // will return -1 if no match was found, otherwise an offset to the start of the signature match diff --git a/engines/sci/engine/scriptdebug.cpp b/engines/sci/engine/scriptdebug.cpp index 957930784b..3a18fbc68f 100644 --- a/engines/sci/engine/scriptdebug.cpp +++ b/engines/sci/engine/scriptdebug.cpp @@ -72,7 +72,7 @@ reg_t disassemble(EngineState *s, reg_t pos, bool printBWTag, bool printBytecode const byte *scr; int scr_size; reg_t retval = make_reg(pos.segment, pos.offset + 1); - uint16 param_value = 0xffff; // Suppress GCC warning by setting default value, chose value as invalid to getKernelName etc. + uint16 param_value = 0xffff; // Suppress GCC warning by setting default value, chose value as invalid to getKernelName etc. int i = 0; Kernel *kernel = g_sci->getKernel(); @@ -617,8 +617,8 @@ void debugSelectorCall(reg_t send_obj, Selector selector, int argc, StackPtr arg Console *con = g_sci->getSciDebugger(); #ifdef VM_DEBUG_SEND - debugN("Send to %04x:%04x (%s), selector %04x (%s):", PRINT_REG(send_obj), - s->_segMan->getObjectName(send_obj), selector, + debugN("Send to %04x:%04x (%s), selector %04x (%s):", PRINT_REG(send_obj), + s->_segMan->getObjectName(send_obj), selector, g_sci->getKernel()->getSelectorName(selector).c_str()); #endif // VM_DEBUG_SEND @@ -644,18 +644,18 @@ void debugSelectorCall(reg_t send_obj, Selector selector, int argc, StackPtr arg reg_t selectorValue = *varp.getPointer(segMan); if (!argc && (activeBreakpointTypes & BREAK_SELECTORREAD)) { if (g_sci->checkSelectorBreakpoint(BREAK_SELECTORREAD, send_obj, selector)) - con->DebugPrintf("Read from selector (%s:%s): %04x:%04x\n", + con->DebugPrintf("Read from selector (%s:%s): %04x:%04x\n", objectName, selectorName, PRINT_REG(selectorValue)); } else if (argc && (activeBreakpointTypes & BREAK_SELECTORWRITE)) { if (g_sci->checkSelectorBreakpoint(BREAK_SELECTORWRITE, send_obj, selector)) - con->DebugPrintf("Write to selector (%s:%s): change %04x:%04x to %04x:%04x\n", + con->DebugPrintf("Write to selector (%s:%s): change %04x:%04x to %04x:%04x\n", objectName, selectorName, PRINT_REG(selectorValue), PRINT_REG(argp[1])); } if (argc > 1) - debug(kDebugLevelScripts, "Write to selector (%s:%s): change %04x:%04x to %04x:%04x, argc == %d\n", + debug(kDebugLevelScripts, "Write to selector (%s:%s): change %04x:%04x to %04x:%04x, argc == %d\n", objectName, selectorName, PRINT_REG(selectorValue), PRINT_REG(argp[1]), argc); } diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 5d8a81a7f1..3f11d6ff49 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -255,7 +255,7 @@ SegmentRef ArrayTable::dereference(reg_t pointer) { return ret; } -void ArrayTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) { +void ArrayTable::freeAtAddress(SegManager *segMan, reg_t sub_addr) { _table[sub_addr.offset].destroy(); freeEntry(sub_addr.offset); } diff --git a/engines/sci/engine/selector.cpp b/engines/sci/engine/selector.cpp index 2edbea9676..c2f857f319 100644 --- a/engines/sci/engine/selector.cpp +++ b/engines/sci/engine/selector.cpp @@ -212,7 +212,7 @@ void writeSelector(SegManager *segMan, reg_t object, Selector selectorId, reg_t *address.getPointer(segMan) = value; } -void invokeSelector(EngineState *s, reg_t object, int selectorId, +void invokeSelector(EngineState *s, reg_t object, int selectorId, int k_argc, StackPtr k_argp, int argc, const reg_t *argv) { int i; int framesize = 2 + 1 * argc; diff --git a/engines/sci/engine/selector.h b/engines/sci/engine/selector.h index f13c13e00c..085dd6e832 100644 --- a/engines/sci/engine/selector.h +++ b/engines/sci/engine/selector.h @@ -185,7 +185,7 @@ void writeSelector(SegManager *segMan, reg_t object, Selector selectorId, reg_t /** * Invokes a selector from an object. */ -void invokeSelector(EngineState *s, reg_t object, int selectorId, +void invokeSelector(EngineState *s, reg_t object, int selectorId, int k_argc, StackPtr k_argp, int argc = 0, const reg_t *argv = 0); } // End of namespace Sci diff --git a/engines/sci/engine/state.cpp b/engines/sci/engine/state.cpp index 3328f80de1..4ea9f72054 100644 --- a/engines/sci/engine/state.cpp +++ b/engines/sci/engine/state.cpp @@ -144,7 +144,7 @@ void EngineState::wait(int16 ticks) { void EngineState::initGlobals() { Script *script_000 = _segMan->getScript(1); - + if (!script_000->_localsBlock) error("Script 0 has no locals block"); @@ -331,7 +331,7 @@ void SciEngine::checkVocabularySwitch() { uint16 parserLanguage = 1; if (SELECTOR(parseLang) != -1) parserLanguage = readSelectorValue(_gamestate->_segMan, _gameObjectAddress, SELECTOR(parseLang)); - + if (parserLanguage != _vocabularyLanguage) { delete _vocabulary; _vocabulary = new Vocabulary(_resMan, parserLanguage > 1 ? true : false); diff --git a/engines/sci/engine/static_selectors.cpp b/engines/sci/engine/static_selectors.cpp index 6526eff2db..cca4c47be8 100644 --- a/engines/sci/engine/static_selectors.cpp +++ b/engines/sci/engine/static_selectors.cpp @@ -96,7 +96,7 @@ static const char * const sci2Selectors[] = { "center", "all", "show", "textLeft", "textTop", // 115 - 119 "textRight", "textBottom", "borderColor", "titleFore", "titleBack", // 120 - 124 "titleFont", "dimmed", "frameOut", "lastKey", "magnifier", // 125 - 129 - "magPower", "mirrored", "pitch", "roll", "yaw", // 130 - 134 + "magPower", "mirrored", "pitch", "roll", "yaw", // 130 - 134 "left", "right", "top", "bottom", "numLines" // 135 - 139 }; #endif @@ -265,8 +265,8 @@ void Kernel::findSpecificSelectors(Common::StringArray &selectorNames) { if (targetClass) { if (classReferences[i].selectorType == kSelectorMethod) { if (targetClass->getMethodCount() < selectorOffset + 1) - error("The %s class has less than %d methods (%d)", - classReferences[i].className, selectorOffset + 1, + error("The %s class has less than %d methods (%d)", + classReferences[i].className, selectorOffset + 1, targetClass->getMethodCount()); targetSelectorPos = targetClass->getFuncSelector(selectorOffset); @@ -275,7 +275,7 @@ void Kernel::findSpecificSelectors(Common::StringArray &selectorNames) { selectorOffset += (getSciVersion() <= SCI_VERSION_1_LATE) ? 3 : 8; if (targetClass->getVarCount() < selectorOffset + 1) - error("The %s class has less than %d variables (%d)", + error("The %s class has less than %d variables (%d)", classReferences[i].className, selectorOffset + 1, targetClass->getVarCount()); diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp index 1517355365..db682de16f 100644 --- a/engines/sci/engine/vm.cpp +++ b/engines/sci/engine/vm.cpp @@ -42,7 +42,7 @@ const reg_t NULL_REG = {0, 0}; const reg_t SIGNAL_REG = {0, SIGNAL_OFFSET}; const reg_t TRUE_REG = {0, 1}; //#define VM_DEBUG_SEND -// Enable the define below to have the VM abort on cases where a conditional +// Enable the define below to have the VM abort on cases where a conditional // statement is followed by an unconditional jump (which will most likely lead // to an infinite loop). Aids in detecting script bugs such as #3040722. //#define ABORT_ON_INFINITE_LOOP @@ -130,14 +130,14 @@ static reg_t read_var(EngineState *s, int type, int index) { if (solution.type == WORKAROUND_NONE) { #ifdef RELEASE_BUILD // If we are running an official ScummVM release -> fake 0 in unknown cases - warning("Uninitialized read for temp %d from method %s::%s (room %d, script %d, localCall %x)", + warning("Uninitialized read for temp %d from method %s::%s (room %d, script %d, localCall %x)", index, originReply.objectName.c_str(), originReply.methodName.c_str(), s->currentRoomNumber(), originReply.scriptNr, originReply.localCallOffset); s->variables[type][index] = NULL_REG; break; #else - error("Uninitialized read for temp %d from method %s::%s (room %d, script %d, localCall %x)", + error("Uninitialized read for temp %d from method %s::%s (room %d, script %d, localCall %x)", index, originReply.objectName.c_str(), originReply.methodName.c_str(), s->currentRoomNumber(), originReply.scriptNr, originReply.localCallOffset); #endif @@ -366,8 +366,8 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { switch (solution.type) { case WORKAROUND_NONE: kernel->signatureDebug(kernelCall.signature, argc, argv); - error("[VM] k%s[%x]: signature mismatch via method %s::%s (room %d, script %d, localCall 0x%x)", - kernelCall.name, kernelCallNr, originReply.objectName.c_str(), originReply.methodName.c_str(), + error("[VM] k%s[%x]: signature mismatch via method %s::%s (room %d, script %d, localCall 0x%x)", + kernelCall.name, kernelCallNr, originReply.objectName.c_str(), originReply.methodName.c_str(), s->currentRoomNumber(), originReply.scriptNr, originReply.localCallOffset); break; case WORKAROUND_IGNORE: // don't do kernel call, leave acc alone @@ -418,12 +418,12 @@ static void callKernelFunc(EngineState *s, int kernelCallNr, int argc) { int callNameLen = strlen(kernelCall.name); if (strncmp(kernelCall.name, kernelSubCall.name, callNameLen) == 0) { const char *subCallName = kernelSubCall.name + callNameLen; - error("[VM] k%s(%s): signature mismatch via method %s::%s (room %d, script %d, localCall %x)", - kernelCall.name, subCallName, originReply.objectName.c_str(), originReply.methodName.c_str(), + error("[VM] k%s(%s): signature mismatch via method %s::%s (room %d, script %d, localCall %x)", + kernelCall.name, subCallName, originReply.objectName.c_str(), originReply.methodName.c_str(), s->currentRoomNumber(), originReply.scriptNr, originReply.localCallOffset); } - error("[VM] k%s: signature mismatch via method %s::%s (room %d, script %d, localCall %x)", - kernelSubCall.name, originReply.objectName.c_str(), originReply.methodName.c_str(), + error("[VM] k%s: signature mismatch via method %s::%s (room %d, script %d, localCall %x)", + kernelSubCall.name, originReply.objectName.c_str(), originReply.methodName.c_str(), s->currentRoomNumber(), originReply.scriptNr, originReply.localCallOffset); break; } @@ -828,10 +828,10 @@ void run_vm(EngineState *s) { uint16 localCallOffset = s->xs->addr.pc.offset + opparams[0]; - ExecStack xstack(s->xs->objp, s->xs->objp, s->xs->sp, + ExecStack xstack(s->xs->objp, s->xs->objp, s->xs->sp, (call_base->requireUint16()) + s->r_rest, call_base, s->xs->local_segment, make_reg(s->xs->addr.pc.segment, localCallOffset), - NULL_SELECTOR, -1, localCallOffset, s->_executionStack.size() - 1, + NULL_SELECTOR, -1, localCallOffset, s->_executionStack.size() - 1, EXEC_STACK_TYPE_CALL); s->_executionStack.push_back(xstack); diff --git a/engines/sci/engine/vm_types.cpp b/engines/sci/engine/vm_types.cpp index e39c7708ad..b95fd58129 100644 --- a/engines/sci/engine/vm_types.cpp +++ b/engines/sci/engine/vm_types.cpp @@ -32,8 +32,8 @@ reg_t reg_t::lookForWorkaround(const reg_t right) const { SciTrackOriginReply originReply; SciWorkaroundSolution solution = trackOriginAndFindWorkaround(0, arithmeticWorkarounds, &originReply); if (solution.type == WORKAROUND_NONE) - error("Invalid arithmetic operation (params: %04x:%04x and %04x:%04x) from method %s::%s (room %d, script %d, localCall %x)", - PRINT_REG(*this), PRINT_REG(right), originReply.objectName.c_str(), + error("Invalid arithmetic operation (params: %04x:%04x and %04x:%04x) from method %s::%s (room %d, script %d, localCall %x)", + PRINT_REG(*this), PRINT_REG(right), originReply.objectName.c_str(), originReply.methodName.c_str(), g_sci->getEngineState()->currentRoomNumber(), originReply.scriptNr, originReply.localCallOffset); assert(solution.type == WORKAROUND_FAKE); @@ -56,7 +56,7 @@ reg_t reg_t::operator+(const reg_t right) const { return make_reg(segment, offset + right.toSint16()); default: return lookForWorkaround(right); - } + } } else if (isNumber() && right.isPointer()) { // Adding a pointer to a number, flip the order return right + *this; @@ -94,9 +94,9 @@ reg_t reg_t::operator/(const reg_t right) const { reg_t reg_t::operator%(const reg_t right) const { if (isNumber() && right.isNumber() && !right.isNull()) { - // Support for negative numbers was added in Iceman, and perhaps in + // Support for negative numbers was added in Iceman, and perhaps in // SCI0 0.000.685 and later. Theoretically, this wasn't really used - // in SCI0, so the result is probably unpredictable. Such a case + // in SCI0, so the result is probably unpredictable. Such a case // would indicate either a script bug, or a modulo on an unsigned // integer larger than 32767. In any case, such a case should be // investigated, instead of being silently accepted. @@ -178,7 +178,7 @@ int reg_t::cmp(const reg_t right, bool treatAsUnsigned) const { if (treatAsUnsigned || !isNumber()) return toUint16() - right.toUint16(); else - return toSint16() - right.toSint16(); + return toSint16() - right.toSint16(); } else if (pointerComparisonWithInteger(right)) { return 1; } else if (right.pointerComparisonWithInteger(*this)) { diff --git a/engines/sci/engine/workarounds.cpp b/engines/sci/engine/workarounds.cpp index 464b4d8d5b..768ba28518 100644 --- a/engines/sci/engine/workarounds.cpp +++ b/engines/sci/engine/workarounds.cpp @@ -447,7 +447,7 @@ SciWorkaroundSolution trackOriginAndFindWorkaround(int index, const SciWorkaroun do { workaround = workaroundList; while (workaround->methodName) { - bool objectNameMatches = (workaround->objectName == NULL) || + bool objectNameMatches = (workaround->objectName == NULL) || (workaround->objectName == g_sci->getSciLanguageString(searchObjectName, K_LANG_ENGLISH)); // Special case: in the fanmade Russian translation of SQ4, all diff --git a/engines/sci/event.cpp b/engines/sci/event.cpp index 74879f6c63..c14cfada07 100644 --- a/engines/sci/event.cpp +++ b/engines/sci/event.cpp @@ -261,7 +261,7 @@ SciEvent EventManager::getScummVMEvent() { else if ((modifiers & Common::KBD_CTRL) && input.character > 0 && input.character < 27) input.character += 96; // 0x01 -> 'a' } - + // If no actual key was pressed (e.g. if only a modifier key was pressed), // ignore the event if (!input.character) @@ -277,7 +277,7 @@ void EventManager::updateScreen() { if (g_system->getMillis() - s->_screenUpdateTime >= 1000 / 60) { g_system->updateScreen(); s->_screenUpdateTime = g_system->getMillis(); - // Throttle the checking of shouldQuit() to 60fps as well, since + // Throttle the checking of shouldQuit() to 60fps as well, since // Engine::shouldQuit() invokes 2 virtual functions // (EventManager::shouldQuit() and EventManager::shouldRTL()), // which is very expensive to invoke constantly without any diff --git a/engines/sci/graphics/animate.cpp b/engines/sci/graphics/animate.cpp index c36ecd112a..18f8511953 100644 --- a/engines/sci/graphics/animate.cpp +++ b/engines/sci/graphics/animate.cpp @@ -201,7 +201,7 @@ void GfxAnimate::fill(byte &old_picNotValid) { adjustInvalidCels(view, it); processViewScaling(view, it); setNsRect(view, it); - + //warning("%s view %d, loop %d, cel %d, signal %x", _s->_segMan->getObjectName(curObject), it->viewId, it->loopNo, it->celNo, it->signal); // Calculate current priority according to y-coordinate @@ -659,7 +659,7 @@ void GfxAnimate::throttleSpeed() { // No entries drawn -> no speed throttler triggering break; case 1: { - + // One entry drawn -> check if that entry was a speed benchmark view, if not enable speed throttler AnimateEntry *onlyCast = &_lastCastData[0]; if ((onlyCast->viewId == 0) && (onlyCast->loopNo == 13) && (onlyCast->celNo == 0)) { diff --git a/engines/sci/graphics/compare.h b/engines/sci/graphics/compare.h index 83b4f49c08..bacb6e71e2 100644 --- a/engines/sci/graphics/compare.h +++ b/engines/sci/graphics/compare.h @@ -51,7 +51,7 @@ private: GfxCoordAdjuster *_coordAdjuster; uint16 isOnControl(uint16 screenMask, const Common::Rect &rect); - + /** * This function checks whether any of the objects in the given list, * *different* from checkObject, has a brRect which is contained inside diff --git a/engines/sci/graphics/coordadjuster.h b/engines/sci/graphics/coordadjuster.h index 1b8a3e2679..23cf79d209 100644 --- a/engines/sci/graphics/coordadjuster.h +++ b/engines/sci/graphics/coordadjuster.h @@ -68,7 +68,7 @@ public: void moveCursor(Common::Point &pos); Common::Rect pictureGetDisplayArea(); - + private: GfxPorts *_ports; @@ -90,7 +90,7 @@ public: void pictureSetDisplayArea(Common::Rect displayArea); Common::Rect pictureGetDisplayArea(); - + private: SegManager *_segMan; diff --git a/engines/sci/graphics/menu.cpp b/engines/sci/graphics/menu.cpp index 913f680e99..673729784f 100644 --- a/engines/sci/graphics/menu.cpp +++ b/engines/sci/graphics/menu.cpp @@ -423,8 +423,8 @@ reg_t GfxMenu::kernelSelect(reg_t eventObject, bool pauseSound) { default: while (itemIterator != itemEnd) { itemEntry = *itemIterator; - if (itemEntry->keyPress == keyPress && - itemEntry->keyModifier == keyModifier && + if (itemEntry->keyPress == keyPress && + itemEntry->keyModifier == keyModifier && itemEntry->enabled) break; itemIterator++; diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp index 899ef10b33..c5a3545701 100644 --- a/engines/sci/graphics/palette.cpp +++ b/engines/sci/graphics/palette.cpp @@ -71,7 +71,7 @@ GfxPalette::GfxPalette(ResourceManager *resMan, GfxScreen *screen, bool useMergi _macClut = 0; loadMacIconBarPalette(); - + #ifdef ENABLE_SCI32 _clutTable = 0; #endif @@ -236,7 +236,7 @@ static byte blendColors(byte c1, byte c2) { // return (c1/2+c2/2)+((c1&1)+(c2&1))/2; // gamma 2.2 - double t = (pow(c1/255.0, 2.2/1.0) * 255.0) + + double t = (pow(c1/255.0, 2.2/1.0) * 255.0) + (pow(c2/255.0, 2.2/1.0) * 255.0); return (byte)(0.5 + (pow(0.5*t/255.0, 1.0/2.2) * 255.0)); } @@ -378,7 +378,7 @@ bool GfxPalette::merge(Palette *newPalette, bool force, bool forceRealMerge) { break; } } - + // if still no luck - set an approximate color if (j == 256) { newPalette->mapping[i] = res & 0xFF; @@ -991,7 +991,7 @@ void GfxPalette::unloadClut() { delete[] _clutTable; _clutTable = 0; } - + #endif } // End of namespace Sci diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h index 9b0c45baf6..243420cc47 100644 --- a/engines/sci/graphics/palette.h +++ b/engines/sci/graphics/palette.h @@ -125,7 +125,7 @@ private: void loadMacIconBarPalette(); byte *_macClut; - + #ifdef ENABLE_SCI32 byte *_clutTable; #endif diff --git a/engines/sci/graphics/picture.cpp b/engines/sci/graphics/picture.cpp index ce69ba8922..ecb54e89e8 100644 --- a/engines/sci/graphics/picture.cpp +++ b/engines/sci/graphics/picture.cpp @@ -357,7 +357,7 @@ void GfxPicture::drawCelData(byte *inbuffer, int size, int headerPos, int rlePos curByte = *ptr++; if ((curByte != clearColor) && (priority >= _screen->getPriority(x, y))) _screen->putPixel(x, y, drawMask, curByte, priority, 0); - + if (x == leftX) { ptr += sourcePixelSkipPerRow; x = rightX; @@ -515,7 +515,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) { icemanDrawFix = true; } if (g_sci->getGameId() == GID_KQ5) { - // WORKAROUND: ignore the seemingly broken priority of picture 48 + // WORKAROUND: ignore the seemingly broken priority of picture 48 // (island overview). Fixes bug #3041044. if (_resourceId == 48) ignoreBrokenPriority = true; @@ -551,7 +551,7 @@ void GfxPicture::drawVectorData(byte *data, int dataSize) { case PIC_OP_SET_PRIORITY: pic_priority = data[curPos++] & 0x0F; - if (isEGA) + if (isEGA) pic_priority = EGApriority[pic_priority]; if (ignoreBrokenPriority) pic_priority = 255; diff --git a/engines/sci/graphics/ports.cpp b/engines/sci/graphics/ports.cpp index 9412976d5b..6b4c8180bf 100644 --- a/engines/sci/graphics/ports.cpp +++ b/engines/sci/graphics/ports.cpp @@ -721,7 +721,7 @@ void GfxPorts::printWindowList(Console *con) { if ((*it)->isWindow()) { Window *wnd = ((Window *)*it); con->DebugPrintf("%d: '%s' at %d, %d, (%d, %d, %d, %d), drawn: %d, style: %d\n", - wnd->id, wnd->title.c_str(), wnd->left, wnd->top, + wnd->id, wnd->title.c_str(), wnd->left, wnd->top, wnd->rect.left, wnd->rect.top, wnd->rect.right, wnd->rect.bottom, wnd->bDrawn, wnd->wndStyle); } diff --git a/engines/sci/graphics/view.cpp b/engines/sci/graphics/view.cpp index afb4c184e8..6ca4903e17 100644 --- a/engines/sci/graphics/view.cpp +++ b/engines/sci/graphics/view.cpp @@ -202,7 +202,7 @@ void GfxView::initData(GuiResourceId resourceId) { palOffset = READ_SCI11ENDIAN_UINT32(_resourceData + 8); // For SCI32, this is a scale flag - if (getSciVersion() >= SCI_VERSION_2) { + if (getSciVersion() >= SCI_VERSION_2) { _sci2ScaleRes = (Sci32ViewNativeResolution)_resourceData[5]; if (_screen->getUpscaledHires() == GFX_SCREEN_UPSCALED_DISABLED) _sci2ScaleRes = SCI_VIEW_NATIVERES_NONE; @@ -426,7 +426,7 @@ void unpackCelData(byte *inBuffer, byte *celBitmap, byte clearColor, int pixelCo // compression for SCI1.1+ Mac while (pixelNr < pixelCount) { uint32 pixelLine = pixelNr; - + if (hasByteLengths) { pixelNr += *rlePtr++; runLength = *rlePtr++; @@ -500,7 +500,7 @@ void unpackCelData(byte *inBuffer, byte *celBitmap, byte clearColor, int pixelCo } else { memcpy(outPtr + pixelNr, literalPtr, MIN<uint16>(runLength, pixelCount - pixelNr)); literalPtr += runLength; - } + } break; case 0x80: // fill with color if (!literalPos) diff --git a/engines/sci/parser/said.cpp b/engines/sci/parser/said.cpp index 827e28073a..01c25ef401 100644 --- a/engines/sci/parser/said.cpp +++ b/engines/sci/parser/said.cpp @@ -224,7 +224,7 @@ static bool parsePart2(ParseTreeNode* parentNode, bool& nonempty) } else if (said_tokens[said_token] == TOKEN_BRACKETO) { said_token++; - + found = parsePart2(newNode, nonempty); if (found) { @@ -282,7 +282,7 @@ static bool parsePart3(ParseTreeNode* parentNode, bool& nonempty) } else if (said_tokens[said_token] == TOKEN_BRACKETO) { said_token++; - + found = parsePart3(newNode, nonempty); if (found) { @@ -366,7 +366,7 @@ static bool parseRef(ParseTreeNode* parentNode) said_attach_subtree(newParent, 0x144, 0x14f, newNode); newParent = newParent->right; - + newNode = said_branch_node(said_next_node(), 0, 0); found = parseRef(newNode); @@ -381,14 +381,14 @@ static bool parseRef(ParseTreeNode* parentNode) } - } + } // NB: This is not an "else if'. // If there is a "< [ ... ]", that is parsed as "< ..." if (said_tokens[said_token] == TOKEN_BRACKETO) { said_token++; - + found = parseRef(newNode); if (found) { diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index 308bd92ef4..fa70481bdc 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -128,7 +128,7 @@ static const char *s_resourceTypeSuffixes[] = { "trn", "rbt", "vmd", "chk", "", "etc", "duk", "clu", "tga", "zzz", "", "", "" -}; +}; const char *getResourceTypeName(ResourceType restype) { if (restype != kResourceTypeInvalid) @@ -449,11 +449,11 @@ bool MacResourceForkResourceSource::isCompressableResource(ResourceType type) co *ptr++ = value; \ } -void MacResourceForkResourceSource::decompressResource(Common::SeekableReadStream *stream, Resource *resource) const { +void MacResourceForkResourceSource::decompressResource(Common::SeekableReadStream *stream, Resource *resource) const { // KQ6 Mac is the only game not compressed. It's not worth writing a // heuristic just for that game. Also, skip over any resource that cannot // be compressed. - bool canBeCompressed = !(g_sci && g_sci->getGameId() == GID_KQ6) && isCompressableResource(resource->_id.getType()); + bool canBeCompressed = !(g_sci && g_sci->getGameId() == GID_KQ6) && isCompressableResource(resource->_id.getType()); uint32 uncompressedSize = 0; // GK2 Mac is crazy. In its Patches resource fork, picture 2315 is not @@ -503,7 +503,7 @@ void MacResourceForkResourceSource::decompressResource(Common::SeekableReadStrea // Copy chunk expanded extraByte1 = stream->readByte(); extraByte2 = stream->readByte(); - + literalLength = extraByte2 & 3; OUTPUT_LITERAL() @@ -824,7 +824,7 @@ void ChunkResourceSource::scanSource(ResourceManager *resMan) { byte *ptr = chunk->data; uint32 firstOffset = 0; - + for (;;) { ResourceType type = resMan->convertResType(*ptr); uint16 number = READ_LE_UINT16(ptr + 1); @@ -844,7 +844,7 @@ void ChunkResourceSource::scanSource(ResourceManager *resMan) { // There's no end marker to the data table, but the first resource // begins directly after the entry table. So, when we hit the first // resource, we're at the end of the entry table. - + if (!firstOffset) firstOffset = entry.offset; @@ -1243,7 +1243,7 @@ ResVersion ResourceManager::detectVolVersion() { for (Common::List<ResourceSource *>::iterator it = _sources.begin(); it != _sources.end(); ++it) { rsrc = *it; - + if (rsrc->getSourceType() == kSourceVolume) { if (rsrc->_resourceFile) { fileStream = rsrc->_resourceFile->createReadStream(); @@ -1291,7 +1291,7 @@ ResVersion ResourceManager::detectVolVersion() { // loading SCI3 volumes, the format is otherwise // identical to SCI2. We therefore get the compression // indicator here, but disregard it in the following - // code. + // code. wCompression = fileStream->readUint16LE(); if (fileStream->eos()) { @@ -1473,7 +1473,7 @@ void ResourceManager::readResourcePatchesBase36() { name = (*x)->getName(); ResourceId resource36 = convertPatchNameBase36((ResourceType)i, name); - + /* if (i == kResourceTypeAudio36) debug("audio36 patch: %s => %s. tuple:%d, %s\n", name.c_str(), inputName.c_str(), resource36.tuple, resource36.toString().c_str()); @@ -1494,7 +1494,7 @@ void ResourceManager::readResourcePatchesBase36() { // Check for SOL as well tag = (tag << 16) | stream->readUint16BE(); - + if (tag != MKTAG('S','O','L',0)) { delete stream; continue; @@ -1613,7 +1613,7 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { warning("Error while reading %s", map->getLocationName().c_str()); return SCI_ERROR_RESMAP_NOT_FOUND; } - + if (offset == 0xFFFFFFFF) break; @@ -2129,7 +2129,7 @@ void ResourceManager::detectSciVersion() { bool oldDecompressors = true; ResourceCompression viewCompression; -#ifdef ENABLE_SCI32 +#ifdef ENABLE_SCI32 viewCompression = getViewCompression(); #else if (_volVersion >= kResVersionSci2) { @@ -2173,7 +2173,7 @@ void ResourceManager::detectSciVersion() { } #endif } - + if (_volVersion == kResVersionSci11Mac) { // SCI32 doesn't have the resource.cfg file, so we can figure out // which of the games are SCI1.1. Note that there are no Mac SCI2 games. diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 588ea76ea5..032040fc2c 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -356,14 +356,14 @@ int ResourceManager::readAudioMapSCI11(ResourceSource *map) { stream->seek(offset + 1); byte headerSize = stream->readByte(); assert(headerSize == 11 || headerSize == 12); - + stream->skip(5); uint32 size = stream->readUint32LE() + headerSize + 2; addResource(ResourceId(kResourceTypeAudio, n), src, offset, size); } } else { - bool isEarly = (entrySize != 11); + bool isEarly = (entrySize != 11); if (!isEarly) { offset = READ_LE_UINT32(ptr); diff --git a/engines/sci/sci.cpp b/engines/sci/sci.cpp index cc9042ceb7..de1aafb8e2 100644 --- a/engines/sci/sci.cpp +++ b/engines/sci/sci.cpp @@ -282,7 +282,7 @@ Common::Error SciEngine::run() { // without this games would be pretty badly broken } - // Show any special warnings for buggy scripts with severe game bugs, + // Show any special warnings for buggy scripts with severe game bugs, // which have been patched by Sierra if (getGameId() == GID_LONGBOW) { // Longbow 1.0 has a buggy script which prevents the game @@ -868,7 +868,7 @@ void SciEngine::syncIngameAudioOptions() { _gamestate->variables[VAR_GLOBAL][90] = make_reg(0, 2); // speech } else if (subtitlesOn && speechOn) { // Is it a game that supports simultaneous speech and subtitles? - if (getGameId() == GID_SQ4 + if (getGameId() == GID_SQ4 || getGameId() == GID_FREDDYPHARKAS // TODO: The following need script patches for simultaneous speech and subtitles //|| getGameId() == GID_KQ6 @@ -907,7 +907,7 @@ void SciEngine::loadMacExecutable() { // KQ6/Freddy require the executable to load their icon bar palettes if (hasMacIconBar()) error("Could not load Mac resource fork '%s'", filename.c_str()); - + // TODO: Show some sort of warning dialog saying they can't get any // high-res Mac fonts, when we get to that point ;) } diff --git a/engines/sci/sci.h b/engines/sci/sci.h index 04ccbd97d2..b419d862a4 100644 --- a/engines/sci/sci.h +++ b/engines/sci/sci.h @@ -38,7 +38,7 @@ struct ADGameDescription; * Status of this engine: ??? * * Games using this engine: - * - Newer Sierra adventure games (based on FreeSCI) + * - Newer Sierra adventure games (based on FreeSCI) * * @todo give a concrete list of supported games. Could also * list future games, with status for each. @@ -176,7 +176,7 @@ enum SciGameId { GID_FANMADE // FIXME: Do we really need/want this? }; -/** +/** * SCI versions * For more information, check here: * http://wiki.scummvm.org/index.php/Sierra_Game_Versions#SCI_Games diff --git a/engines/sci/sound/audio.cpp b/engines/sci/sound/audio.cpp index 592caa5814..123dd21894 100644 --- a/engines/sci/sound/audio.cpp +++ b/engines/sci/sound/audio.cpp @@ -285,7 +285,7 @@ Audio::RewindableAudioStream *AudioPlayer::getAudioStream(uint32 number, uint32 // instead. memcpy(compressedData, audioRes->data, audioRes->size); Common::SeekableReadStream *compressedStream = new Common::MemoryReadStream(compressedData, audioRes->size, DisposeAfterUse::YES); - + switch (audioCompressionType) { case MKTAG('M','P','3',' '): #ifdef USE_MAD diff --git a/engines/sci/sound/drivers/amigamac.cpp b/engines/sci/sound/drivers/amigamac.cpp index 1436ca45a7..3c750401b9 100644 --- a/engines/sci/sound/drivers/amigamac.cpp +++ b/engines/sci/sound/drivers/amigamac.cpp @@ -178,7 +178,7 @@ int MidiDriver_AmigaMac::interpolate(int8 *samples, frac_t offset, bool isUnsign int diff = (s2 - s1) << 8; return (s1 << 8) + fracToInt(diff * (offset & FRAC_LO_MASK)); } - + int diff = (samples[x + 1] - samples[x]) << 8; return (samples[x] << 8) + fracToInt(diff * (offset & FRAC_LO_MASK)); } @@ -373,7 +373,7 @@ void MidiDriver_AmigaMac::setOutputFrac(int voice) { fnote -= instrument->baseNote; fnote *= 4; // FIXME: check how SSCI maps this - fnote += (_channels[_voices[voice].hw_channel].pitch - 0x2000) / 169; + fnote += (_channels[_voices[voice].hw_channel].pitch - 0x2000) / 169; while (fnote < 0) { divFact *= 2; @@ -617,7 +617,7 @@ int MidiDriver_AmigaMac::open() { } else if (!loadInstrumentsSCI0Mac(stream)) return Common::kUnknownError; } - + MidiDriver_Emulated::open(); _mixer->playStream(Audio::Mixer::kPlainSoundType, &_mixerSoundHandle, this, -1, _mixer->kMaxChannelVolume, 0, DisposeAfterUse::NO); diff --git a/engines/sci/sound/music.cpp b/engines/sci/sound/music.cpp index 96cbf135ed..2afab3858d 100644 --- a/engines/sci/sound/music.cpp +++ b/engines/sci/sound/music.cpp @@ -291,8 +291,8 @@ void SciMusic::soundInitSnd(MusicEntry *pSnd) { if (_soundVersion >= SCI_VERSION_1_EARLY && g_sci->getPlatform() == Common::kPlatformAmiga) flags = 0; int endPart = track->digitalSampleEnd > 0 ? (track->digitalSampleSize - track->digitalSampleEnd) : 0; - pSnd->pStreamAud = Audio::makeRawStream(channelData + track->digitalSampleStart, - track->digitalSampleSize - track->digitalSampleStart - endPart, + pSnd->pStreamAud = Audio::makeRawStream(channelData + track->digitalSampleStart, + track->digitalSampleSize - track->digitalSampleStart - endPart, track->digitalSampleRate, flags, DisposeAfterUse::NO); delete pSnd->pLoopStream; pSnd->pLoopStream = 0; diff --git a/engines/sci/video/robot_decoder.cpp b/engines/sci/video/robot_decoder.cpp index d394fd0b2b..77f45e0788 100644 --- a/engines/sci/video/robot_decoder.cpp +++ b/engines/sci/video/robot_decoder.cpp @@ -53,14 +53,14 @@ namespace Sci { // Taken from http://anthonylarme.tripod.com/phantas/phintgtp.html // // (...) What we needed was a way of playing video, but have it blend into -// normal room art instead of occupying its own rectangular area. Room art -// consists of a background pic overlaid with various animating cels -// (traditional lingo: sprites). The cels each have a priority that determines -// who is on top and who is behind in the drawing order. Cels are read from -// *.v56 files (another proprietary format). A Robot is video frames with -// transparent background including priority and x,y information. Thus, it is +// normal room art instead of occupying its own rectangular area. Room art +// consists of a background pic overlaid with various animating cels +// (traditional lingo: sprites). The cels each have a priority that determines +// who is on top and who is behind in the drawing order. Cels are read from +// *.v56 files (another proprietary format). A Robot is video frames with +// transparent background including priority and x,y information. Thus, it is // like a cel, except it comes from an RBT - not a v56. Because it blends into -// our graphics engine, it looks just like a part of the room. A RBT can move +// our graphics engine, it looks just like a part of the room. A RBT can move // around the screen and go behind other objects. (...) #ifdef ENABLE_SCI32 @@ -105,7 +105,7 @@ bool RobotDecoder::loadStream(Common::SeekableReadStream *stream) { _surface = new Graphics::Surface(); readHeaderChunk(); - + // There are several versions of robot files, ranging from 3 to 6. // v3: no known examples // v4: PQ:SWAT demo @@ -223,7 +223,7 @@ void RobotDecoder::calculateVideoDimensions() { // This is an O(n) operation, as each frame has a different size. // We need to know the actual frame size to have a constant video size. uint32 pos = _fileStream->pos(); - + for (uint32 curFrame = 0; curFrame < _header.frameCount; curFrame++) { _fileStream->skip(4); uint16 frameWidth = _fileStream->readUint16(); @@ -327,8 +327,8 @@ const Graphics::Surface *RobotDecoder::decodeNextFrame() { // FIXME: For some reason, there are audio hiccups/gaps if (_header.hasSound) { _fileStream->skip(8); // header - _audioStream->queueBuffer(g_sci->_audio->getDecodedRobotAudioFrame(_fileStream, audioChunkSize - 8), - (audioChunkSize - 8) * 2, DisposeAfterUse::NO, + _audioStream->queueBuffer(g_sci->_audio->getDecodedRobotAudioFrame(_fileStream, audioChunkSize - 8), + (audioChunkSize - 8) * 2, DisposeAfterUse::NO, Audio::FLAG_16BITS | Audio::FLAG_LITTLE_ENDIAN); } else { _fileStream->skip(audioChunkSize); @@ -359,7 +359,7 @@ void RobotDecoder::close() { } reset(); -} +} #endif diff --git a/engines/sci/video/seq_decoder.h b/engines/sci/video/seq_decoder.h index f5e8ad9b05..800a3c9024 100644 --- a/engines/sci/video/seq_decoder.h +++ b/engines/sci/video/seq_decoder.h @@ -58,7 +58,7 @@ public: Graphics::PixelFormat getPixelFormat() const { return Graphics::PixelFormat::createFormatCLUT8(); } const byte *getPalette() { _dirtyPalette = false; return _palette; } bool hasDirtyPalette() const { return _dirtyPalette; } - + protected: Common::Rational getFrameRate() const { assert(_frameDelay); return Common::Rational(60, _frameDelay); } diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp index e4057d1f13..20b929dfd4 100644 --- a/engines/scumm/actor.cpp +++ b/engines/scumm/actor.cpp @@ -1066,7 +1066,7 @@ static int checkXYInBoxBounds(int boxnum, int x, int y, int &destX, int &destY) int dist; // MM C64: This fixes the trunk bug (#3070065), as well - // as the fruit bowl, however im not sure if its + // as the fruit bowl, however im not sure if its // the proper solution or not. if( g_scumm->_game.version == 0 ) yDist = ABS(y - destY); diff --git a/engines/scumm/charset.cpp b/engines/scumm/charset.cpp index dce6c9c144..7fb834ce98 100644 --- a/engines/scumm/charset.cpp +++ b/engines/scumm/charset.cpp @@ -50,6 +50,7 @@ void ScummEngine::loadCJKFont() { if (_game.version <= 5 && _game.platform == Common::kPlatformFMTowns && _language == Common::JA_JPN) { // FM-TOWNS v3 / v5 Kanji #ifdef DISABLE_TOWNS_DUAL_LAYER_MODE + GUIErrorMessage("FM-Towns Kanji font drawing requires dual graphics layer support which is disabled in this build"); error("FM-Towns Kanji font drawing requires dual graphics layer support which is disabled in this build"); #else // use FM-TOWNS font rom, since game files don't have kanji font resources @@ -788,8 +789,10 @@ void CharsetRendererV3::printChar(int chr, bool ignoreCharsetMask) { else if (_vm->_cjkFont) _vm->_cjkFont->drawChar(_vm->_textSurface, chr, _left * _vm->_textSurfaceMultiplier, _top * _vm->_textSurfaceMultiplier, _color, _shadowColor); #endif - if (is2byte) + if (is2byte) { origWidth /= _vm->_textSurfaceMultiplier; + height /= _vm->_textSurfaceMultiplier; + } } if (_str.left > _left) @@ -803,8 +806,8 @@ void CharsetRendererV3::printChar(int chr, bool ignoreCharsetMask) { _str.right++; } - if (_str.bottom < _top + height / _vm->_textSurfaceMultiplier) - _str.bottom = _top + height / _vm->_textSurfaceMultiplier; + if (_str.bottom < _top + height) + _str.bottom = _top + height; } void CharsetRendererV3::drawChar(int chr, Graphics::Surface &s, int x, int y) { @@ -1067,7 +1070,7 @@ void CharsetRendererClassic::printCharIntern(bool is2byte, const byte *charPtr, Graphics::Surface backSurface; if ((ignoreCharsetMask || !vs->hasTwoBuffers) #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE - && (_vm->_game.platform != Common::kPlatformFMTowns) + && (_vm->_game.platform != Common::kPlatformFMTowns) #endif ) { dstSurface = *vs; diff --git a/engines/scumm/costume.cpp b/engines/scumm/costume.cpp index 75cde5e33a..4ca4988605 100644 --- a/engines/scumm/costume.cpp +++ b/engines/scumm/costume.cpp @@ -73,10 +73,10 @@ static const int v1MMNESLookup[25] = { }; static const byte v0ActorTalkArray[0x19] = { - 0x00, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x00, 0x46, 0x06, - 0x06, 0x06, 0x06, 0xFF, 0xFF, - 0x06, 0xC0, 0x06, 0x06, 0x00, + 0x00, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x46, 0x06, + 0x06, 0x06, 0x06, 0xFF, 0xFF, + 0x06, 0xC0, 0x06, 0x06, 0x00, 0xC0, 0xC0, 0x00, 0x06, 0x06 }; @@ -1417,7 +1417,7 @@ byte C64CostumeLoader::increaseAnims(Actor *a) { if (A->_moving && _vm->_currentRoom != 1 && _vm->_currentRoom != 44) { if (a->_cost.soundPos == 0) a->_cost.soundCounter++; - + // Is this the correct location? // 0x073C if (v0ActorTalkArray[a->_number] & 0x3F) diff --git a/engines/scumm/cursor.cpp b/engines/scumm/cursor.cpp index 8676c857ea..a8adb4d5c5 100644 --- a/engines/scumm/cursor.cpp +++ b/engines/scumm/cursor.cpp @@ -114,21 +114,17 @@ void ScummEngine_v6::setCursorTransparency(int a) { void ScummEngine::updateCursor() { int transColor = (_game.heversion >= 80) ? 5 : 255; #ifdef USE_RGB_COLOR - if (_bytesPerPixelOutput == 2) { - Graphics::PixelFormat format = _system->getScreenFormat(); - CursorMan.replaceCursor(_grabbedCursor, _cursor.width, _cursor.height, - _cursor.hotspotX, _cursor.hotspotY, - (_game.platform == Common::kPlatformNES ? _grabbedCursor[63] : transColor), - (_game.heversion == 70 ? 2 : 1), - &format); - } else { -#endif + Graphics::PixelFormat format = _system->getScreenFormat(); + CursorMan.replaceCursor(_grabbedCursor, _cursor.width, _cursor.height, + _cursor.hotspotX, _cursor.hotspotY, + (_game.platform == Common::kPlatformNES ? _grabbedCursor[63] : transColor), + (_game.heversion == 70 ? 2 : 1), + &format); +#else CursorMan.replaceCursor(_grabbedCursor, _cursor.width, _cursor.height, _cursor.hotspotX, _cursor.hotspotY, (_game.platform == Common::kPlatformNES ? _grabbedCursor[63] : transColor), (_game.heversion == 70 ? 2 : 1)); -#ifdef USE_RGB_COLOR - } #endif } @@ -555,7 +551,7 @@ void ScummEngine_v5::setBuiltinCursor(int idx) { uint16 color; const uint16 *src = _cursorImages[_currentCursor]; - if (_bytesPerPixelOutput == 2) { + if (_outputPixelFormat.bytesPerPixel == 2) { if (_game.id == GID_LOOM && _game.platform == Common::kPlatformPCEngine) { byte r, g, b; colorPCEToRGB(default_pce_cursor_colors[idx], &r, &g, &b); @@ -581,14 +577,14 @@ void ScummEngine_v5::setBuiltinCursor(int idx) { _cursor.width = 16 * _textSurfaceMultiplier; _cursor.height = 16 * _textSurfaceMultiplier; - int scl = _bytesPerPixelOutput * _textSurfaceMultiplier; + int scl = _outputPixelFormat.bytesPerPixel * _textSurfaceMultiplier; for (i = 0; i < 16; i++) { for (j = 0; j < 16; j++) { if (src[i] & (1 << j)) { byte *dst1 = _grabbedCursor + 16 * scl * i * _textSurfaceMultiplier + (15 - j) * scl; byte *dst2 = (_textSurfaceMultiplier == 2) ? dst1 + 16 * scl : dst1; - if (_bytesPerPixelOutput == 2) { + if (_outputPixelFormat.bytesPerPixel == 2) { for (int b = 0; b < scl; b += 2) { *((uint16*)dst1) = *((uint16*)dst2) = color; dst1 += 2; diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index e5c5906404..18f2f4ddec 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -272,7 +272,7 @@ static BaseScummFile *openDiskImage(const Common::FSNode &node, const GameFilena GameSettings gs; memset(&gs, 0, sizeof(GameSettings)); gs.gameid = gfp->gameid; - gs.id = (Common::String(gfp->gameid) == "maniac" ? GID_MANIAC : GID_ZAK); + gs.id = (Common::String(gfp->gameid) == "maniac" ? GID_MANIAC : GID_ZAK); gs.platform = gfp->platform; // determine second disk file name @@ -454,7 +454,7 @@ static void composeFileHashMap(DescMap &fileMD5Map, const Common::FSList &fslist matched = true; break; } - + if (!matched) continue; @@ -515,7 +515,7 @@ static void detectGames(const Common::FSList &fslist, Common::List<DetectorResul if (d.md5.empty()) { Common::SeekableReadStream *tmp = 0; bool isDiskImg = (file.hasSuffix(".d64") || file.hasSuffix(".dsk") || file.hasSuffix(".prg")); - + if (isDiskImg) { tmp = openDiskImage(d.node, gfp); diff --git a/engines/scumm/gfx.cpp b/engines/scumm/gfx.cpp index 1b913e16b4..2b0ded1c0a 100644 --- a/engines/scumm/gfx.cpp +++ b/engines/scumm/gfx.cpp @@ -251,7 +251,7 @@ GdiV2::~GdiV2() { } #ifdef USE_RGB_COLOR -Gdi16Bit::Gdi16Bit(ScummEngine *vm) : Gdi(vm) { +GdiHE16bit::GdiHE16bit(ScummEngine *vm) : GdiHE(vm) { } #endif @@ -652,16 +652,13 @@ void ScummEngine::drawStripToScreen(VirtScreen *vs, int x, int width, int top, i assert(0 == (width & 3)); // Compose the text over the game graphics -#ifdef USE_ARM_GFX_ASM - asmDrawStripToScreen(height, width, text, src, _compositeBuf, vs->pitch, width, _textSurface.pitch); -#else #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE if (_game.platform == Common::kPlatformFMTowns) { towns_drawStripToScreen(vs, x, y, x, top, width, height); - return; + return; } else -#endif - if (_bytesPerPixelOutput == 2) { +#endif + if (_outputPixelFormat.bytesPerPixel == 2) { const byte *srcPtr = (const byte *)src; const byte *textPtr = (byte *)_textSurface.getBasePtr(x * m, y * m); byte *dstPtr = _compositeBuf; @@ -682,7 +679,11 @@ void ScummEngine::drawStripToScreen(VirtScreen *vs, int x, int width, int top, i srcPtr += vsPitch; textPtr += _textSurface.pitch - width * m; } - } else { + } +#ifdef USE_ARM_GFX_ASM + asmDrawStripToScreen(height, width, text, src, _compositeBuf, vs->pitch, width, _textSurface.pitch); +#else + else { // We blit four pixels at a time, for improved performance. const uint32 *src32 = (const uint32 *)src; uint32 *dst32 = (uint32 *)_compositeBuf; @@ -1023,7 +1024,7 @@ void ScummEngine::restoreBackground(Common::Rect rect, byte backColor) { if (rect.left > vs->w) return; - + // Convert 'rect' to local (virtual screen) coordinates rect.top -= vs->topline; rect.bottom -= vs->topline; @@ -1067,7 +1068,7 @@ void ScummEngine::restoreBackground(Common::Rect rect, byte backColor) { fill(mask, _textSurface.pitch, backColor, width * _textSurfaceMultiplier, height * _textSurfaceMultiplier, _textSurface.format.bytesPerPixel); } #endif - + if (_game.features & GF_16BIT_COLOR) fill(screenBuf, vs->pitch, _16BitPalette[backColor], width, height, vs->format.bytesPerPixel); else @@ -1127,7 +1128,7 @@ void ScummEngine::clearTextSurface() { fill((byte*)_textSurface.pixels, _textSurface.pitch, #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE _game.platform == Common::kPlatformFMTowns ? 0 : -#endif +#endif CHARSET_MASK_TRANSPARENCY, _textSurface.w, _textSurface.h, _textSurface.format.bytesPerPixel); } @@ -1344,12 +1345,12 @@ void ScummEngine::drawBox(int x, int y, int x2, int y2, int color) { color = ((color & 0x0f) << 4) | (color & 0x0f); byte *mask = (byte *)_textSurface.getBasePtr(x * _textSurfaceMultiplier, (y - _screenTop + vs->topline) * _textSurfaceMultiplier); fill(mask, _textSurface.pitch, color, width * _textSurfaceMultiplier, height * _textSurfaceMultiplier, _textSurface.format.bytesPerPixel); - + if (_game.id == GID_MONKEY2 || _game.id == GID_INDY4 || ((_game.id == GID_INDY3 || _game.id == GID_ZAK) && vs->number != kTextVirtScreen) || (_game.id == GID_LOOM && vs->number == kMainVirtScreen)) return; } #endif - + fill(backbuff, vs->pitch, color, width, height, vs->format.bytesPerPixel); } } @@ -3673,7 +3674,7 @@ void Gdi::unkDecode11(byte *dst, int dstPitch, const byte *src, int height) cons #undef READ_BIT_256 #ifdef USE_RGB_COLOR -void Gdi16Bit::writeRoomColor(byte *dst, byte color) const { +void GdiHE16bit::writeRoomColor(byte *dst, byte color) const { WRITE_UINT16(dst, READ_LE_UINT16(_vm->_hePalettes + 2048 + color * 2)); } #endif @@ -4009,7 +4010,7 @@ void ScummEngine::scrollEffect(int dir) { y = 1 + step; while (y < vs->h) { moveScreen(0, -step, vs->h); -#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE +#ifndef DISABLE_TOWNS_DUAL_LAYER_MODE if (_townsScreen) { towns_drawStripToScreen(vs, 0, vs->topline + vs->h - step, 0, y - step, vs->w, step); } else @@ -4022,7 +4023,7 @@ void ScummEngine::scrollEffect(int dir) { vs->w * m, step * m); _system->updateScreen(); } - + waitForTimer(delay); y += step; } @@ -4045,7 +4046,7 @@ void ScummEngine::scrollEffect(int dir) { vs->w * m, step * m); _system->updateScreen(); } - + waitForTimer(delay); y += step; } @@ -4092,7 +4093,7 @@ void ScummEngine::scrollEffect(int dir) { 0, 0, step, vs->h); _system->updateScreen(); - } + } waitForTimer(delay); x += step; diff --git a/engines/scumm/gfx.h b/engines/scumm/gfx.h index 6da07efd18..af75a98731 100644 --- a/engines/scumm/gfx.h +++ b/engines/scumm/gfx.h @@ -430,11 +430,11 @@ public: }; #ifdef USE_RGB_COLOR -class Gdi16Bit : public Gdi { +class GdiHE16bit : public GdiHE { protected: virtual void writeRoomColor(byte *dst, byte color) const; public: - Gdi16Bit(ScummEngine *vm); + GdiHE16bit(ScummEngine *vm); }; #endif @@ -443,21 +443,21 @@ public: // switching graphics layers on and off). class TownsScreen { public: - TownsScreen(OSystem *system, int width, int height, int bpp); + TownsScreen(OSystem *system, int width, int height, Graphics::PixelFormat &format); ~TownsScreen(); void setupLayer(int layer, int width, int height, int numCol, void *srcPal = 0); void clearLayer(int layer); void fillLayerRect(int layer, int x, int y, int w, int h, int col); //void copyRectToLayer(int layer, int x, int y, int w, int h, const uint8 *src); - + uint8 *getLayerPixels(int layer, int x, int y); int getLayerPitch(int layer); int getLayerHeight(int layer); int getLayerBpp(int layer); int getLayerScaleW(int layer); int getLayerScaleH(int layer); - + void addDirtyRect(int x, int y, int w, int h); void toggleLayers(int flag); void update(); @@ -484,16 +484,16 @@ private: uint8 **bltInternY; uint16 *bltTmpPal; } _layers[2]; - + uint8 *_outBuffer; int _height; int _width; int _pitch; - int _bpp; - + Graphics::PixelFormat _pixelFormat; + int _numDirtyRects; - Common::List<Common::Rect> _dirtyRects; + Common::List<Common::Rect> _dirtyRects; OSystem *_system; }; #endif // DISABLE_TOWNS_DUAL_LAYER_MODE diff --git a/engines/scumm/gfx_towns.cpp b/engines/scumm/gfx_towns.cpp index cdccd3e193..6a3f50a1af 100644 --- a/engines/scumm/gfx_towns.cpp +++ b/engines/scumm/gfx_towns.cpp @@ -47,13 +47,13 @@ void ScummEngine::towns_drawStripToScreen(VirtScreen *vs, int dstX, int dstY, in int dp2 = _townsScreen->getLayerPitch(1) - width * m * _townsScreen->getLayerBpp(1); int sp1 = vs->pitch - (width * vs->format.bytesPerPixel); int sp2 = _textSurface.pitch - width * m; - + if (vs->number == kMainVirtScreen || _game.id == GID_INDY3 || _game.id == GID_ZAK) { for (int h = 0; h < height; ++h) { - if (_bytesPerPixelOutput == 2) { + if (_outputPixelFormat.bytesPerPixel == 2) { for (int w = 0; w < width; ++w) { *(uint16*)dst1 = _16BitPalette[*src1++]; - dst1 += _bytesPerPixelOutput; + dst1 += _outputPixelFormat.bytesPerPixel; } src1 += sp1; @@ -63,13 +63,13 @@ void ScummEngine::towns_drawStripToScreen(VirtScreen *vs, int dstX, int dstY, in src1 += vs->pitch; dst1 += _townsScreen->getLayerPitch(0); } - + for (int sH = 0; sH < m; ++sH) { memcpy(dst2, src2, width * m); src2 += _textSurface.pitch; dst2 += _townsScreen->getLayerPitch(1); } - } + } } else { dst1 = dst2; for (int h = 0; h < height; ++h) { @@ -81,7 +81,7 @@ void ScummEngine::towns_drawStripToScreen(VirtScreen *vs, int dstX, int dstY, in dst1 = dst2; uint8 *src3 = src2; - + if (m == 2) { dst2 += _townsScreen->getLayerPitch(1); src3 += _townsScreen->getLayerPitch(1); @@ -95,7 +95,7 @@ void ScummEngine::towns_drawStripToScreen(VirtScreen *vs, int dstX, int dstY, in dst1++; } - src1 += sp1; + src1 += sp1; src2 = src3 + sp2; dst1 = dst2 + dp2; dst2 += dp2; @@ -197,8 +197,8 @@ const uint8 ScummEngine::_townsLayer2Mask[] = { #define DIRTY_RECTS_MAX 20 #define FULL_REDRAW (DIRTY_RECTS_MAX + 1) -TownsScreen::TownsScreen(OSystem *system, int width, int height, int bpp) : - _system(system), _width(width), _height(height), _bpp(bpp), _pitch(width * bpp) { +TownsScreen::TownsScreen(OSystem *system, int width, int height, Graphics::PixelFormat &format) : + _system(system), _width(width), _height(height), _pixelFormat(format), _pitch(width * format.bytesPerPixel) { memset(&_layers[0], 0, sizeof(TownsScreenLayer)); memset(&_layers[1], 0, sizeof(TownsScreenLayer)); _outBuffer = new byte[_pitch * _height]; @@ -231,7 +231,7 @@ void TownsScreen::setupLayer(int layer, int width, int height, int numCol, void if (width > _width || height > _height) error("TownsScreen::setupLayer(): Layer width/height must be equal or less than screen width/height"); - + l->scaleW = _width / width; l->scaleH = _height / height; @@ -247,7 +247,7 @@ void TownsScreen::setupLayer(int layer, int width, int height, int numCol, void l->pitch = width * l->bpp; l->palette = (uint8*)pal; - if (l->palette && _bpp == 1) + if (l->palette && _pixelFormat.bytesPerPixel == 1) warning("TownsScreen::setupLayer(): Layer palette usage requires 16 bit graphics setting.\nLayer palette will be ignored."); delete[] l->pixels; @@ -267,14 +267,14 @@ void TownsScreen::setupLayer(int layer, int width, int height, int numCol, void l->bltInternY[i] = l->pixels + (i / l->scaleH) * l->pitch; delete[] l->bltTmpPal; - l->bltTmpPal = (l->bpp == 1 && _bpp == 2) ? new uint16[l->numCol] : 0; - + l->bltTmpPal = (l->bpp == 1 && _pixelFormat.bytesPerPixel == 2) ? new uint16[l->numCol] : 0; + l->enabled = true; _layers[0].onBottom = true; _layers[1].onBottom = _layers[0].enabled ? false : true; l->ready = true; } - + void TownsScreen::clearLayer(int layer) { if (layer < 0 || layer > 1) return; @@ -300,10 +300,10 @@ void TownsScreen::fillLayerRect(int layer, int x, int y, int w, int h, int col) assert(x >= 0 && y >= 0 && ((x + w) * l->bpp) <= (l->pitch) && (y + h) <= (l->height)); uint8 *pos = l->pixels + y * l->pitch + x * l->bpp; - + for (int i = 0; i < h; ++i) { if (l->bpp == 2) { - for (int ii = 0; ii < w; ++ii) { + for (int ii = 0; ii < w; ++ii) { *(uint16*)pos = col; pos += 2; } @@ -359,8 +359,8 @@ int TownsScreen::getLayerScaleH(int layer) { void TownsScreen::addDirtyRect(int x, int y, int w, int h) { if (w <= 0 || h <= 0 || _numDirtyRects > DIRTY_RECTS_MAX) - return; - + return; + if (_numDirtyRects == DIRTY_RECTS_MAX) { // full redraw _dirtyRects.clear(); @@ -383,25 +383,25 @@ void TownsScreen::addDirtyRect(int x, int y, int w, int h) { y = r->top; skip = true; } - + if (x2 > r->left && x2 < r->right && y > r->top && y < r->bottom) { x2 = r->right; y = r->top; skip = true; } - + if (x2 > r->left && x2 < r->right && y2 > r->top && y2 < r->bottom) { x2 = r->right; y2 = r->bottom; skip = true; } - + if (x > r->left && x < r->right && y2 > r->top && y2 < r->bottom) { x = r->left; y2 = r->bottom; skip = true; - } - + } + if (skip) { r->left = x; r->top = y; @@ -449,20 +449,22 @@ void TownsScreen::updateOutputBuffer() { if (!l->enabled || !l->ready) continue; - uint8 *dst = _outBuffer + r->top * _pitch + r->left * _bpp; - int ptch = _pitch - (r->right - r->left + 1) * _bpp; + uint8 *dst = _outBuffer + r->top * _pitch + r->left * _pixelFormat.bytesPerPixel; + int ptch = _pitch - (r->right - r->left + 1) * _pixelFormat.bytesPerPixel; - if (_bpp == 2 && l->bpp == 1) { + if (_pixelFormat.bytesPerPixel == 2 && l->bpp == 1) { + if (!l->palette) + error("void TownsScreen::updateOutputBuffer(): No palette assigned to 8 bit layer %d", i); for (int ic = 0; ic < l->numCol; ic++) l->bltTmpPal[ic] = calc16BitColor(&l->palette[ic * 3]); } for (int y = r->top; y <= r->bottom; ++y) { - if (l->bpp == _bpp && l->scaleW == 1 && l->onBottom && l->numCol & 0xff00) { - memcpy(dst, &l->bltInternY[y][l->bltInternX[r->left]], (r->right + 1 - r->left) * _bpp); + if (l->bpp == _pixelFormat.bytesPerPixel && l->scaleW == 1 && l->onBottom && l->numCol & 0xff00) { + memcpy(dst, &l->bltInternY[y][l->bltInternX[r->left]], (r->right + 1 - r->left) * _pixelFormat.bytesPerPixel); dst += _pitch; - } else if (_bpp == 2) { + } else if (_pixelFormat.bytesPerPixel == 2) { for (int x = r->left; x <= r->right; ++x) { uint8 *src = &l->bltInternY[y][l->bltInternX[x]]; if (l->bpp == 1) { @@ -484,13 +486,13 @@ void TownsScreen::updateOutputBuffer() { uint8 col = l->bltInternY[y][l->bltInternX[x]]; if (col || l->onBottom) { if (l->numCol == 16) - col = (col >> 4) & (col & 0x0f); + col = (col >> 4) & (col & 0x0f); *dst = col; } dst++; } dst += ptch; - } + } } } } @@ -498,17 +500,13 @@ void TownsScreen::updateOutputBuffer() { void TownsScreen::outputToScreen() { for (Common::List<Common::Rect>::iterator i = _dirtyRects.begin(); i != _dirtyRects.end(); ++i) - _system->copyRectToScreen(_outBuffer + i->top * _pitch + i->left * _bpp, _pitch, i->left, i->top, i->right - i->left + 1, i->bottom - i->top + 1); + _system->copyRectToScreen(_outBuffer + i->top * _pitch + i->left * _pixelFormat.bytesPerPixel, _pitch, i->left, i->top, i->right - i->left + 1, i->bottom - i->top + 1); _dirtyRects.clear(); _numDirtyRects = 0; } uint16 TownsScreen::calc16BitColor(const uint8 *palEntry) { - uint16 ar = (palEntry[0] & 0xf8) << 7; - uint16 ag = (palEntry[1] & 0xf8) << 2; - uint16 ab = (palEntry[2] >> 3); - uint16 col = ar | ag | ab; - return col; + return _pixelFormat.RGBToColor(palEntry[0], palEntry[1], palEntry[2]); } #undef DIRTY_RECTS_MAX diff --git a/engines/scumm/he/logic_he.cpp b/engines/scumm/he/logic_he.cpp index a7d808e316..af56bca2ee 100644 --- a/engines/scumm/he/logic_he.cpp +++ b/engines/scumm/he/logic_he.cpp @@ -1018,7 +1018,7 @@ int LogicHEsoccer::op_1007(int32 *args) { // Returns the square root of the sum of the squares of the arguments static inline double sqrtSquare(double a1, double a2, double a3) { return sqrt(a1 * a1 + a2 * a2 + a3 * a3); -} +} int LogicHEsoccer::op_1008(int32 *args) { // TODO: Used during a match (kicking?) diff --git a/engines/scumm/he/resource_he.cpp b/engines/scumm/he/resource_he.cpp index 4565bb9f26..39240e347f 100644 --- a/engines/scumm/he/resource_he.cpp +++ b/engines/scumm/he/resource_he.cpp @@ -166,7 +166,7 @@ bool MacResExtractor::extractResource(int id, CachedCursor *cc) { } Common::SeekableReadStream *dataStream = _resMgr->getResource('crsr', id + 1000); - + if (!dataStream) return false; diff --git a/engines/scumm/he/resource_he.h b/engines/scumm/he/resource_he.h index 9978869ffc..6996ce81eb 100644 --- a/engines/scumm/he/resource_he.h +++ b/engines/scumm/he/resource_he.h @@ -61,7 +61,7 @@ private: ResExtractor::CachedCursor *findCachedCursor(int id); ResExtractor::CachedCursor *getCachedCursorSlot(); - + CachedCursor _cursorCache[MAX_CACHED_CURSORS]; }; diff --git a/engines/scumm/he/script_v60he.cpp b/engines/scumm/he/script_v60he.cpp index fb070b3e27..cf7d9fbd2f 100644 --- a/engines/scumm/he/script_v60he.cpp +++ b/engines/scumm/he/script_v60he.cpp @@ -744,7 +744,7 @@ void ScummEngine_v60he::o60_closeFile() { _hOutFileTable[slot] = 0; } - delete _hInFileTable[slot]; + delete _hInFileTable[slot]; _hInFileTable[slot] = 0; } } diff --git a/engines/scumm/he/script_v72he.cpp b/engines/scumm/he/script_v72he.cpp index 8f16bf0f3a..5af4035930 100644 --- a/engines/scumm/he/script_v72he.cpp +++ b/engines/scumm/he/script_v72he.cpp @@ -1446,7 +1446,7 @@ void ScummEngine_v72he::o72_openFile() { _hOutFileTable[slot]->write(initialData, initialSize); delete[] initialData; } - + } break; default: error("o72_openFile(): wrong open file mode %d", mode); diff --git a/engines/scumm/imuse/imuse.cpp b/engines/scumm/imuse/imuse.cpp index 6813566144..317ef36cb9 100644 --- a/engines/scumm/imuse/imuse.cpp +++ b/engines/scumm/imuse/imuse.cpp @@ -100,16 +100,16 @@ IMuseInternal::~IMuseInternal() { } } -byte *IMuseInternal::findStartOfSound(int sound, int ct) { +byte *IMuseInternal::findStartOfSound(int sound, int ct) { int32 size, pos; - + static const uint32 id[] = { MKTAG('M', 'T', 'h', 'd'), MKTAG('F', 'O', 'R', 'M'), MKTAG('M', 'D', 'h', 'd'), MKTAG('M', 'D', 'p', 'g') }; - + byte *ptr = g_scumm->_res->_types[rtSound][sound]._address; if (ptr == NULL) { @@ -952,7 +952,7 @@ void IMuseInternal::handle_marker(uint id, byte data) { _trigger_count--; _queue_cleared = false; _queue_end = (_queue_end + 1) % ARRAYSIZE(_cmd_queue); - + while (_queue_end != _queue_pos && _cmd_queue[_queue_end].array[0] == COMMAND_ID && !_queue_cleared) { p = _cmd_queue[_queue_end].array; doCommand_internal(p[1], p[2], p[3], p[4], p[5], p[6], p[7], 0); diff --git a/engines/scumm/imuse/imuse_internal.h b/engines/scumm/imuse/imuse_internal.h index 8808a3655a..6a7b9fc7d9 100644 --- a/engines/scumm/imuse/imuse_internal.h +++ b/engines/scumm/imuse/imuse_internal.h @@ -450,7 +450,7 @@ protected: kMThd = 1, kFORM = 2, kMDhd = 4, // Used in MI2 and INDY4. Contain certain start parameters (priority, volume, etc. ) for the player. - kMDpg = 8 // These chunks exist in DOTT and SAMNMAX. They don't get processed, however. + kMDpg = 8 // These chunks exist in DOTT and SAMNMAX. They don't get processed, however. }; byte *findStartOfSound(int sound, int ct = (kMThd | kFORM)); diff --git a/engines/scumm/imuse/imuse_player.cpp b/engines/scumm/imuse/imuse_player.cpp index 0b084f3116..61b9cad2cb 100644 --- a/engines/scumm/imuse/imuse_player.cpp +++ b/engines/scumm/imuse/imuse_player.cpp @@ -120,7 +120,7 @@ bool Player::startSound(int sound, MidiDriver *midi) { _midi = NULL; return false; } - + debugC(DEBUG_IMUSE, "Starting music %d", sound); return true; } @@ -194,7 +194,7 @@ int Player::start_seq_sound(int sound, bool reset_vars) { _parser->property(MidiParser::mpSmartJump, 1); _parser->loadMusic(ptr, 0); _parser->setTrack(_track_index); - + ptr = _se->findStartOfSound(sound, IMuseInternal::kMDhd); setSpeed(reset_vars ? (ptr ? (READ_BE_UINT32(&ptr[4]) && ptr[15] ? ptr[15] : 128) : 128) : _speed); @@ -226,7 +226,7 @@ void Player::loadStartParameters(int sound) { _pan = ptr[4]; _transpose = ptr[5]; _detune = ptr[6]; - setSpeed(ptr[7]); + setSpeed(ptr[7]); } } } diff --git a/engines/scumm/imuse/sysex_scumm.cpp b/engines/scumm/imuse/sysex_scumm.cpp index 4eb3bee93c..c3bec93a60 100644 --- a/engines/scumm/imuse/sysex_scumm.cpp +++ b/engines/scumm/imuse/sysex_scumm.cpp @@ -76,7 +76,7 @@ void sysexHandler_Scumm(Player *player, const byte *msg, uint16 len) { part->set_pri(p[4]); part->volume((p[5] & 0x0F) << 4 |(p[6] & 0x0F)); part->set_pan((p[7] & 0x0F) << 4 | (p[8] & 0x0F)); - part->_percussion = player->_isMIDI ? ((p[9] & 0x08) > 0) : false; + part->_percussion = player->_isMIDI ? ((p[9] & 0x08) > 0) : false; part->set_transpose((p[9] & 0x0F) << 4 | (p[10] & 0x0F)); part->set_detune((p[11] & 0x0F) << 4 | (p[12] & 0x0F)); part->pitchBendFactor((p[13] & 0x0F) << 4 | (p[14] & 0x0F)); diff --git a/engines/scumm/palette.cpp b/engines/scumm/palette.cpp index 3e8c35cfd8..51ba2195d7 100644 --- a/engines/scumm/palette.cpp +++ b/engines/scumm/palette.cpp @@ -48,11 +48,7 @@ uint8 *ScummEngine::getHEPaletteSlot(uint16 palSlot) { } uint16 ScummEngine::get16BitColor(uint8 r, uint8 g, uint8 b) { - uint16 ar = (r >> 3) << 10; - uint16 ag = (g >> 3) << 5; - uint16 ab = (b >> 3) << 0; - uint16 col = ar | ag | ab; - return col; + return _outputPixelFormat.RGBToColor(r, g, b); } void ScummEngine::resetPalette() { @@ -222,12 +218,10 @@ void ScummEngine::resetPalette() { if (_game.id == GID_INDY4 || _game.id == GID_MONKEY2) _townsClearLayerFlag = 0; #ifdef USE_RGB_COLOR - else if (_bytesPerPixelOutput == 2) { - if (_game.id == GID_LOOM) - towns_setTextPaletteFromPtr(tableTownsLoomPalette); - else if (_game.version == 3) - towns_setTextPaletteFromPtr(tableTownsV3Palette); - } + else if (_game.id == GID_LOOM) + towns_setTextPaletteFromPtr(tableTownsLoomPalette); + else if (_game.version == 3) + towns_setTextPaletteFromPtr(tableTownsV3Palette); #endif _townsScreen->toggleLayers(_townsActiveLayerFlags); @@ -1016,7 +1010,7 @@ void ScummEngine::setCurrentPalette(int palindex) { setPCEPaletteFromPtr(pals); #ifdef USE_RGB_COLOR #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE - } else if (_game.platform == Common::kPlatformFMTowns && _bytesPerPixelOutput == 2) { + } else if (_game.platform == Common::kPlatformFMTowns) { towns_setPaletteFromPtr(pals); #endif #endif @@ -1119,7 +1113,7 @@ void ScummEngine::updatePalette() { #ifdef USE_RGB_COLOR #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE - if (_game.platform == Common::kPlatformFMTowns && _bytesPerPixelOutput == 2) { + if (_game.platform == Common::kPlatformFMTowns) { p = palette_colors; for (i = first; i < first + num; ++i) { _16BitPalette[i] = get16BitColor(p[0], p[1], p[2]); diff --git a/engines/scumm/player_towns.cpp b/engines/scumm/player_towns.cpp index e71a8d0587..dd7630d370 100644 --- a/engines/scumm/player_towns.cpp +++ b/engines/scumm/player_towns.cpp @@ -32,7 +32,7 @@ Player_Towns::Player_Towns(ScummEngine *vm, bool isVersion2) : _vm(vm), _v2(isVe void Player_Towns::setSfxVolume(int vol) { if (!_intf) - return; + return; _intf->setSoundEffectVolume(vol); } @@ -98,17 +98,17 @@ void Player_Towns::playPcmTrack(int sound, const uint8 *data, int velo, int pan, return; const uint8 *sfxData = data + 16; - + int numChan = _v2 ? 1 : data[14]; for (int i = 0; i < numChan; i++) { int chan = allocatePcmChannel(sound, i, priority); if (!chan) return; - + _intf->callback(70, _unkFlags); _intf->callback(3, chan + 0x3f, pan); _intf->callback(37, chan + 0x3f, note, velo, sfxData); - + _pcmCurrentSound[chan].note = note; _pcmCurrentSound[chan].velo = velo; _pcmCurrentSound[chan].pan = pan; @@ -191,7 +191,7 @@ Player_Towns_v1::Player_Towns_v1(ScummEngine *vm, Audio::Mixer *mixer) : Player_ if (_vm->_game.version == 3) { _soundOverride = new SoundOvrParameters[_numSoundMax]; memset(_soundOverride, 0, _numSoundMax * sizeof(SoundOvrParameters)); - } + } _driver = new TownsEuphonyDriver(mixer); } @@ -204,7 +204,7 @@ Player_Towns_v1::~Player_Towns_v1() { bool Player_Towns_v1::init() { if (!_driver) return false; - + if (!_driver->init()) return false; @@ -235,13 +235,13 @@ void Player_Towns_v1::startSound(int sound) { if (type == 0) { uint8 velocity = 0; uint8 note = 0; - + if (_vm->_game.version == 3) { velocity = (_soundOverride[sound].vLeft + _soundOverride[sound].vRight); note = _soundOverride[sound].note; } - velocity = velocity ? velocity >> 2 : ptr[14] >> 1; + velocity = velocity ? velocity >> 2 : ptr[14] >> 1; playPcmTrack(sound, ptr + 6, velocity, 64, note ? note : ptr[50], READ_LE_UINT16(ptr + 10)); } else if (type == 1) { @@ -267,7 +267,7 @@ void Player_Towns_v1::stopSound(int sound) { _eupLooping = false; _driver->stopParser(); } - + stopPcmTrack(sound); } @@ -293,7 +293,7 @@ int Player_Towns_v1::getSoundStatus(int sound) const { int32 Player_Towns_v1::doCommand(int numargs, int args[]) { int32 res = 0; - + switch (args[0]) { case 2: _driver->intf()->callback(73, 0); @@ -381,12 +381,12 @@ void Player_Towns_v1::saveLoadWithSerializer(Serializer *ser) { void Player_Towns_v1::restoreAfterLoad() { setVolumeCD(_cdaVolLeft, _cdaVolRight); - + if (_cdaCurrentSoundTemp) { uint8 *ptr = _vm->getResourceAddress(rtSound, _cdaCurrentSoundTemp) + 6; if (_vm->_game.version != 3) ptr += 2; - + if (ptr[7] == 2) { playCdaTrack(_cdaCurrentSoundTemp, ptr, true); _cdaCurrentSound = _cdaCurrentSoundTemp; @@ -398,7 +398,7 @@ void Player_Towns_v1::restoreAfterLoad() { uint8 *ptr = _vm->getResourceAddress(rtSound, _eupCurrentSound) + 6; if (_vm->_game.version != 3) ptr += 2; - + if (ptr[7] == 1) { setSoundVolume(_eupCurrentSound, _eupVolLeft, _eupVolRight); playEuphonyTrack(_eupCurrentSound, ptr); @@ -458,7 +458,7 @@ void Player_Towns_v1::startSoundEx(int sound, int velo, int pan, int note) { } else if (ptr[13] == 2) { int volLeft = velo; int volRight = velo; - + if (pan < 50) volRight = ((pan * 2 + 1) * velo + 50) / 100; else if (pan > 50) @@ -478,7 +478,7 @@ void Player_Towns_v1::stopSoundSuspendLooping(int sound) { return; } else if (sound == _cdaCurrentSound) { if (_cdaNumLoops && _cdaForceRestart) - _cdaForceRestart = 1; + _cdaForceRestart = 1; } else { for (int i = 1; i < 9; i++) { if (sound == _pcmCurrentSound[i].index) { @@ -487,7 +487,7 @@ void Player_Towns_v1::stopSoundSuspendLooping(int sound) { _driver->stopSoundEffect(i + 0x3f); if (_pcmCurrentSound[i].looping) _pcmCurrentSound[i].paused = 1; - else + else _pcmCurrentSound[i].index = 0; } } @@ -532,7 +532,7 @@ void Player_Towns_v1::playEuphonyTrack(int sound, const uint8 *data) { uint32 trackSize = READ_LE_UINT32(src); src += 4; uint8 startTick = *src++; - + _driver->setMusicTempo(*src++); _driver->startMusicTrack(trackData, trackSize, startTick); @@ -559,7 +559,7 @@ void Player_Towns_v1::playCdaTrack(int sound, const uint8 *data, bool skipTrackV } } - if (sound == _cdaCurrentSound && _vm->_sound->pollCD() == 1) + if (sound == _cdaCurrentSound && _vm->_sound->pollCD() == 1) return; ptr += 16; @@ -585,7 +585,7 @@ Player_Towns_v2::~Player_Towns_v2() { _intf = 0; if (_imuseDispose) - delete _imuse; + delete _imuse; delete[] _sblData; delete[] _soundOverride; @@ -594,7 +594,7 @@ Player_Towns_v2::~Player_Towns_v2() { bool Player_Towns_v2::init() { if (!_intf) return false; - + if (!_intf->init()) return false; @@ -637,7 +637,7 @@ void Player_Towns_v2::startSound(int sound) { void Player_Towns_v2::stopSound(int sound) { if (_soundOverride[sound].type == 7) { - stopPcmTrack(sound); + stopPcmTrack(sound); } else { _imuse->stopSound(sound); } @@ -651,7 +651,7 @@ void Player_Towns_v2::stopAllSounds() { int32 Player_Towns_v2::doCommand(int numargs, int args[]) { int32 res = -1; uint8 *ptr = 0; - + switch (args[0]) { case 8: startSound(args[1]); @@ -675,7 +675,7 @@ int32 Player_Towns_v2::doCommand(int numargs, int args[]) { case 258: if (_soundOverride[args[1]].type == 0) { ptr = _vm->getResourceAddress(rtSound, args[1]); - if (READ_BE_UINT32(ptr) == MKTAG('T','O','W','S')) + if (READ_BE_UINT32(ptr) == MKTAG('T','O','W','S')) _soundOverride[args[1]].type = 7; } if (_soundOverride[args[1]].type == 7) { @@ -683,11 +683,11 @@ int32 Player_Towns_v2::doCommand(int numargs, int args[]) { res = 0; } break; - + case 259: if (_soundOverride[args[1]].type == 0) { ptr = _vm->getResourceAddress(rtSound, args[1]); - if (READ_BE_UINT32(ptr) == MKTAG('T','O','W','S')) + if (READ_BE_UINT32(ptr) == MKTAG('T','O','W','S')) _soundOverride[args[1]].type = 7; } if (_soundOverride[args[1]].type == 7) { @@ -702,7 +702,7 @@ int32 Player_Towns_v2::doCommand(int numargs, int args[]) { if (res == -1) return _imuse->doCommand(numargs, args); - + return res; } @@ -718,9 +718,9 @@ void Player_Towns_v2::playVocTrack(const uint8 *data) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x04, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00 }; - + uint32 len = (READ_LE_UINT32(data) >> 8) - 2; - + int chan = allocatePcmChannel(0xffff, 0, 0x1000); if (!chan) return; diff --git a/engines/scumm/player_towns.h b/engines/scumm/player_towns.h index 470020d621..5c76d7c6c7 100644 --- a/engines/scumm/player_towns.h +++ b/engines/scumm/player_towns.h @@ -47,8 +47,8 @@ public: virtual void restoreAfterLoad(); // version 1 specific - virtual int getCurrentCdaSound() { return 0; } - virtual int getCurrentCdaVolume() { return 0; } + virtual int getCurrentCdaSound() { return 0; } + virtual int getCurrentCdaVolume() { return 0; } virtual void setVolumeCD(int left, int right) {} virtual void setSoundVolume(int sound, int left, int right) {} virtual void setSoundNote(int sound, int note) {} @@ -92,8 +92,8 @@ public: void stopAllSounds(); int getSoundStatus(int sound) const; - int getCurrentCdaSound() { return _cdaCurrentSound; } - int getCurrentCdaVolume() { return (_cdaVolLeft + _cdaVolRight + 1) >> 1; } + int getCurrentCdaSound() { return _cdaCurrentSound; } + int getCurrentCdaVolume() { return (_cdaVolLeft + _cdaVolRight + 1) >> 1; } int32 doCommand(int numargs, int args[]); @@ -124,7 +124,7 @@ private: uint8 _cdaVolLeft; uint8 _cdaVolRight; - + uint8 _eupCurrentSound; uint8 _eupLooping; uint8 _eupVolLeft; @@ -170,7 +170,7 @@ private: SoundOvrParameters *_soundOverride; uint8 *_sblData; - + IMuse *_imuse; const bool _imuseDispose; }; diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp index 19834cb35d..3cc710c207 100644 --- a/engines/scumm/saveload.cpp +++ b/engines/scumm/saveload.cpp @@ -1316,10 +1316,10 @@ void ScummEngine::saveOrLoad(Serializer *s) { MKEND() }; - s->saveLoadArrayOf(_textPalette, 48, sizeof(_textPalette[0]), sleUint8); + s->saveLoadArrayOf(_textPalette, 48, sizeof(_textPalette[0]), sleUint8); s->saveLoadArrayOf(_cyclRects, 10, sizeof(_cyclRects[0]), townsFields); s->saveLoadArrayOf(&_curStringRect, 1, sizeof(_curStringRect), townsFields); - s->saveLoadArrayOf(_townsCharsetColorMap, 16, sizeof(_townsCharsetColorMap[0]), sleUint8); + s->saveLoadArrayOf(_townsCharsetColorMap, 16, sizeof(_townsCharsetColorMap[0]), sleUint8); s->saveLoadEntries(this, townsExtraEntries); } #endif @@ -1489,7 +1489,7 @@ void ScummEngine_v5::saveOrLoad(Serializer *s) { // Reset cursors for old FM-Towns savegames saved with 256 color setting. // Otherwise the cursor will be messed up when displayed in the new hi color setting. - if (_game.platform == Common::kPlatformFMTowns && _bytesPerPixelOutput == 2 && s->isLoading() && s->getVersion() < VER(82)) { + if (_game.platform == Common::kPlatformFMTowns && _outputPixelFormat.bytesPerPixel == 2 && s->isLoading() && s->getVersion() < VER(82)) { if (_game.id == GID_LOOM) { redefineBuiltinCursorFromChar(1, 1); redefineBuiltinCursorHotspot(1, 0, 0); @@ -1497,6 +1497,16 @@ void ScummEngine_v5::saveOrLoad(Serializer *s) { resetCursors(); } } + + // Regenerate 16bit palette after loading. + // This avoids color issues when loading savegames that have been saved with a different ScummVM port + // that uses a different 16bit color mode than the ScummVM port which is currently used. +#ifdef USE_RGB_COLOR + if (_game.platform == Common::kPlatformPCEngine && s->isLoading()) { + for (int i = 0; i < 256; ++i) + _16BitPalette[i] = get16BitColor(_currentPalette[i * 3 + 0], _currentPalette[i * 3 + 1], _currentPalette[i * 3 + 2]); + } +#endif } #ifdef ENABLE_SCUMM_7_8 diff --git a/engines/scumm/script_v5.cpp b/engines/scumm/script_v5.cpp index 2c8f65496f..a6cf504586 100644 --- a/engines/scumm/script_v5.cpp +++ b/engines/scumm/script_v5.cpp @@ -1611,7 +1611,7 @@ void ScummEngine_v5::o5_resourceRoutines() { foo = getVarOrDirectByte(PARAM_2); bar = fetchScriptByte(); if (_townsPlayer) - _townsPlayer->setSoundVolume(resid, foo, bar); + _townsPlayer->setSoundVolume(resid, foo, bar); break; case 37: if (_townsPlayer) @@ -2319,7 +2319,7 @@ void ScummEngine_v5::o5_verbOps() { if (_game.platform == Common::kPlatformFMTowns && _game.version == 3 && slot) continue; - + if (slot == 0) { for (slot = 1; slot < _numVerbs; slot++) { if (_verbs[slot].verbid == 0) diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index 97dd68af7c..ed5537f409 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -114,17 +114,18 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr) _rnd("scumm") { - if (_game.heversion > 0) { - _gdi = new GdiHE(this); - } else if (_game.platform == Common::kPlatformNES) { - _gdi = new GdiNES(this); #ifdef USE_RGB_COLOR - } else if (_game.features & GF_16BIT_COLOR) { + if (_game.features & GF_16BIT_COLOR) { if (_game.platform == Common::kPlatformPCEngine) _gdi = new GdiPCEngine(this); - else - _gdi = new Gdi16Bit(this); + else if (_game.heversion > 0) + _gdi = new GdiHE16bit(this); + } else #endif + if (_game.heversion > 0) { + _gdi = new GdiHE(this); + } else if (_game.platform == Common::kPlatformNES) { + _gdi = new GdiNES(this); } else if (_game.version <= 1) { _gdi = new GdiV1(this); } else if (_game.version == 2) { @@ -260,7 +261,7 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr) _switchRoomEffect2 = 0; _switchRoomEffect = 0; - _bytesPerPixelOutput = _bytesPerPixel = 1; + _bytesPerPixel = 1; _doEffect = false; _snapScroll = false; _currentLights = 0; @@ -328,7 +329,7 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr) memset(&_cyclRects, 0, 16 * sizeof(Common::Rect)); _numCyclRects = 0; #endif - + // // Init all VARS to 0xFF // @@ -545,18 +546,19 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr) _screenHeight = 200; } - _bytesPerPixelOutput = _bytesPerPixel = (_game.features & GF_16BIT_COLOR) ? 2 : 1; + _bytesPerPixel = (_game.features & GF_16BIT_COLOR) ? 2 : 1; + uint8 sizeMult = _bytesPerPixel; #ifdef USE_RGB_COLOR #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE if (_game.platform == Common::kPlatformFMTowns) - _bytesPerPixelOutput = 2; + sizeMult = 2; #endif #endif // Allocate gfx compositing buffer (not needed for V7/V8 games). if (_game.version < 7) - _compositeBuf = (byte *)malloc(_screenWidth * _screenHeight * _bytesPerPixelOutput); + _compositeBuf = (byte *)malloc(_screenWidth * _screenHeight * sizeMult); else _compositeBuf = 0; @@ -589,7 +591,7 @@ ScummEngine::~ScummEngine() { delete _actors[i]; delete[] _actors; } - + delete[] _sortedActors; delete[] _2byteFontPtr; @@ -1148,22 +1150,36 @@ Common::Error ScummEngine::init() { screenWidth *= _textSurfaceMultiplier; screenHeight *= _textSurfaceMultiplier; } - if (_game.features & GF_16BIT_COLOR + if (_game.features & GF_16BIT_COLOR #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE || _game.platform == Common::kPlatformFMTowns #endif ) { #ifdef USE_RGB_COLOR - Graphics::PixelFormat format = Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0); - initGraphics(screenWidth, screenHeight, screenWidth > 320, &format); - if (format != _system->getScreenFormat()) { - if (_game.platform == Common::kPlatformFMTowns && _game.version == 3) { - warning("Your ScummVM build does not support the type of 16bit color mode required by this target.\nStarting game in 8bit color mode...\nYou may experience color glitches"); - _bytesPerPixelOutput = 1; - initGraphics(screenWidth, screenHeight, (screenWidth > 320)); - } else { + _outputPixelFormat = Graphics::PixelFormat(2, 5, 5, 5, 0, 10, 5, 0, 0); + + if (_game.platform != Common::kPlatformFMTowns && _game.platform != Common::kPlatformPCEngine) { + initGraphics(screenWidth, screenHeight, screenWidth > 320, &_outputPixelFormat); + if (_outputPixelFormat != _system->getScreenFormat()) return Common::kUnsupportedColorMode; + } else { + Common::List<Graphics::PixelFormat> tryModes = _system->getSupportedFormats(); + for (Common::List<Graphics::PixelFormat>::iterator g = tryModes.begin(); g != tryModes.end(); ++g) { + if (g->bytesPerPixel != 2 || g->aBits()) { + g = tryModes.erase(g); + g--; + } + + if (*g == _outputPixelFormat) { + tryModes.clear(); + tryModes.push_back(_outputPixelFormat); + break; + } } + + initGraphics(screenWidth, screenHeight, screenWidth > 320, tryModes); + if (_system->getScreenFormat().bytesPerPixel != 2) + return Common::kUnsupportedColorMode; } #else if (_game.platform == Common::kPlatformFMTowns && _game.version == 3) { @@ -1176,12 +1192,14 @@ Common::Error ScummEngine::init() { } else { #ifdef DISABLE_TOWNS_DUAL_LAYER_MODE if (_game.platform == Common::kPlatformFMTowns && _game.version == 5) - error("This game requires dual graphics layer support which is disabled in this build"); + return Common::Error(Common::kUnsupportedColorMode, "This game requires dual graphics layer support which is disabled in this build"); #endif initGraphics(screenWidth, screenHeight, (screenWidth > 320)); } } + _outputPixelFormat = _system->getScreenFormat(); + setupScumm(); readIndexFile(); @@ -1290,7 +1308,7 @@ void ScummEngine::setupScumm() { _res->setHeapThreshold(400000, maxHeapThreshold); free(_compositeBuf); - _compositeBuf = (byte *)malloc(_screenWidth * _textSurfaceMultiplier * _screenHeight * _textSurfaceMultiplier * _bytesPerPixelOutput); + _compositeBuf = (byte *)malloc(_screenWidth * _textSurfaceMultiplier * _screenHeight * _textSurfaceMultiplier * _outputPixelFormat.bytesPerPixel); } #ifdef ENABLE_SCUMM_7_8 @@ -1371,7 +1389,7 @@ void ScummEngine::resetScumm() { #ifdef USE_RGB_COLOR if (_game.features & GF_16BIT_COLOR #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE - || (_game.platform == Common::kPlatformFMTowns && _bytesPerPixelOutput == 2) + || (_game.platform == Common::kPlatformFMTowns) #endif ) _16BitPalette = (uint16 *)calloc(512, sizeof(uint16)); @@ -1380,8 +1398,8 @@ void ScummEngine::resetScumm() { #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE if (_game.platform == Common::kPlatformFMTowns) { delete _townsScreen; - _townsScreen = new TownsScreen(_system, _screenWidth * _textSurfaceMultiplier, _screenHeight * _textSurfaceMultiplier, _bytesPerPixelOutput); - _townsScreen->setupLayer(0, _screenWidth, _screenHeight, (_bytesPerPixelOutput == 2) ? 32767 : 256); + _townsScreen = new TownsScreen(_system, _screenWidth * _textSurfaceMultiplier, _screenHeight * _textSurfaceMultiplier, _outputPixelFormat); + _townsScreen->setupLayer(0, _screenWidth, _screenHeight, (_outputPixelFormat.bytesPerPixel == 2) ? 32767 : 256); _townsScreen->setupLayer(1, _screenWidth * _textSurfaceMultiplier, _screenHeight * _textSurfaceMultiplier, 16, _textPalette); } #endif @@ -1850,7 +1868,7 @@ void ScummEngine::setupMusic(int midi) { } _imuse = IMuse::create(_system, nativeMidiDriver, adlibMidiDriver); - + if (_game.platform == Common::kPlatformFMTowns) { _musicEngine = _townsPlayer = new Player_Towns_v2(this, _mixer, _imuse, true); if (!_townsPlayer->init()) diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h index 6e75f47d77..01bde90e1c 100644 --- a/engines/scumm/scumm.h +++ b/engines/scumm/scumm.h @@ -897,7 +897,7 @@ public: Common::RenderMode _renderMode; uint8 _bytesPerPixel; - uint8 _bytesPerPixelOutput; + Graphics::PixelFormat _outputPixelFormat; protected: ColorCycle _colorCycle[16]; // Palette cycles @@ -1004,7 +1004,7 @@ protected: // Screen rendering byte *_compositeBuf; byte *_herculesBuf; - + virtual void drawDirtyScreenParts(); void updateDirtyScreen(VirtScreenNumber slot); void drawStripToScreen(VirtScreen *vs, int x, int w, int t, int b); @@ -1148,7 +1148,7 @@ protected: void restoreCharsetBg(); void clearCharsetMask(); void clearTextSurface(); - + virtual void initCharset(int charset); virtual void printString(int m, const byte *msg); @@ -1348,10 +1348,10 @@ protected: Common::Rect _cyclRects[16]; int _numCyclRects; - + Common::Rect _curStringRect; - byte _townsOverrideShadowColor; + byte _townsOverrideShadowColor; byte _textPalette[48]; byte _townsClearLayerFlag; byte _townsActiveLayerFlags; diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp index c22da8e7c7..27e43b3740 100644 --- a/engines/scumm/sound.cpp +++ b/engines/scumm/sound.cpp @@ -312,7 +312,7 @@ void Sound::playSound(int soundID) { sound = (byte *)malloc(size); memcpy(sound, ptr + 6, size); stream = Audio::makeRawStream(sound, size, rate, Audio::FLAG_UNSIGNED); - _mixer->playStream(Audio::Mixer::kSFXSoundType, NULL, stream, soundID); + _mixer->playStream(Audio::Mixer::kSFXSoundType, NULL, stream, soundID); } else if (_vm->_game.platform != Common::kPlatformFMTowns && READ_BE_UINT32(ptr) == MKTAG('S','O','U','N')) { if (_vm->_game.version != 3) diff --git a/engines/scumm/verbs.cpp b/engines/scumm/verbs.cpp index 69caceb53a..0c1554840e 100644 --- a/engines/scumm/verbs.cpp +++ b/engines/scumm/verbs.cpp @@ -152,7 +152,7 @@ void ScummEngine_v0::setNewKidVerbs() { void ScummEngine_v0::switchActor(int slot) { resetSentence(false); - + if (_currentRoom == 45) return; @@ -728,7 +728,7 @@ void ScummEngine_v0::runObject(int obj, int entry) { entry = 0x0F; } } - + _v0ObjectInInventory = prev; if (getVerbEntrypoint(obj, entry) != 0) { @@ -830,7 +830,7 @@ bool ScummEngine_v0::verbObtain(int obj, int objIndex) { } else { _verbPickup = false; } - + // Ignore verbs? Actor *a = derefActor(VAR(VAR_EGO), "verbObtain"); if (((ActorC64 *)a)->_miscflags & 0x40) { @@ -989,7 +989,7 @@ bool ScummEngine_v0::verbExec() { runObject(_activeObjectIndex, entry); _v0ObjectIndex = false; } else if (_activeInventory) { - // Not sure this is the correct way to do this, + // Not sure this is the correct way to do this, // however its working for most situations - segra if (verbExecutes(_activeInventory, true) == false) { if (_activeObject2 && _activeObject2Inv && verbExecutes(_activeObject2, true)) { @@ -1001,7 +1001,7 @@ bool ScummEngine_v0::verbExec() { runObject(_activeObject, _activeVerb); } else { _v0ObjectInInventory = true; - + if (_activeObject2) { _activeObject = _activeObject2; @@ -1085,7 +1085,7 @@ void ScummEngine_v0::checkExecVerbs() { // Click into V2 inventory checkV2Inventory(_mouse.x, _mouse.y); - + // Did the Inventory position changed (arrows pressed, do nothing) if (invOff != _inventoryOffset) return; @@ -1143,7 +1143,7 @@ void ScummEngine_v0::checkExecVerbs() { obj = 0; objIdx = 0; } - + if (a->_miscflags & 0x80) { if (_activeVerb != 7 && over != 7) { _activeVerb = 0; @@ -1444,9 +1444,9 @@ void ScummEngine::restoreVerbBG(int verb) { VerbSlot *vs; vs = &_verbs[verb]; - uint8 col = + uint8 col = #ifndef DISABLE_TOWNS_DUAL_LAYER_MODE - ((_game.platform == Common::kPlatformFMTowns) && (_game.id == GID_MONKEY2 || _game.id == GID_INDY4) && (vs->bkcolor == _townsOverrideShadowColor)) ? 0 : + ((_game.platform == Common::kPlatformFMTowns) && (_game.id == GID_MONKEY2 || _game.id == GID_INDY4) && (vs->bkcolor == _townsOverrideShadowColor)) ? 0 : #endif vs->bkcolor; diff --git a/engines/sword1/animation.cpp b/engines/sword1/animation.cpp index cb86264eeb..4ce3e2e88d 100644 --- a/engines/sword1/animation.cpp +++ b/engines/sword1/animation.cpp @@ -261,7 +261,7 @@ bool MoviePlayer::playVideo() { uint32 minWeight = 0xFFFFFFFF; uint32 weight; byte r, g, b; - + const byte *palette = _decoder->getPalette(); for (int i = 0; i < 256; i++) { diff --git a/engines/sword2/animation.cpp b/engines/sword2/animation.cpp index 133abf165e..80b4809722 100644 --- a/engines/sword2/animation.cpp +++ b/engines/sword2/animation.cpp @@ -296,7 +296,7 @@ bool MoviePlayer::playVideo() { uint32 minWeight = 0xFFFFFFFF; uint32 weight; byte r, g, b; - + const byte *palette = _decoder->getPalette(); for (int i = 0; i < 256; i++) { diff --git a/engines/sword25/detection_tables.h b/engines/sword25/detection_tables.h index ca586b4f01..fe9e6e7934 100644 --- a/engines/sword25/detection_tables.h +++ b/engines/sword25/detection_tables.h @@ -34,7 +34,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("data.b25c", "f8b6e03ada2d2f6cf27fbc11ad1572e9", 654310588), Common::EN_ANY, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, { @@ -43,7 +43,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_fr.b25c", "690caf157387e06d2c3d1ca53c43f428", 1006043), Common::FR_FRA, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, { @@ -52,7 +52,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("data.b25c", "f8b6e03ada2d2f6cf27fbc11ad1572e9", 654310588), Common::DE_DEU, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, { @@ -61,7 +61,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_hr.b25c", "e881054d1f8ec1e527422fc521c25405", 1273217), Common::HU_HUN, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, { @@ -70,7 +70,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_it.b25c", "f3325666da0515cc2b42062e953c0889", 996197), Common::IT_ITA, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, { @@ -79,7 +79,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_pl.b25c", "49dc1a20f95391a808e475c49be2bac0", 1281799), Common::PL_POL, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, { @@ -88,7 +88,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_pt.b25c", "1df701432f9e13dcefe1adeb890b9c69", 993812), Common::PT_BRA, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, { @@ -97,7 +97,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_ru.b25c", "deb33dd2f90a71ff60181918a8ce5063", 1235378), Common::RU_RUS, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, { @@ -106,7 +106,7 @@ static const ADGameDescription gameDescriptions[] = { AD_ENTRY1s("lang_es.b25c", "384c19072d83725f351bb9ecb4d3f02b", 987965), Common::ES_ESP, Common::kPlatformUnknown, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, @@ -120,7 +120,7 @@ static const ADGameDescription gameDescriptions[] = { AD_LISTEND}, Common::EN_ANY, Common::kPlatformUnknown, - GF_EXTRACTED, + GF_EXTRACTED | ADGF_UNSTABLE, Common::GUIO_NONE }, AD_TABLE_END_MARKER diff --git a/engines/sword25/gfx/animation.h b/engines/sword25/gfx/animation.h index 55deacd333..60070be214 100644 --- a/engines/sword25/gfx/animation.h +++ b/engines/sword25/gfx/animation.h @@ -210,7 +210,7 @@ private: AnimationDescription *getAnimationDescription() const; /** - * Initializes a new animation resource from an XML file. + * Initializes a new animation resource from an XML file. */ void initializeAnimationResource(const Common::String &fileName); }; diff --git a/engines/sword25/gfx/animationresource.cpp b/engines/sword25/gfx/animationresource.cpp index b9d70cf87b..621e20ad8c 100644 --- a/engines/sword25/gfx/animationresource.cpp +++ b/engines/sword25/gfx/animationresource.cpp @@ -64,7 +64,7 @@ AnimationResource::AnimationResource(const Common::String &filename) : char *xmlData = _pPackage->getXmlFile(getFileName(), &fileSize); if (!xmlData) { error("Could not read \"%s\".", getFileName().c_str()); - return; + return; } // Parse the contents @@ -118,7 +118,7 @@ bool AnimationResource::parserCallback_animation(ParserNode *node) { // Loop type value const char *loopTypeString = node->values["type"].c_str(); - + if (strcmp(loopTypeString, "oneshot") == 0) { _animationType = Animation::AT_ONESHOT; } else if (strcmp(loopTypeString, "loop") == 0) { @@ -148,7 +148,7 @@ bool AnimationResource::parserCallback_frame(ParserNode *node) { } frame.fileName = _pPackage->getAbsolutePath(fileString); if (frame.fileName.empty()) { - error("Could not create absolute path for file specified in <frame> tag in \"%s\": \"%s\".", + error("Could not create absolute path for file specified in <frame> tag in \"%s\": \"%s\".", getFileName().c_str(), fileString); return false; } diff --git a/engines/sword25/gfx/fontresource.cpp b/engines/sword25/gfx/fontresource.cpp index 7657abb5f2..0aeca7c180 100644 --- a/engines/sword25/gfx/fontresource.cpp +++ b/engines/sword25/gfx/fontresource.cpp @@ -85,7 +85,7 @@ bool FontResource::parserCallback_font(ParserNode *node) { getFileName().c_str(), DEFAULT_GAPWIDTH); _gapWidth = DEFAULT_GAPWIDTH; } - + // Get a reference to the package manager assert(_pKernel); PackageManager *pPackage = _pKernel->getPackage(); diff --git a/engines/sword25/gfx/graphicengine.cpp b/engines/sword25/gfx/graphicengine.cpp index 6b1c2bc514..91133b9fd2 100644 --- a/engines/sword25/gfx/graphicengine.cpp +++ b/engines/sword25/gfx/graphicengine.cpp @@ -365,7 +365,7 @@ void GraphicEngine::updateLastFrameDuration() { } bool GraphicEngine::saveThumbnailScreenshot(const Common::String &filename) { - // Note: In ScumMVM, rather than saivng the thumbnail to a file, we store it in memory + // Note: In ScumMVM, rather than saivng the thumbnail to a file, we store it in memory // until needed when creating savegame files delete _thumbnail; diff --git a/engines/sword25/gfx/image/art.cpp b/engines/sword25/gfx/image/art.cpp index cd7cfb6b69..2df8bd4f3e 100644 --- a/engines/sword25/gfx/image/art.cpp +++ b/engines/sword25/gfx/image/art.cpp @@ -2499,7 +2499,7 @@ void art_svp_render_aa_iter_step(ArtSVPRenderAAIter *iter, int *p_start, ADD_STEP(x, xdelta) } if (x < x1) { - this_ = + this_ = (int)(delta * (1 - 0.5 * (x_max - ix_max) * (x_max - ix_max) * rslope)); diff --git a/engines/sword25/gfx/image/renderedimage.cpp b/engines/sword25/gfx/image/renderedimage.cpp index a9c9de4f0c..f5f33d8e02 100644 --- a/engines/sword25/gfx/image/renderedimage.cpp +++ b/engines/sword25/gfx/image/renderedimage.cpp @@ -373,17 +373,23 @@ bool RenderedImage::blit(int posX, int posY, int flipping, Common::Rect *pPartRe default: // alpha blending #if defined(SCUMM_LITTLE_ENDIAN) - if (cb != 255) + if (cb == 0) + *out = 0; + else if (cb != 255) *out += ((b - *out) * a * cb) >> 16; else *out += ((b - *out) * a) >> 8; out++; - if (cg != 255) + if (cg == 0) + *out = 0; + else if (cg != 255) *out += ((g - *out) * a * cg) >> 16; else *out += ((g - *out) * a) >> 8; out++; - if (cr != 255) + if (cr == 0) + *out = 0; + else if (cr != 255) *out += ((r - *out) * a * cr) >> 16; else *out += ((r - *out) * a) >> 8; @@ -393,17 +399,23 @@ bool RenderedImage::blit(int posX, int posY, int flipping, Common::Rect *pPartRe #else *out = 255; out++; - if (cr != 255) + if (cr == 0) + *out = 0; + else if (cr != 255) *out += ((r - *out) * a * cr) >> 16; else *out += ((r - *out) * a) >> 8; out++; - if (cg != 255) + if (cg == 0) + *out = 0; + else if (cg != 255) *out += ((g - *out) * a * cg) >> 16; else *out += ((g - *out) * a) >> 8; out++; - if (cb != 255) + if (cb == 0) + *out = 0; + else if (cb != 255) *out += ((b - *out) * a * cb) >> 16; else *out += ((b - *out) * a) >> 8; diff --git a/engines/sword25/gfx/screenshot.cpp b/engines/sword25/gfx/screenshot.cpp index 4f9ba1d3c5..de7b62fba9 100644 --- a/engines/sword25/gfx/screenshot.cpp +++ b/engines/sword25/gfx/screenshot.cpp @@ -67,8 +67,8 @@ bool Screenshot::saveToFile(Graphics::Surface *data, Common::WriteStream *stream Common::SeekableReadStream *Screenshot::createThumbnail(Graphics::Surface *data) { // This method takes a screen image with a dimension of 800x600, and creates a screenshot with a dimension of 200x125. - // First 50 pixels are cut off the top and bottom (the interface boards in the game). The remaining image of 800x500 - // will be on a 16th of its size, reduced by being handed out in 4x4 pixel blocks and the average of each block + // First 50 pixels are cut off the top and bottom (the interface boards in the game). The remaining image of 800x500 + // will be on a 16th of its size, reduced by being handed out in 4x4 pixel blocks and the average of each block // generates a pixel of the target image. Finally, the result as a PNG file is stored as a file. // The source image must be 800x600. @@ -84,7 +84,7 @@ Common::SeekableReadStream *Screenshot::createThumbnail(Graphics::Surface *data) // Über das Zielbild iterieren und einen Pixel zur Zeit berechnen. uint x, y; x = y = 0; - + for (byte *pDest = (byte *)thumbnail.pixels; pDest < ((byte *)thumbnail.pixels + thumbnail.pitch * thumbnail.h); ) { // Get an average over a 4x4 pixel block in the source image int alpha, red, green, blue; diff --git a/engines/sword25/gfx/text.cpp b/engines/sword25/gfx/text.cpp index 8e18d2936d..82bb7cdff7 100644 --- a/engines/sword25/gfx/text.cpp +++ b/engines/sword25/gfx/text.cpp @@ -61,7 +61,7 @@ Text::Text(InputPersistenceBlock &reader, RenderObjectPtr<RenderObject> parentPt // Temporarily set fields prior to unpersisting actual values _modulationColor(0xffffffff), _autoWrap(false), - _autoWrapThreshold(AUTO_WRAP_THRESHOLD_DEFAULT) { + _autoWrapThreshold(AUTO_WRAP_THRESHOLD_DEFAULT) { // Unpersist the fields _initSuccess = unpersist(reader); diff --git a/engines/sword25/kernel/persistenceservice.cpp b/engines/sword25/kernel/persistenceservice.cpp index 17e9199b5c..c88360e031 100644 --- a/engines/sword25/kernel/persistenceservice.cpp +++ b/engines/sword25/kernel/persistenceservice.cpp @@ -199,7 +199,7 @@ Common::String PersistenceService::getSavegameDirectory() { // Try and return the path using the savegame subfolder. But if doesn't exist, fall back on the data directory if (childNode.exists()) return childNode.getPath(); - + return node.getPath(); } diff --git a/engines/sword25/package/packagemanager.cpp b/engines/sword25/package/packagemanager.cpp index 5c869203c6..5549f50c3c 100644 --- a/engines/sword25/package/packagemanager.cpp +++ b/engines/sword25/package/packagemanager.cpp @@ -157,7 +157,7 @@ byte *PackageManager::getFile(const Common::String &fileName, uint *fileSizePtr) byte *buffer = new byte[file->size()]; file->read(buffer, file->size()); - + delete file; return buffer; } diff --git a/engines/sword25/package/packagemanager.h b/engines/sword25/package/packagemanager.h index 3c4c4e89c5..c57c30636d 100644 --- a/engines/sword25/package/packagemanager.h +++ b/engines/sword25/package/packagemanager.h @@ -151,7 +151,7 @@ public: return result; } - + /** * Returns the path to the current directory. * @return Returns a string containing the path to the current directory. diff --git a/engines/sword25/util/lua/lapi.cpp b/engines/sword25/util/lua/lapi.cpp index 16f8460e39..ff25cfc653 100644 --- a/engines/sword25/util/lua/lapi.cpp +++ b/engines/sword25/util/lua/lapi.cpp @@ -213,7 +213,7 @@ LUA_API void lua_replace (lua_State *L, int idx) { api_checkvalidindex(L, o); if (idx == LUA_ENVIRONINDEX) { Closure *func = curr_func(L); - api_check(L, ttistable(L->top - 1)); + api_check(L, ttistable(L->top - 1)); func->c.env = hvalue(L->top - 1); luaC_barrier(L, func, L->top - 1); } @@ -773,7 +773,7 @@ LUA_API int lua_setfenv (lua_State *L, int idx) { #define checkresults(L,na,nr) \ api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na))) - + LUA_API void lua_call (lua_State *L, int nargs, int nresults) { StkId func; diff --git a/engines/sword25/util/lua/lauxlib.cpp b/engines/sword25/util/lua/lauxlib.cpp index 8978cd5613..1261777315 100644 --- a/engines/sword25/util/lua/lauxlib.cpp +++ b/engines/sword25/util/lua/lauxlib.cpp @@ -570,13 +570,13 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) { } c = lf.f->getc(); - if (c == '#') { // Unix exec. file? + if (c == '#') { // Unix exec. file? lf.extraline = 1; - while ((c = lf.f->getc()) != EOF && c != '\n') ; // skip first line + while ((c = lf.f->getc()) != EOF && c != '\n') ; // skip first line if (c == '\n') c = lf.f->getc(); } - if (c == LUA_SIGNATURE[0] && filename) { // binary file? - lf.f = freopen(filename, "rb", lf.f); // reopen in binary mode + if (c == LUA_SIGNATURE[0] && filename) { // binary file? + lf.f = freopen(filename, "rb", lf.f); // reopen in binary mode if (lf.f == NULL) return errfile(L, "reopen", fnameindex); // skip eventual `#!...' while ((c = lf.f->getc()) != EOF && c != LUA_SIGNATURE[0]) ; diff --git a/engines/sword25/util/lua/ldblib.cpp b/engines/sword25/util/lua/ldblib.cpp index 4d0333b46e..618e9a843f 100644 --- a/engines/sword25/util/lua/ldblib.cpp +++ b/engines/sword25/util/lua/ldblib.cpp @@ -142,7 +142,7 @@ static int db_getinfo (lua_State *L) { treatstackoption(L, L1, "func"); return 1; /* return table */ } - + static int db_getlocal (lua_State *L) { int arg; diff --git a/engines/sword25/util/lua/ldebug.cpp b/engines/sword25/util/lua/ldebug.cpp index 0b26522b31..85c492cc77 100644 --- a/engines/sword25/util/lua/ldebug.cpp +++ b/engines/sword25/util/lua/ldebug.cpp @@ -184,7 +184,7 @@ static void collectvalidlines (lua_State *L, Closure *f) { int i; for (i=0; i<f->l.p->sizelineinfo; i++) setbvalue(luaH_setnum(L, t, lineinfo[i]), 1); - sethvalue(L, L->top, t); + sethvalue(L, L->top, t); } incr_top(L); } diff --git a/engines/sword25/util/lua/ldo.cpp b/engines/sword25/util/lua/ldo.cpp index bbcdf98b3d..49e0881a45 100644 --- a/engines/sword25/util/lua/ldo.cpp +++ b/engines/sword25/util/lua/ldo.cpp @@ -384,7 +384,7 @@ int luaD_poscall (lua_State *L, StkId firstResult) { ** The arguments are on the stack, right after the function. ** When returns, all the results are on the stack, starting at the original ** function position. -*/ +*/ void luaD_call (lua_State *L, StkId func, int nResults) { if (++L->nCcalls >= LUAI_MAXCCALLS) { if (L->nCcalls == LUAI_MAXCCALLS) diff --git a/engines/sword25/util/lua/lgc.cpp b/engines/sword25/util/lua/lgc.cpp index 52ff72bdc9..71e581ad30 100644 --- a/engines/sword25/util/lua/lgc.cpp +++ b/engines/sword25/util/lua/lgc.cpp @@ -310,7 +310,7 @@ static l_mem propagatemark (global_State *g) { traverseproto(g, p); return sizeof(Proto) + sizeof(Instruction) * p->sizecode + sizeof(Proto *) * p->sizep + - sizeof(TValue) * p->sizek + + sizeof(TValue) * p->sizek + sizeof(int) * p->sizelineinfo + sizeof(LocVar) * p->sizelocvars + sizeof(TString *) * p->sizeupvalues; @@ -697,7 +697,7 @@ void luaC_linkupval (lua_State *L, UpVal *uv) { GCObject *o = obj2gco(uv); o->gch.next = g->rootgc; /* link upvalue into `rootgc' list */ g->rootgc = o; - if (isgray(o)) { + if (isgray(o)) { if (g->gcstate == GCSpropagate) { gray2black(o); /* closed upvalues need barrier */ luaC_barrier(L, uv, uv->v); diff --git a/engines/sword25/util/lua/liolib.cpp b/engines/sword25/util/lua/liolib.cpp index b505d1e4df..6c00de5094 100644 --- a/engines/sword25/util/lua/liolib.cpp +++ b/engines/sword25/util/lua/liolib.cpp @@ -228,7 +228,7 @@ static int g_iofile (lua_State *L, int f, const char *mode) { } lua_rawseti(L, LUA_ENVIRONINDEX, f); } - // return current value + // return current value lua_rawgeti(L, LUA_ENVIRONINDEX, f); return 1; } @@ -315,7 +315,7 @@ static int read_line (lua_State *L, Sword25::Sword25FileProxy *f) { for (;;) { size_t l; char *p = luaL_prepbuffer(&b); - if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { // eof? + if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { // eof? luaL_pushresult(&b); // close buffer return (lua_objlen(L, -1) > 0); // check whether read something } @@ -332,19 +332,19 @@ static int read_line (lua_State *L, Sword25::Sword25FileProxy *f) { static int read_chars (lua_State *L, Sword25::Sword25FileProxy *f, size_t n) { - size_t rlen; // how much to read - size_t nr; // number of chars actually read + size_t rlen; // how much to read + size_t nr; // number of chars actually read luaL_Buffer b; luaL_buffinit(L, &b); - rlen = LUAL_BUFFERSIZE; // try to read that much each time + rlen = LUAL_BUFFERSIZE; // try to read that much each time do { char *p = luaL_prepbuffer(&b); - if (rlen > n) rlen = n; // cannot read more than asked + if (rlen > n) rlen = n; // cannot read more than asked nr = fread(p, sizeof(char), rlen, f); luaL_addsize(&b, nr); - n -= nr; // still have to read `n' chars - } while (n > 0 && nr == rlen); // until end of count or eof - luaL_pushresult(&b); // close buffer + n -= nr; // still have to read `n' chars + } while (n > 0 && nr == rlen); // until end of count or eof + luaL_pushresult(&b); // close buffer return (n == 0 || lua_objlen(L, -1) > 0); } @@ -354,11 +354,11 @@ static int g_read (lua_State *L, Sword25::Sword25FileProxy *f, int first) { int success; int n; clearerr(f); - if (nargs == 0) { // no arguments? + if (nargs == 0) { // no arguments? success = read_line(L, f); - n = first+1; // to return 1 result + n = first+1; // to return 1 result } - else { // ensure stack space for all results and for auxlib's buffer + else { // ensure stack space for all results and for auxlib's buffer luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments"); success = 1; for (n = first; nargs-- && success; n++) { @@ -370,15 +370,15 @@ static int g_read (lua_State *L, Sword25::Sword25FileProxy *f, int first) { const char *p = lua_tostring(L, n); luaL_argcheck(L, p && p[0] == '*', n, "invalid option"); switch (p[1]) { - case 'n': // number + case 'n': // number success = read_number(L, f); break; - case 'l': // line + case 'l': // line success = read_line(L, f); break; - case 'a': // file - read_chars(L, f, ~((size_t)0)); // read MAX_SIZE_T chars - success = 1; // always success + case 'a': // file + read_chars(L, f, ~((size_t)0)); // read MAX_SIZE_T chars + success = 1; // always success break; default: return luaL_argerror(L, n, "invalid format"); @@ -389,8 +389,8 @@ static int g_read (lua_State *L, Sword25::Sword25FileProxy *f, int first) { if (ferror(f)) return pushresult(L, 0, NULL); if (!success) { - lua_pop(L, 1); // remove last result - lua_pushnil(L); // push nil instead + lua_pop(L, 1); // remove last result + lua_pushnil(L); // push nil instead } return n - first; } @@ -419,8 +419,8 @@ static int io_readline (lua_State *L) { if (ferror(f)) return luaL_error(L, "%s", "LUA I/O error descriptions have been removed in ScummVM"); if (sucess) return 1; - else { // EOF - if (lua_toboolean(L, lua_upvalueindex(2))) { // generator created file? + else { // EOF + if (lua_toboolean(L, lua_upvalueindex(2))) { // generator created file? lua_settop(L, 0); lua_pushvalue(L, lua_upvalueindex(1)); aux_close(L); // close it diff --git a/engines/sword25/util/lua/llimits.h b/engines/sword25/util/lua/llimits.h index a31ad160ad..0925231350 100644 --- a/engines/sword25/util/lua/llimits.h +++ b/engines/sword25/util/lua/llimits.h @@ -107,7 +107,7 @@ typedef lu_int32 Instruction; #ifndef lua_lock -#define lua_lock(L) ((void) 0) +#define lua_lock(L) ((void) 0) #define lua_unlock(L) ((void) 0) #endif @@ -118,7 +118,7 @@ typedef lu_int32 Instruction; /* ** macro to control inclusion of some hard tests on stack reallocation -*/ +*/ #ifndef HARDSTACKTESTS #define condhardstacktests(x) ((void)0) #else diff --git a/engines/sword25/util/lua/loadlib.cpp b/engines/sword25/util/lua/loadlib.cpp index 9795a575f5..f4cdd70a78 100644 --- a/engines/sword25/util/lua/loadlib.cpp +++ b/engines/sword25/util/lua/loadlib.cpp @@ -182,7 +182,7 @@ static int ll_require (lua_State *L) { ** 'module' function ** ======================================================= */ - + static void setfenv (lua_State *L) { lua_Debug ar; @@ -298,7 +298,7 @@ LUALIB_API int luaopen_package (lua_State *L) { lua_setfield(L, -2, "__gc"); /* create `package' table */ luaL_register(L, LUA_LOADLIBNAME, pk_funcs); -#if defined(LUA_COMPAT_LOADLIB) +#if defined(LUA_COMPAT_LOADLIB) lua_getfield(L, -1, "loadlib"); lua_setfield(L, LUA_GLOBALSINDEX, "loadlib"); #endif diff --git a/engines/sword25/util/lua/lobject.h b/engines/sword25/util/lua/lobject.h index 35aaed028a..5418a918b1 100644 --- a/engines/sword25/util/lua/lobject.h +++ b/engines/sword25/util/lua/lobject.h @@ -337,7 +337,7 @@ typedef struct Node { typedef struct Table { CommonHeader; - lu_byte flags; /* 1<<p means tagmethod(p) is not present */ + lu_byte flags; /* 1<<p means tagmethod(p) is not present */ lu_byte lsizenode; /* log2 of size of `node' array */ struct Table *metatable; TValue *array; /* array part */ diff --git a/engines/sword25/util/lua/lopcodes.h b/engines/sword25/util/lua/lopcodes.h index e1aed0f637..2f850c4365 100644 --- a/engines/sword25/util/lua/lopcodes.h +++ b/engines/sword25/util/lua/lopcodes.h @@ -186,8 +186,8 @@ OP_EQ,/* A B C if ((RK(B) == RK(C)) ~= A) then pc++ */ OP_LT,/* A B C if ((RK(B) < RK(C)) ~= A) then pc++ */ OP_LE,/* A B C if ((RK(B) <= RK(C)) ~= A) then pc++ */ -OP_TEST,/* A C if not (R(A) <=> C) then pc++ */ -OP_TESTSET,/* A B C if (R(B) <=> C) then R(A) := R(B) else pc++ */ +OP_TEST,/* A C if not (R(A) <=> C) then pc++ */ +OP_TESTSET,/* A B C if (R(B) <=> C) then R(A) := R(B) else pc++ */ OP_CALL,/* A B C R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */ OP_TAILCALL,/* A B C return R(A)(R(A+1), ... ,R(A+B-1)) */ @@ -197,8 +197,8 @@ OP_FORLOOP,/* A sBx R(A)+=R(A+2); if R(A) <?= R(A+1) then { pc+=sBx; R(A+3)=R(A) }*/ OP_FORPREP,/* A sBx R(A)-=R(A+2); pc+=sBx */ -OP_TFORLOOP,/* A C R(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2)); - if R(A+3) ~= nil then R(A+2)=R(A+3) else pc++ */ +OP_TFORLOOP,/* A C R(A+3), ... ,R(A+2+C) := R(A)(R(A+1), R(A+2)); + if R(A+3) ~= nil then R(A+2)=R(A+3) else pc++ */ OP_SETLIST,/* A B C R(A)[(C-1)*FPF+i] := R(A+i), 1 <= i <= B */ OP_CLOSE,/* A close all variables in the stack up to (>=) R(A)*/ @@ -240,7 +240,7 @@ OP_VARARG/* A B R(A), R(A+1), ..., R(A+B-1) = vararg */ ** bits 4-5: B arg mode ** bit 6: instruction set register A ** bit 7: operator is a test -*/ +*/ enum OpArgMask { OpArgN, /* argument is not used */ diff --git a/engines/sword25/util/lua/lstate.cpp b/engines/sword25/util/lua/lstate.cpp index 495d75c8a6..e542bcbacc 100644 --- a/engines/sword25/util/lua/lstate.cpp +++ b/engines/sword25/util/lua/lstate.cpp @@ -36,7 +36,7 @@ typedef struct LG { lua_State l; global_State g; } LG; - + static void stack_init (lua_State *L1, lua_State *L) { diff --git a/engines/sword25/util/lua/lstrlib.cpp b/engines/sword25/util/lua/lstrlib.cpp index e5501b9b49..2a1b8690e2 100644 --- a/engines/sword25/util/lua/lstrlib.cpp +++ b/engines/sword25/util/lua/lstrlib.cpp @@ -635,7 +635,7 @@ static void add_value (MatchState *ms, luaL_Buffer *b, const char *s, lua_pushlstring(L, s, e - s); /* keep original text */ } else if (!lua_isstring(L, -1)) - luaL_error(L, "invalid replacement value (a %s)", luaL_typename(L, -1)); + luaL_error(L, "invalid replacement value (a %s)", luaL_typename(L, -1)); luaL_addvalue(b); /* add result to accumulator */ } diff --git a/engines/sword25/util/lua/ltable.cpp b/engines/sword25/util/lua/ltable.cpp index b2ec0e912a..45381fe673 100644 --- a/engines/sword25/util/lua/ltable.cpp +++ b/engines/sword25/util/lua/ltable.cpp @@ -48,7 +48,7 @@ #define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) - + #define hashstr(t,str) hashpow2(t, (str)->tsv.hash) #define hashboolean(t,p) hashpow2(t, p) @@ -303,7 +303,7 @@ static void resize (lua_State *L, Table *t, int nasize, int nhsize) { if (nasize > oldasize) /* array part must grow? */ setarrayvector(L, t, nasize); /* create new hash part with appropriate size */ - setnodevector(L, t, nhsize); + setnodevector(L, t, nhsize); if (nasize < oldasize) { /* array part must shrink? */ t->sizearray = nasize; /* re-insert elements from vanishing slice */ @@ -392,11 +392,11 @@ static Node *getfreepos (Table *t) { /* -** inserts a new key into a hash table; first, check whether key's main -** position is free. If not, check whether colliding node is in its main -** position or not: if it is not, move colliding node to an empty place and -** put new key in its main position; otherwise (colliding node is in its main -** position), new key goes to an empty position. +** inserts a new key into a hash table; first, check whether key's main +** position is free. If not, check whether colliding node is in its main +** position or not: if it is not, move colliding node to an empty place and +** put new key in its main position; otherwise (colliding node is in its main +** position), new key goes to an empty position. */ static TValue *newkey (lua_State *L, Table *t, const TValue *key) { Node *mp = mainposition(t, key); diff --git a/engines/sword25/util/lua/lua.h b/engines/sword25/util/lua/lua.h index 417cdadf8b..08ad80d70f 100644 --- a/engines/sword25/util/lua/lua.h +++ b/engines/sword25/util/lua/lua.h @@ -247,7 +247,7 @@ LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud); -/* +/* ** =============================================================== ** some useful macros ** =============================================================== diff --git a/engines/sword25/util/lua/lualib.h b/engines/sword25/util/lua/lualib.h index 33d4e314c2..830f6a0894 100644 --- a/engines/sword25/util/lua/lualib.h +++ b/engines/sword25/util/lua/lualib.h @@ -41,7 +41,7 @@ LUALIB_API int (luaopen_package) (lua_State *L); /* open all previous libraries */ -LUALIB_API void (luaL_openlibs) (lua_State *L); +LUALIB_API void (luaL_openlibs) (lua_State *L); diff --git a/engines/sword25/util/lua/lvm.cpp b/engines/sword25/util/lua/lvm.cpp index fb700c20a2..d0f2198651 100644 --- a/engines/sword25/util/lua/lvm.cpp +++ b/engines/sword25/util/lua/lvm.cpp @@ -125,7 +125,7 @@ void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) { callTMres(L, val, tm, t, key); return; } - t = tm; /* else repeat with `tm' */ + t = tm; /* else repeat with `tm' */ } luaG_runerror(L, "loop in gettable"); } @@ -152,7 +152,7 @@ void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) { callTM(L, tm, t, key, val); return; } - t = tm; /* else repeat with `tm' */ + t = tm; /* else repeat with `tm' */ } luaG_runerror(L, "loop in settable"); } diff --git a/engines/sword25/util/lua/scummvm_file.cpp b/engines/sword25/util/lua/scummvm_file.cpp index 3c0377d0ee..33053a71cb 100644 --- a/engines/sword25/util/lua/scummvm_file.cpp +++ b/engines/sword25/util/lua/scummvm_file.cpp @@ -32,11 +32,30 @@ Sword25FileProxy::Sword25FileProxy(const Common::String &filename, const Common: setupConfigFile(); } +Common::String Sword25FileProxy::formatDouble(double value) { + // This is a bit hackish. The point of it is that it's important that + // we ignore the locale decimal mark and force it to be a point. If it + // would happen to be a comma instead, it seems that it's seen as two + // comma-separated integers rather than one floating-point value. Or + // something like that. + + bool negative = value < 0.0; + value = fabs(value); + double integerPart = floor(value); + double fractionalPart = (value - integerPart) * 1000000.0; + + Common::String out = Common::String::format("%.0f.%.0f", integerPart, fractionalPart); + if (negative) + out = "-" + out; + + return out; +} + void Sword25FileProxy::setupConfigFile() { - double sfxVolume = ConfMan.hasKey("sfx_volume") ? 1.0 : 1.0 * ConfMan.getInt("sfx_volume") / 255.0; - double musicVolume = ConfMan.hasKey("music_volume") ? 0.5 : 1.0 * ConfMan.getInt("music_volume") / 255.0; - double speechVolume = ConfMan.hasKey("speech_volume") ? 1.0 : 1.0 * ConfMan.getInt("speech_volume") / 255.0; - bool subtitles = ConfMan.hasKey("subtitles") ? true : ConfMan.getBool("subtitles"); + double sfxVolume = !ConfMan.hasKey("sfx_volume") ? 1.0 : 1.0 * ConfMan.getInt("sfx_volume") / 255.0; + double musicVolume = !ConfMan.hasKey("music_volume") ? 0.5 : 1.0 * ConfMan.getInt("music_volume") / 255.0; + double speechVolume = !ConfMan.hasKey("speech_volume") ? 1.0 : 1.0 * ConfMan.getInt("speech_volume") / 255.0; + bool subtitles = !ConfMan.hasKey("subtitles") ? true : ConfMan.getBool("subtitles"); _readData = Common::String::format( "GAME_LANGUAGE = \"%s\"\r\n\ @@ -45,10 +64,13 @@ MAX_MEMORY_USAGE = 256000000\r\n\ GFX_VSYNC_ACTIVE = true\r\n\ SFX_SAMPLING_RATE = 44100\r\n\ SFX_CHANNEL_COUNT = 32\r\n\ -SFX_SOUND_VOLUME = %f\r\n\ -SFX_MUSIC_VOLUME = %f\r\n\ -SFX_SPEECH_VOLUME = %f\r\n", - getLanguage().c_str(), subtitles ? "true" : "false", sfxVolume, musicVolume, speechVolume); +SFX_SOUND_VOLUME = %s\r\n\ +SFX_MUSIC_VOLUME = %s\r\n\ +SFX_SPEECH_VOLUME = %s\r\n", + getLanguage().c_str(), subtitles ? "true" : "false", + formatDouble(sfxVolume).c_str(), + formatDouble(musicVolume).c_str(), + formatDouble(speechVolume).c_str()); _readPos = 0; } @@ -76,14 +98,14 @@ size_t Sword25FileProxy::write(const char *ptr, size_t count) { // Legitimate data const char *p = strchr(ptr, '\n'); if (!p) p = ptr + strlen(ptr); - while ((*p == '\r') || (*p == '\n')) + while ((*p == '\r') || (*p == '\n')) ++p; _settings += Common::String(ptr, p - ptr); ptr = p; } - while ((*ptr == '\r') || (*ptr == '\n')) + while ((*ptr == '\r') || (*ptr == '\n')) ++ptr; } @@ -97,7 +119,7 @@ void Sword25FileProxy::writeSettings() { if ((*pSrc != '\r') && (*pSrc != '\n')) { const char *p = strchr(pSrc, '='); assert(p); - + // Get the setting name const char *pEnd = p - 1; while (*pEnd == ' ') @@ -110,10 +132,10 @@ void Sword25FileProxy::writeSettings() { ++pStart; pEnd = pStart + 1; - while ((*pEnd != '\r') && (*pEnd != '\n') && (*pEnd != '\0')) + while ((*pEnd != '\r') && (*pEnd != '\n') && (*pEnd != '\0')) ++pEnd; Common::String value(pStart + (*pStart == '"' ? 1 : 0), pEnd - pStart - (*pStart == '"' ? 2 : 0)); - + // Update the setting updateSetting(settingName, value); pSrc = pEnd; diff --git a/engines/sword25/util/lua/scummvm_file.h b/engines/sword25/util/lua/scummvm_file.h index a4cbd2a6cf..e8c468ee07 100644 --- a/engines/sword25/util/lua/scummvm_file.h +++ b/engines/sword25/util/lua/scummvm_file.h @@ -37,6 +37,7 @@ private: uint _readPos; Common::String _settings; + Common::String formatDouble(double value); void setupConfigFile(); Common::String getLanguage(); void setLanguage(const Common::String &lang); diff --git a/engines/teenagent/animation.cpp b/engines/teenagent/animation.cpp index af54bca6a4..e945bda1e5 100644 --- a/engines/teenagent/animation.cpp +++ b/engines/teenagent/animation.cpp @@ -115,7 +115,7 @@ void Animation::load(Common::SeekableReadStream *s, Type type) { return; } - uint16 pos = 0; + //uint16 pos = 0; int off = 0; switch (type) { case kTypeLan: @@ -141,7 +141,7 @@ void Animation::load(Common::SeekableReadStream *s, Type type) { frames = new Surface[frames_count]; s->skip(frames_count * 2 - 2); //sizes - pos = s->readUint16LE(); + /*pos = */s->readUint16LE(); //debug(0, "pos?: %04x", pos); for (uint16 i = 0; i < frames_count; ++i) { diff --git a/engines/teenagent/inventory.cpp b/engines/teenagent/inventory.cpp index 8430f42c61..4951b2d940 100644 --- a/engines/teenagent/inventory.cpp +++ b/engines/teenagent/inventory.cpp @@ -58,7 +58,7 @@ Inventory::Inventory(TeenAgentEngine *engine) { for (byte i = 0; i < offsets; ++i) { _offset[i] = READ_LE_UINT16(_items + i * 2 + 1); } - _offset[92] = items_size; + _offset[92] = items_size; Resources *res = Resources::instance(); for (byte i = 0; i <= 92; ++i) { diff --git a/engines/teenagent/inventory.h b/engines/teenagent/inventory.h index 55c58a1c22..61e5364542 100644 --- a/engines/teenagent/inventory.h +++ b/engines/teenagent/inventory.h @@ -75,12 +75,12 @@ private: void backgroundEffect(Graphics::Surface *s); void render(Inventory *inventory, uint item_id, Graphics::Surface *surface, int delta); }; - + Item _graphics[24]; bool _active; Common::Point _mouse; - + bool tryObjectCallback(InventoryObject *obj); InventoryObject *_hoveredObj; diff --git a/engines/teenagent/resources.h b/engines/teenagent/resources.h index c2eb32dbd4..5c08a46489 100644 --- a/engines/teenagent/resources.h +++ b/engines/teenagent/resources.h @@ -44,9 +44,9 @@ public: //void loadOn(Graphics::Surface &surface, int id, uint16 &dst, uint16 *flags); //void loadOns(Graphics::Surface &surface, int id, uint16 &dst); - /* - * PSP (as the other sony playstation consoles - to be confirmed and 'ifdef'ed here too) - * is very sensitive to the number of simultaneously opened files. + /* + * PSP (as the other sony playstation consoles - to be confirmed and 'ifdef'ed here too) + * is very sensitive to the number of simultaneously opened files. * This is an attempt to reduce their number to zero. * TransientFilePack does not keep opened file descriptors and reopens it on each request. */ diff --git a/engines/teenagent/scene.cpp b/engines/teenagent/scene.cpp index ef18b95f5a..4be6c9c31a 100644 --- a/engines/teenagent/scene.cpp +++ b/engines/teenagent/scene.cpp @@ -576,7 +576,7 @@ void Scene::paletteEffect(byte step) { byte *src = res->dseg.ptr(0x6609); byte *dst = palette + 3 * 0xf2; for(byte i = 0; i < 0xd; ++i) { - for(byte c = 0; c < 3; ++c, ++src) + for(byte c = 0; c < 3; ++c, ++src) *dst++ = *src > step? *src - step: 0; } } @@ -812,9 +812,9 @@ bool Scene::render(bool tick_game, bool tick_mark, uint32 delta) { _system->unlockScreen(); continue; } - //removed mark == null. In final scene of chapter 2 mark rendered above table. - //if it'd cause any bugs, add hack here. (_id != 23 && mark == NULL) - if (on_enabled && + //removed mark == null. In final scene of chapter 2 mark rendered above table. + //if it'd cause any bugs, add hack here. (_id != 23 && mark == NULL) + if (on_enabled && debug_features.feature[DebugFeatures::kShowOn]) { on.render(surface, actor_animation_position); } diff --git a/engines/teenagent/teenagent.cpp b/engines/teenagent/teenagent.cpp index ce8862ffd0..724f75be2f 100644 --- a/engines/teenagent/teenagent.cpp +++ b/engines/teenagent/teenagent.cpp @@ -206,7 +206,7 @@ void TeenAgentEngine::deinit() { Common::Error TeenAgentEngine::loadGameState(int slot) { debug(0, "loading from slot %d", slot); - Common::ScopedPtr<Common::InSaveFile> + Common::ScopedPtr<Common::InSaveFile> in(_saveFileMan->openForLoading(Common::String::format("teenagent.%02d", slot))); if (!in) in.reset(_saveFileMan->openForLoading(Common::String::format("teenagent.%d", slot))); @@ -963,10 +963,10 @@ void TeenAgentEngine::playSoundNow(byte id) { void TeenAgentEngine::setMusic(byte id) { debug(0, "starting music %u", id); Resources *res = Resources::instance(); - + if (id != 1) //intro music *res->dseg.ptr(0xDB90) = id; - + if (_gameDescription->flags & ADGF_CD) { byte track2cd[] = {7, 2, 0, 9, 3, 6, 8, 10, 4, 5, 11}; if (id == 0 || id > 11 || track2cd[id - 1] == 0) { diff --git a/engines/testbed/config-params.h b/engines/testbed/config-params.h index e982f62c72..6906d9248e 100644 --- a/engines/testbed/config-params.h +++ b/engines/testbed/config-params.h @@ -34,7 +34,7 @@ class ConfigParams : public Common::Singleton<ConfigParams> { private: friend class Common::Singleton<SingletonBaseType>; ConfigParams(); - + /** * Private variables related to log files. */ @@ -57,16 +57,16 @@ private: TestbedConfigManager *_testbedConfMan; public: - + bool isRerunRequired(); void setRerunFlag(bool flag) { _rerunTests = flag; } bool isSessionInteractive() { return _isInteractive; } void setSessionAsInteractive(bool status) { _isInteractive = status; } - + bool isGameDataFound() { return _isGameDataFound; } void setGameDataFound(bool status) { _isGameDataFound = status; } - + TestbedConfigManager *getTestbedConfigManager() { return _testbedConfMan; } void setTestbedConfigManager(TestbedConfigManager* confMan) { _testbedConfMan = confMan; } @@ -74,7 +74,7 @@ public: void setLogDirectory(const Common::String &dirname) { _logDirectory = dirname; } Common::String &getLogFilename() { return _logFilename; } void setLogFilename(const Common::String &filename) { _logFilename = filename; } - + Common::WriteStream *getLogWriteStream() { return _ws; } Graphics::FontManager::FontUsage getCurrentFontUsageType() { return _displayFont; } void setCurrentFontUsageType(Graphics::FontManager::FontUsage f) { _displayFont = f; } diff --git a/engines/tinsel/coroutine.h b/engines/tinsel/coroutine.h index b62c40b4e5..5bcf1149d9 100644 --- a/engines/tinsel/coroutine.h +++ b/engines/tinsel/coroutine.h @@ -178,10 +178,15 @@ public: #define CORO_RESCHEDULE do { g_scheduler->reschedule(); CORO_SLEEP(1); } while (0) /** - * Stop the currently running coroutine. + * Stop the currently running coroutine and all calling coroutines. + * + * This sets _sleep to -1 rather than 0 so that the context doesn't get + * deleted by CoroContextHolder, since we want CORO_INVOKE_ARGS to + * propogate the _sleep value and return immediately (the scheduler will + * then delete the entire coroutine's state, including all subcontexts). */ #define CORO_KILL_SELF() \ - do { if (&coroParam != &nullContext) { coroParam->_sleep = 0; } return; } while (0) + do { if (&coroParam != &nullContext) { coroParam->_sleep = -1; } return; } while (0) /** @@ -193,8 +198,12 @@ public: /** * Invoke another coroutine. * - * What makes this tricky is that the coroutine we called my yield/sleep, - * and we need to deal with this adequately. + * If the subcontext still exists after the coroutine is invoked, it has + * either yielded/slept or killed itself, and so we copy the _sleep value + * to our own context and return (execution will continue at the case + * statement below, where we loop and call the coroutine again). + * If the subcontext is null, the coroutine ended normally, and we can + * simply break out of the loop and continue execution. * * @param subCoro name of the coroutine-enabled function to invoke * @param ARGS list of arguments to pass to subCoro diff --git a/engines/tinsel/detection_tables.h b/engines/tinsel/detection_tables.h index c86db9e438..116322aa89 100644 --- a/engines/tinsel/detection_tables.h +++ b/engines/tinsel/detection_tables.h @@ -119,7 +119,7 @@ static const TinselGameDescription gameDescriptions[] = { TINSEL_V1, }, - { + { { "dw", "Floppy", @@ -142,7 +142,7 @@ static const TinselGameDescription gameDescriptions[] = { TINSEL_V1, }, - { + { { "dw", "Floppy", @@ -165,7 +165,7 @@ static const TinselGameDescription gameDescriptions[] = { TINSEL_V1, }, - { + { { "dw", "Floppy", diff --git a/engines/tinsel/pcode.cpp b/engines/tinsel/pcode.cpp index 0834e7df24..2ab1e653d4 100644 --- a/engines/tinsel/pcode.cpp +++ b/engines/tinsel/pcode.cpp @@ -140,11 +140,11 @@ static const byte fragment7[] = {OP_IMM | OPSIZE16, FRAGMENT_WORD(908), OP_JUMP static const byte fragment8[] = {OP_IMM | OPSIZE16, FRAGMENT_WORD(910), OP_JUMP | OPSIZE16, FRAGMENT_WORD(644)}; static const byte fragment9[] = {OP_JUMP | OPSIZE8, 123}; static const byte fragment10[] = {OP_IMM | OPSIZE16, FRAGMENT_WORD(160), OP_JUMP | OPSIZE16, FRAGMENT_WORD(136)}; -static const byte fragment11[] = {OP_JMPTRUE | OPSIZE16, FRAGMENT_WORD(1572), +static const byte fragment11[] = {OP_JMPTRUE | OPSIZE16, FRAGMENT_WORD(1572), OP_ONE, OP_LIBCALL | OPSIZE8, 14, // Re-show the cursor OP_IMM | OPSIZE16, FRAGMENT_WORD(322), OP_LIBCALL | OPSIZE8, 46, // Give back the whistle OP_JUMP | OPSIZE16, FRAGMENT_WORD(1661)}; -static const byte fragment12[] = {OP_JMPTRUE | OPSIZE16, FRAGMENT_WORD(1491), +static const byte fragment12[] = {OP_JMPTRUE | OPSIZE16, FRAGMENT_WORD(1491), OP_ONE, OP_LIBCALL | OPSIZE8, 14, // Re-show the cursor OP_IMM | OPSIZE16, FRAGMENT_WORD(322), OP_LIBCALL | OPSIZE8, 46, // Give back the whistle OP_JUMP | OPSIZE16, FRAGMENT_WORD(1568)}; @@ -208,10 +208,10 @@ const WorkaroundEntry workaroundList[] = { // See bug report #2934211. {TINSEL_V1, true, 352601285, 1569, sizeof(fragment11), fragment11}, {TINSEL_V1, false, 352602304, 1488, sizeof(fragment12), fragment12}, - + // DW2: Corrects a bug with global 306 not being cleared if you leave // the marketplace scene whilst D'Blah is talking (even if it's not - // actually audible); returning to the scene and clicking on him multiple + // actually audible); returning to the scene and clicking on him multiple // times would cause the game to crash {TINSEL_V2, true, 1109294728, 0, sizeof(fragment13), fragment13}, diff --git a/engines/tinsel/saveload.cpp b/engines/tinsel/saveload.cpp index 1244168a21..7a973ba4be 100644 --- a/engines/tinsel/saveload.cpp +++ b/engines/tinsel/saveload.cpp @@ -483,7 +483,7 @@ static void DoSave() { NeedLoad = true; if (SaveSceneName == NULL) { - // Generate a new unique save name + // Generate a new unique save name int i; int ano = 1; // Allocated number diff --git a/engines/tinsel/sched.cpp b/engines/tinsel/sched.cpp index b24d6bf9b8..d6cd806eb2 100644 --- a/engines/tinsel/sched.cpp +++ b/engines/tinsel/sched.cpp @@ -70,6 +70,7 @@ Scheduler::Scheduler() { active = new PROCESS; active->pPrevious = NULL; + active->pNext = NULL; g_scheduler = this; // FIXME HACK } @@ -113,6 +114,14 @@ void Scheduler::reset() { memset(processList, 'S', MAX_PROCESSES * sizeof(PROCESS)); } + // Kill all running processes (i.e. free memory allocated for their state). + PROCESS *pProc = active->pNext; + while (pProc != NULL) { + delete pProc->state; + pProc->state = 0; + pProc = pProc->pNext; + } + // no active processes pCurrent = active->pNext = NULL; diff --git a/engines/tinsel/tinlib.cpp b/engines/tinsel/tinlib.cpp index 7613c1a897..7fbec69cbf 100644 --- a/engines/tinsel/tinlib.cpp +++ b/engines/tinsel/tinlib.cpp @@ -214,39 +214,39 @@ static const MASTER_LIB_CODES DW1_CODES[] = { }; static const MASTER_LIB_CODES DW2DEMO_CODES[] = { - ACTORBRIGHTNESS, ACTORDIRECTION, ACTORPALETTE, ACTORPRIORITY, + ACTORBRIGHTNESS, ACTORDIRECTION, ACTORPALETTE, ACTORPRIORITY, ACTORREF, ACTORRGB, ACTORSCALE, ACTORXPOS, ACTORYPOS, ADDHIGHLIGHT, ADDINV, ADDINV1, ADDINV2, ADDOPENINV, ADDTOPIC, - BACKGROUND, CALLACTOR, CALLGLOBALPROCESS, CALLOBJECT, + BACKGROUND, CALLACTOR, CALLGLOBALPROCESS, CALLOBJECT, CALLPROCESS, CALLSCENE, CALLTAG, CAMERA, CDCHANGESCENE, CDDOCHANGE, CDLOAD, CDPLAY, CLEARHOOKSCENE, CLOSEINVENTORY, - CONTROL, CONVERSATION, CURSOR, CURSORXPOS, CURSORYPOS, - DECCONVW, DECCURSOR, DECFLAGS, DECINV1, DECINV2, DECINVW, + CONTROL, CONVERSATION, CURSOR, CURSORXPOS, CURSORYPOS, + DECCONVW, DECCURSOR, DECFLAGS, DECINV1, DECINV2, DECINVW, DECLEAD, DECSCALE, DECTAGFONT, DECTALKFONT, DELTOPIC, DIMMUSIC, DROP, DROPOUT, EFFECTACTOR, ENABLEMENU, ENDACTOR, - ESCAPEOFF, ESCAPEON, EVENT, FACETAG, FADEIN, FADEOUT, FRAMEGRAB, - FREEZECURSOR, GETINVLIMIT, GHOST, GLOBALVAR, HASRESTARTED, - HAVE, HELDOBJECT, HIDEACTOR, HIDEBLOCK, HIDEEFFECT, HIDEPATH, + ESCAPEOFF, ESCAPEON, EVENT, FACETAG, FADEIN, FADEOUT, FRAMEGRAB, + FREEZECURSOR, GETINVLIMIT, GHOST, GLOBALVAR, HASRESTARTED, + HAVE, HELDOBJECT, HIDEACTOR, HIDEBLOCK, HIDEEFFECT, HIDEPATH, HIDEREFER, HIDETAG, HOLD, HOOKSCENE, IDLETIME, INSTANTSCROLL, - INVENTORY, INVPLAY, INWHICHINV, KILLACTOR, KILLGLOBALPROCESS, - KILLPROCESS, LOCALVAR, MOVECURSOR, MOVETAG, MOVETAGTO, NEWSCENE, - NOBLOCKING, NOPAUSE, NOSCROLL, OFFSET, OTHEROBJECT, PAUSE, PLAY, - PLAYMUSIC, PLAYRTF, PLAYSAMPLE, POINTACTOR, POINTTAG, POSTACTOR, + INVENTORY, INVPLAY, INWHICHINV, KILLACTOR, KILLGLOBALPROCESS, + KILLPROCESS, LOCALVAR, MOVECURSOR, MOVETAG, MOVETAGTO, NEWSCENE, + NOBLOCKING, NOPAUSE, NOSCROLL, OFFSET, OTHEROBJECT, PAUSE, PLAY, + PLAYMUSIC, PLAYRTF, PLAYSAMPLE, POINTACTOR, POINTTAG, POSTACTOR, POSTGLOBALPROCESS, POSTOBJECT, POSTPROCESS, POSTTAG, PRINT, PRINTCURSOR, PRINTOBJ, PRINTTAG, QUITGAME, RANDOM, RESETIDLETIME, - RESTARTGAME, RESTORESCENE, RUNMODE, SAVESCENE, SAY, SAYAT, - SCALINGREELS, SCREENXPOS, SCREENYPOS, SCROLL, SCROLLPARAMETERS, + RESTARTGAME, RESTORESCENE, RUNMODE, SAVESCENE, SAY, SAYAT, + SCALINGREELS, SCREENXPOS, SCREENYPOS, SCROLL, SCROLLPARAMETERS, SENDACTOR, SENDGLOBALPROCESS, SENDOBJECT, SENDPROCESS, SENDTAG, - SETBRIGHTNESS, SETINVLIMIT, SETINVSIZE, SETLANGUAGE, SETPALETTE, - SETSYSTEMSTRING, SETSYSTEMVAR, SHELL, SHOWACTOR, SHOWBLOCK, + SETBRIGHTNESS, SETINVLIMIT, SETINVSIZE, SETLANGUAGE, SETPALETTE, + SETSYSTEMSTRING, SETSYSTEMVAR, SHELL, SHOWACTOR, SHOWBLOCK, SHOWEFFECT, SHOWPATH, SHOWREFER, SHOWTAG, STAND, STANDTAG, - STARTGLOBALPROCESS, STARTPROCESS, STARTTIMER, STOPWALK, SUBTITLES, - SWALK, SYSTEMVAR, TAGTAGXPOS, TAGTAGYPOS, TAGWALKXPOS, TAGWALKYPOS, + STARTGLOBALPROCESS, STARTPROCESS, STARTTIMER, STOPWALK, SUBTITLES, + SWALK, SYSTEMVAR, TAGTAGXPOS, TAGTAGYPOS, TAGWALKXPOS, TAGWALKYPOS, TALK, TALKAT, TALKPALETTEINDEX, TALKRGB, TALKVIA, THISOBJECT, - THISTAG, TIMER, TOPIC, TOPPLAY, TOPWINDOW, TRANSLUCENTINDEX, - UNDIMMUSIC, UNHOOKSCENE, WAITFRAME, WAITKEY, WAITSCROLL, WAITTIME, - WALK, WALKED, WALKEDPOLY, WALKEDTAG, WALKINGACTOR, WALKPOLY, - WALKTAG, WALKXPOS, WALKYPOS, WHICHCD, WHICHINVENTORY, + THISTAG, TIMER, TOPIC, TOPPLAY, TOPWINDOW, TRANSLUCENTINDEX, + UNDIMMUSIC, UNHOOKSCENE, WAITFRAME, WAITKEY, WAITSCROLL, WAITTIME, + WALK, WALKED, WALKEDPOLY, WALKEDTAG, WALKINGACTOR, WALKPOLY, + WALKTAG, WALKXPOS, WALKYPOS, WHICHCD, WHICHINVENTORY, HIGHEST_LIBCODE }; diff --git a/engines/toon/path.cpp b/engines/toon/path.cpp index c116d63663..dde7be07d0 100644 --- a/engines/toon/path.cpp +++ b/engines/toon/path.cpp @@ -406,8 +406,8 @@ void PathFinding::init(Picture *mask) { _height = mask->getHeight(); _currentMask = mask; _heap->unload(); - // In order to reduce memory fragmentation on small devices, we use the maximum - // possible size here which is TOON_BACKBUFFER_WIDTH. Even though this is + // In order to reduce memory fragmentation on small devices, we use the maximum + // possible size here which is TOON_BACKBUFFER_WIDTH. Even though this is // 1280 as opposed to the possible 640, it actually helps memory allocation on // those devices. _heap->init(TOON_BACKBUFFER_WIDTH * _height); // should really be _width diff --git a/engines/toon/tools.cpp b/engines/toon/tools.cpp index c9aa470deb..c2ee8acf8a 100644 --- a/engines/toon/tools.cpp +++ b/engines/toon/tools.cpp @@ -372,7 +372,7 @@ int32 RncDecoder::unpackM1(const void *input, uint16 inputSize, void *output) { _dstPtr += inputLength; _srcPtr += inputLength; _inputByteLeft -= inputLength; - uint16 a; + uint16 a; if (_inputByteLeft <= 0) a = 0; else if (_inputByteLeft == 1) diff --git a/engines/toon/toon.cpp b/engines/toon/toon.cpp index 0e0978b3d6..cb41db1967 100644 --- a/engines/toon/toon.cpp +++ b/engines/toon/toon.cpp @@ -114,7 +114,7 @@ void ToonEngine::init() { _drew = _characters[0]; _flux = _characters[1]; - + // preload walk anim for flux and drew _drew->loadWalkAnimation("STNDWALK.CAF"); diff --git a/engines/toon/toon.h b/engines/toon/toon.h index 65c6ba0234..cad684d590 100644 --- a/engines/toon/toon.h +++ b/engines/toon/toon.h @@ -204,7 +204,7 @@ public: void viewInventoryItem(Common::String str, int32 lineId, int32 itemDest); void storePalette(); void restorePalette(); - const char *getSpecialConversationMusic(int32 locationId); + const char *getSpecialConversationMusic(int32 locationId); void playRoomMusic(); void waitForScriptStep(); void doMagnifierEffect(); @@ -320,7 +320,7 @@ public: } Common::Error saveGameState(int slot, const Common::String &desc) { - + return (saveGame(slot, desc) ? Common::kWritingFailed : Common::kNoError); } @@ -381,7 +381,7 @@ protected: Common::Array<Common::Rect> _oldDirtyRects; bool _dirtyAll; - + AnimationInstance *_cursorAnimationInstance; Animation *_cursorAnimation; diff --git a/engines/tsage/blueforce_logic.cpp b/engines/tsage/blueforce_logic.cpp index 9813bef6f7..d266d5e1d9 100644 --- a/engines/tsage/blueforce_logic.cpp +++ b/engines/tsage/blueforce_logic.cpp @@ -30,7 +30,7 @@ namespace tSage { void BlueForceGame::start() { // Start the game _globals->_sceneManager.changeScene(20); - + _globals->_events.setCursor(CURSOR_WALK); } diff --git a/engines/tsage/converse.cpp b/engines/tsage/converse.cpp index 5fa36142e7..b475310533 100644 --- a/engines/tsage/converse.cpp +++ b/engines/tsage/converse.cpp @@ -231,7 +231,7 @@ void SequenceManager::signal() { case 26: v1 = getNextValue(); v2 = getNextValue(); - _soundHandler.startSound(v1, v2 ? this : NULL, 127); + _soundHandler.play(v1, v2 ? this : NULL, 127); break; case 27: { v1 = getNextValue(); diff --git a/engines/tsage/converse.h b/engines/tsage/converse.h index 6876fa41cb..13c490e995 100644 --- a/engines/tsage/converse.h +++ b/engines/tsage/converse.h @@ -25,6 +25,7 @@ #include "tsage/core.h" #include "tsage/dialogs.h" +#include "tsage/sound.h" namespace tSage { @@ -50,7 +51,7 @@ public: int _objectIndex; SceneObject *_sceneObject; SceneObject *_objectList[6]; - SoundHandler _soundHandler; + ASound _soundHandler; public: SequenceManager(); diff --git a/engines/tsage/core.cpp b/engines/tsage/core.cpp index ed2b03ebc4..4603379c78 100644 --- a/engines/tsage/core.cpp +++ b/engines/tsage/core.cpp @@ -31,6 +31,7 @@ #include "tsage/scenes.h" #include "tsage/staticres.h" #include "tsage/globals.h" +#include "tsage/sound.h" namespace tSage { @@ -2961,55 +2962,6 @@ int SceneRegions::indexOf(const Common::Point &pt) { /*--------------------------------------------------------------------------*/ -SoundHandler::SoundHandler() { - _action = NULL; - _field280 = -1; - if (_globals) - _globals->_sceneListeners.push_back(this); -} - -SoundHandler::~SoundHandler() { - if (_globals) - _globals->_sceneListeners.remove(this); -} - -void SoundHandler::dispatch() { - EventHandler::dispatch(); - int v = _sound.proc12(); - - if (v != -1) { - _field280 = v; - _sound.proc2(-1); - - if (_action) - _action->signal(); - } - - if (_field280 != -1) { - // FIXME: Hardcoded to only flag a sound ended if an action has been set - if (_action) { -// if (!_sound.proc3()) { - _field280 = -1; - if (_action) { - _action->signal(); - _action = NULL; - } - } - } -} - -void SoundHandler::startSound(int soundNum, Action *action, int volume) { - _action = action; - _field280 = 0; - setVolume(volume); - _sound.startSound(soundNum); - - warning("TODO: SoundHandler::startSound"); -} - - -/*--------------------------------------------------------------------------*/ - void SceneItemList::addItems(SceneItem *first, ...) { va_list va; va_start(va, first); @@ -3490,8 +3442,9 @@ void SceneHandler::postInit(SceneObjectList *OwnerList) { _globals->_scenePalette.loadPalette(0); _globals->_scenePalette.refresh(); - // TODO: Bunch of other scene related setup goes here _globals->_soundManager.postInit(); + _globals->_soundManager.buildDriverList(true); + _globals->_soundManager.installConfigDrivers(); _globals->_game->start(); } diff --git a/engines/tsage/core.h b/engines/tsage/core.h index 92907addbc..b86e2f63fe 100644 --- a/engines/tsage/core.h +++ b/engines/tsage/core.h @@ -33,7 +33,6 @@ #include "tsage/graphics.h" #include "tsage/resources.h" #include "tsage/saveload.h" -#include "tsage/sound.h" namespace tSage { @@ -719,74 +718,6 @@ public: /*--------------------------------------------------------------------------*/ -class GameSoundHandler { -public: - void proc1() { - warning("TODO: GameSoundHandler::proc1"); - } - void proc5(int v) { - warning("TODO: GameSoundHandler::proc5"); - } - void proc11(int v1, int v2, int v3, int v4) { - warning("TODO: GameSoundHandler::proc11"); - } - int proc12() { - // TODO - return -1; - } - void proc2(int v) { - // TODO - } - int proc3() { - return 0; - } - void setVolume(int volume) { - warning("TODO GameSoundHandler::setVolume"); - } - void startSound(int soundNum) { - warning("TODO GameSoundHandler::startSound"); - } -}; - -class SoundHandler : public EventHandler { -public: - GameSoundHandler _sound; - Action *_action; - int _field280; -public: - SoundHandler(); - ~SoundHandler(); - - void startSound(int soundNum, Action *action = NULL, int volume = 127); - void proc1(Action *action) { - proc11(0, 5, 10, 1, action); - } - void proc2(int v) { - warning("TODO: SoundHandler::proc2"); - } - void proc3() { - warning("TODO: SoundHandler::proc5"); - } - void proc4() { - _sound.proc1(); - } - void proc5(int v) { - _sound.proc5(v); - } - void proc11(int v1, int v2, int v3, int v4, Action *action) { - if (action) - _action = action; - - _sound.proc11(v1, v2, v3, v4); - } - void setVolume(int volume) { _sound.setVolume(volume); } - - virtual Common::String getClassName() { return "SoundHandler"; } - virtual void dispatch(); -}; - -/*--------------------------------------------------------------------------*/ - class SceneItemList : public SynchronizedList<SceneItem *> { public: void addItems(SceneItem *first, ...); diff --git a/engines/tsage/debugger.cpp b/engines/tsage/debugger.cpp index 5288c98b72..9277fd429a 100644 --- a/engines/tsage/debugger.cpp +++ b/engines/tsage/debugger.cpp @@ -63,7 +63,7 @@ bool Debugger::Cmd_Scene(int argc, const char **argv) { if (argc < 2) { DebugPrintf("Usage: %s <scene number> [prior scene #]\n", argv[0]); return true; - } + } if (argc == 3) _globals->_sceneManager._sceneNumber = strToInt(argv[2]); @@ -222,7 +222,7 @@ bool Debugger::Cmd_ListObjects(int argc, const char **argv) { DebugPrintf("Usage: %s\n", argv[0]); return true; } - + DebugPrintf("Available objects for this game are:\n"); DebugPrintf("0 - Stunner\n"); DebugPrintf("1 - Scanner\n"); @@ -393,7 +393,7 @@ bool Debugger::Cmd_Hotspots(int argc, const char **argv) { // Lock the background surface for access Graphics::Surface destSurface = _globals->_sceneManager._scene->_backSurface.lockSurface(); - + // Iterate through the scene items SynchronizedList<SceneItem *>::iterator i; for (i = _globals->_sceneItems.reverse_begin(); i != _globals->_sceneItems.end(); --i, ++colIndex) { @@ -418,7 +418,7 @@ bool Debugger::Cmd_Hotspots(int argc, const char **argv) { LineSliceSet set = r.getLineSlices(y); for (uint p = 0; p < set.items.size(); ++p) - destSurface.hLine(set.items[p].xs - sceneBounds.left, y - sceneBounds.top, + destSurface.hLine(set.items[p].xs - sceneBounds.left, y - sceneBounds.top, set.items[p].xe - sceneBounds.left - 1, colIndex); } } diff --git a/engines/tsage/detection_tables.h b/engines/tsage/detection_tables.h index fb97e40449..2b64222425 100644 --- a/engines/tsage/detection_tables.h +++ b/engines/tsage/detection_tables.h @@ -32,7 +32,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("ring.rlb", "466f0e6492d9d0f34d35c5cd088de90f", 37847618), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_Ringworld, @@ -46,7 +46,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("ring.rlb", "7b7f0c5b37b58fa5ec06ebb2ca0d0d9d", 8438770), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_Ringworld, @@ -66,14 +66,13 @@ static const tSageGameDescription gameDescriptions[] = { GType_Ringworld, GF_FLOPPY | GF_DEMO }, -#if 0 - // FIXME: Compute new MD5s based on 5000 bytes instead of 0 (unlimited) + // Ringworld English Floppy Demo #2 version { { "ring", "Floppy Demo", - AD_ENTRY1s("demoring.rlb", "9ecf48e088a0d475778fab480b3dbdd0", 832206), + AD_ENTRY1s("demoring.rlb", "64050e1806203b15bb03876140eb4f56", 832206), Common::EN_ANY, Common::kPlatformPC, ADGF_DEMO, @@ -82,6 +81,7 @@ static const tSageGameDescription gameDescriptions[] = { GType_Ringworld, GF_FLOPPY | GF_DEMO | GF_ALT_REGIONS }, +#if 0 // FIXME: Compute new MD5s based on 5000 bytes instead of 0 (unlimited) // Blue Force floppy { @@ -91,7 +91,7 @@ static const tSageGameDescription gameDescriptions[] = { AD_ENTRY1s("blue.rlb", "17c3993415e8a2cf93040eef7e88ec93", 1156508), Common::EN_ANY, Common::kPlatformPC, - ADGF_NO_FLAGS, + ADGF_UNSTABLE, Common::GUIO_NONE }, GType_BlueForce, diff --git a/engines/tsage/dialogs.cpp b/engines/tsage/dialogs.cpp index c1bd1d027f..86fbbc8e43 100644 --- a/engines/tsage/dialogs.cpp +++ b/engines/tsage/dialogs.cpp @@ -43,7 +43,7 @@ MessageDialog::MessageDialog(const Common::String &message, const Common::String const Common::String &btn2Message) : GfxDialog() { // Set up the message addElements(&_msg, &_btn1, NULL); - + _msg.set(message, 200, ALIGN_LEFT); _msg._bounds.moveTo(0, 0); _defaultButton = &_btn1; diff --git a/engines/tsage/events.cpp b/engines/tsage/events.cpp index 9df2a7ccd6..a24f65421b 100644 --- a/engines/tsage/events.cpp +++ b/engines/tsage/events.cpp @@ -48,6 +48,7 @@ bool EventsClass::pollEvent() { _priorFrameTime = milli; ++_frameNumber; + // Update screen g_system->updateScreen(); } @@ -280,7 +281,7 @@ void EventsClass::hideCursor() { setCursor(CURSOR_NONE); } -bool EventsClass::isCursorVisible() const { +bool EventsClass::isCursorVisible() const { return !_globals->getFlag(122); } @@ -307,7 +308,7 @@ void EventsClass::delay(int numFrames) { void EventsClass::listenerSynchronize(Serializer &s) { s.syncAsUint32LE(_frameNumber); s.syncAsUint32LE(_prevDelayFrame); - + if (s.getVersion() >= 5) { s.syncAsSint16LE(_currentCursor); s.syncAsSint16LE(_lastCursor); diff --git a/engines/tsage/globals.cpp b/engines/tsage/globals.cpp index 863f1458b1..e54f1073b0 100644 --- a/engines/tsage/globals.cpp +++ b/engines/tsage/globals.cpp @@ -117,9 +117,9 @@ Globals::Globals() : _dialogCenter(160, 140), _gfxManagerInstance(_screenSurface } Globals::~Globals() { - _globals = NULL; delete _inventory; delete _game; + _globals = NULL; } void Globals::reset() { @@ -140,7 +140,7 @@ void Globals::synchronize(Serializer &s) { s.syncAsSint32LE(_gfxColors.foreground); s.syncAsSint32LE(_fontColors.background); s.syncAsSint32LE(_fontColors.foreground); - + if (s.getVersion() >= 4) { s.syncAsByte(_unkColor1); s.syncAsByte(_unkColor2); diff --git a/engines/tsage/globals.h b/engines/tsage/globals.h index 8212387ed1..3635fcc3fa 100644 --- a/engines/tsage/globals.h +++ b/engines/tsage/globals.h @@ -28,6 +28,7 @@ #include "tsage/dialogs.h" #include "tsage/scenes.h" #include "tsage/events.h" +#include "tsage/sound.h" #include "tsage/saveload.h" namespace tSage { @@ -58,7 +59,7 @@ public: SynchronizedList<EventHandler *> _sceneListeners; bool _flags[256]; Player _player; - SoundHandler _soundHandler; + ASound _soundHandler; InvObjectList *_inventory; Region _paneRegions[2]; int _paneRefreshFlag[2]; diff --git a/engines/tsage/graphics.cpp b/engines/tsage/graphics.cpp index 25dc897ecd..23f5f22573 100644 --- a/engines/tsage/graphics.cpp +++ b/engines/tsage/graphics.cpp @@ -846,7 +846,7 @@ void GfxButton::setDefaults() { gfxManager._font.getStringBounds(_message.c_str(), tempRect, 240); tempRect.right = ((tempRect.right + 15) / 16) * 16; - // Set the button bounds + // Set the button bounds tempRect.collapse(-_globals->_gfxEdgeAdjust, -_globals->_gfxEdgeAdjust); if (_vm->getFeatures() & GF_CD) --tempRect.top; @@ -866,7 +866,7 @@ void GfxButton::draw() { // Set the font and color gfxManager._font.setFontNumber(_fontNumber); - // + // gfxManager._font._colors.foreground = this->_unkColor1; gfxManager._font._colors2.background = this->_unkColor2; gfxManager._font._colors2.foreground = this->_unkColor3; diff --git a/engines/tsage/resources.cpp b/engines/tsage/resources.cpp index 676d319ba9..d24c564a1f 100644 --- a/engines/tsage/resources.cpp +++ b/engines/tsage/resources.cpp @@ -66,7 +66,9 @@ uint16 MemoryManager::allocate(uint32 size) { byte *MemoryManager::allocate2(uint32 size) { uint32 idx = allocate(size); - return lock(idx); + byte *result = lock(idx); + Common::set_to(result, result + size, 0); + return result; } byte *MemoryManager::lock(uint32 handle) { diff --git a/engines/tsage/ringworld_demo.cpp b/engines/tsage/ringworld_demo.cpp index de8dbf8c12..fa7511808f 100644 --- a/engines/tsage/ringworld_demo.cpp +++ b/engines/tsage/ringworld_demo.cpp @@ -30,7 +30,7 @@ namespace tSage { void RingworldDemoGame::start() { // Start the demo's single scene _globals->_sceneManager.changeScene(1); - + _globals->_events.setCursor(CURSOR_NONE); } @@ -101,19 +101,19 @@ void RingworldDemoScene::postInit(SceneObjectList *OwnerList) { } void RingworldDemoScene::signal() { - _soundHandler.startSound(4); + _soundHandler.play(4); _actor1.postInit(); _actor2.postInit(); _actor3.postInit(); _actor4.postInit(); _actor5.postInit(); _actor6.postInit(); - + setAction(&_sequenceManager, this, 22, &_actor1, &_actor2, &_actor3, &_actor4, &_actor5, &_actor6, NULL); } void RingworldDemoScene::process(Event &event) { - + } } // End of namespace tSage diff --git a/engines/tsage/ringworld_demo.h b/engines/tsage/ringworld_demo.h index 7492c1e871..3e7431e107 100644 --- a/engines/tsage/ringworld_demo.h +++ b/engines/tsage/ringworld_demo.h @@ -28,6 +28,7 @@ #include "tsage/core.h" #include "tsage/scenes.h" #include "tsage/globals.h" +#include "tsage/sound.h" namespace tSage { @@ -46,7 +47,7 @@ public: SequenceManager _sequenceManager; SceneObject _actor1, _actor2, _actor3; SceneObject _actor4, _actor5, _actor6; - SoundHandler _soundHandler; + ASound _soundHandler; virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void process(Event &event); diff --git a/engines/tsage/ringworld_logic.cpp b/engines/tsage/ringworld_logic.cpp index 95c9da9fe7..2b5b84ab64 100644 --- a/engines/tsage/ringworld_logic.cpp +++ b/engines/tsage/ringworld_logic.cpp @@ -268,7 +268,7 @@ void SceneArea::setup(int resNum, int rlbNum, int subNum, int actionId) { } void SceneArea::draw2() { - _surface.draw(Common::Point(_bounds.left, _bounds.top)); + _surface.draw(Common::Point(_bounds.left, _bounds.top)); } void SceneArea::display() { @@ -619,7 +619,7 @@ void SpeakerSKL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(203, 120)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(7013); _object2.setStrip2(1); @@ -651,7 +651,7 @@ void SpeakerQL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(128, 146)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2612); _object2.setStrip2(1); @@ -684,7 +684,7 @@ void SpeakerSR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(224, 198)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2813); _object2.setStrip2(1); @@ -725,7 +725,7 @@ void SpeakerSL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(95, 198)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2812); _object2.setStrip2(1); @@ -757,7 +757,7 @@ void SpeakerQR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(191, 146)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2613); _object2.setStrip2(1); @@ -789,7 +789,7 @@ void SpeakerQU::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(116, 120)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(7021); _object2.setStrip2(1); @@ -818,7 +818,7 @@ void SpeakerCR::setText(const Common::String &msg) { _object1.fixPriority(255); _object1.setPosition(Common::Point(219, 168)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(9011); _object2.setStrip2(1); @@ -847,7 +847,7 @@ void SpeakerMR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(220, 143)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2713); _object2.setStrip2(1); @@ -879,7 +879,7 @@ void SpeakerSAL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(185, 200)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2853); _object2.setStrip2(1); @@ -910,7 +910,7 @@ void SpeakerML::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(99, 143)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(2712); _object2.setStrip2(1); @@ -941,7 +941,7 @@ void SpeakerCHFL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(205, 116)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(4113); _object2.setStrip2(1); @@ -972,7 +972,7 @@ void SpeakerCHFR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(103, 116)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(4112); _object2.setStrip2(1); @@ -1003,7 +1003,7 @@ void SpeakerPL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(107, 117)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(4062); _object2.setStrip2(1); @@ -1048,7 +1048,7 @@ void SpeakerPR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(212, 117)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(4063); _object2.setStrip2(2); @@ -1093,7 +1093,7 @@ void SpeakerCDR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(208, 97)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(4163); _object2.setStrip2(2); @@ -1124,7 +1124,7 @@ void SpeakerCDL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(112, 97)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(4162); _object2.setStrip2(2); @@ -1155,7 +1155,7 @@ void SpeakerFLL::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(216, 129)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(5223); _object2.setStrip2(1); @@ -1186,7 +1186,7 @@ void SpeakerBatR::setText(const Common::String &msg) { _object1._frame = 1; _object1.setPosition(Common::Point(137, 122)); _object1.animate(ANIM_MODE_7, 0, NULL); - + _object2.postInit(&_objectList); _object2.setVisage(5361); _object2.setStrip2(1); @@ -1346,7 +1346,7 @@ void RingworldGame::start() { void RingworldGame::restart() { _globals->_scenePalette.clearListeners(); - _globals->_soundHandler.proc3(); + _globals->_soundHandler.stop(); // Reset the flags _globals->reset(); diff --git a/engines/tsage/ringworld_scenes1.cpp b/engines/tsage/ringworld_scenes1.cpp index 6960788db3..717841d4fc 100644 --- a/engines/tsage/ringworld_scenes1.cpp +++ b/engines/tsage/ringworld_scenes1.cpp @@ -98,7 +98,7 @@ void Scene10::Action1::signal() { scene->_object4.animate(ANIM_MODE_6, this); break; case 10: - _globals->_soundHandler.proc1(this); + _globals->_soundHandler.fadeOut(this); break; case 11: _globals->_scenePalette.clearListeners(); @@ -185,7 +185,7 @@ void Scene10::postInit(SceneObjectList *OwnerList) { _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; setAction(&_action1); - _globals->_soundHandler.startSound(5); + _globals->_soundHandler.play(5); } void Scene10::stripCallback(int v) { @@ -232,7 +232,7 @@ void Scene15::Action1::signal() { Common::Point pt(160, 100); NpcMover *mover = new NpcMover(); scene->_object1.addMover(mover, &pt, this); - scene->_soundHandler.startSound(7); + scene->_soundHandler.play(7); break; } case 3: @@ -256,7 +256,7 @@ void Scene15::postInit(SceneObjectList *OwnerList) { loadScene(15); Scene::postInit(); setZoomPercents(0, 100, 200, 100); - _globals->_soundHandler.startSound(6); + _globals->_soundHandler.play(6); setAction(&_action1); } @@ -276,7 +276,7 @@ void Scene20::Action1::signal() { scene->_stripManager.start(20, this); break; case 2: - _globals->_soundHandler.proc1(this); + _globals->_soundHandler.fadeOut(this); break; case 3: _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; @@ -341,8 +341,8 @@ void Scene20::Action2::signal() { break; } case 8: - scene->_sound.proc4(); - scene->_sound.proc1(this); + scene->_sound.release(); + scene->_sound.fadeOut(this); break; case 9: SceneItem::display(0, 0, LIST_END); @@ -400,8 +400,8 @@ void Scene20::Action3::signal() { break; } case 6: - scene->_sound.startSound(60, this, 127); - _globals->_soundHandler.proc4(); + scene->_sound.play(60, this, 127); + _globals->_soundHandler.release(); break; case 7: _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; @@ -450,7 +450,7 @@ void Scene20::Action4::signal() { break; } case 4: { - scene->_sound.startSound(28); + scene->_sound.play(28); scene->_sceneObject4.postInit(); scene->_sceneObject4.setVisage(21); scene->_sceneObject4.setStrip(3); @@ -463,7 +463,7 @@ void Scene20::Action4::signal() { break; } case 5: { - scene->_sound.startSound(42); + scene->_sound.play(42); scene->_sceneObject4.remove(); scene->_SceneObjectExt.setVisage(21); scene->_SceneObjectExt.setStrip(1); @@ -487,7 +487,7 @@ void Scene20::Action4::signal() { break; } case 6: { - scene->_sound.startSound(42); + scene->_sound.play(42); scene->_SceneObjectExt.setStrip(2); scene->_SceneObjectExt.animate(ANIM_MODE_2, NULL); @@ -506,7 +506,7 @@ void Scene20::Action4::signal() { case 7: _globals->_player.setStrip(2); _globals->_player.animate(ANIM_MODE_2, NULL); - scene->_sound.startSound(77, this, 127); + scene->_sound.play(77, this, 127); break; case 8: _globals->_game->endGame(20, 0); @@ -549,15 +549,15 @@ void Scene20::postInit(SceneObjectList *OwnerList) { _SceneObjectExt._moveDiff = Common::Point(10, 10); _sceneObject3._moveDiff = Common::Point(10, 10); - _globals->_soundHandler.startSound(20); - _sound.startSound(21); - _sound.proc5(1); + _globals->_soundHandler.play(20); + _sound.play(21); + _sound.holdAt(true); setAction(&_action2); _sceneBounds = Rect(320, 0, 640, 200); } else if (_globals->_sceneManager._previousScene == 60) { // Evasion - _sound.startSound(30); + _sound.play(30); _globals->_player.postInit(); _globals->_player.setVisage(20); _globals->_player.setPosition(Common::Point(588, 79)); @@ -605,7 +605,7 @@ void Scene20::postInit(SceneObjectList *OwnerList) { _speakerGameText.setTextPos(Common::Point(350, 20)); _speakerGameText._textWidth = 260; - _globals->_soundHandler.startSound(8); + _globals->_soundHandler.play(8); _sceneBounds = Rect(320, 0, 640, 200); } @@ -669,7 +669,7 @@ void Scene30::BeamAction::signal() { case 2: // Hide the beam and lower the player's hand - scene->_sound.startSound(10, NULL, 127); + scene->_sound.play(10, NULL, 127); _globals->_player.animate(ANIM_MODE_6, this); scene->_beam.remove(); break; @@ -693,14 +693,14 @@ void Scene30::BeamAction::signal() { case 4: // Open the door - scene->_sound.startSound(11, NULL, 127); + scene->_sound.play(11, NULL, 127); scene->_door.animate(ANIM_MODE_5, this); break; case 5: // Run the Kzin's talk sequence - scene->_sound.startSound(13, NULL, 127); - _globals->_soundHandler.startSound(12, NULL, 127); + scene->_sound.play(13, NULL, 127); + _globals->_soundHandler.play(12, NULL, 127); scene->_stripManager.start((scene->_sceneMode == 0) ? 30 : 37, this); break; @@ -732,7 +732,7 @@ void Scene30::KzinAction::signal() { setDelay(1200); break; case 1: - _globals->_soundHandler.proc2(0); + _globals->_soundHandler.fadeOut(NULL); _globals->_player.disableControl(); setAction(&scene->_sequenceManager, _globals->_sceneManager._scene, 31, &scene->_kzin, &scene->_door, NULL); break; @@ -772,12 +772,12 @@ void Scene30::RingAction::signal() { } case 3: - scene->_sound.startSound(11, NULL, 127); + scene->_sound.play(11, NULL, 127); scene->_door.animate(ANIM_MODE_6, this); break; case 4: { - scene->_sound.startSound(13, NULL, 127); + scene->_sound.play(13, NULL, 127); NpcMover *kzinMover = new NpcMover(); Common::Point pt(354, 5); scene->_kzin.addMover(kzinMover, &pt, this); @@ -955,7 +955,7 @@ void Scene40::Action1::signal() { scene->_doorway.setVisage(46); scene->_doorway.setPosition(Common::Point(305, 61)); scene->_doorway.animate(ANIM_MODE_5, this); - scene->_soundHandler.startSound(25); + scene->_soundHandler.play(25); break; case 3: scene->_doorway.hide(); @@ -976,7 +976,7 @@ void Scene40::Action1::signal() { scene->_assassin.setFrame(1); scene->_assassin.setPosition(Common::Point(13, 171)); scene->_assassin.animate(ANIM_MODE_5, this); - scene->_soundHandler.startSound(25); + scene->_soundHandler.play(25); break; case 5: scene->_doorway.show(); @@ -1011,7 +1011,7 @@ void Scene40::Action1::signal() { break; } case 10: { - scene->_soundHandler.startSound(27); + scene->_soundHandler.play(27); Common::Point pt(223, 184); NpcMover *mover = new NpcMover(); scene->_dyingKzin.addMover(mover, &pt, this); @@ -1024,7 +1024,7 @@ void Scene40::Action1::signal() { break; } case 12: { - _globals->_soundHandler.startSound(26); + _globals->_soundHandler.play(26); _globals->_player._uiEnabled = true; scene->_assassin.setVisage(42); scene->_assassin.setPosition(Common::Point(4, 191)); @@ -1043,7 +1043,7 @@ void Scene40::Action1::signal() { scene->_assassin.setStrip(1); scene->_assassin.setFrame(1); scene->_assassin.animate(ANIM_MODE_5, this); - scene->_soundHandler.startSound(28); + scene->_soundHandler.play(28); break; case 15: _globals->_player.disableControl(); @@ -1057,7 +1057,7 @@ void Scene40::Action1::signal() { _globals->_player.animate(ANIM_MODE_5, this); break; case 16: - _globals->_soundHandler.startSound(77, this); + _globals->_soundHandler.play(77, this); break; case 17: _globals->_game->endGame(40, 20); @@ -1083,7 +1083,7 @@ void Scene40::Action2::signal() { _globals->_player.animate(ANIM_MODE_5, this); break; case 2: { - scene->_soundHandler.startSound(28); + scene->_soundHandler.play(28); scene->_doorway.postInit(); scene->_doorway.setVisage(16); scene->_doorway.setStrip2(6); @@ -1103,7 +1103,7 @@ void Scene40::Action2::signal() { scene->_assassin.setVisage(44); scene->_assassin._frame = 1; scene->_assassin.animate(ANIM_MODE_5, this); - scene->_soundHandler.startSound(29); + scene->_soundHandler.play(29); RING_INVENTORY._infoDisk._sceneNumber = 40; break; case 4: @@ -1234,11 +1234,11 @@ void Scene40::Action6::signal() { scene->_doorway.setVisage(46); scene->_doorway.setPosition(Common::Point(305, 61)); scene->_doorway.animate(ANIM_MODE_5, this); - scene->_soundHandler.startSound(25); + scene->_soundHandler.play(25); break; } case 1: - scene->_soundHandler.startSound(28); + scene->_soundHandler.play(28); scene->_doorway.setPosition(Common::Point(148, 74)); scene->_doorway.setFrame(1); scene->_doorway.setStrip(2); @@ -1270,7 +1270,7 @@ void Scene40::Action7::signal() { scene->_object7.setFrame(15); } scene->_object7.animate(ANIM_MODE_5, this); - scene->_soundHandler.startSound(25); + scene->_soundHandler.play(25); break; case 2: scene->_object7.remove(); @@ -1322,7 +1322,7 @@ void Scene40::Action8::signal() { _globals->_player.animate(ANIM_MODE_5, this); break; case 3: - _globals->_soundHandler.startSound(77, this); + _globals->_soundHandler.play(77, this); break; case 4: _globals->_game->endGame(40, 45); @@ -1480,7 +1480,7 @@ void Scene40::postInit(SceneObjectList *OwnerList) { _globals->_player.disableControl(); if (_globals->_sceneManager._previousScene == 20) { - _globals->_soundHandler.startSound(24); + _globals->_soundHandler.play(24); _globals->_player.setVisage(43); _object1.postInit(); @@ -1872,7 +1872,7 @@ void Scene60::Action1::signal() { scene->_floppyDrive.setPosition(Common::Point(136, 65)); scene->_floppyDrive.animate(ANIM_MODE_5, this); - scene->_soundHandler1.startSound(35); + scene->_soundHandler1.play(35); break; case 2: scene->_redLights.postInit(); @@ -1893,13 +1893,13 @@ void Scene60::Action1::signal() { scene->_message._numFrames = 5; _globals->_sceneItems.push_front(&scene->_message); - scene->_soundHandler2.startSound(38); + scene->_soundHandler2.play(38); } _globals->_events.setCursor(CURSOR_USE); break; case 3: - scene->_soundHandler2.startSound(37); + scene->_soundHandler2.play(37); scene->loadScene(65); scene->_message.remove(); @@ -1968,8 +1968,8 @@ void Scene60::Action1::signal() { scene->_floppyDrive.setFrame(scene->_floppyDrive.getFrameCount()); scene->_floppyDrive.animate(ANIM_MODE_6, this); - scene->_soundHandler1.startSound(35); - scene->_soundHandler3.proc3(); + scene->_soundHandler1.play(35); + scene->_soundHandler3.stop(); scene->_masterButton.setFrame(1); scene->_masterButton._state = 0; @@ -2019,7 +2019,7 @@ void Scene60::PrevObject::doAction(int action) { animate(ANIM_MODE_8, 1, NULL); if (scene->_action1.getActionIndex() > 5) { - scene->_soundHandler3.startSound(36); + scene->_soundHandler3.play(36); scene->_action1.setActionIndex(scene->_action1.getActionIndex() - 2); scene->_action1.setDelay(1); } @@ -2037,7 +2037,7 @@ void Scene60::NextObject::doAction(int action) { animate(ANIM_MODE_8, 1, NULL); if (scene->_action1.getActionIndex() < 8) { - scene->_soundHandler3.startSound(36); + scene->_soundHandler3.play(36); scene->_action1.setDelay(1); } } else { @@ -2051,7 +2051,7 @@ void Scene60::ExitObject::doAction(int action) { if (action == CURSOR_LOOK) { SceneItem::display2(60, 18); } else if (action == CURSOR_USE) { - scene->_soundHandler3.startSound(36); + scene->_soundHandler3.play(36); animate(ANIM_MODE_8, 1, NULL); scene->_nextButton.remove(); scene->_prevButton.remove(); @@ -2132,8 +2132,8 @@ void Scene60::ControlObject::doAction(int action) { if (_animateMode == ANIM_MODE_NONE) SceneItem::display2(60, 14); else if (!scene->_slaveButton._state) { - _globals->_soundHandler.startSound(40); - _globals->_soundHandler.proc5(1); + _globals->_soundHandler.play(40); + _globals->_soundHandler.holdAt(true); _globals->_sceneManager.changeScene(20); } else { scene->_sceneMode = 15; @@ -2153,14 +2153,14 @@ void Scene60::SlaveObject::doAction(int action) { if (scene->_masterButton._state) scene->_sceneMode = 19; else if (_state) { - scene->_soundHandler3.proc3(); + scene->_soundHandler3.stop(); animate(ANIM_MODE_6, NULL); _globals->clearFlag(102); _globals->clearFlag(!_globals->_stripNum ? 117 : 120); _state = 0; scene->_sceneMode = 9998; } else { - scene->_soundHandler3.startSound(39); + scene->_soundHandler3.play(39); _globals->setFlag(102); _globals->setFlag(!_globals->_stripNum ? 117 : 120); animate(ANIM_MODE_5, NULL); @@ -2185,14 +2185,14 @@ void Scene60::MasterObject::doAction(int action) { else if (scene->_slaveButton._state) scene->_sceneMode = 20; else if (_state) { - scene->_soundHandler3.proc3(); + scene->_soundHandler3.stop(); animate(ANIM_MODE_6, NULL); _state = 0; _globals->clearFlag(103); _globals->clearFlag(!_globals->_stripNum ? 116 : 119); scene->_sceneMode = 9998; } else { - scene->_soundHandler3.startSound(39); + scene->_soundHandler3.play(39); animate(ANIM_MODE_5, NULL); _state = 1; _globals->setFlag(103); @@ -2347,7 +2347,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) { _redLights.setPosition(Common::Point(199, 186)); _redLights.animate(ANIM_MODE_8, 0, NULL); - _soundHandler1.startSound(35); + _soundHandler1.play(35); if (!_globals->getFlag(83)) { _message.postInit(); @@ -2359,7 +2359,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) { _message._numFrames = 5; _globals->_sceneItems.push_front(&_message); - _soundHandler2.startSound(38); + _soundHandler2.play(38); } } } else { @@ -2382,7 +2382,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) { _redLights.animate(ANIM_MODE_8, 0, NULL); _redLights._numFrames = 5; - _soundHandler1.startSound(35); + _soundHandler1.play(35); if (!_globals->getFlag(83)) { _message.postInit(); @@ -2394,7 +2394,7 @@ void Scene60::postInit(SceneObjectList *OwnerList) { _message._numFrames = 5; _globals->_sceneItems.push_front(&_message); - _soundHandler2.startSound(38); + _soundHandler2.play(38); } } } @@ -2462,7 +2462,7 @@ void Scene90::Action1::signal() { setDelay(2); break; case 5: - scene->_soundHandler2.startSound(58); + scene->_soundHandler2.play(58); if (scene->_stripManager._field2E8 == 220) scene->_stripManager.start(91, this, scene); @@ -2477,7 +2477,7 @@ void Scene90::Action1::signal() { break; case 7: scene->_object2.animate(ANIM_MODE_NONE); - _globals->_soundHandler.startSound(56); + _globals->_soundHandler.play(56); scene->_object3.animate(ANIM_MODE_5, this); break; case 8: { @@ -2507,8 +2507,8 @@ void Scene90::Action1::signal() { break; } case 11: - _globals->_soundHandler.startSound(57); - _globals->_soundHandler.startSound(68); + _globals->_soundHandler.play(57); + _globals->_soundHandler.play(68); scene->_object3.animate(ANIM_MODE_6, NULL); SceneItem::display(90, _globals->getFlag(104) ? 15 : 14, @@ -2556,8 +2556,8 @@ void Scene90::Object2::doAction(int action) { scene->_object6.hide(); scene->_sceneMode = 91; - scene->_soundHandler1.startSound(59); - scene->_soundHandler1.proc5(1); + scene->_soundHandler1.play(59); + scene->_soundHandler1.holdAt(true); scene->setAction(&scene->_sequenceManager, scene, 91, this, &scene->_object6, NULL); break; case CURSOR_LOOK: @@ -2653,9 +2653,9 @@ void Scene90::postInit(SceneObjectList *OwnerList) { _globals->_sceneItems.push_back(&_object3); _globals->_player.disableControl(); - _globals->_soundHandler.startSound(55); - _soundHandler1.startSound(52); - _soundHandler1.proc5(1); + _globals->_soundHandler.play(55); + _soundHandler1.play(52); + _soundHandler1.holdAt(true); setAction(&_action1); @@ -2670,7 +2670,7 @@ void Scene90::signal() { switch (_sceneMode) { case 91: _sceneMode = 92; - _globals->_soundHandler.startSound(77, this); + _globals->_soundHandler.play(77, this); break; case 92: _globals->_scenePalette.clearListeners(); @@ -2713,7 +2713,7 @@ void Scene95::Action1::signal() { setDelay(60); break; case 2: { - scene->_soundHandler.startSound(66); + scene->_soundHandler.play(66); scene->_object3._numFrames = 5; scene->_object3.animate(ANIM_MODE_5, NULL); SceneItem::display(0, 0); @@ -2728,7 +2728,7 @@ void Scene95::Action1::signal() { break; } case 3: { - scene->_soundHandler.startSound(21); + scene->_soundHandler.play(21); Common::Point pt1(235, 72); PlayerMover *mover1 = new PlayerMover(); @@ -2768,7 +2768,7 @@ void Scene95::Action1::signal() { scene->_object1.setVisage(91); scene->_object1.setPosition(Common::Point(-22, 220)); - scene->_soundHandler.startSound(21); + scene->_soundHandler.play(21); Common::Point pt1(5, 198); NpcMover *mover1 = new NpcMover(); @@ -2826,7 +2826,7 @@ void Scene95::postInit(SceneObjectList *OwnerList) { _object3.setVisage(96); _object3.setPosition(Common::Point(29, 198)); - _soundHandler.startSound(67); + _soundHandler.play(67); setAction(&_action1); } @@ -2890,7 +2890,7 @@ void Scene6100::Action3::signal() { scene->_sunflower3.hide(); scene->_rocks.hide(); scene->_sceneText.hide(); - + _globals->_events.setCursor(CURSOR_WALK); scene->_stripManager.start(8120, this); break; @@ -3000,21 +3000,21 @@ void Scene6100::Action5::dispatch() { (tempSet.sqrt(zeroSet) < 150.0)) { switch (scene->_hitCount++) { case 0: - scene->_soundHandler.startSound(233); + scene->_soundHandler.play(233); scene->showMessage(NULL, 0, NULL); if (!_globals->getFlag(76)) scene->_probe.setAction(&scene->_action1); break; case 1: - scene->_soundHandler.startSound(233); + scene->_soundHandler.play(233); scene->showMessage(NULL, 0, NULL); if (!_globals->getFlag(76)) scene->_probe.setAction(&scene->_action2); break; case 2: - scene->_soundHandler.startSound(234); + scene->_soundHandler.play(234); scene->showMessage(NULL, 0, NULL); if (!_globals->getFlag(76)) @@ -3243,7 +3243,7 @@ void Scene6100::postInit(SceneObjectList *OwnerList) { if (!_globals->getFlag(76)) _probe.setAction(&_action4); - _globals->_soundHandler.startSound(231); + _globals->_soundHandler.play(231); } void Scene6100::remove() { diff --git a/engines/tsage/ringworld_scenes1.h b/engines/tsage/ringworld_scenes1.h index abd765473c..283cf68e07 100644 --- a/engines/tsage/ringworld_scenes1.h +++ b/engines/tsage/ringworld_scenes1.h @@ -30,6 +30,7 @@ #include "tsage/core.h" #include "tsage/scenes.h" #include "tsage/globals.h" +#include "tsage/sound.h" namespace tSage { @@ -65,7 +66,7 @@ class Scene15 : public Scene { public: Action1 _action1; SceneObject _object1; - SoundHandler _soundHandler; + ASound _soundHandler; virtual void postInit(SceneObjectList *OwnerList = NULL); }; @@ -97,7 +98,7 @@ public: Action3 _action3; Action4 _action4; SceneObject _sceneObject1, _SceneObjectExt, _sceneObject3, _sceneObject4, _sceneObject5; - SoundHandler _sound; + ASound _sound; public: Scene20(); virtual ~Scene20() {} @@ -143,7 +144,7 @@ class Scene30 : public Scene { }; public: - SoundHandler _sound; + ASound _sound; DisplayHotspot _groundHotspot, _wallsHotspot, _courtyardHotspot, _treeHotspot; BeamObject _beam; DoorObject _door; @@ -232,7 +233,7 @@ public: SpeakerQText _speakerQText; SpeakerSText _speakerSText; SpeakerGameText _speakerGameText; - SoundHandler _soundHandler; + ASound _soundHandler; Action1 _action1; Action2 _action2; Action3 _action3; @@ -271,7 +272,7 @@ class Scene50 : public Scene { public: virtual void signal(); }; - + /* Objects */ class Object1 : public SceneObject { public: @@ -311,7 +312,7 @@ public: virtual void dispatch(); }; -class Scene60 : public Scene { +class Scene60 : public Scene { class Action1 : public Action { public: virtual void signal(); @@ -387,9 +388,9 @@ public: SceneObject _redLights; Item1 _item1; Item _item2, _item3, _item4, _item5, _item6; - SoundHandler _soundHandler1; - SoundHandler _soundHandler2; - SoundHandler _soundHandler3; + ASound _soundHandler1; + ASound _soundHandler2; + ASound _soundHandler3; Scene60(); virtual void postInit(SceneObjectList *OwnerList = NULL); @@ -423,7 +424,7 @@ public: DisplayObject _object3, _object4, _object5; SceneObject _object6; DisplayHotspot _item1, _item2, _item3; - SoundHandler _soundHandler1, _soundHandler2; + ASound _soundHandler1, _soundHandler2; Scene90(); @@ -441,7 +442,7 @@ class Scene95 : public Scene { public: Action1 _action1; SceneObject _object1, _object2, _object3; - SoundHandler _soundHandler; + ASound _soundHandler; Scene95(); virtual void postInit(SceneObjectList *OwnerList); @@ -505,7 +506,7 @@ public: Action5 _action5; GetBoxAction _getBoxAction; Action7 _action7; - SoundHandler _soundHandler; + ASound _soundHandler; Speaker _speaker1; SpeakerQR _speakerQR; SpeakerSL _speakerSL; diff --git a/engines/tsage/ringworld_scenes10.cpp b/engines/tsage/ringworld_scenes10.cpp index 0b4186531d..ba4060548e 100644 --- a/engines/tsage/ringworld_scenes10.cpp +++ b/engines/tsage/ringworld_scenes10.cpp @@ -151,7 +151,7 @@ void Scene9100::postInit(SceneObjectList *OwnerList) { _sceneHotspot5.setup(69, 36, 121, 272, 9100, 45, 46); _sceneHotspot6.setup(127, 0, 200, 52, 9100, 47, 48); - _globals->_soundHandler.startSound(251); + _globals->_soundHandler.play(251); if (_globals->_sceneManager._previousScene == 9150) { if (_globals->getFlag(20)) { _globals->_player.disableControl(); @@ -236,7 +236,7 @@ void Scene9150::dispatch() { } else { _globals->_player.disableControl(); if (_globals->getFlag(11)) { - _globals->_soundHandler.startSound(286); + _globals->_soundHandler.play(286); _sceneMode = 9153; } else { _sceneMode = 9156; @@ -270,7 +270,7 @@ void Scene9150::postInit(SceneObjectList *OwnerList) { _sceneHotspot8.setup(133, 584, 142, 640, 9150, 57, -1); _sceneHotspot10.setup(83, 304, 103, 323, 9150, 58, 59); - _globals->_soundHandler.startSound(285); + _globals->_soundHandler.play(285); _globals->_player.disableControl(); if (_globals->getFlag(20)) { @@ -402,7 +402,8 @@ void Scene9200::postInit(SceneObjectList *OwnerList) { _object1.animate(ANIM_MODE_2, NULL); _object1.setPosition(Common::Point(132, 114)); _object1.fixPriority(140); - _soundHandler.startSound(297); + _soundHandler.play(297); + _stripManager.addSpeaker(&_speakerQText); _stripManager.addSpeaker(&_speakerGR); _stripManager.addSpeaker(&_speakerGText); @@ -479,7 +480,7 @@ void Scene9300::signal() { _globals->setFlag(84); // No break on purpose case 9303: - _globals->_soundHandler.startSound(295); + _globals->_soundHandler.play(295); _globals->_sceneManager.changeScene(9350); break; case 9302: @@ -509,7 +510,7 @@ void Scene9300::postInit(SceneObjectList *OwnerList) { _globals->_player.changeZoom(-1); _object1.postInit(); _object2.postInit(); - _globals->_soundHandler.startSound(289); + _globals->_soundHandler.play(289); _hotspot1.setup(35, 142, 76, 212, 9300, 0, 1); _hotspot2.setup(28, 90, 81, 143, 9300, 2, 3); @@ -764,7 +765,7 @@ void Scene9400::signal() { void Scene9400::dispatch() { if ((_object1._animateMode == 2) && (_object1._strip == 1) && (_object1._frame == 4)){ if (_field1032 == 0) { - _soundHandler.startSound(296); + _soundHandler.play(296); _field1032 = 1; } } else { @@ -1083,7 +1084,7 @@ void Scene9500::signal() { switch (_sceneMode) { case 9503: _globals->_sceneManager.changeScene(9200); - _globals->_soundHandler.startSound(295); + _globals->_soundHandler.play(295); break; case 9504: _globals->_sceneManager.changeScene(9850); @@ -1141,7 +1142,7 @@ void Scene9500::postInit(SceneObjectList *OwnerList) { setZoomPercents(110, 75, 200, 150); _globals->_player.postInit(); - _globals->_soundHandler.startSound(305); + _globals->_soundHandler.play(305); _candle.postInit(); _candle.setVisage(9500); @@ -1249,7 +1250,7 @@ void Scene9700::signal() { _globals->_events.setCursor(CURSOR_USE); break; case 9704: - _globals->_soundHandler.startSound(323); + _globals->_soundHandler.play(323); _globals->_sceneManager.changeScene(9750); break; } @@ -1308,7 +1309,7 @@ void Scene9700::postInit(SceneObjectList *OwnerList) { void Scene9750::signal() { switch (_sceneMode ++) { case 9751: - _globals->_soundHandler.proc1(this); + _globals->_soundHandler.fadeOut(this); break; case 9752: _globals->_sceneManager.changeScene(2100); @@ -1440,7 +1441,7 @@ void Scene9850::Hotspot17::doAction(int action) { SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); } else { if (action == CURSOR_USE) - scene->_soundHandler.startSound(306); + scene->_soundHandler.play(306); NamedHotspot::doAction(action); } } @@ -1452,7 +1453,7 @@ void Scene9850::Hotspot18::doAction(int action) { SceneItem::display(9850, 32, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); } else { if (action == CURSOR_USE) - scene->_soundHandler.startSound(306); + scene->_soundHandler.play(306); NamedHotspot::doAction(action); } } @@ -1464,7 +1465,7 @@ void Scene9850::Hotspot19::doAction(int action) { SceneItem::display(9850, 31, SET_Y, 20, SET_WIDTH, 200, SET_EXT_BGCOLOR, 7, LIST_END); } else { if (action == CURSOR_USE) - scene->_soundHandler.startSound(313); + scene->_soundHandler.play(313); NamedHotspot::doAction(action); } } @@ -1653,7 +1654,7 @@ void Scene9900::strAction1::signal() { switch (_actionIndex++) { case 0: - scene->_soundHandler.startSound(351); + scene->_soundHandler.play(351); _object9.postInit(); _object9.setVisage(18); _object9._frame = 1; @@ -1673,7 +1674,7 @@ void Scene9900::strAction1::signal() { _globals->_scenePalette.addFader(&mask2[0], 1, 5, this); break; case 3: - _globals->_soundHandler.startSound(377); + _globals->_soundHandler.play(377); setDelay(120); break; case 4: @@ -1854,7 +1855,7 @@ void Scene9900::signal() { switch (_sceneMode){ case 150: - _globals->_soundHandler.startSound(380); + _globals->_soundHandler.play(380); _object8.postInit(); _object8.setVisage(2002); _object8.setStrip(1); @@ -1887,7 +1888,7 @@ void Scene9900::signal() { setAction(&_sequenceManager, this, 9902, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); break; case 9904: - _globals->_soundHandler.startSound(390); + _globals->_soundHandler.play(390); _sceneMode = 9912; setAction(&_strAction2, this); break; @@ -1918,7 +1919,7 @@ void Scene9900::signal() { setAction(&_sequenceManager, this, 9904, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); break; case 9909: - _globals->_soundHandler.startSound(375); + _globals->_soundHandler.play(375); _globals->_player.disableControl(); _sceneMode = 9907; setAction(&_sequenceManager, this, 9907, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); @@ -1929,7 +1930,7 @@ void Scene9900::signal() { setAction(&_sequenceManager, this, 9911, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); break; case 9911: - _globals->_soundHandler.startSound(367); + _globals->_soundHandler.play(367); _globals->_player.disableControl(); _sceneMode = 9909; setAction(&_sequenceManager, this, 9909, &_object1, &_object2, &_object3, &_object4, &_object5, &_object6); @@ -2080,7 +2081,7 @@ void Scene9999::postInit(SceneObjectList *OwnerList) { else _globals->_stripNum = 2121; - _globals->_soundHandler.startSound(118); + _globals->_soundHandler.play(118); } diff --git a/engines/tsage/ringworld_scenes10.h b/engines/tsage/ringworld_scenes10.h index aa41555718..33b16d0014 100644 --- a/engines/tsage/ringworld_scenes10.h +++ b/engines/tsage/ringworld_scenes10.h @@ -129,7 +129,7 @@ public: SpeakerGText _speakerGText; SpeakerGR _speakerGR; SpeakerQText _speakerQText; - SoundHandler _soundHandler; + ASound _soundHandler; SceneHotspot1 _hotspot1; NamedHotspot _hotspot2; NamedHotspot _hotspot3; @@ -230,7 +230,7 @@ public: NamedHotspot _hotspot4; NamedHotspot _hotspot5; NamedHotspot _hotspot6; - SoundHandler _soundHandler; + ASound _soundHandler; int _field1032; SceneHotspot7 _hotspot7; SceneHotspot8 _hotspot8; @@ -424,7 +424,7 @@ public: SceneObject _objLever; Object6 _objScimitar; Object7 _objSword; - SoundHandler _soundHandler; + ASound _soundHandler; NamedHotspot _hotspot1; NamedHotspot _hotspot2; NamedHotspot _hotspot3; @@ -482,7 +482,7 @@ class Scene9900 : public Scene { }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SequenceManager _sequenceManager; SceneObject _object1; SceneObject _object2; diff --git a/engines/tsage/ringworld_scenes2.cpp b/engines/tsage/ringworld_scenes2.cpp index 4378eac724..0154123c3d 100644 --- a/engines/tsage/ringworld_scenes2.cpp +++ b/engines/tsage/ringworld_scenes2.cpp @@ -117,6 +117,7 @@ void Scene1000::Action3::signal() { // First time being played, so show the introduction ConfMan.setBool(SEEN_INTRO, true); ConfMan.flushToDisk(); + setDelay(1); } else { // Prompt user for whether to start play or watch introduction @@ -124,7 +125,7 @@ void Scene1000::Action3::signal() { if (MessageDialog::show2(WATCH_INTRO_MSG, START_PLAY_BTN_STRING, INTRODUCTION_BTN_STRING) == 0) { _actionIndex = 20; - _globals->_soundHandler.proc1(this); + _globals->_soundHandler.fadeOut(this); } else { setDelay(1); } @@ -214,7 +215,7 @@ void Scene1000::Action3::signal() { case 18: zoom(false); _globals->_scenePalette.clearListeners(); - _globals->_soundHandler.proc1(this); + _globals->_soundHandler.fadeOut(this); break; case 19: _globals->_sceneManager.changeScene(10); @@ -267,7 +268,7 @@ void Scene1000::postInit(SceneObjectList *OwnerList) { _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; - _globals->_soundHandler.startSound(114); + _globals->_soundHandler.play(114); } else if (_globals->_sceneManager._previousScene == 2222) { setZoomPercents(150, 10, 180, 100); _object1.postInit(); @@ -283,7 +284,7 @@ void Scene1000::postInit(SceneObjectList *OwnerList) { setAction(&_action1); } else { - _globals->_soundHandler.startSound(4); + _globals->_soundHandler.play(4); setZoomPercents(0, 10, 30, 100); _object3.postInit(); _object3.setVisage(1050); @@ -429,7 +430,7 @@ void Scene1001::Action1::signal() { setDelay(10); break; case 16: { - scene->_soundHandler1.startSound(90); + scene->_soundHandler1.play(90); scene->_object6.postInit(); scene->_object6.setVisage(16); @@ -446,7 +447,7 @@ void Scene1001::Action1::signal() { break; } case 17: { - scene->_soundHandler1.startSound(90); + scene->_soundHandler1.play(90); scene->_object6.remove(); scene->_object7.postInit(); @@ -475,7 +476,7 @@ void Scene1001::Action1::signal() { setDelay(30); break; case 19: { - _globals->_soundHandler.startSound(91); + _globals->_soundHandler.play(91); byte adjustData[4] = {0xff, 0xff, 0xff, 0}; _globals->_scenePalette.fade(adjustData, false, 0); @@ -496,7 +497,7 @@ void Scene1001::Action1::signal() { scene->_object1.animate(ANIM_MODE_5, this); break; case 22: - _globals->_soundHandler.startSound(92); + _globals->_soundHandler.play(92); scene->_stripManager.start(111, this); break; case 23: @@ -526,7 +527,7 @@ void Scene1001::postInit(SceneObjectList *OwnerList) { _object3.setStrip2(4); _object3.setPosition(Common::Point(61, 177)); - _globals->_soundHandler.startSound(85); + _globals->_soundHandler.play(85); setAction(&_action1); } @@ -647,7 +648,7 @@ void Scene1250::postInit(SceneObjectList *OwnerList) { setAction(&_action4); } else { setAction(&_action3); - _globals->_soundHandler.startSound(114); + _globals->_soundHandler.play(114); } } @@ -734,7 +735,7 @@ void Scene1400::Action1::signal() { _globals->_sceneManager._scrollerRect = Rect(40, 20, 280, 180); _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; _globals->_stripNum = 1500; - _globals->_soundHandler.proc3(); + _globals->_soundHandler.stop(); _globals->_sceneManager.changeScene(1500); break; @@ -779,7 +780,7 @@ void Scene1400::postInit(SceneObjectList *OwnerList) { _globals->_sceneOffset.y = (_globals->_sceneManager._scene->_sceneBounds.top / 100) * 100; setAction(&_action1); - _globals->_soundHandler.startSound(118); + _globals->_soundHandler.play(118); } /*-------------------------------------------------------------------------- @@ -842,7 +843,7 @@ void Scene1500::Action1::signal() { setDelay(30); break; case 6: - scene->_soundHandler.startSound(123); + scene->_soundHandler.play(123); scene->_object1.setStrip2(4); scene->_object1.setFrame(1); scene->_object1.animate(ANIM_MODE_5, this); @@ -850,13 +851,13 @@ void Scene1500::Action1::signal() { case 7: scene->_object1.setStrip2(5); scene->_object1.animate(ANIM_MODE_2, NULL); - scene->_soundHandler.startSound(124, this); + scene->_soundHandler.play(124, this); break; case 8: - _globals->_soundHandler.startSound(126, this); + _globals->_soundHandler.play(126, this); break; case 9: - _globals->_soundHandler.startSound(127); + _globals->_soundHandler.play(127); _globals->_sceneManager.changeScene(2000); break; } @@ -893,7 +894,7 @@ void Scene1500::Action2::signal() { break; } case 3: - scene->_soundHandler.proc4(); + scene->_soundHandler.release(); _globals->_stripNum = 1505; _globals->_sceneManager.changeScene(2400); break; @@ -907,7 +908,7 @@ void Scene1500::postInit(SceneObjectList *OwnerList) { Scene::postInit(); if ((_globals->_stripNum == 1500) || ((_globals->_stripNum != 1504) && (_globals->_stripNum != 2751))) { - _globals->_soundHandler.startSound(120); + _globals->_soundHandler.play(120); setZoomPercents(105, 20, 145, 100); setAction(&_action1); diff --git a/engines/tsage/ringworld_scenes2.h b/engines/tsage/ringworld_scenes2.h index 7731b45ae8..93a8f04fd4 100644 --- a/engines/tsage/ringworld_scenes2.h +++ b/engines/tsage/ringworld_scenes2.h @@ -72,7 +72,7 @@ public: Action1 _action1; SceneObject _object1, _object2, _object3, _object4; SceneObject _object5, _object6, _object7; - SoundHandler _soundHandler1, _soundHandler2; + ASound _soundHandler1, _soundHandler2; virtual void postInit(SceneObjectList *OwnerList = NULL); }; @@ -134,7 +134,7 @@ public: virtual void signal(); }; public: - SoundHandler _soundHandler; + ASound _soundHandler; Action1 _action1; Action2 _action2; SceneObject _object1, _object2, _object3; diff --git a/engines/tsage/ringworld_scenes3.cpp b/engines/tsage/ringworld_scenes3.cpp index a19f15eca6..824a96a18b 100644 --- a/engines/tsage/ringworld_scenes3.cpp +++ b/engines/tsage/ringworld_scenes3.cpp @@ -129,11 +129,11 @@ void Scene2000::Action6::signal() { setDelay(130); break; case 1: - scene->_soundHandler2.startSound(79); + scene->_soundHandler2.play(79); scene->_stripManager.start(2000, this); break; case 2: - _globals->_soundHandler.startSound(81); + _globals->_soundHandler.play(81); scene->_object6.postInit(); scene->_object6.setVisage(2003); scene->_object6.setAction(NULL); @@ -148,7 +148,7 @@ void Scene2000::Action6::signal() { scene->_object6.animate(ANIM_MODE_6, this); break; case 5: - _globals->_soundHandler.startSound(80); + _globals->_soundHandler.play(80); scene->_object6.remove(); _globals->_sceneManager.changeScene(1001); break; @@ -308,12 +308,12 @@ void Scene2000::Action14::signal() { setDelay(60); break; case 3: - _globals->_soundHandler.startSound(99); + _globals->_soundHandler.play(99); scene->_object8.show(); scene->_object8.animate(ANIM_MODE_5, this); break; case 4: - _globals->_soundHandler.startSound(12); + _globals->_soundHandler.play(12); scene->_object8.setStrip(2); scene->_object8.setFrame(1); scene->_object9.show(); @@ -324,7 +324,7 @@ void Scene2000::Action14::signal() { scene->_stripManager.start(2001, this, scene); break; case 6: - _globals->_soundHandler.proc1(0/* was false */); + _globals->_soundHandler.fadeOut(0/* was false */); scene->_object8.setStrip(1); scene->_object8.setFrame(scene->_object8.getFrameCount()); scene->_object8.animate(ANIM_MODE_6, this); @@ -333,7 +333,7 @@ void Scene2000::Action14::signal() { scene->_object10.remove(); break; case 7: - _globals->_soundHandler.startSound(111); + _globals->_soundHandler.play(111); scene->_object8.remove(); setDelay(5); break; @@ -425,11 +425,11 @@ void Scene2000::postInit(SceneObjectList *OwnerList) { setAction(&_action13); break; case 2200: - _globals->_soundHandler.startSound(111); + _globals->_soundHandler.play(111); setAction(&_action14); break; case 2222: - _globals->_soundHandler.startSound(115); + _globals->_soundHandler.play(115); setAction(&_action8); break; case 3500: @@ -437,12 +437,12 @@ void Scene2000::postInit(SceneObjectList *OwnerList) { break; default: _object6.remove(); - _globals->_soundHandler.startSound(80); + _globals->_soundHandler.play(80); setAction(&_action6); break; } - _soundHandler1.startSound(78); + _soundHandler1.play(78); _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; } @@ -502,7 +502,7 @@ void Scene2100::Action1::signal() { break; } case 2: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_5, this); break; case 3: { @@ -551,7 +551,7 @@ void Scene2100::Action1::signal() { } } - scene->_soundHandler.startSound(161); + scene->_soundHandler.play(161); scene->_area1.restore(); scene->_area2.restore(); scene->_area3.restore(); @@ -560,7 +560,7 @@ void Scene2100::Action1::signal() { if (_state == 2100) { setDelay(1); } else { - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_6, this); } break; @@ -576,7 +576,7 @@ void Scene2100::Action1::signal() { break; case 7: _globals->_player.fixPriority(-1); - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_6, this); break; case 8: @@ -776,17 +776,17 @@ void Scene2100::Action9::signal() { scene->_stripManager.start(6050, this); break; case 2: - scene->_soundHandler.startSound(99); + scene->_soundHandler.play(99); scene->_object4.show(); scene->_object4.animate(ANIM_MODE_5, this); break; case 3: - scene->_soundHandler.startSound(12); + scene->_soundHandler.play(12); scene->_object4.setStrip(2); scene->_stripManager.start(6051, this, scene); break; case 4: - scene->_soundHandler.proc1(0/* was false */); + scene->_soundHandler.fadeOut(0/* was false */); scene->_object4.setStrip(1); scene->_object4.setFrame(scene->_object4.getFrameCount()); scene->_object4.animate(ANIM_MODE_6, this); @@ -847,7 +847,7 @@ void Scene2100::Action10::signal() { break; } case 5: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_5, this); break; case 6: { @@ -880,7 +880,7 @@ void Scene2100::Action10::signal() { setDelay(45); break; case 9: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_6, this); break; case 10: @@ -924,7 +924,7 @@ void Scene2100::Action11::signal() { break; } case 3: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_5, this); break; case 4: { @@ -945,7 +945,7 @@ void Scene2100::Action11::signal() { setDelay(45); break; case 6: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_6, this); break; case 7: @@ -970,7 +970,7 @@ void Scene2100::Action12::signal() { scene->_stripManager.start(6000, this); break; case 2: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_5, this); break; case 3: { @@ -984,7 +984,7 @@ void Scene2100::Action12::signal() { break; } case 4: { - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_6, NULL); _globals->_player.fixPriority(-1); @@ -1096,7 +1096,7 @@ void Scene2100::Action14::signal() { scene->_stripManager.start(6008, this); break; case 4: - scene->_soundHandler.startSound(99); + scene->_soundHandler.play(99); scene->_object4.show(); scene->_object4.animate(ANIM_MODE_5, this); break; @@ -1105,7 +1105,7 @@ void Scene2100::Action14::signal() { scene->_stripManager.start(6009, this, scene); break; case 6: - scene->_soundHandler.proc1(0/* was false */); + scene->_soundHandler.fadeOut(0/* was false */); scene->_object4.setStrip(1); scene->_object4.setFrame(scene->_object4.getFrameCount()); scene->_object4.animate(ANIM_MODE_6, this); @@ -1136,7 +1136,7 @@ void Scene2100::Action14::signal() { break; } case 10: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_5, this); break; case 11: { @@ -1151,7 +1151,7 @@ void Scene2100::Action14::signal() { break; case 13: scene->_object3.fixPriority(1); - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_6, this); break; case 14: @@ -1180,7 +1180,7 @@ void Scene2100::Action15::signal() { scene->_object3.fixPriority(1); scene->_object3.changeZoom(-1); - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_5, this); break; case 2: { @@ -1191,7 +1191,7 @@ void Scene2100::Action15::signal() { break; } case 3: { - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_6, this); Common::Point pt(272, 140); @@ -1251,7 +1251,7 @@ void Scene2100::Action16::signal() { break; } case 5: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_5, this); break; case 6: { @@ -1266,7 +1266,7 @@ void Scene2100::Action16::signal() { setDelay(45); break; case 8: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_object1.animate(ANIM_MODE_6, this); break; case 9: @@ -1295,17 +1295,17 @@ void Scene2100::Action17::signal() { scene->_stripManager.start(7070, this); break; case 4: - scene->_soundHandler.startSound(99); + scene->_soundHandler.play(99); scene->_object4.show(); scene->_object4.animate(ANIM_MODE_5, this); break; case 5: - scene->_soundHandler.startSound(12); + scene->_soundHandler.play(12); scene->_object4.setStrip(2); scene->_stripManager.start(7071, this, scene); break; case 6: - scene->_soundHandler.proc1(NULL); + scene->_soundHandler.fadeOut(NULL); scene->_object4.setStrip(1); scene->_object4.setFrame(scene->_object4.getFrameCount()); scene->_object4.animate(ANIM_MODE_6, this); @@ -1690,8 +1690,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { switch (_globals->_sceneManager._previousScene) { case 2120: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); _object1.fixPriority(-1); _globals->_player.fixPriority(-1); _globals->_player.setPosition(Common::Point(80, 66)); @@ -1759,8 +1759,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { } break; case 3700: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); Scene::setZoomPercents(80, 75, 100, 90); if (_globals->_sceneObjects->contains(&_object2)) @@ -1778,8 +1778,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_sequenceManager, this, 2105, &_object3, NULL); break; case 4250: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); _globals->clearFlag(43); _globals->_player.setVisage(2104); @@ -1797,8 +1797,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_sequenceManager, this, 2107, &_object4, NULL); break; case 5000: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); if (_globals->_sceneObjects->contains(&_object2)) _object2.remove(); @@ -1814,8 +1814,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_action5); break; case 5100: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); _globals->_player.setVisage(2104); _globals->_player.setFrame(1); _globals->_player.setPosition(Common::Point(65, 149)); @@ -1833,8 +1833,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_action9); break; case 7000: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); if (RING_INVENTORY._stasisBox2._sceneNumber == 1) { _globals->_player.fixPriority(1); @@ -1861,8 +1861,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { } break; case 7600: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); if (_globals->_sceneObjects->contains(&_object2)) _object2.remove(); @@ -1873,8 +1873,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_action8); break; case 8100: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); _globals->_player.setVisage(2104); _globals->_player.setFrame(1); @@ -1886,8 +1886,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_sequenceManager, this, 2106, NULL); break; case 9750: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); _globals->_player.setVisage(2104); _globals->_player.setFrame(1); @@ -1904,8 +1904,8 @@ void Scene2100::postInit(SceneObjectList *OwnerList) { setAction(&_sequenceManager, this, 2103, &_object4, NULL); break; default: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); _globals->_player._uiEnabled = true; break; @@ -1962,7 +1962,7 @@ void Scene2100::signal() { void Scene2100::synchronize(Serializer &s) { Scene::synchronize(s); if (s.getVersion() >= 3) - s.syncAsSint16LE(_sitFl); + s.syncAsSint16LE(_sitFl); } /*-------------------------------------------------------------------------- @@ -2074,7 +2074,7 @@ void Scene2120::Action1::dispatch() { _actionIndex = !_entries[scene->_subjectIndex]._visage ? 4 : 3; setDelay(30); - scene->_soundHandler.startSound(159); + scene->_soundHandler.play(159); } // Next Page button handling @@ -2105,7 +2105,7 @@ void Scene2120::Action1::dispatch() { setDelay(30); } - scene->_soundHandler.startSound(159); + scene->_soundHandler.play(159); } // Previous Page button handling @@ -2132,7 +2132,7 @@ void Scene2120::Action1::dispatch() { break; } - scene->_soundHandler.startSound(159); + scene->_soundHandler.play(159); } // Exit button handling @@ -2162,7 +2162,7 @@ void Scene2120::Action1::dispatch() { setDelay(1); } - scene->_soundHandler.startSound(159); + scene->_soundHandler.play(159); } } @@ -2232,7 +2232,7 @@ void Scene2150::Action1::signal() { break; } case 1: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_hotspot1.animate(ANIM_MODE_5, this); break; case 2: { @@ -2282,7 +2282,7 @@ void Scene2150::Action1::signal() { } } - scene->_soundHandler.startSound(161); + scene->_soundHandler.play(161); scene->_area1.restore(); scene->_area2.restore(); scene->_area3.restore(); @@ -2291,7 +2291,7 @@ void Scene2150::Action1::signal() { if (_state == 2150) { setDelay(1); } else { - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_hotspot1.animate(ANIM_MODE_6, this); } break; @@ -2306,7 +2306,7 @@ void Scene2150::Action1::signal() { } break; case 6: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_hotspot1.animate(ANIM_MODE_6, this); break; case 7: @@ -2333,10 +2333,10 @@ void Scene2150::Action2::signal() { _globals->_player.setStrip(8); _globals->_player.animate(ANIM_MODE_8, 1, this); - scene->_soundHandler.startSound(163); + scene->_soundHandler.play(163); break; case 2: - scene->_soundHandler.startSound(164); + scene->_soundHandler.play(164); scene->_hotspot10.animate(ANIM_MODE_5, this); break; case 3: @@ -2361,7 +2361,7 @@ void Scene2150::Action2::signal() { _globals->_player.animate(ANIM_MODE_5, this); break; case 5: - scene->_soundHandler.startSound(164); + scene->_soundHandler.play(164); scene->_hotspot10.animate(ANIM_MODE_6, NULL); scene->_hotspot14.remove(); @@ -2559,8 +2559,8 @@ void Scene2150::postInit(SceneObjectList *OwnerList) { switch (_globals->_sceneManager._previousScene) { case 2120: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); _globals->_player.setPosition(Common::Point(108, 99)); break; case 2200: @@ -2709,7 +2709,7 @@ void Scene2200::Action3::signal() { switch (_actionIndex++) { case 0: { - scene->_soundHandler2.startSound(103); + scene->_soundHandler2.play(103); scene->_hotspot4.setStrip(4); scene->_hotspot4.animate(ANIM_MODE_NONE, NULL); @@ -2726,7 +2726,7 @@ void Scene2200::Action3::signal() { break; } case 1: - scene->_soundHandler2.startSound(104); + scene->_soundHandler2.play(104); scene->_hotspot4.setStrip(2); scene->_hotspot4.setFrame(2); setDelay(120); @@ -2882,7 +2882,7 @@ void Scene2200::Hotspot9::doAction(int action) { break; case OBJECT_INFODISK: if (_globals->_sceneManager._previousScene == 2310) { - scene->_soundHandler2.startSound(35); + scene->_soundHandler2.play(35); _globals->_player.disableControl(); scene->setAction(&scene->_action3); } @@ -2943,8 +2943,8 @@ void Scene2200::postInit(SceneObjectList *OwnerList) { _hotspot8.remove(); break; case 4000: - _globals->_soundHandler.startSound(100); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(100); + _globals->_soundHandler.holdAt(true); _globals->_player.remove(); _hotspot5.remove(); _hotspot8.remove(); @@ -2984,9 +2984,9 @@ void Scene2200::postInit(SceneObjectList *OwnerList) { _hotspot4.fixPriority(255); _globals->_sceneItems.push_back(&_hotspot4); - _soundHandler1.startSound(101); - _soundHandler2.startSound(100); - _globals->_soundHandler.proc5(true); + _soundHandler1.play(101); + _soundHandler2.play(100); + _globals->_soundHandler.holdAt(true); _globals->_sceneItems.push_back(&_hotspot5); setAction(&_action2); @@ -3139,7 +3139,7 @@ void Scene2222::postInit(SceneObjectList *OwnerList) { setAction(&_action1); } - _soundHandler.startSound(116); + _soundHandler.play(116); _globals->_sceneManager._scene->_sceneBounds.center(_hotspot1._position); _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); @@ -3225,7 +3225,7 @@ void Scene2230::Action2::signal() { _globals->_player.animate(ANIM_MODE_5, this); break; case 3: - scene->_soundHandler.startSound(157); + scene->_soundHandler.play(157); _globals->_player._moveDiff = Common::Point(1, 1); _globals->_player.setAction(&scene->_action4); _globals->_player._uiEnabled = true; @@ -3249,7 +3249,7 @@ void Scene2230::Action3::signal() { NpcMover *mover = new NpcMover(); _globals->_player.addMover(mover, &pt, this); - scene->_soundHandler.proc3(); + scene->_soundHandler.stop(); break; } case 1: @@ -3368,7 +3368,7 @@ void Scene2230::Action7::signal() { break; } case 2: { - scene->_soundHandler.startSound(158); + scene->_soundHandler.play(158); scene->_hotspot8.setStrip2(2); Common::Point pt(scene->_hotspot8._position.x, 97); @@ -3451,7 +3451,7 @@ void Scene2230::Action8::signal() { scene->_hotspot2.animate(ANIM_MODE_6, this); break; case 4: { - scene->_soundHandler.startSound(158); + scene->_soundHandler.play(158); scene->_hotspot2.remove(); scene->_hotspot8._frame = 1; @@ -3774,7 +3774,7 @@ void Scene2280::Action1::signal() { break; } case 1: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_hotspot16.animate(ANIM_MODE_5, this); break; case 2: { @@ -3789,7 +3789,7 @@ void Scene2280::Action1::signal() { break; case 4: _globals->_player.fixPriority(1); - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_hotspot16.animate(ANIM_MODE_6, this); break; case 5: @@ -3810,7 +3810,7 @@ void Scene2280::Action2::signal() { break; } case 1: - scene->_soundHandler.startSound(265); + scene->_soundHandler.play(265); _globals->_player.setVisage(2162); _globals->_player._frame = 1; @@ -3830,7 +3830,7 @@ void Scene2280::Action2::signal() { scene->_hotspot12.remove(); break; case 4: - scene->_soundHandler.startSound(266); + scene->_soundHandler.play(266); _globals->_player.setVisage(2170); _globals->_player._frame = 1; _globals->_player._strip = 4; @@ -3858,7 +3858,7 @@ void Scene2280::Action3::signal() { break; } case 1: - scene->_soundHandler.startSound(265); + scene->_soundHandler.play(265); _globals->_player.setVisage(2162); _globals->_player._frame = 6; @@ -4338,8 +4338,8 @@ void Scene2280::postInit(SceneObjectList *OwnerList) { _sceneMode = 2281; setAction(&_sequenceManager, this, 2281, &_globals->_player, &_hotspot16, NULL); - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); } _globals->_sceneItems.addItems(&_hotspot13, &_hotspot11, &_hotspot9, &_hotspot14, &_hotspot7, @@ -4390,7 +4390,7 @@ void Scene2300::Action1::signal() { } case 2: { scene->_hotspot8.setAction(&scene->_action4); - scene->_soundHandler2.startSound(21); + scene->_soundHandler2.play(21); Common::Point pt1(95, scene->_hotspot5._position.y); NpcMover *mover1 = new NpcMover(); @@ -4428,7 +4428,7 @@ void Scene2300::Action1::signal() { break; } case 6: - scene->_soundHandler1.startSound(28); + scene->_soundHandler1.play(28); _globals->_player.disableControl(); scene->_hotspot2.setVisage(40); @@ -4442,7 +4442,7 @@ void Scene2300::Action1::signal() { _globals->_player.animate(ANIM_MODE_5, this); break; case 7: - _globals->_soundHandler.startSound(77, this); + _globals->_soundHandler.play(77, this); break; case 8: _globals->_game->endGame(2300, 0); @@ -4470,7 +4470,7 @@ void Scene2300::Action1::signal() { _globals->_player.animate(ANIM_MODE_5, this); break; case 11: - scene->_soundHandler1.startSound(28); + scene->_soundHandler1.play(28); scene->_hotspot5._strip = 2; scene->_hotspot6._strip = 2; @@ -4487,7 +4487,7 @@ void Scene2300::Action1::signal() { _globals->_player.animate(ANIM_MODE_6, this); break; case 12: - scene->_soundHandler1.startSound(77); + scene->_soundHandler1.play(77); _globals->_player.setVisage(0); _globals->_player.animate(ANIM_MODE_1, NULL); _globals->_player.setStrip(4); @@ -4565,8 +4565,8 @@ void Scene2300::Action2::signal() { scene->_hotspot2.setFrame(1); scene->_hotspot2.animate(ANIM_MODE_5, this); - scene->_soundHandler1.startSound(28); - scene->_soundHandler2.startSound(97); + scene->_soundHandler1.play(28); + scene->_soundHandler2.play(97); break; case 7: scene->_hotspot7._strip = 2; @@ -4610,8 +4610,8 @@ void Scene2300::Action3::signal() { _globals->_player.animate(ANIM_MODE_5, this); break; case 3: - scene->_soundHandler1.startSound(97); - scene->_soundHandler2.startSound(28); + scene->_soundHandler1.play(97); + scene->_soundHandler2.play(28); scene->_hotspot7._strip = 2; scene->_hotspot7._frame = 1; @@ -4623,7 +4623,7 @@ void Scene2300::Action3::signal() { _globals->_player.animate(ANIM_MODE_6, NULL); break; case 4: - scene->_soundHandler2.startSound(97); + scene->_soundHandler2.play(97); _globals->_player.setVisage(0); _globals->_player.animate(ANIM_MODE_1, NULL); _globals->_player.setStrip(1); @@ -4645,7 +4645,7 @@ void Scene2300::Action4::signal() { switch (_actionIndex++) { case 0: scene->_hotspot8.animate(ANIM_MODE_5, this); - scene->_soundHandler1.startSound(11); + scene->_soundHandler1.play(11); break; case 1: scene->_hotspot9.postInit(); @@ -4655,7 +4655,7 @@ void Scene2300::Action4::signal() { scene->_hotspot9.setPosition(Common::Point(273, 199)); scene->_hotspot9.fixPriority(19); scene->_hotspot9.animate(ANIM_MODE_5, this); - scene->_soundHandler1.startSound(11); + scene->_soundHandler1.play(11); break; case 2: scene->_hotspot8.remove(); @@ -4666,10 +4666,10 @@ void Scene2300::Action4::signal() { scene->_hotspot10.setFrame(4); scene->_hotspot10.setPosition(Common::Point(292, 113)); scene->_hotspot10.animate(ANIM_MODE_5, this); - scene->_soundHandler1.startSound(11); + scene->_soundHandler1.play(11); break; case 3: - scene->_soundHandler1.startSound(13); + scene->_soundHandler1.play(13); remove(); break; } @@ -4747,7 +4747,7 @@ void Scene2300::postInit(SceneObjectList *OwnerList) { _hotspot8.setVisage(2301); _hotspot8.setPosition(Common::Point(288, 74)); - _globals->_soundHandler.startSound(96); + _globals->_soundHandler.play(96); if (_globals->_sceneManager._previousScene == 2000) { _hotspot8.remove(); @@ -4778,8 +4778,8 @@ void Scene2300::postInit(SceneObjectList *OwnerList) { _hotspot7.setPosition(Common::Point(229, 125)); _hotspot7._numFrames = 5; - _soundHandler1.startSound(95); - _soundHandler2.startSound(96); + _soundHandler1.play(95); + _soundHandler2.play(96); _globals->_sceneItems.push_back(&_hotspot7); setAction(&_action2); @@ -5062,7 +5062,7 @@ void Scene2320::Action2::signal() { switch (_actionIndex++) { case 0: { - scene->_soundHandler.startSound(253); + scene->_soundHandler.play(253); scene->_hotspot13.fixPriority(99); Common::Point pt(scene->_hotspot13._position.x, 200); @@ -5088,7 +5088,7 @@ void Scene2320::Action3::signal() { break; } case 1: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_hotspot6.animate(ANIM_MODE_5, this); break; case 2: { @@ -5137,7 +5137,7 @@ void Scene2320::Action3::signal() { } } - scene->_soundHandler.startSound(161); + scene->_soundHandler.play(161); scene->_area1.restore(); scene->_area2.restore(); scene->_area3.restore(); @@ -5146,7 +5146,7 @@ void Scene2320::Action3::signal() { if (_state == 2320) { setDelay(10); } else { - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_hotspot6.animate(ANIM_MODE_6, this); } break; @@ -5162,7 +5162,7 @@ void Scene2320::Action3::signal() { break; } case 6: - scene->_soundHandler.startSound(162); + scene->_soundHandler.play(162); scene->_hotspot6.animate(ANIM_MODE_6, this); break; case 7: @@ -5250,8 +5250,8 @@ void Scene2320::Action4::signal() { break; case 10: if (_globals->getFlag(109)) { - _globals->_soundHandler.startSound(40); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(40); + _globals->_soundHandler.holdAt(true); Common::Point pt(303, 240); NpcMover *mover = new NpcMover(); @@ -5311,7 +5311,7 @@ void Scene2320::Action4::signal() { } case 19: { scene->_hotspot16.remove(); - scene->_soundHandler.startSound(253); + scene->_soundHandler.play(253); scene->_hotspot13.show(); Common::Point pt(319, 157); @@ -5462,7 +5462,7 @@ void Scene2320::Action7::signal() { setDelay(30); break; case 1: - _globals->_soundHandler.startSound(162); + _globals->_soundHandler.play(162); scene->_hotspot6.animate(ANIM_MODE_5, this); break; case 2: @@ -5889,8 +5889,8 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { switch (_globals->_sceneManager._previousScene) { case 2120: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); _globals->_player.fixPriority(-1); _globals->_player.setPosition(Common::Point(389, 72)); @@ -5907,8 +5907,8 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { case 4250: case 5000: case 7000: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); if ((_globals->_sceneManager._previousScene == 7000) && !_globals->getFlag(80)) _globals->setFlag(36); @@ -5924,8 +5924,8 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { setAction(&_action6); break; case 6100: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); _hotspot8.postInit(); _hotspot8.setVisage(2345); @@ -5936,9 +5936,9 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL); break; case 7600: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); - _soundHandler.startSound(21); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); + _soundHandler.play(21); _globals->_player.setVisage(2323); _globals->_player.setStrip(2); @@ -5995,8 +5995,8 @@ void Scene2320::postInit(SceneObjectList *OwnerList) { setAction(&_sequenceManager1, this, 2325, &_globals->_player, &_hotspot6, &_hotspot8, &_hotspot7, NULL); break; default: - _globals->_soundHandler.startSound(160); - _globals->_soundHandler.proc5(true); + _globals->_soundHandler.play(160); + _globals->_soundHandler.holdAt(true); _sceneMode = 2321; _globals->_player.setStrip(3); @@ -6127,7 +6127,7 @@ void Scene2400::postInit(SceneObjectList *OwnerList) { _globals->_sceneManager._scene->_sceneBounds.contain(_globals->_sceneManager._scene->_backgroundBounds); _globals->_sceneOffset.x = (_globals->_sceneManager._scene->_sceneBounds.left / 160) * 160; - _globals->_soundHandler.startSound(153); + _globals->_soundHandler.play(153); } } // End of namespace tSage diff --git a/engines/tsage/ringworld_scenes3.h b/engines/tsage/ringworld_scenes3.h index cc237a1f91..711360c190 100644 --- a/engines/tsage/ringworld_scenes3.h +++ b/engines/tsage/ringworld_scenes3.h @@ -114,7 +114,7 @@ public: Action14 _action14; SceneObject _object1, _object2, _object3, _object4, _object5; SceneObject _object6, _object7, _object8, _object9, _object10; - SoundHandler _soundHandler1, _soundHandler2; + ASound _soundHandler1, _soundHandler2; virtual void postInit(SceneObjectList *OwnerList = NULL); virtual void stripCallback(int v); @@ -232,7 +232,7 @@ class Scene2100 : public Scene { }; public: SequenceManager _sequenceManager; - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerMText _speakerMText; SpeakerMR _speakerMR; SpeakerQL _speakerQL; @@ -311,7 +311,7 @@ class Scene2120 : public Scene { }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SceneObject _topicArrowHotspot, _arrowHotspot, _visageHotspot; SceneObject _subjectButton, _nextPageButton, _previousPageButton, _exitButton; Action1 _action1; @@ -359,7 +359,7 @@ class Scene2150 : public Scene { virtual void doAction(int action); }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SequenceManager _sequenceManager; SpeakerGameText _speakerGameText; @@ -440,7 +440,7 @@ public: DisplayHotspot _hotspot10; SceneObject _hotspot2, _hotspot4; SceneObject _hotspot6, _hotspot7, _hotspot8; - SoundHandler _soundHandler1, _soundHandler2; + ASound _soundHandler1, _soundHandler2; Scene2200(); virtual void postInit(SceneObjectList *OwnerList = NULL); @@ -462,7 +462,7 @@ class Scene2222 : public Scene { }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerSText _speakerSText; SpeakerMText _speakerMText; SpeakerQText _speakerQText; @@ -552,7 +552,7 @@ class Scene2230 : public Scene { virtual void doAction(int action); }; public: - SoundHandler _soundHandler; + ASound _soundHandler; Action1 _action1; Action2 _action2; Action3 _action3; @@ -652,7 +652,7 @@ class Scene2280 : public Scene { }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SequenceManager _sequenceManager; Rect _exitRect; Action1 _action1; @@ -712,7 +712,7 @@ class Scene2300 : public Scene { virtual void doAction(int action); }; public: - SoundHandler _soundHandler1, _soundHandler2; + ASound _soundHandler1, _soundHandler2; SpeakerSL _speakerSL; SpeakerMText _speakerMText; SpeakerQText _speakerQText; @@ -834,7 +834,7 @@ class Scene2320 : public Scene { virtual void doAction(int action); }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SequenceManager _sequenceManager1, _sequenceManager2; SpeakerMText _speakerMText; SpeakerMR _speakerMR; diff --git a/engines/tsage/ringworld_scenes4.cpp b/engines/tsage/ringworld_scenes4.cpp index 883da9b5b1..838769e4af 100644 --- a/engines/tsage/ringworld_scenes4.cpp +++ b/engines/tsage/ringworld_scenes4.cpp @@ -178,7 +178,7 @@ void Scene3700::Action1::signal() { setDelay(90); break; case 3: - scene->_soundHandler.startSound(196); + scene->_soundHandler.play(196); scene->_viewer.hide(); scene->_hotspot1.postInit(); @@ -190,7 +190,7 @@ void Scene3700::Action1::signal() { setDelay(90); break; case 4: - scene->_soundHandler.startSound(197); + scene->_soundHandler.play(197); scene->_hotspot1.hide(); scene->_hotspot2.postInit(); @@ -202,7 +202,7 @@ void Scene3700::Action1::signal() { setDelay(30); break; case 5: - scene->_soundHandler.startSound(198); + scene->_soundHandler.play(198); scene->_hotspot2.hide(); scene->_hotspot1.show(); setDelay(90); @@ -244,7 +244,7 @@ void Scene3700::postInit(tSage::SceneObjectList *OwnerList) { _viewer.setPosition(Common::Point(195, 83)); setAction(&_action1); - _globals->_soundHandler.startSound(195); + _globals->_soundHandler.play(195); } } // End of namespace tSage diff --git a/engines/tsage/ringworld_scenes4.h b/engines/tsage/ringworld_scenes4.h index 389c67b83a..0b575d02d3 100644 --- a/engines/tsage/ringworld_scenes4.h +++ b/engines/tsage/ringworld_scenes4.h @@ -82,7 +82,7 @@ public: SpeakerSText _speakerSText; SpeakerMText _speakerMText; SpeakerMR _speakerMR; - SoundHandler _soundHandler; + ASound _soundHandler; virtual void postInit(SceneObjectList *OwnerList = NULL); }; diff --git a/engines/tsage/ringworld_scenes5.cpp b/engines/tsage/ringworld_scenes5.cpp index 8b95e40abe..fccc7e1b50 100644 --- a/engines/tsage/ringworld_scenes5.cpp +++ b/engines/tsage/ringworld_scenes5.cpp @@ -102,7 +102,7 @@ void Scene4000::Action1::signal() { ADD_MOVER_NULL(scene->_hotspot5, -40, 86); break; case 5: - _globals->_soundHandler.startSound(155); + _globals->_soundHandler.play(155); _globals->setFlag(43); _globals->setFlag(114); scene->_stripManager.start(4430, this); @@ -354,14 +354,14 @@ void Scene4000::Action8::signal() { setDelay(60); break; case 3: - _globals->_soundHandler.startSound(170); + _globals->_soundHandler.play(170); scene->_smoke2.setVisage(4000); scene->_smoke2.setStrip(6); scene->_smoke2.animate(ANIM_MODE_2, NULL); setDelay(60); break; case 4: - _globals->_soundHandler.startSound(77, this); + _globals->_soundHandler.play(77, this); break; case 5: _globals->_game->endGame(4000, 15); @@ -429,7 +429,7 @@ void Scene4000::Action11::signal() { scene->_olo.animate(ANIM_MODE_1, NULL); break; case 5: - scene->_soundHandler1.proc3(); + scene->_soundHandler1.stop(); scene->_forceField.remove(); ADD_MOVER(_globals->_player, 340, 163); @@ -494,12 +494,12 @@ void Scene4000::Action13::signal() { setDelay(3); break; case 1: - scene->_soundHandler2.startSound(151); - scene->_soundHandler2.proc5(true); + scene->_soundHandler2.play(151); + scene->_soundHandler2.holdAt(true); ADD_MOVER(scene->_lander, -30, 70); break; case 2: - scene->_soundHandler2.proc4(); + scene->_soundHandler2.release(); _globals->_sceneManager.changeScene(4010); break; } @@ -867,7 +867,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { _theTech.setPosition(Common::Point(281, 176)); if (_globals->getFlag(34)) { - _soundHandler1.startSound(156); + _soundHandler1.play(156); _forceField.postInit(); _forceField.setVisage(4000); @@ -900,7 +900,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { switch (_globals->_sceneManager._previousScene) { case 2320: - _globals->_soundHandler.startSound(155); + _globals->_soundHandler.play(155); if (RING_INVENTORY._ale._sceneNumber == 1) { _guardRock.postInit(); @@ -962,7 +962,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { } if (_globals->_stripNum == 4025) { - _soundHandler1.startSound(182); + _soundHandler1.play(182); _forceField.remove(); _hotspot5.postInit(); @@ -1043,7 +1043,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { break; case 4050: - _globals->_soundHandler.startSound(155); + _globals->_soundHandler.play(155); _globals->_player.disableControl(); if (_globals->_stripNum == 4050) { @@ -1080,7 +1080,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { break; default: - _globals->_soundHandler.startSound(155); + _globals->_soundHandler.play(155); _lander.postInit(); _lander.setVisage(4002); @@ -1104,7 +1104,7 @@ void Scene4000::postInit(SceneObjectList *OwnerList) { RING_INVENTORY._ladder._sceneNumber = 4100; RING_INVENTORY._rope._sceneNumber = 4150; - _soundHandler1.startSound(156); + _soundHandler1.play(156); _forceField.postInit(); _forceField.setVisage(4000); @@ -1243,8 +1243,8 @@ void Scene4000::dispatch() { if ((RING_INVENTORY._peg._sceneNumber == 1) && _globals->getFlag(34) && _globals->getFlag(37) && !_globals->getFlag(40)) { _globals->_player.disableControl(); - _soundHandler1.startSound(177); - _globals->_soundHandler.startSound(178); + _soundHandler1.play(177); + _globals->_soundHandler.play(178); setAction(&_action1); } @@ -1892,7 +1892,7 @@ void Scene4045::postInit(SceneObjectList *OwnerList) { _olloFace.fixPriority(152); if(_globals->_sceneManager._previousScene == 4050) { - _globals->_soundHandler.startSound(155); + _globals->_soundHandler.play(155); _globals->_player.setPosition(Common::Point(72, 128)); _globals->_player.enableControl(); @@ -1921,7 +1921,7 @@ void Scene4045::postInit(SceneObjectList *OwnerList) { _miranda.setStrip(3); _miranda.setFrame(2); _miranda.changeZoom(-1); - + _miranda.setPosition(Common::Point(66, 209)); _globals->_sceneItems.push_back(&_miranda); } @@ -2273,7 +2273,7 @@ void Scene4050::postInit(SceneObjectList *OwnerList) { _globals->_player.setStrip(2); setAction(&_action2); - _globals->_soundHandler.startSound(175); + _globals->_soundHandler.play(175); } else { // Without the rope _globals->_player.setVisage(5315); @@ -2284,7 +2284,7 @@ void Scene4050::postInit(SceneObjectList *OwnerList) { _globals->_player.animate(ANIM_MODE_2, NULL); setAction(&_action4); - _globals->_soundHandler.startSound(176); + _globals->_soundHandler.play(176); } break; case 4045: @@ -2298,7 +2298,7 @@ void Scene4050::postInit(SceneObjectList *OwnerList) { _globals->_player.setObjectWrapper(new SceneObjectWrapper()); _globals->_player.setPosition(Common::Point(193, 193)); - _globals->_soundHandler.startSound(175); + _globals->_soundHandler.play(175); break; default: break; @@ -2717,7 +2717,7 @@ void Scene4100::postInit(SceneObjectList *OwnerList) { &_hotspot11, &_hotspot9, &_hotspot7, &_hotspot10, &_hotspot8, &_hotspot14, NULL); if (_globals->_sceneManager._previousScene == 4150) { - _globals->_soundHandler.startSound(155); + _globals->_soundHandler.play(155); if (!_globals->getFlag(42)) { _hotspot1.setVisage(4104); @@ -3095,8 +3095,8 @@ void Scene4150::postInit(SceneObjectList *OwnerList) { &_hotspot10, &_hotspot9, &_hotspot8, &_hotspot7, &_hotspot6, &_hotspot2, &_hotspot5, NULL); - _globals->_soundHandler.startSound(165); - _soundHandler.startSound(311); + _globals->_soundHandler.play(165); + _soundHandler.play(311); } void Scene4150::signal() { @@ -3110,8 +3110,8 @@ void Scene4150::dispatch() { Scene::dispatch(); if (!_action && (_globals->_player._position.x >= 316)) { - _globals->_soundHandler.proc1(NULL); - _soundHandler.proc1(NULL); + _globals->_soundHandler.fadeOut(NULL); + _soundHandler.fadeOut(NULL); _globals->_player.disableControl(); _sceneMode = 4152; setAction(&_sequenceManager, this, 4152, &_globals->_player, NULL); @@ -3414,7 +3414,7 @@ void Scene4250::Hotspot6::doAction(int action) { SceneItem::display2(4250, (RING_INVENTORY._helmet._sceneNumber == 4250) ? 20 : 3); break; case OBJECT_HELMET: - _globals->_soundHandler.startSound(354); + _globals->_soundHandler.play(354); _globals->_player.disableControl(); RING_INVENTORY._helmet._sceneNumber = 4250; @@ -3443,7 +3443,7 @@ void Scene4250::Hotspot6::doAction(int action) { break; case OBJECT_NULLIFIER: if (RING_INVENTORY._helmet._sceneNumber == 4250) { - _globals->_soundHandler.startSound(353); + _globals->_soundHandler.play(353); _globals->_player.disableControl(); RING_INVENTORY._helmet._sceneNumber = 1; @@ -3650,7 +3650,7 @@ void Scene4250::postInit(tSage::SceneObjectList *OwnerList) { _hotspot7.setBounds(Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)); _globals->_sceneItems.push_back(&_hotspot7); - _globals->_soundHandler.startSound(185); + _globals->_soundHandler.play(185); } void Scene4250::signal() { @@ -3683,7 +3683,7 @@ void Scene4250::signal() { _globals->_player.enableControl(); break; case 4259: - _globals->_soundHandler.startSound(360); + _globals->_soundHandler.play(360); _globals->_sceneManager.changeScene(9900); break; case 4261: @@ -3751,36 +3751,36 @@ void Scene4300::Action1::signal() { _globals->setFlag(56); _globals->_scenePalette.addRotation(240, 254, -1); scene->_hotspot7.animate(ANIM_MODE_6, this); - _globals->_soundHandler.startSound(164); + _globals->_soundHandler.play(164); break; case 1: - _globals->_soundHandler.startSound(340); - scene->_soundHandler1.startSound(341); + _globals->_soundHandler.play(340); + scene->_soundHandler1.play(341); scene->_hotspot1.remove(); setDelay(3); break; case 2: - scene->_soundHandler1.startSound(341); + scene->_soundHandler1.play(341); scene->_hotspot2.remove(); setDelay(6); break; case 3: - scene->_soundHandler1.startSound(341); + scene->_soundHandler1.play(341); scene->_hotspot3.remove(); setDelay(6); break; case 4: - scene->_soundHandler1.startSound(341); + scene->_soundHandler1.play(341); scene->_hotspot4.remove(); setDelay(12); break; case 5: - scene->_soundHandler1.startSound(341); + scene->_soundHandler1.play(341); scene->_hotspot5.remove(); setDelay(12); break; case 6: - scene->_soundHandler1.startSound(341); + scene->_soundHandler1.play(341); scene->_hotspot6.remove(); setDelay(60); break; @@ -3793,7 +3793,7 @@ void Scene4300::Action1::signal() { scene->_stripManager.start(8015, this, scene); break; case 9: - _globals->_soundHandler.startSound(350); + _globals->_soundHandler.play(350); _globals->_sceneManager._fadeMode = FADEMODE_GRADUAL; _globals->_events.setCursor(CURSOR_USE); _globals->_player.enableControl(); @@ -3916,7 +3916,7 @@ void Scene4300::Hotspot10::doAction(int action) { void Scene4300::Hotspot15::signal() { Scene4300 *scene = (Scene4300 *)_globals->_sceneManager._scene; - scene->_soundHandler2.startSound(345); + scene->_soundHandler2.play(345); _strip = (_globals->_randomSource.getRandomNumber(6) < 2) ? 2 : 1; if ((RING_INVENTORY._stasisBox2._sceneNumber == 4300) || @@ -3982,7 +3982,7 @@ void Scene4300::Hotspot17::doAction(int action) { SceneItem::display2(4300, 26); break; case OBJECT_STASIS_BOX2: - scene->_soundHandler1.startSound(352); + scene->_soundHandler1.play(352); _globals->_events.setCursor(CURSOR_USE); scene->_sceneMode = 4303; @@ -4241,11 +4241,11 @@ void Scene4301::Action1::signal() { switch (_actionIndex++) { case 0: - scene->_soundHandler.startSound(164); + scene->_soundHandler.play(164); scene->_hotspot1.animate(ANIM_MODE_5, this); break; case 1: - _globals->_soundHandler.startSound(335); + _globals->_soundHandler.play(335); _globals->_events.setCursor(CURSOR_USE); scene->_hotspot2.postInit(); @@ -4268,9 +4268,9 @@ void Scene4301::Action1::signal() { _actionIndex = 2; break; case 10: - // Puzzle: Wrong code + // Puzzle: Wrong code _globals->_events.setCursor(CURSOR_NONE); - scene->_soundHandler.startSound(337); + scene->_soundHandler.play(337); if (scene->_hotspot3._flags & OBJFLAG_HIDE) scene->_hotspot3.show(); else @@ -4285,7 +4285,7 @@ void Scene4301::Action1::signal() { for (_state = 0; _state < 6; ++_state) _buttonList[_state].remove(); - scene->_soundHandler.startSound(338); + scene->_soundHandler.play(338); scene->_hotspot3.hide(); _actionIndex = 2; @@ -4295,7 +4295,7 @@ void Scene4301::Action1::signal() { case 20: // Puzzle: Correct code _globals->_player.disableControl(); - scene->_soundHandler.startSound(339); + scene->_soundHandler.play(339); scene->_hotspot3._frame = 3; if (scene->_hotspot3._flags & OBJFLAG_HIDE) scene->_hotspot3.show(); @@ -4329,7 +4329,7 @@ void Scene4301::Action1::process(Event &event) { if ((event.eventType == EVENT_BUTTON_DOWN) && buttonsRect.contains(event.mousePos)) { event.handled = true; - scene->_soundHandler.startSound(336); + scene->_soundHandler.play(336); int buttonIndex = ((event.mousePos.y - buttonsRect.top) / 33) * 3 + ((event.mousePos.x - buttonsRect.left) / 33); diff --git a/engines/tsage/ringworld_scenes5.h b/engines/tsage/ringworld_scenes5.h index a2991c7283..c3ae9f4aa9 100644 --- a/engines/tsage/ringworld_scenes5.h +++ b/engines/tsage/ringworld_scenes5.h @@ -134,7 +134,7 @@ class Scene4000 : public Scene { }; public: SequenceManager _sequenceManager1, _sequenceManager2, _sequenceManager3; - SoundHandler _soundHandler1, _soundHandler2; + ASound _soundHandler1, _soundHandler2; SpeakerQR _speakerQR; SpeakerML _speakerML; SpeakerMR _speakerMR; @@ -471,7 +471,7 @@ class Scene4150 : public Scene { public: SequenceManager _sequenceManager; - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerQText _speakerQText; SpeakerQR _speakerQR; SpeakerCDL _speakerCDL; @@ -541,7 +541,7 @@ class Scene4250 : public Scene { public: SequenceManager _sequenceManager; - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerSR _speakerSR; SpeakerSL _speakerSL; SpeakerSText _speakerSText; @@ -613,7 +613,7 @@ class Scene4300 : public Scene { virtual void doAction(int action); }; public: - SoundHandler _soundHandler1, _soundHandler2; + ASound _soundHandler1, _soundHandler2; SequenceManager _sequenceManager; GfxButton _gfxButton; SpeakerQText _speakerQText; @@ -672,7 +672,7 @@ class Scene4301 : public Scene { public: Common::List<int> _list1; SequenceManager _sequenceManager; - SoundHandler _soundHandler; + ASound _soundHandler; Action1 _action1; SceneObject _hotspot1, _hotspot2, _hotspot3; Hotspot4 _hotspot4; diff --git a/engines/tsage/ringworld_scenes6.cpp b/engines/tsage/ringworld_scenes6.cpp index 9e5766d656..68c184196c 100644 --- a/engines/tsage/ringworld_scenes6.cpp +++ b/engines/tsage/ringworld_scenes6.cpp @@ -41,8 +41,8 @@ void Scene5000::Action1::signal() { setDelay(10); break; case 1: - scene->_soundHandler.startSound(190); - scene->_soundHandler.proc5(true); + scene->_soundHandler.play(190); + scene->_soundHandler.holdAt(true); ADD_MOVER(scene->_hotspot1, 283, 12); break; case 2: @@ -55,7 +55,7 @@ void Scene5000::Action1::signal() { setDelay(15); break; case 4: - scene->_soundHandler.proc4(); + scene->_soundHandler.release(); ADD_MOVER(scene->_hotspot1, 233, 80); break; case 5: @@ -561,7 +561,7 @@ void Scene5000::postInit(SceneObjectList *OwnerList) { break; } - _globals->_soundHandler.startSound(190); + _globals->_soundHandler.play(190); } void Scene5000::signal() { @@ -639,7 +639,7 @@ void Scene5100::Action1::signal() { } break; case 4: - scene->_soundHandler.startSound(206); + scene->_soundHandler.play(206); scene->_hotspot5.postInit(); scene->_hotspot5.setVisage(5362); @@ -740,7 +740,7 @@ void Scene5100::Action3::signal() { _globals->_player.animate(ANIM_MODE_5, this); break; case 2: - scene->_soundHandler.startSound(28); + scene->_soundHandler.play(28); if (static_cast<SceneObject *>(_owner)->_position.x < _globals->_player._position.x) { scene->_hotspot2.setVisage(5130); scene->_hotspot2._strip = 1; @@ -786,7 +786,7 @@ void Scene5100::Action4::signal() { switch (_actionIndex++) { case 0: { _globals->_player.disableControl(); - scene->_soundHandler.startSound(208); + scene->_soundHandler.play(208); SceneItem::display2(5100, 15); ObjectMover3 *mover = new ObjectMover3(); @@ -1289,7 +1289,7 @@ void Scene5100::postInit(SceneObjectList *OwnerList) { _globals->_sceneManager._scene->_sceneBounds.center(_globals->_player._position); loadScene(5100); - _globals->_soundHandler.startSound(205); + _globals->_soundHandler.play(205); } void Scene5100::signal() { @@ -1385,7 +1385,7 @@ void Scene5100::dispatch() { _globals->_player.disableControl(); _globals->_player.addMover(NULL); - _soundHandler.startSound(207); + _soundHandler.play(207); _sceneMode = 5103; setAction(&_sequenceManager, this, (_globals->_player._position.x >= 966) ? 5104 : 5103, &_globals->_player, &_hotspot15, NULL); @@ -1396,7 +1396,7 @@ void Scene5100::dispatch() { (_globals->_sceneManager._previousScene != 5200) && (_sceneMode != 5150)) { setAction(NULL); _sceneMode = 5150; - _soundHandler.startSound(208); + _soundHandler.play(208); if (RING_INVENTORY._vial._sceneNumber == 5100) { _globals->_player.addMover(NULL); @@ -1471,7 +1471,7 @@ void Scene5200::Action2::signal() { _globals->_player.animate(ANIM_MODE_4, 3, 1, this); break; case 2: - scene->_soundHandler.proc3(); + scene->_soundHandler.stop(); scene->_hotspot14.remove(); RING_INVENTORY._stasisBox._sceneNumber = 1; @@ -1486,7 +1486,7 @@ void Scene5200::Action2::signal() { ADD_MOVER(scene->_hotspot8, 141, 77); break; case 4: - scene->_soundHandler.startSound(303); + scene->_soundHandler.play(303); scene->_hotspot8._strip = 2; scene->_hotspot8._frame = 1; @@ -1523,7 +1523,7 @@ void Scene5200::Action4::signal() { setDelay(120); break; case 1: - _globals->_soundHandler.startSound(209); + _globals->_soundHandler.play(209); scene->_stripManager.start(5202, this, scene); break; case 2: @@ -1622,8 +1622,8 @@ void Scene5200::postInit(SceneObjectList *OwnerList) { _speakerQText._textPos.x = 20; if (RING_INVENTORY._stasisBox._sceneNumber == 5200) { - _soundHandler.startSound(216); - _soundHandler.proc5(true); + _soundHandler.play(216); + _soundHandler.holdAt(true); _hotspot14.postInit(); _hotspot14.setVisage(5202); @@ -1643,7 +1643,7 @@ void Scene5200::postInit(SceneObjectList *OwnerList) { // Happens when the player enters the throne room via the secret passage, // after talking with the bat. No NPCs are around and the player can // obtain the stasis box. - _globals->_soundHandler.startSound(205); + _globals->_soundHandler.play(205); _globals->_player.disableControl(); _globals->_player.postInit(); @@ -2131,7 +2131,7 @@ void Scene5300::postInit(SceneObjectList *OwnerList) { _hotspot8._sceneRegionId = 8; _globals->_sceneItems.addItems(&_hotspot8, &_hotspot2, &_hotspot6, &_hotspot3, &_hotspot7, NULL); - _globals->_soundHandler.startSound(212); + _globals->_soundHandler.play(212); } void Scene5300::signal() { @@ -2141,7 +2141,7 @@ void Scene5300::signal() { _globals->_sceneManager.changeScene(5100); break; case 5307: - _soundHandler.proc1(NULL); + _soundHandler.fadeOut(NULL); // No break on purpose case 5302: case 5308: diff --git a/engines/tsage/ringworld_scenes6.h b/engines/tsage/ringworld_scenes6.h index 6ac73d4bff..2e99f5ab87 100644 --- a/engines/tsage/ringworld_scenes6.h +++ b/engines/tsage/ringworld_scenes6.h @@ -75,7 +75,7 @@ class Scene5000 : public Scene { }; public: SequenceManager _sequenceManager; - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerSText _speakerSText; SpeakerQText _speakerQText; Action1 _action1; @@ -163,7 +163,7 @@ class Scene5100 : public Scene { }; public: SequenceManager _sequenceManager; - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerMText _speakerMText; SpeakerQText _speakerQText; SpeakerSText _speakerSText; @@ -226,7 +226,7 @@ class Scene5200 : public Scene { virtual void doAction(int action); }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SpeakerFLL _speakerFLL; SpeakerFLText _speakerFLText; SpeakerQL _speakerQL; @@ -291,7 +291,7 @@ class Scene5300 : public Scene { virtual void doAction(int action); }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SequenceManager _sequenceManager; SpeakerQR _speakerQR; SpeakerQL _speakerQL; diff --git a/engines/tsage/ringworld_scenes8.cpp b/engines/tsage/ringworld_scenes8.cpp index 934c7494fa..2b329b958a 100644 --- a/engines/tsage/ringworld_scenes8.cpp +++ b/engines/tsage/ringworld_scenes8.cpp @@ -60,7 +60,7 @@ void Scene7000::Action1::signal() { setAction(&scene->_action6, this); break; case 2: - scene->_soundHandler.startSound(252); + scene->_soundHandler.play(252); scene->_object8.remove(); scene->_object1.postInit(); scene->_object1.setVisage(7003); @@ -184,7 +184,7 @@ void Scene7000::Action4::signal() { setDelay(300); break; case 2: - _globals->_soundHandler.startSound(252); + _globals->_soundHandler.play(252); scene->_object1.show(); scene->_object1.setStrip(3); scene->_object1.setFrame(1); @@ -214,7 +214,7 @@ void Scene7000::Action5::signal() { } case 1: _globals->_player.checkAngle(&scene->_object1); - _globals->_soundHandler.startSound(252); + _globals->_soundHandler.play(252); scene->_object1.setStrip(2); scene->_stripManager.start(7015, this); break; @@ -546,7 +546,7 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { _object1.animate(ANIM_MODE_8, 0, NULL); _globals->_sceneItems.push_back(&_object1); } - _soundHandler.startSound(251); + _soundHandler.play(251); if (_globals->_sceneManager._previousScene == 2100) { if (_globals->getFlag(72)) { _globals->_player.postInit(); @@ -565,7 +565,7 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { setAction(&_action1); } } else { - _globals->_soundHandler.startSound(250); + _globals->_soundHandler.play(250); _globals->setFlag(72); _object3.postInit(); @@ -611,9 +611,9 @@ void Scene7000::postInit(SceneObjectList *OwnerList) { _object3.setVisage(5001); _object3.setStrip2(1); _object3.setPosition(Common::Point(307, 0)); - _soundHandler.startSound(151); - _soundHandler.proc5(1); - _globals->_soundHandler.startSound(250); + _soundHandler.play(151); + _soundHandler.holdAt(true); + _globals->_soundHandler.play(250); setAction(&_action3); } @@ -1135,9 +1135,9 @@ void Scene7100::postInit(SceneObjectList *OwnerList) { _object1.setPosition(Common::Point(100, 100)); setAction(&_action11); - _soundHandler1.startSound(270); - _soundHandler2.startSound(275); - _globals->_soundHandler.startSound(270); + _soundHandler1.play(270); + _soundHandler2.play(275); + _globals->_soundHandler.play(270); } /*-------------------------------------------------------------------------- * Scene 7200 - Underwater: Entering the cave @@ -1302,7 +1302,7 @@ void Scene7200::postInit(SceneObjectList *OwnerList) { _swimmer.setPosition(Common::Point(-8, 16)); setAction(&_action1); - _soundHandler.startSound(271); + _soundHandler.play(271); } /*-------------------------------------------------------------------------- @@ -1344,7 +1344,7 @@ void Scene7300::Action1::signal() { break; case 7: setDelay(3); - _globals->_soundHandler.proc1(NULL); + _globals->_soundHandler.fadeOut(NULL); break; case 8: _globals->_sceneManager.changeScene(2280); @@ -1497,7 +1497,7 @@ void Scene7300::postInit(SceneObjectList *OwnerList) { _object8._numFrames = 2; setAction(&_action1); - _globals->_soundHandler.startSound(272); + _globals->_soundHandler.play(272); } /*-------------------------------------------------------------------------- @@ -1601,8 +1601,8 @@ void Scene7600::postInit(SceneObjectList *OwnerList) { } _sceneBounds.center(_globals->_player._position.x, _globals->_player._position.y); loadScene(7600); - _soundHandler2.startSound(255); - _soundHandler1.startSound(251); + _soundHandler2.play(255); + _soundHandler1.play(251); } /*-------------------------------------------------------------------------- @@ -1665,7 +1665,7 @@ void Scene7700::Action3::signal() { setDelay(60); // No break on purpose! case 2: - scene->_soundHandler.startSound(260); + scene->_soundHandler.play(260); scene->_object8.setVisage(7703); scene->_object8.setPosition(Common::Point(177, 97)); scene->_object8.setStrip2(3); @@ -1874,7 +1874,7 @@ void Scene7700::SceneHotspot8::doAction(int action) { break; case CURSOR_USE: scene->_sceneMode = 7709; - scene->_soundHandler.startSound(259); + scene->_soundHandler.play(259); scene->_object15.setFrame(scene->_object15.getFrameCount()); scene->_object15.animate(ANIM_MODE_6, scene); if ((scene->_field977 == 2) && (scene->_field97B == 0)) { @@ -1900,7 +1900,7 @@ void Scene7700::SceneHotspot9::doAction(int action) { break; case CURSOR_USE: scene->_sceneMode = 7709; - scene->_soundHandler.startSound(259); + scene->_soundHandler.play(259); scene->_object15.setFrame(1); scene->_object15.animate(ANIM_MODE_5, scene); if (scene->_field977 > 2) { @@ -2034,7 +2034,7 @@ void Scene7700::Object7::doAction(int action) { break; case OBJECT_STUNNER: if (!_globals->getFlag(78)) { - _globals->_soundHandler.proc3(); + _globals->_soundHandler.stop(); _globals->setFlag(78); setAction(NULL); _globals->_player.disableControl(); @@ -2124,7 +2124,8 @@ void Scene7700::Object9::doAction(int action) { _globals->_sceneItems.push_front(&scene->_object10); scene->_object10.fixPriority(240); } - scene->_soundHandler.startSound(262); + + scene->_soundHandler.play(262); scene->_object14.animate(ANIM_MODE_5, NULL); } _globals->_events.setCursor(CURSOR_WALK); @@ -2222,7 +2223,7 @@ void Scene7700::signal() { } break; case 7702: - _soundHandler.proc1(0); + _soundHandler.fadeOut(0); _globals->_sceneManager.changeScene(7600); break; case 7703: @@ -2233,7 +2234,7 @@ void Scene7700::signal() { _globals->_player.enableControl(); break; case 7704: - _globals->_soundHandler.startSound(256); + _globals->_soundHandler.play(256); _prof.setStrip2(4); _prof.setFrame2(1); _prof.setPosition(Common::Point(159, 87)); @@ -2520,7 +2521,7 @@ void Scene7700::postInit(SceneObjectList *OwnerList) { _sceneMode = 7701; setAction(&_sequenceManager, this, 7701, &_globals->_player, NULL); - _soundHandler.startSound(256); + _soundHandler.play(256); } Scene7700::Scene7700() { diff --git a/engines/tsage/ringworld_scenes8.h b/engines/tsage/ringworld_scenes8.h index 8b183e895f..fe9560d9d8 100644 --- a/engines/tsage/ringworld_scenes8.h +++ b/engines/tsage/ringworld_scenes8.h @@ -94,7 +94,7 @@ class Scene7000 : public Scene { }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SequenceManager _sequenceManager; SpeakerSKText _speakerSKText; SpeakerSKL _speakerSKL; @@ -165,8 +165,8 @@ class Scene7100 : public Scene { }; public: - SoundHandler _soundHandler1; - SoundHandler _soundHandler2; + ASound _soundHandler1; + ASound _soundHandler2; SceneObject _object1; SceneObject _object2; SceneObject _object3; @@ -230,7 +230,7 @@ public: SceneObject _object7; SceneObject _object8; SceneObject _object9; - SoundHandler _soundHandler; + ASound _soundHandler; virtual void postInit(SceneObjectList *OwnerList = NULL); }; @@ -296,8 +296,8 @@ public: SceneObject _object4; SceneObject _object5; SceneObject _object6; - SoundHandler _soundHandler1; - SoundHandler _soundHandler2; + ASound _soundHandler1; + ASound _soundHandler2; virtual void postInit(SceneObjectList *OwnerList = NULL); }; @@ -409,7 +409,7 @@ class Scene7700 : public Scene { virtual void doAction(int action); }; public: - SoundHandler _soundHandler; + ASound _soundHandler; SequenceManager _sequenceManager; GfxButton _gfxButton; SpeakerEText _speakerEText; diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index defec1cebd..42416e2bf0 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -20,21 +20,456 @@ * */ +#include "common/config-manager.h" #include "tsage/core.h" #include "tsage/globals.h" #include "tsage/debugger.h" #include "tsage/graphics.h" +#include "tsage/tsage.h" namespace tSage { +static SoundManager *_soundManager = NULL; + +/*--------------------------------------------------------------------------*/ + +SoundManager::SoundManager() { + _soundManager = this; + __sndmgrReady = false; + _ourSndResVersion = 0x102; + _ourDrvResVersion = 0x10A; + + for (int i = 0; i < SOUND_ARR_SIZE; ++i) + _voiceTypeStructPtrs[i] = NULL; + + _groupsAvail = 0; + _masterVol = 127; + _suspendedCount = 0; + _driversDetected = false; + _needToRethink = false; + + _soTimeIndexFlag = false; +} + +SoundManager::~SoundManager() { + if (__sndmgrReady) { + for (Common::List<Sound *>::iterator i = _soundList.begin(); i != _soundList.end(); ) { + Sound *s = *i; + ++i; + s->stop(); + } + for (Common::List<SoundDriver *>::iterator i = _installedDrivers.begin(); i != _installedDrivers.end(); ) { + SoundDriver *driver = *i; + ++i; + delete driver; + } + _sfTerminate(); + } + + _soundManager = NULL; +} + void SoundManager::postInit() { - _saver->addSaveNotifier(&SoundManager::saveNotifier); - _saver->addLoadNotifier(&SoundManager::loadNotifier); - _saver->addListener(this); + if (!__sndmgrReady) { + _saver->addSaveNotifier(&SoundManager::saveNotifier); + _saver->addLoadNotifier(&SoundManager::loadNotifier); + _saver->addListener(this); + __sndmgrReady = true; + } +} + +/** + * Loops through all the loaded sounds, and stops any that have been flagged for stopping + */ +void SoundManager::dispatch() { + Common::List<Sound *>::iterator i = _soundList.begin(); + while (i != _soundList.end()) { + Sound *sound = *i; + ++i; + + // If the sound is flagged for stopping, then stop it + if (sound->_stoppedAsynchronously) { + sound->stop(); + } + } +} + +void SoundManager::syncSounds() { + bool mute = false; + if (ConfMan.hasKey("mute")) + mute = ConfMan.getBool("mute"); + + bool music_mute = mute; + bool sfx_mute = mute; + + if (!mute) { + music_mute = ConfMan.getBool("music_mute"); + sfx_mute = ConfMan.getBool("sfx_mute"); + } + + // Get the new music and sfx volumes + int musicVolume = music_mute ? 0 : MIN(255, ConfMan.getInt("music_volume")); + int sfxVolume = sfx_mute ? 0 : MIN(255, ConfMan.getInt("sfx_volume")); + + warning("Set volume music=%d sfx=%d", musicVolume, sfxVolume); + this->setMasterVol(musicVolume / 2); +} + +void SoundManager::update() { + _sfSoundServer(); +} + +Common::List<SoundDriverEntry> &SoundManager::buildDriverList(bool detectFlag) { + assert(__sndmgrReady); + _availableDrivers.clear(); + + // Build up a list of available drivers. Currently we only implement an Adlib driver + SoundDriverEntry sd; + sd.driverNum = ADLIB_DRIVER_NUM; + sd.status = detectFlag ? SNDSTATUS_DETECTED : SNDSTATUS_SKIPPED; + sd.field2 = 0; + sd.field6 = 15000; + sd.shortDescription = "Adlib or SoundBlaster"; + sd.longDescription = "3812fm"; + _availableDrivers.push_back(sd); + + _driversDetected = true; + return _availableDrivers; +} + +void SoundManager::installConfigDrivers() { + installDriver(ADLIB_DRIVER_NUM); +} + +Common::List<SoundDriverEntry> &SoundManager::getDriverList(bool detectFlag) { + if (detectFlag) + return _availableDrivers; + else + return buildDriverList(false); +} + +void SoundManager::dumpDriverList() { + _availableDrivers.clear(); +} + +/** + * Install the specified driver number + */ +void SoundManager::installDriver(int driverNum) { + // If driver is already installed, no need to install it + if (isInstalled(driverNum)) + return; + + // Instantiate the sound driver + SoundDriver *driver = instantiateDriver(driverNum); + if (!driver) + return; + + assert((_ourDrvResVersion >= driver->_minVersion) && (_ourDrvResVersion <= driver->_maxVersion)); + + // Mute any loaded sounds + Common::StackLock slock(_serverDisabledMutex); + + for (Common::List<Sound *>::iterator i = _playList.begin(); i != _playList.end(); ++i) + (*i)->mute(true); + + // Install the driver + if (!_sfInstallDriver(driver)) + error("Sound driver initialization failed"); + + switch (driverNum) { + case ROLAND_DRIVER_NUM: + case ADLIB_DRIVER_NUM: { + // Handle loading bank infomation + byte *bankData = _resourceManager->getResource(RES_BANK, driverNum, 0, true); + if (bankData) { + // Install the patch bank data + _sfInstallPatchBank(driver, bankData); + DEALLOCATE(bankData); + } else { + // Could not locate patch bank data, so unload the driver + _sfUnInstallDriver(driver); + + // Unmute currently active sounds + for (Common::List<Sound *>::iterator i = _playList.begin(); i != _playList.end(); ++i) + (*i)->mute(false); + } + break; + } + } +} + +/** + * Instantiate a driver class for the specified driver number + */ +SoundDriver *SoundManager::instantiateDriver(int driverNum) { + assert(driverNum == ADLIB_DRIVER_NUM); + return new AdlibSoundDriver(); +} + +/** + * Uninstall the specified driver + */ +void SoundManager::unInstallDriver(int driverNum) { + Common::List<SoundDriver *>::const_iterator i; + for (i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) { + if ((*i)->_driverResID == driverNum) { + // Found driver to remove + + // Mute any loaded sounds + Common::StackLock slock(_serverDisabledMutex); + + Common::List<Sound *>::iterator j; + for (j = _playList.begin(); j != _playList.end(); ++j) + (*j)->mute(true); + + // Uninstall the driver + _sfUnInstallDriver(*i); + + // Re-orient all the loaded sounds + for (j = _soundList.begin(); j != _soundList.end(); ++j) + (*j)->orientAfterDriverChange(); + + // Unmute currently active sounds + for (j = _playList.begin(); j != _playList.end(); ++j) + (*j)->mute(false); + } + } +} + +/** + * Returns true if a specified driver number is currently installed + */ +bool SoundManager::isInstalled(int driverNum) const { + Common::List<SoundDriver *>::const_iterator i; + for (i = _installedDrivers.begin(); i != _installedDrivers.end(); ++i) { + if ((*i)->_driverResID == driverNum) + return true; + } + + return false; +} + +void SoundManager::setMasterVol(int volume) { + _sfSetMasterVol(volume); +} + +int SoundManager::getMasterVol() const { + return _masterVol; +} + +void SoundManager::loadSound(int soundNum, bool showErrors) { + // This method preloaded the data associated with a given sound, so is now redundant +} + +void SoundManager::unloadSound(int soundNum) { + // This method signalled the resource manager to unload the data for a sound, and is now redundant +} + +int SoundManager::determineGroup(const byte *soundData) { + return _sfDetermineGroup(soundData); +} + +void SoundManager::checkResVersion(const byte *soundData) { + int maxVersion = READ_LE_UINT16(soundData + 4); + int minVersion = READ_LE_UINT16(soundData + 6); + + if (_soundManager->_ourSndResVersion < minVersion) + error("Attempt to play/prime sound resource that is too new"); + if (_soundManager->_ourSndResVersion > maxVersion) + error("Attempt to play/prime sound resource that is too old"); +} + +int SoundManager::extractPriority(const byte *soundData) { + return READ_LE_UINT16(soundData + 12); } +int SoundManager::extractLoop(const byte *soundData) { + return READ_LE_UINT16(soundData + 14); +} + +void SoundManager::extractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum) { + _sfExtractTrackInfo(trackInfo, soundData, groupNum); +} + +void SoundManager::addToSoundList(Sound *sound) { + if (!contains(_soundList, sound)) + _soundList.push_back(sound); +} + +void SoundManager::removeFromSoundList(Sound *sound) { + _soundList.remove(sound); +} + +void SoundManager::addToPlayList(Sound *sound) { + _sfAddToPlayList(sound); +} + +void SoundManager::removeFromPlayList(Sound *sound) { + _sfRemoveFromPlayList(sound); +} + +bool SoundManager::isOnPlayList(Sound *sound) { + return _sfIsOnPlayList(sound); +} + +void SoundManager::updateSoundVol(Sound *sound) { + _sfUpdateVolume(sound); +} + +void SoundManager::updateSoundPri(Sound *sound) { + _sfUpdatePriority(sound); +} + +void SoundManager::updateSoundLoop(Sound *sound) { + _sfUpdateLoop(sound); +} + +void SoundManager::rethinkVoiceTypes() { + Common::StackLock slock(sfManager()._serverSuspendedMutex); + _sfRethinkVoiceTypes(); +} + +void SoundManager::_sfSoundServer() { + Common::StackLock slock1(sfManager()._serverDisabledMutex); + Common::StackLock slock2(sfManager()._serverSuspendedMutex); + + if (sfManager()._needToRethink) { + _sfRethinkVoiceTypes(); + sfManager()._needToRethink = false; + } else { + _sfDereferenceAll(); + } + + // Handle any fading if necessary + _sfProcessFading(); + + // Poll all sound drivers in case they need it + for (Common::List<SoundDriver *>::iterator i = sfManager()._installedDrivers.begin(); + i != sfManager()._installedDrivers.end(); ++i) { + (*i)->poll(); + } +} + +void SoundManager::_sfProcessFading() { + // Loop through processing active sounds + bool removeFlag = false; + Common::List<Sound *>::iterator i = sfManager()._playList.begin(); + while (i != sfManager()._playList.end()) { + Sound *s = *i; + ++i; + + if (!s->_pausedCount) + removeFlag = s->_soServiceTracks(); + if (removeFlag) { + _sfDoRemoveFromPlayList(s); + s->_stoppedAsynchronously = true; + sfManager()._needToRethink = true; + } + + if (s->_fadeDest != -1) { + if (s->_fadeCounter != 0) + --s->_fadeCounter; + else { + if (s->_volume >= s->_fadeDest) { + s->_volume = ((s->_volume - s->_fadeDest) > s->_fadeSteps) ? + s->_volume - s->_fadeSteps : s->_fadeDest; + } else { + s->_volume = ((s->_fadeDest - s->_volume) > s->_fadeSteps) ? + s->_volume + s->_fadeSteps : s->_fadeDest; + } + + _sfDoUpdateVolume(s); + if (s->_volume != s->_fadeDest) + s->_fadeCounter = s->_fadeTicks; + else { + s->_fadeDest = -1; + if (s->_stopAfterFadeFlag) { + _sfDoRemoveFromPlayList(s); + s->_stoppedAsynchronously = true; + sfManager()._needToRethink = true; + } + } + } + } + } + + // Loop through the voiceType list + for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { + VoiceTypeStruct *vtStruct = sfManager()._voiceTypeStructPtrs[voiceIndex]; + if (!vtStruct) + continue; + + if (vtStruct->_voiceType == VOICETYPE_1) { + for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { + if (vtStruct->_entries[idx]._type1._field6 >= -1) + ++vtStruct->_entries[idx]._type1._field6; + } + } + } +} + +void SoundManager::_sfUpdateVoiceStructs() { + for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { + VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; + if (!vs) + continue; + + if (vs->_voiceType == VOICETYPE_0) { + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + + vse._type0._sound = vse._type0._sound2; + vse._type0._channelNum = vse._type0._channelNum2; + vse._type0._priority = vse._type0._priority2; + vse._type0._fieldA = vse._type0._field12; + } + } else { + vs->_field3 = vs->_numVoices; + + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + + vse._type1._sound = vse._type1._sound2; + vse._type1._channelNum = vse._type1._channelNum2; + vse._type1._priority = vse._type1._priority2; + } + } + } +} + +void SoundManager::_sfUpdateVoiceStructs2() { + for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { + VoiceTypeStruct *vtStruct = sfManager()._voiceTypeStructPtrs[voiceIndex]; + if (!vtStruct) + continue; + + for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { + + if (vtStruct->_voiceType == VOICETYPE_0) { + VoiceStructEntryType0 &vse = vtStruct->_entries[idx]._type0; + vse._sound2 = vse._sound; + vse._channelNum2 = vse._channelNum; + vse._priority2 = vse._priority; + vse._field12 = vse._fieldA; + } else { + VoiceStructEntryType1 &vse = vtStruct->_entries[idx]._type1; + vse._sound2 = vse._sound; + vse._channelNum2 = vse._channelNum; + vse._priority2 = vse._priority; + } + } + } +} + +void SoundManager::_sfUpdateCallback(void *ref) { + ((SoundManager *)ref)->update(); +} + +/*--------------------------------------------------------------------------*/ + void SoundManager::saveNotifier(bool postFlag) { - _globals->_soundManager.saveNotifierProc(postFlag); + _soundManager->saveNotifierProc(postFlag); } void SoundManager::saveNotifierProc(bool postFlag) { @@ -42,7 +477,7 @@ void SoundManager::saveNotifierProc(bool postFlag) { } void SoundManager::loadNotifier(bool postFlag) { - _globals->_soundManager.loadNotifierProc(postFlag); + _soundManager->loadNotifierProc(postFlag); } void SoundManager::loadNotifierProc(bool postFlag) { @@ -51,7 +486,2162 @@ void SoundManager::loadNotifierProc(bool postFlag) { void SoundManager::listenerSynchronize(Serializer &s) { s.validate("SoundManager"); - warning("TODO: SoundManager listenerSynchronize"); + warning("TODO: SoundManager listenerSynchronise"); +} + +/*--------------------------------------------------------------------------*/ + +SoundManager &SoundManager::sfManager() { + assert(_soundManager); + return *_soundManager; +} + +int SoundManager::_sfDetermineGroup(const byte *soundData) { + const byte *p = soundData + READ_LE_UINT16(soundData + 8); + uint32 v; + while ((v = READ_LE_UINT32(p)) != 0) { + if ((v & _soundManager->_groupsAvail) == v) + return v; + + p += 6 + (READ_LE_UINT16(p + 4) * 4); + } + + return 0; +} + +void SoundManager::_sfAddToPlayList(Sound *sound) { + Common::StackLock slock(sfManager()._serverSuspendedMutex); + + _sfDoAddToPlayList(sound); + sound->_stoppedAsynchronously = false; + _sfRethinkVoiceTypes(); +} + +void SoundManager::_sfRemoveFromPlayList(Sound *sound) { + Common::StackLock slock(sfManager()._serverSuspendedMutex); + + if (_sfDoRemoveFromPlayList(sound)) + _sfRethinkVoiceTypes(); +} + +bool SoundManager::_sfIsOnPlayList(Sound *sound) { + Common::StackLock slock(sfManager()._serverSuspendedMutex); + + bool result = contains(_soundManager->_playList, sound); + + return result; +} + +void SoundManager::_sfRethinkSoundDrivers() { + // Free any existing entries + int idx; + + for (idx = 0; idx < SOUND_ARR_SIZE; ++idx) { + if (sfManager()._voiceTypeStructPtrs[idx]) { + delete sfManager()._voiceTypeStructPtrs[idx]; + sfManager()._voiceTypeStructPtrs[idx] = NULL; + } + } + + for (idx = 0; idx < SOUND_ARR_SIZE; ++idx) { + byte flag = 0xff; + int total = 0; + + // Loop through the sound drivers + for (Common::List<SoundDriver *>::iterator i = sfManager()._installedDrivers.begin(); + i != sfManager()._installedDrivers.end(); ++i) { + // Process the group data for each sound driver + SoundDriver *driver = *i; + const byte *groupData = driver->_groupOffset->pData; + + while (*groupData != 0xff) { + byte byteVal = *groupData++; + + if (byteVal == idx) { + byte byteVal2 = *groupData++; + if (flag == 0xff) + flag = byteVal2; + else { + assert(flag == byteVal2); + } + + if (!flag) { + while (*groupData++ != 0xff) + ++total; + } else { + total += *groupData; + groupData += 2; + } + } else if (*groupData++ == 0) { + while (*groupData != 0xff) + ++groupData; + ++groupData; + } else { + groupData += 2; + } + } + } + + if (total) { + VoiceTypeStruct *vs = new VoiceTypeStruct(); + sfManager()._voiceTypeStructPtrs[idx] = vs; + + if (!flag) { + vs->_voiceType = VOICETYPE_0; + } else { + vs->_voiceType = VOICETYPE_1; + } + + vs->_total = vs->_numVoices = total; + vs->_field3 = 0; + + for (Common::List<SoundDriver *>::iterator i = sfManager()._installedDrivers.begin(); + i != sfManager()._installedDrivers.end(); ++i) { + // Process the group data for each sound driver + SoundDriver *driver = *i; + const byte *groupData = driver->_groupOffset->pData; + + while (*groupData != 0xff) { + byte byteVal = *groupData++; + + if (byteVal == idx) { + ++groupData; + + if (!flag) { + while ((byteVal = *groupData++) != 0xff) { + VoiceStructEntry ve; + memset(&ve, 0, sizeof(VoiceStructEntry)); + + ve._field1 = (byteVal & 0x80) ? 0 : 1; + ve._driver = driver; + ve._type0._sound = NULL; + ve._type0._channelNum = 0; + ve._type0._priority = 0; + ve._type0._fieldA = 0; + + vs->_entries.push_back(ve); + } + } else { + byteVal = *groupData; + groupData += 2; + + for (idx = 0; idx < byteVal; ++idx) { + VoiceStructEntry ve; + memset(&ve, 0, sizeof(VoiceStructEntry)); + + ve._voiceNum = idx; + ve._driver = driver; + ve._type1._field4 = -1; + ve._type1._field5 = 0; + ve._type1._field6 = 0; + ve._type1._sound = NULL; + ve._type1._channelNum = 0; + ve._type1._priority = 0; + + vs->_entries.push_back(ve); + } + } + } else { + if (*groupData++ != 0) { + while (*groupData != 0xff) + ++groupData; + } else { + groupData += 2; + } + } + } + } + } + } +} + +void SoundManager::_sfRethinkVoiceTypes() { + _sfDereferenceAll(); + + // Pre-processing + for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { + VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; + if (!vs) + continue; + + if (vs->_voiceType == VOICETYPE_0) { + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + vse._type0._sound3 = vse._type0._sound; + vse._type0._channelNum3 = vse._type0._channelNum; + vse._type0._priority3 = vse._type0._priority; + vse._type0._field1A = vse._type0._fieldA; + vse._type0._sound = NULL; + vse._type0._channelNum = 0; + vse._type0._priority = 0; + vse._type0._fieldA = 0; + vse._type0._sound2 = NULL; + vse._type0._channelNum2 = 0; + vse._type0._priority2 = 0; + vse._type0._field12 = 0; + } + } else { + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + vse._type1._sound3 = vse._type1._sound; + vse._type1._channelNum3 = vse._type1._channelNum; + vse._type1._priority3 = vse._type1._priority; + vse._type1._sound = NULL; + vse._type1._channelNum = 0; + vse._type1._priority = 0; + vse._type1._sound2 = NULL; + vse._type1._channelNum2 = 0; + vse._type1._priority2 = 0; + } + + // Reset the number of voices available + vs->_numVoices = vs->_total; + } + } + + // Main processing loop + int priorityOffset = 0; + for (Common::List<Sound *>::iterator i = sfManager()._playList.begin(); i != sfManager()._playList.end(); ++i, priorityOffset += 16) { + Sound *sound = *i; + if ((sound->_mutedCount != 0) || (sound->_pausedCount != 0)) + continue; + + _sfUpdateVoiceStructs(); + Common::set_to(sound->_chWork, sound->_chWork + SOUND_ARR_SIZE, false); + + for (;;) { + // Scan for sub priority + int foundIndex = -1, foundPriority = 0; + for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) { + if (!(sound->_chFlags[idx] & 0x8000) & !sound->_chWork[idx]) { + int subPriority = sound->_chSubPriority[idx]; + if (subPriority) + subPriority = 16 - subPriority + priorityOffset; + + if (foundIndex != -1) { + if (subPriority < foundPriority) { + foundIndex = idx; + foundPriority = subPriority; + } + } else { + foundIndex = idx; + foundPriority = subPriority; + } + } + } + if (foundIndex == -1) + break; + + int chNumVoices = sound->_chNumVoices[foundIndex]; + sound->_chWork[foundIndex] = true; + + VoiceTypeStruct *vtStruct = sfManager()._voiceTypeStructPtrs[sound->_chVoiceType[foundIndex]]; + if (!vtStruct) { + if (foundPriority) + continue; + + _sfUpdateVoiceStructs2(); + break; + } + + if (vtStruct->_voiceType != VOICETYPE_0) { + // Type 1 + int numVoices = vtStruct->_numVoices; + + if (numVoices >= chNumVoices) { + int channelCount = chNumVoices, idx = 0; + while (channelCount > 0) { + if (!vtStruct->_entries[idx]._type1._sound2) { + vtStruct->_entries[idx]._type1._sound2 = sound; + vtStruct->_entries[idx]._type1._channelNum2 = foundIndex; + vtStruct->_entries[idx]._type1._priority2 = foundPriority; + --channelCount; + } + ++idx; + } + + vtStruct->_numVoices -= chNumVoices; + continue; + } else if (!foundPriority) { + do { + int maxPriority = 0; + for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) + maxPriority = MAX(maxPriority, vtStruct->_entries[idx]._type1._priority2); + + if (!maxPriority) { + _sfUpdateVoiceStructs2(); + break; + } + + for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { + if (vtStruct->_entries[idx]._type1._priority2 == maxPriority) { + vtStruct->_entries[idx]._type1._sound2 = NULL; + vtStruct->_entries[idx]._type1._channelNum2 = 0; + vtStruct->_entries[idx]._type1._priority2 = 0; + ++numVoices; + } + } + } while (chNumVoices > numVoices); + + int voicesCtr = chNumVoices; + for (uint idx = 0; (idx < vtStruct->_entries.size()) && (voicesCtr > 0); ++idx) { + if (!vtStruct->_entries[idx]._type1._sound2) { + vtStruct->_entries[idx]._type1._sound2 = sound; + vtStruct->_entries[idx]._type1._channelNum2 = foundIndex; + vtStruct->_entries[idx]._type1._priority2 = foundPriority; + --voicesCtr; + } + } + + numVoices -= chNumVoices; + vtStruct->_numVoices = numVoices; + continue; + } else if (!numVoices) { + break; + } + continue; + } else { + // Type 0 + if (sound->_isEmpty) { + uint idx = 0; + while ((idx < vtStruct->_entries.size()) && + (vtStruct->_entries[idx]._voiceNum == foundIndex)) + ++idx; + if (idx == vtStruct->_entries.size()) + continue; + } + + int flagsVal = sound->_chFlags[foundIndex] & 3; + if (flagsVal != 1) { + // All modes except mode 1 (loc_23EDF) + int entryIndex = -1, maxVoiceNum = 0; + + for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { + if (!vtStruct->_entries[idx]._type0._sound2 && (vtStruct->_entries[idx]._field1 != 0) && + (vtStruct->_entries[idx]._voiceNum > maxVoiceNum)) { + maxVoiceNum = vtStruct->_entries[idx]._voiceNum; + entryIndex = idx; + } + } + + if (entryIndex != -1) { + vtStruct->_entries[entryIndex]._type0._sound2 = sound; + vtStruct->_entries[entryIndex]._type0._channelNum2 = foundIndex; + vtStruct->_entries[entryIndex]._type0._priority2 = foundPriority; + vtStruct->_entries[entryIndex]._type0._field12 = 0; + continue; + } + + if (foundPriority != 0) + continue; + + int maxPriority = 0; + entryIndex = -1; + for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { + if ((vtStruct->_entries[idx]._field1 != 0) && + (vtStruct->_entries[idx]._type0._priority2 > maxVoiceNum)) { + maxPriority = vtStruct->_entries[idx]._type0._priority2; + entryIndex = idx; + } + } + + if (entryIndex != -1) { + vtStruct->_entries[entryIndex]._type0._sound2 = sound; + vtStruct->_entries[entryIndex]._type0._channelNum2 = foundIndex; + vtStruct->_entries[entryIndex]._type0._priority2 = foundPriority; + vtStruct->_entries[entryIndex]._type0._field12 = 0; + continue; + } + + _sfUpdateVoiceStructs2(); + break; + } else { + // Channel mode 1 handling (loc_23FAC) + + bool foundMatch = false; + int entryIndex = -1; + for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { + if (vtStruct->_entries[idx]._voiceNum == foundIndex) { + foundIndex = true; + if (!vtStruct->_entries[idx]._type0._sound2) { + entryIndex = idx; + break; + } + } + } + + if (entryIndex != -1) { + vtStruct->_entries[entryIndex]._type0._sound2 = sound; + vtStruct->_entries[entryIndex]._type0._channelNum2 = foundIndex; + vtStruct->_entries[entryIndex]._type0._priority2 = foundPriority; + vtStruct->_entries[entryIndex]._type0._field12 = 0; + continue; + } + + if (!foundMatch) { + if (foundPriority) + continue; + if (entryIndex == -1) { + _sfUpdateVoiceStructs2(); + break; + } + } + + // Find the entry with the highest priority + int maxPriority = 0; + foundMatch = false; + entryIndex = -1; + for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { + if (vtStruct->_entries[idx]._voiceNum != foundIndex) + continue; + if (!vtStruct->_entries[idx]._type0._field12) { + foundMatch = true; + break; + } + + if (vtStruct->_entries[idx]._type0._priority2 > maxPriority) { + maxPriority = vtStruct->_entries[idx]._type0._priority2; + entryIndex = -1; + } + } + + if (!foundMatch) { + if (foundPriority) + continue; + + if (entryIndex != -1) { + vtStruct->_entries[entryIndex]._type0._sound2 = sound; + vtStruct->_entries[entryIndex]._type0._channelNum2 = foundIndex; + vtStruct->_entries[entryIndex]._type0._priority2 = foundPriority; + vtStruct->_entries[entryIndex]._type0._field12 = 1; + continue; + } + + _sfUpdateVoiceStructs2(); + break; + } + + // Found a match (loc_24061) + maxPriority = 0; + int maxVoiceNum = 0; + int priorityIndex = -1, voiceIndex = -1; + + for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { + if (vtStruct->_entries[idx]._field1) { + if (!vtStruct->_entries[idx]._type0._sound2) { + if (vtStruct->_entries[idx]._voiceNum > maxVoiceNum) { + maxVoiceNum = vtStruct->_entries[idx]._voiceNum; + voiceIndex = idx; + } + } else { + if (vtStruct->_entries[idx]._type0._priority2 > maxPriority) { + maxPriority = vtStruct->_entries[idx]._type0._priority2; + priorityIndex = idx; + } + } + } + } + + if (voiceIndex != -1) { + VoiceStructEntryType0 &vteSrc = vtStruct->_entries[foundIndex]._type0; + VoiceStructEntryType0 &vteDest = vtStruct->_entries[voiceIndex]._type0; + + vteDest._sound2 = vteSrc._sound2; + vteDest._channelNum2 = vteSrc._channelNum2; + vteDest._priority2 = vteSrc._priority2; + + vteSrc._sound2 = sound; + vteSrc._channelNum2 = foundIndex; + vteSrc._priority2 = foundPriority; + vteSrc._field12 = 1; + continue; + } + + if (!foundPriority) + continue; + if (priorityIndex == -1) { + _sfUpdateVoiceStructs2(); + break; + } + + VoiceStructEntryType0 &vteSrc = vtStruct->_entries[foundIndex]._type0; + VoiceStructEntryType0 &vteDest = vtStruct->_entries[priorityIndex]._type0; + + if (priorityIndex != foundIndex) { + vteDest._sound2 = vteSrc._sound2; + vteDest._channelNum2 = vteSrc._channelNum2; + vteDest._priority2 = vteSrc._priority2; + vteDest._field12 = vteSrc._field12; + } + + vteSrc._sound2 = sound; + vteSrc._channelNum2 = foundIndex; + vteSrc._priority2 = foundPriority; + vteSrc._field12 = 1; + continue; + } + } + } + } + + // Post-processing + for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { + VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; + if (!vs) + continue; + + if (vs->_voiceType == VOICETYPE_0) { + // Type 0 + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntryType0 &vse = vs->_entries[idx]._type0; + SoundDriver *driver = vs->_entries[idx]._driver; + assert(driver); + + if (vse._field12) { + int total = 0; + vse._sound = vse._sound2; + if (vse._sound3 != vse._sound) + ++total; + + vse._channelNum = vse._channelNum2; + if (vse._channelNum3 != vse._channelNum) + ++total; + + vse._priority = vse._priority2; + vse._fieldA = 1; + vse._sound2 = NULL; + + if (total) { + driver->proc24(vse._channelNum, idx, vse._sound, 123, 0); + driver->proc24(vse._channelNum, idx, vse._sound, 1, vse._sound->_chModulation[vse._channelNum]); + driver->proc24(vse._channelNum, idx, vse._sound, 7, + vse._sound->_chVolume[vse._channelNum] * vse._sound->_volume / 127); + driver->proc24(vse._channelNum, idx, vse._sound, 10, vse._sound->_chPan[vse._channelNum]); + driver->proc24(vse._channelNum, idx, vse._sound, 64, vse._sound->_chDamper[vse._channelNum]); + + driver->setProgram(vse._channelNum, vse._sound->_chProgram[vse._channelNum]); + driver->setPitchBlend(vse._channelNum, vse._sound->_chPitchBlend[vse._channelNum]); + + vse._sound3 = NULL; + } + } else { + vse._sound = NULL; + vse._channelNum = 0; + vse._priority = 0; + vse._fieldA = 0; + } + } + + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntryType0 &vse = vs->_entries[idx]._type0; + Sound *sound = vse._sound2; + int channelNum = vse._channelNum2; + + if (!sound) + continue; + + for (uint entryIndex = 0; entryIndex < vs->_entries.size(); ++entryIndex) { + if ((vs->_entries[entryIndex]._type0._sound3 != sound) || + (vs->_entries[entryIndex]._type0._channelNum3 != channelNum)) { + // Found match + vs->_entries[entryIndex]._type0._sound = sound; + vs->_entries[entryIndex]._type0._channelNum = channelNum; + vs->_entries[entryIndex]._type0._priority = vse._priority2; + vs->_entries[entryIndex]._type0._fieldA = 0; + vse._sound2 = NULL; + break; + } + } + } + + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntryType0 &vse = vs->_entries[idx]._type0; + Sound *sound = vse._sound2; + if (!sound) + continue; + + int voiceNum = 0, foundIndex = -1; + for (uint entryIndex = 0; entryIndex < vs->_entries.size(); ++entryIndex) { + if ((vs->_entries[entryIndex]._field1) && !vs->_entries[entryIndex]._type0._sound) { + int tempVoice = vs->_entries[entryIndex]._voiceNum; + + if (voiceNum <= tempVoice) { + voiceNum = tempVoice; + foundIndex = entryIndex; + } + } + } + assert(foundIndex != -1); + + VoiceStructEntryType0 &vseFound = vs->_entries[foundIndex]._type0; + + vseFound._sound = vse._sound2; + vseFound._channelNum = vse._channelNum2; + vseFound._priority = vse._priority2; + vseFound._fieldA = 0; + + SoundDriver *driver = vs->_entries[foundIndex]._driver; + assert(driver); + + driver->proc24(vseFound._channelNum, voiceIndex, vseFound._sound, 123, 0); + driver->proc24(vseFound._channelNum, voiceIndex, vseFound._sound, + 1, vseFound._sound->_chModulation[vseFound._channelNum]); + driver->proc24(vseFound._channelNum, voiceIndex, vseFound._sound, + 7, vseFound._sound->_chVolume[vseFound._channelNum] * vseFound._sound->_volume / 127); + driver->proc24(vseFound._channelNum, voiceIndex, vseFound._sound, + 10, vseFound._sound->_chPan[vseFound._channelNum]); + driver->setProgram(vseFound._channelNum, vseFound._sound->_chProgram[vseFound._channelNum]); + driver->setPitchBlend(vseFound._channelNum, vseFound._sound->_chPitchBlend[vseFound._channelNum]); + } + + // Final loop + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntryType0 &vse = vs->_entries[idx]._type0; + + if (!vse._sound && (vse._sound3)) { + SoundDriver *driver = vs->_entries[idx]._driver; + assert(driver); + driver->proc24(vs->_entries[idx]._voiceNum, voiceIndex, vse._sound3, 123, 0); + } + } + + } else { + // Type 1 + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + vse._type1._sound = NULL; + vse._type1._channelNum = 0; + vse._type1._priority = 0; + } + + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntryType1 &vse = vs->_entries[idx]._type1; + Sound *sound = vse._sound2; + int channelNum = vse._channelNum2; + + if (!sound) + continue; + + for (uint entryIndex = 0; entryIndex < vs->_entries.size(); ++entryIndex) { + VoiceStructEntryType1 &vse2 = vs->_entries[entryIndex]._type1; + if (!vse2._sound && (vse2._sound3 == sound) && (vse2._channelNum3 == channelNum)) { + vse2._sound = sound; + vse2._channelNum = channelNum; + vse._channelNum = vse2._channelNum2; + vse._priority = vse2._priority2; + vse._sound2 = NULL; + break; + } + } + } + + uint idx2 = 0; + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntryType1 &vse = vs->_entries[idx]._type1; + Sound *sound = vse._sound2; + if (!sound) + continue; + + while (vs->_entries[idx2]._type1._sound) + ++idx2; + + VoiceStructEntryType1 &vse2 = vs->_entries[idx2]._type1; + vse2._sound = vse._sound2; + vse2._channelNum = vse._channelNum2; + vse2._priority = vse._priority2; + vse._field4 = -1; + vse2._field5 = 0; + vse2._field6 = 0; + + SoundDriver *driver = vs->_entries[idx2]._driver; + assert(driver); + + driver->updateVoice(vs->_entries[idx2]._voiceNum); + driver->proc38(vs->_entries[idx2]._voiceNum, 1, vse2._sound->_chModulation[vse2._channelNum]); + driver->proc38(vs->_entries[idx2]._voiceNum, 7, + vse2._sound->_chVolume[vse2._channelNum] * vse2._sound->_volume / 127); + driver->proc38(vs->_entries[idx2]._voiceNum, 10, vse2._sound->_chPan[vse2._channelNum]); + driver->setPitch(vs->_entries[idx2]._voiceNum, vse2._sound->_chPitchBlend[vse2._channelNum]); + } + + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntryType1 &vse = vs->_entries[idx]._type1; + + if (!vse._sound && (vse._sound3)) { + vse._field4 = -1; + vse._field5 = 0; + vse._field6 = 0; + + SoundDriver *driver = vs->_entries[idx]._driver; + assert(driver); + driver->updateVoice(voiceIndex); + } + } + } + } +} + +void SoundManager::_sfUpdateVolume(Sound *sound) { + _sfDereferenceAll(); + _sfDoUpdateVolume(sound); +} + +void SoundManager::_sfDereferenceAll() { + // Orignal used handles for both the driver list and voiceStructPtrs list. This method then refreshed + // pointer lists based on the handles. Since in ScummVM we're just using pointers directly, this + // method doesn't need any implementation +} + +void SoundManager::_sfUpdatePriority(Sound *sound) { + Common::StackLock slock(sfManager()._serverSuspendedMutex); + + int tempPriority = (sound->_fixedPriority == 255) ? sound->_sndResPriority : sound->_priority; + if (sound->_priority != tempPriority) { + sound->_priority = tempPriority; + if (_sfDoRemoveFromPlayList(sound)) { + _sfDoAddToPlayList(sound); + _sfRethinkVoiceTypes(); + } + } +} + +void SoundManager::_sfUpdateLoop(Sound *sound) { + if (sound->_fixedLoop) + sound->_loop = sound->_sndResLoop; + else + sound->_loop = sound->_fixedLoop; +} + +void SoundManager::_sfSetMasterVol(int volume) { + if (volume > 127) + volume = 127; + + if (volume != _soundManager->_masterVol) { + _soundManager->_masterVol = volume; + + for (Common::List<SoundDriver *>::iterator i = _soundManager->_installedDrivers.begin(); + i != _soundManager->_installedDrivers.end(); ++i) { + (*i)->setMasterVolume(volume); + } + } +} + +void SoundManager::_sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum) { + trackInfo->_numTracks = 0; + + const byte *p = soundData + READ_LE_UINT16(soundData + 8); + uint32 v; + while ((v = READ_LE_UINT32(p)) != 0) { + if ((v == 0x80000000) || (v == (uint)groupNum)) { + // Found group to process + int count = READ_LE_UINT16(p + 4); + p += 6; + + for (int idx = 0; idx < count; ++idx) { + if (trackInfo->_numTracks == 16) { + trackInfo->_numTracks = -1; + return; + } + + trackInfo->_chunks[trackInfo->_numTracks] = READ_LE_UINT16(p); + trackInfo->_voiceTypes[trackInfo->_numTracks] = READ_LE_UINT16(p + 2); + ++trackInfo->_numTracks; + p += 4; + } + } else { + // Not correct group, so move to next one + p += 6 + (READ_LE_UINT16(p + 4) * 4); + } + } +} + +void SoundManager::_sfTerminate() { + +} + +void SoundManager::_sfExtractGroupMask() { + uint32 mask = 0; + + for (Common::List<SoundDriver *>::iterator i = sfManager()._installedDrivers.begin(); + i != sfManager()._installedDrivers.end(); ++i) + mask |= (*i)->_groupMask; + + _soundManager->_groupsAvail = mask; +} + +bool SoundManager::_sfInstallDriver(SoundDriver *driver) { + if (!driver->open()) + return false; + + driver->setUpdateCallback(_sfUpdateCallback, (void *)&sfManager()); + sfManager()._installedDrivers.push_back(driver); + driver->_groupOffset = driver->getGroupData(); + driver->_groupMask = READ_LE_UINT32(driver->_groupOffset); + + _sfExtractGroupMask(); + _sfRethinkSoundDrivers(); + driver->setMasterVolume(sfManager()._masterVol); + + return true; +} + +void SoundManager::_sfUnInstallDriver(SoundDriver *driver) { + sfManager()._installedDrivers.remove(driver); + delete driver; + + _sfExtractGroupMask(); + _sfRethinkSoundDrivers(); +} + +void SoundManager::_sfInstallPatchBank(SoundDriver *driver, const byte *bankData) { + driver->installPatch(bankData, _vm->_memoryManager.getSize(bankData)); +} + +/** + * Adds the specified sound in the playing sound list, inserting in order of priority + */ +void SoundManager::_sfDoAddToPlayList(Sound *sound) { + Common::StackLock slock2(sfManager()._serverSuspendedMutex); + + Common::List<Sound *>::iterator i = sfManager()._playList.begin(); + while ((i != sfManager()._playList.end()) && (sound->_priority > (*i)->_priority)) + ++i; + + sfManager()._playList.insert(i, sound); +} + +/** + * Removes the specified sound from the play list + */ +bool SoundManager::_sfDoRemoveFromPlayList(Sound *sound) { + Common::StackLock slock(sfManager()._serverSuspendedMutex); + + bool result = false; + for (Common::List<Sound *>::iterator i = sfManager()._playList.begin(); i != sfManager()._playList.end(); ++i) { + if (*i == sound) { + result = true; + sfManager()._playList.erase(i); + break; + } + } + + return result; +} + +void SoundManager::_sfDoUpdateVolume(Sound *sound) { + Common::StackLock slock(sfManager()._serverSuspendedMutex); + + for (int voiceIndex = 0; voiceIndex < SOUND_ARR_SIZE; ++voiceIndex) { + VoiceTypeStruct *vs = sfManager()._voiceTypeStructPtrs[voiceIndex]; + if (!vs) + continue; + + for (uint idx = 0; idx < vs->_entries.size(); ++idx) { + VoiceStructEntry &vse = vs->_entries[idx]; + SoundDriver *driver = vse._driver; + + if (vs->_voiceType == VOICETYPE_0) { + if (!vse._type0._sound) { + int vol = sound->_volume * sound->_chVolume[vse._type0._channelNum] / 127; + driver->proc24(voiceIndex, vse._voiceNum, sound, 7, vol); + } + } else { + if (!vse._type1._sound) { + int vol = sound->_volume * sound->_chVolume[vse._type1._channelNum] / 127; + driver->setVolume1(voiceIndex, vse._voiceNum, 7, vol); + } + } + } + } +} + +/*--------------------------------------------------------------------------*/ + +Sound::Sound() { + _stoppedAsynchronously = false; + _soundResID = 0; + _group = 0; + _sndResPriority = 0; + _fixedPriority = -1; + _sndResLoop = 1; + _fixedLoop = -1; + _priority = 0; + _volume = 127; + _loop = 0; + _pausedCount = 0; + _mutedCount = 0; + _hold = 0xff; + _cueValue = -1; + _fadeDest = -1; + _fadeSteps = 0; + _fadeTicks = 0; + _fadeCounter = 0; + _stopAfterFadeFlag = false; + _timer = 0; + _loopTimer = 0; + _trackInfo._numTracks = 0; + _primed = false; + _isEmpty = false; + _remoteReceiver = NULL; + + + memset(_chProgram, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_chModulation, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_chVolume, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_chPan, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_chDamper, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_chPitchBlend, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_chVoiceType, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_chNumVoices, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_chSubPriority, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_chFlags, 0, SOUND_ARR_SIZE * sizeof(int)); + Common::set_to(_chWork, _chWork + SOUND_ARR_SIZE, false); + memset(_channelData, 0, SOUND_ARR_SIZE * sizeof(byte *)); + memset(_trkChannel, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_trkState, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_trkLoopState, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_trkIndex, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_trkLoopIndex, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_trkRest, 0, SOUND_ARR_SIZE * sizeof(int)); + memset(_trkLoopRest, 0, SOUND_ARR_SIZE * sizeof(int)); +} + +Sound::~Sound() { + stop(); +} + +void Sound::play(int soundNum) { + prime(soundNum); + _soundManager->addToPlayList(this); +} + +void Sound::stop() { + _unPrime(); +} + +void Sound::prime(int soundResID) { + if (_soundResID != -1) { + stop(); + _prime(soundResID, false); + } +} + +void Sound::unPrime() { + stop(); +} + +void Sound::_prime(int soundResID, bool dontQueue) { + if (_primed) + unPrime(); + + if (_soundResID != -1) { + // Sound number specified + _isEmpty = false; + _remoteReceiver = NULL; + byte *soundData = _resourceManager->getResource(RES_SOUND, soundResID, 0); + _soundManager->checkResVersion(soundData); + _group = _soundManager->determineGroup(soundData); + _sndResPriority = _soundManager->extractPriority(soundData); + _sndResLoop = _soundManager->extractLoop(soundData); + _soundManager->extractTrackInfo(&_trackInfo, soundData, _group); + + for (int idx = 0; idx < _trackInfo._numTracks; ++idx) { + _channelData[idx] = _resourceManager->getResource(RES_SOUND, soundResID, _trackInfo._chunks[idx]); + } + + DEALLOCATE(soundData); + } else { + // No sound specified + _isEmpty = true; + _group = 0; + _sndResPriority = 0; + _sndResLoop = 0; + _trackInfo._numTracks = 0; + _channelData[0] = ALLOCATE(200); + _remoteReceiver = ALLOCATE(200); + } + + _soPrimeSound(dontQueue); + if (!dontQueue) + _soundManager->addToSoundList(this); + + _primed = true; +} + +void Sound::_unPrime() { + if (_primed) { + if (_isEmpty) { + DEALLOCATE(_channelData[0]); + DEALLOCATE(_remoteReceiver); + _remoteReceiver = NULL; + } else { + for (int idx = 0; idx < _trackInfo._numTracks; ++idx) { + DEALLOCATE(_channelData[idx]); + } + } + + _trackInfo._numTracks = 0; + if (_soundManager) + _soundManager->removeFromSoundList(this); + + _primed = false; + _stoppedAsynchronously = false; + } +} + +void Sound::orientAfterDriverChange() { + if (!_isEmpty) { + int timeIndex = getTimeIndex(); + + for (int idx = 0; idx < _trackInfo._numTracks; ++idx) + DEALLOCATE(_channelData[idx]); + + _trackInfo._numTracks = 0; + _primed = false; + _prime(_soundResID, true); + setTimeIndex(timeIndex); + } +} + +void Sound::orientAfterRestore() { + if (_isEmpty) { + int timeIndex = getTimeIndex(); + _primed = false; + _prime(_soundResID, true); + setTimeIndex(timeIndex); + } +} + +void Sound::go() { + if (!_primed) + error("Attempt to execute Sound::go() on an unprimed Sound"); + + _soundManager->addToPlayList(this); +} + +void Sound::halt(void) { + _soundManager->removeFromPlayList(this); +} + +int Sound::getSoundNum() const { + return _soundResID; +} + +bool Sound::isPlaying() { + return _soundManager->isOnPlayList(this); +} + +bool Sound::isPrimed() const { + return _primed; +} + +bool Sound::isPaused() const { + return _pausedCount != 0; +} + +bool Sound::isMuted() const { + return _mutedCount != 0; +} + +void Sound::pause(bool flag) { + Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex); + + if (flag) + ++_pausedCount; + else if (_pausedCount > 0) + --_pausedCount; + + _soundManager->rethinkVoiceTypes(); +} + +void Sound::mute(bool flag) { + Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex); + + if (flag) + ++_mutedCount; + else if (_mutedCount > 0) + --_mutedCount; + + _soundManager->rethinkVoiceTypes(); +} + +void Sound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag) { + Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex); + + if (fadeDest > 127) + fadeDest = 127; + if (fadeTicks > 127) + fadeTicks = 127; + if (fadeSteps > 255) + fadeSteps = 255; + + _fadeDest = fadeDest; + _fadeTicks = fadeTicks; + _fadeSteps = fadeSteps; + _fadeCounter = 0; + _stopAfterFadeFlag = stopAfterFadeFlag; +} + +void Sound::setTimeIndex(uint32 timeIndex) { + if (_primed) { + mute(true); + _soSetTimeIndex(timeIndex); + mute(false); + } +} + +uint32 Sound::getTimeIndex() const { + return _timer; +} + +int Sound::getCueValue() const { + return _cueValue; +} + +void Sound::setCueValue(int cueValue) { + _cueValue = cueValue; +} + +void Sound::setVol(int volume) { + if (volume > 127) + volume = 127; + + if (_volume != volume) { + _volume = volume; + if (isPlaying()) + _soundManager->updateSoundVol(this); + } +} + +int Sound::getVol() const { + return _volume; +} + +void Sound::setPri(int priority) { + if (priority > 127) + priority = 127; + _fixedPriority = priority; + _soundManager->updateSoundPri(this); +} + +void Sound::setLoop(int flag) { + _fixedLoop = flag; + _soundManager->updateSoundLoop(this); +} + +int Sound::getPri() const { + return _priority; +} + +int Sound::getLoop() { + return _loop; +} + +void Sound::holdAt(int amount) { + if (amount > 127) + amount = 127; + _hold = amount; +} + +void Sound::release() { + _hold = -1; +} + +void Sound::_soPrimeSound(bool dontQueue) { + if (!dontQueue) { + _priority = (_fixedPriority != -1) ? _fixedPriority : _sndResPriority; + _loop = !_fixedLoop ? _fixedLoop : _sndResLoop; + _pausedCount = 0; + _mutedCount = 0; + _hold = -1; + _cueValue = -1; + _fadeDest = -1; + _fadeSteps = 0; + _fadeTicks = 0; + _fadeCounter = 0; + _stopAfterFadeFlag = false; + } + + _timer = 0; + _loopTimer = 0; + _soPrimeChannelData(); +} + +void Sound::_soSetTimeIndex(uint timeIndex) { + Common::StackLock slock(_globals->_soundManager._serverSuspendedMutex); + + if (timeIndex != _timer) { + _soundManager->_soTimeIndexFlag = true; + _timer = 0; + _loopTimer = 0; + _soPrimeChannelData(); + + while (timeIndex > 0) { + if (_soServiceTracks()) { + SoundManager::_sfDoRemoveFromPlayList(this); + _stoppedAsynchronously = true; + _soundManager->_needToRethink = true; + break; + } + } + + _soundManager->_soTimeIndexFlag = false; + } +} + +bool Sound::_soServiceTracks() { + if (_isEmpty) { + _soRemoteReceive(); + return false; + } + + bool flag = true; + for (int trackCtr = 0; trackCtr < _trackInfo._numTracks; ++trackCtr) { + int mode = *_channelData[trackCtr]; + + if (mode == 0) { + _soServiceTrackType0(trackCtr, _channelData[trackCtr]); + } else if (mode == 1) { + _soServiceTrackType1(trackCtr, _channelData[trackCtr]); + } else { + error("Unknown sound mode encountered"); + } + + if (_trkState[trackCtr]) + flag = false; + } + + ++_timer; + if (!flag) + return false; + else if ((_loop > 0) && (--_loop == 0)) + return true; + else { + for (int trackCtr = 0; trackCtr < _trackInfo._numTracks; ++trackCtr) { + _trkState[trackCtr] = _trkLoopState[trackCtr]; + _trkRest[trackCtr] = _trkLoopRest[trackCtr]; + _trkIndex[trackCtr] = _trkLoopIndex[trackCtr]; + } + + _timer = _loopTimer; + return false; + } +} + +void Sound::_soPrimeChannelData() { + if (_isEmpty) { + for (int idx = 0; idx < 16; ++idx) { + _chProgram[idx] = 0; + _chModulation[idx] = 0; + _chVolume[idx] = 127; + _chPan[idx] = 64; + _chDamper[idx] = 0; + _chVoiceType[idx] = VOICETYPE_0; + _chNumVoices[idx] = 0; + _chSubPriority[idx] = 0; + _chPitchBlend[idx] = 0x2000; + _chFlags[idx] = 1; + } + + _trkChannel[0] = 0; + _trkState[0] = 1; + _trkLoopState[0] = 1; + _trkIndex[0] = 0; + _trkLoopIndex[0] = 0; + } else { + for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) + _chFlags[idx] = 0x8000; + + for (int idx = 0; idx < _trackInfo._numTracks; ++idx) { + byte *d = _channelData[idx]; + int mode = *d; + int channelNum = (int8)*(d + 1); + + _trkChannel[idx] = channelNum; + assert((channelNum >= -1) && (channelNum < 16)); + + if (channelNum >= 0) { + _chProgram[channelNum] = *(d + 10); + _chModulation[channelNum] = 0; + _chVolume[channelNum] = *(d + 11); + _chPan[channelNum] = *(d + 12); + _chDamper[channelNum] = 0; + _chVoiceType[channelNum] = _trackInfo._voiceTypes[idx]; + _chNumVoices[channelNum] = *(d + 6); + _chSubPriority[channelNum] = *(d + 7); + _chPitchBlend[channelNum] = 0x2000; + _chFlags[channelNum] = READ_LE_UINT16(d + 8); + } + + if (mode == 0) { + _trkState[idx] = 1; + _trkLoopState[idx] = 1; + _trkIndex[idx] = 14; + _trkLoopIndex[idx] = 14; + _trkRest[idx] = 0; + _trkLoopRest[idx] = 0; + } else if (mode == 1) { + _trkState[idx] = 1; + _trkLoopState[idx] = 1; + _trkIndex[idx] = 0; + _trkLoopIndex[idx] = 0; + _trkRest[idx] = 0; + _trkLoopRest[idx] = 0; + } else { + error("Unknown sound mode encountered"); + } + } + } +} + +void Sound::_soRemoteReceive() { + error("_soRemoteReceive not implemented"); +} + +void Sound::_soServiceTrackType0(int trackIndex, const byte *channelData) { + if (_trkRest[trackIndex]) { + --_trkRest[trackIndex]; + return; + } + if (!_trkState[trackIndex]) + return; + + int channelNum = _trkChannel[trackIndex]; + assert((channelNum >= 0) && (channelNum < SOUND_ARR_SIZE)); + int chFlags = (channelNum == -1) ? 0 : _chFlags[channelNum]; + int voiceNum = -1; + SoundDriver *driver = NULL; + + VoiceTypeStruct *vtStruct; + VoiceType voiceType = VOICETYPE_0, chVoiceType = VOICETYPE_0; + + if ((channelNum == -1) || _soundManager->_soTimeIndexFlag) { + vtStruct = NULL; + voiceType = VOICETYPE_0; + } else { + chVoiceType = (VoiceType)_chVoiceType[channelNum]; + vtStruct = _soundManager->_voiceTypeStructPtrs[(int)chVoiceType]; + + if (vtStruct) { + voiceType = vtStruct->_voiceType; + if (voiceType == VOICETYPE_0) { + for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { + if (!vtStruct->_entries[idx]._type0._sound && + (vtStruct->_entries[idx]._type0._channelNum != channelNum)) { + voiceNum = vtStruct->_entries[idx]._voiceNum; + driver = vtStruct->_entries[idx]._driver; + break; + } + } + } + } + } + + const byte *pData = channelData + _trkIndex[trackIndex]; + + for (;;) { + byte v = *pData++; + if (!(v & 0x80)) { + // Area #1 + if (!_soundManager->_soTimeIndexFlag) { + // Only do processing if fast forwarding to a given time index + if (channelNum != -1) { + if (voiceType == VOICETYPE_1) { + _soUpdateDamper(vtStruct, channelNum, chVoiceType, v); + } else if (voiceNum != -1) { + assert(driver); + driver->proc18(voiceNum, chVoiceType); + } + } + } + } else if (!(v & 0x40)) { + // Area #2 + if (!_soundManager->_soTimeIndexFlag) { + // Only do processing if fast forwarding to a given time index + byte b = *pData++; + v <<= 1; + if (b & 0x80) + v |= 1; + + b &= 0x7f; + + if (channelNum != -1) { + if (voiceType == VOICETYPE_1) { + // TODO: sub_25E32/sub_25DD8 + if (chFlags & 0x10) + _soProc42(vtStruct, channelNum, chVoiceType, v); + else + _soProc32(vtStruct, channelNum, chVoiceType, v, b); + } else if (voiceNum != -1) { + assert(driver); + driver->proc20(voiceNum, chVoiceType); + } + } + } else { + ++pData; + } + } else if (!(v & 0x20)) { + // Area #3 + v &= 0x1f; + + // Gather up an extended number + int trkRest = v; + while ((*pData & 0xE0) == 0xC0) { + byte b = *pData++; + trkRest = (trkRest << 5) | (b & 0x1f); + } + + _trkRest[trackIndex] = trkRest - 1; + _trkIndex[trackIndex] = pData - channelData; + return; + } else if (!(v & 0x10)) { + // Area #4 + v = (v & 0xf) << 1; + + byte b = *pData++; + if (b & 0x80) + v |= 1; + b &= 0x7f; + + assert(v < 4); + int cmdList[32] = { 1, 7, 10, 64 }; + int cmdVal = cmdList[v]; + + if (channelNum == -1) { + if (_soDoUpdateTracks(cmdVal, b)) + return; + } else { + _soDoTrackCommand(_trkChannel[trackIndex], cmdVal, b); + + if (!_soundManager->_soTimeIndexFlag) { + if (cmdVal == 7) + b = static_cast<byte>(_volume * (int)b / 127); + + if (voiceType != VOICETYPE_0) { + _soProc38(vtStruct, channelNum, chVoiceType, cmdVal, b); + } else if (voiceNum != -1) { + assert(driver); + driver->proc24(voiceNum, chVoiceType, this, cmdVal, b); + } + } + } + } else if (!(v & 0x8)) { + // Area #5 + if (!_soundManager->_soTimeIndexFlag) { + // Only do processing if fast forwarding to a given time index + int cx = READ_LE_UINT16(pData); + pData += 2; + + if (channelNum != -1) { + assert(driver); + driver->proc22(voiceNum, chVoiceType, cx); + } + } else { + pData += 2; + } + } else if (!(v & 0x4)) { + // Area #6 + int cmd = *pData++; + int value = *pData++; + + if (channelNum != -1) { + _soDoTrackCommand(_trkChannel[trackIndex], cmd, value); + + if (!_soundManager->_soTimeIndexFlag) { + if (voiceType != VOICETYPE_0) { + _soProc38(vtStruct, channelNum, chVoiceType, cmd, value); + } else if (voiceNum != -1) { + assert(driver); + driver->proc24(voiceNum, chVoiceType, this, cmd, value); + } + } + } else if (_soDoUpdateTracks(cmd, value)) { + return; + } + } else if (!(v & 0x2)) { + // Area #7 + if (!_soundManager->_soTimeIndexFlag) { + int pitchBlend = READ_BE_UINT16(pData); + pData += 2; + + if (channelNum != -1) { + int channel = _trkChannel[trackIndex]; + _chPitchBlend[channel] = pitchBlend; + + if (voiceType != VOICETYPE_0) { + _soProc40(vtStruct, channelNum, pitchBlend); + } else if (voiceNum != -1) { + assert(driver); + driver->setPitchBlend(channel, pitchBlend); + } + } + } else { + pData += 2; + } + } else if (!(v & 0x1)) { + // Area #8 + int program = *pData++; + + if (channelNum != -1) { + int channel = _trkChannel[trackIndex]; + _chProgram[channel] = program; + + if (!_soundManager->_soTimeIndexFlag) { + if ((voiceType == VOICETYPE_0) && (voiceNum != -1)) { + assert(driver); + driver->setProgram(voiceNum, program); + } + } + } else { + _soSetTrackPos(trackIndex, pData - channelData, program); + } + + } else { + // Area #9 + byte b = *pData++; + + if (b & 0x80) { + _trkState[trackIndex] = 0; + _trkIndex[trackIndex] = pData - channelData; + return; + } + + if (!_soundManager->_soTimeIndexFlag) { + if ((channelNum != -1) && (voiceType == VOICETYPE_0) && (voiceNum != -1)) { + assert(driver); + driver->setVolume1(voiceNum, chVoiceType, 0, b); + } + + } + } + } +} + +void Sound::_soUpdateDamper(VoiceTypeStruct *voiceType, int channelNum, VoiceType mode, int v0) { + bool hasDamper = _chDamper[channelNum] != 0; + + for (uint idx = 0; idx < voiceType->_entries.size(); ++idx) { + VoiceStructEntryType1 &vte = voiceType->_entries[idx]._type1; + + if ((vte._field4 == v0) && (vte._channelNum == channelNum) && (vte._sound == this)) { + if (hasDamper) + vte._field5 = 1; + else { + SoundDriver *driver = voiceType->_entries[idx]._driver; + assert(driver); + + vte._field4 = -1; + vte._field5 = 0; + driver->updateVoice(voiceType->_entries[idx]._voiceNum); + } + return; + } + } +} + +void Sound::_soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0, int v1) { + int entryIndex = _soFindSound(vtStruct, channelNum); + if (entryIndex != -1) { + SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; + assert(driver); + + vtStruct->_entries[entryIndex]._type1._field6 = 0; + vtStruct->_entries[entryIndex]._type1._field4 = v0; + vtStruct->_entries[entryIndex]._type1._field5 = 0; + + driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, _chProgram[channelNum], v0, v1); + } +} + +void Sound::_soProc42(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0) { + for (int trackCtr = 0; trackCtr < _trackInfo._numTracks; ++trackCtr) { + const byte *instrument = _channelData[trackCtr]; + if ((*(instrument + 13) == v0) && (*instrument == 1)) { + int entryIndex = _soFindSound(vtStruct, channelNum); + + if (entryIndex != -1) { + SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; + assert(driver); + + vtStruct->_entries[entryIndex]._type1._field6 = 0; + vtStruct->_entries[entryIndex]._type1._field4 = v0; + vtStruct->_entries[entryIndex]._type1._field5 = 0; + + driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, -1, v0, 0x7F); + driver->proc42(vtStruct->_entries[entryIndex]._voiceNum, voiceType, 0); + } + break; + } + } +} + +void Sound::_soProc38(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int cmd, int value) { + if (cmd == 64) { + if (value == 0) { + for (uint entryIndex = 0; entryIndex < vtStruct->_entries.size(); ++entryIndex) { + VoiceStructEntryType1 &vte = vtStruct->_entries[entryIndex]._type1; + + if ((vte._sound == this) && (vte._channelNum == channelNum) && (vte._field5 != 0)) { + SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; + assert(driver); + + vte._field4 = -1; + vte._field5 = 0; + driver->updateVoice(vtStruct->_entries[entryIndex]._voiceNum); + } + } + } + } else if (cmd == 75) { + _soundManager->_needToRethink = true; + } else { + for (uint entryIndex = 0; entryIndex < vtStruct->_entries.size(); ++entryIndex) { + VoiceStructEntry &vte = vtStruct->_entries[entryIndex]; + + if ((vte._type1._sound == this) && (vte._type1._channelNum == channelNum)) { + SoundDriver *driver = vte._driver; + assert(driver); + + driver->proc38(vte._voiceNum, cmd, value); + } + } + } +} + +void Sound::_soProc40(VoiceTypeStruct *vtStruct, int channelNum, int pitchBlend) { + for (uint entryIndex = 0; entryIndex < vtStruct->_entries.size(); ++entryIndex) { + VoiceStructEntryType1 &vte = vtStruct->_entries[entryIndex]._type1; + + if ((vte._sound == this) && (vte._channelNum == channelNum)) { + SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; + assert(driver); + + driver->setPitch(vtStruct->_entries[entryIndex]._voiceNum, pitchBlend); + } + } +} + +void Sound::_soDoTrackCommand(int channelNum, int command, int value) { + switch (command) { + case 1: + _chModulation[channelNum] = value; + break; + case 7: + _chVolume[channelNum] = value; + break; + case 10: + _chPan[channelNum] = value; + break; + case 64: + _chDamper[channelNum] = value; + break; + case 75: + _chNumVoices[channelNum] = value; + break; + } +} + +bool Sound::_soDoUpdateTracks(int command, int value) { + if ((command == 76) || (_hold != value)) + return false; + + for (int trackIndex = 0; trackIndex < _trackInfo._numTracks; ++trackIndex) { + _trkState[trackIndex] = _trkLoopState[trackIndex]; + _trkRest[trackIndex] = _trkLoopRest[trackIndex]; + _trkIndex[trackIndex] = _trkLoopIndex[trackIndex]; + } + + _timer = _loopTimer; + return true; +} + +void Sound::_soSetTrackPos(int trackIndex, int trackPos, int cueValue) { + _trkIndex[trackIndex] = trackPos; + if (cueValue == 127) { + if (!_soundManager->_soTimeIndexFlag) + _cueValue = cueValue; + } else { + for (int idx = 0; idx < _trackInfo._numTracks; ++idx) { + _trkLoopState[idx] = _trkState[idx]; + _trkLoopRest[idx] = _trkRest[idx]; + _trkLoopIndex[idx] = _trkIndex[idx]; + } + + _loopTimer = _timer; + } +} + +void Sound::_soServiceTrackType1(int trackIndex, const byte *channelData) { + if (_soundManager->_soTimeIndexFlag || !_trkState[trackIndex]) + return; + + int channel = _trkChannel[trackIndex]; + if (channel == -1) + _trkState[trackIndex] = 0; + else { + int voiceType = _chVoiceType[channel]; + VoiceTypeStruct *vtStruct = _soundManager->_voiceTypeStructPtrs[voiceType]; + + if (!vtStruct) + _trkState[trackIndex] = 0; + else { + if (vtStruct->_voiceType != VOICETYPE_0) { + if (_trkState[trackIndex] == 1) { + int entryIndex = _soFindSound(vtStruct, *(channelData + 1)); + if (entryIndex != -1) { + SoundDriver *driver = vtStruct->_entries[entryIndex]._driver; + assert(driver); + + vtStruct->_entries[entryIndex]._type1._field6 = 0; + vtStruct->_entries[entryIndex]._type1._field4 = *(channelData + 1); + vtStruct->_entries[entryIndex]._type1._field5 = 0; + + driver->proc32(vtStruct->_entries[entryIndex]._voiceNum, -1, *(channelData + 1), 0x7f); + } + } else { + + } + } + } + } +} + +int Sound::_soFindSound(VoiceTypeStruct *vtStruct, int channelNum) { + int entryIndex = -1, entry2Index = -1; + int v6 = 0, v8 = 0; + + for (uint idx = 0; idx < vtStruct->_entries.size(); ++idx) { + VoiceStructEntryType1 &vte = vtStruct->_entries[idx]._type1; + if ((vte._channelNum == channelNum) && (vte._sound == this)) { + int v = vte._field6; + if (vte._field4 != -1) { + if (v8 <= v) { + v8 = v; + entry2Index = idx; + } + } else { + if (v6 <= v) { + v6 = v; + entryIndex = idx; + } + } + } + } + + if (entryIndex != -1) + return entryIndex; + else if ((entryIndex == -1) && (entry2Index == -1)) + return -1; + else { + SoundDriver *driver = vtStruct->_entries[entry2Index]._driver; + assert(driver); + driver->updateVoice(vtStruct->_entries[entry2Index]._voiceNum); + + return entry2Index; + } +} + +/*--------------------------------------------------------------------------*/ + +ASound::ASound(): EventHandler() { + _action = NULL; + _cueValue = -1; +} + +void ASound::synchronize(Serializer &s) { + EventHandler::synchronize(s); + + SYNC_POINTER(_action); + s.syncAsByte(_cueValue); +} + +void ASound::dispatch() { + EventHandler::dispatch(); + + int cueValue = _sound.getCueValue(); + if (cueValue != -1) { + _cueValue = cueValue; + _sound.setCueValue(-1); + + if (_action) + _action->signal(); + } + + if (_cueValue != -1) { + if (!_sound.isPrimed()) { + _cueValue = -1; + if (_action) { + _action->signal(); + _action = NULL; + } + } + } +} + +void ASound::play(int soundNum, Action *action, int volume) { + _action = action; + _cueValue = 0; + + setVol(volume); + _sound.play(soundNum); +} + +void ASound::stop() { + _sound.stop(); + _action = NULL; +} + +void ASound::prime(int soundResID, Action *action) { + _action = action; + _cueValue = 0; + _sound.prime(soundResID); +} + +void ASound::unPrime() { + _sound.unPrime(); + _action = NULL; +} + +void ASound::fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, Action *action) { + if (action) + _action = action; + + _sound.fade(fadeDest, fadeSteps, fadeTicks, stopAfterFadeFlag); +} + + +/*--------------------------------------------------------------------------*/ + +SoundDriver::SoundDriver() { + _driverResID = 0; + _minVersion = _maxVersion = 0; + _groupMask = 0; +} + +/*--------------------------------------------------------------------------*/ + +const byte adlib_group_data[] = { 1, 1, 9, 1, 0xff }; + +const byte v440B0[9] = { 0, 1, 2, 6, 7, 8, 12, 13, 14 }; + +const byte v440B9[9] = { 3, 4, 5, 9, 10, 11, 15, 16, 17 }; + +const byte v440C2[18] = { + 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 16, 17, 18, 19, 20, 21 +}; + +const byte v44134[64] = { + 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, + 46, 47, 47, 48, 49, 50, 50, 51, 52, 52, 53, 54, 54, 55, + 56, 56, 57, 57, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, + 61, 62, 62, 62, 62, 63, 63, 63 +}; + +const int v440D4[48] = { + 343, 348, 353, 358, 363, 369, 374, 379, 385, 391, 396, + 402, 408, 414, 420, 426, 432, 438, 445, 451, 458, 465, + 471, 478, 485, 492, 499, 507, 514, 521, 529, 537, 544, + 552, 560, 569, 577, 585, 594, 602, 611, 620, 629, 638, + 647, 657, 666, 676 +}; + +AdlibSoundDriver::AdlibSoundDriver(): SoundDriver() { + _upCb = NULL; + _upRef = NULL; + _minVersion = 0x102; + _maxVersion = 0x10A; + _masterVolume = 0; + + _groupData.groupMask = 9; + _groupData.v1 = 0x46; + _groupData.v2 = 0; + _groupData.pData = &adlib_group_data[0]; + + _mixer = _vm->_mixer; + _sampleRate = _mixer->getOutputRate(); + _opl = makeAdLibOPL(_sampleRate); + _mixer->playStream(Audio::Mixer::kPlainSoundType, &_soundHandle, this, -1, Audio::Mixer::kMaxChannelVolume, 0, DisposeAfterUse::NO, true); + + Common::set_to(_channelVoiced, _channelVoiced + ADLIB_CHANNEL_COUNT, false); + memset(_channelVolume, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); + memset(_v4405E, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); + memset(_v44067, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); + memset(_v44070, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); + memset(_v44079, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); + memset(_v44082, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); + _v44082[ADLIB_CHANNEL_COUNT] = 0x90; + Common::set_to(_pitchBlend, _pitchBlend + ADLIB_CHANNEL_COUNT, 0x2000); + memset(_v4409E, 0, ADLIB_CHANNEL_COUNT * sizeof(int)); + _patchData = NULL; +} + +AdlibSoundDriver::~AdlibSoundDriver() { + DEALLOCATE(_patchData); + _mixer->stopHandle(_soundHandle); + OPLDestroy(_opl); +} + +bool AdlibSoundDriver::open() { + write(1, 0x20); + if (!reset()) + return false; + + write(8, 0); + for (int idx = 0x20; idx < 0xF6; ++idx) + write(idx, 0); + + write(0xBD, 0); + return true; +} + +void AdlibSoundDriver::close() { + for (int idx = 0xB0; idx < 0xB8; ++idx) + write(idx, _portContents[idx] & 0xDF); + for (int idx = 0x40; idx < 0x55; ++idx) + write(idx, 0x3F); + reset(); +} + +bool AdlibSoundDriver::reset() { + write(1, 0x20); + write(4, 0x80); + + write(2, 1); + write(4, 1); + + return true; +} + +const GroupData *AdlibSoundDriver::getGroupData() { + return &_groupData; +} + +void AdlibSoundDriver::installPatch(const byte *data, int size) { + byte *patchData = ALLOCATE(size); + Common::copy(data, data + size, patchData); + _patchData = patchData; +} + +int AdlibSoundDriver::setMasterVolume(int volume) { + int oldVolume = _masterVolume; + _masterVolume = volume; + + for (int channelNum = 0; channelNum < ADLIB_CHANNEL_COUNT; ++channelNum) + updateChannelVolume(channelNum); + + return oldVolume; +} + +void AdlibSoundDriver::proc32(int channel, int program, int v0, int v1) { + if (program == -1) + return; + + int offset = READ_LE_UINT16(_patchData + program * 2); + if (offset) { + const byte *dataP = _patchData + offset; + int id; + + for (offset = 2, id = 0; id != READ_LE_UINT16(dataP); offset += 30, ++id) { + if ((dataP[offset] <= v0) && (dataP[offset + 1] >= v0)) { + if (dataP[offset + 2] != 0xff) + v0 = dataP[offset + 2]; + + _v4409E[channel] = dataP + offset - _patchData; + + // Set sustain/release + int portNum = v440C2[v440B0[channel]] + 0x80; + write(portNum, (_portContents[portNum] & 0xF0) | 0xF); + + portNum = v440C2[v440B9[channel]] + 0x80; + write(portNum, (_portContents[portNum] & 0xF0) | 0xF); + + if (_channelVoiced[channel]) + clearVoice(channel); + + _v44067[channel] = v0; + _v4405E[channel] = v1; + + updateChannel(channel); + setFrequency(channel); + updateChannelVolume(channel); + setVoice(channel); + break; + } + } + } +} + +void AdlibSoundDriver::updateVoice(int channel) { + if (_channelVoiced[channel]) + clearVoice(channel); +} + +void AdlibSoundDriver::proc38(int channel, int cmd, int value) { + if (cmd == 7) { + // Set channel volume + _channelVolume[channel] = value; + updateChannelVolume(channel); + } +} + +void AdlibSoundDriver::setPitch(int channel, int pitchBlend) { + _pitchBlend[channel] = pitchBlend; + setFrequency(channel); +} + +void AdlibSoundDriver::write(byte reg, byte value) { + _portContents[reg] = value; + OPLWriteReg(_opl, reg, value); +} + +void AdlibSoundDriver::updateChannelVolume(int channelNum) { + int volume = (_masterVolume * _channelVolume[channelNum] / 127 * _v4405E[channelNum] / 127) / 2; + int level2 = 63 - v44134[volume * _v44079[channelNum] / 63]; + int level1 = !_v44082[channelNum] ? 63 - _v44070[channelNum] : + 63 - v44134[volume * _v44070[channelNum] / 63]; + + int portNum = v440C2[v440B0[channelNum]] + 0x40; + write(portNum, (_portContents[portNum] & 0x80) | level1); + + portNum = v440C2[v440B9[channelNum]] + 0x40; + write(portNum, (_portContents[portNum] & 0x80) | level2); +} + +void AdlibSoundDriver::setVoice(int channel) { + int portNum = 0xB0 + channel; + write(portNum, _portContents[portNum] | 0x20); + _channelVoiced[channel] = true; +} + +void AdlibSoundDriver::clearVoice(int channel) { + write(0xB0 + channel, _portContents[0xB0 + channel] & ~0x20); + _channelVoiced[channel] = false; +} + +void AdlibSoundDriver::updateChannel(int channel) { + const byte *dataP = _patchData + _v4409E[channel]; + int portOffset = v440C2[v440B0[channel]]; + + int portNum = portOffset + 0x20; + int portValue = 0; + if (*(dataP + 4)) + portValue |= 0x80; + if (*(dataP + 5)) + portValue |= 0x40; + if (*(dataP + 8)) + portValue |= 0x20; + if (*(dataP + 6)) + portValue |= 0x10; + portValue |= *(dataP + 7); + write(portNum, portValue); + + portValue = (_portContents[0x40 + portOffset] & 0x3F) | (*(dataP + 9) << 6); + write(0x40 + portOffset, portValue); + + _v44070[channel] = 63 - *(dataP + 10); + write(0x60 + portOffset, *(dataP + 12) | (*(dataP + 11) << 4)); + write(0x80 + portOffset, *(dataP + 14) | (*(dataP + 13) << 4)); + write(0xE0 + portOffset, (_portContents[0xE0 + portOffset] & 0xFC) | *(dataP + 15)); + + portOffset = v440C2[v440B9[channel]]; + portNum = portOffset + 0x20; + portValue = 0; + if (*(dataP + 17)) + portValue |= 0x80; + if (*(dataP + 18)) + portValue |= 0x40; + if (*(dataP + 21)) + portValue |= 0x20; + if (*(dataP + 19)) + portValue |= 0x10; + portValue |= *(dataP + 20); + write(portNum, portValue); + + write(0x40 + portOffset, (_portContents[0x40 + portOffset] & 0x3f) | (*(dataP + 22) << 6)); + _v44079[channel] = 0x3F - *(dataP + 23); + write(0x60 + portOffset, *(dataP + 25) | (*(dataP + 24) << 4)); + write(0x80 + portOffset, *(dataP + 27) | (*(dataP + 26) << 4)); + write(0xE0 + portOffset, (_portContents[0xE0 + portOffset] & 0xFC) | *(dataP + 28)); + + write(0xC0 + channel, (_portContents[0xC0 + channel] & 0xF0) + | (*(dataP + 16) << 1) | *(dataP + 3)); + + _v44082[channel] = *(dataP + 3); +} + +void AdlibSoundDriver::setFrequency(int channel) { + int offset, ch; + + int v = _pitchBlend[channel]; + if (v == 0x2000) { + offset = 0; + ch = _v44067[channel]; + } else if (v > 0x2000) { + ch = _v44067[channel]; + v -= 0x2000; + if (v == 0x1fff) + v = 0x2000; + + offset = (v / 170) & 3; + ch += (v / 170) >> 2; + + if (ch >= 128) + ch = 127; + } else { + ch = _v44067[channel]; + int tempVal = (0x2000 - v) / 170; + int tempVal2 = 4 - (tempVal & 3); + + if (tempVal2 == 4) + offset = 0; + else { + offset = tempVal2; + --ch; + } + + ch -= tempVal >> 2; + if (ch < 0) + ch = 0; + } + + int var2 = ch / 12; + if (var2) + --var2; + + int dataWord = v440D4[((ch % 12) << 2) + offset]; + write(0xA0 + channel, dataWord & 0xff); + write(0xB0 + channel, (_portContents[0xB0 + channel] & 0xE0) | + ((dataWord >> 8) & 3) | (var2 << 2)); +} + +int AdlibSoundDriver::readBuffer(int16 *buffer, const int numSamples) { + update(buffer, numSamples); + return numSamples; +} + +void AdlibSoundDriver::update(int16 *buf, int len) { + static int samplesLeft = 0; + while (len != 0) { + int count = samplesLeft; + if (count > len) { + count = len; + } + samplesLeft -= count; + len -= count; + YM3812UpdateOne(_opl, buf, count); + if (samplesLeft == 0) { + if (_upCb) { + (*_upCb)(_upRef); + } + samplesLeft = _sampleRate / 50; + } + buf += count; + } +} + +void AdlibSoundDriver::setUpdateCallback(UpdateCallback upCb, void *ref) { + _upCb = upCb; + _upRef = ref; } } // End of namespace tSage diff --git a/engines/tsage/sound.h b/engines/tsage/sound.h index 03ae77b703..be3924151b 100644 --- a/engines/tsage/sound.h +++ b/engines/tsage/sound.h @@ -24,21 +24,425 @@ #define TSAGE_SOUND_H #include "common/scummsys.h" +#include "common/mutex.h" +#include "audio/audiostream.h" +#include "audio/fmopl.h" +#include "audio/mixer.h" +#include "common/list.h" #include "tsage/saveload.h" +#include "tsage/core.h" namespace tSage { +class Sound; + +#define SOUND_ARR_SIZE 16 +#define ROLAND_DRIVER_NUM 2 +#define ADLIB_DRIVER_NUM 3 + +struct trackInfoStruct { + int _numTracks; + int _chunks[SOUND_ARR_SIZE]; + int _voiceTypes[SOUND_ARR_SIZE]; +}; + +enum SoundDriverStatus {SNDSTATUS_FAILED = 0, SNDSTATUS_DETECTED = 1, SNDSTATUS_SKIPPED = 2}; +enum VoiceType {VOICETYPE_0 = 0, VOICETYPE_1 = 1}; + +class SoundDriverEntry { +public: + int driverNum; + SoundDriverStatus status; + int field2, field6; + Common::String shortDescription; + Common::String longDescription; +}; + +struct GroupData { + uint32 groupMask; + byte v1; + byte v2; + const byte *pData; +}; + +class SoundDriver { +public: + Common::String _shortDescription, _longDescription; + int _minVersion, _maxVersion; + // The following fields were originally held in separate arrays in the SoundManager class + uint32 _groupMask; + const GroupData *_groupOffset; + int _driverResID; + + typedef void (*UpdateCallback)(void *); + UpdateCallback _upCb; + void *_upRef; +public: + SoundDriver(); + virtual ~SoundDriver() {}; + + const Common::String &getShortDriverDescription() { return _shortDescription; } + const Common::String &getLongDriverDescription() { return _longDescription; } + + virtual bool open() { return true; } // Method #0 + virtual void close() {} // Method #1 + virtual bool reset() { return true; } // Method #2 + virtual const GroupData *getGroupData() { return NULL; } // Method #3 + virtual void installPatch(const byte *data, int size) {} // Method #4 + virtual void poll() {} // Method #5 + virtual void proc12() {} // Method #6 + virtual int setMasterVolume(int volume) { return 0; } // Method #7 + virtual void proc16() {} // Method #8 + virtual void proc18(int al, VoiceType voiceType) {} // Method #9 + virtual void proc20(int al, VoiceType voiceType) {} // Method #10 + virtual void proc22(int al, VoiceType voiceType, int v3) {} // Method #11 + virtual void proc24(int channel, int voiceIndex, Sound *sound, int v1, int v2) {} + virtual void setProgram(int channel, int program) {} // Method #13 + virtual void setVolume1(int channel, int v2, int v3, int volume) {} + virtual void setPitchBlend(int channel, int pitchBlend) {} // Method #15 + virtual void proc32(int channel, int program, int v0, int v1) {}// Method #16 + virtual void updateVoice(int channel) {} // Method #17 + virtual void proc36() {} // Method #18 + virtual void proc38(int channel, int cmd, int value) {} // Method #19 + virtual void setPitch(int channel, int pitchBlend) {} // Method #20 + virtual void proc42(int channel, int v0, int v1) {} // Method #21 + + virtual void setUpdateCallback(UpdateCallback upCb, void *ref) {} +}; + +struct VoiceStructEntryType0 { + Sound *_sound; + int _channelNum; + int _priority; + int _fieldA; + Sound *_sound2; + int _channelNum2; + int _priority2; + int _field12; + Sound *_sound3; + int _channelNum3; + int _priority3; + int _field1A; + int _field1B; +}; + +struct VoiceStructEntryType1 { + int _field4; + int _field5; + int _field6; + Sound *_sound; + int _channelNum; + int _priority; + Sound *_sound2; + int _channelNum2; + int _priority2; + Sound *_sound3; + int _channelNum3; + int _priority3; +}; + +struct VoiceStructEntry { + int _voiceNum; + int _field1; + SoundDriver *_driver; + + VoiceStructEntryType0 _type0; + VoiceStructEntryType1 _type1; +}; + +class VoiceTypeStruct { +public: + VoiceType _voiceType; + int _total; + int _numVoices; + int _field3; + + Common::Array<VoiceStructEntry> _entries; +}; + class SoundManager : public SaveListener { +private: + SoundDriver *instantiateDriver(int driverNum); +public: + bool __sndmgrReady; + int _ourSndResVersion, _ourDrvResVersion; + Common::List<Sound *> _playList; + Common::List<SoundDriver *> _installedDrivers; + VoiceTypeStruct *_voiceTypeStructPtrs[SOUND_ARR_SIZE]; + uint32 _groupsAvail; + int _masterVol; + Common::Mutex _serverDisabledMutex; + Common::Mutex _serverSuspendedMutex; + int _suspendedCount; + bool _driversDetected; + Common::List<Sound *> _soundList; + Common::List<SoundDriverEntry> _availableDrivers; + bool _needToRethink; + // Misc flags + bool _soTimeIndexFlag; public: - void dispatch() {} + SoundManager(); + ~SoundManager(); + + void dispatch(); virtual void listenerSynchronize(Serializer &s); virtual void postInit(); + void syncSounds(); + void update(); - void proc2() {} static void saveNotifier(bool postFlag); void saveNotifierProc(bool postFlag); static void loadNotifier(bool postFlag); void loadNotifierProc(bool postFlag); + + void installConfigDrivers(); + Common::List<SoundDriverEntry> &buildDriverList(bool detectFlag); + Common::List<SoundDriverEntry> &getDriverList(bool detectFlag); + void dumpDriverList(); + void installDriver(int driverNum); + bool isInstalled(int driverNum) const; + void unInstallDriver(int driverNum); + void checkResVersion(const byte *soundData); + int determineGroup(const byte *soundData); + int extractPriority(const byte *soundData); + int extractLoop(const byte *soundData); + bool isOnPlayList(Sound *sound); + void extractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum); + void addToSoundList(Sound *sound); + void removeFromSoundList(Sound *sound); + void addToPlayList(Sound *sound); + void removeFromPlayList(Sound *sound); + void rethinkVoiceTypes(); + void updateSoundVol(Sound *sound); + void updateSoundPri(Sound *sound); + void updateSoundLoop(Sound *sound); + void setMasterVol(int volume); + int getMasterVol() const; + void loadSound(int soundNum, bool showErrors); + void unloadSound(int soundNum); + + // _sf methods + static SoundManager &sfManager(); + static void _sfTerminate(); + static int _sfDetermineGroup(const byte *soundData); + static void _sfAddToPlayList(Sound *sound); + static void _sfRemoveFromPlayList(Sound *sound); + static bool _sfIsOnPlayList(Sound *sound); + static void _sfRethinkSoundDrivers(); + static void _sfRethinkVoiceTypes(); + static void _sfUpdateVolume(Sound *sound); + static void _sfDereferenceAll(); + static void _sfUpdatePriority(Sound *sound); + static void _sfUpdateLoop(Sound *sound); + static void _sfSetMasterVol(int volume); + static void _sfExtractTrackInfo(trackInfoStruct *trackInfo, const byte *soundData, int groupNum); + static void _sfExtractGroupMask(); + static bool _sfInstallDriver(SoundDriver *driver); + static void _sfUnInstallDriver(SoundDriver *driver); + static void _sfInstallPatchBank(SoundDriver *driver, const byte *bankData); + static void _sfDoAddToPlayList(Sound *sound); + static bool _sfDoRemoveFromPlayList(Sound *sound); + static void _sfDoUpdateVolume(Sound *sound); + static void _sfSoundServer(); + static void _sfProcessFading(); + static void _sfUpdateVoiceStructs(); + static void _sfUpdateVoiceStructs2(); + static void _sfUpdateCallback(void *ref); +}; + +class Sound: public EventHandler { +private: + void _prime(int soundResID, bool dontQueue); + void _unPrime(); + void orientAfterRestore(); +public: + bool _stoppedAsynchronously; + int _soundResID; + int _group; + int _sndResPriority; + int _fixedPriority; + int _sndResLoop; + int _fixedLoop; + int _priority; + int _volume; + int _loop; + int _pausedCount; + int _mutedCount; + int _hold; + int _cueValue; + int _fadeDest; + int _fadeSteps; + int _fadeTicks; + int _fadeCounter; + bool _stopAfterFadeFlag; + uint _timer; + int _loopTimer; + int _chProgram[SOUND_ARR_SIZE]; + int _chModulation[SOUND_ARR_SIZE]; + int _chVolume[SOUND_ARR_SIZE]; + int _chPan[SOUND_ARR_SIZE]; + int _chDamper[SOUND_ARR_SIZE]; + int _chPitchBlend[SOUND_ARR_SIZE]; + int _chVoiceType[SOUND_ARR_SIZE]; + int _chNumVoices[SOUND_ARR_SIZE]; + int _chSubPriority[SOUND_ARR_SIZE]; + int _chFlags[SOUND_ARR_SIZE]; + bool _chWork[SOUND_ARR_SIZE]; + trackInfoStruct _trackInfo; + byte *_channelData[SOUND_ARR_SIZE]; + int _trkChannel[SOUND_ARR_SIZE]; + int _trkState[SOUND_ARR_SIZE]; + int _trkLoopState[SOUND_ARR_SIZE]; + int _trkIndex[SOUND_ARR_SIZE]; + int _trkLoopIndex[SOUND_ARR_SIZE]; + int _trkRest[SOUND_ARR_SIZE]; + int _trkLoopRest[SOUND_ARR_SIZE]; + + bool _primed; + bool _isEmpty; + byte *_remoteReceiver; +public: + Sound(); + ~Sound(); + + void play(int soundResID); + void stop(); + void prime(int soundResID); + void unPrime(); + void go(); + void halt(void); + bool isPlaying(); + int getSoundNum() const; + bool isPrimed() const; + bool isPaused() const; + bool isMuted() const; + void pause(bool flag); + void mute(bool flag); + void fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag); + void setTimeIndex(uint32 timeIndex); + uint32 getTimeIndex() const; + int getCueValue() const; + void setCueValue(int cueValue); + void setVol(int volume); + int getVol() const; + void setPri(int priority); + void setLoop(int flag); + int getPri() const; + int getLoop(); + void holdAt(int amount); + void release(); + void orientAfterDriverChange(); + + // _so methods + void _soPrimeSound(bool dontQueue); + void _soSetTimeIndex(uint timeIndex); + bool _soServiceTracks(); + void _soPrimeChannelData(); + void _soRemoteReceive(); + void _soServiceTrackType0(int trackIndex, const byte *channelData); + void _soUpdateDamper(VoiceTypeStruct *voiceType, int channelNum, VoiceType mode, int v0); + void _soProc32(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0, int v1); + void _soProc42(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int v0); + void _soProc38(VoiceTypeStruct *vtStruct, int channelNum, VoiceType voiceType, int cmd, int value); + void _soProc40(VoiceTypeStruct *vtStruct, int channelNum, int pitchBlend); + void _soDoTrackCommand(int channelNum, int command, int value); + bool _soDoUpdateTracks(int command, int value); + void _soSetTrackPos(int trackIndex, int trackPos, int cueValue); + + void _soServiceTrackType1(int trackIndex, const byte *channelData); + int _soFindSound(VoiceTypeStruct *vtStruct, int channelNum); +}; + +class ASound: public EventHandler { +public: + Sound _sound; + Action *_action; + int _cueValue; + + ASound(); + virtual void synchronize(Serializer &s); + virtual void dispatch(); + + void play(int soundNum, Action *action = NULL, int volume = 127); + void stop(); + void prime(int soundNum, Action *action = NULL); + void unPrime(); + void go() { _sound.go(); } + void hault(void) { _sound.halt(); } + bool isPlaying() { return _sound.isPlaying(); } + int getSoundNum() const { return _sound.getSoundNum(); } + bool isPaused() const { return _sound.isPaused(); } + bool isMuted() const { return _sound.isMuted(); } + void pause(bool flag) { _sound.pause(flag); } + void mute(bool flag) { _sound.mute(flag); } + void fade(int fadeDest, int fadeSteps, int fadeTicks, bool stopAfterFadeFlag, Action *action); + void fadeIn() { fade(127, 5, 10, false, NULL); } + void fadeOut(Action *action) { fade(0, 5, 10, true, action); } + void setTimeIndex(uint32 timeIndex) { _sound.setTimeIndex(timeIndex); } + uint32 getTimeIndex() const { return _sound.getTimeIndex(); } + void setPri(int v) { _sound.setPri(v); } + void setLoop(int total) { _sound.setLoop(total); } + int getPri() const { return _sound.getPri(); } + int getLoop() { return _sound.getLoop(); } + void setVol(int volume) { _sound.setVol(volume); } + int getVol() const { return _sound.getVol(); } + void holdAt(int v) { _sound.holdAt(v); } + void release() { _sound.release(); } +}; + +#define ADLIB_CHANNEL_COUNT 9 + +class AdlibSoundDriver: public SoundDriver, Audio::AudioStream { +private: + GroupData _groupData; + Audio::Mixer *_mixer; + FM_OPL *_opl; + Audio::SoundHandle _soundHandle; + int _sampleRate; + byte _portContents[256]; + const byte *_patchData; + int _masterVolume; + + bool _channelVoiced[ADLIB_CHANNEL_COUNT]; + int _channelVolume[ADLIB_CHANNEL_COUNT]; + int _v4405E[ADLIB_CHANNEL_COUNT]; + int _v44067[ADLIB_CHANNEL_COUNT]; + int _v44070[ADLIB_CHANNEL_COUNT]; + int _v44079[ADLIB_CHANNEL_COUNT]; + int _v44082[ADLIB_CHANNEL_COUNT + 1]; + int _pitchBlend[ADLIB_CHANNEL_COUNT]; + int _v4409E[ADLIB_CHANNEL_COUNT]; + + + void write(byte reg, byte value); + void updateChannelVolume(int channel); + void setVoice(int channel); + void clearVoice(int channel); + void updateChannel(int channel); + void setFrequency(int channel); +public: + AdlibSoundDriver(); + virtual ~AdlibSoundDriver(); + + virtual bool open(); + virtual void close(); + virtual bool reset(); + virtual const GroupData *getGroupData(); + virtual void installPatch(const byte *data, int size); + virtual int setMasterVolume(int volume); + virtual void proc32(int channel, int program, int v0, int v1); + virtual void updateVoice(int channel); + virtual void proc38(int channel, int cmd, int value); + virtual void setPitch(int channel, int pitchBlend); + virtual void setUpdateCallback(UpdateCallback upCb, void *ref); + + // AudioStream interface + virtual int readBuffer(int16 *buffer, const int numSamples); + virtual bool isStereo() const { return false; } + virtual bool endOfData() const { return false; } + virtual int getRate() const { return _sampleRate; } + + void update(int16 *buf, int len); }; } // End of namespace tSage diff --git a/engines/tsage/tsage.cpp b/engines/tsage/tsage.cpp index 50ce0ce4be..41f3d58897 100644 --- a/engines/tsage/tsage.cpp +++ b/engines/tsage/tsage.cpp @@ -81,12 +81,17 @@ void TSageEngine::initialize() { _globals = new Globals(); _globals->gfxManager().setDefaults(); + + // Setup sound settings + syncSoundSettings(); } void TSageEngine::deinitialize() { delete _globals; delete _resourceManager; delete _saver; + _resourceManager = NULL; + _saver = NULL; } Common::Error TSageEngine::run() { @@ -136,4 +141,10 @@ Common::String TSageEngine::generateSaveName(int slot) { return Common::String::format("%s.%03d", _targetName.c_str(), slot); } +void TSageEngine::syncSoundSettings() { + Engine::syncSoundSettings(); + + _globals->_soundManager.syncSounds(); +} + } // End of namespace tSage diff --git a/engines/tsage/tsage.h b/engines/tsage/tsage.h index 5db45f24ab..f004c7f625 100644 --- a/engines/tsage/tsage.h +++ b/engines/tsage/tsage.h @@ -51,7 +51,9 @@ enum { }; enum { - kRingDebugScripts = 1 << 0 + kRingDebugScripts = 1 << 0, + ktSageSound = 1 << 1, + ktSageCore = 1 << 2 }; struct tSageGameDescription; @@ -83,6 +85,7 @@ public: virtual bool canSaveGameStateCurrently(); virtual Common::Error loadGameState(int slot); virtual Common::Error saveGameState(int slot, const Common::String &desc); + virtual void syncSoundSettings(); Common::String generateSaveName(int slot); void initialize(); |