aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNipun Garg2019-07-05 15:47:44 +0530
committerEugene Sandulenko2019-09-03 17:17:12 +0200
commit1b924b23b9e699dcc56edf9560fec8d7780d1de3 (patch)
tree38525f10e8fb719226f56186d622d8d41a80c20a
parentb8a2ed94c66bff79419326c78d2b89c2d474fa46 (diff)
downloadscummvm-rg350-1b924b23b9e699dcc56edf9560fec8d7780d1de3.tar.gz
scummvm-rg350-1b924b23b9e699dcc56edf9560fec8d7780d1de3.tar.bz2
scummvm-rg350-1b924b23b9e699dcc56edf9560fec8d7780d1de3.zip
HDB: Add Dragon functions
-rw-r--r--engines/hdb/ai-bots.cpp210
1 files changed, 192 insertions, 18 deletions
diff --git a/engines/hdb/ai-bots.cpp b/engines/hdb/ai-bots.cpp
index a64e230881..f9f648638a 100644
--- a/engines/hdb/ai-bots.cpp
+++ b/engines/hdb/ai-bots.cpp
@@ -2283,12 +2283,202 @@ void aiBuzzflyAction(AIEntity *e) {
}
}
+void aiDragonInit(AIEntity *e) {
+ AIEntity *block;
+
+ e->state = STATE_STANDDOWN;
+ e->sequence = 0; // 0 = sleeping
+ e->aiAction = aiDragonAction;
+ e->aiDraw = aiDragonDraw;
+ e->animCycle = 10; // time between flaps
+
+ // need to save the dragon's coords and type in the blocking entity for gem-hit-blocking detection
+ block = spawnBlocking(e->tileX - 1, e->tileY, e->level);
+ block->value1 = (int)AI_DRAGON;
+ sprintf(block->luaFuncUse, "%03d%03d", e->tileX, e->tileY);
+ block = spawnBlocking(e->tileX + 1, e->tileY, e->level);
+ block->value1 = (int)AI_DRAGON;
+ sprintf(block->luaFuncUse, "%03d%03d", e->tileX, e->tileY);
+ block = spawnBlocking(e->tileX - 1, e->tileY - 1, e->level);
+ block->value1 = (int)AI_DRAGON;
+ sprintf(block->luaFuncUse, "%03d%03d", e->tileX, e->tileY);
+ block = spawnBlocking(e->tileX + 1, e->tileY - 1, e->level);
+ block->value1 = (int)AI_DRAGON;
+ sprintf(block->luaFuncUse, "%03d%03d", e->tileX, e->tileY);
+ block = spawnBlocking(e->tileX - 1, e->tileY - 2, e->level);
+ block->value1 = (int)AI_DRAGON;
+ sprintf(block->luaFuncUse, "%03d%03d", e->tileX, e->tileY);
+ block = spawnBlocking(e->tileX + 1, e->tileY - 2, e->level);
+ block->value1 = (int)AI_DRAGON;
+ sprintf(block->luaFuncUse, "%03d%03d", e->tileX, e->tileY);
+}
+
+void aiDragonInit2(AIEntity *e) {
+ e->draw = NULL;
+ if (!g_hdb->_ai->_gfxDragonAsleep) {
+ g_hdb->_ai->_gfxDragonAsleep = g_hdb->_gfx->loadPic(DRAGON_ASLEEP);
+ g_hdb->_ai->_gfxDragonFlap[0] = g_hdb->_gfx->loadPic(DRAGON_FLAP1);
+ g_hdb->_ai->_gfxDragonFlap[1] = g_hdb->_gfx->loadPic(DRAGON_FLAP2);
+ g_hdb->_ai->_gfxDragonBreathe[0] = g_hdb->_gfx->loadPic(DRAGON_BREATHE_START);
+ g_hdb->_ai->_gfxDragonBreathe[1] = g_hdb->_gfx->loadPic(DRAGON_BREATHING_1);
+ g_hdb->_ai->_gfxDragonBreathe[2] = g_hdb->_gfx->loadPic(DRAGON_BREATHING_2);
+ }
+}
+
+void aiDragonWake(AIEntity *e) {
+ e->sequence = 1; // woke up, start flapping and breathing!
+ e->animFrame = 0;
+ e->animDelay = e->animCycle;
+}
+
+void aiDragonUse(AIEntity *e) {
+ aiDragonWake(e);
+}
+
void aiDragonAction(AIEntity *e) {
- warning("STUB: AI: aiDragonAction required");
+ AIEntity *p = g_hdb->_ai->getPlayer();
+
+ switch (e->sequence) {
+ // Sleeping, waiting for the player to wake him up
+ case 0:
+ if (e->onScreen &&
+ p->tileX >= e->tileX - 1 &&
+ p->tileX <= e->tileX + 1 &&
+ p->tileY <= e->tileY + 1 &&
+ p->tileY >= e->tileY - 3) {
+ if ((p->state >= STATE_ATK_CLUB_UP &&
+ p->state <= STATE_ATK_SLUG_RIGHT) || g_hdb->_window->inPanicZone()) {
+ aiDragonWake(e);
+ if (e->onScreen)
+ g_hdb->_sound->playSound(SND_DRAGON_WAKE);
+ }
+ }
+ break;
+
+ // Woke up - flapping wings 3 times!
+ case 1:
+ e->animDelay--;
+
+ if (e->animDelay < 1) {
+ if (e->onScreen)
+ g_hdb->_sound->playSound(SND_DRAGON_WAKE);
+ e->animDelay = e->animCycle;
+ e->animFrame++;
+ if (e->animFrame >= 8) {
+ e->animFrame = 0;
+ e->sequence = 2;
+ e->animCycle = 2;
+ }
+ }
+ break;
+
+ // Start breathing fire!
+ case 2:
+ e->animDelay--;
+
+ if (e->onScreen)
+ g_hdb->_sound->playSound(SND_DRAGON_BREATHEFIRE);
+ if (e->animDelay < 1) {
+ e->animDelay = e->animCycle;
+ e->animFrame++;
+ if (e->animFrame >= 1) {
+ e->animFrame = 0;
+ e->sequence = 3;
+ e->animCycle = 2; // time between flaps
+ }
+ }
+
+ break;
+
+ // Breathing fire!
+ case 3:
+ {
+ if (hitPlayer(e->x, e->y + 32)) {
+ g_hdb->_ai->killPlayer(DEATH_FRIED);
+ return;
+ }
+
+ // whatever entity is in front of the dragon is gettin' USED!
+ AIEntity *hit = g_hdb->_ai->findEntity(e->tileX, e->tileY + 1);
+ if (hit) {
+ switch (hit->type) {
+ case AI_CHICKEN:
+ g_hdb->_ai->addAnimateTarget(hit->tileX * kTileWidth, hit->tileY * kTileHeight, 0, 2, ANIM_NORMAL, false, false, GROUP_ENT_CHICKEN_DIE);
+ g_hdb->_sound->playSound(SND_CHICKEN_DEATH);
+ g_hdb->_ai->removeEntity(hit);
+ e->sequence = 4;
+ break;
+ case AI_MAGIC_EGG:
+ case AI_ICE_BLOCK:
+ aiMagicEggUse(hit);
+ break;
+ default:
+ if (hit->aiUse)
+ hit->aiUse(hit);
+ if (hit->luaFuncUse[0])
+ g_hdb->_lua->callFunction(hit->luaFuncUse, 0);
+ }
+ }
+
+ e->animDelay--;
+
+ if (e->animDelay < 1) {
+ if (e->onScreen && !(e->animFrame & 7))
+ g_hdb->_sound->playSound(SND_DRAGON_BREATHEFIRE);
+
+ e->animDelay = e->animCycle;
+ e->animFrame++;
+ if (e->animFrame >= 30) {
+ e->animFrame = 0;
+ e->sequence = 4;
+ e->animCycle = 10; // time between flaps
+ }
+ }
+ }
+
+ break;
+
+ // Done burning - flapping wings 3 times
+ case 4:
+ e->animDelay--;
+
+ if (e->animDelay < 1) {
+ e->animDelay = e->animCycle;
+ e->animFrame++;
+ if (e->animFrame >= 8) {
+ e->animFrame = 0;
+ e->sequence = 0;
+ if (e->onScreen)
+ g_hdb->_sound->playSound(SND_DRAGON_FALLASLEEP);
+ }
+ }
+ break;
+ }
}
void aiDragonDraw(AIEntity *e, int mx, int my) {
- warning("STUB: AI: aiDragonDraw required");
+ switch (e->sequence) {
+ // sleeping
+ case 0:
+ g_hdb->_ai->_gfxDragonAsleep->drawMasked(e->x - 32 - mx, e->y - 96 - my);
+ break;
+ // flapping 3 times
+ case 1:
+ g_hdb->_ai->_gfxDragonFlap[e->animFrame & 1]->drawMasked(e->x - 32 - mx, e->y - 96 - my);
+ break;
+ // start breathing (very short)
+ case 2:
+ g_hdb->_ai->_gfxDragonBreathe[0]->drawMasked(e->x - 32 - mx, e->y - 96 - my);
+ break;
+ // breathing
+ case 3:
+ g_hdb->_ai->_gfxDragonBreathe[(e->animFrame & 1) + 1]->drawMasked(e->x - 32 - mx, e->y - 96 - my);
+ break;
+ // flapping 3 times
+ case 4:
+ g_hdb->_ai->_gfxDragonBreathe[e->animFrame & 1]->drawMasked(e->x - 32 - mx, e->y - 96 - my);
+ break;
+ }
}
void aiListenBotInit(AIEntity *e) {
@@ -2315,20 +2505,4 @@ void aiFatFrogInit2(AIEntity *e) {
warning("STUB: AI: aiFatFrogInit2 required");
}
-void aiDragonInit(AIEntity *e) {
- warning("STUB: AI: aiDragonInit required");
-}
-
-void aiDragonInit2(AIEntity *e) {
- warning("STUB: AI: aiDragonInit2 required");
-}
-
-void aiDragonWake(AIEntity *e) {
- warning("STUB: AI: aiDragonWake required");
-}
-
-void aiDragonUse(AIEntity *e) {
- warning("STUB: AI: aiDragonUse required");
-}
-
} // End of Namespace