mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-25 11:15:00 +00:00
ba68b7b275
This shouldn't actually be necessary since, as far as I can tell, its only purpose is to toggle between true and false to slow down some mouse cursor animations. But Valgrind doesn't know that.
395 lines
9.1 KiB
C++
395 lines
9.1 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.
|
|
*
|
|
*/
|
|
|
|
|
|
|
|
#ifdef ENABLE_AGOS2
|
|
|
|
#include "common/config-manager.h"
|
|
|
|
#include "agos/intern.h"
|
|
#include "agos/agos.h"
|
|
#include "agos/animation.h"
|
|
|
|
namespace AGOS {
|
|
|
|
AGOSEngine_Feeble::AGOSEngine_Feeble(OSystem *system, const AGOSGameDescription *gd)
|
|
: AGOSEngine_Simon2(system, gd) {
|
|
|
|
_interactiveVideo = 0;
|
|
_moviePlayer = 0;
|
|
_vgaCurSpritePriority = 0;
|
|
_mouseToggle = false;
|
|
}
|
|
|
|
AGOSEngine_Feeble::~AGOSEngine_Feeble() {
|
|
delete _moviePlayer;
|
|
}
|
|
|
|
static const GameSpecificSettings feeblefiles_settings = {
|
|
"game22", // base_filename
|
|
"save.999", // restore_filename
|
|
"tbllist", // tbl_filename
|
|
"", // effects_filename
|
|
"VOICES", // speech_filename
|
|
};
|
|
|
|
void AGOSEngine_Feeble::setupGame() {
|
|
gss = &feeblefiles_settings;
|
|
_numVideoOpcodes = 85;
|
|
_vgaMemSize = 7500000;
|
|
_itemMemSize = 20000;
|
|
_tableMemSize = 200000;
|
|
_frameCount = 1;
|
|
_vgaBaseDelay = 5;
|
|
_vgaPeriod = 50;
|
|
_numBitArray1 = 16;
|
|
_numBitArray2 = 16;
|
|
_numBitArray3 = 16;
|
|
_numItemStore = 10;
|
|
_numTextBoxes = 40;
|
|
_numVars = 255;
|
|
|
|
_numSpeech = 10000;
|
|
_numZone = 450;
|
|
|
|
AGOSEngine::setupGame();
|
|
}
|
|
|
|
void AGOSEngine_Feeble::runSubroutine101() {
|
|
if ((getPlatform() == Common::kPlatformAmiga || getPlatform() == Common::kPlatformMacintosh) &&
|
|
getGameType() == GType_FF) {
|
|
playVideo("epic.dxa");
|
|
}
|
|
|
|
AGOSEngine::runSubroutine101();
|
|
}
|
|
|
|
void AGOSEngine_Feeble::playVideo(const char *filename, bool lastSceneUsed) {
|
|
if (shouldQuit())
|
|
return;
|
|
|
|
if (lastSceneUsed)
|
|
setBitFlag(41, true);
|
|
|
|
_moviePlayer = makeMoviePlayer(this, filename);
|
|
assert(_moviePlayer);
|
|
|
|
_moviePlayer->load();
|
|
_moviePlayer->play();
|
|
|
|
delete _moviePlayer;
|
|
_moviePlayer = NULL;
|
|
|
|
if (lastSceneUsed)
|
|
setBitFlag(41, false);
|
|
}
|
|
|
|
void AGOSEngine_Feeble::stopInteractiveVideo() {
|
|
if (_interactiveVideo) {
|
|
_interactiveVideo = 0;
|
|
_moviePlayer->stopVideo();
|
|
delete _moviePlayer;
|
|
_moviePlayer = NULL;
|
|
}
|
|
}
|
|
|
|
AGOSEngine_FeebleDemo::AGOSEngine_FeebleDemo(OSystem *system, const AGOSGameDescription *gd)
|
|
: AGOSEngine_Feeble(system, gd) {
|
|
|
|
_filmMenuUsed = 0;
|
|
}
|
|
|
|
Common::Error AGOSEngine_FeebleDemo::go() {
|
|
// Main menu
|
|
defineBox( 1, 80, 75, 81, 117, kBFBoxDead, 0, NULL);
|
|
defineBox( 2, 267, 21, 105, 97, kBFBoxDead, 0, NULL);
|
|
defineBox( 3, 456, 89, 125, 103, kBFBoxDead, 0, NULL);
|
|
defineBox( 4, 151, 225, 345, 41, kBFBoxDead, 0, NULL);
|
|
defineBox( 5, 169, 319, 109, 113, kBFBoxDead, 0, NULL);
|
|
defineBox( 6, 404, 308, 62, 117, kBFBoxDead, 0, NULL);
|
|
|
|
// Film menu
|
|
defineBox(11, 28, 81, 123, 93, kBFBoxDead, 0, NULL);
|
|
defineBox(12, 182, 81, 123, 93, kBFBoxDead, 0, NULL);
|
|
defineBox(13, 335, 81, 123, 93, kBFBoxDead, 0, NULL);
|
|
defineBox(14, 488, 81, 123, 93, kBFBoxDead, 0, NULL);
|
|
defineBox(15, 28, 201, 123, 93, kBFBoxDead, 0, NULL);
|
|
defineBox(16, 182, 201, 123, 93, kBFBoxDead, 0, NULL);
|
|
defineBox(17, 335, 201, 123, 93, kBFBoxDead, 0, NULL);
|
|
defineBox(18, 488, 201, 123, 93, kBFBoxDead, 0, NULL);
|
|
defineBox(19, 255, 357, 135, 45, kBFBoxDead, 0, NULL);
|
|
|
|
// Exit Menu
|
|
defineBox(21, 548, 421, 42, 21, kBFBoxDead, 0, NULL);
|
|
|
|
// Text Window used by Feeble Files Data section
|
|
if (_language ==Common::DE_DEU) {
|
|
_textWindow = openWindow(322, 457, 196, 15, 1, 0, 255);
|
|
} else {
|
|
_textWindow = openWindow(444, 452, 196, 15, 1, 0, 255);
|
|
}
|
|
|
|
playVideo("winasoft.smk");
|
|
playVideo("fbigtalk.smk");
|
|
|
|
while (!shouldQuit())
|
|
mainMenu();
|
|
|
|
return Common::kNoError;
|
|
}
|
|
|
|
void AGOSEngine_FeebleDemo::exitMenu() {
|
|
for (int i = 1; i <= 20; i++)
|
|
disableBox(i);
|
|
|
|
enableBox(21);
|
|
|
|
playVideo("fhypno.smk");
|
|
playVideo("fbye1.smk", true);
|
|
|
|
HitArea *ha;
|
|
do {
|
|
_lastHitArea = NULL;
|
|
_lastHitArea3 = NULL;
|
|
|
|
while (!shouldQuit() && _lastHitArea3 == 0) {
|
|
delay(1);
|
|
}
|
|
|
|
ha = _lastHitArea;
|
|
} while (!shouldQuit() && !(ha != NULL && ha->id == 21));
|
|
|
|
playVideo("fbye2.smk");
|
|
quitGame();
|
|
delay(0);
|
|
}
|
|
|
|
void AGOSEngine_FeebleDemo::filmMenu() {
|
|
for (int i = 1; i <= 6; i++)
|
|
disableBox(i);
|
|
|
|
for (int i = 11; i <= 19; i++)
|
|
enableBox(i);
|
|
|
|
if (!_filmMenuUsed) {
|
|
playVideo("fclipsin.smk", true);
|
|
} else {
|
|
playVideo("fclipin2.smk", true);
|
|
}
|
|
|
|
_filmMenuUsed = true;
|
|
|
|
HitArea *ha;
|
|
while (!shouldQuit()) {
|
|
_lastHitArea = NULL;
|
|
_lastHitArea3 = NULL;
|
|
|
|
while (!shouldQuit() && _lastHitArea3 == 0) {
|
|
handleWobble();
|
|
delay(1);
|
|
}
|
|
|
|
ha = _lastHitArea;
|
|
|
|
if (ha == NULL)
|
|
continue;
|
|
|
|
stopInteractiveVideo();
|
|
|
|
if (ha->id == 11) {
|
|
playVideo("fgo1.smk");
|
|
playVideo("maze.smk");
|
|
} else if (ha->id == 12) {
|
|
playVideo("fgo2.smk");
|
|
playVideo("radioin.smk");
|
|
} else if (ha->id == 13) {
|
|
playVideo("fgo3.smk");
|
|
playVideo("pad.smk");
|
|
} else if (ha->id == 14) {
|
|
playVideo("fgo4.smk");
|
|
playVideo("bridge.smk");
|
|
} else if (ha->id == 15) {
|
|
playVideo("fgo5.smk");
|
|
playVideo("pilldie.smk");
|
|
} else if (ha->id == 16) {
|
|
playVideo("fgo6.smk");
|
|
playVideo("bikebust.smk");
|
|
} else if (ha->id == 17) {
|
|
playVideo("fgo7.smk");
|
|
playVideo("statue.smk");
|
|
} else if (ha->id == 18) {
|
|
playVideo("fgo8.smk");
|
|
playVideo("junkout.smk");
|
|
} else if (ha->id == 19) {
|
|
playVideo("fgo9.smk");
|
|
break;
|
|
}
|
|
|
|
playVideo("fclipin2.smk", true);
|
|
}
|
|
}
|
|
|
|
void AGOSEngine_FeebleDemo::handleText() {
|
|
if (_lastClickRem == _currentBox)
|
|
return;
|
|
|
|
if (_currentBox && (_currentBox->id >= 1 && _currentBox->id <= 6)) {
|
|
// TODO: Add the subtitles for menu options
|
|
}
|
|
|
|
_lastClickRem = _currentBox;
|
|
}
|
|
|
|
void AGOSEngine_FeebleDemo::handleWobble() {
|
|
if (_lastClickRem == _currentBox)
|
|
return;
|
|
|
|
stopInteractiveVideo();
|
|
|
|
if (_currentBox && (_currentBox->id >= 11 && _currentBox->id <= 19)) {
|
|
char filename[15];
|
|
sprintf(filename, "wobble%d.smk", _currentBox->id - 10);
|
|
|
|
startInteractiveVideo(filename);
|
|
}
|
|
|
|
_lastClickRem = _currentBox;
|
|
}
|
|
|
|
void AGOSEngine_FeebleDemo::mainMenu() {
|
|
for (int i = 1; i <= 6; i++)
|
|
enableBox(i);
|
|
|
|
for (int i = 11; i <= 19; i++)
|
|
disableBox(i);
|
|
|
|
playVideo("mmfadein.smk", true);
|
|
|
|
startInteractiveVideo("mainmenu.smk");
|
|
|
|
HitArea *ha = 0;
|
|
do {
|
|
_lastHitArea = NULL;
|
|
_lastHitArea3 = NULL;
|
|
|
|
while (_lastHitArea3 == 0) {
|
|
if (shouldQuit())
|
|
return;
|
|
handleText();
|
|
delay(1);
|
|
}
|
|
|
|
ha = _lastHitArea;
|
|
} while (ha == NULL || !(ha->id >= 1 && ha->id <= 6));
|
|
|
|
if (shouldQuit())
|
|
return;
|
|
|
|
stopInteractiveVideo();
|
|
|
|
if (ha->id == 1) {
|
|
// Feeble Files Data
|
|
playVideo("ffade5.smk");
|
|
playVideo("ftext0.smk");
|
|
playVideo("ftext1.smk", true);
|
|
waitForSpace();
|
|
playVideo("ftext2.smk", true);
|
|
waitForSpace();
|
|
playVideo("ftext3.smk", true);
|
|
waitForSpace();
|
|
playVideo("ftext4.smk", true);
|
|
waitForSpace();
|
|
playVideo("ftext5.smk", true);
|
|
waitForSpace();
|
|
} else if (ha->id == 2) {
|
|
// Opening Sequence
|
|
playVideo("ffade1.smk");
|
|
playVideo("musosp1.smk");
|
|
playVideo("newcred.smk");
|
|
playVideo("fasall.smk");
|
|
playVideo("mus5p2.smk");
|
|
playVideo("coach.smk");
|
|
playVideo("outmin.smk");
|
|
} else if (ha->id == 3) {
|
|
// Technical Information
|
|
playVideo("ffade3.smk");
|
|
playVideo("idfx4a.smk");
|
|
playVideo("idfx4b.smk");
|
|
playVideo("idfx4c.smk");
|
|
playVideo("idfx4d.smk");
|
|
playVideo("idfx4e.smk");
|
|
playVideo("idfx4f.smk");
|
|
playVideo("idfx4g.smk");
|
|
} else if (ha->id == 4) {
|
|
// About AdventureSoft
|
|
playVideo("ffade2.smk");
|
|
playVideo("fscene3b.smk");
|
|
playVideo("fscene3a.smk");
|
|
playVideo("fscene3c.smk");
|
|
playVideo("fscene3g.smk");
|
|
} else if (ha->id == 5) {
|
|
// Video Clips
|
|
playVideo("ffade4.smk");
|
|
filmMenu();
|
|
} else if (ha->id == 6) {
|
|
// Exit InfoDisk
|
|
playVideo("ffade6.smk");
|
|
exitMenu();
|
|
}
|
|
}
|
|
|
|
void AGOSEngine_FeebleDemo::startInteractiveVideo(const char *filename) {
|
|
setBitFlag(40, true);
|
|
_interactiveVideo = MoviePlayer::TYPE_LOOPING;
|
|
_moviePlayer = makeMoviePlayer(this, filename);
|
|
assert(_moviePlayer);
|
|
_moviePlayer->load();
|
|
_moviePlayer->play();
|
|
setBitFlag(40, false);
|
|
}
|
|
|
|
void AGOSEngine_FeebleDemo::waitForSpace() {
|
|
const char *message;
|
|
|
|
if (_language == Common::DE_DEU) {
|
|
message = "Dr\x81""cken Sie die <Leertaste>, um fortzufahren...";
|
|
} else {
|
|
message = "Press <SPACE> to continue...";
|
|
}
|
|
|
|
windowPutChar(_textWindow, 12);
|
|
for (; *message; message++)
|
|
windowPutChar(_textWindow, *message);
|
|
|
|
mouseOff();
|
|
do {
|
|
delay(1);
|
|
} while (!shouldQuit() && (_keyPressed.keycode != Common::KEYCODE_SPACE));
|
|
_keyPressed.reset();
|
|
mouseOn();
|
|
}
|
|
|
|
} // End of namespace AGOS
|
|
|
|
#endif // ENABLE_AGOS2
|