From fcdd7511d1a9648b9692fb05cc93eeaa6fedfc02 Mon Sep 17 00:00:00 2001 From: Nipun Garg Date: Tue, 25 Jun 2019 00:35:53 +0530 Subject: HDB: Add findPath() --- engines/hdb/ai-funcs.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ engines/hdb/ai.h | 1 + engines/hdb/hdb.h | 6 +++++- engines/hdb/map-loader.h | 13 ++++++++++-- 4 files changed, 71 insertions(+), 3 deletions(-) (limited to 'engines') diff --git a/engines/hdb/ai-funcs.cpp b/engines/hdb/ai-funcs.cpp index 585d33356c..f13e9d575a 100644 --- a/engines/hdb/ai-funcs.cpp +++ b/engines/hdb/ai-funcs.cpp @@ -1375,6 +1375,60 @@ int AI::checkForTouchplate(int x, int y) { return 0; } +bool AI::findPath(AIEntity *e) { + int x, y, xv = 0, yv = 0, max; + ArrowPath *here; + + // Initial Pointing Direction to search in + x = e->tileX; + y = e->tileY; + here = findArrowPath(x, y); + // Only look for GO arrows at this first location + if (here && here->type == 1) + e->dir = here->dir; + + switch (e->dir) { + case DIR_UP: + yv = -1; + break; + case DIR_DOWN: + yv = 1; + break; + case DIR_LEFT: + xv = -1; + break; + case DIR_RIGHT: + xv = 1; + break; + case DIR_NONE: + warning("findPath: DIR_NONE found"); + break; + } + + if (xv) + max = g_hdb->_map->_width; + else + max = g_hdb->_map->_height; + + ArrowPath *arrowPath; + uint32 flags; + while (max--) { + arrowPath = findArrowPath(x + xv, y + yv); + if (arrowPath) { + setEntityGoal(e, arrowPath->tileX, arrowPath->tileY); + return true; + } else { + flags = g_hdb->_map->getMapBGTileFlags(x + xv, y + yv); + if (flags & kFlagSolid) + return false; + } + x += xv; + y += yv; + } + + return false; +} + AIEntity *AI::legalMove(int tileX, int tileY, int level, int *result) { uint32 bgFlags = g_hdb->_map->getMapBGTileFlags(tileX, tileY); uint32 fgFlags = g_hdb->_map->getMapFGTileFlags(tileX, tileY); diff --git a/engines/hdb/ai.h b/engines/hdb/ai.h index b5cf719fd0..bd25f555fa 100644 --- a/engines/hdb/ai.h +++ b/engines/hdb/ai.h @@ -654,6 +654,7 @@ public: void moveEnts(); int checkForTouchplate(int x, int y); + bool findPath(AIEntity *e); AIEntity *legalMove(int tileX, int tileY, int level, int *result); AIEntity *legalMoveOverWater(int tileX, int tileY, int level, int *result); AIEntity *legalMoveOverWaterIgnore(int tileX, int tileY, int level, int *result, AIEntity *ignore); diff --git a/engines/hdb/hdb.h b/engines/hdb/hdb.h index 139d610964..319db920b4 100644 --- a/engines/hdb/hdb.h +++ b/engines/hdb/hdb.h @@ -70,10 +70,13 @@ enum GameState { }; enum Flag { + kFlagMonsterBlock = 0x2, kFlagSolid = 0x3, kFlagPlayerDie = 0x8, kFlagInvisible = 0x20, kFlagForeground = 0x80, + kFlagSlime = 0x201C, + kFlagWater = 0x401C, kFlagEnergyFloor = 0x40000, kFlagPlasmaFloor = 0x6000D, kFlagRadFloor = 0x6800D, @@ -81,9 +84,10 @@ enum Flag { kFlagStairTop = 0x400000, kFlagAnimSlow = 0x800000, kFlagAnimMedium = 0x1000000, + kFlagMasked = 0x2000000, kFlagAnimFast = 0x1800000, kFlagGrating = 0x4000000, - kFlagMasked = 0x2000000 + kFlagPlummet = 0x8000000 }; enum { diff --git a/engines/hdb/map-loader.h b/engines/hdb/map-loader.h index f59159a699..69c82a8ee5 100644 --- a/engines/hdb/map-loader.h +++ b/engines/hdb/map-loader.h @@ -77,6 +77,16 @@ public: void drawGratings(); void drawForegrounds(); + bool isLoaded() { + return _mapLoaded; + } + + bool onScreen(int x, int y) { + if ((x >= _mapX / kTileWidth) && (x < (_mapX / kTileWidth) + kScreenXTiles) && (y >= _mapY / kTileHeight) && (y < (_mapY / kTileHeight) + kScreenYTiles)) + return true; + return false; + } + uint32 getMapBGTileFlags(int x, int y); uint32 getMapFGTileFlags(int x, int y); uint16 getMapBGTileIndex(int x, int y); @@ -95,6 +105,7 @@ public: // Check if one of the tiles in a range exists in the map on either layer bool checkOneTileExistInRange(int tileIndex, int count); + uint16 _width, _height; int _mapX, _mapY; // Coordinates of Map int _mapTileX, _mapTileY; // Tile Coordinates of Map int _mapTileXOff, _mapTileYOff; // Tile Coordinates Offset (0-31) @@ -112,8 +123,6 @@ public: private: char _name[32]; - uint16 _width; - uint16 _height; uint32 _backgroundOffset; uint32 _foregroundOffset; uint16 _iconNum; -- cgit v1.2.3