diff options
Diffstat (limited to 'engines/lure/hotspots.h')
-rw-r--r-- | engines/lure/hotspots.h | 147 |
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 ¤tActions() { 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; |