aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
Diffstat (limited to 'engines')
-rw-r--r--engines/lure/game.cpp147
-rw-r--r--engines/lure/game.h4
2 files changed, 90 insertions, 61 deletions
diff --git a/engines/lure/game.cpp b/engines/lure/game.cpp
index 1bf7d9dbe4..8f5eaeb449 100644
--- a/engines/lure/game.cpp
+++ b/engines/lure/game.cpp
@@ -28,6 +28,7 @@
#include "lure/debug-methods.h"
#include "lure/scripts.h"
#include "lure/res_struct.h"
+#include "lure/animseq.h"
namespace Lure {
@@ -45,12 +46,13 @@ Game::Game() {
void Game::nextFrame() {
Resources &res = Resources::getReference();
+ ValueTableData &fields = res.fieldList();
Room &room = Room::getReference();
HotspotList::iterator i;
room.checkCursor();
room.update();
-
+
// Call the tick method for each hotspot - this is somewaht complicated
// by the fact that a tick proc can unload both itself and/or others,
// so we first get a list of the Ids, and call the tick proc for each
@@ -65,8 +67,10 @@ void Game::nextFrame() {
for (int idCtr = 0; idCtr < idSize; ++idCtr) {
Hotspot *hotspot = res.getActiveHotspot(idList[idCtr]);
- if (hotspot)
+ if (hotspot) {
+ fields.setField(CHARACTER_HOTSPOT_ID, hotspot->hotspotId());
hotspot->tick();
+ }
}
delete[] idList;
@@ -102,78 +106,95 @@ void Game::execute() {
mouse.cursorOn();
while (!events.quitFlag) {
- // If time for next frame, allow everything to update
- if (system.getMillis() > timerVal + GAME_FRAME_DELAY) {
- timerVal = system.getMillis();
- nextFrame();
- }
- res.delayList().tick();
+ while (!events.quitFlag && (_state == 0)) {
+ // If time for next frame, allow everything to update
+ if (system.getMillis() > timerVal + GAME_FRAME_DELAY) {
+ timerVal = system.getMillis();
+ nextFrame();
+ }
+ res.delayList().tick();
- while (events.pollEvent()) {
- if (events.type() == OSystem::EVENT_KEYDOWN) {
- uint16 roomNum = r.roomNumber();
+ while (events.pollEvent()) {
+ if (events.type() == OSystem::EVENT_KEYDOWN) {
+ uint16 roomNum = r.roomNumber();
#ifdef LURE_DEBUG
- if (events.event().kbd.keycode == 282) {
- doDebugMenu();
- continue;
- }
+ if (events.event().kbd.keycode == 282) {
+ doDebugMenu();
+ continue;
+ }
#endif
-
- switch (events.event().kbd.ascii) {
- case 27:
- events.quitFlag = true;
- break;
+ 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);
- break;
-
- case '-':
- if (roomNum == 1) roomNum = 55;
- while (res.getRoom(--roomNum) == NULL) ;
-
- r.leaveRoom();
- r.setRoomNumber(roomNum);
- break;
-
- case '*':
- res.getActiveHotspot(PLAYER_ID)->setRoomNumber(
- r.roomNumber());
- break;
+ case '+':
+ while (++roomNum <= 51)
+ if (res.getRoom(roomNum) != NULL) break;
+ if (roomNum == 52) roomNum = 1;
+
+ r.leaveRoom();
+ r.setRoomNumber(roomNum);
+ break;
+
+ case '-':
+ if (roomNum == 1) roomNum = 55;
+ while (res.getRoom(--roomNum) == NULL) ;
+
+ r.leaveRoom();
+ r.setRoomNumber(roomNum);
+ break;
+
+ case '*':
+ res.getActiveHotspot(PLAYER_ID)->setRoomNumber(
+ r.roomNumber());
+ break;
#endif
- default:
- break;
+ default:
+ break;
+ }
}
+
+ if ((events.type() == OSystem::EVENT_LBUTTONDOWN) ||
+ (events.type() == OSystem::EVENT_RBUTTONDOWN))
+ handleClick();
}
- if ((events.type() == OSystem::EVENT_LBUTTONDOWN) ||
- (events.type() == OSystem::EVENT_RBUTTONDOWN))
- handleClick();
- }
+ uint16 destRoom;
+ destRoom = fields.getField(NEW_ROOM_NUMBER);
+ if (destRoom != 0) {
+ // Need to change the current room
+ bool remoteFlag = fields.getField(OLD_ROOM_NUMBER) != 0;
+ r.setRoomNumber(destRoom, remoteFlag);
+ fields.setField(NEW_ROOM_NUMBER, 0);
+ }
- uint16 destRoom;
- destRoom = fields.getField(NEW_ROOM_NUMBER);
- if (destRoom != 0) {
- // Need to change the current room
- bool remoteFlag = fields.getField(OLD_ROOM_NUMBER) != 0;
- r.setRoomNumber(destRoom, remoteFlag);
- fields.setField(NEW_ROOM_NUMBER, 0);
+ destRoom = fields.playerNewPos().roomNumber;
+ if (destRoom != 0) {
+ playerChangeRoom();
+ }
+
+ system.updateScreen();
+ system.delayMillis(10);
}
- destRoom = fields.playerNewPos().roomNumber;
- if (destRoom != 0) {
- playerChangeRoom();
+ // If Skorl catches player, show the catching animation
+ if ((_state & GS_CAUGHT) != 0) {
+ Palette palette(SKORL_CATCH_PALETTE_ID);
+ AnimationSequence *anim = new AnimationSequence(screen, system,
+ SKORL_CATCH_ANIM_ID, palette, false);
+ mouse.cursorOff();
+ anim->show();
+ mouse.cursorOn();
}
- system.updateScreen();
- system.delayMillis(10);
+ // If the Restart/Restore dialog is needed, show it
+ if ((_state & GS_RESTORE_RESTART) != 0) {
+ // TODO: Restore/Restart dialog - for now, simply flag for exit
+ events.quitFlag = true;
+ }
}
r.leaveRoom();
@@ -399,11 +420,15 @@ void Game::doAction(Action action, uint16 hotspotId, uint16 usedId) {
fields.setField(CHARACTER_HOTSPOT_ID, PLAYER_ID);
fields.setField(ACTIVE_HOTSPOT_ID, hotspotId);
- fields.setField(USE_HOTSPOT_ID, usedId);
+// fields.setField(USE_HOTSPOT_ID, usedId);
res.setCurrentAction(action);
room.setCursorState(CS_ACTION);
- player->setCurrentAction(DISPATCH_ACTION, action, hotspotId, usedId);
+
+ // Set the action
+ CharacterScheduleEntry *rec = res.playerSupportRecord();
+ rec->setDetails(action, hotspotId, usedId);
+ player->currentActions().addFront(DISPATCH_ACTION, rec, player->roomNumber());
}
void Game::doShowCredits() {
diff --git a/engines/lure/game.h b/engines/lure/game.h
index 658ad07f15..ece7a49e14 100644
--- a/engines/lure/game.h
+++ b/engines/lure/game.h
@@ -35,9 +35,12 @@
namespace Lure {
+enum GameState {GS_RESTORE_RESTART = 1, GS_CAUGHT = 2};
+
class Game {
private:
bool _slowSpeedFlag, _soundFlag;
+ uint8 _state;
void handleMenuResponse(uint8 selection);
void handleClick();
@@ -52,6 +55,7 @@ public:
void nextFrame();
void execute();
+ void setState(uint8 flags) { _state = flags; }
// Menu item support methods
void doDebugMenu();