aboutsummaryrefslogtreecommitdiff
path: root/engines/agos/agos.cpp
diff options
context:
space:
mode:
authorDavid Corrales2007-06-23 18:51:33 +0000
committerDavid Corrales2007-06-23 18:51:33 +0000
commitcacd7a28fd51d960947de88abbf30c487e66529d (patch)
treef3baa59853bfb307e452b86b9d93c4737b1fa6ab /engines/agos/agos.cpp
parent0ac96302fe9c04df79cb01a77d19535b45fe2db0 (diff)
parent90c2210dae8c91fa8babc6b05564e15c9d445d18 (diff)
downloadscummvm-rg350-cacd7a28fd51d960947de88abbf30c487e66529d.tar.gz
scummvm-rg350-cacd7a28fd51d960947de88abbf30c487e66529d.tar.bz2
scummvm-rg350-cacd7a28fd51d960947de88abbf30c487e66529d.zip
Merged the FSNode branch with trunk r27031:27680
svn-id: r27681
Diffstat (limited to 'engines/agos/agos.cpp')
-rw-r--r--engines/agos/agos.cpp145
1 files changed, 107 insertions, 38 deletions
diff --git a/engines/agos/agos.cpp b/engines/agos/agos.cpp
index 33737057f8..c98257f028 100644
--- a/engines/agos/agos.cpp
+++ b/engines/agos/agos.cpp
@@ -124,6 +124,10 @@ AGOSEngine::AGOSEngine(OSystem *syst)
_tableIndexBase = 0;
_textIndexBase = 0;
+ _numMusic = 0;
+ _numSFX = 0;
+ _numSpeech = 0;
+
_numBitArray1 = 0;
_numBitArray2 = 0;
_numBitArray3 = 0;
@@ -132,6 +136,7 @@ AGOSEngine::AGOSEngine(OSystem *syst)
_numVars = 0;
_numVideoOpcodes = 0;
_vgaBaseDelay = 0;
+ _vgaPeriod = 0;
_strippedTxtMem = 0;
_textMem = 0;
@@ -197,13 +202,10 @@ AGOSEngine::AGOSEngine(OSystem *syst)
_litBoxFlag = 0;
_mortalFlag = 0;
_displayScreen = false;
- _updateScreen = false;
_syncFlag2 = 0;
_inCallBack = 0;
_cepeFlag = 0;
- _copyPartialMode = 0;
_fastMode = 0;
- _useBackGround = 0;
_backFlag = 0;
@@ -298,6 +300,8 @@ AGOSEngine::AGOSEngine(OSystem *syst)
_leftButtonDown = 0;
_rightButtonDown = 0;
_clickOnly = 0;
+ _leftClick = 0;
+ _oneClick = 0;
_noRightClick = false;
_leftButton = 0;
@@ -312,7 +316,6 @@ AGOSEngine::AGOSEngine(OSystem *syst)
_scrollUpHitArea = 0;
_scrollDownHitArea = 0;
-
_noOverWrite = 0;
_rejectBlock = false;
@@ -331,6 +334,7 @@ AGOSEngine::AGOSEngine(OSystem *syst)
_showPreposition = 0;
_showMessageFlag = 0;
+ _newDirtyClip = false;
_copyScnFlag = 0;
_vgaSpriteChanged = 0;
@@ -348,8 +352,6 @@ AGOSEngine::AGOSEngine(OSystem *syst)
_curSfxFile = 0;
_syncCount = 0;
- _timer5 = 0;
- _timer4 = 0;
_iconToggleCount = 0;
_voiceCount = 0;
@@ -466,6 +468,9 @@ AGOSEngine::AGOSEngine(OSystem *syst)
_planarBuf = 0;
+ _midiEnabled = false;
+ _nativeMT32 = false;
+
_vgaTickCounter = 0;
_moviePlay = 0;
@@ -494,7 +499,6 @@ AGOSEngine::AGOSEngine(OSystem *syst)
_noOracleScroll = 0;
_backGroundBuf = 0;
- _frontBuf = 0;
_backBuf = 0;
_scaleBuf = 0;
@@ -566,34 +570,34 @@ int AGOSEngine::init() {
_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, ConfMan.getInt("sfx_volume"));
_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
- // Setup midi driver
- MidiDriver *driver = 0;
- if (getGameType() == GType_FF || getGameType() == GType_PP || getGameId() == GID_SIMON1CD32) {
- driver = MidiDriver::createMidi(MD_NULL);
- _native_mt32 = false;
- } else {
+ if ((getGameType() == GType_SIMON2 && getPlatform() == Common::kPlatformWindows) ||
+ (getGameType() == GType_SIMON1 && getPlatform() == Common::kPlatformWindows) ||
+ ((getFeatures() & GF_TALKIE) && getPlatform() == Common::kPlatformAcorn) ||
+ (getPlatform() == Common::kPlatformPC)) {
+
+ // Setup midi driver
int midiDriver = MidiDriver::detectMusicDriver(MDT_ADLIB | MDT_MIDI);
- _native_mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32"));
- driver = MidiDriver::createMidi(midiDriver);
- if (_native_mt32) {
+ _nativeMT32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32"));
+ MidiDriver *driver = MidiDriver::createMidi(midiDriver);
+ if (_nativeMT32) {
driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
}
- }
- _midi.mapMT32toGM (getGameType() != GType_SIMON2 && !_native_mt32);
+ _midi.mapMT32toGM (getGameType() != GType_SIMON2 && !_nativeMT32);
+
+ _midi.setDriver(driver);
+ int ret = _midi.open();
+ if (ret)
+ warning("MIDI Player init failed: \"%s\"", _midi.getErrorName (ret));
- _midi.setDriver(driver);
- int ret = _midi.open();
- if (ret)
- warning("MIDI Player init failed: \"%s\"", _midi.getErrorName (ret));
- _midi.setVolume(ConfMan.getInt("music_volume"));
+ _midi.setVolume(ConfMan.getInt("music_volume"));
- if (ConfMan.hasKey("music_mute") && ConfMan.getBool("music_mute") == 1)
- _midi.pause(_musicPaused ^= 1);
+
+ _midiEnabled = true;
+ }
// allocate buffers
_backGroundBuf = (byte *)calloc(_screenWidth * _screenHeight, 1);
- _frontBuf = (byte *)calloc(_screenWidth * _screenHeight, 1);
if (getGameType() == GType_FF || getGameType() == GType_PP) {
_backBuf = (byte *)calloc(_screenWidth * _screenHeight, 1);
@@ -607,7 +611,11 @@ int AGOSEngine::init() {
} else if (getGameType() == GType_WW || getGameType() == GType_ELVIRA2) {
_window4BackScn = (byte *)calloc(224 * 127, 1);
} else if (getGameType() == GType_ELVIRA1) {
- _window4BackScn = (byte *)calloc(224 * 127, 1);
+ if (getPlatform() == Common::kPlatformAmiga && (getFeatures() & GF_DEMO)) {
+ _window4BackScn = (byte *)calloc(224 * 196, 1);
+ } else {
+ _window4BackScn = (byte *)calloc(224 * 144, 1);
+ }
_window6BackScn = (byte *)calloc(48 * 80, 1);
}
@@ -618,6 +626,14 @@ int AGOSEngine::init() {
_moviePlay = new MoviePlayer(this, _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 ^= 1;
@@ -693,6 +709,7 @@ void AGOSEngine_PuzzlePack::setupGame() {
_tableMemSize = 200000;
_frameCount = 1;
_vgaBaseDelay = 5;
+ _vgaPeriod = (getGameId() == GID_DIMP) ? 35 : 30;
_numBitArray1 = 128;
_numItemStore = 10;
_numTextBoxes = 40;
@@ -713,6 +730,7 @@ void AGOSEngine_Feeble::setupGame() {
_tableMemSize = 200000;
_frameCount = 1;
_vgaBaseDelay = 5;
+ _vgaPeriod = 50;
_numBitArray1 = 16;
_numBitArray2 = 16;
_numBitArray3 = 16;
@@ -736,19 +754,24 @@ void AGOSEngine_Simon2::setupGame() {
_itemMemSize = 20000;
_tableMemSize = 100000;
// Check whether to use MT-32 MIDI tracks in Simon the Sorcerer 2
- if ((getGameType() == GType_SIMON2) && _native_mt32)
+ if (getGameType() == GType_SIMON2 && _nativeMT32)
_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 = 3632;
+
AGOSEngine::setupGame();
}
@@ -768,12 +791,17 @@ void AGOSEngine_Simon1::setupGame() {
_soundIndexBase = 0;
_frameCount = 1;
_vgaBaseDelay = 1;
+ _vgaPeriod = 50;
_numBitArray1 = 16;
_numBitArray2 = 16;
_numItemStore = 10;
_numTextBoxes = 20;
_numVars = 255;
+ _numMusic = 34;
+ _numSFX = 127;
+ _numSpeech = 1996;
+
AGOSEngine::setupGame();
}
@@ -789,12 +817,15 @@ void AGOSEngine_Waxworks::setupGame() {
_tableMemSize = 50000;
_frameCount = 4;
_vgaBaseDelay = 1;
+ _vgaPeriod = 50;
_numBitArray1 = 16;
_numBitArray2 = 15;
_numItemStore = 50;
_numTextBoxes = 10;
_numVars = 255;
+ _numMusic = 9;
+
AGOSEngine::setupGame();
}
@@ -810,11 +841,14 @@ void AGOSEngine_Elvira2::setupGame() {
_tableMemSize = 100000;
_frameCount = 4;
_vgaBaseDelay = 1;
+ _vgaPeriod = 50;
_numBitArray1 = 16;
_numBitArray2 = 15;
_numItemStore = 50;
_numVars = 255;
+ _numMusic = 9;
+
AGOSEngine::setupGame();
}
@@ -830,8 +864,11 @@ void AGOSEngine_Elvira1::setupGame() {
_tableMemSize = 256000;
_frameCount = 4;
_vgaBaseDelay = 1;
+ _vgaPeriod = 50;
_numVars = 512;
+ _numMusic = 14;
+
AGOSEngine::setupGame();
}
@@ -876,7 +913,10 @@ void AGOSEngine::setupGame() {
}
AGOSEngine::~AGOSEngine() {
- delete _gameFile;
+ // Sync with AGOSEngine::shutdown()
+ // In Simon 2, this gets deleted along with _sound further down
+ if (getGameType() != GType_SIMON2)
+ delete _gameFile;
_midi.close();
@@ -892,7 +932,6 @@ AGOSEngine::~AGOSEngine() {
free(_textMem);
free(_backGroundBuf);
- free(_frontBuf);
free(_backBuf);
free(_scaleBuf);
@@ -906,7 +945,7 @@ AGOSEngine::~AGOSEngine() {
delete _dummyItem2;
delete _dummyItem3;
- delete [] _dummyWindow;
+ delete _dummyWindow;
delete [] _windowList;
delete _debugger;
@@ -925,13 +964,17 @@ void AGOSEngine::pause() {
bool music_status = _musicPaused;
_midi.pause(true);
+ _mixer->pauseAll(true);
_sound->ambientPause(true);
+
while (_pause) {
delay(1);
if (_keyPressed == 'p')
_pause = 0;
}
+
_midi.pause(music_status);
+ _mixer->pauseAll(false);
_sound->ambientPause(ambient_status);
}
@@ -982,7 +1025,7 @@ int AGOSEngine::go() {
}
if (getGameType() == GType_ELVIRA1 && getFeatures() & GF_DEMO) {
- loadMusic(0);
+ playMusic(0, 0);
}
if ((getPlatform() == Common::kPlatformAmiga || getPlatform() == Common::kPlatformMacintosh) &&
@@ -1004,18 +1047,44 @@ int AGOSEngine::go() {
}
void AGOSEngine::shutdown() {
- delete _gameFile;
+ // Sync with AGOSEngine::~AGOSEngine()
+ // In Simon 2, this gets deleted along with _sound further down
+ if (getGameType() != GType_SIMON2)
+ delete _gameFile;
_midi.close();
- free(_stringTabPtr);
- free(_itemArrayPtr);
free(_itemHeapPtr - _itemHeapCurPos);
free(_tablesHeapPtr - _tablesHeapCurPos);
- free(_tblList);
- free(_zoneBuffers);
- free(_iconFilePtr);
+
free(_gameOffsetsPtr);
+ free(_iconFilePtr);
+ free(_itemArrayPtr);
+ free(_stringTabPtr);
+ free(_strippedTxtMem);
+ free(_tblList);
+ free(_textMem);
+
+ free(_backGroundBuf);
+ free(_backBuf);
+ free(_scaleBuf);
+
+ free(_window4BackScn);
+ free(_window6BackScn);
+
+ free(_variableArray);
+ free(_variableArray2);
+
+ delete _dummyItem1;
+ delete _dummyItem2;
+ delete _dummyItem3;
+
+ delete _dummyWindow;
+ delete [] _windowList;
+
+ delete _debugger;
+ delete _moviePlay;
+ delete _sound;
_system->quit();
}