aboutsummaryrefslogtreecommitdiff
path: root/engines/hdb/ai-lists.cpp
diff options
context:
space:
mode:
authorNipun Garg2019-07-03 21:12:09 +0530
committerEugene Sandulenko2019-09-03 17:17:09 +0200
commit73b7b830984025a8f5b877652cce758267be43ca (patch)
tree2852106f499d725072d3f32f2ff66bf7a55c65ea /engines/hdb/ai-lists.cpp
parent10802c22fbe5bcadf32e2e1a974e39e75b599e8f (diff)
downloadscummvm-rg350-73b7b830984025a8f5b877652cce758267be43ca.tar.gz
scummvm-rg350-73b7b830984025a8f5b877652cce758267be43ca.tar.bz2
scummvm-rg350-73b7b830984025a8f5b877652cce758267be43ca.zip
HDB: Add addBridgeExtend() and animateBridges()
Diffstat (limited to 'engines/hdb/ai-lists.cpp')
-rw-r--r--engines/hdb/ai-lists.cpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/engines/hdb/ai-lists.cpp b/engines/hdb/ai-lists.cpp
index 5126d142da..4e6c876192 100644
--- a/engines/hdb/ai-lists.cpp
+++ b/engines/hdb/ai-lists.cpp
@@ -136,6 +136,110 @@ void AI::animateTargets() {
}
}
+void AI::addBridgeExtend(int x, int y, int bridgeType) {
+ if (_numBridges >= kMaxBridges)
+ return;
+
+ if (bridgeType == _targetBridgeU)
+ _bridges[_numBridges].dir = DIR_UP;
+ else if (bridgeType == _targetBridgeD)
+ _bridges[_numBridges].dir = DIR_DOWN;
+ else if (bridgeType == _targetBridgeL)
+ _bridges[_numBridges].dir = DIR_LEFT;
+ else if (bridgeType == _targetBridgeR)
+ _bridges[_numBridges].dir = DIR_RIGHT;
+
+ _bridges[_numBridges].delay = 5;
+ _bridges[_numBridges].x = x;
+ _bridges[_numBridges].y = y;
+ _bridges[_numBridges].anim = 0;
+
+ if (g_hdb->_map->onScreen(_bridges[_numBridges].x, _bridges[_numBridges].y))
+ g_hdb->_sound->playSound(SND_BRIDGE_START);
+
+ _numBridges++;
+}
+
+void AI::animateBridges() {
+ int i, j, tileIndex, xv, yv;
+ uint32 flags;
+ bool done;
+
+ // out quick!
+ if (!_numBridges)
+ return;
+
+ for (i = 0; i < _numBridges; i++) {
+ if (_bridges[i].delay-- > 0)
+ continue;
+
+ _bridges[i].delay = 5;
+ done = false;
+ xv = yv = 0;
+
+ switch (_bridges[i].dir) {
+ case DIR_UP:
+ g_hdb->_map->setMapFGTileIndex(_bridges[i].x, _bridges[i].y, _targetBridgeU + _bridges[i].anim);
+ _bridges[i].anim++;
+ if (_bridges[i].anim > 2) {
+ g_hdb->_map->setMapFGTileIndex(_bridges[i].x, _bridges[i].y, _targetBridgeMidUD);
+ yv = -1;
+ done = true;
+ }
+ break;
+ case DIR_DOWN:
+ g_hdb->_map->setMapFGTileIndex(_bridges[i].x, _bridges[i].y, _targetBridgeD + _bridges[i].anim);
+ _bridges[i].anim++;
+ if (_bridges[i].anim > 2)
+ {
+ g_hdb->_map->setMapFGTileIndex(_bridges[i].x, _bridges[i].y, _targetBridgeMidUD);
+ yv = 1;
+ done = true;
+ }
+ break;
+ case DIR_LEFT:
+ g_hdb->_map->setMapFGTileIndex(_bridges[i].x, _bridges[i].y, _targetBridgeL + _bridges[i].anim);
+ _bridges[i].anim++;
+ if (_bridges[i].anim > 2)
+ {
+ g_hdb->_map->setMapFGTileIndex(_bridges[i].x, _bridges[i].y, _targetBridgeMidLR);
+ xv = -1;
+ done = true;
+ }
+ break;
+ case DIR_RIGHT:
+ g_hdb->_map->setMapFGTileIndex(_bridges[i].x, _bridges[i].y, _targetBridgeR + _bridges[i].anim);
+ _bridges[i].anim++;
+ if (_bridges[i].anim > 2)
+ {
+ g_hdb->_map->setMapFGTileIndex(_bridges[i].x, _bridges[i].y, _targetBridgeMidLR);
+ xv = 1;
+ done = true;
+ }
+ break;
+ }
+
+ // is this bridge done extending one chunk?
+ if (done == true)
+ {
+ if (g_hdb->_map->onScreen(_bridges[i].x, _bridges[i].y))
+ g_hdb->_sound->playSound(SND_BRIDGE_EXTEND);
+ _bridges[i].anim = 0;
+ _bridges[i].x += xv;
+ _bridges[i].y += yv;
+ tileIndex = g_hdb->_map->getMapFGTileIndex(_bridges[i].x, _bridges[i].y);
+ flags = g_hdb->_map->getMapBGTileFlags(_bridges[i].x, _bridges[i].y);
+ if (!flags || (flags & kFlagMetal) || tileIndex >= 0 || (flags & kFlagSolid)) {
+ if (g_hdb->_map->onScreen(_bridges[i].x, _bridges[i].y))
+ g_hdb->_sound->playSound(SND_BRIDGE_END);
+ for (j = 0; j < _numBridges - 1; j++)
+ memcpy(&_bridges[i], &_bridges[i + 1], sizeof(Bridge));
+ _numBridges--;
+ }
+ }
+ }
+}
+
// Add an action location to the list of possible actions
// Each action must be paired with another of the same number
void AI::addToActionList(int actionIndex, int x, int y, char *luaFuncInt, char *luaFuncUse) {