scummvm/engines/agos/agos.cpp
Colin Snover 432fd522d2 ENGINES: Remove default1x scaler flag
This flag is removed for a few reasons:

* Engines universally set this flag to true for widths > 320,
  which made it redundant everywhere;
* This flag functioned primarily as a "force 1x scaler" flag,
  since its behaviour was almost completely undocumented and users
  would need to figure out that they'd need an explicit non-default
  scaler set to get a scaler to operate at widths > 320;
* (Most importantly) engines should not be in the business of
  deciding how the backend may choose to render its virtual screen.
  The choice of rendering behaviour belongs to the user, and the
  backend, in that order.

A nearby future commit restores the default1x scaler behaviour in
the SDL backend code for the moment, but in the future it is my
hope that there will be a better configuration UI to allow users
to specify how they want scaling to work for high resolutions.
2017-10-07 12:30:29 -05:00

1088 lines
24 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include "common/config-manager.h"
#include "common/debug-channels.h"
#include "common/file.h"
#include "common/fs.h"
#include "common/textconsole.h"
#include "engines/util.h"
#include "agos/debugger.h"
#include "agos/intern.h"
#include "agos/agos.h"
#include "agos/midi.h"
#include "agos/sound.h"
#include "backends/audiocd/audiocd.h"
#include "graphics/surface.h"
#include "audio/mididrv.h"
namespace AGOS {
static const GameSpecificSettings simon1_settings = {
"", // base_filename
"", // restore_filename
"", // tbl_filename
"EFFECTS", // effects_filename
"SIMON", // speech_filename
};
static const GameSpecificSettings simon2_settings = {
"", // base_filename
"", // restore_filename
"", // tbl_filename
"", // effects_filename
"SIMON2", // speech_filename
};
static const GameSpecificSettings dimp_settings = {
"Gdimp", // base_filename
"", // restore_filename
"", // tbl_filename
"", // effects_filename
"MUSIC", // speech_filename
};
static const GameSpecificSettings jumble_settings = {
"Gjumble", // base_filename
"", // restore_filename
"", // tbl_filename
"", // effects_filename
"MUSIC", // speech_filename
};
static const GameSpecificSettings puzzle_settings = {
"Gpuzzle", // base_filename
"", // restore_filename
"", // tbl_filename
"", // effects_filename
"MUSIC", // speech_filename
};
static const GameSpecificSettings swampy_settings = {
"Gswampy", // base_filename
"", // restore_filename
"", // tbl_filename
"", // effects_filename
"MUSIC", // speech_filename
};
#ifdef ENABLE_AGOS2
AGOSEngine_DIMP::AGOSEngine_DIMP(OSystem *system, const AGOSGameDescription *gd)
: AGOSEngine_PuzzlePack(system, gd) {
_iconToggleCount = 0;
_voiceCount = 0;
_lastTickCount = 0;
_startSecondCount = 0;
_tSecondCount = 0;
}
AGOSEngine_PuzzlePack::AGOSEngine_PuzzlePack(OSystem *system, const AGOSGameDescription *gd)
: AGOSEngine_Feeble(system, gd) {
_oopsValid = false;
_gameTime = 0;
}
#endif
AGOSEngine_Simon2::AGOSEngine_Simon2(OSystem *system, const AGOSGameDescription *gd)
: AGOSEngine_Simon1(system, gd) {
}
AGOSEngine_Simon1::AGOSEngine_Simon1(OSystem *system, const AGOSGameDescription *gd)
: AGOSEngine_Waxworks(system, gd) {
}
AGOSEngine_Waxworks::AGOSEngine_Waxworks(OSystem *system, const AGOSGameDescription *gd)
: AGOSEngine_Elvira2(system, gd) {
_boxCR = false;
_boxLineCount = 0;
memset(_boxBuffer, 0, sizeof(_boxBuffer));
_boxBufferPtr = _boxBuffer;
_linePtrs[0] = 0;
_linePtrs[1] = 0;
_linePtrs[2] = 0;
_linePtrs[3] = 0;
_linePtrs[4] = 0;
_linePtrs[5] = 0;
memset(_lineCounts, 0, sizeof(_lineCounts));
}
AGOSEngine_Elvira2::AGOSEngine_Elvira2(OSystem *system, const AGOSGameDescription *gd)
: AGOSEngine_Elvira1(system, gd) {
}
AGOSEngine_Elvira1::AGOSEngine_Elvira1(OSystem *system, const AGOSGameDescription *gd)
: AGOSEngine(system, gd) {
}
AGOSEngine::AGOSEngine(OSystem *system, const AGOSGameDescription *gd)
: Engine(system), _rnd("agos"), _gameDescription(gd) {
DebugMan.addDebugChannel(kDebugOpcode, "opcode", "Opcode debug level");
DebugMan.addDebugChannel(kDebugVGAOpcode, "vga_opcode", "VGA Opcode debug level");
DebugMan.addDebugChannel(kDebugSubroutine, "subroutine", "Subroutine debug level");
DebugMan.addDebugChannel(kDebugVGAScript, "vga_script", "VGA Script debug level");
//Image dumping command disabled as it doesn't work well
#if 0
DebugMan.addDebugChannel(kDebugImageDump, "image_dump", "Enable dumping of images to files");
#endif
_vcPtr = 0;
_vcGetOutOfCode = 0;
_gameOffsetsPtr = 0;
_debugger = 0;
_gameFile = 0;
_opcode = 0;
_itemMemSize = 0;
_tableMemSize = 0;
_vgaMemSize = 0;
_musicIndexBase = 0;
_soundIndexBase = 0;
_tableIndexBase = 0;
_textIndexBase = 0;
_numMusic = 0;
_numSFX = 0;
_numSpeech = 0;
_numZone = 0;
_numBitArray1 = 0;
_numBitArray2 = 0;
_numBitArray3 = 0;
_numItemStore = 0;
_numTextBoxes = 0;
_numVars = 0;
_numVideoOpcodes = 0;
_vgaBaseDelay = 0;
_vgaPeriod = 0;
_strippedTxtMem = 0;
_textMem = 0;
_textSize = 0;
_stringTabNum = 0;
_stringTabPos = 0;
_stringTabSize = 0;
_stringTabPtr = 0;
_itemArrayPtr = 0;
_itemArraySize = 0;
_itemArrayInited = 0;
_iconFilePtr = 0;
_codePtr = 0;
_localStringtable = 0;
_stringIdLocalMin = 0;
_stringIdLocalMax = 0;
_roomStates = 0;
_numRoomStates = 0;
_menuBase = 0;
_roomsList = 0;
_roomsListPtr = 0;
_xtblList = 0;
_xtablesHeapPtrOrg = 0;
_xtablesHeapCurPosOrg = 0;
_xsubroutineListOrg = 0;
_tblList = 0;
_tablesHeapPtr = 0;
_tablesHeapPtrOrg = 0;
_tablesheapPtrNew = 0;
_tablesHeapSize = 0;
_tablesHeapCurPos = 0;
_tablesHeapCurPosOrg = 0;
_tablesHeapCurPosNew = 0;
_subroutineListOrg = 0;
_subroutineList = 0;
_recursionDepth = 0;
_lastVgaTick = 0;
_marks = 0;
_scanFlag = false;
_scriptVar2 = 0;
_runScriptReturn1 = false;
_skipVgaWait = false;
_noParentNotify = false;
_beardLoaded = false;
_litBoxFlag = false;
_mortalFlag = false;
_displayFlag = 0;
_syncFlag2 = false;
_inCallBack = false;
_cepeFlag = false;
_fastMode = false;
_backFlag = false;
_copyProtection = false;
_pause = false;
_speech = false;
_subtitles = false;
_animatePointer = 0;
_maxCursorWidth = 0;
_maxCursorHeight = 0;
_mouseAnim = 0;
_mouseAnimMax = 0;
_mouseCursor = 0;
_mouseData = 0;
_oldMouseCursor = 0;
_currentMouseCursor = 0;
_currentMouseAnim = 0;
_oldMouseAnimMax = 0;
_vgaVar9 = 0;
_chanceModifier = 0;
_restoreWindow6 = 0;
_scrollX = 0;
_scrollY = 0;
_scrollXMax = 0;
_scrollYMax = 0;
_scrollCount = 0;
_scrollFlag = 0;
_scrollHeight = 0;
_scrollWidth = 0;
_scrollImage = 0;
_boxStarHeight = 0;
_scriptVerb = 0;
_scriptNoun1 = 0;
_scriptNoun2 = 0;
_scriptAdj1 = 0;
_scriptAdj2 = 0;
_curWindow = 0;
_textWindow = 0;
_subjectItem = 0;
_objectItem = 0;
_currentPlayer = 0;
_iOverflow = false;
_nameLocked = false;
_hitAreaObjectItem = 0;
_lastHitArea = 0;
_lastNameOn = 0;
_lastHitArea3 = 0;
_hitAreaSubjectItem = 0;
_currentBox = 0;
_currentBoxNum = 0;
_currentVerbBox = 0;
_lastVerbOn = 0;
_needHitAreaRecalc = 0;
_verbHitArea = 0;
_defaultVerb = 0;
_mouseHideCount = 0;
_dragAccept = false;
_dragEnd = false;
_dragFlag = false;
_dragMode = false;
_dragCount = 0;
_lastClickRem = 0;
_windowNum = 0;
_printCharCurPos = 0;
_printCharMaxPos = 0;
_printCharPixelCount = 0;
_numLettersToPrint = 0;
_clockStopped = 0;
_gameStoppedClock = 0;
_lastTime = 0;
_lastMinute = 0;
_firstTimeStruct = 0;
_pendingDeleteTimeEvent = 0;
_initMouse = 0;
_leftButtonDown = false;
_rightButtonDown = false;
_clickOnly = false;
_oneClick = 0;
_leftClick = 0;
_rightClick = 0;
_noRightClick = false;
_leftButton = 0;
_leftButtonCount = 0;
_leftButtonOld = 0;
_dummyItem1 = new Item();
_dummyItem2 = new Item();
_dummyItem3 = new Item();
_videoLockOut = 0;
_scrollUpHitArea = 0;
_scrollDownHitArea = 0;
_noOverWrite = 0;
_rejectBlock = false;
_fastFadeCount = 0;
_fastFadeInFlag = 0;
_fastFadeOutFlag = 0;
_exitCutscene = 0;
_paletteFlag = 0;
_bottomPalette = false;
_picture8600 = 0;
_soundFileId = 0;
_lastMusicPlayed = 0;
_nextMusicToPlay = 0;
_sampleEnd = 0;
_sampleWait = 0;
_showPreposition = 0;
_showMessageFlag = 0;
_newDirtyClip = false;
_wiped = false;
_copyScnFlag = 0;
_vgaSpriteChanged = 0;
_block = 0;
_blockEnd = 0;
_vgaMemPtr = 0;
_vgaMemEnd = 0;
_vgaMemBase = 0;
_vgaFrozenBase = 0;
_vgaRealBase = 0;
_zoneBuffers = 0;
_curVgaFile1 = 0;
_curVgaFile2 = 0;
_curSfxFile = 0;
_curSfxFileSize = 0;
_syncCount = 0;
_frameCount = 0;
_zoneNumber = 0;
_vgaWaitFor = 0;
_lastVgaWaitFor = 0;
_vgaCurZoneNum = 0;
_vgaCurSpriteId = 0;
_baseY = 0;
_scale = 0;
_feebleRect.left = 0;
_feebleRect.right = 0;
_feebleRect.top = 0;
_feebleRect.bottom = 0;
_scaleX = 0;
_scaleY = 0;
_scaleWidth = 0;
_scaleHeight = 0;
_nextVgaTimerToProcess = 0;
_opcode177Var1 = 1;
_opcode177Var2 = 0;
_opcode178Var1 = 1;
_opcode178Var2 = 0;
_classLine = 0;
_classMask = 0;
_classMode1 = 0;
_classMode2 = 0;
_currentLine = 0;
_currentTable = 0;
_findNextPtr = 0;
_agosMenu = 0;
_currentRoom = 0;
_superRoomNumber = 0;
_wallOn = 0;
memset(_objectArray, 0, sizeof(_objectArray));
memset(_itemStore, 0, sizeof(_itemStore));
memset(_textMenu, 0, sizeof(_textMenu));
memset(_shortText, 0, sizeof(_shortText));
memset(_shortTextX, 0, sizeof(_shortText));
memset(_shortTextY, 0, sizeof(_shortText));
memset(_longText, 0, sizeof(_longText));
memset(_longSound, 0, sizeof(_longSound));
memset(_bitArray, 0, sizeof(_bitArray));
memset(_bitArrayTwo, 0, sizeof(_bitArrayTwo));
memset(_bitArrayThree, 0, sizeof(_bitArrayThree));
_variableArray = 0;
_variableArray2 = 0;
_variableArrayPtr = 0;
memset(_windowArray, 0, sizeof(_windowArray));
memset(_fcsData1, 0, sizeof(_fcsData1));
memset(_fcsData2, 0, sizeof(_fcsData2));
_awaitTwoByteToken = 0;
_byteTokens = 0;
_byteTokenStrings = 0;
_twoByteTokens = 0;
_twoByteTokenStrings = 0;
_secondTwoByteTokenStrings = 0;
_thirdTwoByteTokenStrings = 0;
memset(_textBuffer, 0, sizeof(_textBuffer));
_textCount = 0;
_freeStringSlot = 0;
memset(_stringReturnBuffer, 0, sizeof(_stringReturnBuffer));
memset(_pathFindArray, 0, sizeof(_pathFindArray));
memset(_pathValues, 0, sizeof(_pathValues));
_PVCount = 0;
_GPVCount = 0;
memset(_pathValues1, 0, sizeof(_pathValues1));
_PVCount1 = 0;
_GPVCount1 = 0;
memset(_currentPalette, 0, sizeof(_currentPalette));
memset(_displayPalette, 0, sizeof(_displayPalette));
memset(_videoBuf1, 0, sizeof(_videoBuf1));
memset(_videoWindows, 0, sizeof(_videoWindows));
_dummyWindow = new WindowBlock;
_windowList = new WindowBlock[16];
memset(_lettersToPrintBuf, 0, sizeof(_lettersToPrintBuf));
_planarBuf = 0;
_midiEnabled = false;
_vgaTickCounter = 0;
_sound = 0;
_effectsPaused = false;
_ambientPaused = false;
_musicPaused = false;
_saveLoadType = 0;
_saveLoadSlot = 0;
memset(_saveLoadName, 0, sizeof(_saveLoadName));
memset(_saveBuf, 0, sizeof(_saveBuf));
_saveGameNameLen = 0;
_saveLoadRowCurPos = 0;
_numSaveGameRows = 0;
_saveDialogFlag = false;
_saveOrLoad = false;
_saveLoadEdit = false;
_hyperLink = 0;
_interactY = 0;
_oracleMaxScrollY = 0;
_noOracleScroll = 0;
_backGroundBuf = 0;
_backBuf = 0;
_scaleBuf = 0;
_window4BackScn = 0;
_window6BackScn = 0;
_window3Flag = 0;
_window4Flag = 0;
_window6Flag = 0;
_moveXMin = 0;
_moveYMin = 0;
_moveXMax = 0;
_moveYMax = 0;
_vc10BasePtrOld = 0;
memcpy (_hebrewCharWidths,
"\x5\x5\x4\x6\x5\x3\x4\x5\x6\x3\x5\x5\x4\x6\x5\x3\x4\x6\x5\x6\x6\x6\x5\x5\x5\x6\x5\x6\x6\x6\x6\x6", 32);
const Common::FSNode gameDataDir(ConfMan.get("path"));
// Add default file directories for Acorn version of
// Simon the Sorcerer 1
SearchMan.addSubDirectoryMatching(gameDataDir, "execute");
// Add default file directories for Amiga/Macintosh
// versions of Simon the Sorcerer 2
SearchMan.addSubDirectoryMatching(gameDataDir, "voices");
// Add default file directories for Amiga & Macintosh
// versions of The Feeble Files
SearchMan.addSubDirectoryMatching(gameDataDir, "gfx");
SearchMan.addSubDirectoryMatching(gameDataDir, "movies");
SearchMan.addSubDirectoryMatching(gameDataDir, "sfx");
SearchMan.addSubDirectoryMatching(gameDataDir, "speech");
}
Common::Error AGOSEngine::init() {
if (getGameId() == GID_DIMP) {
_screenWidth = 496;
_screenHeight = 400;
} else if (getGameType() == GType_FF || getGameType() == GType_PP) {
_screenWidth = 640;
_screenHeight = 480;
} else {
_screenWidth = 320;
_screenHeight = 200;
}
initGraphics(_screenWidth, _screenHeight);
_midi = new MidiPlayer();
if ((getGameType() == GType_SIMON2 && getPlatform() == Common::kPlatformWindows) ||
(getGameType() == GType_SIMON1 && getPlatform() == Common::kPlatformWindows) ||
((getFeatures() & GF_TALKIE) && getPlatform() == Common::kPlatformAcorn) ||
(getPlatform() == Common::kPlatformDOS)) {
bool isDemo = (getFeatures() & GF_DEMO) ? true : false;
int ret = _midi->open(getGameType(), isDemo);
if (ret)
warning("MIDI Player init failed: \"%s\"", MidiDriver::getErrorName(ret));
_midi->setVolume(ConfMan.getInt("music_volume"), ConfMan.getInt("sfx_volume"));
_midiEnabled = true;
}
// Setup mixer
syncSoundSettings();
// allocate buffers
_backGroundBuf = new Graphics::Surface();
_backGroundBuf->create(_screenWidth, _screenHeight, Graphics::PixelFormat::createFormatCLUT8());
if (getGameType() == GType_FF || getGameType() == GType_PP) {
_backBuf = new Graphics::Surface();
_backBuf->create(_screenWidth, _screenHeight, Graphics::PixelFormat::createFormatCLUT8());
_scaleBuf = new Graphics::Surface();
_scaleBuf->create(_screenWidth, _screenHeight, Graphics::PixelFormat::createFormatCLUT8());
}
if (getGameType() == GType_SIMON2) {
_window4BackScn = new Graphics::Surface();
_window4BackScn->create(_screenWidth, _screenHeight, Graphics::PixelFormat::createFormatCLUT8());
} else if (getGameType() == GType_SIMON1) {
_window4BackScn = new Graphics::Surface();
_window4BackScn->create(_screenWidth, 134, Graphics::PixelFormat::createFormatCLUT8());
} else if (getGameType() == GType_WW || getGameType() == GType_ELVIRA2) {
_window4BackScn = new Graphics::Surface();
_window4BackScn->create(224, 127, Graphics::PixelFormat::createFormatCLUT8());
} else if (getGameType() == GType_ELVIRA1) {
_window4BackScn = new Graphics::Surface();
if (getPlatform() == Common::kPlatformAmiga && (getFeatures() & GF_DEMO)) {
_window4BackScn->create(224, 196, Graphics::PixelFormat::createFormatCLUT8());
} else {
_window4BackScn->create(224, 144, Graphics::PixelFormat::createFormatCLUT8());
}
_window6BackScn = new Graphics::Surface();
_window6BackScn->create(48, 80, Graphics::PixelFormat::createFormatCLUT8());
}
setupGame();
_debugger = new Debugger(this);
_sound = new Sound(this, gss, _mixer);
if (ConfMan.hasKey("music_mute") && ConfMan.getBool("music_mute") == 1) {
_musicPaused = true;
if (_midiEnabled) {
_midi->pause(_musicPaused);
}
_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, 0);
}
if (ConfMan.hasKey("sfx_mute") && ConfMan.getBool("sfx_mute") == 1) {
if (getGameId() == GID_SIMON1DOS)
_midi->_enable_sfx = !_midi->_enable_sfx;
else {
_effectsPaused = !_effectsPaused;
_sound->effectsPause(_effectsPaused);
}
}
_copyProtection = ConfMan.getBool("copy_protection");
_language = Common::parseLanguage(ConfMan.get("language"));
if (getGameType() == GType_PP) {
_speech = true;
_subtitles = false;
} else if (getFeatures() & GF_TALKIE) {
_speech = !ConfMan.getBool("speech_mute");
_subtitles = ConfMan.getBool("subtitles");
if (getGameType() == GType_SIMON1) {
// English and German versions don't have full subtitles
if (_language == Common::EN_ANY || _language == Common::DE_DEU)
_subtitles = false;
// Other versions require speech to be enabled
else
_speech = true;
}
// Default to speech only, if both speech and subtitles disabled
if (!_speech && !_subtitles)
_speech = true;
} else {
_speech = false;
_subtitles = true;
}
return Common::kNoError;
}
static const uint16 initialVideoWindows_Simon[20] = {
0, 0, 20, 200,
0, 0, 3, 136,
17, 0, 3, 136,
0, 0, 20, 200,
0, 0, 20, 134
};
static const uint16 initialVideoWindows_Common[20] = {
3, 0, 14, 136,
0, 0, 3, 136,
17, 0, 3, 136,
0, 0, 20, 200,
3, 3, 14, 127,
};
static const uint16 initialVideoWindows_PN[20] = {
3, 0, 14, 136,
0, 0, 3, 136,
17, 0, 3, 136,
0, 0, 20, 200,
3, 2, 14, 129,
};
#ifdef ENABLE_AGOS2
void AGOSEngine_PuzzlePack::setupGame() {
if (getGameId() == GID_DIMP) {
gss = &dimp_settings;
} else if (getGameId() == GID_JUMBLE) {
gss = &jumble_settings;
} else if (getGameId() == GID_PUZZLE) {
gss = &puzzle_settings;
} else if (getGameId() == GID_SWAMPY) {
gss = &swampy_settings;
}
_numVideoOpcodes = 85;
_vgaMemSize = 7500000;
_itemMemSize = 20000;
_tableMemSize = 200000;
_frameCount = 1;
_vgaBaseDelay = 5;
_vgaPeriod = (getGameId() == GID_DIMP) ? 35 : 30;
_numBitArray1 = 128;
_numItemStore = 10;
_numTextBoxes = 40;
_numVars = 2048;
_numZone = 450;
AGOSEngine::setupGame();
}
#endif
void AGOSEngine_Simon2::setupGame() {
gss = &simon2_settings;
_tableIndexBase = 1580 / 4;
_textIndexBase = 1500 / 4;
_numVideoOpcodes = 75;
#if defined(__DS__)
_vgaMemSize = 1300000;
#else
_vgaMemSize = 2000000;
#endif
_itemMemSize = 20000;
_tableMemSize = 100000;
// Check whether to use MT-32 MIDI tracks in Simon the Sorcerer 2
if (getGameType() == GType_SIMON2 && _midi->hasNativeMT32())
_musicIndexBase = (1128 + 612) / 4;
else
_musicIndexBase = 1128 / 4;
_soundIndexBase = 1660 / 4;
_frameCount = 1;
_vgaBaseDelay = 1;
_vgaPeriod = 45;
_numBitArray1 = 16;
_numBitArray2 = 16;
_numItemStore = 10;
_numTextBoxes = 20;
_numVars = 255;
_numMusic = 93;
_numSFX = 222;
_numSpeech = 11997;
_numZone = 140;
AGOSEngine::setupGame();
}
void AGOSEngine_Simon1::setupGame() {
gss = &simon1_settings;
_tableIndexBase = 1576 / 4;
_textIndexBase = 1460 / 4;
_numVideoOpcodes = 64;
_vgaMemSize = 1000000;
_itemMemSize = 20000;
_tableMemSize = 50000;
_musicIndexBase = 1316 / 4;
_soundIndexBase = 0;
_frameCount = 1;
_vgaBaseDelay = 1;
_vgaPeriod = 50;
_numBitArray1 = 16;
_numBitArray2 = 16;
_numItemStore = 10;
_numTextBoxes = 20;
_numVars = 255;
_numMusic = 34;
_numSFX = 127;
_numSpeech = 3623;
_numZone = 164;
AGOSEngine::setupGame();
}
void AGOSEngine_Waxworks::setupGame() {
gss = &simon1_settings;
_numVideoOpcodes = 64;
_vgaMemSize = 1000000;
_itemMemSize = 80000;
_tableMemSize = 50000;
_frameCount = 4;
_vgaBaseDelay = 1;
_vgaPeriod = 50;
_numBitArray1 = 16;
_numBitArray2 = 15;
_numItemStore = 50;
_numTextBoxes = 10;
_numVars = 255;
_numMusic = 26;
_numZone = 155;
AGOSEngine::setupGame();
}
void AGOSEngine_Elvira2::setupGame() {
gss = &simon1_settings;
_numVideoOpcodes = 60;
_vgaMemSize = 1000000;
_itemMemSize = 64000;
_tableMemSize = 100000;
_frameCount = 4;
_vgaBaseDelay = 1;
_vgaPeriod = 50;
_numBitArray1 = 16;
_numBitArray2 = 15;
_numItemStore = 50;
_numVars = 255;
_numMusic = 9;
_numZone = 99;
AGOSEngine::setupGame();
}
void AGOSEngine_Elvira1::setupGame() {
gss = &simon1_settings;
_numVideoOpcodes = 57;
_vgaMemSize = 1000000;
_itemMemSize = 64000;
_tableMemSize = 256000;
_frameCount = 4;
_vgaBaseDelay = 1;
_vgaPeriod = 50;
_numVars = 512;
_numMusic = 14;
_numZone = 74;
AGOSEngine::setupGame();
}
void AGOSEngine_PN::setupGame() {
gss = &simon1_settings;
_numVideoOpcodes = 57;
_vgaMemSize = 1000000;
_frameCount = 4;
_vgaBaseDelay = 1;
_vgaPeriod = 50;
_numVars = 256;
_numZone = 26;
AGOSEngine::setupGame();
}
void AGOSEngine::setupGame() {
allocItemHeap();
allocTablesHeap();
if (getGameType() != GType_SIMON2)
initMouse();
_variableArray = (int16 *)calloc(_numVars, sizeof(int16));
_variableArrayPtr = _variableArray;
if (getGameType() == GType_FF || getGameType() == GType_PP) {
_variableArray2 = (int16 *)calloc(_numVars, sizeof(int16));
}
setupOpcodes();
setupVgaOpcodes();
setZoneBuffers();
_currentMouseCursor = 255;
_currentMouseAnim = 255;
_lastMusicPlayed = -1;
_nextMusicToPlay = -1;
_noOverWrite = 0xFFFF;
_stringIdLocalMin = 1;
_agosMenu = 1;
_superRoomNumber = 1;
for (int i = 0; i < 20; i++) {
if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
_videoWindows[i] = initialVideoWindows_Simon[i];
} else if (getGameType() == GType_PN) {
_videoWindows[i] = initialVideoWindows_PN[i];
} else {
_videoWindows[i] = initialVideoWindows_Common[i];
}
}
if (getGameType() == GType_ELVIRA2 && getPlatform() == Common::kPlatformAtariST) {
_videoWindows[9] = 75;
}
}
AGOSEngine::~AGOSEngine() {
_system->getAudioCDManager()->stop();
for (uint i = 0; i < _itemHeap.size(); i++) {
delete[] _itemHeap[i];
}
_itemHeap.clear();
free(_tablesHeapPtr - _tablesHeapCurPos);
free(_mouseData);
free(_gameOffsetsPtr);
free(_iconFilePtr);
free(_itemArrayPtr);
free(_menuBase);
free(_roomsList);
free(_roomStates);
free(_stringTabPtr);
free(_strippedTxtMem);
free(_tblList);
free(_textMem);
free(_xtblList);
if (_backGroundBuf)
_backGroundBuf->free();
delete _backGroundBuf;
if (_backBuf)
_backBuf->free();
delete _backBuf;
free(_planarBuf);
if (_scaleBuf)
_scaleBuf->free();
delete _scaleBuf;
free(_zoneBuffers);
if (_window4BackScn)
_window4BackScn->free();
delete _window4BackScn;
if (_window6BackScn)
_window6BackScn->free();
delete _window6BackScn;
delete _midi;
free(_firstTimeStruct);
free(_pendingDeleteTimeEvent);
free(_variableArray);
free(_variableArray2);
delete _dummyItem1;
delete _dummyItem2;
delete _dummyItem3;
delete _dummyWindow;
delete[] _windowList;
delete _debugger;
delete _sound;
delete _gameFile;
}
GUI::Debugger *AGOSEngine::getDebugger() {
return _debugger;
}
void AGOSEngine::pauseEngineIntern(bool pauseIt) {
if (pauseIt) {
_keyPressed.reset();
_pause = true;
_midi->pause(true);
_mixer->pauseAll(true);
} else {
_pause = false;
_midi->pause(_musicPaused);
_mixer->pauseAll(false);
}
}
void AGOSEngine::pause() {
pauseEngine(true);
while (_pause && !shouldQuit()) {
delay(1);
if (_keyPressed.keycode == Common::KEYCODE_PAUSE) {
pauseEngine(false);
_keyPressed.reset();
}
}
}
Common::Error AGOSEngine::go() {
#ifdef ENABLE_AGOS2
loadArchives();
#endif
loadGamePcFile();
addTimeEvent(0, 1);
if (getFileName(GAME_GMEFILE) != NULL) {
openGameFile();
}
if (getGameType() == GType_FF) {
loadIconData();
} else if (getFileName(GAME_ICONFILE) != NULL) {
loadIconFile();
}
if (getFileName(GAME_MENUFILE) != NULL) {
loadMenuFile();
}
vc34_setMouseOff();
if (getGameType() != GType_PP && getGameType() != GType_FF) {
uint16 count = (getGameType() == GType_SIMON2) ? 5 : _frameCount;
addVgaEvent(count, ANIMATE_INT, NULL, 0, 0);
}
if (getGameType() == GType_ELVIRA1 && getPlatform() == Common::kPlatformAtariST &&
(getFeatures() & GF_DEMO)) {
setWindowImage(3, 9900);
while (!shouldQuit())
delay(0);
}
if (getGameType() == GType_ELVIRA1 && getPlatform() == Common::kPlatformAmiga &&
(getFeatures() & GF_DEMO)) {
playMusic(0, 0);
}
runSubroutine101();
permitInput();
while (!shouldQuit()) {
waitForInput();
handleVerbClicked(_verbHitArea);
delay(100);
}
return Common::kNoError;
}
uint32 AGOSEngine::getTime() const {
return _system->getMillis() / 1000;
}
void AGOSEngine::syncSoundSettings() {
Engine::syncSoundSettings();
bool mute = false;
if (ConfMan.hasKey("mute"))
mute = ConfMan.getBool("mute");
// Sync the engine with the config manager
int soundVolumeMusic = ConfMan.getInt("music_volume");
int soundVolumeSFX = ConfMan.getInt("sfx_volume");
if (_midiEnabled)
_midi->setVolume((mute ? 0 : soundVolumeMusic), (mute ? 0 : soundVolumeSFX));
}
} // End of namespace AGOS