- enabled debugger in QueenEngine::errorString

- initialise Cutaway::_personCount* when the Cutaway starts
- minor tweaks in BankManager

svn-id: r12185
This commit is contained in:
Gregory Montoir 2004-01-06 16:53:35 +00:00
parent 60b59de181
commit e90f846df9
5 changed files with 266 additions and 254 deletions

View File

@ -85,7 +85,7 @@ void Journal::use() {
system->delay_msecs(20);
}
_vm->logic()->writeOptionSettings();
_vm->writeOptionSettings();
_vm->graphics()->textClear(0, GAME_SCREEN_HEIGHT - 1);
_vm->graphics()->putCameraOnBob(0);
@ -451,7 +451,7 @@ void Journal::drawYesNoPanel(int titleNum) {
void Journal::drawConfigPanel() {
_vm->logic()->checkOptionSettings();
_vm->checkOptionSettings();
drawSlideBar(_vm->logic()->talkSpeed(), 130, 100, BOB_TALK_SPEED, 136 - 4, 164, FRAME_BLUE_PIN);
// XXX music_volume

View File

@ -50,16 +50,6 @@ Logic::Logic(QueenEngine *vm)
memset(_talkSelected, 0, sizeof(_talkSelected));
_puzzleAttemptCount = 0;
initialise();
if (_vm->resource()->isDemo()) {
_preChangeRoom = &Logic::preChangeRoom_Demo;
_executeSpecialMove = &Logic::executeSpecialMove_Demo;
} else if (_vm->resource()->isInterview()) {
_preChangeRoom = &Logic::preChangeRoom_Interview;
_executeSpecialMove = &Logic::executeSpecialMove_Interview;
} else {
_preChangeRoom = &Logic::preChangeRoom_Game;
_executeSpecialMove = &Logic::executeSpecialMove_Game;
}
}
Logic::~Logic() {
@ -2169,7 +2159,7 @@ void Logic::sceneStop() {
void Logic::changeRoom() {
if (!(this->*_preChangeRoom)())
if (!preChangeRoom())
roomDisplay(currentRoom(), RDM_FADE_JOE, 100, 1, false);
_vm->display()->showMouseCursor(true);
}
@ -2188,227 +2178,9 @@ void Logic::useJournal() {
}
void Logic::registerDefaultSettings() {
ConfMan.registerDefault("master_volume", 255);
ConfMan.registerDefault("music_mute", false);
ConfMan.registerDefault("sfx_mute", false);
ConfMan.registerDefault("talkspeed", DEFAULT_TALK_SPEED);
ConfMan.registerDefault("speech_mute", _vm->resource()->isFloppy());
ConfMan.registerDefault("subtitles", true);
}
void Logic::checkOptionSettings() {
// check talkspeed value
if (_talkSpeed < 4) {
_talkSpeed = 4;
} else if (_talkSpeed > 95) {
_talkSpeed = 100;
}
// XXX check master_volume value
// only CD-ROM version has speech
if (_vm->resource()->isFloppy() && _vm->sound()->speechOn()) {
_vm->sound()->speechToggle(false);
}
// ensure text is always on when voice is off
if (!_vm->sound()->speechOn()) {
_subtitles = true;
}
}
void Logic::readOptionSettings() {
// XXX master_volume
_vm->sound()->musicToggle(!ConfMan.getBool("music_mute"));
_vm->sound()->sfxToggle(!ConfMan.getBool("sfx_mute"));
_talkSpeed = ConfMan.getInt("talkspeed");
_vm->sound()->speechToggle(!ConfMan.getBool("speech_mute"));
_subtitles = ConfMan.getBool("subtitles");
checkOptionSettings();
}
void Logic::writeOptionSettings() {
// XXX master_volume
ConfMan.set("music_mute", !_vm->sound()->musicOn());
ConfMan.set("sfx_mute", !_vm->sound()->sfxOn());
ConfMan.set("talkspeed", _talkSpeed);
ConfMan.set("speech_mute", !_vm->sound()->speechOn());
ConfMan.set("subtitles", _subtitles);
ConfMan.flushToDisk();
}
bool Logic::preChangeRoom_Demo() {
if (currentRoom() == FOTAQ_LOGO && gameState(VAR_INTRO_PLAYED) == 0) {
currentRoom(79);
roomDisplay(currentRoom(), RDM_FADE_NOJOE, 100, 2, true);
playCutaway("clogo.cut");
sceneReset();
currentRoom(ROOM_HOTEL_LOBBY);
entryObj(584);
roomDisplay(currentRoom(), RDM_FADE_JOE, 100, 2, true);
playCutaway("c70d.cut");
gameState(VAR_INTRO_PLAYED, 1);
inventorySetup();
inventoryRefresh();
return true;
}
return false;
}
bool Logic::preChangeRoom_Interview() {
if (currentRoom() == 2 && gameState(2) == 0) {
currentRoom(6);
roomDisplay(currentRoom(), RDM_FADE_NOJOE, 100, 2, true);
playCutaway("start.cut");
gameState(2, 1);
inventorySetup();
inventoryRefresh();
return true;
}
return false;
}
bool Logic::preChangeRoom_Game() {
if (currentRoom() == ROOM_JUNGLE_PINNACLE) {
handlePinnacleRoom();
return true;
} else if (currentRoom() == FOTAQ_LOGO && gameState(VAR_INTRO_PLAYED) == 0) {
roomDisplay(currentRoom(), RDM_FADE_NOJOE, 100, 2, true);
playCutaway("copy.cut");
playCutaway("clogo.cut");
// XXX enable talking for talkie version
if (ConfMan.getBool("alt_intro")) {
_vm->graphics()->loadPanel();
playCutaway("cintr.cut");
} else {
playCutaway("cdint.cut");
_vm->graphics()->loadPanel();
}
playCutaway("cred.cut");
sceneReset();
currentRoom(ROOM_HOTEL_LOBBY);
entryObj(584);
roomDisplay(currentRoom(), RDM_FADE_JOE, 100, 2, true);
playCutaway("c70d.cut");
gameState(VAR_INTRO_PLAYED, 1);
inventorySetup();
inventoryRefresh();
return true;
}
return false;
}
bool Logic::executeSpecialMove_Demo(uint16 sm) {
switch (sm) {
case 4:
asmMakeJoeUseUnderwear();
break;
case 5:
asmSwitchToDressPalette();
break;
case 14:
asmEndDemo();
break;
default:
return false;
}
return true;
}
bool Logic::executeSpecialMove_Interview(uint16 sm) {
switch (sm) {
case 1:
asmInterviewIntro();
break;
case 2:
asmEndInterview();
break;
default:
return false;
}
return true;
}
bool Logic::executeSpecialMove_Game(uint16 sm) {
typedef void (Logic::*SpecialMoveProc)();
static const SpecialMoveProc asmTable[] = {
/* 00 */
NULL,
NULL,
&Logic::asmMakeJoeUseDress,
&Logic::asmMakeJoeUseNormalClothes,
/* 04 */
&Logic::asmMakeJoeUseUnderwear,
&Logic::asmSwitchToDressPalette,
&Logic::asmSwitchToNormalPalette,
&Logic::asmStartCarAnimation, // room 74
/* 08 */
&Logic::asmStopCarAnimation, // room 74
&Logic::asmStartFightAnimation, // room 69
&Logic::asmWaitForFrankPosition, // c69e.cut
&Logic::asmMakeFrankGrowing, // c69z.cut
/* 12 */
&Logic::asmMakeRobotGrowing, // c69z.cut
&Logic::asmShrinkRobot,
&Logic::asmEndGame,
&Logic::asmPutCameraOnDino,
/* 16 */
&Logic::asmPutCameraOnJoe,
&Logic::asmAltIntroPanRight, // cintr.cut
&Logic::asmAltIntroPanLeft, // cintr.cut
&Logic::asmSetAzuraInLove,
/* 20 */
&Logic::asmPanRightFromJoe,
&Logic::asmSetLightsOff,
&Logic::asmSetLightsOn,
&Logic::asmSetManequinAreaOn,
/* 24 */
&Logic::asmPanToJoe,
&Logic::asmTurnGuardOn,
&Logic::asmPanLeft320To144,
&Logic::asmSmooch,
/* 28 */
&Logic::asmMakeLightningHitPlane,
&Logic::asmScaleBlimp,
&Logic::asmScaleEnding,
&Logic::asmWaitForCarPosition,
/* 32 */
&Logic::asmShakeScreen,
&Logic::asmAttemptPuzzle,
&Logic::asmScaleTitle,
NULL,
/* 36 */
&Logic::asmPanRightToHugh,
&Logic::asmMakeWhiteFlash,
&Logic::asmPanRightToJoeAndRita,
&Logic::asmPanLeftToBomb // cdint.cut
};
if (sm >= ARRAYSIZE(asmTable) || asmTable[sm] == NULL)
return false;
(this->*asmTable[sm])();
return true;
}
void Logic::executeSpecialMove(uint16 sm) {
debug(6, "Special move: %d", sm);
if (!(this->*_executeSpecialMove)(sm))
if (!handleSpecialMove(sm))
warning("unhandled / invalid special move : %d", sm);
}
@ -3053,6 +2825,166 @@ void Logic::stopCredits() {
}
bool LogicDemo::preChangeRoom() {
if (currentRoom() == FOTAQ_LOGO && gameState(VAR_INTRO_PLAYED) == 0) {
currentRoom(79);
roomDisplay(currentRoom(), RDM_FADE_NOJOE, 100, 2, true);
playCutaway("clogo.cut");
sceneReset();
currentRoom(ROOM_HOTEL_LOBBY);
entryObj(584);
roomDisplay(currentRoom(), RDM_FADE_JOE, 100, 2, true);
playCutaway("c70d.cut");
gameState(VAR_INTRO_PLAYED, 1);
inventorySetup();
inventoryRefresh();
return true;
}
return false;
}
bool LogicInterview::preChangeRoom() {
if (currentRoom() == 2 && gameState(2) == 0) {
currentRoom(6);
roomDisplay(currentRoom(), RDM_FADE_NOJOE, 100, 2, true);
playCutaway("start.cut");
gameState(2, 1);
inventorySetup();
inventoryRefresh();
return true;
}
return false;
}
bool LogicGame::preChangeRoom() {
if (currentRoom() == ROOM_JUNGLE_PINNACLE) {
handlePinnacleRoom();
return true;
} else if (currentRoom() == FOTAQ_LOGO && gameState(VAR_INTRO_PLAYED) == 0) {
roomDisplay(currentRoom(), RDM_FADE_NOJOE, 100, 2, true);
playCutaway("copy.cut");
playCutaway("clogo.cut");
// XXX enable talking for talkie version
if (ConfMan.getBool("alt_intro")) {
_vm->graphics()->loadPanel();
playCutaway("cintr.cut");
} else {
playCutaway("cdint.cut");
_vm->graphics()->loadPanel();
}
playCutaway("cred.cut");
sceneReset();
currentRoom(ROOM_HOTEL_LOBBY);
entryObj(584);
roomDisplay(currentRoom(), RDM_FADE_JOE, 100, 2, true);
playCutaway("c70d.cut");
gameState(VAR_INTRO_PLAYED, 1);
inventorySetup();
inventoryRefresh();
return true;
}
return false;
}
bool LogicDemo::handleSpecialMove(uint16 sm) {
switch (sm) {
case 4:
asmMakeJoeUseUnderwear();
break;
case 5:
asmSwitchToDressPalette();
break;
case 14:
asmEndDemo();
break;
default:
return false;
}
return true;
}
bool LogicInterview::handleSpecialMove(uint16 sm) {
switch (sm) {
case 1:
asmInterviewIntro();
break;
case 2:
asmEndInterview();
break;
default:
return false;
}
return true;
}
bool LogicGame::handleSpecialMove(uint16 sm) {
typedef void (Logic::*SpecialMoveProc)();
static const SpecialMoveProc asmTable[] = {
/* 00 */
0,
0,
&Logic::asmMakeJoeUseDress,
&Logic::asmMakeJoeUseNormalClothes,
/* 04 */
&Logic::asmMakeJoeUseUnderwear,
&Logic::asmSwitchToDressPalette,
&Logic::asmSwitchToNormalPalette,
&Logic::asmStartCarAnimation, // room 74
/* 08 */
&Logic::asmStopCarAnimation, // room 74
&Logic::asmStartFightAnimation, // room 69
&Logic::asmWaitForFrankPosition, // c69e.cut
&Logic::asmMakeFrankGrowing, // c69z.cut
/* 12 */
&Logic::asmMakeRobotGrowing, // c69z.cut
&Logic::asmShrinkRobot,
&Logic::asmEndGame,
&Logic::asmPutCameraOnDino,
/* 16 */
&Logic::asmPutCameraOnJoe,
&Logic::asmAltIntroPanRight, // cintr.cut
&Logic::asmAltIntroPanLeft, // cintr.cut
&Logic::asmSetAzuraInLove,
/* 20 */
&Logic::asmPanRightFromJoe,
&Logic::asmSetLightsOff,
&Logic::asmSetLightsOn,
&Logic::asmSetManequinAreaOn,
/* 24 */
&Logic::asmPanToJoe,
&Logic::asmTurnGuardOn,
&Logic::asmPanLeft320To144,
&Logic::asmSmooch,
/* 28 */
&Logic::asmMakeLightningHitPlane,
&Logic::asmScaleBlimp,
&Logic::asmScaleEnding,
&Logic::asmWaitForCarPosition,
/* 32 */
&Logic::asmShakeScreen,
&Logic::asmAttemptPuzzle,
&Logic::asmScaleTitle,
0,
/* 36 */
&Logic::asmPanRightToHugh,
&Logic::asmMakeWhiteFlash,
&Logic::asmPanRightToJoeAndRita,
&Logic::asmPanLeftToBomb // cdint.cut
};
if (sm >= ARRAYSIZE(asmTable) || asmTable[sm] == 0)
return false;
(this->*asmTable[sm])();
return true;
}
} // End of namespace Queen

View File

@ -60,7 +60,7 @@ class Logic {
public:
Logic(QueenEngine *vm);
~Logic();
virtual ~Logic();
uint16 currentRoom() const { return _currentRoom; }
void currentRoom(uint16 room) {
@ -241,18 +241,6 @@ public:
bool subtitles() const { return _subtitles; }
void subtitles(bool enable) { _subtitles = enable; }
void registerDefaultSettings();
void checkOptionSettings();
void readOptionSettings();
void writeOptionSettings();
bool preChangeRoom_Demo();
bool preChangeRoom_Interview();
bool preChangeRoom_Game();
bool executeSpecialMove_Demo(uint16 sm);
bool executeSpecialMove_Interview(uint16 sm);
bool executeSpecialMove_Game(uint16 sm);
void executeSpecialMove(uint16 sm);
void asmMakeJoeUseDress();
@ -299,9 +287,6 @@ public:
void startCredits(const char *filename);
void stopCredits();
typedef bool (Logic::*ExecuteSpecialMoveProc)(uint16);
typedef bool (Logic::*PreChangeRoomProc)();
enum {
MAX_ZONES_NUMBER = 32,
MAX_AREAS_NUMBER = 11,
@ -315,6 +300,10 @@ protected:
void initialise();
virtual bool preChangeRoom() = 0;
virtual bool handleSpecialMove(uint16 sm) = 0;
LineReader *_queen2jas;
uint16 _currentRoom;
@ -438,13 +427,34 @@ protected:
bool _subtitles;
ExecuteSpecialMoveProc _executeSpecialMove;
PreChangeRoomProc _preChangeRoom;
QueenEngine *_vm;
Credits *_credits;
};
class LogicDemo : public Logic {
public:
LogicDemo(QueenEngine *vm) : Logic(vm) {}
protected:
bool preChangeRoom();
bool handleSpecialMove(uint16 sm);
};
class LogicInterview : public Logic {
public:
LogicInterview(QueenEngine *vm) : Logic(vm) {}
protected:
bool preChangeRoom();
bool handleSpecialMove(uint16 sm);
};
class LogicGame : public Logic {
public:
LogicGame(QueenEngine *vm) : Logic(vm) {}
protected:
bool preChangeRoom();
bool handleSpecialMove(uint16 sm);
};
} // End of namespace Queen

View File

@ -98,6 +98,7 @@ QueenEngine::QueenEngine(GameDetector *detector, OSystem *syst)
_system->init_size(GAME_SCREEN_WIDTH, GAME_SCREEN_HEIGHT);
}
QueenEngine::~QueenEngine() {
_timer->removeTimerProc(&timerHandler);
delete _bam;
@ -114,6 +115,61 @@ QueenEngine::~QueenEngine() {
delete _walk;
}
void QueenEngine::registerDefaultSettings() {
ConfMan.registerDefault("master_volume", 255);
ConfMan.registerDefault("music_mute", false);
ConfMan.registerDefault("sfx_mute", false);
ConfMan.registerDefault("talkspeed", Logic::DEFAULT_TALK_SPEED);
ConfMan.registerDefault("speech_mute", _resource->isFloppy());
ConfMan.registerDefault("subtitles", true);
}
void QueenEngine::checkOptionSettings() {
// check talkspeed value
if (_logic->talkSpeed() < 4) {
_logic->talkSpeed(4);
} else if (_logic->talkSpeed() > 95) {
_logic->talkSpeed(100);
}
// XXX check master_volume value
// only CD-ROM version has speech
if (_resource->isFloppy() && _sound->speechOn()) {
_sound->speechToggle(false);
}
// ensure text is always on when voice is off
if (!_sound->speechOn()) {
_logic->subtitles(true);
}
}
void QueenEngine::readOptionSettings() {
// XXX master_volume
_sound->musicToggle(!ConfMan.getBool("music_mute"));
_sound->sfxToggle(!ConfMan.getBool("sfx_mute"));
_logic->talkSpeed(ConfMan.getInt("talkspeed"));
_sound->speechToggle(!ConfMan.getBool("speech_mute"));
_logic->subtitles(ConfMan.getBool("subtitles"));
checkOptionSettings();
}
void QueenEngine::writeOptionSettings() {
// XXX master_volume
ConfMan.set("music_mute", !_sound->musicOn());
ConfMan.set("sfx_mute", !_sound->sfxOn());
ConfMan.set("talkspeed", _logic->talkSpeed());
ConfMan.set("speech_mute", !_sound->speechOn());
ConfMan.set("subtitles", _logic->subtitles());
ConfMan.flushToDisk();
}
void QueenEngine::errorString(const char *buf1, char *buf2) {
strcpy(buf2, buf1);
if (_debugger && !_debugger->isAttached()) {
@ -126,8 +182,8 @@ void QueenEngine::errorString(const char *buf1, char *buf2) {
void QueenEngine::go() {
initialise();
_logic->registerDefaultSettings();
_logic->readOptionSettings();
registerDefaultSettings();
readOptionSettings();
_logic->oldRoom(0);
_logic->newRoom(_logic->currentRoom());
@ -159,6 +215,7 @@ void QueenEngine::go() {
}
}
void QueenEngine::initialise(void) {
_bam = new BamScene(this);
_resource = new Resource(_gameDataPath, _system->get_savefile_manager(), getSavePath());
@ -168,7 +225,14 @@ void QueenEngine::initialise(void) {
_display = new Display(this, _system);
_graphics = new Graphics(this);
_input = new Input(_resource->getLanguage(), _system);
_logic = new Logic(this);
if (_resource->isDemo()) {
_logic = new LogicDemo(this);
} else if (_resource->isInterview()) {
_logic = new LogicInterview(this);
} else {
_logic = new LogicGame(this);
}
MidiDriver *driver = GameDetector::createMidi(GameDetector::detectMusicDriver(MDT_NATIVE | MDT_ADLIB | MDT_PREFER_NATIVE));
if (!driver)

View File

@ -62,6 +62,11 @@ public:
Common::RandomSource randomizer;
void registerDefaultSettings();
void checkOptionSettings();
void readOptionSettings();
void writeOptionSettings();
protected:
void errorString(const char *buf_input, char *buf_output);
@ -70,6 +75,7 @@ protected:
void initialise();
static void timerHandler(void *ptr);
void gotTimerTick();