aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorPaul Gilbert2007-04-14 03:48:24 +0000
committerPaul Gilbert2007-04-14 03:48:24 +0000
commit68225f78967b4328a7c52e3a25bd53320dea4ece (patch)
tree1b7cff4056a9df69101817f188a958f9bf5d4fa5 /engines
parent8be61535336cd123c96c333bf3b9bc0ef6fea47b (diff)
downloadscummvm-rg350-68225f78967b4328a7c52e3a25bd53320dea4ece.tar.gz
scummvm-rg350-68225f78967b4328a7c52e3a25bd53320dea4ece.tar.bz2
scummvm-rg350-68225f78967b4328a7c52e3a25bd53320dea4ece.zip
Implemented handling for barmen (rooms 29, 32, and 35)
svn-id: r26464
Diffstat (limited to 'engines')
-rw-r--r--engines/lure/hotspots.cpp295
-rw-r--r--engines/lure/hotspots.h16
-rw-r--r--engines/lure/luredefs.h8
-rw-r--r--engines/lure/res.cpp3
-rw-r--r--engines/lure/res.h2
-rw-r--r--engines/lure/res_struct.cpp71
-rw-r--r--engines/lure/res_struct.h27
-rw-r--r--engines/lure/room.h1
8 files changed, 412 insertions, 11 deletions
diff --git a/engines/lure/hotspots.cpp b/engines/lure/hotspots.cpp
index ab7e8d0b78..9fa72cbbee 100644
--- a/engines/lure/hotspots.cpp
+++ b/engines/lure/hotspots.cpp
@@ -80,6 +80,7 @@ Hotspot::Hotspot(HotspotData *res): _pathFinder(this) {
_exitCtr = 0;
_walkFlag = true;
_startRoomNumber = 0;
+ _supportValue = 0;
if (_data->npcSchedule != 0) {
CharacterScheduleEntry *entry = resources.charSchedules().getEntry(_data->npcSchedule);
@@ -799,10 +800,10 @@ HotspotPrecheckResult Hotspot::actionPrecheck(HotspotData *hotspot) {
Resources &res = Resources::getReference();
ValueTableData &fields = res.fieldList();
- if ((hotspot->hotspotId == 0x420) || (hotspot->hotspotId == 0x436) ||
- (hotspot->hotspotId == 0x429)) {
- // TODO: figure out specific handling code - sub_213
- if (0)
+ if ((hotspot->hotspotId == SID_ID) || (hotspot->hotspotId == EWAN_ID) ||
+ (hotspot->hotspotId == NELLIE_ID)) {
+ // Check for a bar place
+ if (getBarPlace() == BP_KEEP_TRYING)
return PC_INITIAL;
} else if (hotspot->roomNumber != roomNumber()) {
// loc_884
@@ -864,6 +865,79 @@ HotspotPrecheckResult Hotspot::actionPrecheck(HotspotData *hotspot) {
return PC_EXECUTE;
}
+BarPlaceResult Hotspot::getBarPlace() {
+ Resources &res = Resources::getReference();
+ BarEntry &barEntry = res.barmanLists().getDetails(roomNumber());
+
+ if (actionCtr() != 0) {
+ // Already at bar
+ // Find the character's slot in the bar entry list
+ for (int index = 0; index < NUM_SERVE_CUSTOMERS; ++index) {
+ if (barEntry.customers[index].hotspotId == hotspotId())
+ return ((barEntry.customers[index].serveFlags & 0x80) == 0) ? BP_GOT_THERE : BP_KEEP_TRYING;
+ }
+
+ setActionCtr(0);
+ return BP_KEEP_TRYING;
+ }
+
+ // Try and find a bar place
+ if (!findClearBarPlace())
+ return BP_KEEP_TRYING;
+
+ // First scan for any existing entry for the character
+ int index = -1;
+ while (++index < NUM_SERVE_CUSTOMERS) {
+ if (barEntry.customers[index].hotspotId == hotspotId())
+ break;
+ }
+ if (index == NUM_SERVE_CUSTOMERS) {
+ // Not already present - so scan for an empty slot
+ index = -1;
+ while (++index < NUM_SERVE_CUSTOMERS) {
+ if (barEntry.customers[index].hotspotId == 0)
+ break;
+ }
+
+ if (index == NUM_SERVE_CUSTOMERS)
+ // No slots available, so flag to keep trying
+ return BP_KEEP_TRYING;
+ }
+
+ // Set up the slot entry for the character
+ barEntry.customers[index].hotspotId = hotspotId();
+ barEntry.customers[index].serveFlags = 0x82;
+ setActionCtr(1);
+ updateMovement();
+ setDirection(UP);
+
+ return BP_KEEP_TRYING;
+}
+
+bool Hotspot::findClearBarPlace() {
+ // Check if character has reached the bar
+ Resources &res = Resources::getReference();
+ BarEntry &barEntry = res.barmanLists().getDetails(roomNumber());
+ if ((y() + heightCopy()) < ((barEntry.gridLine << 3) + 24))
+ return true;
+
+ RoomPathsData &paths = res.getRoom(roomNumber())->paths;
+
+ // Scan backwards from the right side for 4 free blocks along the bar line block
+ int numFree = 0;
+ for (int x = ROOM_PATHS_WIDTH - 1; x >= 0; --x) {
+ if (paths.isOccupied(x, barEntry.gridLine))
+ numFree = 0;
+ else if (++numFree == 4) {
+ // Start character walking to the found position
+ walkTo(x * 8, (barEntry.gridLine << 3) + 8);
+ return false;
+ }
+ }
+
+ return false;
+}
+
bool Hotspot::characterWalkingCheck(HotspotData *hotspot) {
int16 xp, yp;
@@ -1944,6 +2018,7 @@ void Hotspot::saveToStream(Common::WriteStream *stream) {
stream->writeUint16LE(_exitCtr);
stream->writeByte(_walkFlag);
stream->writeUint16LE(_startRoomNumber);
+ stream->writeUint16LE(_supportValue);
}
void Hotspot::loadFromStream(Common::ReadStream *stream) {
@@ -1979,6 +2054,7 @@ void Hotspot::loadFromStream(Common::ReadStream *stream) {
_exitCtr = stream->readUint16LE();
_walkFlag = stream->readByte() != 0;
_startRoomNumber = stream->readUint16LE();
+ _supportValue = stream->readUint16LE();
}
/*------------------------------------------------------------------------*/
@@ -2020,7 +2096,7 @@ HandlerMethodPtr HotspotTickHandlers::getHandler(uint16 procOffset) {
case 0x8241:
return headAnimHandler;
case 0x82A0:
- return sellerAnimHandler;
+ return barmanAnimHandler;
case 0x85ce:
return skorlGaurdAnimHandler;
case 0x882A:
@@ -2806,6 +2882,7 @@ void HotspotTickHandlers::playerSewerExitAnimHandler(Hotspot &h) {
// Setup Ratpouch
Hotspot *ratpouchHotspot = res.getActiveHotspot(RATPOUCH_ID);
+ assert(ratpouchHotspot);
ratpouchHotspot->setCharacterMode(CHARMODE_NONE);
ratpouchHotspot->setDelayCtr(0);
ratpouchHotspot->setActions(0x821C00);
@@ -3106,14 +3183,214 @@ void HotspotTickHandlers::headAnimHandler(Hotspot &h) {
h.setFrameNumber(frameNumber);
}
-void HotspotTickHandlers::sellerAnimHandler(Hotspot &h) {
+void HotspotTickHandlers::barmanAnimHandler(Hotspot &h) {
+ Resources &res = Resources::getReference();
+ Room &room = Room::getReference();
+ BarEntry &barEntry = res.barmanLists().getDetails(h.roomNumber());
+ Common::RandomSource rnd;
+ static bool ewanXOffset = false;
+
h.handleTalkDialog();
- if (h.frameCtr() > 0) {
- h.decrFrameCtr();
+ if (h.delayCtr() > 0) {
+ h.setDelayCtr(h.delayCtr() - 1);
return;
}
- // TODO: Decode remainder of sellers tick proc
+ if (h.frameCtr() == 0) {
+ // Barman not currently doing something
+ if (barEntry.currentCustomer != NULL) {
+ // A customer has been set to be served
+ Hotspot *servee = res.getActiveHotspot(barEntry.currentCustomer->hotspotId);
+ if (servee != NULL) {
+ // Check whether the character is still at the bar
+ if ((servee->y() + servee->heightCopy()) >= ((barEntry.gridLine << 3) + 24)) {
+ // Customer has left - nullify their entry
+ barEntry.currentCustomer->hotspotId = 0;
+ barEntry.currentCustomer->serveFlags = 0;
+ barEntry.currentCustomer = NULL;
+ }
+ else if (servee->hotspotId() != PLAYER_ID) {
+ // Any other NPC character, so serve them
+ barEntry.currentCustomer->serveFlags = 0;
+ } else {
+ // Servee is the player, flag to stop the barman until the player walks away
+ barEntry.currentCustomer->serveFlags &= 0x7f;
+
+ if ((barEntry.currentCustomer->serveFlags & 7) != 0) {
+ // Barman needs to do something
+ h.setFrameCtr(barEntry.currentCustomer->serveFlags);
+ barEntry.currentCustomer->serveFlags &= 0xf8;
+
+ } else if (!h.useHotspotId() == 0) {
+ // Player is not currently talking
+ // Clear entry from list
+ barEntry.currentCustomer->hotspotId = 0;
+ barEntry.currentCustomer->serveFlags = 0;
+ barEntry.currentCustomer = NULL;
+ // Set the barman to polish the bar
+ h.setFrameCtr(2);
+ }
+ }
+
+ return;
+ }
+ }
+
+ // Check for any customer waiting to be served
+ for (int index = 0; index < NUM_SERVE_CUSTOMERS; ++index) {
+ if ((barEntry.customers[index].serveFlags & 0x80) != 0) {
+ // Found one to serve
+ barEntry.customers[index].serveFlags = 0;
+ barEntry.currentCustomer = &barEntry.customers[index];
+ Hotspot *hotspot = res.getActiveHotspot(barEntry.customers[index].hotspotId);
+ assert(hotspot);
+//DEBUG/TODO: Reaching here too early, so servee's x can be outside the bar range
+ h.setSupportValue(hotspot->x()); // Save the position to move to
+ h.setFrameCtr(0x80); // Flag for movement
+ return;
+ }
+ }
+
+ // At this point, no customers need servering. Empty the table
+ barEntry.currentCustomer = NULL;
+ for (int index = 0; index < NUM_SERVE_CUSTOMERS; ++index) {
+ barEntry.customers[index].hotspotId = 0;
+ barEntry.customers[index].serveFlags = 0;
+ }
+
+ // Choose a random action for the barman to do - walk around, polish the bar, or wait
+ h.setFrameCtr(rnd.getRandomNumber(2) + 1);
+ }
+
+ // At this point the barman is known to be doing something
+
+ if ((h.frameCtr() & 0x80) != 0) {
+ // Bit 7 being set indicates the barman is moving to a destination
+ int16 xDiff = h.x() - h.supportValue();
+ if (ABS(xDiff) >= 2) {
+ // Keep the barman moving
+ if (xDiff > 0) {
+ // Moving left
+ h.setPosition(h.x() - 2, h.y());
+ h.setActionCtr(h.actionCtr() + 1);
+ if ((h.actionCtr() >= 12) || (h.actionCtr() < 6))
+ h.setActionCtr(6);
+ } else {
+ // Moving right
+ h.setPosition(h.x() + 2, h.y());
+ h.setActionCtr(h.actionCtr() + 1);
+ if (h.actionCtr() >= 6) h.setActionCtr(0);
+ }
+ } else {
+ // Stop the barman moving
+ h.setActionCtr(12);
+ h.setFrameCtr(h.frameCtr() & 0x7f);
+ }
+
+ h.setFrameNumber(h.actionCtr());
+ return;
+ }
+
+ // All other actions
+ uint16 xp, id;
+ uint16 *frameList;
+ uint16 frameNumber;
+
+ BarmanAction action = (BarmanAction) (h.frameCtr() & 0x3F);
+ switch (action) {
+ case WALK_AROUND:
+ // Wander around between the ends of the bar
+ if (h.hotspotId() == EWAN_ID)
+ xp = rnd.getRandomNumber(51) + 94;
+ else
+ xp = rnd.getRandomNumber(85) + 117;
+
+ h.setSupportValue(xp);
+ h.setFrameCtr(0x83);
+ return;
+
+ case POLISH_BAR:
+ case SERVE_BEER:
+ if (action == SERVE_BEER) {
+ // Serving a beer
+ if ((h.frameCtr() & 0x40) == 0)
+ h.setSupportValue(h.resource()->flags2);
+
+ } else {
+ // Polishing the bar
+ if ((h.frameCtr() & 0x40) == 0) {
+ // New polish beginning
+ id = BG_RANDOM << 8;
+
+ if (h.hotspotId() == EWAN_ID) {
+ HotspotData *player = res.getHotspot(PLAYER_ID);
+ HotspotData *gwyn = res.getHotspot(GOEWIN_ID);
+ HotspotData *wayne = res.getHotspot(WAYNE_ID);
+
+ if ((player->roomNumber != 35) && (gwyn->roomNumber != 35) && (wayne->roomNumber != 35))
+ {
+ if (rnd.getRandomNumber(1) == 1)
+ id = BG_EXTRA1 << 8;
+ else
+ {
+ // Set up alternate animation
+ h.setWidth(32);
+ h.setAnimation(EWAN_ALT_ANIM_ID);
+ ewanXOffset = true;
+ h.setPosition(h.x() - 8, h.y());
+ id = BG_EXTRA2 << 8;
+ }
+ }
+ }
+
+ h.setSupportValue(id);
+ }
+ }
+
+ // At this point, either a polish or a beer serve is in progress
+ h.setFrameCtr(h.frameCtr() | 0x40);
+ h.setSupportValue(h.supportValue() + 1); // Move to next frame
+ frameList = barEntry.graphics[h.supportValue() >> 8];
+ frameNumber = frameList[h.supportValue() & 0xff];
+
+ if (frameNumber != 0)
+ {
+ h.setActionCtr(frameNumber);
+ h.setFrameNumber(frameNumber);
+ return;
+ }
+
+ if (h.hotspotId() == EWAN_ID)
+ {
+ // Make sure Ewan is back to his standard animation
+ h.setWidth(16);
+ h.setAnimation(EWAN_ANIM_ID);
+
+ if (ewanXOffset) {
+ h.setPosition(h.x() + 8, h.y());
+ ewanXOffset = false;
+ }
+ }
+ break;
+
+ case WAIT_DIALOG:
+ if (room.isDialogActive()) {
+ h.setFrameNumber(h.actionCtr());
+ return;
+ }
+ break;
+
+ case WAIT:
+ // Immediate break, since the code outside the switch handles stopping the barman
+ break;
+ }
+
+ // If this point is reached, then the barman should stop whatever he's doing
+ if (action != WAIT_DIALOG)
+ h.setDelayCtr(10);
+ h.setFrameCtr(0);
+ h.setActionCtr(12);
+ h.setFrameNumber(h.actionCtr());
}
void HotspotTickHandlers::skorlGaurdAnimHandler(Hotspot &h) {
diff --git a/engines/lure/hotspots.h b/engines/lure/hotspots.h
index 60cff496d1..0372a7d86d 100644
--- a/engines/lure/hotspots.h
+++ b/engines/lure/hotspots.h
@@ -74,7 +74,7 @@ private:
static void morkusAnimHandler(Hotspot &h);
static void talkAnimHandler(Hotspot &h);
static void headAnimHandler(Hotspot &h);
- static void sellerAnimHandler(Hotspot &h);
+ static void barmanAnimHandler(Hotspot &h);
static void skorlGaurdAnimHandler(Hotspot &h);
static void rackSerfAnimHandler(Hotspot &h);
@@ -220,6 +220,8 @@ public:
enum HotspotPrecheckResult {PC_EXECUTE, PC_NOT_IN_ROOM, PC_UNKNOWN, PC_INITIAL, PC_EXCESS};
+enum BarPlaceResult {BP_KEEP_TRYING, BP_GOT_THERE, BP_FAIL};
+
#define MAX_NUM_FRAMES 16
class Hotspot {
@@ -265,6 +267,7 @@ private:
uint8 _exitCtr;
bool _walkFlag;
uint16 _startRoomNumber;
+ uint16 _supportValue;
// Support methods
uint16 getTalkId(HotspotData *charHotspot);
@@ -273,6 +276,8 @@ private:
// Action support methods
HotspotPrecheckResult actionPrecheck(HotspotData *hotspot);
+ BarPlaceResult getBarPlace();
+ bool findClearBarPlace();
bool characterWalkingCheck(HotspotData *hotspot);
bool doorCloseCheck(uint16 doorId);
void resetDirection();
@@ -388,6 +393,13 @@ public:
void setWalkFlag(bool value) { _walkFlag = value; }
void setStartRoomNumber(uint16 value) { _startRoomNumber = value; }
void setSize(uint16 newWidth, uint16 newHeight);
+ void setWidth(uint16 newWidth) {
+ _width = newWidth;
+ _frameWidth = newWidth;
+ }
+ void setHeight(uint16 newHeight) {
+ _height = newHeight;
+ }
void setScript(uint16 offset) {
assert(_data != NULL);
_sequenceOffset = offset;
@@ -449,6 +461,8 @@ public:
assert(_data);
_data->v2b = value;
}
+ uint16 supportValue() { return _supportValue; }
+ void setSupportValue(uint16 value) { _supportValue = value; }
void copyTo(Surface *dest);
bool executeScript();
diff --git a/engines/lure/luredefs.h b/engines/lure/luredefs.h
index 979fb353f0..8c85ab46c8 100644
--- a/engines/lure/luredefs.h
+++ b/engines/lure/luredefs.h
@@ -31,7 +31,7 @@ namespace Lure {
#define SUPPORT_FILENAME "lure.dat"
#define LURE_DAT_MAJOR 1
-#define LURE_DAT_MINOR 16
+#define LURE_DAT_MINOR 17
#define LURE_DEBUG 1
@@ -229,7 +229,11 @@ enum Action {
#define FIRST_NONCHARACTER_ID 0x408
#define SACK_ID 0x40D
#define PRISONER_ID 0x412
+#define SID_ID 0x420
#define TRANSFORM_ID 0x425
+#define NELLIE_ID 0x429
+#define EWAN_ID 0x436
+#define WAYNE_ID 0x3f1
#define START_EXIT_ID 0x2710
#define BOTTLE_HOTSPOT_ID 0x2710
#define BRICKS_ID 0x2714
@@ -257,6 +261,8 @@ enum Action {
#define SERF_ANIM_ID 0x58A0
#define BLACKSMITH_STANDARD 0x8a12
#define BLACKSMITH_HAMMERING_ANIM_ID 0x9c11
+#define EWAN_ANIM_ID 0x59E4
+#define EWAN_ALT_ANIM_ID 0x59ED
#define CONVERSE_COUNTDOWN_SIZE 40
#define IDLE_COUNTDOWN_SIZE 15
diff --git a/engines/lure/res.cpp b/engines/lure/res.cpp
index 8f28da86bb..dc36e60f3e 100644
--- a/engines/lure/res.cpp
+++ b/engines/lure/res.cpp
@@ -641,6 +641,7 @@ void Resources::saveToStream(Common::WriteStream *stream)
_activeHotspots.saveToStream(stream);
_fieldList.saveToStream(stream);
_randomActions.saveToStream(stream);
+ _barmanLists.saveToStream(stream);
}
void Resources::loadFromStream(Common::ReadStream *stream) {
@@ -652,6 +653,8 @@ void Resources::loadFromStream(Common::ReadStream *stream) {
_fieldList.loadFromStream(stream);
debugC(ERROR_DETAILED, kLureDebugScripts, "Loading random actions");
_randomActions.loadFromStream(stream);
+ debugC(ERROR_DETAILED, kLureDebugScripts, "Loading barman lists");
+ _barmanLists.loadFromStream(stream);
debugC(ERROR_DETAILED, kLureDebugScripts, "Finished loading");
}
diff --git a/engines/lure/res.h b/engines/lure/res.h
index e42c24ca71..b2574a2c46 100644
--- a/engines/lure/res.h
+++ b/engines/lure/res.h
@@ -71,6 +71,7 @@ private:
RandomActionList _randomActions;
RoomExitIndexedHotspotList _indexedRoomExitHospots;
PausedCharacterList _pausedList;
+ BarmanLists _barmanLists;
StringList _stringList;
int numCharOffsets;
@@ -126,6 +127,7 @@ public:
RandomActionList &randomActions() { return _randomActions; }
RoomExitIndexedHotspotList &exitHotspots() { return _indexedRoomExitHospots; }
PausedCharacterList &pausedList() { return _pausedList; }
+ BarmanLists &barmanLists() { return _barmanLists; }
StringList &stringList() { return _stringList; }
uint16 getCharOffset(int index) {
if (index >= numCharOffsets)
diff --git a/engines/lure/res_struct.cpp b/engines/lure/res_struct.cpp
index ca7c9eb0b5..654430c46b 100644
--- a/engines/lure/res_struct.cpp
+++ b/engines/lure/res_struct.cpp
@@ -35,6 +35,38 @@ int actionNumParams[NPC_JUMP_ADDRESS+1] = {0,
1, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 0, 1,
0, 1, 1, 1, 1, 0, 0, 2, 1, 1, 0, 0, 1, 1, 2, 2, 5, 2, 2, 1};
+// Barman related frame lists
+
+uint16 basicPolish[] = {8+13,8+14,8+15,8+16,8+17,8+18,8+17,8+16,8+15,8+14,
+ 8+15,8+16,8+17,8+18,8+17,8+16,8+15,8+14,8+13,0};
+
+uint16 sidsFetch[] = {12+1,12+2,12+3,12+4,12+5,12+6,12+5,12+6,12+5,12+4,12+3,12+7,12+8,0};
+
+uint16 nelliesScratch[] = {11+1,11+2,11+3,11+4,11+5,11+4,11+5,11+4,11+5,11+4,11+3,11+2,11+1,0};
+
+uint16 nelliesFetch[] = {1,2,3,4,5,4,5,4,3,2,6,7,0};
+
+uint16 ewansFetch[] = {13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,0};
+
+uint16 ewanExtraGraphic1[]= {
+ 28,29,30,31,32,33,34,35,36,37,
+ 38,39,40,41,42,43,44,45,46,47,
+ 48,
+ 40,39,38,37,36,35,34,33,32,31,30,29,28,
+ 0};
+
+uint16 ewanExtraGraphic2[] = {
+ 1,2,3,4,5,6,7,8,9,
+ 10,11,12,13,14,15,16,17,18,19,
+ 20,21,22,23,24,0};
+
+BarEntry barList[3] = {
+ {29, SID_ID, {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, {&basicPolish[0], &sidsFetch[0], NULL, NULL}, 13, NULL},
+ {32, NELLIE_ID, {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, {&nelliesScratch[0], &nelliesFetch[0], NULL, NULL}, 14, NULL},
+ {35, EWAN_ID, {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, {&ewansFetch[0], &ewansFetch[0],
+ &ewanExtraGraphic1[0], &ewanExtraGraphic2[0]}, 16, NULL}
+};
+
// Room data holding class
RoomData::RoomData(RoomResource *rec, MemoryBlock *pathData) {
@@ -971,6 +1003,45 @@ int PausedCharacterList::check(uint16 charId, int numImpinging, uint16 *impingin
return result;
}
+// Wrapper class for the barman lists
+
+BarEntry &BarmanLists::getDetails(uint16 roomNumber)
+{
+ for (int index = 0; index < 3; ++index)
+ if (barList[index].roomNumber == roomNumber)
+ return barList[index];
+ error("Invalid room %d specified for barman details retrieval", roomNumber);
+}
+
+void BarmanLists::saveToStream(Common::WriteStream *stream)
+{
+ for (int index = 0; index < 2; ++index)
+ {
+ uint16 value = (barList[index].currentCustomer - &barList[index].customers[0]) / sizeof(BarEntry);
+ stream->writeUint16LE(value);
+ for (int ctr = 0; ctr < NUM_SERVE_CUSTOMERS; ++ctr)
+ {
+ stream->writeUint16LE(barList[index].customers[ctr].hotspotId);
+ stream->writeByte(barList[index].customers[ctr].serveFlags);
+ }
+ }
+}
+
+void BarmanLists::loadFromStream(Common::ReadStream *stream)
+{
+ for (int index = 0; index < 2; ++index)
+ {
+ int16 value = stream->readUint16LE();
+ barList[index].currentCustomer = (value == 0) ? NULL : &barList[index].customers[value];
+
+ for (int ctr = 0; ctr < NUM_SERVE_CUSTOMERS; ++ctr)
+ {
+ barList[index].customers[ctr].hotspotId = stream->readUint16LE();
+ barList[index].customers[ctr].serveFlags = stream->readByte();
+ }
+ }
+}
+
// String list resource class
void StringList::load(MemoryBlock *data) {
diff --git a/engines/lure/res_struct.h b/engines/lure/res_struct.h
index 2f9f8f6860..23b37483cd 100644
--- a/engines/lure/res_struct.h
+++ b/engines/lure/res_struct.h
@@ -691,6 +691,33 @@ public:
int check(uint16 charId, int numImpinging, uint16 *impingingList);
};
+struct ServeEntry {
+ uint16 hotspotId;
+ uint8 serveFlags;
+};
+
+#define NUM_SERVE_CUSTOMERS 4
+
+enum BarmanGraphicType {BG_RANDOM = 0, BG_BEER = 1, BG_EXTRA1 = 2, BG_EXTRA2 = 3};
+
+struct BarEntry {
+ uint16 roomNumber;
+ uint16 barmanId;
+ ServeEntry customers[NUM_SERVE_CUSTOMERS];
+ uint16 *graphics[4];
+ uint16 gridLine;
+ ServeEntry *currentCustomer;
+};
+
+class BarmanLists {
+public:
+ BarEntry &getDetails(uint16 roomNumber);
+ void saveToStream(Common::WriteStream *stream);
+ void loadFromStream(Common::ReadStream *stream);
+};
+
+enum BarmanAction {WALK_AROUND = 1, POLISH_BAR = 2, WAIT = 3, WAIT_DIALOG = 4, SERVE_BEER = 5};
+
enum StringEnum {S_CREDITS = 25, S_RESTART_GAME = 26, S_SAVE_GAME = 27, S_RESTORE_GAME = 28,
S_QUIT = 29, S_FAST_TEXT = 30, S_SLOW_TEXT = 31, S_SOUND_ON = 32, S_SOUND_OFF = 33,
S_NOTHING = 34, S_FOR = 35, S_TO = 36, S_ON = 37, S_AND_THEN = 38,
diff --git a/engines/lure/room.h b/engines/lure/room.h
index 1a9b664a53..9094de722d 100644
--- a/engines/lure/room.h
+++ b/engines/lure/room.h
@@ -106,6 +106,7 @@ public:
void setShowInfo(bool value) { _showInfo = value; }
void setTalkDialog(uint16 srcCharacterId, uint16 destCharacterId, uint16 usedId, uint16 stringId);
void setCursorState(CursorState state) { _cursorState = state; }
+ bool isDialogActive() { return _talkDialog != NULL; }
bool checkInTalkDialog();
char *statusLine() { return _statusLine; }
void saveToStream(Common::WriteStream *stream);