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.
This commit is contained in:
D G Turner 2022-07-23 17:00:23 +01:00
parent 27fd68cf20
commit cb949044db
9 changed files with 492 additions and 516 deletions

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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}

View File

@ -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);

View File

@ -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

View File

@ -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) {}

View File

@ -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);

View File

@ -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();