[Scummvm-git-logs] scummvm master -> cb949044dbb197dc45dcd039213d7fcf6c04c7fd

digitall noreply at scummvm.org
Sat Jul 23 16:02:17 UTC 2022


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
cb949044db HDB: Refactor AI Functions to Avoid Incompatible Function Pointer Casts


Commit: cb949044dbb197dc45dcd039213d7fcf6c04c7fd
    https://github.com/scummvm/scummvm/commit/cb949044dbb197dc45dcd039213d7fcf6c04c7fd
Author: D G Turner (digitall at scummvm.org)
Date: 2022-07-23T17:00:23+01:00

Commit Message:
HDB: Refactor AI Functions to Avoid Incompatible Function Pointer Casts

These warnings were emitted by GCC when -Wcast-function-type was passed.

This fixes these by refactoring so the engine only uses a single function
pointer type with the "extra" parameters always present.

Changed paths:
    engines/hdb/ai-bots.cpp
    engines/hdb/ai-funcs.cpp
    engines/hdb/ai-init.cpp
    engines/hdb/ai-lists.cpp
    engines/hdb/ai-player.cpp
    engines/hdb/ai-player.h
    engines/hdb/ai.h
    engines/hdb/hdb.cpp
    engines/hdb/saveload.cpp


diff --git a/engines/hdb/ai-bots.cpp b/engines/hdb/ai-bots.cpp
index 20fadb0d90c..4dce905996b 100644
--- a/engines/hdb/ai-bots.cpp
+++ b/engines/hdb/ai-bots.cpp
@@ -40,14 +40,14 @@ namespace HDB {
 //
 //-------------------------------------------------------------------
 
-void aiOmniBotInit(AIEntity *e) {
+void aiOmniBotInit(AIEntity *e, int mx, int my) {
 	if (e->value1 == 1)
 		e->aiAction = aiOmniBotMove;
 	else if (g_hdb->_ai->findPath(e))
 		e->aiAction = aiOmniBotAction;
 }
 
-void aiOmniBotInit2(AIEntity *e) {
+void aiOmniBotInit2(AIEntity *e, int mx, int my) {
 	e->standdownGfx[0] = e->movedownGfx[0];
 	e->standupGfx[0] = e->movedownGfx[0];
 	e->standleftGfx[0] = e->moveleftGfx[0];
@@ -56,14 +56,14 @@ void aiOmniBotInit2(AIEntity *e) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiOmniBotMove(AIEntity *e) {
+void aiOmniBotMove(AIEntity *e, int mx, int my) {
 	if (e->goalX)
 		g_hdb->_ai->animateEntity(e);
 	else
 		g_hdb->_ai->animEntFrames(e);
 }
 
-void aiOmniBotAction(AIEntity *e) {
+void aiOmniBotAction(AIEntity *e, int mx, int my) {
 	AIEntity *p = g_hdb->_ai->getPlayer();
 	if (e->goalX) {
 		if (!e->sequence) {
@@ -152,12 +152,12 @@ void aiOmniBotAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiOmniBotMissileInit(AIEntity *e) {
+void aiOmniBotMissileInit(AIEntity *e, int mx, int my) {
 	e->state = STATE_MOVEDOWN;
 	e->aiAction = aiOmniBotMissileAction;
 }
 
-void aiOmniBotMissileInit2(AIEntity *e) {
+void aiOmniBotMissileInit2(AIEntity *e, int mx, int my) {
 	for (int i = 0; i < e->movedownFrames; i++)
 		e->moveleftGfx[i] = e->moverightGfx[i] = e->moveupGfx[i] = e->movedownGfx[i];
 
@@ -165,7 +165,7 @@ void aiOmniBotMissileInit2(AIEntity *e) {
 	e->draw = e->movedownGfx[0];
 }
 
-void aiOmniBotMissileAction(AIEntity *e) {
+void aiOmniBotMissileAction(AIEntity *e, int mx, int my) {
 	AIEntity *p = g_hdb->_ai->getPlayer();
 
 	g_hdb->_ai->animEntFrames(e);
@@ -199,15 +199,15 @@ void aiOmniBotMissileAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiTurnBotInit(AIEntity *e) {
+void aiTurnBotInit(AIEntity *e, int mx, int my) {
 	e->aiAction = aiTurnBotAction;
 }
 
-void aiTurnBotInit2(AIEntity *e) {
+void aiTurnBotInit2(AIEntity *e, int mx, int my) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiTurnBotChoose(AIEntity *e) {
+void aiTurnBotChoose(AIEntity *e, int mx, int my) {
 	static const int xvAhead[5] = { 9, 0, 0, -1, 1 };
 	static const int yvAhead[5] = { 9, -1, 1, 0, 0 };
 	static const AIDir turnRight[5] = { DIR_NONE, DIR_RIGHT, DIR_LEFT, DIR_UP, DIR_DOWN };
@@ -236,11 +236,11 @@ void aiTurnBotChoose(AIEntity *e) {
 	}
 }
 
-void aiTurnBotAction(AIEntity *e) {
+void aiTurnBotAction(AIEntity *e, int mx, int my) {
 	if (e->goalX)
 		g_hdb->_ai->animateEntity(e);
 	else {
-		aiTurnBotChoose(e);
+		aiTurnBotChoose(e, 0, 0);
 		g_hdb->_ai->animateEntity(e);
 		if (e->onScreen)
 			g_hdb->_sound->playSound(SND_TURNBOT_TURN);
@@ -257,7 +257,7 @@ void aiTurnBotAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiShockBotInit(AIEntity *e) {
+void aiShockBotInit(AIEntity *e, int mx, int my) {
 	g_hdb->_ai->findPath(e);
 	e->aiAction = aiShockBotAction;
 	e->animCycle = 0;
@@ -265,7 +265,7 @@ void aiShockBotInit(AIEntity *e) {
 	e->aiDraw = aiShockBotShock;
 }
 
-void aiShockBotInit2(AIEntity *e) {
+void aiShockBotInit2(AIEntity *e, int mx, int my) {
 	e->standupFrames = e->standdownFrames = e->standleftFrames = e->standrightFrames =
 		e->moveupFrames = e->moverightFrames = e->moveleftFrames = e->movedownFrames;
 
@@ -275,7 +275,7 @@ void aiShockBotInit2(AIEntity *e) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiShockBotAction(AIEntity *e) {
+void aiShockBotAction(AIEntity *e, int mx, int my) {
 	if (e->goalX) {
 		if (!e->sequence) {
 			if (hitPlayer(e->x, e->y))
@@ -320,7 +320,7 @@ void aiShockBotShock(AIEntity *e, int mx, int my) {
 				}
 				if (!e->animFrame && g_hdb->_map->boomBarrelExist(e->tileX + offX[i], e->tileY + offY[i])) {
 					AIEntity *e2 = g_hdb->_ai->findEntityType(AI_BOOMBARREL, e->tileX + offX[i], e->tileY + offY[i]);
-					aiBarrelExplode(e2);
+					aiBarrelExplode(e2, 0, 0);
 				}
 			}
 		}
@@ -335,14 +335,14 @@ void aiShockBotShock(AIEntity *e, int mx, int my) {
 //
 //-------------------------------------------------------------------
 
-void aiRightBotInit(AIEntity *e) {
+void aiRightBotInit(AIEntity *e, int mx, int my) {
 	e->moveSpeed = kPlayerMoveSpeed;
 	if (!g_hdb->getActionMode())
 		e->moveSpeed >>= 1;
 	e->aiAction = aiRightBotAction;
 }
 
-void aiRightBotInit2(AIEntity *e) {
+void aiRightBotInit2(AIEntity *e, int mx, int my) {
 	switch (e->dir) {
 	case DIR_UP:
 		e->draw = e->moveupGfx[0];
@@ -366,7 +366,7 @@ void aiRightBotInit2(AIEntity *e) {
 	}
 }
 
-void aiRightBotFindGoal(AIEntity *e) {
+void aiRightBotFindGoal(AIEntity *e, int mx, int my) {
 	static const int xvAhead[5] = { 9, 0, 0,-1, 1 };
 	static const int yvAhead[5] = { 9,-1, 1, 0, 0 };
 	static const int xvAToR[5]  = { 9, 1,-1,-1, 1 };
@@ -538,7 +538,7 @@ void aiRightBotFindGoal(AIEntity *e) {
 		g_hdb->_sound->playSound(SND_RIGHTBOT_TURN);
 }
 
-void aiRightBotAction(AIEntity *e) {
+void aiRightBotAction(AIEntity *e, int mx, int my) {
 	AIEntity *p = g_hdb->_ai->getPlayer();
 
 	if (e->goalX) {
@@ -546,7 +546,7 @@ void aiRightBotAction(AIEntity *e) {
 			g_hdb->_ai->killPlayer(DEATH_NORMAL);
 		g_hdb->_ai->animateEntity(e);
 	} else {
-		aiRightBotFindGoal(e);
+		aiRightBotFindGoal(e, 0, 0);
 		g_hdb->_ai->animEntFrames(e);
 	}
 }
@@ -560,16 +560,16 @@ void aiRightBotAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiPushBotInit(AIEntity *e) {
+void aiPushBotInit(AIEntity *e, int mx, int my) {
 	if (e->value1 != 1)
 		e->aiAction = aiPushBotAction;
 }
 
-void aiPushBotInit2(AIEntity *e) {
+void aiPushBotInit2(AIEntity *e, int mx, int my) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiPushBotAction(AIEntity *e) {
+void aiPushBotAction(AIEntity *e, int mx, int my) {
 	static const AIState moveState[5] = { STATE_NONE, STATE_MOVEUP, STATE_MOVEDOWN, STATE_MOVELEFT, STATE_MOVERIGHT };
 	static const int xvAhead[5] = { 9, 0, 0,-1, 1 };
 	static const int yvAhead[5] = { 9,-1, 1, 0, 0 };
@@ -673,7 +673,7 @@ void aiPushBotAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiRailRiderInit(AIEntity *e) {
+void aiRailRiderInit(AIEntity *e, int mx, int my) {
 	if (e->type == AI_RAILRIDER_ON) {
 		// On the tracks already - spawn RED arrow
 		g_hdb->_ai->addToPathList(e->tileX, e->tileY, 0, e->dir);
@@ -689,16 +689,16 @@ void aiRailRiderInit(AIEntity *e) {
 	e->moveSpeed = kPlayerMoveSpeed;
 }
 
-void aiRailRiderInit2(AIEntity *e) {
+void aiRailRiderInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
 // Talking to RailRider off track
-void aiRailRiderUse(AIEntity *e) {
+void aiRailRiderUse(AIEntity *e, int mx, int my) {
 	e->sequence = 1;
 }
 
-void aiRailRiderAction(AIEntity *e) {
+void aiRailRiderAction(AIEntity *e, int mx, int my) {
 	switch (e->sequence) {
 		// Waiting for Dialog to goaway
 	case 1:
@@ -766,7 +766,7 @@ void aiRailRiderAction(AIEntity *e) {
 }
 
 // Talking to RailRider on track
-void aiRailRiderOnUse(AIEntity *e) {
+void aiRailRiderOnUse(AIEntity *e, int mx, int my) {
 	AIEntity *p = g_hdb->_ai->getPlayer();
 
 	if (p->tileX == e->tileX) {
@@ -782,7 +782,7 @@ void aiRailRiderOnUse(AIEntity *e) {
 	e->sequence = -1;	// Waiting for player to board
 }
 
-void aiRailRiderOnAction(AIEntity *e) {
+void aiRailRiderOnAction(AIEntity *e, int mx, int my) {
 	static const int xv[5] = { 9, 0, 0, -1, 1 };
 	static const int yv[5] = { 9, -1, 1, 0, 0 };
 
@@ -951,7 +951,7 @@ void aiRailRiderOnAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiMaintBotInit(AIEntity *e) {
+void aiMaintBotInit(AIEntity *e, int mx, int my) {
 	// value1 field determines whether the "MMM!" sound plays
 	// 1 means NO
 	e->int1 = e->value1;
@@ -960,11 +960,11 @@ void aiMaintBotInit(AIEntity *e) {
 	g_hdb->_ai->findPath(e);
 }
 
-void aiMaintBotInit2(AIEntity *e) {
+void aiMaintBotInit2(AIEntity *e, int mx, int my) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiMaintBotAction(AIEntity *e) {
+void aiMaintBotAction(AIEntity *e, int mx, int my) {
 	static const AIState useState[5]   = {STATE_NONE, STATE_USEUP, STATE_USEDOWN, STATE_USELEFT, STATE_USERIGHT};
 	static const AIState standState[5] = {STATE_NONE, STATE_STANDUP, STATE_STANDDOWN, STATE_STANDLEFT, STATE_STANDRIGHT};
 	static const int xvAhead[5]  = {9, 0, 0,-1, 1};
@@ -1124,16 +1124,16 @@ void aiMaintBotAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiFourFirerInit(AIEntity *e) {
+void aiFourFirerInit(AIEntity *e, int mx, int my) {
 	e->value1 = 0;
 	e->aiAction = aiFourFirerAction;
 }
 
-void aiFourFirerInit2(AIEntity *e) {
+void aiFourFirerInit2(AIEntity *e, int mx, int my) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiFourFirerAction(AIEntity *e) {
+void aiFourFirerAction(AIEntity *e, int mx, int my) {
 	static const AIState state[5] = {STATE_NONE, STATE_STANDUP, STATE_STANDDOWN, STATE_STANDLEFT, STATE_STANDRIGHT};
 	static const AIDir turn[5] = {DIR_NONE, DIR_RIGHT, DIR_LEFT, DIR_UP, DIR_DOWN};
 
@@ -1226,7 +1226,7 @@ void aiFourFirerAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiDeadEyeInit(AIEntity *e) {
+void aiDeadEyeInit(AIEntity *e, int mx, int my) {
 	e->sequence = 64;
 	e->blinkFrames = e->goalX = 0;
 	if (e->value1 == 1)
@@ -1235,11 +1235,11 @@ void aiDeadEyeInit(AIEntity *e) {
 		e->aiAction = aiDeadEyeAction;
 }
 
-void aiDeadEyeInit2(AIEntity *e) {
+void aiDeadEyeInit2(AIEntity *e, int mx, int my) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiDeadEyeWalkInPlace(AIEntity *e) {
+void aiDeadEyeWalkInPlace(AIEntity *e, int mx, int my) {
 	static const AIState state[5] = {STATE_NONE, STATE_MOVEUP, STATE_MOVEDOWN, STATE_MOVELEFT, STATE_MOVERIGHT};
 
 	e->sequence--;
@@ -1271,7 +1271,7 @@ void aiDeadEyeWalkInPlace(AIEntity *e) {
 	g_hdb->_ai->animEntFrames(e);
 }
 
-void aiDeadEyeAction(AIEntity *e) {
+void aiDeadEyeAction(AIEntity *e, int mx, int my) {
 	static const AIState state[5] = {STATE_NONE, STATE_MOVEUP, STATE_MOVEDOWN, STATE_MOVELEFT, STATE_MOVERIGHT};
 	static const int xvAhead[5] = {9, 0, 0, -1, 1};
 	static const int yvAhead[5] = {9, -1, 1, 0, 0};
@@ -1442,13 +1442,13 @@ void aiDeadEyeAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiLaserInit(AIEntity *e) {
+void aiLaserInit(AIEntity *e, int mx, int my) {
 	e->aiDraw = aiLaserDraw;
 	// start & end of laser beam
 	e->value1 = e->value2 = 0;
 }
 
-void aiLaserInit2(AIEntity *e) {
+void aiLaserInit2(AIEntity *e, int mx, int my) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 	if (!g_hdb->_ai->_gfxLaserbeamUD[0]) {
 		char name[64];
@@ -1469,7 +1469,7 @@ void aiLaserInit2(AIEntity *e) {
 	}
 }
 
-void aiLaserAction(AIEntity *e) {
+void aiLaserAction(AIEntity *e, int mx, int my) {
 	static const int xva[] = {9, 0, 0,-1, 1};
 	static const int yva[] = {9,-1, 1, 0, 0};
 
@@ -1552,7 +1552,7 @@ void aiLaserAction(AIEntity *e) {
 					g_hdb->_ai->killPlayer(DEATH_FRIED);
 				else if (hit->type == AI_BOOMBARREL && hit->state != STATE_EXPLODING && onEvenTile(hit->x, hit->y)) {
 					// hit BOOM BARREL = explodes
-					aiBarrelExplode(hit);
+					aiBarrelExplode(hit, 0, 0);
 					aiBarrelBlowup(hit, nx, ny);
 				} else if (hit->type == AI_LIGHTBARREL || hit->type == AI_HEAVYBARREL || hit->type == AI_CRATE) {
 					// hit LIGHT/HEAVY BARREL = blocking
@@ -1686,14 +1686,14 @@ void aiLaserDraw(AIEntity *e, int mx, int my) {
 //
 //-------------------------------------------------------------------
 
-void aiDiverterInit(AIEntity *e) {
+void aiDiverterInit(AIEntity *e, int mx, int my) {
 	e->aiDraw = aiDiverterDraw;
 	e->aiAction = aiDiverterAction;
 	e->moveSpeed = kPlayerMoveSpeed << 1;
 	e->dir2 = e->dir;
 }
 
-void aiDiverterInit2(AIEntity *e) {
+void aiDiverterInit2(AIEntity *e, int mx, int my) {
 	e->movedownGfx[0] = e->standdownGfx[0];
 	e->moveupGfx[0] = e->standupGfx[0];
 	e->moveleftGfx[0] = e->standleftGfx[0];
@@ -1732,7 +1732,7 @@ void aiDiverterInit2(AIEntity *e) {
 	g_hdb->_ai->_laserRescan = true;
 }
 
-void aiDiverterAction(AIEntity *e) {
+void aiDiverterAction(AIEntity *e, int mx, int my) {
 	if (e->goalX) {
 		g_hdb->_ai->animateEntity(e);
 		g_hdb->_ai->_laserRescan = true;
@@ -1860,7 +1860,7 @@ void aiDiverterDraw(AIEntity *e, int mx, int my) {
 //
 //-------------------------------------------------------------------
 
-void aiMeerkatInit(AIEntity *e) {
+void aiMeerkatInit(AIEntity *e, int mx, int my) {
 	e->state = STATE_NONE;
 	e->sequence = 0;
 	if (e->value1 == 1) {
@@ -1870,7 +1870,7 @@ void aiMeerkatInit(AIEntity *e) {
 		e->aiAction = aiMeerkatAction;
 }
 
-void aiMeerkatInit2(AIEntity *e) {
+void aiMeerkatInit2(AIEntity *e, int mx, int my) {
 	//  hidden at the start!
 	e->draw = nullptr;
 
@@ -1894,7 +1894,7 @@ void aiMeerkatDraw(AIEntity *e, int mx, int my) {
 	g_hdb->_gfx->drawText(word);
 }
 
-void aiMeerkatAction(AIEntity *e) {
+void aiMeerkatAction(AIEntity *e, int mx, int my) {
 	static const int gem_xv[] = { 0, 0,-2,-3,-4,-4,-3,-2,-2,-2,-2,-1,-1, 100};
 	static const int gem_yv[] = {-6,-5,-4,-3,-2,-1, 0, 0, 1, 2, 3, 4, 5, 100};
 
@@ -2040,7 +2040,7 @@ void aiMeerkatAction(AIEntity *e) {
 	}
 }
 
-void aiMeerkatLookAround(AIEntity *e) {
+void aiMeerkatLookAround(AIEntity *e, int mx, int my) {
 	g_hdb->_ai->animEntFrames(e);
 }
 
@@ -2051,11 +2051,11 @@ void aiMeerkatLookAround(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiFatFrogInit(AIEntity *e) {
+void aiFatFrogInit(AIEntity *e, int mx, int my) {
 	e->aiAction = aiFatFrogAction;
 }
 
-void aiFatFrogInit2(AIEntity *e) {
+void aiFatFrogInit2(AIEntity *e, int mx, int my) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 	// load tongue tiles
 	switch (e->dir) {
@@ -2095,7 +2095,7 @@ void aiFatFrogInit2(AIEntity *e) {
 	}
 }
 
-void aiFatFrogAction(AIEntity *e) {
+void aiFatFrogAction(AIEntity *e, int mx, int my) {
 	AIEntity *p = g_hdb->_ai->getPlayer();
 
 	switch (e->state) {
@@ -2397,17 +2397,17 @@ void aiFatFrogTongueDraw(AIEntity *e, int mx, int my) {
 //
 //-------------------------------------------------------------------
 
-void aiGoodFairyInit(AIEntity *e) {
+void aiGoodFairyInit(AIEntity *e, int mx, int my) {
 	e->aiAction = aiGoodFairyAction;
 	e->sequence = 20;
 	e->blinkFrames = e->goalX = 0;
 }
 
-void aiGoodFairyInit2(AIEntity *e) {
+void aiGoodFairyInit2(AIEntity *e, int mx, int my) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiGoodFairyAction(AIEntity *e) {
+void aiGoodFairyAction(AIEntity *e, int mx, int my) {
 	static const AIState state[5] = {STATE_NONE, STATE_MOVEUP, STATE_MOVEDOWN, STATE_MOVELEFT, STATE_MOVERIGHT};
 	static const int xvAhead[5] = {9, 0, 0,-1, 1};
 	static const int yvAhead[5] = {9,-1, 1, 0, 0};
@@ -2598,17 +2598,17 @@ void aiGoodFairyAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiBadFairyInit(AIEntity *e) {
+void aiBadFairyInit(AIEntity *e, int mx, int my) {
 	e->aiAction = aiBadFairyAction;
 	e->sequence = 20;
 	e->blinkFrames = e->goalX = 0;
 }
 
-void aiBadFairyInit2(AIEntity *e) {
+void aiBadFairyInit2(AIEntity *e, int mx, int my) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiBadFairyAction(AIEntity *e) {
+void aiBadFairyAction(AIEntity *e, int mx, int my) {
 	static const AIState state[5] = {STATE_NONE, STATE_MOVEUP, STATE_MOVEDOWN, STATE_MOVELEFT, STATE_MOVERIGHT};
 	static const AIDir opposite[5] = {DIR_NONE, DIR_DOWN, DIR_UP, DIR_RIGHT, DIR_LEFT};
 	static const int xvAhead[5] = {9, 0, 0,-1, 1};
@@ -2733,15 +2733,15 @@ void aiBadFairyAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiGatePuddleInit(AIEntity *e) {
+void aiGatePuddleInit(AIEntity *e, int mx, int my) {
 	e->aiAction = aiGatePuddleAction;
 	e->value1 = 50;
 }
 
-void aiGatePuddleInit2(AIEntity *e) {
+void aiGatePuddleInit2(AIEntity *e, int mx, int my) {
 }
 
-void aiGatePuddleAction(AIEntity *e) {
+void aiGatePuddleAction(AIEntity *e, int mx, int my) {
 	static const int xva[5] = {9, 0, 0,-1, 1};
 	static const int yva[5] = {9,-1, 1, 0, 0};
 
@@ -2873,7 +2873,7 @@ void aiGatePuddleAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiIcePuffSnowballInit(AIEntity *e) {
+void aiIcePuffSnowballInit(AIEntity *e, int mx, int my) {
 	// which direction are we throwing in? Load the graphic if we need to
 	switch (e->dir) {
 	case DIR_DOWN:
@@ -2894,7 +2894,7 @@ void aiIcePuffSnowballInit(AIEntity *e) {
 	e->aiDraw = aiIcePuffSnowballDraw;
 }
 
-void aiIcePuffSnowballAction(AIEntity *e) {
+void aiIcePuffSnowballAction(AIEntity *e, int mx, int my) {
 	// check for hit BEFORE moving so snowball is closer to object
 	// NOTE: Need to do logic in this draw routine just in case the ICEPUFF gets stunned!
 	int result;
@@ -2934,7 +2934,7 @@ void aiIcePuffSnowballAction(AIEntity *e) {
 void aiIcePuffSnowballDraw(AIEntity *e, int mx, int my) {
 	// did we throw a snowball?  make it move!
 	if (e->dir2 != DIR_NONE)
-		aiIcePuffSnowballAction(e);
+		aiIcePuffSnowballAction(e, 0, 0);
 
 	switch (e->dir2) {
 	case DIR_DOWN:
@@ -2957,7 +2957,7 @@ void aiIcePuffSnowballDraw(AIEntity *e, int mx, int my) {
 	}
 }
 
-void aiIcePuffInit(AIEntity *e) {
+void aiIcePuffInit(AIEntity *e, int mx, int my) {
 	// PEEK - but no head up yet
 	e->sequence = 30;				// timed sequence for peeking
 	e->state = STATE_ICEP_PEEK;			// start in PEEK mode
@@ -2965,12 +2965,12 @@ void aiIcePuffInit(AIEntity *e) {
 	e->aiAction = aiIcePuffAction;
 }
 
-void aiIcePuffInit2(AIEntity *e) {
+void aiIcePuffInit2(AIEntity *e, int mx, int my) {
 	// empty frame
 	e->draw = e->blinkGfx[3];
 }
 
-void aiIcePuffAction(AIEntity *e) {
+void aiIcePuffAction(AIEntity *e, int mx, int my) {
 	AIEntity *p = g_hdb->_ai->getPlayer();
 
 	switch (e->state) {
@@ -3066,7 +3066,7 @@ void aiIcePuffAction(AIEntity *e) {
 			// dir2 = direction snowball is moving
 			e->dir2 = e->dir;
 			// throw it!
-			aiIcePuffSnowballInit(e);
+			aiIcePuffSnowballInit(e, 0, 0);
 			e->animFrame = 0;
 			e->state = STATE_ICEP_DISAPPEAR;
 		} else if (e->animFrame == e->special1Frames) {
@@ -3089,7 +3089,7 @@ void aiIcePuffAction(AIEntity *e) {
 			// dir2 = direction snowball is moving
 			e->dir2 = e->dir;
 			// throw it!
-			aiIcePuffSnowballInit(e);
+			aiIcePuffSnowballInit(e, 0, 0);
 			e->animFrame = 0;
 			e->state = STATE_ICEP_DISAPPEAR;
 		} else if (e->animFrame == e->special1Frames) {
@@ -3112,7 +3112,7 @@ void aiIcePuffAction(AIEntity *e) {
 			// dir2 = direction snowball is moving
 			e->dir2 = e->dir;
 			// throw it!
-			aiIcePuffSnowballInit(e);
+			aiIcePuffSnowballInit(e, 0, 0);
 			e->animFrame = 0;
 			e->state = STATE_ICEP_DISAPPEAR;
 		} else if (e->animFrame == e->special1Frames) {
@@ -3136,14 +3136,14 @@ void aiIcePuffAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiBuzzflyInit(AIEntity *e) {
+void aiBuzzflyInit(AIEntity *e, int mx, int my) {
 	e->aiAction = aiBuzzflyAction;
 	e->sequence = 0;
 
 	g_hdb->_ai->findPath(e);
 }
 
-void aiBuzzflyInit2(AIEntity *e) {
+void aiBuzzflyInit2(AIEntity *e, int mx, int my) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 	for (int i = 0; i < e->movedownFrames; i++) {
 		e->standdownGfx[i] = e->movedownGfx[i];
@@ -3157,7 +3157,7 @@ void aiBuzzflyInit2(AIEntity *e) {
 	e->standrightFrames = e->moverightFrames;
 }
 
-void aiBuzzflyAction(AIEntity *e) {
+void aiBuzzflyAction(AIEntity *e, int mx, int my) {
 	if (!e->goalX) {
 		switch (e->sequence) {
 		case 0:
@@ -3205,7 +3205,7 @@ void aiBuzzflyAction(AIEntity *e) {
 //
 //-------------------------------------------------------------------
 
-void aiDragonInit(AIEntity *e) {
+void aiDragonInit(AIEntity *e, int mx, int my) {
 	e->state = STATE_STANDDOWN;
 	e->sequence = 0;	// 0 = sleeping
 	e->aiAction = aiDragonAction;
@@ -3233,7 +3233,7 @@ void aiDragonInit(AIEntity *e) {
 	sprintf(block->luaFuncUse, "%03d%03d", e->tileX, e->tileY);
 }
 
-void aiDragonInit2(AIEntity *e) {
+void aiDragonInit2(AIEntity *e, int mx, int my) {
 	e->draw = nullptr;
 	if (!g_hdb->_ai->_gfxDragonAsleep) {
 		g_hdb->_ai->_gfxDragonAsleep = g_hdb->_gfx->loadPic(DRAGON_ASLEEP);
@@ -3245,18 +3245,18 @@ void aiDragonInit2(AIEntity *e) {
 	}
 }
 
-void aiDragonWake(AIEntity *e) {
+void aiDragonWake(AIEntity *e, int mx, int my) {
 	// woke up, start flapping and breathing!
 	e->sequence = 1;
 	e->animFrame = 0;
 	e->animDelay = e->animCycle;
 }
 
-void aiDragonUse(AIEntity *e) {
-	aiDragonWake(e);
+void aiDragonUse(AIEntity *e, int mx, int my) {
+	aiDragonWake(e, 0, 0);
 }
 
-void aiDragonAction(AIEntity *e) {
+void aiDragonAction(AIEntity *e, int mx, int my) {
 	AIEntity *p = g_hdb->_ai->getPlayer();
 
 	switch (e->sequence) {
@@ -3269,7 +3269,7 @@ void aiDragonAction(AIEntity *e) {
 			p->tileY >= e->tileY - 3) {
 			if ((p->state >= STATE_ATK_CLUB_UP &&
 				p->state <= STATE_ATK_SLUG_RIGHT) || g_hdb->_window->inPanicZone()) {
-				aiDragonWake(e);
+				aiDragonWake(e, 0, 0);
 				if (e->onScreen)
 					g_hdb->_sound->playSound(SND_DRAGON_WAKE);
 			}
@@ -3331,11 +3331,11 @@ void aiDragonAction(AIEntity *e) {
 					break;
 				case AI_MAGIC_EGG:
 				case AI_ICE_BLOCK:
-					aiMagicEggUse(hit);
+					aiMagicEggUse(hit, 0, 0);
 					break;
 				default:
 					if (hit->aiUse)
-						hit->aiUse(hit);
+						hit->aiUse(hit, 0, 0);
 					if (hit->luaFuncUse[0])
 						g_hdb->_lua->callFunction(hit->luaFuncUse, 0);
 				}
diff --git a/engines/hdb/ai-funcs.cpp b/engines/hdb/ai-funcs.cpp
index 84bf752e833..73a2938c947 100644
--- a/engines/hdb/ai-funcs.cpp
+++ b/engines/hdb/ai-funcs.cpp
@@ -427,9 +427,9 @@ bool AI::cacheEntGfx(AIEntity *e, bool initFlag) {
 			e->aiInit = aiEntList[i].initFunc;
 			e->aiInit2 = aiEntList[i].initFunc2;
 			if (initFlag) {
-				e->aiInit(e);
+				e->aiInit(e, 0, 0);
 				if (e->aiInit2)
-					e->aiInit2(e);
+					e->aiInit2(e, 0, 0);
 
 				if (e->luaFuncInit[0]) {
 					g_hdb->_lua->callFunction(e->luaFuncInit, 2);
@@ -443,7 +443,7 @@ bool AI::cacheEntGfx(AIEntity *e, bool initFlag) {
 						Common::strlcpy(e->printedName, str2, 32);
 				}
 			} else if (e->aiInit2)
-				e->aiInit2(e);
+				e->aiInit2(e, 0, 0);
 
 			break; // Entity Initiated
 		}
@@ -610,7 +610,7 @@ bool AI::useLuaEntity(const char *initName) {
 	for (Common::Array<AIEntity *>::iterator it = _ents->begin(); it != _ents->end(); ++it) {
 		AIEntity *e = *it;
 		if (!scumm_stricmp(initName, e->entityName)) {
-			e->aiUse(e);
+			e->aiUse(e, 0, 0);
 			checkActionList(e, e->tileX, e->tileY, true);
 			if (e->luaFuncUse[0])
 				g_hdb->_lua->callFunction(e->luaFuncUse, 0);
@@ -719,7 +719,7 @@ void AI::setEntityGoal(AIEntity *e, int x, int y) {
 // Initializes each entity after map is loaded
 void AI::initAllEnts() {
 	for (Common::Array<AIEntity *>::iterator it = _ents->begin(); it != _ents->end(); ++it) {
-		(*it)->aiInit((*it));
+		(*it)->aiInit((*it), 0, 0);
 		if ((*it)->luaFuncInit[0]) {
 			if (g_hdb->_lua->callFunction((*it)->luaFuncInit, 2)) {
 				Common::strlcpy((*it)->entityName, g_hdb->_lua->getStringOffStack(), 32);
@@ -1244,7 +1244,7 @@ void AI::animateEntity(AIEntity *e) {
 						g_hdb->_sound->playSound(SND_SPLASH);
 					} else if (!checkFloating(e->tileX, e->tileY)) {
 						if (e->type == AI_BOOMBARREL) {
-							aiBarrelExplode(e);
+							aiBarrelExplode(e, 0, 0);
 							aiBarrelBlowup(e, e->tileX, e->tileY);
 							return;
 						} else {
@@ -1570,7 +1570,7 @@ void AI::animEntFrames(AIEntity *e) {
 		max = e->special1Frames;
 		if (e->type == AI_BOOMBARREL) {
 			// while exploding, call this function
-			aiBarrelExplodeSpread(e);
+			aiBarrelExplodeSpread(e, 0, 0);
 			if (e->animFrame == max - 1) {
 				removeEntity(e);
 				return;
@@ -1919,7 +1919,7 @@ void AI::moveEnts() {
 	// Call aiAction for Floating Entities
 	for (Common::Array<AIEntity *>::iterator it = _floats->begin(); it != _floats->end(); ++it) {
 		if ((*it)->aiAction)
-			(*it)->aiAction((*it));
+			(*it)->aiAction((*it), 0, 0);
 	}
 
 	// Call aiAction for all other Entities
@@ -1941,7 +1941,7 @@ void AI::moveEnts() {
 			}
 			// Stunned Entity Timer
 			if (!e->stunnedWait)
-				e->aiAction(e);
+				e->aiAction(e, 0, 0);
 			else if (e->stunnedWait < (int32)g_hdb->getTimeSlice())
 				e->stunnedWait = 0;
 		}
@@ -2136,7 +2136,7 @@ void AI::laserScan() {
 	for (uint i = 0; i < _ents->size(); i++) {
 		AIEntity *e = _ents->operator[](i);
 		if (e->type == AI_LASER)
-			aiLaserAction(e);
+			aiLaserAction(e, 0, 0);
 	}
 }
 
diff --git a/engines/hdb/ai-init.cpp b/engines/hdb/ai-init.cpp
index 601b56f9332..553612fd1e7 100644
--- a/engines/hdb/ai-init.cpp
+++ b/engines/hdb/ai-init.cpp
@@ -646,6 +646,7 @@ AIEntTypeInfo aiEntList[] = {
 	{ ITEM_ROBOSTUNNER,		"ITEM_ROBOSTUNNER",		&roboStunner[0],		aiRoboStunnerInit,		aiRoboStunnerInit2  },
 	{ ITEM_SLUGSLINGER,		"ITEM_SLUGSLINGER",		&slugSlinger[0],		aiSlugSlingerInit,		aiSlugSlingerInit2  },
 
+
 	{ ITEM_ENV_GREEN,		"ITEM_ENV_GREEN",		&envelopeGreen[0],		aiEnvelopeGreenInit,	aiEnvelopeGreenInit2  },
 	{ ITEM_GEM_BLUE,		"ITEM_GEM_BLUE",		&gemBlue[0],			aiGemBlueInit,			aiGemBlueInit2  },
 	{ ITEM_GEM_RED,			"ITEM_GEM_RED",			&gemRed[0],				aiGemRedInit,			aiGemRedInit2  },
@@ -894,22 +895,16 @@ static struct {
 	{aiIceBlockInit,			"aiIceBlockInit"},
 	{aiIceBlockInit2,			"aiIceBlockInit2"},
 	{aiIceBlockAction,			"aiIceBlockAction"},
-	{nullptr, nullptr}
-};
+	{aiPlayerDraw,				"aiPlayerDraw"},
+	{aiShockBotShock,			"aiShockBotShock"},
+	{aiSlugAttackDraw,			"aiSlugAttackDraw"},
+	{aiLaserDraw,				"aiLaserDraw"},
+	{aiDiverterDraw,			"aiDiverterDraw"},
+	{aiMeerkatDraw,				"aiMeerkatDraw"},
+	{aiFatFrogTongueDraw,		"aiFatFrogTongueDraw"},
+	{aiIcePuffSnowballDraw,		"aiIcePuffSnowballDraw"},
+	{aiDragonDraw,				"aiDragonDraw"},
 
-static struct {
-	EntFuncPtr function;
-	const char *funcName;
-} aiEntFuncList[] = {
-	{aiPlayerDraw,			"aiPlayerDraw"},
-	{aiShockBotShock,		"aiShockBotShock"},
-	{aiSlugAttackDraw,		"aiSlugAttackDraw"},
-	{aiLaserDraw,			"aiLaserDraw"},
-	{aiDiverterDraw,		"aiDiverterDraw"},
-	{aiMeerkatDraw,			"aiMeerkatDraw"},
-	{aiFatFrogTongueDraw,	"aiFatFrogTongueDraw"},
-	{aiIcePuffSnowballDraw,	"aiIcePuffSnowballDraw"},
-	{aiDragonDraw,			"aiDragonDraw"},
 	{nullptr, nullptr}
 };
 
@@ -1265,12 +1260,6 @@ const char *AI::funcLookUp(FuncPtr function) {
 			return aiFuncList[i].funcName;
 		i++;
 	}
-	i = 0;
-	while (aiEntFuncList[i].funcName) {
-		if ((FuncPtr)aiEntFuncList[i].function == function)
-			return aiEntFuncList[i].funcName;
-		i++;
-	}
 	return nullptr;
 }
 
@@ -1284,12 +1273,6 @@ FuncPtr AI::funcLookUp(const char *function) {
 			return aiFuncList[i].function;
 		i++;
 	}
-	i = 0;
-	while (aiEntFuncList[i].funcName) {
-		if (!scumm_stricmp(aiEntFuncList[i].funcName, function))
-			return (FuncPtr)aiEntFuncList[i].function;
-		i++;
-	}
 	return nullptr;
 }
 
diff --git a/engines/hdb/ai-lists.cpp b/engines/hdb/ai-lists.cpp
index 8ddf30de5f0..6252840e091 100644
--- a/engines/hdb/ai-lists.cpp
+++ b/engines/hdb/ai-lists.cpp
@@ -525,7 +525,7 @@ bool AI::autoActive(int x, int y) {
 
 CallbackDef allCallbacks[] = {
 	{NO_FUNCTION, nullptr},
-	{AI_BARREL_EXPLOSION_END, aiBarrelExplosionEnd},
+	{AI_BARREL_EXPLOSION_END, callbackAiBarrelExplosionEnd},
 	{CALLBACK_DOOR_OPEN_CLOSE, callbackDoorOpenClose},
 	{CALLBACK_AUTODOOR_OPEN_CLOSE, callbackAutoDoorOpenClose},
 	{CALLBACK_END, nullptr}
diff --git a/engines/hdb/ai-player.cpp b/engines/hdb/ai-player.cpp
index eb1bc48e6f5..29ed9afd7b2 100644
--- a/engines/hdb/ai-player.cpp
+++ b/engines/hdb/ai-player.cpp
@@ -35,7 +35,7 @@
 
 namespace HDB {
 
-void aiPlayerInit(AIEntity *e) {
+void aiPlayerInit(AIEntity *e, int mx, int my) {
 	g_hdb->_ai->clearInventory();
 	e->aiAction = aiPlayerAction;
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
@@ -63,7 +63,7 @@ void aiPlayerInit(AIEntity *e) {
 	g_hdb->_ai->assignPlayer(e);
 }
 
-void aiPlayerInit2(AIEntity *e) {
+void aiPlayerInit2(AIEntity *e, int mx, int my) {
 	if (!g_hdb->_ai->_clubUpGfx[0]) {
 		g_hdb->_ai->_weaponSelGfx = g_hdb->_gfx->loadTile(TILE_WEAPON_EQUIPPED);
 		g_hdb->_ai->_clubUpGfx[0] = g_hdb->_gfx->getPicGfx(CLUBUP1, -1);
@@ -116,7 +116,7 @@ void aiPlayerInit2(AIEntity *e) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiPlayerAction(AIEntity *e) {
+void aiPlayerAction(AIEntity *e, int mx, int my) {
 	static const AIState stand[5] = {STATE_NONE, STATE_STANDUP, STATE_STANDDOWN, STATE_STANDLEFT, STATE_STANDRIGHT};
 	static const int xvAhead[5] = {9, 0, 0, -1, 1};
 	static const int yvAhead[5] = {9, -1, 1, 0, 0};
@@ -501,7 +501,7 @@ void aiPlayerDraw(AIEntity *e, int mx, int my) {
 	}
 }
 
-void aiGemAttackInit(AIEntity *e) {
+void aiGemAttackInit(AIEntity *e, int mx, int my) {
 	static const int xv[5] = {9, 0, 0, -1, 1};
 	static const int yv[5] = {9, -1, 1, 0, 0};
 
@@ -514,7 +514,7 @@ void aiGemAttackInit(AIEntity *e) {
 	g_hdb->_sound->playSound(SND_GEM_THROW);
 }
 
-void aiGemAttackAction(AIEntity *e) {
+void aiGemAttackAction(AIEntity *e, int mx, int my) {
 	static const int xv[5] = {9, 0, 0, -1, 1};
 	static const int yv[5] = {9, -1, 1, 0, 0};
 
@@ -554,14 +554,14 @@ void aiGemAttackAction(AIEntity *e) {
 						g_hdb->_sound->playSound(SND_CLUB_HIT_FLESH);
 						AIEntity *found = g_hdb->_ai->findEntity(atoi(num1), atoi(num2));
 						if (found)
-							aiDragonWake(found);
+							aiDragonWake(found, 0, 0);
 					}
 					g_hdb->_ai->addAnimateTarget(e->x, e->y, 0, 3, ANIM_NORMAL, false, false, GEM_FLASH);
 					g_hdb->_sound->playSound(SND_INV_SELECT);
 					break;
 				case AI_DRAGON:
 					g_hdb->_sound->playSound(SND_CLUB_HIT_FLESH);
-					aiDragonWake(hit);
+					aiDragonWake(hit, 0, 0);
 					// fallthrough
 				default:
 					g_hdb->_ai->addAnimateTarget(e->x, e->y, 0, 3, ANIM_NORMAL, false, false, GEM_FLASH);
@@ -618,13 +618,13 @@ void aiGemAttackAction(AIEntity *e) {
 	}
 }
 
-void aiChickenAction(AIEntity *e) {
+void aiChickenAction(AIEntity *e, int mx, int my) {
 	static int delay = 64;
 
 	if (g_hdb->_map->checkEntOnScreen(e) && !delay) {
 		g_hdb->_sound->playSound(SND_CHICKEN_AMBIENT);
 		delay = g_hdb->_rnd->getRandomNumber(127) + 160;
-		aiChickenUse(e);
+		aiChickenUse(e, 0, 0);
 	}
 
 	if (delay)
@@ -636,39 +636,39 @@ void aiChickenAction(AIEntity *e) {
 		g_hdb->_ai->animEntFrames(e);
 }
 
-void aiChickenUse(AIEntity *e) {
+void aiChickenUse(AIEntity *e, int mx, int my) {
 	g_hdb->_sound->playSound(SND_CHICKEN_BAGAWK);
 }
 
-void aiChickenInit(AIEntity *e) {
+void aiChickenInit(AIEntity *e, int mx, int my) {
 	e->aiUse = aiChickenUse;
 	e->aiAction = aiChickenAction;
 }
 
-void aiChickenInit2(AIEntity *e) {
+void aiChickenInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiDollyInit(AIEntity *e) {
+void aiDollyInit(AIEntity *e, int mx, int my) {
 	e->moveSpeed = kPlayerMoveSpeed >> 1;
 	e->aiAction = aiGenericAction;
 }
 
-void aiDollyInit2(AIEntity *e) {
+void aiDollyInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->movedownGfx[0];
 }
 
-void aiSergeantInit(AIEntity *e) {
+void aiSergeantInit(AIEntity *e, int mx, int my) {
 	e->moveSpeed = kPlayerMoveSpeed >> 1;
 	if (e->value1)
 		e->aiAction = aiSergeantAction;
 }
 
-void aiSergeantInit2(AIEntity *e) {
+void aiSergeantInit2(AIEntity *e, int mx, int my) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiSergeantAction(AIEntity *e) {
+void aiSergeantAction(AIEntity *e, int mx, int my) {
 	if (e->goalX) {
 		g_hdb->_sound->playSound(SND_FOOTSTEPS);
 		g_hdb->_ai->animateEntity(e);
@@ -676,13 +676,13 @@ void aiSergeantAction(AIEntity *e) {
 		g_hdb->_ai->animEntFrames(e);
 }
 
-void aiSpacedudeInit(AIEntity *e) {
+void aiSpacedudeInit(AIEntity *e, int mx, int my) {
 	e->moveSpeed = kPlayerMoveSpeed >> 1;
 	if (e->value1)
 		e->aiAction = aiGenericAction;
 }
 
-void aiSpacedudeInit2(AIEntity *e) {
+void aiSpacedudeInit2(AIEntity *e, int mx, int my) {
 	e->standdownFrames = 1;
 	e->standdownGfx[0] = e->movedownGfx[0];
 	e->standupFrames = 1;
@@ -694,7 +694,7 @@ void aiSpacedudeInit2(AIEntity *e) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiCrateAction(AIEntity *e) {
+void aiCrateAction(AIEntity *e, int mx, int my) {
 	// if crate isn't moving somewhere, don't move it
 	if (!e->goalX) {
 		// crate is stopped in the water... should it continue downstream?
@@ -716,7 +716,7 @@ void aiCrateAction(AIEntity *e) {
 	g_hdb->_ai->animateEntity(e);
 }
 
-void aiCrateInit2(AIEntity *e) {
+void aiCrateInit2(AIEntity *e, int mx, int my) {
 	// point all crate move frames to the standing one
 	e->movedownFrames =
 		e->moveleftFrames =
@@ -731,13 +731,13 @@ void aiCrateInit2(AIEntity *e) {
 	e->draw = e->standdownGfx[0];			// standing frame - doesn't move
 }
 
-void aiCrateInit(AIEntity *e) {
+void aiCrateInit(AIEntity *e, int mx, int my) {
 	e->moveSpeed = kPushMoveSpeed;
 	e->aiAction = aiCrateAction;
 	e->value1 = 0;
 }
 
-void aiBarrelLightAction(AIEntity *e) {
+void aiBarrelLightAction(AIEntity *e, int mx, int my) {
 	if (!e->goalX) {
 		if (e->state == STATE_FLOATING)
 			g_hdb->_ai->animEntFrames(e);
@@ -747,7 +747,7 @@ void aiBarrelLightAction(AIEntity *e) {
 	g_hdb->_ai->animateEntity(e);
 }
 
-void aiBarrelLightInit2(AIEntity *e) {
+void aiBarrelLightInit2(AIEntity *e, int mx, int my) {
 	// point all light barrel move frames to the standing one
 	e->movedownFrames =
 		e->moveleftFrames =
@@ -762,12 +762,12 @@ void aiBarrelLightInit2(AIEntity *e) {
 	e->draw = e->standdownGfx[0];			// standing frame - doesn't move
 }
 
-void aiBarrelLightInit(AIEntity *e) {
+void aiBarrelLightInit(AIEntity *e, int mx, int my) {
 	e->moveSpeed = kPushMoveSpeed;
 	e->aiAction = aiBarrelLightAction;
 }
 
-void aiBarrelHeavyAction(AIEntity *e) {
+void aiBarrelHeavyAction(AIEntity *e, int mx, int my) {
 	if (!e->goalX) {
 		if (e->state == STATE_FLOATING)
 			g_hdb->_ai->animEntFrames(e);
@@ -777,7 +777,7 @@ void aiBarrelHeavyAction(AIEntity *e) {
 	g_hdb->_ai->animateEntity(e);
 }
 
-void aiBarrelHeavyInit2(AIEntity *e) {
+void aiBarrelHeavyInit2(AIEntity *e, int mx, int my) {
 	// point all heavy barrel move frames to the standing one
 	e->movedownFrames =
 		e->moveleftFrames =
@@ -792,12 +792,12 @@ void aiBarrelHeavyInit2(AIEntity *e) {
 	e->draw = e->standdownGfx[0];			// standing frame - doesn't move
 }
 
-void aiBarrelHeavyInit(AIEntity *e) {
+void aiBarrelHeavyInit(AIEntity *e, int mx, int my) {
 	e->moveSpeed = kPushMoveSpeed;
 	e->aiAction = aiBarrelHeavyAction;
 }
 
-void aiBarrelExplode(AIEntity *e) {
+void aiBarrelExplode(AIEntity *e, int mx, int my) {
 	e->state = STATE_EXPLODING;
 	e->animDelay = e->animCycle;
 	e->animFrame = 0;
@@ -808,13 +808,13 @@ void aiBarrelExplode(AIEntity *e) {
 	g_hdb->_map->setBoomBarrel(e->tileX, e->tileY, 0);
 }
 
-void aiBarrelExplodeInit(AIEntity *e) {
+void aiBarrelExplodeInit(AIEntity *e, int mx, int my) {
 	e->moveSpeed = kPushMoveSpeed;
 	e->aiAction = aiBarrelExplodeAction;
 	g_hdb->_map->setBoomBarrel(e->tileX, e->tileY, 1);
 }
 
-void aiBarrelExplodeInit2(AIEntity *e) {
+void aiBarrelExplodeInit2(AIEntity *e, int mx, int my) {
 	// point all exploding barrel MOVE frames to the standing one
 	e->blinkFrames =
 		e->movedownFrames =
@@ -831,14 +831,14 @@ void aiBarrelExplodeInit2(AIEntity *e) {
 	e->draw = e->standdownGfx[0];			// standing frame - doesn't move
 }
 
-void aiBarrelExplodeAction(AIEntity *e) {
+void aiBarrelExplodeAction(AIEntity *e, int mx, int my) {
 	if (e->goalX)
 		g_hdb->_ai->animateEntity(e);
 	else if (e->state == STATE_EXPLODING)
 		g_hdb->_ai->animEntFrames(e);
 }
 
-void aiBarrelExplodeSpread(AIEntity *e) {
+void aiBarrelExplodeSpread(AIEntity *e, int mx, int my) {
 	static const int xv1[4] = {-1,  1, -1,  0};
 	static const int yv1[4] = {-1, -1,  0, -1};
 	static const int xv2[4] = {1,  0,  1, -1};
@@ -868,7 +868,7 @@ void aiBarrelExplodeSpread(AIEntity *e) {
 				g_hdb->_ai->killPlayer(DEATH_FRIED);
 				break;
 			case AI_BOOMBARREL:
-				aiBarrelExplode(e2);
+				aiBarrelExplode(e2, 0, 0);
 				break;
 			case AI_OMNIBOT:
 			case AI_TURNBOT:
@@ -912,7 +912,7 @@ void aiBarrelExplodeSpread(AIEntity *e) {
 				g_hdb->_ai->killPlayer(DEATH_FRIED);
 				break;
 			case AI_BOOMBARREL:
-				aiBarrelExplode(e2);
+				aiBarrelExplode(e2, 0, 0);
 				break;
 			case AI_OMNIBOT:
 			case AI_TURNBOT:
@@ -941,7 +941,7 @@ void aiBarrelExplodeSpread(AIEntity *e) {
 	}
 }
 
-void aiBarrelExplosionEnd(int x, int y) {
+void callbackAiBarrelExplosionEnd(int x, int y) {
 	g_hdb->_map->setExplosion(x, y, 0);
 }
 
@@ -952,7 +952,7 @@ void aiBarrelBlowup(AIEntity *e, int x, int y) {
 	g_hdb->_ai->addCallback(AI_BARREL_EXPLOSION_END, x, y, e->animCycle * 4);
 }
 
-void aiScientistInit(AIEntity *e) {
+void aiScientistInit(AIEntity *e, int x, int y) {
 	e->moveSpeed = kPlayerMoveSpeed >> 1;
 	if (g_hdb->_ai->findPath(e))
 		e->aiAction = aiGenericAction;
@@ -960,11 +960,11 @@ void aiScientistInit(AIEntity *e) {
 		e->aiAction = aiGenericAction;
 }
 
-void aiScientistInit2(AIEntity *e) {
+void aiScientistInit2(AIEntity *e, int x, int y) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiSlugAttackAction(AIEntity *e) {
+void aiSlugAttackAction(AIEntity *e, int x, int y) {
 	static const int xv[5] = {9, 0, 0, -1, 1};
 	static const int yv[5] = {9, -1, 1, 0, 0};
 
@@ -1038,7 +1038,7 @@ void aiSlugAttackAction(AIEntity *e) {
 			break;
 		case AI_BOOMBARREL:
 			g_hdb->_sound->playSound(SND_CLUB_HIT_METAL);
-			aiBarrelExplode(hit);
+			aiBarrelExplode(hit, 0, 0);
 			aiBarrelBlowup(hit, hit->tileX, hit->tileY);
 			break;
 			// ACTION MODE entities go away - except the FOURFIRER
@@ -1066,12 +1066,12 @@ void aiSlugAttackAction(AIEntity *e) {
 				g_hdb->_sound->playSound(SND_CLUB_HIT_FLESH);
 				AIEntity *found = g_hdb->_ai->findEntity(atoi(num1), atoi(num2));
 				if (found)
-					aiDragonWake(found);
+					aiDragonWake(found, 0, 0);
 				g_hdb->_ai->addAnimateTarget(e->x, e->y, 0, 3, ANIM_NORMAL, false, false, GEM_FLASH);
 			}
 			break;
 		case AI_DRAGON:
-			aiDragonWake(hit);
+			aiDragonWake(hit, 0, 0);
 			break;
 		default:
 			break;
@@ -1093,7 +1093,7 @@ void aiSlugAttackDraw(AIEntity *e, int mx, int my) {
 	g_hdb->_ai->_slugAttackGfx[e->animFrame]->drawMasked(e->x - mx + 8, e->y - my + 8);
 }
 
-void aiSlugAttackInit(AIEntity *e) {
+void aiSlugAttackInit(AIEntity *e, int mx, int my) {
 	static const int xv[5] = {9,  0, 0, -1, 1};
 	static const int yv[5] = {9, -1, 1,  0, 0};
 
@@ -1109,40 +1109,40 @@ void aiSlugAttackInit(AIEntity *e) {
 	g_hdb->_sound->playSound(SND_SLUG_FIRE);
 }
 
-void aiSlugAttackInit2(AIEntity *e) {
+void aiSlugAttackInit2(AIEntity *e, int mx, int my) {
 	e->movedownFrames = 4;
 }
 
-void aiDeadWorkerInit(AIEntity *e) {
+void aiDeadWorkerInit(AIEntity *e, int mx, int my) {
 }
 
-void aiDeadWorkerInit2(AIEntity *e) {
+void aiDeadWorkerInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiWorkerInit(AIEntity *e) {
+void aiWorkerInit(AIEntity *e, int mx, int my) {
 	if (e->value1)
 		e->aiAction = aiGenericAction;
 	e->moveSpeed = kPlayerMoveSpeed >> 1;
 }
 
-void aiWorkerInit2(AIEntity *e) {
+void aiWorkerInit2(AIEntity *e, int mx, int my) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiAccountantInit(AIEntity *e) {
+void aiAccountantInit(AIEntity *e, int mx, int my) {
 }
 
-void aiAccountantInit2(AIEntity *e) {
+void aiAccountantInit2(AIEntity *e, int mx, int my) {
 	e->draw = g_hdb->_ai->getStandFrameDir(e);
 }
 
-void aiFrogStatueInit(AIEntity *e) {
+void aiFrogStatueInit(AIEntity *e, int mx, int my) {
 	e->moveSpeed = kPushMoveSpeed;
 	e->aiAction = aiFrogStatueAction;
 }
 
-void aiFrogStatueInit2(AIEntity *e) {
+void aiFrogStatueInit2(AIEntity *e, int mx, int my) {
 	// point all frog statue MOVE frames to the standing one
 	e->blinkFrames =
 		e->movedownFrames =
@@ -1159,7 +1159,7 @@ void aiFrogStatueInit2(AIEntity *e) {
 	e->draw = e->standdownGfx[0];			// standing frame - doesn't move
 }
 
-void aiFrogStatueAction(AIEntity *e) {
+void aiFrogStatueAction(AIEntity *e, int mx, int my) {
 	// if frog statue isn't moving somewhere, don't move it
 	if (!e->goalX)
 		return;
@@ -1167,261 +1167,261 @@ void aiFrogStatueAction(AIEntity *e) {
 	g_hdb->_ai->animateEntity(e);
 }
 
-void aiRoboStunnerAction(AIEntity *e) {
+void aiRoboStunnerAction(AIEntity *e, int mx, int my) {
 	aiAnimateStanddown(e, 1);
-	aiGetItemAction(e);
+	aiGetItemAction(e, 0, 0);
 }
 
-void aiRoboStunnerInit(AIEntity *e) {
+void aiRoboStunnerInit(AIEntity *e, int mx, int my) {
 	e->aiAction = aiRoboStunnerAction;
 	Common::strlcpy(e->printedName, "Robostunner", 32);
 }
 
-void aiRoboStunnerInit2(AIEntity *e) {
+void aiRoboStunnerInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiClubInit(AIEntity *e) {
+void aiClubInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "Creature Clubber", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiClubInit2(AIEntity *e) {
+void aiClubInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiSlugSlingerInit(AIEntity *e) {
+void aiSlugSlingerInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "Slugslinger", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiSlugSlingerInit2(AIEntity *e) {
+void aiSlugSlingerInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiEnvelopeGreenInit(AIEntity *e) {
+void aiEnvelopeGreenInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "Green envelope", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiEnvelopeGreenInit2(AIEntity *e) {
+void aiEnvelopeGreenInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiGemBlueInit(AIEntity *e) {
+void aiGemBlueInit(AIEntity *e, int mx, int my) {
 	e->aiAction = aiGemAction;
 }
 
-void aiGemBlueInit2(AIEntity *e) {
+void aiGemBlueInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiGemRedInit(AIEntity *e) {
+void aiGemRedInit(AIEntity *e, int mx, int my) {
 	e->aiAction = aiGemAction;
 }
 
-void aiGemRedInit2(AIEntity *e) {
+void aiGemRedInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiGemGreenInit(AIEntity *e) {
+void aiGemGreenInit(AIEntity *e, int mx, int my) {
 	e->aiAction = aiGemAction;
 }
 
-void aiGemGreenInit2(AIEntity *e) {
+void aiGemGreenInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiTeaCupInit(AIEntity *e) {
+void aiTeaCupInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Teacup", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiTeaCupInit2(AIEntity *e) {
+void aiTeaCupInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiCookieInit(AIEntity *e) {
+void aiCookieInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Cookie", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiCookieInit2(AIEntity *e) {
+void aiCookieInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiBurgerInit(AIEntity *e) {
+void aiBurgerInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Burger", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiBurgerInit2(AIEntity *e) {
+void aiBurgerInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiBookInit(AIEntity *e) {
+void aiBookInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Book", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiBookInit2(AIEntity *e) {
+void aiBookInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiClipboardInit(AIEntity *e) {
+void aiClipboardInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Clipboard", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiClipboardInit2(AIEntity *e) {
+void aiClipboardInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiNoteInit(AIEntity *e) {
+void aiNoteInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Note", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiNoteInit2(AIEntity *e) {
+void aiNoteInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiKeycardWhiteInit(AIEntity *e) {
+void aiKeycardWhiteInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a White keycard", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiKeycardWhiteInit2(AIEntity *e) {
+void aiKeycardWhiteInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiKeycardBlueInit(AIEntity *e) {
+void aiKeycardBlueInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Blue keycard", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiKeycardBlueInit2(AIEntity *e) {
+void aiKeycardBlueInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiKeycardRedInit(AIEntity *e) {
+void aiKeycardRedInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Red keycard", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiKeycardRedInit2(AIEntity *e) {
+void aiKeycardRedInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiKeycardGreenInit(AIEntity *e) {
+void aiKeycardGreenInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Green keycard", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiKeycardGreenInit2(AIEntity *e) {
+void aiKeycardGreenInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiKeycardPurpleInit(AIEntity *e) {
+void aiKeycardPurpleInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Purple keycard", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiKeycardPurpleInit2(AIEntity *e) {
+void aiKeycardPurpleInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiKeycardBlackInit(AIEntity *e) {
+void aiKeycardBlackInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Black keycard", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiKeycardBlackInit2(AIEntity *e) {
+void aiKeycardBlackInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiSeedInit(AIEntity *e) {
+void aiSeedInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "some Henscratch", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiSeedInit2(AIEntity *e) {
+void aiSeedInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiSodaInit(AIEntity *e) {
+void aiSodaInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Dr. Frostee", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiSodaInit2(AIEntity *e) {
+void aiSodaInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiDollyTool1Init(AIEntity *e) {
+void aiDollyTool1Init(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "Dolly's Wrench", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiDollyTool1Init2(AIEntity *e) {
+void aiDollyTool1Init2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiDollyTool2Init(AIEntity *e) {
+void aiDollyTool2Init(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "Dolly's Torch", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiDollyTool2Init2(AIEntity *e) {
+void aiDollyTool2Init2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiDollyTool3Init(AIEntity *e) {
+void aiDollyTool3Init(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "Dolly's EMF Resonator", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiDollyTool3Init2(AIEntity *e) {
+void aiDollyTool3Init2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiDollyTool4Init(AIEntity *e) {
+void aiDollyTool4Init(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "Dolly's Toolbox", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiDollyTool4Init2(AIEntity *e) {
+void aiDollyTool4Init2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiRouterInit(AIEntity *e) {
+void aiRouterInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Computer Router", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiRouterInit2(AIEntity *e) {
+void aiRouterInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiSlicerInit(AIEntity *e) {
+void aiSlicerInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Pizza Slicer", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiSlicerInit2(AIEntity *e) {
+void aiSlicerInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiPackageInit(AIEntity *e) {
+void aiPackageInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Package", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiPackageInit2(AIEntity *e) {
+void aiPackageInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiMagicEggAction(AIEntity *e) {
+void aiMagicEggAction(AIEntity *e, int mx, int my) {
 	// if magic egg isn't moving somewhere, don't move it
 	if (!e->goalX)
 		return;
@@ -1429,12 +1429,12 @@ void aiMagicEggAction(AIEntity *e) {
 	g_hdb->_ai->animateEntity(e);
 }
 
-void aiMagicEggInit(AIEntity *e) {
+void aiMagicEggInit(AIEntity *e, int mx, int my) {
 	e->moveSpeed = kPushMoveSpeed;
 	e->aiAction = aiMagicEggAction;
 }
 
-void aiMagicEggInit2(AIEntity *e) {
+void aiMagicEggInit2(AIEntity *e, int mx, int my) {
 	// point all magic egg move frames to the standing one
 	e->movedownFrames =
 		e->moveleftFrames =
@@ -1449,7 +1449,7 @@ void aiMagicEggInit2(AIEntity *e) {
 	e->draw = e->standdownGfx[0];			// standing frame - doesn't move
 }
 
-void aiMagicEggUse(AIEntity *e) {
+void aiMagicEggUse(AIEntity *e, int mx, int my) {
 	if (!scumm_strnicmp(e->luaFuncAction, "ai_", 3) || !scumm_strnicmp(e->luaFuncAction, "item_", 5)) {
 		AIEntity *spawned = nullptr;
 		for (int i = 0; aiEntList[i].type != END_AI_TYPES; ++i) {
@@ -1471,7 +1471,7 @@ void aiMagicEggUse(AIEntity *e) {
 	}
 }
 
-void aiIceBlockAction(AIEntity *e) {
+void aiIceBlockAction(AIEntity *e, int mx, int my) {
 	// if ice block isn't moving somewhere, don't move it
 	if (!e->goalX)
 		return;
@@ -1479,12 +1479,12 @@ void aiIceBlockAction(AIEntity *e) {
 	g_hdb->_ai->animateEntity(e);
 }
 
-void aiIceBlockInit(AIEntity *e) {
+void aiIceBlockInit(AIEntity *e, int mx, int my) {
 	e->moveSpeed = kPushMoveSpeed;
 	e->aiAction = aiIceBlockAction;
 }
 
-void aiIceBlockInit2(AIEntity *e) {
+void aiIceBlockInit2(AIEntity *e, int mx, int my) {
 	// point all ice block move frames to the standing one
 	e->movedownFrames =
 		e->moveleftFrames =
@@ -1499,100 +1499,100 @@ void aiIceBlockInit2(AIEntity *e) {
 	e->draw = e->standdownGfx[0];			// standing frame - doesn't move
 }
 
-void aiCabKeyInit(AIEntity *e) {
+void aiCabKeyInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a Cabinet key", 32);
 }
 
-void aiCabKeyInit2(AIEntity *e) {
+void aiCabKeyInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiItemChickenInit(AIEntity *e) {
+void aiItemChickenInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "Cooper's chicken", 32);
 }
 
-void aiItemChickenInit2(AIEntity *e) {
+void aiItemChickenInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiPdaInit(AIEntity *e) {
+void aiPdaInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "a P.D.A.", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiPdaInit2(AIEntity *e) {
+void aiPdaInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
 #if 0
-void aiCellUse(AIEntity *e) {
+void aiCellUse(AIEntity *e, int mx, int my) {
 	g_hdb->_window->openMessageBar("You got the Energy Cell!", kMsgDelay);
 }
 #endif
 
-void aiCellInit2(AIEntity *e) {
+void aiCellInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiCellInit(AIEntity *e) {
+void aiCellInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "Energy Cell", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiEnvelopeWhiteInit(AIEntity *e) {
+void aiEnvelopeWhiteInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "White envelope", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiEnvelopeWhiteInit2(AIEntity *e) {
+void aiEnvelopeWhiteInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiEnvelopeBlueInit(AIEntity *e) {
+void aiEnvelopeBlueInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "Blue envelope", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiEnvelopeBlueInit2(AIEntity *e) {
+void aiEnvelopeBlueInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiEnvelopeRedInit(AIEntity *e) {
+void aiEnvelopeRedInit(AIEntity *e, int mx, int my) {
 	Common::strlcpy(e->printedName, "Red envelope", 32);
 	e->aiAction = aiGetItemAction;
 }
 
-void aiEnvelopeRedInit2(AIEntity *e) {
+void aiEnvelopeRedInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiTransceiverInit(AIEntity *e) {
+void aiTransceiverInit(AIEntity *e, int mx, int my) {
 	e->aiAction = aiTransceiverAction;
 	Common::strlcpy(e->printedName, "Transceiver", 32);
 }
 
-void aiTransceiverInit2(AIEntity *e) {
+void aiTransceiverInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiTransceiverAction(AIEntity *e) {
+void aiTransceiverAction(AIEntity *e, int mx, int my) {
 	aiAnimateStanddown(e, 5);
 	if (e->onScreen)
-		aiGetItemAction(e);
+		aiGetItemAction(e, 0, 0);
 }
 
 #if 0
-void aiTransceiverUse(AIEntity *e) {
+void aiTransceiverUse(AIEntity *e, int mx, int my) {
 	g_hdb->_window->openMessageBar("You got the Transceiver!", kMsgDelay);
 }
 #endif
 
-void aiMonkeystoneInit(AIEntity *e) {
+void aiMonkeystoneInit(AIEntity *e, int mx, int my) {
 	e->aiUse = aiMonkeystoneUse;
 	e->aiAction = aiMonkeystoneAction;
 }
 
-void aiMonkeystoneAction(AIEntity *e) {
+void aiMonkeystoneAction(AIEntity *e, int mx, int my) {
 	if (!e->onScreen)
 		return;
 
@@ -1602,15 +1602,15 @@ void aiMonkeystoneAction(AIEntity *e) {
 			g_hdb->_lua->callFunction(e->luaFuncUse, 0);
 
 		g_hdb->_ai->addToInventory(e);
-		aiMonkeystoneUse(nullptr);
+		aiMonkeystoneUse(nullptr, 0, 0);
 	}
 }
 
-void aiMonkeystoneInit2(AIEntity *e) {
+void aiMonkeystoneInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiMonkeystoneUse(AIEntity *e) {
+void aiMonkeystoneUse(AIEntity *e, int mx, int my) {
 	int	val = g_hdb->_ai->getMonkeystoneAmount();
 	Common::String monkString = Common::String::format("You have %d Monkeystone%s!", val, (val > 1) ? "s" : "");
 	g_hdb->_sound->playSound(SND_GET_MONKEYSTONE);
@@ -1637,7 +1637,7 @@ void aiMonkeystoneUse(AIEntity *e) {
 	}
 }
 
-void aiGemAction(AIEntity *e) {
+void aiGemAction(AIEntity *e, int mx, int my) {
 	e->animFrame++;
 	if (e->animFrame >= e->standdownFrames) {
 		e->animFrame = 0;
@@ -1659,28 +1659,28 @@ void aiGemAction(AIEntity *e) {
 	e->draw = e->standdownGfx[e->animFrame];
 }
 
-void aiGemWhiteInit(AIEntity *e) {
+void aiGemWhiteInit(AIEntity *e, int mx, int my) {
 	e->aiAction = aiGemAction;
 }
 
-void aiGemWhiteInit2(AIEntity *e) {
+void aiGemWhiteInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiGooCupUse(AIEntity *e) {
+void aiGooCupUse(AIEntity *e, int mx, int my) {
 	g_hdb->_window->openMessageBar("Got a... cup of goo.", kMsgDelay);
 }
 
-void aiGooCupInit(AIEntity *e) {
+void aiGooCupInit(AIEntity *e, int mx, int my) {
 	e->aiUse = aiGooCupUse;
 	e->aiAction = aiGetItemAction;
 }
 
-void aiGooCupInit2(AIEntity *e) {
+void aiGooCupInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiVortexianAction(AIEntity *e) {
+void aiVortexianAction(AIEntity *e, int mx, int my) {
 	// anim the alpha blending : down to 32, up to 180, back down...
 	e->value2 += e->value1;
 	if ((e->value2 & 0xff) > 128) {
@@ -1713,21 +1713,21 @@ void aiVortexianAction(AIEntity *e) {
 	e->draw = e->standdownGfx[e->animFrame];
 }
 
-void aiVortexianUse(AIEntity *e) {
+void aiVortexianUse(AIEntity *e, int mx, int my) {
 }
 
-void aiVortexianInit(AIEntity *e) {
+void aiVortexianInit(AIEntity *e, int mx, int my) {
 	e->aiUse = aiVortexianUse;
 	e->aiAction = aiVortexianAction;
 	e->value1 = 5;
 	e->value2 = 128;
 }
 
-void aiVortexianInit2(AIEntity *e) {
+void aiVortexianInit2(AIEntity *e, int mx, int my) {
 	e->draw = e->standdownGfx[0];
 }
 
-void aiNoneInit(AIEntity *e) {
+void aiNoneInit(AIEntity *e, int mx, int my) {
 }
 
 // Utility Functions
@@ -1744,7 +1744,7 @@ void aiAnimateStanddown(AIEntity *e, int speed) {
 		e->animFrame = 0;
 }
 
-void aiGenericAction(AIEntity *e) {
+void aiGenericAction(AIEntity *e, int mx, int my) {
 	if (!e->goalX)
 		g_hdb->_ai->findPath(e);
 	else if (onEvenTile(e->x, e->y))
@@ -1752,14 +1752,14 @@ void aiGenericAction(AIEntity *e) {
 	g_hdb->_ai->animateEntity(e);
 }
 
-void aiGetItemAction(AIEntity *e) {
+void aiGetItemAction(AIEntity *e, int mx, int my) {
 	if (!e->onScreen)
 		return;
 
 	AIEntity *p = g_hdb->_ai->getPlayer();
 	if (abs(p->x - e->x) < 16 && abs(p->y - e->y) < 16 && e->level == p->level) {
 		if (e->aiUse)
-			e->aiUse(e);
+			e->aiUse(e, 0, 0);
 		if (e->luaFuncUse[0])
 			g_hdb->_lua->callFunction(e->luaFuncUse, 0);
 
diff --git a/engines/hdb/ai-player.h b/engines/hdb/ai-player.h
index 0294e4f5816..f1d086b980b 100644
--- a/engines/hdb/ai-player.h
+++ b/engines/hdb/ai-player.h
@@ -24,257 +24,253 @@
 
 namespace HDB {
 
-void aiPlayerInit(AIEntity *e);
-void aiPlayerInit2(AIEntity *e);
-void aiPlayerAction(AIEntity *e);
+void aiPlayerInit(AIEntity *e, int mx, int my);
+void aiPlayerInit2(AIEntity *e, int mx, int my);
+void aiPlayerAction(AIEntity *e, int mx, int my);
 void aiPlayerDraw(AIEntity *e, int mx, int my);
-void aiGemAttackInit(AIEntity *e);
-void aiGemAttackInit2(AIEntity *e);
-void aiGemAttackAction(AIEntity *e);
-void aiChickenAction(AIEntity *e);
-void aiChickenUse(AIEntity *e);
-void aiChickenInit(AIEntity *e);
-void aiChickenInit2(AIEntity *e);
-void aiDollyInit(AIEntity *e);
-void aiDollyInit2(AIEntity *e);
-void aiSergeantInit(AIEntity *e);
-void aiSergeantInit2(AIEntity *e);
-void aiSergeantAction(AIEntity *e);
-void aiSpacedudeInit(AIEntity *e);
-void aiSpacedudeInit2(AIEntity *e);
+void aiGemAttackInit(AIEntity *e, int mx, int my);
+void aiGemAttackInit2(AIEntity *e, int mx, int my);
+void aiGemAttackAction(AIEntity *e, int mx, int my);
+void aiChickenAction(AIEntity *e, int mx, int my);
+void aiChickenUse(AIEntity *e, int mx, int my);
+void aiChickenInit(AIEntity *e, int mx, int my);
+void aiChickenInit2(AIEntity *e, int mx, int my);
+void aiDollyInit(AIEntity *e, int mx, int my);
+void aiDollyInit2(AIEntity *e, int mx, int my);
+void aiSergeantInit(AIEntity *e, int mx, int my);
+void aiSergeantInit2(AIEntity *e, int mx, int my);
+void aiSergeantAction(AIEntity *e, int mx, int my);
+void aiSpacedudeInit(AIEntity *e, int mx, int my);
+void aiSpacedudeInit2(AIEntity *e, int mx, int my);
 
-void aiCrateAction(AIEntity *e);
-void aiCrateInit2(AIEntity *e);
-void aiCrateInit(AIEntity *e);
-void aiBarrelLightAction(AIEntity *e);
-void aiBarrelLightInit2(AIEntity *e);
-void aiBarrelLightInit(AIEntity *e);
-void aiBarrelHeavyAction(AIEntity *e);
-void aiBarrelHeavyInit(AIEntity *e);
-void aiBarrelHeavyInit2(AIEntity *e);
-void aiBarrelExplosionEnd(AIEntity *e);
-void aiBarrelExplosionAction(AIEntity *e);
-void aiBarrelExplode(AIEntity *e);
-void aiBarrelExplodeInit(AIEntity *e);
-void aiBarrelExplodeInit2(AIEntity *e);
-void aiBarrelExplodeAction(AIEntity *e);
-void aiBarrelExplodeSpread(AIEntity *e);
-void aiBarrelExplosionEnd(int x, int y);
+void aiCrateAction(AIEntity *e, int mx, int my);
+void aiCrateInit2(AIEntity *e, int mx, int my);
+void aiCrateInit(AIEntity *e, int mx, int my);
+void aiBarrelLightAction(AIEntity *e, int mx, int my);
+void aiBarrelLightInit2(AIEntity *e, int mx, int my);
+void aiBarrelLightInit(AIEntity *e, int mx, int my);
+void aiBarrelHeavyAction(AIEntity *e, int mx, int my);
+void aiBarrelHeavyInit(AIEntity *e, int mx, int my);
+void aiBarrelHeavyInit2(AIEntity *e, int mx, int my);
+void aiBarrelExplode(AIEntity *e, int mx, int my);
+void aiBarrelExplodeInit(AIEntity *e, int mx, int my);
+void aiBarrelExplodeInit2(AIEntity *e, int mx, int my);
+void aiBarrelExplodeAction(AIEntity *e, int mx, int my);
+void aiBarrelExplodeSpread(AIEntity *e, int mx, int my);
 void aiBarrelBlowup(AIEntity *e, int x, int y);
 
-void aiMaintBotInit(AIEntity *e);
-void aiMaintBotInit2(AIEntity *e);
-void aiMaintBotAction(AIEntity *e);
-void aiShockBotAction(AIEntity *e);
+void aiMaintBotInit(AIEntity *e, int mx, int my);
+void aiMaintBotInit2(AIEntity *e, int mx, int my);
+void aiMaintBotAction(AIEntity *e, int mx, int my);
+void aiShockBotAction(AIEntity *e, int mx, int my);
 void aiShockBotShock(AIEntity *e, int mx, int my);
-void aiShockBotInit(AIEntity *e);
-void aiShockBotInit2(AIEntity *e);
-void aiScientistInit(AIEntity *e);
-void aiScientistInit2(AIEntity *e);
-void aiFourFirerInit(AIEntity *e);
-void aiFourFirerInit2(AIEntity *e);
-void aiFourFirerAction(AIEntity *e);
-void aiRailRiderInit(AIEntity *e);
-void aiRailRiderInit2(AIEntity *e);
-void aiRailRiderAction(AIEntity *e);
-void aiRailRiderUse(AIEntity *e);
-void aiRailRiderOnUse(AIEntity *e);
-void aiRailRiderOnAction(AIEntity *e);
-void aiOmniBotMissileAction(AIEntity *e);
-void aiOmniBotMissileInit(AIEntity *e);
-void aiOmniBotMissileInit2(AIEntity *e);
+void aiShockBotInit(AIEntity *e, int mx, int my);
+void aiShockBotInit2(AIEntity *e, int mx, int my);
+void aiScientistInit(AIEntity *e, int mx, int my);
+void aiScientistInit2(AIEntity *e, int mx, int my);
+void aiFourFirerInit(AIEntity *e, int mx, int my);
+void aiFourFirerInit2(AIEntity *e, int mx, int my);
+void aiFourFirerAction(AIEntity *e, int mx, int my);
+void aiRailRiderInit(AIEntity *e, int mx, int my);
+void aiRailRiderInit2(AIEntity *e, int mx, int my);
+void aiRailRiderAction(AIEntity *e, int mx, int my);
+void aiRailRiderUse(AIEntity *e, int mx, int my);
+void aiRailRiderOnUse(AIEntity *e, int mx, int my);
+void aiRailRiderOnAction(AIEntity *e, int mx, int my);
+void aiOmniBotMissileAction(AIEntity *e, int mx, int my);
+void aiOmniBotMissileInit(AIEntity *e, int mx, int my);
+void aiOmniBotMissileInit2(AIEntity *e, int mx, int my);
 
-void aiSlugAttackAction(AIEntity *e);
+void aiSlugAttackAction(AIEntity *e, int mx, int my);
 void aiSlugAttackDraw(AIEntity *e, int mx, int my);
-void aiSlugAttackInit(AIEntity *e);
-void aiSlugAttackInit2(AIEntity *e);
-void aiDeadWorkerInit(AIEntity *e);
-void aiDeadWorkerInit2(AIEntity *e);
-void aiWorkerInit(AIEntity *e);
-void aiWorkerInit2(AIEntity *e);
-void aiAccountantInit(AIEntity *e);
-void aiAccountantInit2(AIEntity *e);
-void aiFrogStatueInit(AIEntity *e);
-void aiFrogStatueInit2(AIEntity *e);
-void aiFrogStatueAction(AIEntity *e);
+void aiSlugAttackInit(AIEntity *e, int mx, int my);
+void aiSlugAttackInit2(AIEntity *e, int mx, int my);
+void aiDeadWorkerInit(AIEntity *e, int mx, int my);
+void aiDeadWorkerInit2(AIEntity *e, int mx, int my);
+void aiWorkerInit(AIEntity *e, int mx, int my);
+void aiWorkerInit2(AIEntity *e, int mx, int my);
+void aiAccountantInit(AIEntity *e, int mx, int my);
+void aiAccountantInit2(AIEntity *e, int mx, int my);
+void aiFrogStatueInit(AIEntity *e, int mx, int my);
+void aiFrogStatueInit2(AIEntity *e, int mx, int my);
+void aiFrogStatueAction(AIEntity *e, int mx, int my);
 
-void aiRoboStunnerAction(AIEntity *e);
-void aiRoboStunnerInit(AIEntity *e);
-void aiRoboStunnerInit2(AIEntity *e);
-void aiClubInit(AIEntity *e);
-void aiClubInit2(AIEntity *e);
-void aiSlugSlingerInit(AIEntity *e);
-void aiSlugSlingerInit2(AIEntity *e);
+void aiRoboStunnerAction(AIEntity *e, int mx, int my);
+void aiRoboStunnerInit(AIEntity *e, int mx, int my);
+void aiRoboStunnerInit2(AIEntity *e, int mx, int my);
+void aiClubInit(AIEntity *e, int mx, int my);
+void aiClubInit2(AIEntity *e, int mx, int my);
+void aiSlugSlingerInit(AIEntity *e, int mx, int my);
+void aiSlugSlingerInit2(AIEntity *e, int mx, int my);
 
-void aiTurnBotAction(AIEntity *e);
-void aiPushBotAction(AIEntity *e);
-void aiOmniBotAction(AIEntity *e);
-void aiOmniBotMove(AIEntity *e);
-void aiLaserAction(AIEntity *e);
+void aiTurnBotAction(AIEntity *e, int mx, int my);
+void aiPushBotAction(AIEntity *e, int mx, int my);
+void aiOmniBotAction(AIEntity *e, int mx, int my);
+void aiOmniBotMove(AIEntity *e, int mx, int my);
+void aiLaserAction(AIEntity *e, int mx, int my);
 void aiLaserDraw(AIEntity *e, int mx, int my);
-void aiDiverterAction(AIEntity *e);
+void aiDiverterAction(AIEntity *e, int mx, int my);
 void aiDiverterDraw(AIEntity *e, int mx, int my);
-void aiRightBotAction(AIEntity *e);
-void aiDeadEyeAction(AIEntity *e);
+void aiRightBotAction(AIEntity *e, int mx, int my);
+void aiDeadEyeAction(AIEntity *e, int mx, int my);
 void aiMeerkatDraw(AIEntity *e, int mx, int my);
-void aiMeerkatAction(AIEntity *e);
-void aiMeerkatLookAround(AIEntity *e);
-void aiDeadEyeWalkInPlace(AIEntity *e);
-void aiFatFrogAction(AIEntity *e);
+void aiMeerkatAction(AIEntity *e, int mx, int my);
+void aiMeerkatLookAround(AIEntity *e, int mx, int my);
+void aiDeadEyeWalkInPlace(AIEntity *e, int mx, int my);
+void aiFatFrogAction(AIEntity *e, int mx, int my);
 void aiFatFrogTongueDraw(AIEntity *e, int mx, int my);
-void aiGoodFairyAction(AIEntity *e);
-void aiBadFairyAction(AIEntity *e);
-void aiGatePuddleAction(AIEntity *e);
-void aiIcePuffSnowballAction(AIEntity *e);
+void aiGoodFairyAction(AIEntity *e, int mx, int my);
+void aiBadFairyAction(AIEntity *e, int mx, int my);
+void aiGatePuddleAction(AIEntity *e, int mx, int my);
+void aiIcePuffSnowballAction(AIEntity *e, int mx, int my);
 void aiIcePuffSnowballDraw(AIEntity *e, int mx, int my);
-void aiIcePuffAction(AIEntity *e);
-void aiBuzzflyAction(AIEntity *e);
-void aiDragonAction(AIEntity *e);
+void aiIcePuffAction(AIEntity *e, int mx, int my);
+void aiBuzzflyAction(AIEntity *e, int mx, int my);
+void aiDragonAction(AIEntity *e, int mx, int my);
 void aiDragonDraw(AIEntity *e, int mx, int my);
+void aiTurnBotInit(AIEntity *e, int mx, int my);
+void aiTurnBotInit2(AIEntity *e, int mx, int my);
+void aiOmniBotInit(AIEntity *e, int mx, int my);
+void aiOmniBotInit2(AIEntity *e, int mx, int my);
+void aiLaserInit(AIEntity *e, int mx, int my);
+void aiLaserInit2(AIEntity *e, int mx, int my);
+void aiDiverterInit(AIEntity *e, int mx, int my);
+void aiDiverterInit2(AIEntity *e, int mx, int my);
+void aiRightBotInit(AIEntity *e, int mx, int my);
+void aiRightBotInit2(AIEntity *e, int mx, int my);
+void aiPushBotInit(AIEntity *e, int mx, int my);
+void aiPushBotInit2(AIEntity *e, int mx, int my);
+void aiDeadEyeInit(AIEntity *e, int mx, int my);
+void aiDeadEyeInit2(AIEntity *e, int mx, int my);
+void aiMeerkatInit(AIEntity *e, int mx, int my);
+void aiMeerkatInit2(AIEntity *e, int mx, int my);
+void aiFatFrogInit(AIEntity *e, int mx, int my);
+void aiFatFrogInit2(AIEntity *e, int mx, int my);
+void aiGoodFairyInit(AIEntity *e, int mx, int my);
+void aiGoodFairyInit2(AIEntity *e, int mx, int my);
+void aiBadFairyInit(AIEntity *e, int mx, int my);
+void aiBadFairyInit2(AIEntity *e, int mx, int my);
+void aiGatePuddleInit(AIEntity *e, int mx, int my);
+void aiGatePuddleInit2(AIEntity *e, int mx, int my);
+void aiIcePuffInit(AIEntity *e, int mx, int my);
+void aiIcePuffInit2(AIEntity *e, int mx, int my);
+void aiBuzzflyInit(AIEntity *e, int mx, int my);
+void aiBuzzflyInit2(AIEntity *e, int mx, int my);
+void aiDragonInit(AIEntity *e, int mx, int my);
+void aiDragonInit2(AIEntity *e, int mx, int my);
+void aiDragonWake(AIEntity *e, int mx, int my);
+void aiDragonUse(AIEntity *e, int mx, int my);
 
-void aiTurnBotInit(AIEntity *e);
-void aiTurnBotInit2(AIEntity *e);
-void aiListenBotInit(AIEntity *e);
-void aiListenBotInit2(AIEntity *e);
-void aiOmniBotInit(AIEntity *e);
-void aiOmniBotInit2(AIEntity *e);
-void aiLaserInit(AIEntity *e);
-void aiLaserInit2(AIEntity *e);
-void aiDiverterInit(AIEntity *e);
-void aiDiverterInit2(AIEntity *e);
-void aiRightBotInit(AIEntity *e);
-void aiRightBotInit2(AIEntity *e);
-void aiPushBotInit(AIEntity *e);
-void aiPushBotInit2(AIEntity *e);
-void aiDeadEyeInit(AIEntity *e);
-void aiDeadEyeInit2(AIEntity *e);
-void aiMeerkatInit(AIEntity *e);
-void aiMeerkatInit2(AIEntity *e);
-void aiFatFrogInit(AIEntity *e);
-void aiFatFrogInit2(AIEntity *e);
-void aiGoodFairyInit(AIEntity *e);
-void aiGoodFairyInit2(AIEntity *e);
-void aiGoodFairyMoveaway(AIEntity *e);
-void aiBadFairyInit(AIEntity *e);
-void aiBadFairyInit2(AIEntity *e);
-void aiGatePuddleInit(AIEntity *e);
-void aiGatePuddleInit2(AIEntity *e);
-void aiIcePuffInit(AIEntity *e);
-void aiIcePuffInit2(AIEntity *e);
-void aiBuzzflyInit(AIEntity *e);
-void aiBuzzflyInit2(AIEntity *e);
-void aiDragonInit(AIEntity *e);
-void aiDragonInit2(AIEntity *e);
-void aiDragonWake(AIEntity *e);
-void aiDragonUse(AIEntity *e);
+void aiEnvelopeGreenInit(AIEntity *e, int mx, int my);
+void aiEnvelopeGreenInit2(AIEntity *e, int mx, int my);
+void aiGemBlueInit(AIEntity *e, int mx, int my);
+void aiGemBlueInit2(AIEntity *e, int mx, int my);
+void aiGemRedInit(AIEntity *e, int mx, int my);
+void aiGemRedInit2(AIEntity *e, int mx, int my);
+void aiGemGreenInit(AIEntity *e, int mx, int my);
+void aiGemGreenInit2(AIEntity *e, int mx, int my);
 
-void aiEnvelopeGreenInit(AIEntity *e);
-void aiEnvelopeGreenInit2(AIEntity *e);
-void aiGemBlueInit(AIEntity *e);
-void aiGemBlueInit2(AIEntity *e);
-void aiGemRedInit(AIEntity *e);
-void aiGemRedInit2(AIEntity *e);
-void aiGemGreenInit(AIEntity *e);
-void aiGemGreenInit2(AIEntity *e);
+void aiTeaCupInit(AIEntity *e, int mx, int my);
+void aiTeaCupInit2(AIEntity *e, int mx, int my);
+void aiCookieInit(AIEntity *e, int mx, int my);
+void aiCookieInit2(AIEntity *e, int mx, int my);
+void aiBurgerInit(AIEntity *e, int mx, int my);
+void aiBurgerInit2(AIEntity *e, int mx, int my);
+void aiBookInit(AIEntity *e, int mx, int my);
+void aiBookInit2(AIEntity *e, int mx, int my);
+void aiClipboardInit(AIEntity *e, int mx, int my);
+void aiClipboardInit2(AIEntity *e, int mx, int my);
+void aiNoteInit(AIEntity *e, int mx, int my);
+void aiNoteInit2(AIEntity *e, int mx, int my);
+void aiKeycardWhiteInit(AIEntity *e, int mx, int my);
+void aiKeycardWhiteInit2(AIEntity *e, int mx, int my);
+void aiKeycardBlueInit(AIEntity *e, int mx, int my);
+void aiKeycardBlueInit2(AIEntity *e, int mx, int my);
+void aiKeycardRedInit(AIEntity *e, int mx, int my);
+void aiKeycardRedInit2(AIEntity *e, int mx, int my);
+void aiKeycardGreenInit(AIEntity *e, int mx, int my);
+void aiKeycardGreenInit2(AIEntity *e, int mx, int my);
+void aiKeycardPurpleInit(AIEntity *e, int mx, int my);
+void aiKeycardPurpleInit2(AIEntity *e, int mx, int my);
+void aiKeycardBlackInit(AIEntity *e, int mx, int my);
+void aiKeycardBlackInit2(AIEntity *e, int mx, int my);
+void aiSeedInit(AIEntity *e, int mx, int my);
+void aiSeedInit2(AIEntity *e, int mx, int my);
+void aiSodaInit(AIEntity *e, int mx, int my);
+void aiSodaInit2(AIEntity *e, int mx, int my);
+void aiDollyTool1Init(AIEntity *e, int mx, int my);
+void aiDollyTool1Init2(AIEntity *e, int mx, int my);
+void aiDollyTool2Init(AIEntity *e, int mx, int my);
+void aiDollyTool2Init2(AIEntity *e, int mx, int my);
+void aiDollyTool3Init(AIEntity *e, int mx, int my);
+void aiDollyTool3Init2(AIEntity *e, int mx, int my);
+void aiDollyTool4Init(AIEntity *e, int mx, int my);
+void aiDollyTool4Init2(AIEntity *e, int mx, int my);
+void aiRouterInit(AIEntity *e, int mx, int my);
+void aiRouterInit2(AIEntity *e, int mx, int my);
+void aiSlicerInit(AIEntity *e, int mx, int my);
+void aiSlicerInit2(AIEntity *e, int mx, int my);
+void aiPackageInit(AIEntity *e, int mx, int my);
+void aiPackageInit2(AIEntity *e, int mx, int my);
+void aiMagicEggAction(AIEntity *e, int mx, int my);
+void aiMagicEggInit(AIEntity *e, int mx, int my);
+void aiMagicEggInit2(AIEntity *e, int mx, int my);
+void aiMagicEggUse(AIEntity *e, int mx, int my);
+void aiIceBlockAction(AIEntity *e, int mx, int my);
+void aiIceBlockInit(AIEntity *e, int mx, int my);
+void aiIceBlockInit2(AIEntity *e, int mx, int my);
 
-void aiTeaCupInit(AIEntity *e);
-void aiTeaCupInit2(AIEntity *e);
-void aiCookieInit(AIEntity *e);
-void aiCookieInit2(AIEntity *e);
-void aiBurgerInit(AIEntity *e);
-void aiBurgerInit2(AIEntity *e);
-void aiBookInit(AIEntity *e);
-void aiBookInit2(AIEntity *e);
-void aiClipboardInit(AIEntity *e);
-void aiClipboardInit2(AIEntity *e);
-void aiNoteInit(AIEntity *e);
-void aiNoteInit2(AIEntity *e);
-void aiKeycardWhiteInit(AIEntity *e);
-void aiKeycardWhiteInit2(AIEntity *e);
-void aiKeycardBlueInit(AIEntity *e);
-void aiKeycardBlueInit2(AIEntity *e);
-void aiKeycardRedInit(AIEntity *e);
-void aiKeycardRedInit2(AIEntity *e);
-void aiKeycardGreenInit(AIEntity *e);
-void aiKeycardGreenInit2(AIEntity *e);
-void aiKeycardPurpleInit(AIEntity *e);
-void aiKeycardPurpleInit2(AIEntity *e);
-void aiKeycardBlackInit(AIEntity *e);
-void aiKeycardBlackInit2(AIEntity *e);
-void aiSeedInit(AIEntity *e);
-void aiSeedInit2(AIEntity *e);
-void aiSodaInit(AIEntity *e);
-void aiSodaInit2(AIEntity *e);
-void aiDollyTool1Init(AIEntity *e);
-void aiDollyTool1Init2(AIEntity *e);
-void aiDollyTool2Init(AIEntity *e);
-void aiDollyTool2Init2(AIEntity *e);
-void aiDollyTool3Init(AIEntity *e);
-void aiDollyTool3Init2(AIEntity *e);
-void aiDollyTool4Init(AIEntity *e);
-void aiDollyTool4Init2(AIEntity *e);
-void aiRouterInit(AIEntity *e);
-void aiRouterInit2(AIEntity *e);
-void aiSlicerInit(AIEntity *e);
-void aiSlicerInit2(AIEntity *e);
-void aiPackageInit(AIEntity *e);
-void aiPackageInit2(AIEntity *e);
-void aiMagicEggAction(AIEntity *e);
-void aiMagicEggInit(AIEntity *e);
-void aiMagicEggInit2(AIEntity *e);
-void aiMagicEggUse(AIEntity *e);
-void aiIceBlockAction(AIEntity *e);
-void aiIceBlockInit(AIEntity *e);
-void aiIceBlockInit2(AIEntity *e);
+void aiCabKeyInit(AIEntity *e, int mx, int my);
+void aiCabKeyInit2(AIEntity *e, int mx, int my);
+void aiItemChickenInit(AIEntity *e, int mx, int my);
+void aiItemChickenInit2(AIEntity *e, int mx, int my);
 
-void aiCabKeyInit(AIEntity *e);
-void aiCabKeyInit2(AIEntity *e);
-void aiItemChickenInit(AIEntity *e);
-void aiItemChickenInit2(AIEntity *e);
+void aiPdaInit(AIEntity *e, int mx, int my);
+void aiPdaInit2(AIEntity *e, int mx, int my);
+#if 0
+void aiCellUse(AIEntity *e, int mx, int my);
+#endif
+void aiCellInit2(AIEntity *e, int mx, int my);
+void aiCellInit(AIEntity *e, int mx, int my);
+void aiEnvelopeWhiteInit(AIEntity *e, int mx, int my);
+void aiEnvelopeWhiteInit2(AIEntity *e, int mx, int my);
+void aiEnvelopeBlueInit(AIEntity *e, int mx, int my);
+void aiEnvelopeBlueInit2(AIEntity *e, int mx, int my);
+void aiEnvelopeRedInit(AIEntity *e, int mx, int my);
+void aiEnvelopeRedInit2(AIEntity *e, int mx, int my);
+void aiTransceiverInit(AIEntity *e, int mx, int my);
+void aiTransceiverInit2(AIEntity *e, int mx, int my);
+void aiTransceiverAction(AIEntity *e, int mx, int my);
+#if 0
+void aiTransceiverUse(AIEntity *e, int mx, int my);
+#endif
+void aiMonkeystoneInit(AIEntity *e, int mx, int my);
+void aiMonkeystoneAction(AIEntity *e, int mx, int my);
+void aiMonkeystoneInit2(AIEntity *e, int mx, int my);
+void aiMonkeystoneUse(AIEntity *e, int mx, int my);
+void aiGemAction(AIEntity *e, int mx, int my);
+void aiGemWhiteInit(AIEntity *e, int mx, int my);
+void aiGemWhiteInit2(AIEntity *e, int mx, int my);
+void aiGooCupUse(AIEntity *e, int mx, int my);
+void aiGooCupInit(AIEntity *e, int mx, int my);
+void aiGooCupInit2(AIEntity *e, int mx, int my);
 
-void aiPdaInit(AIEntity *e);
-void aiPdaInit2(AIEntity *e);
-void aiCellUse(AIEntity *e);
-void aiCellInit2(AIEntity *e);
-void aiCellInit(AIEntity *e);
-void aiEnvelopeWhiteInit(AIEntity *e);
-void aiEnvelopeWhiteInit2(AIEntity *e);
-void aiEnvelopeBlueInit(AIEntity *e);
-void aiEnvelopeBlueInit2(AIEntity *e);
-void aiEnvelopeRedInit(AIEntity *e);
-void aiEnvelopeRedInit2(AIEntity *e);
-void aiTransceiverInit(AIEntity *e);
-void aiTransceiverInit2(AIEntity *e);
-void aiTransceiverAction(AIEntity *e);
-void aiTransceiverUse(AIEntity *e);
-void aiMonkeystoneInit(AIEntity *e);
-void aiMonkeystoneAction(AIEntity *e);
-void aiMonkeystoneInit2(AIEntity *e);
-void aiMonkeystoneUse(AIEntity *e);
-void aiMonkeystoneUse2(AIEntity *e);
-void aiGemAction(AIEntity *e);
-void aiGemAction2(AIEntity *e);
-void aiGemWhiteInit(AIEntity *e);
-void aiGemWhiteInit2(AIEntity *e);
-void aiGooCupUse(AIEntity *e);
-void aiGooCupInit(AIEntity *e);
-void aiGooCupInit2(AIEntity *e);
+void aiVortexianAction(AIEntity *e, int mx, int my);
+void aiVortexianUse(AIEntity *e, int mx, int my);
+void aiVortexianInit(AIEntity *e, int mx, int my);
+void aiVortexianInit2(AIEntity *e, int mx, int my);
 
-void aiVortexianAction(AIEntity *e);
-void aiVortexianUse(AIEntity *e);
-void aiVortexianInit(AIEntity *e);
-void aiVortexianInit2(AIEntity *e);
-
-void aiNoneInit(AIEntity *e);
-void aiNoneInit2(AIEntity *e);
+void aiNoneInit(AIEntity *e, int mx, int my);
+void aiNoneInit2(AIEntity *e, int mx, int my);
 
 void callbackDoorOpenClose(int x, int y);
 void callbackAutoDoorOpenClose(int x, int y);
+void callbackAiBarrelExplosionEnd(int x, int y);
 
 // Utility Functions
 void aiAnimateStanddown(AIEntity *e, int speed);
-void aiGenericAction(AIEntity *e);
-void aiGetItemAction(AIEntity *e);
+void aiGenericAction(AIEntity *e, int mx, int my);
+void aiGetItemAction(AIEntity *e, int mx, int my);
 
 } // End of Namespace
 
diff --git a/engines/hdb/ai.h b/engines/hdb/ai.h
index c645cfcb251..950bc449564 100644
--- a/engines/hdb/ai.h
+++ b/engines/hdb/ai.h
@@ -382,9 +382,8 @@ struct AIStateDef {
 	const char *name;
 };
 
-// Structs for Function Table Lookup for SaveGames
-typedef void(*FuncPtr)(AIEntity *);
-typedef void(*EntFuncPtr)(AIEntity *, int, int);
+// Struct for Function Table Lookup for SaveGames
+typedef void(*FuncPtr)(AIEntity *, int, int);
 
 struct AIEntity {
 	AIType type;
@@ -397,7 +396,7 @@ struct AIEntity {
 	FuncPtr aiInit2;									// func ptr to init2 routine - graphic init only (this for LoadGame functionality)
 	FuncPtr aiAction;									// func ptr to action routine
 	FuncPtr aiUse;										// func ptr to use routine
-	EntFuncPtr aiDraw;									// func ptr to extra drawing routine (only for special stuff) - pass in mapx, mapy
+	FuncPtr aiDraw;										// func ptr to extra drawing routine (only for special stuff) - pass in mapx, mapy
 
 	char		luaFuncInit[32];						// Lua function for Init (always called after entity's init). These are ptrs into the map header.
 	char		luaFuncAction[32];						// Lua function for Action
@@ -573,7 +572,7 @@ struct AIEntLevel2 {
 	uint16 y;
 	Tile *draw;
 	AIEntity *e;
-	EntFuncPtr aiDraw;
+	FuncPtr aiDraw;
 	uint32 stunnedWait;
 
 	AIEntLevel2() : x(0), y(0), draw(nullptr), e(nullptr), aiDraw(nullptr), stunnedWait(0) {}
diff --git a/engines/hdb/hdb.cpp b/engines/hdb/hdb.cpp
index 8f3cae23d4f..2a381182832 100644
--- a/engines/hdb/hdb.cpp
+++ b/engines/hdb/hdb.cpp
@@ -598,7 +598,7 @@ void HDBGame::useEntity(AIEntity *e) {
 			e = &temp;
 
 			if (temp.aiUse)
-				temp.aiUse(&temp);
+				temp.aiUse(&temp, 0, 0);
 
 			if (temp.luaFuncUse[0])
 				_lua->callFunction(temp.luaFuncUse, 0);
@@ -609,7 +609,7 @@ void HDBGame::useEntity(AIEntity *e) {
 			return;
 
 		if (e->aiUse)
-			e->aiUse(e);
+			e->aiUse(e, 0, 0);
 
 		if (e->luaFuncUse[0])
 			_lua->callFunction(e->luaFuncUse, 0);
diff --git a/engines/hdb/saveload.cpp b/engines/hdb/saveload.cpp
index a28e64f148f..96976b74603 100644
--- a/engines/hdb/saveload.cpp
+++ b/engines/hdb/saveload.cpp
@@ -265,7 +265,7 @@ void AIEntity::save(Common::OutSaveFile *out) {
 		strncpy(funcString, lookUp, 31);
 	out->write(funcString, 32);
 
-	lookUp = g_hdb->_ai->funcLookUp((FuncPtr)aiDraw);
+	lookUp = g_hdb->_ai->funcLookUp(aiDraw);
 	memset(&funcString, 0, 32);
 	if (!lookUp && aiDraw)
 		error("AIEntity::save: No matching DRAW function for func-string for %s entity", AIType2Str(type));
@@ -311,11 +311,9 @@ void AIEntity::save(Common::OutSaveFile *out) {
 
 void AIEntity::load(Common::InSaveFile *in) {
 	char funcString[32];
-	FuncPtr init, init2, use, action;
-	EntFuncPtr drawf;
+	FuncPtr init, init2, use, action, drawf;
 
-	action = init = init2 = use = nullptr;
-	drawf = nullptr;
+	action = init = init2 = use = drawf = nullptr;
 
 	// Read 32-char names for the function ptrs we have in entity struct
 	in->read(funcString, 32);
@@ -336,7 +334,7 @@ void AIEntity::load(Common::InSaveFile *in) {
 
 	in->read(funcString, 32);
 	if (funcString[0])
-		drawf = (EntFuncPtr)g_hdb->_ai->funcLookUp(funcString);
+		drawf = g_hdb->_ai->funcLookUp(funcString);
 
 	// Load AIEntity
 	type = (AIType)in->readSint32LE();




More information about the Scummvm-git-logs mailing list