aboutsummaryrefslogtreecommitdiff
path: root/engines/lure/hotspots.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/lure/hotspots.h')
-rw-r--r--engines/lure/hotspots.h147
1 files changed, 144 insertions, 3 deletions
diff --git a/engines/lure/hotspots.h b/engines/lure/hotspots.h
index b5a4eaf1d6..01949d75ca 100644
--- a/engines/lure/hotspots.h
+++ b/engines/lure/hotspots.h
@@ -30,8 +30,20 @@
namespace Lure {
+#define MAX_NUM_IMPINGING 10
+
class Hotspot;
+class Support {
+public:
+ static int findIntersectingCharacters(Hotspot &h, uint16 *charList);
+ static bool checkForIntersectingCharacter(Hotspot &h);
+ static void checkRoomChange(Hotspot &h);
+ static void characterChangeRoom(Hotspot &h, uint16 roomNumber,
+ int16 newX, int16 newY, Direction dir);
+ static bool charactersIntersecting(HotspotData *hotspot1, HotspotData *hotspot2);
+};
+
typedef void(*HandlerMethodPtr)(Hotspot &h);
class HotspotTickHandlers {
@@ -39,6 +51,7 @@ private:
// Handler methods
static void defaultHandler(Hotspot &h);
static void standardAnimHandler(Hotspot &h);
+ static void standardCharacterAnimHandler(Hotspot &h);
static void roomExitAnimHandler(Hotspot &h);
static void playerAnimHandler(Hotspot &h);
static void droppingTorchAnimHandler(Hotspot &h);
@@ -50,6 +63,100 @@ public:
static HandlerMethodPtr getHandler(uint16 procOffset);
};
+enum CurrentAction {NO_ACTION, START_WALKING, DISPATCH_ACTION, EXEC_HOTSPOT_SCRIPT,
+ PROCESSING_PATH, WALKING};
+
+class CurrentActionEntry {
+private:
+ CurrentAction _action;
+ Action _hotspotAction;
+ uint16 _hotspotId;
+public:
+ CurrentActionEntry(CurrentAction newAction) { _action = newAction; }
+ CurrentActionEntry(CurrentAction newAction, Action hsAction, uint16 id) {
+ _action = newAction;
+ _hotspotAction = hsAction;
+ _hotspotId = id;
+ }
+
+ CurrentAction action() { return _action; }
+ Action hotspotAction() { return _hotspotAction; }
+ uint16 hotspotId() { return _hotspotId; }
+};
+
+class CurrentActionStack {
+private:
+ ManagedList<CurrentActionEntry *> _actions;
+public:
+ CurrentActionStack() { _actions.clear(); }
+
+ bool isEmpty() { return _actions.begin() == _actions.end(); }
+ void clear() { _actions.clear(); }
+ CurrentActionEntry &top() { return **_actions.begin(); }
+ CurrentAction action() { return isEmpty() ? NO_ACTION : top().action(); }
+ void pop() { _actions.erase(_actions.begin()); }
+ void add(CurrentAction newAction) {
+ _actions.push_back(new CurrentActionEntry(newAction));
+ }
+};
+
+class WalkingActionEntry {
+private:
+ Direction _direction;
+ int _numSteps;
+public:
+ WalkingActionEntry(Direction dir, int steps): _direction(dir), _numSteps(steps) {};
+ Direction direction() { return _direction; }
+ int &rawSteps() { return _numSteps; }
+ int numSteps();
+};
+
+enum PathFinderResult {PF_OK, PF_DEST_OCCUPIED, PF_NO_PATH, PF_NO_WALK};
+
+class PathFinder {
+private:
+ Hotspot *_hotspot;
+ ManagedList<WalkingActionEntry *> _list;
+ RoomPathsDecompressedData _layer;
+ int _stepCtr;
+ bool _inProgress;
+ int _countdownCtr;
+ int16 _destX, _destY;
+ int16 _xPos, _yPos;
+ int16 _xCurrent, _yCurrent;
+ int16 _xDestPos, _yDestPos;
+ int16 _xDestCurrent, _yDestCurrent;
+ bool _destOccupied;
+ bool _cellPopulated;
+ PathFinderResult _result;
+ uint16 *_pSrc, *_pDest;
+ int _xChangeInc, _xChangeStart;
+ int _yChangeInc, _yChangeStart;
+ int _xCtr, _yCtr;
+
+ void initVars();
+ void processCell(uint16 *p);
+ void scanLine(int numScans, int changeAmount, uint16 *&pEnd, int &v);
+
+ void add(Direction dir, int steps) {
+ _list.push_front(new WalkingActionEntry(dir, steps));
+ }
+ void addBack(Direction dir, int steps) {
+ _list.push_back(new WalkingActionEntry(dir, steps));
+ }
+ void clear() { _list.clear(); }
+public:
+ PathFinder(Hotspot *h);
+ void reset(RoomPathsData &src);
+ bool process();
+
+ void pop() { _list.erase(_list.begin()); }
+ WalkingActionEntry &top() { return **_list.begin(); }
+ bool isEmpty() { return _list.empty(); }
+ int &stepCtr() { return _stepCtr; }
+};
+
+enum HotspotPrecheckResult {PC_0, PC_1, PC_2, PC_INITIAL, PC_4};
class Hotspot {
private:
@@ -62,9 +169,12 @@ private:
int16 _startX, _startY;
uint16 _height, _width;
uint16 _heightCopy, _widthCopy;
+ uint16 _yCorrection;
+ uint16 _charRectY;
int8 _talkX, _talkY;
uint16 _numFrames;
uint16 _frameNumber;
+ Direction _direction;
uint8 _layer;
uint16 _sequenceOffset;
uint16 _tickCtr;
@@ -72,13 +182,25 @@ private:
uint8 _colourOffset;
bool _persistant;
HotspotOverrideData *_override;
+ bool _skipFlag;
+ bool _pathfindCovered;
+ CurrentActionStack _currentActions;
+ PathFinder _pathFinder;
+
+ uint16 _frameCtr;
int16 _destX, _destY;
uint16 _destHotspotId;
// Support methods
void startTalk(HotspotData *charHotspot);
+ // Action support methods
+ HotspotPrecheckResult actionPrecheck(HotspotData *hotspot);
+ HotspotPrecheckResult actionPrecheck2(HotspotData *hotspot);
+ void actionPrecheck3(HotspotData *hotspot);
+ bool characterWalkingCheck(HotspotData *hotspot);
+
// Action set
void doGet(HotspotData *hotspot);
void doOperate(HotspotData *hotspot, Action action);
@@ -112,6 +234,7 @@ public:
uint16 frameNumber() { return _frameNumber; }
void setFrameNumber(uint16 v) { _frameNumber = v; }
void incFrameNumber();
+ Direction direction() { return _direction; }
uint16 frameWidth() { return _width; }
int16 x() { return _startX; }
int16 y() { return _startY; }
@@ -124,10 +247,13 @@ public:
uint16 height() { return _height; }
uint16 widthCopy() { return _widthCopy; }
uint16 heightCopy() { return _heightCopy; }
+ uint16 yCorrection() { return _yCorrection; }
+ uint16 charRectY() { return _charRectY; }
uint16 roomNumber() { return _roomNumber; }
uint16 script() { return _sequenceOffset; }
uint8 layer() { return _layer; }
uint16 tickCtr() { return _tickCtr; }
+ bool skipFlag() { return _skipFlag; }
void setTickCtr(uint16 newVal) { _tickCtr = newVal; }
void setTickProc(uint16 newVal);
bool persistant() { return _persistant; }
@@ -140,22 +266,37 @@ public:
bool isActiveAnimation();
void setPosition(int16 newX, int16 newY);
void setDestPosition(int16 newX, int16 newY) { _destX = newX; _destY = newY; }
+ void setDestHotspot(uint16 id) { _destHotspotId = id; }
void setSize(uint16 newWidth, uint16 newHeight);
void setScript(uint16 offset) {
_sequenceOffset = offset;
_data->sequenceOffset = offset;
}
void setActions(uint32 newActions) { _actions = newActions; }
+ void setCharRectY(uint16 value) { _charRectY = value; }
+ void setSkipFlag(bool value) { _skipFlag = value; }
void copyTo(Surface *dest);
bool executeScript();
void tick();
- void walkTo(int16 endPosX, int16 endPosY, uint16 destHotspot = 0, bool immediate = false);
- void setDirection(Direction dir);
bool isRoomExit(uint16 id);
- // Action set
+ // Walking
+ void walkTo(int16 endPosX, int16 endPosY, uint16 destHotspot = 0);
+ void stopWalking() { _currentActions.clear(); }
+ void setDirection(Direction dir);
+ void faceHotspot(HotspotData *hotspot);
+ void setOccupied(bool occupiedFlag);
+ bool walkingStep();
+
+ // Actions
void doAction(Action action, HotspotData *hotspot);
+ void setCurrentAction(CurrentAction currAction) { _currentActions.add(currAction); }
+ CurrentActionStack &currentActions() { return _currentActions; }
+ PathFinder &pathFinder() { return _pathFinder; }
+ uint16 frameCtr() { return _frameCtr; }
+ void setFrameCtr(uint16 value) { _frameCtr = value; }
+ void decrFrameCtr() { if (_frameCtr > 0) --_frameCtr; }
};
typedef ManagedList<Hotspot *> HotspotList;