Added support for ScummVM boot parameter values as well invoking the built-in debugger

svn-id: r23413
This commit is contained in:
Paul Gilbert 2006-07-08 08:39:42 +00:00
parent 64d0e4dcd8
commit 6b5150797a
3 changed files with 179 additions and 83 deletions

View File

@ -24,12 +24,12 @@
#include "lure/strings.h"
#include "lure/room.h"
#include "lure/system.h"
#include "lure/debug-input.h"
#include "lure/debug-methods.h"
#include "lure/scripts.h"
#include "lure/res_struct.h"
#include "lure/animseq.h"
#include "common/config-manager.h"
namespace Lure {
static Game *int_game = NULL;
@ -40,16 +40,22 @@ Game &Game::getReference() {
Game::Game() {
int_game = this;
_debugger = new Debugger();
_slowSpeedFlag = true;
_soundFlag = true;
}
Game::~Game() {
delete _debugger;
}
void Game::nextFrame() {
Resources &res = Resources::getReference();
ValueTableData &fields = res.fieldList();
Room &room = Room::getReference();
HotspotList::iterator i;
res.pausedList().countdown();
room.checkCursor();
room.update();
@ -79,12 +85,11 @@ void Game::nextFrame() {
void Game::execute() {
OSystem &system = System::getReference();
Room &r = Room::getReference();
Room &room = Room::getReference();
Resources &res = Resources::getReference();
Events &events = Events::getReference();
Mouse &mouse = Mouse::getReference();
Screen &screen = Screen::getReference();
//Menu &menu = Menu::getReference();
ValueTableData &fields = res.fieldList();
uint32 timerVal = system.getMillis();
@ -97,13 +102,13 @@ void Game::execute() {
Script::execute(STARTUP_SCRIPT);
// Load the first room
r.setRoomNumber(1);
int bootParam = ConfMan.getInt("boot_param");
handleBootParam(bootParam);
// Set the player direction
res.getActiveHotspot(PLAYER_ID)->setDirection(UP);
r.update();
room.update();
mouse.setCursorNum(CURSOR_ARROW);
mouse.cursorOn();
@ -112,48 +117,52 @@ void Game::execute() {
// If time for next frame, allow everything to update
if (system.getMillis() > timerVal + GAME_FRAME_DELAY) {
timerVal = system.getMillis();
nextFrame();
nextFrame();
}
res.delayList().tick();
while (events.pollEvent()) {
if (events.type() == OSystem::EVENT_KEYDOWN) {
uint16 roomNum = r.roomNumber();
uint16 roomNum = room.roomNumber();
#ifdef LURE_DEBUG
if (events.event().kbd.keycode == 282) {
doDebugMenu();
continue;
if ((events.event().kbd.flags == OSystem::KBD_CTRL) &&
(events.event().kbd.keycode == 'd')) {
// Activate the debugger
_debugger->attach();
break;
}
#endif
switch (events.event().kbd.ascii) {
case 27:
events.quitFlag = true;
break;
#ifdef LURE_DEBUG
case '+':
while (++roomNum <= 51)
if (res.getRoom(roomNum) != NULL) break;
if (roomNum == 52) roomNum = 1;
r.leaveRoom();
r.setRoomNumber(roomNum);
room.leaveRoom();
room.setRoomNumber(roomNum);
break;
case '-':
if (roomNum == 1) roomNum = 55;
while (res.getRoom(--roomNum) == NULL) ;
r.leaveRoom();
r.setRoomNumber(roomNum);
room.leaveRoom();
room.setRoomNumber(roomNum);
break;
case '*':
res.getActiveHotspot(PLAYER_ID)->setRoomNumber(
r.roomNumber());
room.roomNumber());
break;
#endif
case 267: // keypad '/'
room.setShowInfo(!room.showInfo());
break;
default:
break;
}
@ -168,8 +177,9 @@ void Game::execute() {
destRoom = fields.getField(NEW_ROOM_NUMBER);
if (destRoom != 0) {
// Need to change the current room
strcpy(room.statusLine(), "");
bool remoteFlag = fields.getField(OLD_ROOM_NUMBER) != 0;
r.setRoomNumber(destRoom, remoteFlag);
room.setRoomNumber(destRoom, remoteFlag);
fields.setField(NEW_ROOM_NUMBER, 0);
}
@ -180,6 +190,9 @@ void Game::execute() {
system.updateScreen();
system.delayMillis(10);
if (_debugger->isAttached())
_debugger->onFrame();
}
// If Skorl catches player, show the catching animation
@ -199,53 +212,9 @@ void Game::execute() {
}
}
r.leaveRoom();
room.leaveRoom();
}
#ifdef LURE_DEBUG
#define NUM_DEBUG_ITEMS 4
const char *debugItems[NUM_DEBUG_ITEMS] =
{"Toggle Info", "Set Room", "Show Active HS", "Show Room HS"};
void Game::doDebugMenu() {
uint16 index = PopupMenu::Show(NUM_DEBUG_ITEMS, debugItems);
Room &r = Room::getReference();
Resources &res = Resources::getReference();
switch (index) {
case 0:
// Toggle co-ordinates
r.setShowInfo(!r.showInfo());
break;
case 1:
// Set room number:
uint32 roomNumber;
if (!input_integer("Enter room number:", roomNumber)) return;
if (res.getRoom(roomNumber))
r.setRoomNumber(roomNumber);
else
Dialog::show("The room does not exist");
break;
case 2:
// Show active hotspots
showActiveHotspots();
break;
case 3:
// Show hotspots in room
showRoomHotspots();
break;
default:
break;
}
}
#endif
void Game::handleMenuResponse(uint8 selection) {
switch (selection) {
case MENUITEM_CREDITS:
@ -274,9 +243,12 @@ void Game::playerChangeRoom() {
Resources &res = Resources::getReference();
Room &room = Room::getReference();
ValueTableData &fields = res.fieldList();
SequenceDelayList &delayList = Resources::getReference().delayList();
uint16 roomNum = fields.playerNewPos().roomNumber;
fields.playerNewPos().roomNumber = 0;
Point &newPos = fields.playerNewPos().position;
delayList.clear();
Hotspot *player = res.getActiveHotspot(PLAYER_ID);
player->currentActions().clear();
@ -325,12 +297,17 @@ void Game::handleClick() {
void Game::handleRightClickMenu() {
Room &room = Room::getReference();
Resources &res = Resources::getReference();
Screen &screen = Screen::getReference();
ValueTableData &fields = res.fieldList();
StringData &strings = StringData::getReference();
Mouse &mouse = Mouse::getReference();
char *statusLine = room.statusLine();
Hotspot *player = res.getActiveHotspot(PLAYER_ID);
HotspotData *hotspot;
HotspotData *hotspot, *useHotspot;
Action action;
uint32 actions;
uint16 itemId = 0xffff;
bool hasItems;
if (room.hotspotId() != 0) {
// Get hotspot actions
@ -353,8 +330,18 @@ void Game::handleRightClickMenu() {
bool breakFlag = false;
while (!breakFlag) {
statusLine = room.statusLine();
strcpy(statusLine, "");
room.update();
screen.update();
action = PopupMenu::Show(actions);
if (action != NONE) {
sprintf(statusLine, "%s ", actionList[action]);
statusLine += strlen(statusLine);
}
switch (action) {
case LOOK:
case STATUS:
@ -365,12 +352,42 @@ void Game::handleRightClickMenu() {
case USE:
case EXAMINE:
case DRINK:
if (action != DRINK)
hotspot = res.getHotspot(room.hotspotId());
itemId = PopupMenu::ShowInventory();
breakFlag = (itemId != 0xffff);
if (breakFlag)
fields.setField(USE_HOTSPOT_ID, itemId);
if (action == ASK) {
strings.getString(hotspot->nameId, statusLine);
strcat(statusLine, " for ");
}
hasItems = (res.numInventoryItems() != 0);
if (!hasItems)
strcat(statusLine, "(nothing)");
statusLine += strlen(statusLine);
room.update();
screen.update();
mouse.waitForRelease();
if (hasItems) {
if (action != DRINK)
hotspot = res.getHotspot(room.hotspotId());
itemId = PopupMenu::ShowInventory();
breakFlag = (itemId != 0xffff);
if (breakFlag) {
fields.setField(USE_HOTSPOT_ID, itemId);
if ((action == GIVE) || (action == USE)) {
// Add in the "X to " or "X on " section of give/use action
useHotspot = res.getHotspot(itemId);
assert(useHotspot);
strings.getString(useHotspot->nameId, statusLine);
if (action == GIVE)
strcat(statusLine, " to ");
else
strcat(statusLine, " on ");
statusLine += strlen(statusLine);
}
else if ((action == DRINK) || (action == EXAMINE))
hotspot = res.getHotspot(itemId);
}
}
break;
default:
@ -382,7 +399,17 @@ void Game::handleRightClickMenu() {
if (action != NONE) {
player->stopWalking();
doAction(action, (hotspot != NULL) ? hotspot->hotspotId : 0, itemId);
if (hotspot == NULL) {
doAction(action, 0, itemId);
} else {
// Add the hotspot name to the status line and then go do the action
strings.getString(hotspot->nameId, statusLine);
doAction(action, hotspot->hotspotId, itemId);
}
} else {
// Clear the status line
strcpy(room.statusLine(), "");
}
}
@ -390,15 +417,21 @@ void Game::handleLeftClick() {
Room &room = Room::getReference();
Mouse &mouse = Mouse::getReference();
Resources &res = Resources::getReference();
StringData &strings = StringData::getReference();
Hotspot *player = res.getActiveHotspot(PLAYER_ID);
room.setCursorState(CS_NONE);
player->stopWalking();
player->setDestHotspot(0);
player->setActionCtr(0);
strcpy(room.statusLine(), "");
if ((room.destRoomNumber() == 0) && (room.hotspotId() != 0)) {
// Handle look at hotspot
sprintf(room.statusLine(), "%s ", actionList[LOOK_AT]);
HotspotData *hotspot = res.getHotspot(room.hotspotId());
assert(hotspot);
strings.getString(hotspot->nameId, room.statusLine() + strlen(room.statusLine()));
doAction(LOOK_AT, room.hotspotId(), 0xffff);
} else if (room.destRoomNumber() != 0) {
@ -497,4 +530,53 @@ void Game::doSound() {
memcpy(pDest, pSrc, 3);
}
void Game::handleBootParam(int value) {
Resources &res = Resources::getReference();
ValueTableData &fields = res.fieldList();
Room &room = Room::getReference();
Hotspot *h;
switch (value) {
case 0:
// No parameter - load the first room
room.setRoomNumber(1);
break;
case 1:
// Set player to be in rack room with a few items
// Setup Skorl in cell room
h = res.getActiveHotspot(SKORL_ID);
h->setRoomNumber(1);
h->setPosition(140, 120);
h->currentActions().top().setSupportData(0x1400);
fields.setField(11, 1);
// Set up player
h = res.getActiveHotspot(PLAYER_ID);
h->setRoomNumber(4);
h->setPosition(150, 110);
res.getHotspot(0x2710)->roomNumber = PLAYER_ID; // Bottle
res.getHotspot(0x2713)->roomNumber = PLAYER_ID; // Knife
room.setRoomNumber(4);
break;
case 2:
// Set the player up in the outer cell with a full bottle & knife
h = res.getActiveHotspot(PLAYER_ID);
h->setRoomNumber(2);
h->setPosition(100, 110);
res.getHotspot(0x2710)->roomNumber = PLAYER_ID; // Bottle
fields.setField(BOTTLE_FILLED, 1);
res.getHotspot(0x2713)->roomNumber = PLAYER_ID; // Knife
room.setRoomNumber(2);
break;
default:
room.setRoomNumber(value);
break;
}
}
} // end of namespace Lure

View File

@ -32,6 +32,7 @@
#include "lure/memory.h"
#include "lure/screen.h"
#include "lure/events.h"
#include "lure/debugger.h"
namespace Lure {
@ -39,6 +40,7 @@ enum GameState {GS_RESTORE_RESTART = 1, GS_CAUGHT = 2};
class Game {
private:
Debugger *_debugger;
bool _slowSpeedFlag, _soundFlag;
uint8 _state;
@ -49,8 +51,11 @@ private:
void doAction(Action action, uint16 hotspotId, uint16 usedId);
void playerChangeRoom();
void handleBootParam(int value);
public:
Game();
virtual ~Game();
static Game &getReference();
void nextFrame();

View File

@ -164,6 +164,10 @@ REGISTER_PLUGIN(LURE, "Lure of the Temptress Engine");
namespace Lure {
LureEngine::LureEngine(OSystem *system): Engine(system) {
Common::addSpecialDebugLevel(kLureDebugScripts, "scripts", "Scripts debugging");
Common::addSpecialDebugLevel(kLureDebugAnimations, "animations", "Animations debugging");
Common::addSpecialDebugLevel(kLureDebugHotspots, "hotspots", "Hotspots debugging");
// Setup mixer
/*
if (!_mixer->isReady()) {
@ -174,13 +178,14 @@ LureEngine::LureEngine(OSystem *system): Engine(system) {
_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
_mixer->setVolumeForSoundType(Audio::Mixer::kSpeechSoundType, ConfMan.getInt("speech_volume"));
*/
_features = 0;
_game = 0;
}
void LureEngine::detectGame() {
// Make sure all the needed files are present
if (!Common::File::exists(SUPPORT_FILENAME))
error("Missing %s - this is a custom file containing resources from the\n"
"Lure of the Temptress executable. See the documentation for creating it.",
@ -214,7 +219,7 @@ void LureEngine::detectGame() {
}
// Do an md5 check
uint8 md5sum[16];
char md5str[32 + 1];
const GameSettings *g;
@ -259,7 +264,6 @@ int LureEngine::init() {
_system->endGFXTransaction();
detectGame();
_sys = new System(_system);
_disk = new Disk();
_resources = new Resources();
@ -270,11 +274,14 @@ int LureEngine::init() {
_menu = new Menu();
Surface::initialise();
_room = new Room();
return 0;
}
LureEngine::~LureEngine() {
// Remove all of our debug levels here
Common::clearAllSpecialDebugLevels();
// Delete and deinitialise subsystems
Surface::deinitialise();
delete _room;
delete _menu;
@ -288,10 +295,12 @@ LureEngine::~LureEngine() {
}
int LureEngine::go() {
// Show the introduction
Introduction *intro = new Introduction(*_screen, *_system);
intro->show();
delete intro;
if (ConfMan.getInt("boot_param") == 0) {
// Show the introduction
Introduction *intro = new Introduction(*_screen, *_system);
intro->show();
delete intro;
}
// Play the game
if (!_events->quitFlag) {