[Scummvm-cvs-logs] scummvm master -> 9bc6a73686f7880fb9ec51f29d2a9e77d65a7c71
sev-
sev at scummvm.org
Thu May 26 22:12:18 CEST 2016
This automated email contains information about 5 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
2b5ecc4f88 SCUMM HE: Wrapped Moonbase AI into a class
edb8e6865b SCUMM HE: Eliminated global _vm reference in Moonbase AI
36526cb27b SCUMM HE: Moved Moonbase to ScummEngine_v100he
dcc388cbaa SCUMM HE: Moved remnants of Moonabse to HE100
9bc6a73686 SCUMM HE: Moved global variables of Moonbase AI to the class
Commit: 2b5ecc4f88a21b673af14849630c598261f3c743
https://github.com/scummvm/scummvm/commit/2b5ecc4f88a21b673af14849630c598261f3c743
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2016-05-26T21:06:43+02:00
Commit Message:
SCUMM HE: Wrapped Moonbase AI into a class
Changed paths:
engines/scumm/he/logic/moonbase_logic.cpp
engines/scumm/he/moonbase/ai_defenseunit.cpp
engines/scumm/he/moonbase/ai_defenseunit.h
engines/scumm/he/moonbase/ai_main.cpp
engines/scumm/he/moonbase/ai_main.h
engines/scumm/he/moonbase/ai_targetacquisition.cpp
engines/scumm/he/moonbase/ai_targetacquisition.h
engines/scumm/he/moonbase/ai_traveller.cpp
engines/scumm/he/moonbase/ai_traveller.h
engines/scumm/he/moonbase/ai_tree.cpp
engines/scumm/he/moonbase/ai_tree.h
engines/scumm/he/moonbase/moonbase.cpp
engines/scumm/he/moonbase/moonbase.h
diff --git a/engines/scumm/he/logic/moonbase_logic.cpp b/engines/scumm/he/logic/moonbase_logic.cpp
index d5100ce..0d1c3c5 100644
--- a/engines/scumm/he/logic/moonbase_logic.cpp
+++ b/engines/scumm/he/logic/moonbase_logic.cpp
@@ -227,22 +227,22 @@ void LogicHEmoonbase::op_ai_test_kludge(int op, int numArgs, int32 *args) {
int LogicHEmoonbase::op_ai_master_control_program(int op, int numArgs, int32 *args) {
warning("op_ai_master_control_program()");
- return masterControlProgram(numArgs, args);
+ return _vm->_moonbase->_ai->masterControlProgram(numArgs, args);
}
void LogicHEmoonbase::op_ai_reset(int op, int numArgs, int32 *args) {
warning("op_ai_reset())");
- resetAI(_vm);
+ _vm->_moonbase->_ai->resetAI(_vm);
}
void LogicHEmoonbase::op_ai_set_type(int op, int numArgs, int32 *args) {
warning("op_ai_set_type()");
- setAIType(numArgs, args);
+ _vm->_moonbase->_ai->setAIType(numArgs, args);
}
void LogicHEmoonbase::op_ai_clean_up(int op, int numArgs, int32 *args) {
warning("op_ai_clean_up()");
- cleanUpAI();
+ _vm->_moonbase->_ai->cleanUpAI();
}
LogicHE *makeLogicHEmoonbase(ScummEngine_v90he *vm) {
diff --git a/engines/scumm/he/moonbase/ai_defenseunit.cpp b/engines/scumm/he/moonbase/ai_defenseunit.cpp
index ba180ba..ad9792d 100644
--- a/engines/scumm/he/moonbase/ai_defenseunit.cpp
+++ b/engines/scumm/he/moonbase/ai_defenseunit.cpp
@@ -23,12 +23,13 @@
#include "common/rect.h"
#include "common/util.h"
#include "scumm/he/intern_he.h"
+#include "scumm/he/moonbase/moonbase.h"
#include "scumm/he/moonbase/ai_defenseunit.h"
#include "scumm/he/moonbase/ai_main.h"
namespace Scumm {
-DefenseUnit::DefenseUnit() {
+DefenseUnit::DefenseUnit(AI *ai) : _ai(ai) {
_state = DUS_ON;
_id = -1;
@@ -39,7 +40,7 @@ DefenseUnit::DefenseUnit() {
_cost = 0;
}
-DefenseUnit::DefenseUnit(DefenseUnit *inUnit) {
+DefenseUnit::DefenseUnit(DefenseUnit *inUnit, AI *ai) : _ai(ai) {
_id = inUnit->getID();
_pos.x = inUnit->getPosX();
_pos.y = inUnit->getPosY();
@@ -131,13 +132,13 @@ int AntiAirUnit::selectWeapon(int index) {
case 2:
if (getState() == DUS_OFF) {
- if (getPlayerEnergy() > 6) {
+ if (_ai->getPlayerEnergy() > 6) {
if (!_vm->_rnd.getRandomNumber(3)) {
return ITEM_VIRUS;
}
}
- if (getPlayerEnergy() > 2) {
+ if (_ai->getPlayerEnergy() > 2) {
if (!_vm->_rnd.getRandomNumber(1)) {
return ITEM_SPIKE;
}
@@ -177,8 +178,8 @@ Common::Point *ShieldUnit::createTargetPos(int index, int distance, int weaponTy
case ITEM_CRAWLER:
ratio = MAX(0.0, 1.0 - (static_cast<float>(getRadius()) / static_cast<float>(distance - 20)));
{
- int maxX = getMaxX();
- int maxY = getMaxY();
+ int maxX = _ai->getMaxX();
+ int maxY = _ai->getMaxY();
int thisX = (static_cast<int>(sourceX + ratio * (getPosX() - sourceX)) + maxX) % maxX;
int thisY = (static_cast<int>(sourceY + ratio * (getPosY() - sourceY)) + maxY) % maxY;
targetPos->x = thisX;
@@ -229,8 +230,8 @@ Common::Point *ShieldUnit::createTargetPos(int index, int distance, int weaponTy
int ShieldUnit::selectWeapon(int index) {
warning("Shield weapon select");
- int myUnit = getClosestUnit(getPosX(), getPosY(), getMaxX(), getCurrentPlayer(), 1, BUILDING_MAIN_BASE, 1, 0);
- int dist = getDistance(getPosX(), getPosY(), getHubX(myUnit), getHubY(myUnit));
+ int myUnit = _ai->getClosestUnit(getPosX(), getPosY(), _ai->getMaxX(), _ai->getCurrentPlayer(), 1, BUILDING_MAIN_BASE, 1, 0);
+ int dist = _ai->getDistance(getPosX(), getPosY(), _ai->getHubX(myUnit), _ai->getHubY(myUnit));
if ((dist < (getRadius() - 20)) && (dist > 90)) {
return ITEM_SPIKE;
@@ -239,7 +240,7 @@ int ShieldUnit::selectWeapon(int index) {
switch (index) {
case 0:
if (getState() == DUS_OFF) {
- if (getPlayerEnergy() < 3) {
+ if (_ai->getPlayerEnergy() < 3) {
return ITEM_BOMB;
} else {
return ITEM_SPIKE;
@@ -295,11 +296,11 @@ Common::Point *MineUnit::createTargetPos(int index, int distance, int weaponType
}
int MineUnit::selectWeapon(int index) {
- int myUnit = getClosestUnit(getPosX(), getPosY(), getMaxX(), getCurrentPlayer(), 1, 0, 0, 0);
+ int myUnit = _ai->getClosestUnit(getPosX(), getPosY(), _ai->getMaxX(), _ai->getCurrentPlayer(), 1, 0, 0, 0);
int x = getPosX();
int y = getPosY();
- int dist = getDistance(x, y, getHubX(myUnit), getHubY(myUnit));
+ int dist = _ai->getDistance(x, y, _ai->getHubX(myUnit), _ai->getHubY(myUnit));
if ((getState() == DUS_ON) && (dist < 110)) {
return ITEM_EMP;
@@ -342,17 +343,17 @@ Common::Point *HubUnit::createTargetPos(int index, int distance, int weaponType,
int HubUnit::selectWeapon(int index) {
warning("Hub weapon select");
- int energy = getPlayerEnergy();
+ int energy = _ai->getPlayerEnergy();
if (energy > 6) {
//possibly choose crawler
- if (getBuildingWorth(getID()) > 21) {
+ if (_ai->getBuildingWorth(getID()) > 21) {
return ITEM_CRAWLER;
}
}
//choose betw/ bomb and cluster
- if (getBuildingArmor(getID()) < 1.5) {
+ if (_ai->getBuildingArmor(getID()) < 1.5) {
return ITEM_CLUSTER;
}
@@ -457,7 +458,6 @@ int BridgeUnit::selectWeapon(int index) {
}
}
-
Common::Point *EnergyUnit::createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY) {
Common::Point *targetPos = new Common::Point;
@@ -491,17 +491,17 @@ Common::Point *EnergyUnit::createTargetPos(int index, int distance, int weaponTy
int EnergyUnit::selectWeapon(int index) {
warning("Energy weapon select");
- int energy = getPlayerEnergy();
+ int energy = _ai->getPlayerEnergy();
if (energy > 6) {
//possibly choose crawler
- if (getBuildingWorth(getID()) > 21) {
+ if (_ai->getBuildingWorth(getID()) > 21) {
return ITEM_CRAWLER;
}
}
//choose betw/ bomb and cluster
- if (getBuildingArmor(getID()) < 1.5) {
+ if (_ai->getBuildingArmor(getID()) < 1.5) {
return ITEM_CLUSTER;
}
@@ -547,17 +547,17 @@ Common::Point *OffenseUnit::createTargetPos(int index, int distance, int weaponT
int OffenseUnit::selectWeapon(int index) {
warning("Offense weapon select");
- int energy = getPlayerEnergy();
+ int energy = _ai->getPlayerEnergy();
if (energy > 6) {
//possibly choose crawler
- if (getBuildingWorth(getID()) > 21) {
+ if (_ai->getBuildingWorth(getID()) > 21) {
return ITEM_CRAWLER;
}
}
//choose betw/ bomb and cluster
- if (getBuildingArmor(getID()) < 1.5) {
+ if (_ai->getBuildingArmor(getID()) < 1.5) {
return ITEM_CLUSTER;
}
@@ -597,13 +597,13 @@ Common::Point *CrawlerUnit::createTargetPos(int index, int distance, int weaponT
int CrawlerUnit::selectWeapon(int index) {
warning("Crawler weapon select");
- int myUnit = getClosestUnit(getPosX(), getPosY(), getMaxX(), getCurrentPlayer(), 1, 0, 0, 0);
- int dist = getDistance(getHubX(myUnit), getHubY(myUnit), getPosX(), getPosY());
+ int myUnit = _ai->getClosestUnit(getPosX(), getPosY(), _ai->getMaxX(), _ai->getCurrentPlayer(), 1, 0, 0, 0);
+ int dist = _ai->getDistance(_ai->getHubX(myUnit), _ai->getHubY(myUnit), getPosX(), getPosY());
int x = getPosX();
int y = getPosY();
- int energy = getPlayerEnergy();
- int terrain = getTerrain(x, y);
+ int energy = _ai->getPlayerEnergy();
+ int terrain = _ai->getTerrain(x, y);
if (terrain != TERRAIN_TYPE_WATER) {
if ((energy > 2) && (dist < 220)) {
@@ -628,61 +628,61 @@ int CrawlerUnit::selectWeapon(int index) {
return SKIP_TURN;
}
-AntiAirUnit::AntiAirUnit() {
+AntiAirUnit::AntiAirUnit(AI *ai) : DefenseUnit(ai) {
setRadius(190);
setArmor(3);
setCost(1);
}
-ShieldUnit::ShieldUnit() {
+ShieldUnit::ShieldUnit(AI *ai) : DefenseUnit(ai) {
setRadius(170);
setArmor(3);
setCost(7);
}
-MineUnit::MineUnit() {
+MineUnit::MineUnit(AI *ai) : DefenseUnit(ai) {
setRadius(80);
setArmor(1);
setCost(3);
}
-HubUnit::HubUnit() {
+HubUnit::HubUnit(AI *ai) : DefenseUnit(ai) {
setRadius(1);
setArmor(5);
setCost(7);
}
-TowerUnit::TowerUnit() {
+TowerUnit::TowerUnit(AI *ai) : DefenseUnit(ai) {
setRadius(1);
setArmor(3);
setCost(1);
}
-BridgeUnit::BridgeUnit() {
+BridgeUnit::BridgeUnit(AI *ai) : DefenseUnit(ai) {
setRadius(1);
setArmor(3);
setCost(1);
}
-EnergyUnit::EnergyUnit() {
+EnergyUnit::EnergyUnit(AI *ai) : DefenseUnit(ai) {
setRadius(1);
setArmor(5);
setCost(7);
}
-OffenseUnit::OffenseUnit() {
+OffenseUnit::OffenseUnit(AI *ai) : DefenseUnit(ai) {
setRadius(1);
setArmor(3);
setCost(7);
}
-CrawlerUnit::CrawlerUnit() {
+CrawlerUnit::CrawlerUnit(AI *ai) : DefenseUnit(ai) {
setRadius(1);
setArmor(3);
setCost(7);
}
-AntiAirUnit::AntiAirUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
+AntiAirUnit::AntiAirUnit(DefenseUnit *inUnit, AI *ai) : DefenseUnit(inUnit, ai) {
setID(inUnit->getID());
setPos(inUnit->getPosX(), inUnit->getPosY());
setDistanceTo(inUnit->getDistanceTo());
@@ -692,7 +692,7 @@ AntiAirUnit::AntiAirUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
}
-ShieldUnit::ShieldUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
+ShieldUnit::ShieldUnit(DefenseUnit *inUnit, AI *ai) : DefenseUnit(inUnit, ai) {
setID(inUnit->getID());
setPos(inUnit->getPosX(), inUnit->getPosY());
setDistanceTo(inUnit->getDistanceTo());
@@ -701,7 +701,7 @@ ShieldUnit::ShieldUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
setArmor(inUnit->getArmor());
}
-MineUnit::MineUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
+MineUnit::MineUnit(DefenseUnit *inUnit, AI *ai) : DefenseUnit(inUnit, ai) {
setID(inUnit->getID());
setPos(inUnit->getPosX(), inUnit->getPosY());
setDistanceTo(inUnit->getDistanceTo());
@@ -710,7 +710,7 @@ MineUnit::MineUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
setArmor(inUnit->getArmor());
}
-HubUnit::HubUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
+HubUnit::HubUnit(DefenseUnit *inUnit, AI *ai) : DefenseUnit(inUnit, ai) {
setID(inUnit->getID());
setPos(inUnit->getPosX(), inUnit->getPosY());
setDistanceTo(inUnit->getDistanceTo());
@@ -719,7 +719,7 @@ HubUnit::HubUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
setArmor(inUnit->getArmor());
}
-TowerUnit::TowerUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
+TowerUnit::TowerUnit(DefenseUnit *inUnit, AI *ai) : DefenseUnit(inUnit, ai) {
setID(inUnit->getID());
setPos(inUnit->getPosX(), inUnit->getPosY());
setDistanceTo(inUnit->getDistanceTo());
@@ -728,7 +728,7 @@ TowerUnit::TowerUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
setArmor(inUnit->getArmor());
}
-BridgeUnit::BridgeUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
+BridgeUnit::BridgeUnit(DefenseUnit *inUnit, AI *ai) : DefenseUnit(inUnit, ai) {
setID(inUnit->getID());
setPos(inUnit->getPosX(), inUnit->getPosY());
setDistanceTo(inUnit->getDistanceTo());
@@ -737,7 +737,7 @@ BridgeUnit::BridgeUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
setArmor(inUnit->getArmor());
}
-EnergyUnit::EnergyUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
+EnergyUnit::EnergyUnit(DefenseUnit *inUnit, AI *ai) : DefenseUnit(inUnit, ai) {
setID(inUnit->getID());
setPos(inUnit->getPosX(), inUnit->getPosY());
setDistanceTo(inUnit->getDistanceTo());
@@ -746,7 +746,7 @@ EnergyUnit::EnergyUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
setArmor(inUnit->getArmor());
}
-OffenseUnit::OffenseUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
+OffenseUnit::OffenseUnit(DefenseUnit *inUnit, AI *ai) : DefenseUnit(inUnit, ai) {
setID(inUnit->getID());
setPos(inUnit->getPosX(), inUnit->getPosY());
setDistanceTo(inUnit->getDistanceTo());
@@ -755,7 +755,7 @@ OffenseUnit::OffenseUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
setArmor(inUnit->getArmor());
}
-CrawlerUnit::CrawlerUnit(DefenseUnit *inUnit) : DefenseUnit(inUnit) {
+CrawlerUnit::CrawlerUnit(DefenseUnit *inUnit, AI *ai) : DefenseUnit(inUnit, ai) {
setID(inUnit->getID());
setPos(inUnit->getPosX(), inUnit->getPosY());
setDistanceTo(inUnit->getDistanceTo());
diff --git a/engines/scumm/he/moonbase/ai_defenseunit.h b/engines/scumm/he/moonbase/ai_defenseunit.h
index e658fc3..a6085da 100644
--- a/engines/scumm/he/moonbase/ai_defenseunit.h
+++ b/engines/scumm/he/moonbase/ai_defenseunit.h
@@ -25,6 +25,8 @@
namespace Scumm {
+class AI;
+
enum {
DUT_ANTI_AIR = 1,
DUT_SHIELD = 2,
@@ -53,9 +55,12 @@ private:
int _armor;
int _cost;
+protected:
+ AI *_ai;
+
public:
- DefenseUnit();
- DefenseUnit(DefenseUnit *inUnit);
+ DefenseUnit(AI *ai);
+ DefenseUnit(DefenseUnit *inUnit, AI *ai);
virtual ~DefenseUnit();
@@ -90,8 +95,8 @@ class AntiAirUnit : public DefenseUnit {
private:
public:
- AntiAirUnit();
- AntiAirUnit(DefenseUnit *inUnit);
+ AntiAirUnit(AI *ai);
+ AntiAirUnit(DefenseUnit *inUnit, AI *ai);
int getType() const { return DUT_ANTI_AIR; }
Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY);
int selectWeapon(int index);
@@ -101,8 +106,8 @@ class ShieldUnit : public DefenseUnit {
private:
public:
- ShieldUnit();
- ShieldUnit(DefenseUnit *inUnit);
+ ShieldUnit(AI *ai);
+ ShieldUnit(DefenseUnit *inUnit, AI *ai);
int getType() const { return DUT_SHIELD; }
Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY);
int selectWeapon(int index);
@@ -112,8 +117,8 @@ class MineUnit : public DefenseUnit {
private:
public:
- MineUnit();
- MineUnit(DefenseUnit *inUnit);
+ MineUnit(AI *ai);
+ MineUnit(DefenseUnit *inUnit, AI *ai);
int getType() const { return DUT_MINE; }
Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY);
int selectWeapon(int index);
@@ -123,8 +128,8 @@ class HubUnit : public DefenseUnit {
private:
public:
- HubUnit();
- HubUnit(DefenseUnit *inUnit);
+ HubUnit(AI *ai);
+ HubUnit(DefenseUnit *inUnit, AI *ai);
int getType() const { return DUT_HUB; }
Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY);
int selectWeapon(int index);
@@ -134,8 +139,8 @@ class TowerUnit : public DefenseUnit {
private:
public:
- TowerUnit();
- TowerUnit(DefenseUnit *inUnit);
+ TowerUnit(AI *ai);
+ TowerUnit(DefenseUnit *inUnit, AI *ai);
int getType() const { return DUT_TOWER; }
Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY);
int selectWeapon(int index);
@@ -145,8 +150,8 @@ class BridgeUnit : public DefenseUnit {
private:
public:
- BridgeUnit();
- BridgeUnit(DefenseUnit *inUnit);
+ BridgeUnit(AI *ai);
+ BridgeUnit(DefenseUnit *inUnit, AI *ai);
int getType() const { return DUT_BRIDGE; }
Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY);
int selectWeapon(int index);
@@ -156,8 +161,8 @@ class EnergyUnit : public DefenseUnit {
private:
public:
- EnergyUnit();
- EnergyUnit(DefenseUnit *inUnit);
+ EnergyUnit(AI *ai);
+ EnergyUnit(DefenseUnit *inUnit, AI *ai);
int getType() const { return DUT_ENERGY; }
Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY);
int selectWeapon(int index);
@@ -167,8 +172,8 @@ class OffenseUnit : public DefenseUnit {
private:
public:
- OffenseUnit();
- OffenseUnit(DefenseUnit *inUnit);
+ OffenseUnit(AI *ai);
+ OffenseUnit(DefenseUnit *inUnit, AI *ai);
int getType() const { return DUT_OFFENSE; }
Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY);
int selectWeapon(int index);
@@ -178,8 +183,8 @@ class CrawlerUnit : public DefenseUnit {
private:
public:
- CrawlerUnit();
- CrawlerUnit(DefenseUnit *inUnit);
+ CrawlerUnit(AI *ai);
+ CrawlerUnit(DefenseUnit *inUnit, AI *ai);
int getType() const { return DUT_CRAWLER; }
Common::Point *createTargetPos(int index, int distance, int weaponType, int sourceX, int sourceY);
int selectWeapon(int index);
diff --git a/engines/scumm/he/moonbase/ai_main.cpp b/engines/scumm/he/moonbase/ai_main.cpp
index d34a5c1..d7e86d5 100644
--- a/engines/scumm/he/moonbase/ai_main.cpp
+++ b/engines/scumm/he/moonbase/ai_main.cpp
@@ -166,10 +166,7 @@ int *storedLaunchAction[5] = {NULL};
const int32 *MCP_params;
-Common::Array<int> lastXCoord[5];
-Common::Array<int> lastYCoord[5];
-
-void resetAI(ScummEngine_v90he *vm) {
+void AI::resetAI(ScummEngine_v90he *vm) {
_vm = vm;
AIstate = STATE_CHOOSE_BEHAVIOR;
@@ -194,7 +191,7 @@ void resetAI(ScummEngine_v90he *vm) {
}
}
-void cleanUpAI() {
+void AI::cleanUpAI() {
warning("----------------------> Cleaning Up AI");
for (int i = 1; i != 5; i++) {
@@ -212,7 +209,7 @@ void cleanUpAI() {
}
}
-void setAIType(const int paramCount, const int32 *params) {
+void AI::setAIType(const int paramCount, const int32 *params) {
if (AItype[params[AI_TYPE_PLAYER_NUM]]) {
delete AItype[params[AI_TYPE_PLAYER_NUM]];
AItype[params[AI_TYPE_PLAYER_NUM]] = NULL;
@@ -229,7 +226,7 @@ void setAIType(const int paramCount, const int32 *params) {
warning("AI for player %d is %s", params[AI_TYPE_PLAYER_NUM], AItype[params[AI_TYPE_PLAYER_NUM]]->getNameString());
}
-int masterControlProgram(const int paramCount, const int32 *params) {
+int AI::masterControlProgram(const int paramCount, const int32 *params) {
static Tree *myTree;
static int index;
@@ -1026,7 +1023,7 @@ int masterControlProgram(const int paramCount, const int32 *params) {
return 1;
}
-int chooseBehavior() {
+int AI::chooseBehavior() {
static int dominantMode = 0;
if (getBuildingStackPtr() < 5)
@@ -1446,7 +1443,7 @@ int chooseBehavior() {
return -1;
}
-int chooseTarget(int behavior1) {
+int AI::chooseTarget(int behavior1) {
int numPools = getNumberOfPools();
int currentPlayer = getCurrentPlayer();
@@ -1805,7 +1802,7 @@ int chooseTarget(int behavior1) {
return 0;
}
-Tree *initApproachTarget(int targetX, int targetY, Node **retNode) {
+Tree *AI::initApproachTarget(int targetX, int targetY, Node **retNode) {
int sourceHub = 0;
if (behavior == 2)
@@ -1813,7 +1810,7 @@ Tree *initApproachTarget(int targetX, int targetY, Node **retNode) {
else
sourceHub = getClosestUnit(targetX + 10, targetY, getMaxX(), getCurrentPlayer(), 1, BUILDING_MAIN_BASE, 1, MIN_DIST);
- Traveller *myTraveller = new Traveller(getHubX(sourceHub), getHubY(sourceHub));
+ Traveller *myTraveller = new Traveller(getHubX(sourceHub), getHubY(sourceHub), this);
myTraveller->setSourceHub(sourceHub);
//target adjustment so that room is allowed for the appropriate shot
@@ -1825,13 +1822,13 @@ Tree *initApproachTarget(int targetX, int targetY, Node **retNode) {
Traveller::setTargetPosY(targetY + adjY);
Traveller::setMaxDist(340);
- Tree *myTree = new Tree(myTraveller, TREE_DEPTH);
+ Tree *myTree = new Tree(myTraveller, TREE_DEPTH, this);
*retNode = myTree->aStarSearch_singlePassInit();
return myTree;
}
-int *approachTarget(Tree *myTree, int &xTarget, int &yTarget, Node **currentNode) {
+int *AI::approachTarget(Tree *myTree, int &xTarget, int &yTarget, Node **currentNode) {
int *retVal = NULL;
*currentNode = NULL;
@@ -1905,13 +1902,13 @@ int *approachTarget(Tree *myTree, int &xTarget, int &yTarget, Node **currentNode
return retVal;
}
-Tree *initAcquireTarget(int targetX, int targetY, Node **retNode) {
+Tree *AI::initAcquireTarget(int targetX, int targetY, Node **retNode) {
int sourceHub = getClosestUnit(targetX, targetY, getMaxX(), getCurrentPlayer(), 1, BUILDING_MAIN_BASE, 1, MIN_DIST);
warning("My coords (%d): %d %d", sourceHub, getHubX(sourceHub), getHubY(sourceHub));
Sortie::setSourcePos(getHubX(sourceHub), getHubY(sourceHub));
Sortie::setTargetPos(targetX, targetY);
- Sortie *myBaseTarget = new Sortie();
+ Sortie *myBaseTarget = new Sortie(this);
myBaseTarget->setValueG(0);
myBaseTarget->setUnitType(ITEM_BOMB);
@@ -1932,14 +1929,13 @@ Tree *initAcquireTarget(int targetX, int targetY, Node **retNode) {
return NULL;
}
- Tree *myTree = new Tree(myBaseTarget, 4);
+ Tree *myTree = new Tree(myBaseTarget, 4, this);
*retNode = myTree->aStarSearch_singlePassInit();
return myTree;
}
-
-int *acquireTarget(int targetX, int targetY, Tree *myTree, int &errorCode) {
+int *AI::acquireTarget(int targetX, int targetY, Tree *myTree, int &errorCode) {
int currentPlayer = getCurrentPlayer();
int *retVal = NULL;
@@ -2005,7 +2001,7 @@ int *acquireTarget(int targetX, int targetY, Tree *myTree, int &errorCode) {
return retVal;
}
-int *acquireTarget(int targetX, int targetY) {
+int *AI::acquireTarget(int targetX, int targetY) {
int *retVal = new int[4];
int sourceHub = getClosestUnit(targetX, targetY, getMaxX(), getCurrentPlayer(), 1, BUILDING_MAIN_BASE, 1, 110);
@@ -2023,7 +2019,7 @@ int *acquireTarget(int targetX, int targetY) {
return retVal;
}
-int *energizeTarget(int &targetX, int &targetY, int index) {
+int *AI::energizeTarget(int &targetX, int &targetY, int index) {
int n = 10;
static int currentPlayer = 0;
static int pool = 0;
@@ -2237,7 +2233,7 @@ int *energizeTarget(int &targetX, int &targetY, int index) {
return retVal;
}
-int *offendTarget(int &targetX, int &targetY, int index) {
+int *AI::offendTarget(int &targetX, int &targetY, int index) {
int *retVal = NULL;
int target = getClosestUnit(targetX + 10, targetY, 20, 0, 0, 0, 0);
@@ -2253,35 +2249,35 @@ int *offendTarget(int &targetX, int &targetY, int index) {
switch (type) {
case BUILDING_OFFENSIVE_LAUNCHER:
- thisUnit = new OffenseUnit();
+ thisUnit = new OffenseUnit(this);
break;
case BUILDING_TOWER:
- thisUnit = new TowerUnit();
+ thisUnit = new TowerUnit(this);
break;
case BUILDING_MAIN_BASE:
- thisUnit = new HubUnit();
+ thisUnit = new HubUnit(this);
break;
case BUILDING_ENERGY_COLLECTOR:
- thisUnit = new EnergyUnit();
+ thisUnit = new EnergyUnit(this);
break;
case BUILDING_CRAWLER:
- thisUnit = new CrawlerUnit();
+ thisUnit = new CrawlerUnit(this);
break;
case BUILDING_BRIDGE:
- thisUnit = new BridgeUnit();
+ thisUnit = new BridgeUnit(this);
break;
case BUILDING_SHIELD:
- thisUnit = new ShieldUnit();
+ thisUnit = new ShieldUnit(this);
break;
default:
- thisUnit = new HubUnit();
+ thisUnit = new HubUnit(this);
break;
}
@@ -2355,9 +2351,9 @@ int *offendTarget(int &targetX, int &targetY, int index) {
return retVal;
}
-int *defendTarget(int &targetX, int &targetY, int index) {
+int *AI::defendTarget(int &targetX, int &targetY, int index) {
int *retVal = NULL;
- Defender *thisDefender = new Defender;
+ Defender *thisDefender = new Defender(this);
int defStatus = thisDefender->calculateDefenseUnitPosition(targetX, targetY, index);
if (defStatus > 0) {
@@ -2407,138 +2403,138 @@ int *defendTarget(int &targetX, int &targetY, int index) {
return retVal;
}
-int getClosestUnit(int x, int y, int radius, int player, int alignment, int unitType, int checkUnitEnabled) {
+int AI::getClosestUnit(int x, int y, int radius, int player, int alignment, int unitType, int checkUnitEnabled) {
assert((unitType >= 0) && (unitType <= 12));
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_CLOSEST_UNIT], 7, x, y, radius, player, alignment, unitType, checkUnitEnabled);
return retVal;
}
-int getClosestUnit(int x, int y, int radius, int player, int alignment, int unitType, int checkUnitEnabled, int minDist) {
+int AI::getClosestUnit(int x, int y, int radius, int player, int alignment, int unitType, int checkUnitEnabled, int minDist) {
assert((unitType >= 0) && (unitType <= 12));
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_CLOSEST_UNIT], 8, x, y, radius, player, alignment, unitType, checkUnitEnabled, minDist);
return retVal;
}
-int getDistance(int originX, int originY, int endX, int endY) {
+int AI::getDistance(int originX, int originY, int endX, int endY) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_WORLD_DIST], 4, originX, originY, endX, endY);
return retVal;
}
-int calcAngle(int originX, int originY, int endX, int endY) {
+int AI::calcAngle(int originX, int originY, int endX, int endY) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_WORLD_ANGLE], 5, originX, originY, endX, endY, 0);
return retVal;
}
-int calcAngle(int originX, int originY, int endX, int endY, int noWrapFlag) {
+int AI::calcAngle(int originX, int originY, int endX, int endY, int noWrapFlag) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_WORLD_ANGLE], 5, originX, originY, endX, endY, noWrapFlag);
return retVal;
}
-int getTerrain(int x, int y) {
+int AI::getTerrain(int x, int y) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_TERRAIN_TYPE], 2, x, y);
return retVal;
}
-int estimateNextRoundEnergy(int player) {
+int AI::estimateNextRoundEnergy(int player) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_ESTIMATE_NEXT_ROUND_ENERGY], 1, player);
return retVal / 10;
}
-int getHubX(int hub) {
+int AI::getHubX(int hub) {
assert(hub >= 0 && hub <= 500);
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_HUB_X, hub);
return retVal;
}
-int getHubY(int hub) {
+int AI::getHubY(int hub) {
assert(hub >= 0 && hub <= 500);
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_HUB_Y, hub);
return retVal;
}
-int getMaxX() {
+int AI::getMaxX() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_WORLD_X_SIZE);
return retVal;
}
-int getMaxY() {
+int AI::getMaxY() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_WORLD_Y_SIZE);
return retVal;
}
-int getCurrentPlayer() {
+int AI::getCurrentPlayer() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_CURRENT_PLAYER);
assert(retVal != 0);
return retVal;
}
-int getMaxPower() {
+int AI::getMaxPower() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_MAX_POWER);
return retVal;
}
-int getMinPower() {
+int AI::getMinPower() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_MIN_POWER);
return retVal;
}
-int getTerrainSquareSize() {
+int AI::getTerrainSquareSize() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_TERRAIN_SQUARE_SIZE);
return retVal;
}
-int getBuildingOwner(int building) {
+int AI::getBuildingOwner(int building) {
assert((building > 0) && (building < 501));
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_OWNER, building);
return retVal;
}
-int getBuildingState(int building) {
+int AI::getBuildingState(int building) {
assert((building > 0) && (building < 501));
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_STATE, building);
return retVal;
}
-int getBuildingType(int building) {
+int AI::getBuildingType(int building) {
assert((building > 0) && (building < 501));
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_TYPE, building);
return retVal;
}
-int getBuildingArmor(int building) {
+int AI::getBuildingArmor(int building) {
assert((building > 0) && (building < 501));
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_ARMOR, building);
return retVal;
}
-int getBuildingWorth(int building) {
+int AI::getBuildingWorth(int building) {
assert((building > 0) && (building < 501));
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_WORTH, building);
return retVal;
}
-int getEnergyPoolsArray() {
+int AI::getEnergyPoolsArray() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_ENERGY_POOLS_ARRAY);
return retVal;
}
-int getCoordinateVisibility(int x, int y, int playerNum) {
+int AI::getCoordinateVisibility(int x, int y, int playerNum) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 4, D_GET_COORDINATE_VISIBILITY, x, y, playerNum);
return retVal;
}
-int getUnitVisibility(int unit, int playerNum) {
+int AI::getUnitVisibility(int unit, int playerNum) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 3, D_GET_UNIT_VISIBILITY, unit, playerNum);
return retVal;
}
-int getEnergyPoolVisibility(int pool, int playerNum) {
+int AI::getEnergyPoolVisibility(int pool, int playerNum) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 3, D_GET_ENERGY_POOL_VISIBILITY, pool, playerNum);
return retVal;
}
-int getNumberOfPools() {
+int AI::getNumberOfPools() {
int retVal = 0;
if (AItype[getCurrentPlayer()]->getID() == ENERGY_HOG) {
@@ -2550,72 +2546,72 @@ int getNumberOfPools() {
return retVal;
}
-int getNumberOfPlayers() {
+int AI::getNumberOfPlayers() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_NUMBER_OF_PLAYERS);
return retVal;
}
-int getPlayerEnergy() {
+int AI::getPlayerEnergy() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_PLAYER_ENERGY);
return static_cast<int>(static_cast<float>(retVal) / 10.0);
}
-int getPlayerMaxTime() {
+int AI::getPlayerMaxTime() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_PLAYER_MAX_TIME);
return retVal;
}
-int getWindXSpeed() {
+int AI::getWindXSpeed() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_WIND_X_SPEED);
return retVal;
}
-int getWindYSpeed() {
+int AI::getWindYSpeed() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_WIND_Y_SPEED);
return retVal;
}
-int getTotalWindSpeed() {
+int AI::getTotalWindSpeed() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_TOTAL_WIND_SPEED);
return retVal;
}
-int getWindXSpeedMax() {
+int AI::getWindXSpeedMax() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_WIND_X_SPEED_MAX);
return retVal;
}
-int getWindYSpeedMax() {
+int AI::getWindYSpeedMax() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_WIND_Y_SPEED_MAX);
return retVal;
}
-int getBigXSize() {
+int AI::getBigXSize() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_BIG_X_SIZE);
return retVal;
}
-int getBigYSize() {
+int AI::getBigYSize() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_BIG_Y_SIZE);
return retVal;
}
-int getEnergyPoolWidth(int pool) {
+int AI::getEnergyPoolWidth(int pool) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_ENERGY_POOL_WIDTH, pool);
return retVal;
}
-int getBuildingMaxArmor(int building) {
+int AI::getBuildingMaxArmor(int building) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_MAX_ARMOR, building);
return retVal;
}
-int getTimerValue(int timerNum) {
+int AI::getTimerValue(int timerNum) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_TIMER_VALUE, timerNum);
return retVal;
}
-int getLastAttacked(int &x, int &y) {
+int AI::getLastAttacked(int &x, int &y) {
int currentPlayer = getCurrentPlayer();
x = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_LAST_ATTACKED_X, currentPlayer);
y = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_LAST_ATTACKED_Y, currentPlayer);
@@ -2625,12 +2621,12 @@ int getLastAttacked(int &x, int &y) {
return 0;
}
-int getPlayerTeam(int player) {
+int AI::getPlayerTeam(int player) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_PLAYER_TEAM, player);
return retVal;
}
-int getBuildingTeam(int building) {
+int AI::getBuildingTeam(int building) {
assert((building >= 1) && (building <= 500));
if (getBuildingOwner(building) == 0) return 0;
@@ -2639,37 +2635,37 @@ int getBuildingTeam(int building) {
return retVal;
}
-int getFOW() {
+int AI::getFOW() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_FOW);
return retVal;
}
-int getAnimSpeed() {
+int AI::getAnimSpeed() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_ANIM_SPEED);
return retVal;
}
-int getBuildingStackPtr() {
+int AI::getBuildingStackPtr() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_BUILDING_STACK_PTR);
return retVal;
}
-int getTurnCounter() {
+int AI::getTurnCounter() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_TURN_COUNTER);
return retVal;
}
-int getGroundAltitude(int x, int y) {
+int AI::getGroundAltitude(int x, int y) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_GROUND_ALTITUDE], 2, x, y);
return retVal;
}
-int checkForCordOverlap(int xStart, int yStart, int affectRadius, int simulateFlag) {
+int AI::checkForCordOverlap(int xStart, int yStart, int affectRadius, int simulateFlag) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_CHECK_FOR_CORD_OVERLAP], 4, xStart, yStart, affectRadius, simulateFlag);
return retVal;
}
-int checkForAngleOverlap(int unit, int angle) {
+int AI::checkForAngleOverlap(int unit, int angle) {
assert(angle > -721);
assert(angle < 721);
@@ -2679,42 +2675,42 @@ int checkForAngleOverlap(int unit, int angle) {
return retVal;
}
-int checkForUnitOverlap(int x, int y, int radius, int ignoredUnit) {
+int AI::checkForUnitOverlap(int x, int y, int radius, int ignoredUnit) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_CHECK_FOR_UNIT_OVERLAP], 4, x, y, radius, ignoredUnit);
return retVal;
}
-int checkForEnergySquare(int x, int y) {
+int AI::checkForEnergySquare(int x, int y) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_CHECK_FOR_ENERGY_SQUARE], 2, x, y);
return retVal;
}
-int aiChat() {
+int AI::aiChat() {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_AI_CHAT], 0);
return retVal;
}
-int getPowerAngleFromPoint(int originX, int originY, int endX, int endY, int threshold, int olFlag) {
+int AI::getPowerAngleFromPoint(int originX, int originY, int endX, int endY, int threshold, int olFlag) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_POWER_ANGLE_FROM_POINT], 6, originX, originY, endX, endY, threshold, olFlag);
return retVal;
}
-int getPowerAngleFromPoint(int originX, int originY, int endX, int endY, int threshold) {
+int AI::getPowerAngleFromPoint(int originX, int originY, int endX, int endY, int threshold) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_POWER_ANGLE_FROM_POINT], 5, originX, originY, endX, endY, threshold);
return retVal;
}
-int checkIfWaterState(int x, int y) {
+int AI::checkIfWaterState(int x, int y) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_CHECK_IF_WATER_STATE], 2, x, y);
return retVal;
}
-int checkIfWaterSquare(int x, int y) {
+int AI::checkIfWaterSquare(int x, int y) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_CHECK_IF_WATER_SQUARE], 2, x, y);
return retVal;
}
-int getUnitsWithinRadius(int x, int y, int radius) {
+int AI::getUnitsWithinRadius(int x, int y, int radius) {
assert(x >= 0);
assert(y >= 0);
assert(radius >= 0);
@@ -2725,21 +2721,21 @@ int getUnitsWithinRadius(int x, int y, int radius) {
return retVal;
}
-int getLandingPoint(int x, int y, int power, int angle) {
+int AI::getLandingPoint(int x, int y, int power, int angle) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_LANDING_POINT], 4, x, y, power, angle);
return retVal;
}
-int getEnemyUnitsVisible(int playerNum) {
+int AI::getEnemyUnitsVisible(int playerNum) {
int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_ENEMY_UNITS_VISIBLE], 1, playerNum);
return retVal;
}
-float degToRad(float degrees) {
+float AI::degToRad(float degrees) {
return degrees * M_PI / 180.;
}
-void limitLocation(int &a, int &b, int c, int d) {
+void AI::limitLocation(int &a, int &b, int c, int d) {
if (a >= 0) {
a = (a % c);
} else {
@@ -2753,7 +2749,7 @@ void limitLocation(int &a, int &b, int c, int d) {
}
}
-int energyPoolSize(int pool) {
+int AI::energyPoolSize(int pool) {
int width = getEnergyPoolWidth(pool);
switch (width) {
@@ -2770,7 +2766,7 @@ int energyPoolSize(int pool) {
return 0;
}
-int getMaxCollectors(int pool) {
+int AI::getMaxCollectors(int pool) {
int width = getEnergyPoolWidth(pool);
switch (width) {
@@ -2787,7 +2783,7 @@ int getMaxCollectors(int pool) {
return 0;
}
-int simulateBuildingLaunch(int x, int y, int power, int angle, int numSteps, int isEnergy) {
+int AI::simulateBuildingLaunch(int x, int y, int power, int angle, int numSteps, int isEnergy) {
static int sXSpeed = 0;
static int sYSpeed = 0;
static int sZSpeed = 0;
@@ -2939,7 +2935,7 @@ int simulateBuildingLaunch(int x, int y, int power, int angle, int numSteps, int
return 0;
}
-int simulateWeaponLaunch(int x, int y, int power, int angle, int numSteps) {
+int AI::simulateWeaponLaunch(int x, int y, int power, int angle, int numSteps) {
static int sXSpeed = 0;
static int sYSpeed = 0;
static int sZSpeed = 0;
@@ -3054,7 +3050,7 @@ int simulateWeaponLaunch(int x, int y, int power, int angle, int numSteps) {
return 0;
}
-int fakeSimulateWeaponLaunch(int x, int y, int power, int angle) {
+int AI::fakeSimulateWeaponLaunch(int x, int y, int power, int angle) {
int distance = power * 480 / getMaxPower();
float radAngle = degToRad(angle);
int maxX = getMaxX();
@@ -3069,7 +3065,7 @@ int fakeSimulateWeaponLaunch(int x, int y, int power, int angle) {
return MAX(1, x + y * maxX);
}
-int getEnergyHogType() {
+int AI::getEnergyHogType() {
return energyHogType;
}
diff --git a/engines/scumm/he/moonbase/ai_main.h b/engines/scumm/he/moonbase/ai_main.h
index 8c58a70..7bd9a8f 100644
--- a/engines/scumm/he/moonbase/ai_main.h
+++ b/engines/scumm/he/moonbase/ai_main.h
@@ -23,6 +23,7 @@
#ifndef SCUMM_HE_MOONBASE_AI_MAIN_H
#define SCUMM_HE_MOONBASE_AI_MAIN_H
+#include "common/array.h"
#include "scumm/he/moonbase/ai_tree.h"
namespace Scumm {
@@ -31,8 +32,6 @@ class ScummEngine_v90he;
extern ScummEngine_v90he *_vm;
-typedef Common::Array<int>::iterator intVecItr;
-
enum {
TERRAIN_TYPE_GOOD = 0,
TERRAIN_TYPE_SLOPE = 1,
@@ -84,98 +83,114 @@ enum {
MIN_DIST = 108
};
-void resetAI(ScummEngine_v90he *vm);
-void cleanUpAI();
-void setAIType(const int paramCount, const int32 *params);
-int masterControlProgram(const int paramCount, const int32 *params);
-
-int chooseBehavior();
-int chooseTarget(int behavior);
-
-Tree *initApproachTarget(int targetX, int targetY, Node **retNode);
-int *approachTarget(Tree *myTree, int &x, int &y, Node **currentNode);
-Tree *initAcquireTarget(int targetX, int targetY, Node **retNode);
-int *acquireTarget(int targetX, int targetY);
-int *acquireTarget(int targetX, int targetY, Tree *myTree, int &errorCode);
-int *offendTarget(int &targetX, int &targetY, int index);
-int *defendTarget(int &targetX, int &targetY, int index);
-int *energizeTarget(int &targetX, int &targetY, int index);
-
-int getClosestUnit(int x, int y, int radius, int player, int alignment, int unitType, int checkUnitEnabled);
-int getClosestUnit(int x, int y, int radius, int player, int alignment, int unitType, int checkUnitEnabled, int minDist);
-
-int getDistance(int originX, int originY, int endX, int endY);
-int calcAngle(int originX, int originY, int endX, int endY);
-int calcAngle(int originX, int originY, int endX, int endY, int noWrapFlag);
-int getTerrain(int x, int y);
-int getHubX(int hub);
-int getHubY(int hub);
-int getMaxX();
-int getMaxY();
-int getCurrentPlayer();
-int getMaxPower();
-int getMinPower();
-int getTerrainSquareSize();
-int getBuildingOwner(int building);
-int getBuildingState(int building);
-int getBuildingType(int building);
-int getBuildingArmor(int building);
-int getBuildingWorth(int building);
-int getEnergyPoolsArray();
-int getCoordinateVisibility(int x, int y, int playerNum);
-int getUnitVisibility(int unit, int playerNum);
-int getEnergyPoolVisibility(int pool, int playerNum);
-int getNumberOfPools();
-int getNumberOfPlayers();
-int getPlayerEnergy();
-int getPlayerMaxTime();
-int getWindXSpeed();
-int getWindYSpeed();
-int getTotalWindSpeed();
-int getWindXSpeedMax();
-int getWindYSpeedMax();
-int getBigXSize();
-int getBigYSize();
-int getEnergyPoolWidth(int pool);
-int getBuildingMaxArmor(int building);
-int getTimerValue(int timerNum);
-int getLastAttacked(int &x, int &y);
-int getPlayerTeam(int player);
-int getBuildingTeam(int building);
-int getFOW();
-int getAnimSpeed();
-int getBuildingStackPtr();
-int getTurnCounter();
-
-int getGroundAltitude(int x, int y);
-int checkForCordOverlap(int xStart, int yStart, int affectRadius, int simulateFlag);
-int checkForAngleOverlap(int unit, int angle);
-int estimateNextRoundEnergy(int player);
-int checkForUnitOverlap(int x, int y, int radius, int ignoredUnit);
-int checkForEnergySquare(int x, int y);
-int aiChat();
-
-int simulateBuildingLaunch(int x, int y, int power, int angle, int numSteps, int isEnergy);
-int simulateWeaponLaunch(int x, int y, int power, int angle, int numSteps);
-int fakeSimulateWeaponLaunch(int x, int y, int power, int angle);
-
-int getPowerAngleFromPoint(int originX, int originY, int endX, int endY, int threshold, int olFlag);
-int getPowerAngleFromPoint(int originX, int originY, int endX, int endY, int threshold);
-int checkIfWaterState(int x, int y);
-int checkIfWaterSquare(int x, int y);
-int getUnitsWithinRadius(int x, int y, int radius);
-int getLandingPoint(int x, int y, int power, int angle);
-int getEnemyUnitsVisible(int playerNum);
-
-float degToRad(float degrees);
-void limitLocation(int &a, int &b, int c, int d);
-int energyPoolSize(int pool);
-int getMaxCollectors(int pool);
-
-int getEnergyHogType();
-
-extern Common::Array<int> lastXCoord[];
-extern Common::Array<int> lastYCoord[];
+class AI {
+public:
+ void resetAI(ScummEngine_v90he *vm);
+ void cleanUpAI();
+ void setAIType(const int paramCount, const int32 *params);
+ int masterControlProgram(const int paramCount, const int32 *params);
+
+private:
+ int chooseBehavior();
+ int chooseTarget(int behavior);
+
+ Tree *initApproachTarget(int targetX, int targetY, Node **retNode);
+ int *approachTarget(Tree *myTree, int &x, int &y, Node **currentNode);
+ Tree *initAcquireTarget(int targetX, int targetY, Node **retNode);
+ int *acquireTarget(int targetX, int targetY);
+ int *acquireTarget(int targetX, int targetY, Tree *myTree, int &errorCode);
+ int *offendTarget(int &targetX, int &targetY, int index);
+ int *defendTarget(int &targetX, int &targetY, int index);
+ int *energizeTarget(int &targetX, int &targetY, int index);
+
+public:
+ int getClosestUnit(int x, int y, int radius, int player, int alignment, int unitType, int checkUnitEnabled);
+ int getClosestUnit(int x, int y, int radius, int player, int alignment, int unitType, int checkUnitEnabled, int minDist);
+
+ int getDistance(int originX, int originY, int endX, int endY);
+ int calcAngle(int originX, int originY, int endX, int endY);
+ int calcAngle(int originX, int originY, int endX, int endY, int noWrapFlag);
+ int getTerrain(int x, int y);
+
+ int getHubX(int hub);
+ int getHubY(int hub);
+ int getMaxX();
+ int getMaxY();
+
+ int getCurrentPlayer();
+ int getMaxPower();
+ int getMinPower();
+ int getTerrainSquareSize();
+ int getBuildingOwner(int building);
+ int getBuildingState(int building);
+ int getBuildingType(int building);
+ int getBuildingArmor(int building);
+ int getBuildingMaxArmor(int building);
+ int getBuildingWorth(int building);
+ int getBuildingTeam(int building);
+
+ int getPlayerEnergy();
+ int getPlayerMaxTime();
+ int getTimerValue(int timerNum);
+ int getPlayerTeam(int player);
+
+ int getAnimSpeed();
+
+ int simulateBuildingLaunch(int x, int y, int power, int angle, int numSteps, int isEnergy);
+
+ int getPowerAngleFromPoint(int originX, int originY, int endX, int endY, int threshold, int olFlag);
+ int getPowerAngleFromPoint(int originX, int originY, int endX, int endY, int threshold);
+ int checkIfWaterState(int x, int y);
+ int getUnitsWithinRadius(int x, int y, int radius);
+
+ float degToRad(float degrees);
+
+ int getEnergyHogType();
+
+private:
+ int getEnergyPoolsArray();
+ int getCoordinateVisibility(int x, int y, int playerNum);
+ int getUnitVisibility(int unit, int playerNum);
+ int getEnergyPoolVisibility(int pool, int playerNum);
+ int getNumberOfPools();
+ int getNumberOfPlayers();
+ int getWindXSpeed();
+ int getWindYSpeed();
+ int getTotalWindSpeed();
+ int getWindXSpeedMax();
+ int getWindYSpeedMax();
+ int getBigXSize();
+ int getBigYSize();
+ int getEnergyPoolWidth(int pool);
+ int getLastAttacked(int &x, int &y);
+ int getFOW();
+ int getBuildingStackPtr();
+ int getTurnCounter();
+
+ int getGroundAltitude(int x, int y);
+ int checkForCordOverlap(int xStart, int yStart, int affectRadius, int simulateFlag);
+ int checkForAngleOverlap(int unit, int angle);
+ int estimateNextRoundEnergy(int player);
+ int checkForUnitOverlap(int x, int y, int radius, int ignoredUnit);
+ int checkForEnergySquare(int x, int y);
+ int aiChat();
+
+ int simulateWeaponLaunch(int x, int y, int power, int angle, int numSteps);
+ int fakeSimulateWeaponLaunch(int x, int y, int power, int angle);
+
+ int checkIfWaterSquare(int x, int y);
+
+ int getLandingPoint(int x, int y, int power, int angle);
+ int getEnemyUnitsVisible(int playerNum);
+
+ void limitLocation(int &a, int &b, int c, int d);
+ int energyPoolSize(int pool);
+ int getMaxCollectors(int pool);
+
+public:
+ Common::Array<int> lastXCoord[5];
+ Common::Array<int> lastYCoord[5];
+};
} // End of namespace Scumm
diff --git a/engines/scumm/he/moonbase/ai_targetacquisition.cpp b/engines/scumm/he/moonbase/ai_targetacquisition.cpp
index 253142a..d91660c 100644
--- a/engines/scumm/he/moonbase/ai_targetacquisition.cpp
+++ b/engines/scumm/he/moonbase/ai_targetacquisition.cpp
@@ -43,28 +43,28 @@ Sortie::~Sortie() {
void Sortie::setEnemyDefenses(int enemyDefensesScummArray, int defendX, int defendY) {
DefenseUnit *thisUnit;
- int currentPlayer = getCurrentPlayer();
+ int currentPlayer = _ai->getCurrentPlayer();
for (int i = 0; i < 200; i++) {
int thisElement = _vm->_moonbase->readFromArray(enemyDefensesScummArray, 0, i);
if (thisElement) {
- if (getBuildingOwner(thisElement)) {
- if (getPlayerTeam(currentPlayer) != getBuildingTeam(thisElement)) {
- int type = getBuildingType(thisElement);
+ if (_ai->getBuildingOwner(thisElement)) {
+ if (_ai->getPlayerTeam(currentPlayer) != _ai->getBuildingTeam(thisElement)) {
+ int type = _ai->getBuildingType(thisElement);
switch (type) {
case BUILDING_ANTI_AIR:
- thisUnit = new AntiAirUnit();
+ thisUnit = new AntiAirUnit(_ai);
break;
case BUILDING_SHIELD:
- thisUnit = new ShieldUnit();
+ thisUnit = new ShieldUnit(_ai);
break;
case BUILDING_EXPLOSIVE_MINE:
- if (getDistance(getHubX(thisElement), getHubY(thisElement), defendX, defendY) < 90)
- thisUnit = new MineUnit();
+ if (_ai->getDistance(_ai->getHubX(thisElement), _ai->getHubY(thisElement), defendX, defendY) < 90)
+ thisUnit = new MineUnit(_ai);
else
thisUnit = NULL;
@@ -81,9 +81,9 @@ void Sortie::setEnemyDefenses(int enemyDefensesScummArray, int defendX, int defe
if (thisUnit != NULL) {
thisUnit->setID(thisElement);
- thisUnit->setPos(getHubX(thisElement), getHubY(thisElement));
+ thisUnit->setPos(_ai->getHubX(thisElement), _ai->getHubY(thisElement));
- if (getBuildingState(thisElement)) thisUnit->setState(DUS_OFF);
+ if (_ai->getBuildingState(thisElement)) thisUnit->setState(DUS_OFF);
_enemyDefenses.push_back(thisUnit);
}
@@ -111,7 +111,7 @@ int Sortie::numChildrenToGen() {
IContainedObject *Sortie::createChildObj(int index, int &completionFlag) {
float thisDamage;
- Sortie *retSortie = new Sortie;
+ Sortie *retSortie = new Sortie(_ai);
int activeDefenses = 0;
Common::Array<DefenseUnit *> thisEnemyDefenses;
@@ -122,23 +122,23 @@ IContainedObject *Sortie::createChildObj(int index, int &completionFlag) {
switch ((*k)->getType()) {
case DUT_ANTI_AIR:
- temp = new AntiAirUnit(*k);
+ temp = new AntiAirUnit(*k, _ai);
break;
case DUT_SHIELD:
- temp = new ShieldUnit(*k);
+ temp = new ShieldUnit(*k, _ai);
break;
case DUT_MINE:
- temp = new MineUnit(*k);
+ temp = new MineUnit(*k, _ai);
break;
case DUT_CRAWLER:
- temp = new CrawlerUnit(*k);
+ temp = new CrawlerUnit(*k, _ai);
break;
default:
- temp = new ShieldUnit(*k);
+ temp = new ShieldUnit(*k, _ai);
break;
}
@@ -155,7 +155,7 @@ IContainedObject *Sortie::createChildObj(int index, int &completionFlag) {
retSortie->setUnitType(currentWeapon->getTypeID());
// Calculate distance from target to source hub
- int distance = getDistance(currentTarget->getPosX(), currentTarget->getPosY(), getSourcePosX(), getSourcePosY());
+ int distance = _ai->getDistance(currentTarget->getPosX(), currentTarget->getPosY(), getSourcePosX(), getSourcePosY());
// Pick correct shot position according to index
Common::Point *targetCoords;
@@ -169,7 +169,7 @@ IContainedObject *Sortie::createChildObj(int index, int &completionFlag) {
// Loop through defensive units, toggling anti-air units and deciding if this weapon will land safely
for (Common::Array<DefenseUnit *>::iterator i = thisEnemyDefenses.begin(); i != thisEnemyDefenses.end(); i++) {
- distance = getDistance((*i)->getPosX(), (*i)->getPosY(), targetCoords->x, targetCoords->y);
+ distance = _ai->getDistance((*i)->getPosX(), (*i)->getPosY(), targetCoords->x, targetCoords->y);
// Check to see if we're within an active defense's radius
if ((distance < (*i)->getRadius()) && ((*i)->getState() == DUS_ON)) {
@@ -210,10 +210,10 @@ IContainedObject *Sortie::createChildObj(int index, int &completionFlag) {
for (Common::Array<DefenseUnit *>::iterator i = thisEnemyDefenses.begin(); i != thisEnemyDefenses.end(); ) {
// Special simulated crawler detonation location used, since it walks a bit
if (currentWeapon->getTypeID() == ITEM_CRAWLER)
- distance = getDistance((*i)->getPosX(), (*i)->getPosY(), currentTarget->getPosX(), currentTarget->getPosY());
+ distance = _ai->getDistance((*i)->getPosX(), (*i)->getPosY(), currentTarget->getPosX(), currentTarget->getPosY());
// Normal detonation location used here
else {
- distance = getDistance((*i)->getPosX(), (*i)->getPosY(), targetCoords->x, targetCoords->y);
+ distance = _ai->getDistance((*i)->getPosX(), (*i)->getPosY(), targetCoords->x, targetCoords->y);
}
if (distance < currentWeapon->getRadius()) {
@@ -320,10 +320,10 @@ void Sortie::printEnemyDefenses() {
}
int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index) {
- int currentPlayer = getCurrentPlayer();
+ int currentPlayer = _ai->getCurrentPlayer();
//get list of near hubs
- int unitsArray = getUnitsWithinRadius(targetX + 5, targetY, 480);
+ int unitsArray = _ai->getUnitsWithinRadius(targetX + 5, targetY, 480);
const int NUM_HUBS = 10;
//Order on dist
@@ -334,11 +334,11 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
int thisUnit = _vm->_moonbase->readFromArray(unitsArray, 0, i);
if (thisUnit) {
- if (((getBuildingType(thisUnit) == BUILDING_MAIN_BASE) || (getBuildingType(thisUnit) == BUILDING_OFFENSIVE_LAUNCHER)) && (getBuildingOwner(thisUnit) == currentPlayer)) {
+ if (((_ai->getBuildingType(thisUnit) == BUILDING_MAIN_BASE) || (_ai->getBuildingType(thisUnit) == BUILDING_OFFENSIVE_LAUNCHER)) && (_ai->getBuildingOwner(thisUnit) == currentPlayer)) {
for (int j = 0; j < NUM_HUBS; j++) {
if (hubArray[j]) {
- int distCurrent = getDistance(targetX, targetY, getHubX(thisUnit), getHubY(thisUnit));
- int distSaved = getDistance(targetX, targetY, getHubX(hubArray[j]), getHubY(hubArray[j]));
+ int distCurrent = _ai->getDistance(targetX, targetY, _ai->getHubX(thisUnit), _ai->getHubY(thisUnit));
+ int distSaved = _ai->getDistance(targetX, targetY, _ai->getHubX(hubArray[j]), _ai->getHubY(hubArray[j]));
if (distCurrent < distSaved) {
hubArray[hubIndex] = hubArray[j];
@@ -364,20 +364,20 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
_vm->_moonbase->deallocateArray(unitsArray);
//Check if repair is needed
- int targetUnit = getClosestUnit(targetX + 5, targetY, 15, currentPlayer, 1, 0, 0, 0);
+ int targetUnit = _ai->getClosestUnit(targetX + 5, targetY, 15, currentPlayer, 1, 0, 0, 0);
- if (targetUnit && (targetUnit != BUILDING_CRAWLER) && (getBuildingTeam(targetUnit) == getPlayerTeam(currentPlayer))) {
- int armor = getBuildingArmor(targetUnit);
+ if (targetUnit && (targetUnit != BUILDING_CRAWLER) && (_ai->getBuildingTeam(targetUnit) == _ai->getPlayerTeam(currentPlayer))) {
+ int armor = _ai->getBuildingArmor(targetUnit);
- if (armor < getBuildingMaxArmor(targetUnit)) {
- unitsArray = getUnitsWithinRadius(targetX + 5, targetY, 170);
+ if (armor < _ai->getBuildingMaxArmor(targetUnit)) {
+ unitsArray = _ai->getUnitsWithinRadius(targetX + 5, targetY, 170);
int defCount = 0;
for (int i = 0; i < 200; i++) {
int thisUnit = _vm->_moonbase->readFromArray(unitsArray, 0, i);
if (thisUnit) {
- if (((getBuildingType(thisUnit) == BUILDING_SHIELD) || (getBuildingType(thisUnit) == BUILDING_ANTI_AIR)) && (getBuildingOwner(thisUnit) == currentPlayer) && (getBuildingState(thisUnit) == 0)) {
+ if (((_ai->getBuildingType(thisUnit) == BUILDING_SHIELD) || (_ai->getBuildingType(thisUnit) == BUILDING_ANTI_AIR)) && (_ai->getBuildingOwner(thisUnit) == currentPlayer) && (_ai->getBuildingState(thisUnit) == 0)) {
defCount++;
i = 200;
}
@@ -388,10 +388,10 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
if (defCount) {
//repair
- int hubUnit = getClosestUnit(targetX, targetY, 480, currentPlayer, 1, BUILDING_MAIN_BASE, 1, 110);
+ int hubUnit = _ai->getClosestUnit(targetX, targetY, 480, currentPlayer, 1, BUILDING_MAIN_BASE, 1, 110);
if (hubUnit && (hubUnit != targetUnit)) {
- int powAngle = abs(getPowerAngleFromPoint(getHubX(hubUnit), getHubY(hubUnit), targetX, targetY, 20));
+ int powAngle = abs(_ai->getPowerAngleFromPoint(_ai->getHubX(hubUnit), _ai->getHubY(hubUnit), targetX, targetY, 20));
int power = powAngle / 360;
int angle = powAngle - (power * 360);
@@ -411,18 +411,18 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
//For each hub
for (int i = 0; i < MIN(NUM_HUBS, hubIndex); i++) {
- int hubX = getHubX(hubArray[i]);
- int hubY = getHubY(hubArray[i]);
+ int hubX = _ai->getHubX(hubArray[i]);
+ int hubY = _ai->getHubY(hubArray[i]);
//get angle to hub
int directAngleToHub = 0;
//If this hub is the target
if ((hubX == targetX) && (hubY == targetY)) {
//make the angle seed point at the closest enemy
- int enemyUnit = getClosestUnit(hubX, hubY, getMaxX(), currentPlayer, 0, 0, 0);
- directAngleToHub = calcAngle(targetX, targetY, getHubX(enemyUnit), getHubY(enemyUnit));
+ int enemyUnit = _ai->getClosestUnit(hubX, hubY, _ai->getMaxX(), currentPlayer, 0, 0, 0);
+ directAngleToHub = _ai->calcAngle(targetX, targetY, _ai->getHubX(enemyUnit), _ai->getHubY(enemyUnit));
} else {
- directAngleToHub = calcAngle(targetX, targetY, hubX, hubY);
+ directAngleToHub = _ai->calcAngle(targetX, targetY, hubX, hubY);
}
//Number of random chances to land
@@ -431,10 +431,10 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
int randAngle = directAngleToHub + _vm->_rnd.getRandomNumber(179) - 90;
int randDist = _vm->_rnd.getRandomNumber(109) + 40;
- int x = targetX + randDist * cos(degToRad(randAngle));
- int y = targetY + randDist * sin(degToRad(randAngle));
+ int x = targetX + randDist * cos(_ai->degToRad(randAngle));
+ int y = targetY + randDist * sin(_ai->degToRad(randAngle));
- int powAngle = getPowerAngleFromPoint(hubX, hubY, x, y, 20);
+ int powAngle = _ai->getPowerAngleFromPoint(hubX, hubY, x, y, 20);
if (powAngle < 0)
continue;
@@ -443,7 +443,7 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
int angle = powAngle - (power * 360);
int coords = 0;
- coords = simulateBuildingLaunch(hubX, hubY, power, angle, 100, 0);
+ coords = _ai->simulateBuildingLaunch(hubX, hubY, power, angle, 100, 0);
//if valid, return
if (coords > 0) {
@@ -451,28 +451,28 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
setSourceX(hubX);
setSourceY(hubY);
- setTargetX((x + getMaxX()) % getMaxX());
- setTargetY((y + getMaxY()) % getMaxY());
+ setTargetX((x + _ai->getMaxX()) % _ai->getMaxX());
+ setTargetY((y + _ai->getMaxY()) % _ai->getMaxY());
setSourceUnit(hubArray[i]);
- int unitsArray2 = getUnitsWithinRadius(targetX + 5, targetY, 200);
+ int unitsArray2 = _ai->getUnitsWithinRadius(targetX + 5, targetY, 200);
int shieldCount = 0;
for (int k = 0; k < 200; k++) {
int thisUnit = _vm->_moonbase->readFromArray(unitsArray2, 0, k);
if (thisUnit) {
- if ((getBuildingType(thisUnit) == BUILDING_SHIELD) && (getBuildingOwner(thisUnit) == currentPlayer))
+ if ((_ai->getBuildingType(thisUnit) == BUILDING_SHIELD) && (_ai->getBuildingOwner(thisUnit) == currentPlayer))
shieldCount++;
- if ((getBuildingType(thisUnit) == BUILDING_BRIDGE) && (getBuildingOwner(thisUnit) == currentPlayer)) {
+ if ((_ai->getBuildingType(thisUnit) == BUILDING_BRIDGE) && (_ai->getBuildingOwner(thisUnit) == currentPlayer)) {
shieldCount--;
shieldCount = MAX(-1, shieldCount);
}
}
}
- if ((_vm->_rnd.getRandomNumber((int)pow(3.0f, shieldCount + 1) - 1) == 0) && (getPlayerEnergy() > 6))
+ if ((_vm->_rnd.getRandomNumber((int)pow(3.0f, shieldCount + 1) - 1) == 0) && (_ai->getPlayerEnergy() > 6))
setUnit(ITEM_SHIELD);
else
setUnit(ITEM_ANTIAIR);
@@ -486,11 +486,11 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
if (coords < 0) {
//drop a bridge for the cord
- int yCoord = -coords / getMaxX();
- int xCoord = -coords - (yCoord * getMaxX());
+ int yCoord = -coords / _ai->getMaxX();
+ int xCoord = -coords - (yCoord * _ai->getMaxX());
- if (checkIfWaterState(xCoord, yCoord)) {
- int terrainSquareSize = getTerrainSquareSize();
+ if (_ai->checkIfWaterState(xCoord, yCoord)) {
+ int terrainSquareSize = _ai->getTerrainSquareSize();
xCoord = ((xCoord / terrainSquareSize * terrainSquareSize) + (terrainSquareSize / 2));
yCoord = ((yCoord / terrainSquareSize * terrainSquareSize) + (terrainSquareSize / 2));
@@ -502,8 +502,8 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
setTargetX(x);
setTargetY(y);
- int nextUnit = getClosestUnit(x, y, 480, getCurrentPlayer(), 1, BUILDING_MAIN_BASE, 1, 120);
- powAngle = getPowerAngleFromPoint(getHubX(nextUnit), getHubY(nextUnit), x, y, 15);
+ int nextUnit = _ai->getClosestUnit(x, y, 480, _ai->getCurrentPlayer(), 1, BUILDING_MAIN_BASE, 1, 120);
+ powAngle = _ai->getPowerAngleFromPoint(_ai->getHubX(nextUnit), _ai->getHubY(nextUnit), x, y, 15);
powAngle = abs(powAngle);
power = powAngle / 360;
@@ -529,8 +529,8 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
do {
int sourceHub = hubArray[_vm->_rnd.getRandomNumber(hubIndex - 1)];
- setSourceX(getHubX(sourceHub));
- setSourceY(getHubY(sourceHub));
+ setSourceX(_ai->getHubX(sourceHub));
+ setSourceY(_ai->getHubY(sourceHub));
setSourceUnit(sourceHub);
setUnit(ITEM_HUB);
setPower(_vm->_rnd.getRandomNumber(299) + 200);
@@ -539,12 +539,12 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
if (count > (NUM_HUBS * 3)) break;
- coords = simulateBuildingLaunch(getSourceX(), getSourceY(), getPower(), getAngle(), 100, 0);
+ coords = _ai->simulateBuildingLaunch(getSourceX(), getSourceY(), getPower(), getAngle(), 100, 0);
} while (coords <= 0);
if (coords > 0) {
- setTargetX(coords % getMaxX());
- setTargetY(coords / getMaxX());
+ setTargetX(coords % _ai->getMaxX());
+ setTargetY(coords / _ai->getMaxX());
} else {
setTargetX(0);
setTargetY(0);
diff --git a/engines/scumm/he/moonbase/ai_targetacquisition.h b/engines/scumm/he/moonbase/ai_targetacquisition.h
index 6ac9e34..9afe0f5 100644
--- a/engines/scumm/he/moonbase/ai_targetacquisition.h
+++ b/engines/scumm/he/moonbase/ai_targetacquisition.h
@@ -44,10 +44,10 @@ private:
int _unitType;
int _shotPosX, _shotPosY;
Common::Array<DefenseUnit *> _enemyDefenses;
-
+ AI *_ai;
public:
- Sortie() { _unitType = 0; _shotPosX = _shotPosY = 0; }
+ Sortie(AI *ai) { _ai = ai; _unitType = 0; _shotPosX = _shotPosY = 0; }
virtual ~Sortie();
static void setSourcePos(int x, int y) {
@@ -109,8 +109,10 @@ private:
int _power;
int _angle;
int _unit;
+ AI *_ai;
public:
+ Defender(AI *ai) : _ai(ai) {}
void setSourceX(int sourceX) { _sourceX = sourceX; }
void setSourceY(int sourceY) { _sourceY = sourceY; }
void setTargetX(int targetX) { _targetX = targetX; }
diff --git a/engines/scumm/he/moonbase/ai_traveller.cpp b/engines/scumm/he/moonbase/ai_traveller.cpp
index 755ae36..51060ad 100644
--- a/engines/scumm/he/moonbase/ai_traveller.cpp
+++ b/engines/scumm/he/moonbase/ai_traveller.cpp
@@ -20,6 +20,8 @@
*
*/
+#include "scumm/he/intern_he.h"
+#include "scumm/he/moonbase/moonbase.h"
#include "scumm/he/moonbase/ai_traveller.h"
#include "scumm/he/moonbase/ai_main.h"
@@ -32,7 +34,7 @@ int Traveller::_maxDist = 0;
int Traveller::_numToGen = 0;
int Traveller::_sizeAngleStep = 0;
-Traveller::Traveller() {
+Traveller::Traveller(AI *ai) : _ai(ai) {
_waterFlag = 0;
setValueG(0);
unsetDisabled();
@@ -46,7 +48,7 @@ Traveller::Traveller() {
_waterDestY = 0;
}
-Traveller::Traveller(int originX, int originY) {
+Traveller::Traveller(int originX, int originY, AI *ai) : _ai(ai) {
_waterFlag = 0;
setValueG(0);
unsetDisabled();
@@ -64,7 +66,7 @@ Traveller::Traveller(int originX, int originY) {
}
void Traveller::adjustPosX(int offsetX) {
- int maxX = getMaxX();
+ int maxX = _ai->getMaxX();
int deltaX = _posX + offsetX;
if (deltaX < 0) _posX = maxX + deltaX;
@@ -73,7 +75,7 @@ void Traveller::adjustPosX(int offsetX) {
}
void Traveller::adjustPosY(int offsetY) {
- int maxY = getMaxX();
+ int maxY = _ai->getMaxX();
int deltaY = _posY + offsetY;
if (deltaY < 0) _posY = maxY + deltaY;
@@ -89,7 +91,7 @@ void Traveller::adjustXY(int offsetX, int offsetY) {
float Traveller::calcH() {
float retVal = 0;
// Calc dist from here to target
- retVal = getDistance(_posX, _posY, _targetPosX, _targetPosY);
+ retVal = _ai->getDistance(_posX, _posY, _targetPosX, _targetPosY);
// Divide by _maxDist to get minimum number of jumps to goal
retVal /= static_cast<float>(_maxDist);
@@ -98,7 +100,7 @@ float Traveller::calcH() {
int Traveller::numChildrenToGen() {
if (!_numToGen)
- _numToGen = getAnimSpeed() + 2;
+ _numToGen = _ai->getAnimSpeed() + 2;
return _numToGen;
}
@@ -111,7 +113,7 @@ IContainedObject *Traveller::createChildObj(int index, int &completionFlag) {
nodeCount++;
- Traveller *retTraveller = new Traveller;
+ Traveller *retTraveller = new Traveller(_ai);
static int dir, angle, power;
@@ -119,14 +121,14 @@ IContainedObject *Traveller::createChildObj(int index, int &completionFlag) {
// Calculate angle between here and target
int directAngle = 0;
- if (getEnergyHogType())
- directAngle = calcAngle(_posX, _posY, _targetPosX, _targetPosY, 1);
+ if (_ai->getEnergyHogType())
+ directAngle = _ai->calcAngle(_posX, _posY, _targetPosX, _targetPosY, 1);
else
- directAngle = calcAngle(_posX, _posY, _targetPosX, _targetPosY);
+ directAngle = _ai->calcAngle(_posX, _posY, _targetPosX, _targetPosY);
// Calculate the offset angle for this index
if (!_sizeAngleStep)
- _sizeAngleStep = 52 - (getAnimSpeed() * 7);
+ _sizeAngleStep = 52 - (_ai->getAnimSpeed() * 7);
dir = _sizeAngleStep * ((static_cast<int>(index / NUM_POWER_STEPS) + 1) >> 1);
// Calculate the sign value for the offset for this index
@@ -136,12 +138,12 @@ IContainedObject *Traveller::createChildObj(int index, int &completionFlag) {
// Calculate power for this index
int maxPower = 0;
- int directDist = getDistance(_posX, _posY, _targetPosX, _targetPosY);
+ int directDist = _ai->getDistance(_posX, _posY, _targetPosX, _targetPosY);
if (directDist > _maxDist + 120)
- maxPower = getMaxPower();
+ maxPower = _ai->getMaxPower();
else
- maxPower = (static_cast<float>(directDist) / static_cast<float>(_maxDist + 120)) * getMaxPower();
+ maxPower = (static_cast<float>(directDist) / static_cast<float>(_maxDist + 120)) * _ai->getMaxPower();
maxPower -= 70;
power = maxPower * (1 - ((index % NUM_POWER_STEPS) * SIZE_POWER_STEP));
@@ -155,7 +157,7 @@ IContainedObject *Traveller::createChildObj(int index, int &completionFlag) {
int coords = 0;
if (!(index % NUM_POWER_STEPS) || (!lastSuccessful)) {
- coords = simulateBuildingLaunch(_posX, _posY, power, angle, 10, 0);
+ coords = _ai->simulateBuildingLaunch(_posX, _posY, power, angle, 10, 0);
lastSuccessful = 0;
} else {
completionState = 1;
@@ -172,34 +174,34 @@ IContainedObject *Traveller::createChildObj(int index, int &completionFlag) {
completionState = 1;
}
- int whoseTurn = getCurrentPlayer();
- int maxX = getMaxX();
+ int whoseTurn = _ai->getCurrentPlayer();
+ int maxX = _ai->getMaxX();
// Check new position to see if landing is clear
if (coords > 0) {
int yCoord = coords / maxX;
int xCoord = coords - (yCoord * maxX);
- int terrain = getTerrain(xCoord, yCoord);
+ int terrain = _ai->getTerrain(xCoord, yCoord);
assert(terrain == TERRAIN_TYPE_GOOD);
- float pwr = getMinPower() * .3;
+ float pwr = _ai->getMinPower() * .3;
float cosine = cos((static_cast<float>(angle) / 360) * (2 * M_PI));
float sine = sin((static_cast<float>(angle) / 360) * (2 * M_PI));
int xParam = xCoord + (pwr * cosine);
int yParam = yCoord + (pwr * sine);
if (xParam < 0)
- xParam += getMaxX();
- else if (xParam > getMaxX())
- xParam -= getMaxX();
+ xParam += _ai->getMaxX();
+ else if (xParam > _ai->getMaxX())
+ xParam -= _ai->getMaxX();
if (yParam < 0)
- yParam += getMaxY();
- else if (yParam > getMaxY())
- yParam -= getMaxY();
+ yParam += _ai->getMaxY();
+ else if (yParam > _ai->getMaxY())
+ yParam -= _ai->getMaxY();
- if (checkIfWaterState(xParam, yParam)) {
+ if (_ai->checkIfWaterState(xParam, yParam)) {
delete retTraveller;
return NULL;
}
@@ -208,7 +210,7 @@ IContainedObject *Traveller::createChildObj(int index, int &completionFlag) {
retTraveller->setPosX(xCoord);
// Iterate through the previous action list, making sure this one isn't on it
- for (intVecItr i = (lastXCoord[whoseTurn]).begin(), j = (lastYCoord[whoseTurn]).begin(); i != (lastXCoord[whoseTurn]).end(); i++, j++) {
+ for (Common::Array<int>::iterator i = (_ai->lastXCoord[whoseTurn]).begin(), j = (_ai->lastYCoord[whoseTurn]).begin(); i != (_ai->lastXCoord[whoseTurn]).end(); i++, j++) {
// Check if this shot is the same as the last time we tried
if ((*i == retTraveller->getPosX()) && (*j == retTraveller->getPosY())) {
retTraveller->setDisabled();
@@ -224,8 +226,8 @@ IContainedObject *Traveller::createChildObj(int index, int &completionFlag) {
int xCoord = -coords - (yCoord * maxX);
// If landing fault is because of water, add 1 extra to g and turn on water flag. Also set coords, and adjust power to water fault location
- if (checkIfWaterState(xCoord, yCoord)) {
- int terrainSquareSize = getTerrainSquareSize();
+ if (_ai->checkIfWaterState(xCoord, yCoord)) {
+ int terrainSquareSize = _ai->getTerrainSquareSize();
xCoord = ((xCoord / terrainSquareSize * terrainSquareSize) + (terrainSquareSize / 2));
yCoord = ((yCoord / terrainSquareSize * terrainSquareSize) + (terrainSquareSize / 2));
@@ -234,10 +236,10 @@ IContainedObject *Traveller::createChildObj(int index, int &completionFlag) {
retTraveller->setPosX(xCoord + (terrainSquareSize * 1.414 * (xDist / (abs(xDist) + 1))));
retTraveller->setPosY(yCoord + (terrainSquareSize * 1.414 * (yDist / (abs(yDist) + 1))));
- int closestHub = getClosestUnit(retTraveller->getPosX(), retTraveller->getPosY(), getMaxX(), getCurrentPlayer(), 1, BUILDING_MAIN_BASE, 1, 110);
+ int closestHub = _ai->getClosestUnit(retTraveller->getPosX(), retTraveller->getPosY(), _ai->getMaxX(), _ai->getCurrentPlayer(), 1, BUILDING_MAIN_BASE, 1, 110);
- retTraveller->setWaterSourceX(getHubX(closestHub));
- retTraveller->setWaterSourceY(getHubY(closestHub));
+ retTraveller->setWaterSourceX(_ai->getHubX(closestHub));
+ retTraveller->setWaterSourceY(_ai->getHubY(closestHub));
retTraveller->setWaterDestX(retTraveller->getPosX());
retTraveller->setWaterDestY(retTraveller->getPosY());
@@ -258,7 +260,7 @@ IContainedObject *Traveller::createChildObj(int index, int &completionFlag) {
}
int Traveller::checkSuccess() {
- if (getDistance(_posX + 1, _posY, _targetPosX, _targetPosY) < _maxDist)
+ if (_ai->getDistance(_posX + 1, _posY, _targetPosX, _targetPosY) < _maxDist)
return SUCCESS;
return 0;
diff --git a/engines/scumm/he/moonbase/ai_traveller.h b/engines/scumm/he/moonbase/ai_traveller.h
index 63a56d7..20e69eb 100644
--- a/engines/scumm/he/moonbase/ai_traveller.h
+++ b/engines/scumm/he/moonbase/ai_traveller.h
@@ -58,13 +58,14 @@ private:
int _waterDestX;
int _waterDestY;
+ AI *_ai;
protected:
virtual float calcH();
public:
- Traveller();
- Traveller(int originX, int originY);
+ Traveller(AI *ai);
+ Traveller(int originX, int originY, AI *ai);
~Traveller() {}
IContainedObject *duplicate() { return this; }
diff --git a/engines/scumm/he/moonbase/ai_tree.cpp b/engines/scumm/he/moonbase/ai_tree.cpp
index 2571928..e3098a7 100644
--- a/engines/scumm/he/moonbase/ai_tree.cpp
+++ b/engines/scumm/he/moonbase/ai_tree.cpp
@@ -20,6 +20,9 @@
*
*/
+#include "scumm/he/intern_he.h"
+
+#include "scumm/he/moonbase/moonbase.h"
#include "scumm/he/moonbase/ai_tree.h"
#include "scumm/he/moonbase/ai_main.h"
@@ -29,7 +32,7 @@ static int compareTreeNodes(const void *a, const void *b) {
return ((const TreeNode *)a)->value - ((const TreeNode *)b)->value;
}
-Tree::Tree() {
+Tree::Tree(AI *ai) : _ai(ai) {
pBaseNode = new Node;
_maxDepth = MAX_DEPTH;
_maxNodes = MAX_NODES;
@@ -39,7 +42,7 @@ Tree::Tree() {
_currentMap = new Common::SortedArray<TreeNode *>(compareTreeNodes);
}
-Tree::Tree(IContainedObject *contents) {
+Tree::Tree(IContainedObject *contents, AI *ai) : _ai(ai) {
pBaseNode = new Node;
pBaseNode->setContainedObject(contents);
_maxDepth = MAX_DEPTH;
@@ -50,7 +53,7 @@ Tree::Tree(IContainedObject *contents) {
_currentMap = new Common::SortedArray<TreeNode *>(compareTreeNodes);
}
-Tree::Tree(IContainedObject *contents, int maxDepth) {
+Tree::Tree(IContainedObject *contents, int maxDepth, AI *ai) : _ai(ai) {
pBaseNode = new Node;
pBaseNode->setContainedObject(contents);
_maxDepth = maxDepth;
@@ -61,7 +64,7 @@ Tree::Tree(IContainedObject *contents, int maxDepth) {
_currentMap = new Common::SortedArray<TreeNode *>(compareTreeNodes);
}
-Tree::Tree(IContainedObject *contents, int maxDepth, int maxNodes) {
+Tree::Tree(IContainedObject *contents, int maxDepth, int maxNodes, AI *ai) : _ai(ai) {
pBaseNode = new Node;
pBaseNode->setContainedObject(contents);
_maxDepth = maxDepth;
@@ -84,7 +87,7 @@ void Tree::duplicateTree(Node *sourceNode, Node *destNode) {
}
}
-Tree::Tree(const Tree *sourceTree) {
+Tree::Tree(const Tree *sourceTree, AI *ai) : _ai(ai) {
pBaseNode = new Node(sourceTree->getBaseNode());
_maxDepth = sourceTree->getMaxDepth();
_maxNodes = sourceTree->getMaxNodes();
@@ -181,7 +184,7 @@ Node *Tree::aStarSearch_singlePass() {
static int maxTime = 0;
if (_currentChildIndex == 1) {
- maxTime = getPlayerMaxTime();
+ maxTime = _ai->getPlayerMaxTime();
}
if (_currentChildIndex) {
@@ -194,7 +197,7 @@ Node *Tree::aStarSearch_singlePass() {
_currentMap->erase(_currentMap->begin());
}
- if ((_currentNode->getDepth() < _maxDepth) && (Node::getNodeCount() < _maxNodes) && ((!maxTime) || (getTimerValue(3) < maxTime))) {
+ if ((_currentNode->getDepth() < _maxDepth) && (Node::getNodeCount() < _maxNodes) && ((!maxTime) || (_ai->getTimerValue(3) < maxTime))) {
// Generate nodes
_currentChildIndex = _currentNode->generateChildren();
diff --git a/engines/scumm/he/moonbase/ai_tree.h b/engines/scumm/he/moonbase/ai_tree.h
index 5da5b3a..45d4963 100644
--- a/engines/scumm/he/moonbase/ai_tree.h
+++ b/engines/scumm/he/moonbase/ai_tree.h
@@ -31,6 +31,8 @@ namespace Scumm {
const int MAX_DEPTH = 100;
const int MAX_NODES = 1000000;
+class AI;
+
struct TreeNode {
float value;
Node *node;
@@ -50,12 +52,14 @@ private:
Common::SortedArray<TreeNode *> *_currentMap;
Node *_currentNode;
+ AI *_ai;
+
public:
- Tree();
- Tree(IContainedObject *contents);
- Tree(IContainedObject *contents, int maxDepth);
- Tree(IContainedObject *contents, int maxDepth, int maxNodes);
- Tree(const Tree *sourceTree);
+ Tree(AI *ai);
+ Tree(IContainedObject *contents, AI *ai);
+ Tree(IContainedObject *contents, int maxDepth, AI *ai);
+ Tree(IContainedObject *contents, int maxDepth, int maxNodes, AI *ai);
+ Tree(const Tree *sourceTree, AI *ai);
~Tree();
void duplicateTree(Node *sourceNode, Node *destNode);
diff --git a/engines/scumm/he/moonbase/moonbase.cpp b/engines/scumm/he/moonbase/moonbase.cpp
index 833d847..be845c7 100644
--- a/engines/scumm/he/moonbase/moonbase.cpp
+++ b/engines/scumm/he/moonbase/moonbase.cpp
@@ -22,14 +22,18 @@
#include "scumm/he/intern_he.h"
#include "scumm/he/moonbase/moonbase.h"
+#include "scumm/he/moonbase/ai_main.h"
namespace Scumm {
Moonbase::Moonbase(ScummEngine_v71he *vm) : _vm(vm) {
initFOW();
+
+ _ai = new AI;
}
Moonbase::~Moonbase() {
+ delete _ai;
}
int Moonbase::readFromArray(int array, int y, int x) {
diff --git a/engines/scumm/he/moonbase/moonbase.h b/engines/scumm/he/moonbase/moonbase.h
index f7d8cdb..1150fec 100644
--- a/engines/scumm/he/moonbase/moonbase.h
+++ b/engines/scumm/he/moonbase/moonbase.h
@@ -29,6 +29,8 @@
namespace Scumm {
+class AI;
+
class Moonbase {
public:
Moonbase(ScummEngine_v71he *vm);
@@ -66,6 +68,8 @@ public:
int _fowSentinelState;
uint32 _fowSentinelConditionBits;
+ AI *_ai;
+
private:
ScummEngine_v71he *_vm;
Commit: edb8e6865b972e441cb73ad972df66ee69d1b45a
https://github.com/scummvm/scummvm/commit/edb8e6865b972e441cb73ad972df66ee69d1b45a
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2016-05-26T21:22:30+02:00
Commit Message:
SCUMM HE: Eliminated global _vm reference in Moonbase AI
Changed paths:
engines/scumm/he/logic/moonbase_logic.cpp
engines/scumm/he/moonbase/ai_defenseunit.cpp
engines/scumm/he/moonbase/ai_main.cpp
engines/scumm/he/moonbase/ai_main.h
engines/scumm/he/moonbase/ai_targetacquisition.cpp
engines/scumm/he/moonbase/moonbase.cpp
engines/scumm/he/moonbase/moonbase.h
diff --git a/engines/scumm/he/logic/moonbase_logic.cpp b/engines/scumm/he/logic/moonbase_logic.cpp
index 0d1c3c5..ce5009f 100644
--- a/engines/scumm/he/logic/moonbase_logic.cpp
+++ b/engines/scumm/he/logic/moonbase_logic.cpp
@@ -232,7 +232,7 @@ int LogicHEmoonbase::op_ai_master_control_program(int op, int numArgs, int32 *ar
void LogicHEmoonbase::op_ai_reset(int op, int numArgs, int32 *args) {
warning("op_ai_reset())");
- _vm->_moonbase->_ai->resetAI(_vm);
+ _vm->_moonbase->_ai->resetAI();
}
void LogicHEmoonbase::op_ai_set_type(int op, int numArgs, int32 *args) {
diff --git a/engines/scumm/he/moonbase/ai_defenseunit.cpp b/engines/scumm/he/moonbase/ai_defenseunit.cpp
index ad9792d..37ce303 100644
--- a/engines/scumm/he/moonbase/ai_defenseunit.cpp
+++ b/engines/scumm/he/moonbase/ai_defenseunit.cpp
@@ -133,13 +133,13 @@ int AntiAirUnit::selectWeapon(int index) {
case 2:
if (getState() == DUS_OFF) {
if (_ai->getPlayerEnergy() > 6) {
- if (!_vm->_rnd.getRandomNumber(3)) {
+ if (!_ai->_vm->_rnd.getRandomNumber(3)) {
return ITEM_VIRUS;
}
}
if (_ai->getPlayerEnergy() > 2) {
- if (!_vm->_rnd.getRandomNumber(1)) {
+ if (!_ai->_vm->_rnd.getRandomNumber(1)) {
return ITEM_SPIKE;
}
}
@@ -358,19 +358,19 @@ int HubUnit::selectWeapon(int index) {
}
if (energy > 2) {
- if (!_vm->_rnd.getRandomNumber(3)) {
+ if (!_ai->_vm->_rnd.getRandomNumber(3)) {
return ITEM_SPIKE;
}
- if (!_vm->_rnd.getRandomNumber(4)) {
+ if (!_ai->_vm->_rnd.getRandomNumber(4)) {
return ITEM_GUIDED;
}
- if (!_vm->_rnd.getRandomNumber(4)) {
+ if (!_ai->_vm->_rnd.getRandomNumber(4)) {
return ITEM_MINE;
}
- if (!_vm->_rnd.getRandomNumber(9)) {
+ if (!_ai->_vm->_rnd.getRandomNumber(9)) {
return ITEM_EMP;
}
}
@@ -506,7 +506,7 @@ int EnergyUnit::selectWeapon(int index) {
}
if (energy > 2) {
- if (!_vm->_rnd.getRandomNumber(3)) {
+ if (!_ai->_vm->_rnd.getRandomNumber(3)) {
return ITEM_EMP;
}
}
@@ -617,7 +617,7 @@ int CrawlerUnit::selectWeapon(int index) {
}
if (energy > 2) {
- if (_vm->_rnd.getRandomNumber(1)) {
+ if (_ai->_vm->_rnd.getRandomNumber(1)) {
return ITEM_MINE;
} else {
return ITEM_TIME_EXPIRED;
diff --git a/engines/scumm/he/moonbase/ai_main.cpp b/engines/scumm/he/moonbase/ai_main.cpp
index d7e86d5..326da21 100644
--- a/engines/scumm/he/moonbase/ai_main.cpp
+++ b/engines/scumm/he/moonbase/ai_main.cpp
@@ -31,8 +31,6 @@
namespace Scumm {
-ScummEngine_v90he *_vm;
-
enum {
F_GET_SCUMM_DATA = 0,
F_GET_WORLD_DIST = 1,
@@ -166,9 +164,7 @@ int *storedLaunchAction[5] = {NULL};
const int32 *MCP_params;
-void AI::resetAI(ScummEngine_v90he *vm) {
- _vm = vm;
-
+void AI::resetAI() {
AIstate = STATE_CHOOSE_BEHAVIOR;
warning("----------------------> Resetting AI");
diff --git a/engines/scumm/he/moonbase/ai_main.h b/engines/scumm/he/moonbase/ai_main.h
index 7bd9a8f..619ff16 100644
--- a/engines/scumm/he/moonbase/ai_main.h
+++ b/engines/scumm/he/moonbase/ai_main.h
@@ -30,8 +30,6 @@ namespace Scumm {
class ScummEngine_v90he;
-extern ScummEngine_v90he *_vm;
-
enum {
TERRAIN_TYPE_GOOD = 0,
TERRAIN_TYPE_SLOPE = 1,
@@ -85,7 +83,9 @@ enum {
class AI {
public:
- void resetAI(ScummEngine_v90he *vm);
+ AI(ScummEngine_v90he *vm) : _vm(vm) {}
+
+ void resetAI();
void cleanUpAI();
void setAIType(const int paramCount, const int32 *params);
int masterControlProgram(const int paramCount, const int32 *params);
@@ -190,6 +190,8 @@ private:
public:
Common::Array<int> lastXCoord[5];
Common::Array<int> lastYCoord[5];
+
+ ScummEngine_v90he *_vm;
};
} // End of namespace Scumm
diff --git a/engines/scumm/he/moonbase/ai_targetacquisition.cpp b/engines/scumm/he/moonbase/ai_targetacquisition.cpp
index d91660c..938a02d 100644
--- a/engines/scumm/he/moonbase/ai_targetacquisition.cpp
+++ b/engines/scumm/he/moonbase/ai_targetacquisition.cpp
@@ -46,7 +46,7 @@ void Sortie::setEnemyDefenses(int enemyDefensesScummArray, int defendX, int defe
int currentPlayer = _ai->getCurrentPlayer();
for (int i = 0; i < 200; i++) {
- int thisElement = _vm->_moonbase->readFromArray(enemyDefensesScummArray, 0, i);
+ int thisElement = _ai->_vm->_moonbase->readFromArray(enemyDefensesScummArray, 0, i);
if (thisElement) {
if (_ai->getBuildingOwner(thisElement)) {
@@ -223,7 +223,7 @@ IContainedObject *Sortie::createChildObj(int index, int &completionFlag) {
if ((AAcounter != 3) && (currentWeapon->getTypeID() == ITEM_CLUSTER))
thisDamage = 0;
- if (!_vm->_rnd.getRandomNumber(4))
+ if (!_ai->_vm->_rnd.getRandomNumber(4))
currentWeapon->setTypeID(ITEM_MINE);
(*i)->setDamage(thisDamage);
@@ -331,7 +331,7 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
int hubIndex = 0;
for (int i = 0; i < 200; i++) {
- int thisUnit = _vm->_moonbase->readFromArray(unitsArray, 0, i);
+ int thisUnit = _ai->_vm->_moonbase->readFromArray(unitsArray, 0, i);
if (thisUnit) {
if (((_ai->getBuildingType(thisUnit) == BUILDING_MAIN_BASE) || (_ai->getBuildingType(thisUnit) == BUILDING_OFFENSIVE_LAUNCHER)) && (_ai->getBuildingOwner(thisUnit) == currentPlayer)) {
@@ -361,7 +361,7 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
}
}
- _vm->_moonbase->deallocateArray(unitsArray);
+ _ai->_vm->_moonbase->deallocateArray(unitsArray);
//Check if repair is needed
int targetUnit = _ai->getClosestUnit(targetX + 5, targetY, 15, currentPlayer, 1, 0, 0, 0);
@@ -374,7 +374,7 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
int defCount = 0;
for (int i = 0; i < 200; i++) {
- int thisUnit = _vm->_moonbase->readFromArray(unitsArray, 0, i);
+ int thisUnit = _ai->_vm->_moonbase->readFromArray(unitsArray, 0, i);
if (thisUnit) {
if (((_ai->getBuildingType(thisUnit) == BUILDING_SHIELD) || (_ai->getBuildingType(thisUnit) == BUILDING_ANTI_AIR)) && (_ai->getBuildingOwner(thisUnit) == currentPlayer) && (_ai->getBuildingState(thisUnit) == 0)) {
@@ -384,7 +384,7 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
}
}
- _vm->_moonbase->deallocateArray(unitsArray);
+ _ai->_vm->_moonbase->deallocateArray(unitsArray);
if (defCount) {
//repair
@@ -428,8 +428,8 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
//Number of random chances to land
for (int j = 0; j < 3; j++) {
//Pick random angle and dist within semicircle (-90 to +90) and (40 to 150)
- int randAngle = directAngleToHub + _vm->_rnd.getRandomNumber(179) - 90;
- int randDist = _vm->_rnd.getRandomNumber(109) + 40;
+ int randAngle = directAngleToHub + _ai->_vm->_rnd.getRandomNumber(179) - 90;
+ int randDist = _ai->_vm->_rnd.getRandomNumber(109) + 40;
int x = targetX + randDist * cos(_ai->degToRad(randAngle));
int y = targetY + randDist * sin(_ai->degToRad(randAngle));
@@ -459,7 +459,7 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
int shieldCount = 0;
for (int k = 0; k < 200; k++) {
- int thisUnit = _vm->_moonbase->readFromArray(unitsArray2, 0, k);
+ int thisUnit = _ai->_vm->_moonbase->readFromArray(unitsArray2, 0, k);
if (thisUnit) {
if ((_ai->getBuildingType(thisUnit) == BUILDING_SHIELD) && (_ai->getBuildingOwner(thisUnit) == currentPlayer))
@@ -472,7 +472,7 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
}
}
- if ((_vm->_rnd.getRandomNumber((int)pow(3.0f, shieldCount + 1) - 1) == 0) && (_ai->getPlayerEnergy() > 6))
+ if ((_ai->_vm->_rnd.getRandomNumber((int)pow(3.0f, shieldCount + 1) - 1) == 0) && (_ai->getPlayerEnergy() > 6))
setUnit(ITEM_SHIELD);
else
setUnit(ITEM_ANTIAIR);
@@ -480,7 +480,7 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
setPower(power);
setAngle(angle);
- _vm->_moonbase->deallocateArray(unitsArray2);
+ _ai->_vm->_moonbase->deallocateArray(unitsArray2);
return 1;
}
@@ -527,14 +527,14 @@ int Defender::calculateDefenseUnitPosition(int targetX, int targetY, int index)
if (hubIndex == 0) return -3;
do {
- int sourceHub = hubArray[_vm->_rnd.getRandomNumber(hubIndex - 1)];
+ int sourceHub = hubArray[_ai->_vm->_rnd.getRandomNumber(hubIndex - 1)];
setSourceX(_ai->getHubX(sourceHub));
setSourceY(_ai->getHubY(sourceHub));
setSourceUnit(sourceHub);
setUnit(ITEM_HUB);
- setPower(_vm->_rnd.getRandomNumber(299) + 200);
- setAngle(_vm->_rnd.getRandomNumber(359));
+ setPower(_ai->_vm->_rnd.getRandomNumber(299) + 200);
+ setAngle(_ai->_vm->_rnd.getRandomNumber(359));
count++;
if (count > (NUM_HUBS * 3)) break;
diff --git a/engines/scumm/he/moonbase/moonbase.cpp b/engines/scumm/he/moonbase/moonbase.cpp
index be845c7..d61aa18 100644
--- a/engines/scumm/he/moonbase/moonbase.cpp
+++ b/engines/scumm/he/moonbase/moonbase.cpp
@@ -26,10 +26,10 @@
namespace Scumm {
-Moonbase::Moonbase(ScummEngine_v71he *vm) : _vm(vm) {
+Moonbase::Moonbase(ScummEngine_v90he *vm) : _vm(vm) {
initFOW();
- _ai = new AI;
+ _ai = new AI(_vm);
}
Moonbase::~Moonbase() {
@@ -37,15 +37,15 @@ Moonbase::~Moonbase() {
}
int Moonbase::readFromArray(int array, int y, int x) {
- _vm->VAR(((ScummEngine_v90he *)_vm)->VAR_U32_ARRAY_UNK) = array;
+ _vm->VAR(_vm->VAR_U32_ARRAY_UNK) = array;
- return _vm->readArray(((ScummEngine_v90he *)_vm)->VAR_U32_ARRAY_UNK, y, x);
+ return _vm->readArray(_vm->VAR_U32_ARRAY_UNK, y, x);
}
void Moonbase::deallocateArray(int array) {
- _vm->VAR(((ScummEngine_v90he *)_vm)->VAR_U32_ARRAY_UNK) = array;
+ _vm->VAR(_vm->VAR_U32_ARRAY_UNK) = array;
- return _vm->nukeArray(((ScummEngine_v90he *)_vm)->VAR_U32_ARRAY_UNK);
+ return _vm->nukeArray(_vm->VAR_U32_ARRAY_UNK);
}
int Moonbase::callScummFunction(int scriptNumber, int paramCount,...) {
diff --git a/engines/scumm/he/moonbase/moonbase.h b/engines/scumm/he/moonbase/moonbase.h
index 1150fec..cdb70ad 100644
--- a/engines/scumm/he/moonbase/moonbase.h
+++ b/engines/scumm/he/moonbase/moonbase.h
@@ -33,7 +33,7 @@ class AI;
class Moonbase {
public:
- Moonbase(ScummEngine_v71he *vm);
+ Moonbase(ScummEngine_v90he *vm);
~Moonbase();
int readFromArray(int array, int y, int x);
@@ -71,7 +71,7 @@ public:
AI *_ai;
private:
- ScummEngine_v71he *_vm;
+ ScummEngine_v90he *_vm;
int _fowFrameBaseNumber;
int _fowAnimationFrames;
Commit: 36526cb27baa79ce50d16158a904eae96453693e
https://github.com/scummvm/scummvm/commit/36526cb27baa79ce50d16158a904eae96453693e
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2016-05-26T21:30:02+02:00
Commit Message:
SCUMM HE: Moved Moonbase to ScummEngine_v100he
Changed paths:
engines/scumm/he/intern_he.h
engines/scumm/he/moonbase/moonbase.cpp
engines/scumm/he/moonbase/moonbase.h
engines/scumm/scumm.cpp
diff --git a/engines/scumm/he/intern_he.h b/engines/scumm/he/intern_he.h
index 72c11c9..cce7631 100644
--- a/engines/scumm/he/intern_he.h
+++ b/engines/scumm/he/intern_he.h
@@ -591,7 +591,8 @@ protected:
byte _debugInputBuffer[256];
public:
- ScummEngine_v100he(OSystem *syst, const DetectorResult &dr) : ScummEngine_v99he(syst, dr) {}
+ ScummEngine_v100he(OSystem *syst, const DetectorResult &dr);
+ ~ScummEngine_v100he();
virtual void resetScumm();
diff --git a/engines/scumm/he/moonbase/moonbase.cpp b/engines/scumm/he/moonbase/moonbase.cpp
index d61aa18..15ababd 100644
--- a/engines/scumm/he/moonbase/moonbase.cpp
+++ b/engines/scumm/he/moonbase/moonbase.cpp
@@ -26,7 +26,7 @@
namespace Scumm {
-Moonbase::Moonbase(ScummEngine_v90he *vm) : _vm(vm) {
+Moonbase::Moonbase(ScummEngine_v100he *vm) : _vm(vm) {
initFOW();
_ai = new AI(_vm);
diff --git a/engines/scumm/he/moonbase/moonbase.h b/engines/scumm/he/moonbase/moonbase.h
index cdb70ad..243d53a 100644
--- a/engines/scumm/he/moonbase/moonbase.h
+++ b/engines/scumm/he/moonbase/moonbase.h
@@ -33,7 +33,7 @@ class AI;
class Moonbase {
public:
- Moonbase(ScummEngine_v90he *vm);
+ Moonbase(ScummEngine_v100he *vm);
~Moonbase();
int readFromArray(int array, int y, int x);
@@ -71,7 +71,7 @@ public:
AI *_ai;
private:
- ScummEngine_v90he *_vm;
+ ScummEngine_v100he *_vm;
int _fowFrameBaseNumber;
int _fowAnimationFrames;
diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp
index 4adf0c5..d5727f2 100644
--- a/engines/scumm/scumm.cpp
+++ b/engines/scumm/scumm.cpp
@@ -885,7 +885,20 @@ ScummEngine_v90he::ScummEngine_v90he(OSystem *syst, const DetectorResult &dr)
VAR_U32_VERSION = 0xFF;
VAR_U32_ARRAY_UNK = 0xFF;
+}
+ScummEngine_v90he::~ScummEngine_v90he() {
+ delete _moviePlay;
+ delete _sprite;
+ if (_game.heversion >= 98) {
+ delete _logicHE;
+ }
+ if (_game.heversion >= 99) {
+ free(_hePalettes);
+ }
+}
+
+ScummEngine_v100he::ScummEngine_v100he(OSystem *syst, const DetectorResult &dr) : ScummEngine_v99he(syst, dr) {
/* Moonbase stuff */
_moonbase = 0;
@@ -900,15 +913,7 @@ ScummEngine_v90he::ScummEngine_v90he(OSystem *syst, const DetectorResult &dr)
VAR_U32_USER_VAR_F = 0xFF;
}
-ScummEngine_v90he::~ScummEngine_v90he() {
- delete _moviePlay;
- delete _sprite;
- if (_game.heversion >= 98) {
- delete _logicHE;
- }
- if (_game.heversion >= 99) {
- free(_hePalettes);
- }
+ScummEngine_v100he::~ScummEngine_v100he() {
delete _moonbase;
}
Commit: dcc388cbaa84909e2974738685618e696f95c952
https://github.com/scummvm/scummvm/commit/dcc388cbaa84909e2974738685618e696f95c952
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2016-05-26T21:53:23+02:00
Commit Message:
SCUMM HE: Moved remnants of Moonabse to HE100
Changed paths:
engines/scumm/he/intern_he.h
engines/scumm/he/logic/moonbase_logic.cpp
engines/scumm/he/logic_he.cpp
engines/scumm/he/logic_he.h
engines/scumm/he/moonbase/ai_main.h
engines/scumm/he/wiz_he.cpp
engines/scumm/scumm.h
engines/scumm/scumm_v2.h
engines/scumm/vars.cpp
diff --git a/engines/scumm/he/intern_he.h b/engines/scumm/he/intern_he.h
index cce7631..7f7babc 100644
--- a/engines/scumm/he/intern_he.h
+++ b/engines/scumm/he/intern_he.h
@@ -455,9 +455,6 @@ protected:
Sprite *_sprite;
public:
- Moonbase *_moonbase;
-
-public:
ScummEngine_v90he(OSystem *syst, const DetectorResult &dr);
~ScummEngine_v90he();
@@ -553,15 +550,8 @@ protected:
byte VAR_NUM_PALETTES;
byte VAR_NUM_UNK;
-public: // FIXME. TODO. Should be protected. Used by Moonbase
byte VAR_U32_VERSION;
byte VAR_U32_ARRAY_UNK;
- byte VAR_U32_USER_VAR_A;
- byte VAR_U32_USER_VAR_B;
- byte VAR_U32_USER_VAR_C;
- byte VAR_U32_USER_VAR_D;
- byte VAR_U32_USER_VAR_E;
- byte VAR_U32_USER_VAR_F;
};
class ScummEngine_v99he : public ScummEngine_v90he {
@@ -585,17 +575,25 @@ protected:
};
class ScummEngine_v100he : public ScummEngine_v99he {
+friend class AI;
+
protected:
ResType _heResType;
int32 _heResId;
byte _debugInputBuffer[256];
+
+public:
+ Moonbase *_moonbase;
+
public:
ScummEngine_v100he(OSystem *syst, const DetectorResult &dr);
~ScummEngine_v100he();
virtual void resetScumm();
+ virtual void setupScummVars();
+
protected:
virtual void setupOpcodes();
@@ -641,6 +639,14 @@ protected:
void o100_getSpriteInfo();
void o100_getWizData();
void o100_getVideoData();
+
+protected:
+ byte VAR_U32_USER_VAR_A;
+ byte VAR_U32_USER_VAR_B;
+ byte VAR_U32_USER_VAR_C;
+ byte VAR_U32_USER_VAR_D;
+ byte VAR_U32_USER_VAR_E;
+ byte VAR_U32_USER_VAR_F;
};
class ScummEngine_vCUPhe : public Engine {
diff --git a/engines/scumm/he/logic/moonbase_logic.cpp b/engines/scumm/he/logic/moonbase_logic.cpp
index ce5009f..9d9561a 100644
--- a/engines/scumm/he/logic/moonbase_logic.cpp
+++ b/engines/scumm/he/logic/moonbase_logic.cpp
@@ -33,7 +33,7 @@ namespace Scumm {
*/
class LogicHEmoonbase : public LogicHE {
public:
- LogicHEmoonbase(ScummEngine_v90he *vm) : LogicHE(vm) {}
+ LogicHEmoonbase(ScummEngine_v100he *vm) : LogicHE(vm) { _vm1 = vm; }
int versionID();
@@ -53,12 +53,15 @@ private:
void op_ai_reset(int op, int numArgs, int32 *args);
void op_ai_set_type(int op, int numArgs, int32 *args);
void op_ai_clean_up(int op, int numArgs, int32 *args);
+
+private:
+ ScummEngine_v100he *_vm1;
};
int LogicHEmoonbase::versionID() {
- if (_vm->_game.features & GF_DEMO)
+ if (_vm1->_game.features & GF_DEMO)
return -100;
- else if (strcmp(_vm->_game.variant, "1.1") == 0)
+ else if (strcmp(_vm1->_game.variant, "1.1") == 0)
return 110;
else
return 100;
@@ -184,9 +187,9 @@ void LogicHEmoonbase::op_dos_command(int op, int numArgs, int32 *args) {
void LogicHEmoonbase::op_set_fow_sentinel(int32 *args) {
debug(2, "op_set_fow_sentinel(%d, %d, %d)", args[0], args[1], args[2]);
- _vm->_moonbase->_fowSentinelImage = args[0];
- _vm->_moonbase->_fowSentinelState = args[1];
- _vm->_moonbase->_fowSentinelConditionBits = args[2];
+ _vm1->_moonbase->_fowSentinelImage = args[0];
+ _vm1->_moonbase->_fowSentinelState = args[1];
+ _vm1->_moonbase->_fowSentinelConditionBits = args[2];
}
void LogicHEmoonbase::op_set_fow_information(int op, int numArgs, int32 *args) {
@@ -200,7 +203,7 @@ void LogicHEmoonbase::op_set_fow_information(int op, int numArgs, int32 *args) {
debug(2, "%s", str.c_str());
- _vm->_moonbase->setFOWInfo(
+ _vm1->_moonbase->setFOWInfo(
args[0], // array
args[1], // array down dimension
args[2], // array across dimension
@@ -217,7 +220,7 @@ void LogicHEmoonbase::op_set_fow_information(int op, int numArgs, int32 *args) {
int LogicHEmoonbase::op_set_fow_image(int op, int numArgs, int32 *args) {
debug(2, "op_set_fow_image(%d)", args[0]);
- return _vm->_moonbase->setFOWImage(args[0]) ? 1 : 0;
+ return _vm1->_moonbase->setFOWImage(args[0]) ? 1 : 0;
}
void LogicHEmoonbase::op_ai_test_kludge(int op, int numArgs, int32 *args) {
@@ -227,25 +230,25 @@ void LogicHEmoonbase::op_ai_test_kludge(int op, int numArgs, int32 *args) {
int LogicHEmoonbase::op_ai_master_control_program(int op, int numArgs, int32 *args) {
warning("op_ai_master_control_program()");
- return _vm->_moonbase->_ai->masterControlProgram(numArgs, args);
+ return _vm1->_moonbase->_ai->masterControlProgram(numArgs, args);
}
void LogicHEmoonbase::op_ai_reset(int op, int numArgs, int32 *args) {
warning("op_ai_reset())");
- _vm->_moonbase->_ai->resetAI();
+ _vm1->_moonbase->_ai->resetAI();
}
void LogicHEmoonbase::op_ai_set_type(int op, int numArgs, int32 *args) {
warning("op_ai_set_type()");
- _vm->_moonbase->_ai->setAIType(numArgs, args);
+ _vm1->_moonbase->_ai->setAIType(numArgs, args);
}
void LogicHEmoonbase::op_ai_clean_up(int op, int numArgs, int32 *args) {
warning("op_ai_clean_up()");
- _vm->_moonbase->_ai->cleanUpAI();
+ _vm1->_moonbase->_ai->cleanUpAI();
}
-LogicHE *makeLogicHEmoonbase(ScummEngine_v90he *vm) {
+LogicHE *makeLogicHEmoonbase(ScummEngine_v100he *vm) {
return new LogicHEmoonbase(vm);
}
diff --git a/engines/scumm/he/logic_he.cpp b/engines/scumm/he/logic_he.cpp
index 366cd3b..33f5c40 100644
--- a/engines/scumm/he/logic_he.cpp
+++ b/engines/scumm/he/logic_he.cpp
@@ -102,7 +102,7 @@ LogicHE *LogicHE::makeLogicHE(ScummEngine_v90he *vm) {
return makeLogicHEbasketball(vm);
case GID_MOONBASE:
- return makeLogicHEmoonbase(vm);
+ return makeLogicHEmoonbase((ScummEngine_v100he *)vm);
default:
return new LogicHE(vm);
diff --git a/engines/scumm/he/logic_he.h b/engines/scumm/he/logic_he.h
index cd547f1..5002ee9 100644
--- a/engines/scumm/he/logic_he.h
+++ b/engines/scumm/he/logic_he.h
@@ -65,7 +65,7 @@ LogicHE *makeLogicHEfootball2002(ScummEngine_v90he *vm);
LogicHE *makeLogicHEsoccer(ScummEngine_v90he *vm);
LogicHE *makeLogicHEbaseball2001(ScummEngine_v90he *vm);
LogicHE *makeLogicHEbasketball(ScummEngine_v90he *vm);
-LogicHE *makeLogicHEmoonbase(ScummEngine_v90he *vm);
+LogicHE *makeLogicHEmoonbase(ScummEngine_v100he *vm);
} // End of namespace Scumm
diff --git a/engines/scumm/he/moonbase/ai_main.h b/engines/scumm/he/moonbase/ai_main.h
index 619ff16..b750ed0 100644
--- a/engines/scumm/he/moonbase/ai_main.h
+++ b/engines/scumm/he/moonbase/ai_main.h
@@ -28,7 +28,7 @@
namespace Scumm {
-class ScummEngine_v90he;
+class ScummEngine_v100he;
enum {
TERRAIN_TYPE_GOOD = 0,
@@ -83,7 +83,7 @@ enum {
class AI {
public:
- AI(ScummEngine_v90he *vm) : _vm(vm) {}
+ AI(ScummEngine_v100he *vm) : _vm(vm) {}
void resetAI();
void cleanUpAI();
@@ -191,7 +191,7 @@ public:
Common::Array<int> lastXCoord[5];
Common::Array<int> lastYCoord[5];
- ScummEngine_v90he *_vm;
+ ScummEngine_v100he *_vm;
};
} // End of namespace Scumm
diff --git a/engines/scumm/he/wiz_he.cpp b/engines/scumm/he/wiz_he.cpp
index 0ebfe67..428960f 100644
--- a/engines/scumm/he/wiz_he.cpp
+++ b/engines/scumm/he/wiz_he.cpp
@@ -1573,8 +1573,8 @@ uint8 *Wiz::drawWizImage(int resNum, int state, int maskNum, int maskState, int
}
if (_vm->_game.id == GID_MOONBASE &&
- ((ScummEngine_v90he *)_vm)->_moonbase->isFOW(resNum, state, conditionBits)) {
- ((ScummEngine_v90he *)_vm)->_moonbase->renderFOW(dst, dstPitch, dstType, cw, ch, flags);
+ ((ScummEngine_v100he *)_vm)->_moonbase->isFOW(resNum, state, conditionBits)) {
+ ((ScummEngine_v100he *)_vm)->_moonbase->renderFOW(dst, dstPitch, dstType, cw, ch, flags);
x1 = 0;
y1 = 0;
width = rScreen.width();
@@ -1814,7 +1814,7 @@ void Wiz::copy555WizImage(uint8 *dst, uint8 *wizd, int dstPitch, int dstType,
uint32 compID = READ_LE_UINT32(wizd);
if (compID == 0x12340102) {
- ((ScummEngine_v90he *)_vm)->_moonbase->blitT14WizImage(dst, dstw, dsth, dstPitch, clipBox, wizd, srcx, srcy, rawROP, paramROP);
+ ((ScummEngine_v100he *)_vm)->_moonbase->blitT14WizImage(dst, dstw, dsth, dstPitch, clipBox, wizd, srcx, srcy, rawROP, paramROP);
} else if (compID == 0x12340802) {
warning("Distorion codec");
} else if (compID == 0x12340902) {
diff --git a/engines/scumm/scumm.h b/engines/scumm/scumm.h
index a3fa329..f9758ae 100644
--- a/engines/scumm/scumm.h
+++ b/engines/scumm/scumm.h
@@ -700,8 +700,6 @@ protected:
void ignoreScriptWord() { fetchScriptWord(); }
void ignoreScriptByte() { fetchScriptByte(); }
void push(int a);
-
-public: // TODO. FIXME should be protected. Used by Moonbase
int pop();
virtual int readVar(uint var);
virtual void writeVar(uint var, int value);
diff --git a/engines/scumm/scumm_v2.h b/engines/scumm/scumm_v2.h
index 763bbc0..2a9e7a9 100644
--- a/engines/scumm/scumm_v2.h
+++ b/engines/scumm/scumm_v2.h
@@ -78,7 +78,6 @@ protected:
void getResultPosIndirect();
virtual void getResultPos();
-public: // TODO. FIXME. Should be protected. Used by Moonbase
virtual int readVar(uint var);
virtual void writeVar(uint var, int value);
diff --git a/engines/scumm/vars.cpp b/engines/scumm/vars.cpp
index 5254aa4..e5ba4a6 100644
--- a/engines/scumm/vars.cpp
+++ b/engines/scumm/vars.cpp
@@ -340,6 +340,11 @@ void ScummEngine_v90he::setupScummVars() {
VAR_NUM_PALETTES = 130;
VAR_NUM_UNK = 131;
}
+}
+
+void ScummEngine_v100he::setupScummVars() {
+ ScummEngine_v90he::setupScummVars();
+
if (_game.id == GID_MOONBASE) {
VAR_U32_USER_VAR_A = 108;
VAR_U32_USER_VAR_B = 109;
Commit: 9bc6a73686f7880fb9ec51f29d2a9e77d65a7c71
https://github.com/scummvm/scummvm/commit/9bc6a73686f7880fb9ec51f29d2a9e77d65a7c71
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2016-05-26T22:11:32+02:00
Commit Message:
SCUMM HE: Moved global variables of Moonbase AI to the class
Changed paths:
engines/scumm/he/logic/moonbase_logic.cpp
engines/scumm/he/moonbase/ai_main.cpp
engines/scumm/he/moonbase/ai_main.h
engines/scumm/he/moonbase/ai_traveller.cpp
diff --git a/engines/scumm/he/logic/moonbase_logic.cpp b/engines/scumm/he/logic/moonbase_logic.cpp
index 9d9561a..1b596fc 100644
--- a/engines/scumm/he/logic/moonbase_logic.cpp
+++ b/engines/scumm/he/logic/moonbase_logic.cpp
@@ -59,9 +59,9 @@ private:
};
int LogicHEmoonbase::versionID() {
- if (_vm1->_game.features & GF_DEMO)
+ if (_vm->_game.features & GF_DEMO)
return -100;
- else if (strcmp(_vm1->_game.variant, "1.1") == 0)
+ else if (strcmp(_vm->_game.variant, "1.1") == 0)
return 110;
else
return 100;
diff --git a/engines/scumm/he/moonbase/ai_main.cpp b/engines/scumm/he/moonbase/ai_main.cpp
index 326da21..7ca4fbd 100644
--- a/engines/scumm/he/moonbase/ai_main.cpp
+++ b/engines/scumm/he/moonbase/ai_main.cpp
@@ -152,38 +152,36 @@ enum {
TREE_DEPTH = 2
};
-AIEntity *AItype[5];
+AI::AI(ScummEngine_v100he *vm) : _vm(vm) {
+ memset(_aiType, 0, sizeof(_aiType));
+ _aiState = STATE_CHOOSE_BEHAVIOR;
+ _behavior = 2;
+ _energyHogType = 0;
-int AIstate = STATE_CHOOSE_BEHAVIOR;
-int behavior = 2;
-static int energyHogType = 0;
-
-patternList *moveList[5];
-
-int *storedLaunchAction[5] = {NULL};
-
-const int32 *MCP_params;
+ memset(_moveList, 0, sizeof(_moveList));
+ _mcpParams = 0;
+}
void AI::resetAI() {
- AIstate = STATE_CHOOSE_BEHAVIOR;
+ _aiState = STATE_CHOOSE_BEHAVIOR;
warning("----------------------> Resetting AI");
for (int i = 1; i != 5; i++) {
- if (AItype[i]) {
- delete AItype[i];
- AItype[i] = NULL;
+ if (_aiType[i]) {
+ delete _aiType[i];
+ _aiType[i] = NULL;
}
- AItype[i] = new AIEntity(BRUTAKAS);
+ _aiType[i] = new AIEntity(BRUTAKAS);
}
for (int i = 1; i != 5; i++) {
- if (moveList[i]) {
- delete moveList[i];
- moveList[i] = NULL;
+ if (_moveList[i]) {
+ delete _moveList[i];
+ _moveList[i] = NULL;
}
- moveList[i] = new patternList;
+ _moveList[i] = new patternList;
}
}
@@ -191,35 +189,35 @@ void AI::cleanUpAI() {
warning("----------------------> Cleaning Up AI");
for (int i = 1; i != 5; i++) {
- if (AItype[i]) {
- delete AItype[i];
- AItype[i] = NULL;
+ if (_aiType[i]) {
+ delete _aiType[i];
+ _aiType[i] = NULL;
}
}
for (int i = 1; i != 5; i++) {
- if (moveList[i]) {
- delete moveList[i];
- moveList[i] = NULL;
+ if (_moveList[i]) {
+ delete _moveList[i];
+ _moveList[i] = NULL;
}
}
}
void AI::setAIType(const int paramCount, const int32 *params) {
- if (AItype[params[AI_TYPE_PLAYER_NUM]]) {
- delete AItype[params[AI_TYPE_PLAYER_NUM]];
- AItype[params[AI_TYPE_PLAYER_NUM]] = NULL;
+ if (_aiType[params[AI_TYPE_PLAYER_NUM]]) {
+ delete _aiType[params[AI_TYPE_PLAYER_NUM]];
+ _aiType[params[AI_TYPE_PLAYER_NUM]] = NULL;
}
- AItype[params[AI_TYPE_PLAYER_NUM]] = new AIEntity(params[AI_TYPE_TYPE]);
+ _aiType[params[AI_TYPE_PLAYER_NUM]] = new AIEntity(params[AI_TYPE_TYPE]);
if (params[AI_TYPE_TYPE] == ENERGY_HOG) {
- energyHogType = 1;
+ _energyHogType = 1;
} else {
- energyHogType = 0;
+ _energyHogType = 0;
}
- warning("AI for player %d is %s", params[AI_TYPE_PLAYER_NUM], AItype[params[AI_TYPE_PLAYER_NUM]]->getNameString());
+ warning("AI for player %d is %s", params[AI_TYPE_PLAYER_NUM], _aiType[params[AI_TYPE_PLAYER_NUM]]->getNameString());
}
int AI::masterControlProgram(const int paramCount, const int32 *params) {
@@ -227,7 +225,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
static int index;
- MCP_params = params;
+ _mcpParams = params;
static int lastSource[5];
static int lastAngle[5];
@@ -278,7 +276,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
int timerValue = getTimerValue(3);
// If timer has run out
- if ((AIstate > STATE_CHOOSE_BEHAVIOR) && ((maxTime) && (timerValue > maxTime))) {
+ if ((_aiState > STATE_CHOOSE_BEHAVIOR) && ((maxTime) && (timerValue > maxTime))) {
if (myTree != NULL) {
delete myTree;
myTree = NULL;
@@ -305,41 +303,43 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
launchAction[1] = SKIP_TURN;
}
- AIstate = STATE_LAUNCH;
+ _aiState = STATE_LAUNCH;
}
- static int oldAIstate = 0;
+ static int old_aiState = 0;
- if (oldAIstate != AIstate) {
- warning("<<%d>>", AIstate);
- oldAIstate = AIstate;
+ if (old_aiState != _aiState) {
+ warning("<<%d>>", _aiState);
+ old_aiState = _aiState;
}
- switch (AIstate) {
+ switch (_aiState) {
case STATE_CHOOSE_BEHAVIOR:
- behavior = chooseBehavior();
- warning("Behavior mode: %d", behavior);
+ _behavior = chooseBehavior();
+ warning("Behavior mode: %d", _behavior);
- if ((int)_vm->_rnd.getRandomNumber(99) < AItype[getCurrentPlayer()]->getBehaviorVariation() * AI_VAR_BASE_BEHAVIOR + 1) {
+ if ((int)_vm->_rnd.getRandomNumber(99) < _aiType[getCurrentPlayer()]->getBehaviorVariation() * AI_VAR_BASE_BEHAVIOR + 1) {
if (_vm->_rnd.getRandomNumber(1)) {
- behavior--;
+ _behavior--;
- if (behavior < ENERGY_MODE) behavior = DEFENSE_MODE;
+ if (_behavior < ENERGY_MODE)
+ _behavior = DEFENSE_MODE;
} else {
- behavior++;
+ _behavior++;
- if (behavior > DEFENSE_MODE) behavior = ENERGY_MODE;
+ if (_behavior > DEFENSE_MODE)
+ _behavior = ENERGY_MODE;
}
- warning("Alternative behavior: %d", behavior);
+ warning("Alternative behavior: %d", _behavior);
}
- if (behavior == ENERGY_MODE)
+ if (_behavior == ENERGY_MODE)
if (!getNumberOfPools())
- behavior = OFFENSE_MODE;
+ _behavior = OFFENSE_MODE;
- if (AItype[getCurrentPlayer()]->getID() == CRAWLER_CHUCKER)
- behavior = OFFENSE_MODE;
+ if (_aiType[getCurrentPlayer()]->getID() == CRAWLER_CHUCKER)
+ _behavior = OFFENSE_MODE;
if (launchAction != NULL) {
delete launchAction;
@@ -347,16 +347,16 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
}
index = 0;
- AIstate = STATE_CHOOSE_TARGET;
+ _aiState = STATE_CHOOSE_TARGET;
break;
case STATE_CHOOSE_TARGET:
- target = chooseTarget(behavior);
+ target = chooseTarget(_behavior);
if (!target)
target = chooseTarget(OFFENSE_MODE);
- if (behavior == ENERGY_MODE) {
+ if (_behavior == ENERGY_MODE) {
int energyPoolScummArray = getEnergyPoolsArray();
targetX = _vm->_moonbase->readFromArray(energyPoolScummArray, target, ENERGY_POOL_X);
targetY = _vm->_moonbase->readFromArray(energyPoolScummArray, target, ENERGY_POOL_Y);
@@ -368,9 +368,9 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
warning("Target (%d, %d) id: %d", targetX, targetY, target);
if (getFOW())
- AIstate = STATE_ATTEMPT_SEARCH;
+ _aiState = STATE_ATTEMPT_SEARCH;
else
- AIstate = STATE_INIT_APPROACH_TARGET;
+ _aiState = STATE_INIT_APPROACH_TARGET;
break;
@@ -420,26 +420,26 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
targetX = newTargetPos % getMaxX();
targetY = newTargetPos / getMaxY();
- AIstate = STATE_INIT_ACQUIRE_TARGET;
+ _aiState = STATE_INIT_ACQUIRE_TARGET;
break;
}
}
- AIstate = STATE_INIT_APPROACH_TARGET;
+ _aiState = STATE_INIT_APPROACH_TARGET;
break;
case STATE_INIT_APPROACH_TARGET:
{
int closestOL = getClosestUnit(targetX, targetY, 900, currentPlayer, 1, BUILDING_OFFENSIVE_LAUNCHER, 1);
- if (closestOL && (behavior == OFFENSE_MODE)) {
- AIstate = STATE_OFFEND_TARGET;
+ if (closestOL && (_behavior == OFFENSE_MODE)) {
+ _aiState = STATE_OFFEND_TARGET;
break;
}
}
// get closest hub...if attack mode and almost close enough, maybe throw an offense
- if ((behavior == OFFENSE_MODE) && (getPlayerEnergy() > 6)) {
+ if ((_behavior == OFFENSE_MODE) && (getPlayerEnergy() > 6)) {
if (!_vm->_rnd.getRandomNumber(2)) {
int closestHub = getClosestUnit(targetX, targetY, getMaxX(), currentPlayer, 1, BUILDING_MAIN_BASE, 1);
@@ -454,19 +454,19 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
targetX = getHubX(closestHub);
targetY = getHubY(closestHub);
- AIstate = STATE_DEFEND_TARGET;
+ _aiState = STATE_DEFEND_TARGET;
break;
}
}
}
}
- if ((behavior == OFFENSE_MODE) && (AItype[currentPlayer]->getID() == RANGER) && (getPlayerEnergy() > 2)) {
+ if ((_behavior == OFFENSE_MODE) && (_aiType[currentPlayer]->getID() == RANGER) && (getPlayerEnergy() > 2)) {
int closestHub = getClosestUnit(targetX, targetY, getMaxX(), currentPlayer, 1, BUILDING_MAIN_BASE, 1);
int dist = getDistance(targetX, targetY, getHubX(closestHub), getHubY(closestHub));
if (dist < 750) {
- AIstate = STATE_OFFEND_TARGET;
+ _aiState = STATE_OFFEND_TARGET;
break;
}
}
@@ -475,21 +475,21 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
// If no need to approach, apply appropriate behavior
if (retNode == myTree->getBaseNode()) {
- switch (behavior) {
+ switch (_behavior) {
case 0:
- AIstate = STATE_ENERGIZE_TARGET;
+ _aiState = STATE_ENERGIZE_TARGET;
break;
case 1:
- AIstate = STATE_OFFEND_TARGET;
+ _aiState = STATE_OFFEND_TARGET;
break;
case 2:
- AIstate = STATE_DEFEND_TARGET;
+ _aiState = STATE_DEFEND_TARGET;
break;
case -1:
- AIstate = STATE_LAUNCH;
+ _aiState = STATE_LAUNCH;
break;
}
@@ -503,8 +503,8 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
if (getPlayerEnergy() < 7) {
if (!_vm->_rnd.getRandomNumber(3)) {
- behavior = DEFENSE_MODE;
- AIstate = STATE_CHOOSE_TARGET;
+ _behavior = DEFENSE_MODE;
+ _aiState = STATE_CHOOSE_TARGET;
} else {
if (launchAction == NULL) {
launchAction = new int[4];
@@ -516,7 +516,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
launchAction[1] = SKIP_TURN;
}
- AIstate = STATE_LAUNCH;
+ _aiState = STATE_LAUNCH;
}
delete myTree;
@@ -524,7 +524,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
break;
}
- AIstate = STATE_CRAWLER_DECISION;
+ _aiState = STATE_CRAWLER_DECISION;
break;
// If behavior is offense, possibly just chuck a crawler
@@ -533,7 +533,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
// Brace just here to scope throwCrawler
int throwCrawler = 0;
- if (behavior == OFFENSE_MODE) {
+ if (_behavior == OFFENSE_MODE) {
if (getPlayerEnergy() > 6) {
int crawlerTest = _vm->_rnd.getRandomNumber(9);
@@ -542,7 +542,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
}
}
- if (AItype[getCurrentPlayer()]->getID() == CRAWLER_CHUCKER) {
+ if (_aiType[getCurrentPlayer()]->getID() == CRAWLER_CHUCKER) {
if (getPlayerEnergy() > 6) {
throwCrawler = 1;
} else {
@@ -553,7 +553,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
else
launchAction[1] = SKIP_TURN;
- AIstate = STATE_LAUNCH;
+ _aiState = STATE_LAUNCH;
delete myTree;
myTree = NULL;
}
@@ -581,11 +581,11 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
targetX = (targetX + getMaxX()) % getMaxX();
targetY = (targetY + getMaxY()) % getMaxY();
- AIstate = STATE_INIT_ACQUIRE_TARGET;
+ _aiState = STATE_INIT_ACQUIRE_TARGET;
delete myTree;
myTree = NULL;
} else {
- AIstate = STATE_APPROACH_TARGET;
+ _aiState = STATE_APPROACH_TARGET;
}
break;
}
@@ -608,7 +608,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
delete launchAction;
launchAction = NULL;
- AIstate = STATE_DEFEND_TARGET;
+ _aiState = STATE_DEFEND_TARGET;
delete myTree;
myTree = NULL;
break;
@@ -621,8 +621,8 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
targetX = (targetX + getMaxX()) % getMaxX();
targetY = (targetY + getMaxY()) % getMaxY();
- AIstate = STATE_INIT_ACQUIRE_TARGET;
- behavior = -1;
+ _aiState = STATE_INIT_ACQUIRE_TARGET;
+ _behavior = -1;
delete myTree;
myTree = NULL;
@@ -640,10 +640,10 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
if (launchAction[1] == ITEM_HUB) {
index = 0;
retNodeFlag = 0;
- AIstate = STATE_INIT_ACQUIRE_TARGET;
+ _aiState = STATE_INIT_ACQUIRE_TARGET;
} else {
index = 0;
- AIstate = STATE_INIT_ACQUIRE_TARGET;
+ _aiState = STATE_INIT_ACQUIRE_TARGET;
}
} else {
index++;
@@ -651,10 +651,10 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
launchAction = NULL;
}
} else {
- behavior = DEFENSE_MODE;
+ _behavior = DEFENSE_MODE;
retNodeFlag = 0;
index = 0;
- AIstate = STATE_CHOOSE_TARGET;
+ _aiState = STATE_CHOOSE_TARGET;
}
break;
@@ -664,7 +664,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
if (launchAction != NULL) {
if (launchAction[0]) {
retNodeFlag = 0;
- AIstate = STATE_INIT_ACQUIRE_TARGET;
+ _aiState = STATE_INIT_ACQUIRE_TARGET;
} else {
index++;
delete launchAction;
@@ -679,7 +679,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
if (launchAction != NULL) {
if (launchAction[0]) {
retNodeFlag = 0;
- AIstate = STATE_INIT_ACQUIRE_TARGET;
+ _aiState = STATE_INIT_ACQUIRE_TARGET;
if (launchAction[LAUNCH_UNIT] != ITEM_BRIDGE) {
if (OLflag) {
@@ -705,7 +705,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
myTree = initAcquireTarget(targetX, targetY, &retNode);
if (myTree == NULL) {
- AIstate = STATE_LAUNCH;
+ _aiState = STATE_LAUNCH;
break;
}
@@ -715,7 +715,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
_acquireTarget = 0;
- AIstate = STATE_ACQUIRE_TARGET;
+ _aiState = STATE_ACQUIRE_TARGET;
break;
case STATE_ACQUIRE_TARGET: {
@@ -757,7 +757,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
assert(launchAction != NULL);
delete myTree;
myTree = NULL;
- AIstate = STATE_LAUNCH;
+ _aiState = STATE_LAUNCH;
}
}
break;
@@ -766,7 +766,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
break;
}
- if (AIstate == STATE_LAUNCH) {
+ if (_aiState == STATE_LAUNCH) {
static float randomAttenuation = 1;
if (((launchAction[LAUNCH_UNIT] == ITEM_REPAIR) || (launchAction[LAUNCH_UNIT] == ITEM_ANTIAIR) || (launchAction[LAUNCH_UNIT] == ITEM_BRIDGE) || (launchAction[LAUNCH_UNIT] == ITEM_TOWER) || (launchAction[LAUNCH_UNIT] == ITEM_RECLAIMER) || (launchAction[LAUNCH_UNIT] == ITEM_BALLOON) || (launchAction[LAUNCH_UNIT] == ITEM_MINE) || (launchAction[LAUNCH_UNIT] == ITEM_ENERGY) || (launchAction[LAUNCH_UNIT] == ITEM_SHIELD) || (launchAction[LAUNCH_UNIT] == ITEM_OFFENSE) || (launchAction[LAUNCH_UNIT] == ITEM_HUB)) && (getBuildingType(launchAction[LAUNCH_SOURCE_HUB]) == BUILDING_OFFENSIVE_LAUNCHER)) {
@@ -818,7 +818,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
{
// ANGLE setting
int angleAdjustment = 0;
- angleAdjustment = _vm->_rnd.getRandomNumber(AItype[getCurrentPlayer()]->getAngleVariation() * AI_VAR_BASE_ANGLE) * 3.6;
+ angleAdjustment = _vm->_rnd.getRandomNumber(_aiType[getCurrentPlayer()]->getAngleVariation() * AI_VAR_BASE_ANGLE) * 3.6;
//pos or neg choice
angleAdjustment *= ((_vm->_rnd.getRandomNumber(1) * 2) - 1);
angleAdjustment *= randomAttenuation;
@@ -850,7 +850,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
{
// POWER setting
int powerRangeFactor = (getMaxPower() - getMinPower()) / 100;
- int powerAdjustment = static_cast<float>(_vm->_rnd.getRandomNumber(AItype[getCurrentPlayer()]->getPowerVariation() * AI_VAR_BASE_POWER)) * powerRangeFactor;
+ int powerAdjustment = static_cast<float>(_vm->_rnd.getRandomNumber(_aiType[getCurrentPlayer()]->getPowerVariation() * AI_VAR_BASE_POWER)) * powerRangeFactor;
//pos or neg choice
powerAdjustment *= ((_vm->_rnd.getRandomNumber(1) * 2) - 1);
powerAdjustment *= randomAttenuation;
@@ -935,7 +935,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
delete[] launchAction;
launchAction = NULL;
- AIstate = STATE_CHOOSE_BEHAVIOR;
+ _aiState = STATE_CHOOSE_BEHAVIOR;
int rSh, rU, rP, rA = 0;
rSh = _vm->readVar(_vm->VAR_U32_USER_VAR_A);
@@ -947,11 +947,11 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
{
// Checking for patterns
- if ((AItype[currentPlayer]->getID() != CRAWLER_CHUCKER) &&
- (AItype[currentPlayer]->getID() != ENERGY_HOG) && (getBuildingStackPtr() > 5))
- moveList[currentPlayer]->addPattern(rSh, rU, rP, rA);
+ if ((_aiType[currentPlayer]->getID() != CRAWLER_CHUCKER) &&
+ (_aiType[currentPlayer]->getID() != ENERGY_HOG) && (getBuildingStackPtr() > 5))
+ _moveList[currentPlayer]->addPattern(rSh, rU, rP, rA);
- int patternFound = moveList[currentPlayer]->evaluatePattern(rSh, rU, rP, rA);
+ int patternFound = _moveList[currentPlayer]->evaluatePattern(rSh, rU, rP, rA);
if (!_vm->_rnd.getRandomNumber(9))
patternFound = 0;
@@ -960,26 +960,26 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
warning("------------------------------------------>Eliminating pattern");
if (_vm->_rnd.getRandomNumber(1)) {
- behavior--;
+ _behavior--;
- if (behavior < ENERGY_MODE)
- behavior = DEFENSE_MODE;
+ if (_behavior < ENERGY_MODE)
+ _behavior = DEFENSE_MODE;
} else {
- behavior++;
+ _behavior++;
- if (behavior > DEFENSE_MODE)
- behavior = ENERGY_MODE;
+ if (_behavior > DEFENSE_MODE)
+ _behavior = ENERGY_MODE;
}
- if (behavior == ENERGY_MODE)
+ if (_behavior == ENERGY_MODE)
if (!getNumberOfPools())
- behavior = OFFENSE_MODE;
+ _behavior = OFFENSE_MODE;
_vm->writeVar(_vm->VAR_U32_USER_VAR_A, 0);
_vm->writeVar(_vm->VAR_U32_USER_VAR_B, 0);
_vm->writeVar(_vm->VAR_U32_USER_VAR_C, 0);
_vm->writeVar(_vm->VAR_U32_USER_VAR_D, 0);
- AIstate = STATE_CHOOSE_TARGET;
+ _aiState = STATE_CHOOSE_TARGET;
}
}
@@ -1011,7 +1011,7 @@ int AI::masterControlProgram(const int paramCount, const int32 *params) {
if (selectedUnit) {
if (selectedUnit > 0)
- _vm->writeVar(_vm->VAR_U32_USER_VAR_E, behavior);
+ _vm->writeVar(_vm->VAR_U32_USER_VAR_E, _behavior);
else
_vm->writeVar(_vm->VAR_U32_USER_VAR_E, -999);
}
@@ -1027,7 +1027,7 @@ int AI::chooseBehavior() {
int currentPlayer = getCurrentPlayer();
- int AIpersonality = AItype[currentPlayer]->getID();
+ int AIpersonality = _aiType[currentPlayer]->getID();
switch (AIpersonality) {
case BRUTAKAS:
@@ -1413,7 +1413,7 @@ int AI::chooseBehavior() {
defCon += 2;
}
- warning("%s-------------------------------> Energy: %d Offense: %d Defense: %d", AItype[currentPlayer]->getNameString(), eneCon, offCon, defCon);
+ warning("%s-------------------------------> Energy: %d Offense: %d Defense: %d", _aiType[currentPlayer]->getNameString(), eneCon, offCon, defCon);
if (dominantMode == DEFENSE_MODE)
if ((defCon <= offCon) && (defCon <= eneCon))
@@ -1439,7 +1439,7 @@ int AI::chooseBehavior() {
return -1;
}
-int AI::chooseTarget(int behavior1) {
+int AI::chooseTarget(int behavior) {
int numPools = getNumberOfPools();
int currentPlayer = getCurrentPlayer();
@@ -1447,7 +1447,7 @@ int AI::chooseTarget(int behavior1) {
int selectionValues[50] = {0};
int selectionDist = 10000000;
- if (behavior1 == ENERGY_MODE) {
+ if (behavior == ENERGY_MODE) {
// loop through energy pool array
int energyPoolScummArray = getEnergyPoolsArray();
@@ -1508,7 +1508,7 @@ int AI::chooseTarget(int behavior1) {
return selection;
}
- if (behavior1 == OFFENSE_MODE) {
+ if (behavior == OFFENSE_MODE) {
int returnBuilding = 0;
int attackableArray[500];
int nearAttackableArray[500];
@@ -1640,7 +1640,7 @@ int AI::chooseTarget(int behavior1) {
return returnBuilding;
}
- if (behavior1 == DEFENSE_MODE) {
+ if (behavior == DEFENSE_MODE) {
int returnBuilding = 0;
int savedTally = 0;
@@ -1801,7 +1801,7 @@ int AI::chooseTarget(int behavior1) {
Tree *AI::initApproachTarget(int targetX, int targetY, Node **retNode) {
int sourceHub = 0;
- if (behavior == 2)
+ if (_behavior == 2)
sourceHub = getClosestUnit(targetX + 10, targetY, getMaxX(), getCurrentPlayer(), 1, BUILDING_MAIN_BASE, 1);
else
sourceHub = getClosestUnit(targetX + 10, targetY, getMaxX(), getCurrentPlayer(), 1, BUILDING_MAIN_BASE, 1, MIN_DIST);
@@ -1878,13 +1878,13 @@ int *AI::approachTarget(Tree *myTree, int &xTarget, int &yTarget, Node **current
int whoseTurn = getCurrentPlayer();
- if ((lastXCoord[whoseTurn]).size() >= MAX_MEMORY) {
- (lastXCoord[whoseTurn]).erase((lastXCoord[whoseTurn]).begin());
- (lastYCoord[whoseTurn]).erase((lastYCoord[whoseTurn]).begin());
+ if ((_lastXCoord[whoseTurn]).size() >= MAX_MEMORY) {
+ (_lastXCoord[whoseTurn]).erase((_lastXCoord[whoseTurn]).begin());
+ (_lastYCoord[whoseTurn]).erase((_lastYCoord[whoseTurn]).begin());
}
- (lastXCoord[whoseTurn]).push_back(retTraveller->getPosX());
- (lastYCoord[whoseTurn]).push_back(retTraveller->getPosY());
+ (_lastXCoord[whoseTurn]).push_back(retTraveller->getPosX());
+ (_lastYCoord[whoseTurn]).push_back(retTraveller->getPosY());
int temp = static_cast<int>(retTraveller->calcT());
int temp2 = static_cast<int>(retTraveller->getValueG());
@@ -2402,215 +2402,215 @@ int *AI::defendTarget(int &targetX, int &targetY, int index) {
int AI::getClosestUnit(int x, int y, int radius, int player, int alignment, int unitType, int checkUnitEnabled) {
assert((unitType >= 0) && (unitType <= 12));
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_CLOSEST_UNIT], 7, x, y, radius, player, alignment, unitType, checkUnitEnabled);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_CLOSEST_UNIT], 7, x, y, radius, player, alignment, unitType, checkUnitEnabled);
return retVal;
}
int AI::getClosestUnit(int x, int y, int radius, int player, int alignment, int unitType, int checkUnitEnabled, int minDist) {
assert((unitType >= 0) && (unitType <= 12));
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_CLOSEST_UNIT], 8, x, y, radius, player, alignment, unitType, checkUnitEnabled, minDist);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_CLOSEST_UNIT], 8, x, y, radius, player, alignment, unitType, checkUnitEnabled, minDist);
return retVal;
}
int AI::getDistance(int originX, int originY, int endX, int endY) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_WORLD_DIST], 4, originX, originY, endX, endY);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_WORLD_DIST], 4, originX, originY, endX, endY);
return retVal;
}
int AI::calcAngle(int originX, int originY, int endX, int endY) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_WORLD_ANGLE], 5, originX, originY, endX, endY, 0);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_WORLD_ANGLE], 5, originX, originY, endX, endY, 0);
return retVal;
}
int AI::calcAngle(int originX, int originY, int endX, int endY, int noWrapFlag) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_WORLD_ANGLE], 5, originX, originY, endX, endY, noWrapFlag);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_WORLD_ANGLE], 5, originX, originY, endX, endY, noWrapFlag);
return retVal;
}
int AI::getTerrain(int x, int y) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_TERRAIN_TYPE], 2, x, y);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_TERRAIN_TYPE], 2, x, y);
return retVal;
}
int AI::estimateNextRoundEnergy(int player) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_ESTIMATE_NEXT_ROUND_ENERGY], 1, player);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_ESTIMATE_NEXT_ROUND_ENERGY], 1, player);
return retVal / 10;
}
int AI::getHubX(int hub) {
assert(hub >= 0 && hub <= 500);
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_HUB_X, hub);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_HUB_X, hub);
return retVal;
}
int AI::getHubY(int hub) {
assert(hub >= 0 && hub <= 500);
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_HUB_Y, hub);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_HUB_Y, hub);
return retVal;
}
int AI::getMaxX() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_WORLD_X_SIZE);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_WORLD_X_SIZE);
return retVal;
}
int AI::getMaxY() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_WORLD_Y_SIZE);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_WORLD_Y_SIZE);
return retVal;
}
int AI::getCurrentPlayer() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_CURRENT_PLAYER);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_CURRENT_PLAYER);
assert(retVal != 0);
return retVal;
}
int AI::getMaxPower() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_MAX_POWER);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_MAX_POWER);
return retVal;
}
int AI::getMinPower() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_MIN_POWER);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_MIN_POWER);
return retVal;
}
int AI::getTerrainSquareSize() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_TERRAIN_SQUARE_SIZE);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_TERRAIN_SQUARE_SIZE);
return retVal;
}
int AI::getBuildingOwner(int building) {
assert((building > 0) && (building < 501));
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_OWNER, building);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_OWNER, building);
return retVal;
}
int AI::getBuildingState(int building) {
assert((building > 0) && (building < 501));
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_STATE, building);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_STATE, building);
return retVal;
}
int AI::getBuildingType(int building) {
assert((building > 0) && (building < 501));
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_TYPE, building);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_TYPE, building);
return retVal;
}
int AI::getBuildingArmor(int building) {
assert((building > 0) && (building < 501));
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_ARMOR, building);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_ARMOR, building);
return retVal;
}
int AI::getBuildingWorth(int building) {
assert((building > 0) && (building < 501));
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_WORTH, building);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_WORTH, building);
return retVal;
}
int AI::getEnergyPoolsArray() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_ENERGY_POOLS_ARRAY);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_ENERGY_POOLS_ARRAY);
return retVal;
}
int AI::getCoordinateVisibility(int x, int y, int playerNum) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 4, D_GET_COORDINATE_VISIBILITY, x, y, playerNum);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 4, D_GET_COORDINATE_VISIBILITY, x, y, playerNum);
return retVal;
}
int AI::getUnitVisibility(int unit, int playerNum) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 3, D_GET_UNIT_VISIBILITY, unit, playerNum);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 3, D_GET_UNIT_VISIBILITY, unit, playerNum);
return retVal;
}
int AI::getEnergyPoolVisibility(int pool, int playerNum) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 3, D_GET_ENERGY_POOL_VISIBILITY, pool, playerNum);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 3, D_GET_ENERGY_POOL_VISIBILITY, pool, playerNum);
return retVal;
}
int AI::getNumberOfPools() {
int retVal = 0;
- if (AItype[getCurrentPlayer()]->getID() == ENERGY_HOG) {
+ if (_aiType[getCurrentPlayer()]->getID() == ENERGY_HOG) {
retVal = 1;
} else {
- retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_NUMBER_OF_POOLS);
+ retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_NUMBER_OF_POOLS);
}
return retVal;
}
int AI::getNumberOfPlayers() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_NUMBER_OF_PLAYERS);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_NUMBER_OF_PLAYERS);
return retVal;
}
int AI::getPlayerEnergy() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_PLAYER_ENERGY);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_PLAYER_ENERGY);
return static_cast<int>(static_cast<float>(retVal) / 10.0);
}
int AI::getPlayerMaxTime() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_PLAYER_MAX_TIME);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_PLAYER_MAX_TIME);
return retVal;
}
int AI::getWindXSpeed() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_WIND_X_SPEED);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_WIND_X_SPEED);
return retVal;
}
int AI::getWindYSpeed() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_WIND_Y_SPEED);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_WIND_Y_SPEED);
return retVal;
}
int AI::getTotalWindSpeed() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_TOTAL_WIND_SPEED);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_TOTAL_WIND_SPEED);
return retVal;
}
int AI::getWindXSpeedMax() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_WIND_X_SPEED_MAX);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_WIND_X_SPEED_MAX);
return retVal;
}
int AI::getWindYSpeedMax() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_WIND_Y_SPEED_MAX);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_WIND_Y_SPEED_MAX);
return retVal;
}
int AI::getBigXSize() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_BIG_X_SIZE);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_BIG_X_SIZE);
return retVal;
}
int AI::getBigYSize() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_BIG_Y_SIZE);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_BIG_Y_SIZE);
return retVal;
}
int AI::getEnergyPoolWidth(int pool) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_ENERGY_POOL_WIDTH, pool);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_ENERGY_POOL_WIDTH, pool);
return retVal;
}
int AI::getBuildingMaxArmor(int building) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_MAX_ARMOR, building);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_MAX_ARMOR, building);
return retVal;
}
int AI::getTimerValue(int timerNum) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_TIMER_VALUE, timerNum);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_TIMER_VALUE, timerNum);
return retVal;
}
int AI::getLastAttacked(int &x, int &y) {
int currentPlayer = getCurrentPlayer();
- x = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_LAST_ATTACKED_X, currentPlayer);
- y = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_LAST_ATTACKED_Y, currentPlayer);
+ x = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_LAST_ATTACKED_X, currentPlayer);
+ y = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_LAST_ATTACKED_Y, currentPlayer);
if (x || y) return 1;
@@ -2618,7 +2618,7 @@ int AI::getLastAttacked(int &x, int &y) {
}
int AI::getPlayerTeam(int player) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_PLAYER_TEAM, player);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_PLAYER_TEAM, player);
return retVal;
}
@@ -2627,37 +2627,37 @@ int AI::getBuildingTeam(int building) {
if (getBuildingOwner(building) == 0) return 0;
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_TEAM, building);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 2, D_GET_BUILDING_TEAM, building);
return retVal;
}
int AI::getFOW() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_FOW);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_FOW);
return retVal;
}
int AI::getAnimSpeed() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_ANIM_SPEED);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_ANIM_SPEED);
return retVal;
}
int AI::getBuildingStackPtr() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_BUILDING_STACK_PTR);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_BUILDING_STACK_PTR);
return retVal;
}
int AI::getTurnCounter() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_SCUMM_DATA], 1, D_GET_TURN_COUNTER);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_SCUMM_DATA], 1, D_GET_TURN_COUNTER);
return retVal;
}
int AI::getGroundAltitude(int x, int y) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_GROUND_ALTITUDE], 2, x, y);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_GROUND_ALTITUDE], 2, x, y);
return retVal;
}
int AI::checkForCordOverlap(int xStart, int yStart, int affectRadius, int simulateFlag) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_CHECK_FOR_CORD_OVERLAP], 4, xStart, yStart, affectRadius, simulateFlag);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_CHECK_FOR_CORD_OVERLAP], 4, xStart, yStart, affectRadius, simulateFlag);
return retVal;
}
@@ -2667,42 +2667,42 @@ int AI::checkForAngleOverlap(int unit, int angle) {
if (!unit) return 0;
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_CHECK_FOR_ANGLE_OVERLAP], 2, unit, angle);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_CHECK_FOR_ANGLE_OVERLAP], 2, unit, angle);
return retVal;
}
int AI::checkForUnitOverlap(int x, int y, int radius, int ignoredUnit) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_CHECK_FOR_UNIT_OVERLAP], 4, x, y, radius, ignoredUnit);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_CHECK_FOR_UNIT_OVERLAP], 4, x, y, radius, ignoredUnit);
return retVal;
}
int AI::checkForEnergySquare(int x, int y) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_CHECK_FOR_ENERGY_SQUARE], 2, x, y);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_CHECK_FOR_ENERGY_SQUARE], 2, x, y);
return retVal;
}
int AI::aiChat() {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_AI_CHAT], 0);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_AI_CHAT], 0);
return retVal;
}
int AI::getPowerAngleFromPoint(int originX, int originY, int endX, int endY, int threshold, int olFlag) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_POWER_ANGLE_FROM_POINT], 6, originX, originY, endX, endY, threshold, olFlag);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_POWER_ANGLE_FROM_POINT], 6, originX, originY, endX, endY, threshold, olFlag);
return retVal;
}
int AI::getPowerAngleFromPoint(int originX, int originY, int endX, int endY, int threshold) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_POWER_ANGLE_FROM_POINT], 5, originX, originY, endX, endY, threshold);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_POWER_ANGLE_FROM_POINT], 5, originX, originY, endX, endY, threshold);
return retVal;
}
int AI::checkIfWaterState(int x, int y) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_CHECK_IF_WATER_STATE], 2, x, y);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_CHECK_IF_WATER_STATE], 2, x, y);
return retVal;
}
int AI::checkIfWaterSquare(int x, int y) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_CHECK_IF_WATER_SQUARE], 2, x, y);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_CHECK_IF_WATER_SQUARE], 2, x, y);
return retVal;
}
@@ -2713,17 +2713,17 @@ int AI::getUnitsWithinRadius(int x, int y, int radius) {
debug(0, "getUnitsWithinRadius(%d, %d, %d)", x, y, radius);
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_UNITS_WITHIN_RADIUS], 3, x, y, radius);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_UNITS_WITHIN_RADIUS], 3, x, y, radius);
return retVal;
}
int AI::getLandingPoint(int x, int y, int power, int angle) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_LANDING_POINT], 4, x, y, power, angle);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_LANDING_POINT], 4, x, y, power, angle);
return retVal;
}
int AI::getEnemyUnitsVisible(int playerNum) {
- int retVal = _vm->_moonbase->callScummFunction(MCP_params[F_GET_ENEMY_UNITS_VISIBLE], 1, playerNum);
+ int retVal = _vm->_moonbase->callScummFunction(_mcpParams[F_GET_ENEMY_UNITS_VISIBLE], 1, playerNum);
return retVal;
}
@@ -3062,7 +3062,7 @@ int AI::fakeSimulateWeaponLaunch(int x, int y, int power, int angle) {
}
int AI::getEnergyHogType() {
- return energyHogType;
+ return _energyHogType;
}
} // End of namespace Scumm
diff --git a/engines/scumm/he/moonbase/ai_main.h b/engines/scumm/he/moonbase/ai_main.h
index b750ed0..7a38de9 100644
--- a/engines/scumm/he/moonbase/ai_main.h
+++ b/engines/scumm/he/moonbase/ai_main.h
@@ -29,6 +29,8 @@
namespace Scumm {
class ScummEngine_v100he;
+class AIEntity;
+class patternList;
enum {
TERRAIN_TYPE_GOOD = 0,
@@ -83,7 +85,7 @@ enum {
class AI {
public:
- AI(ScummEngine_v100he *vm) : _vm(vm) {}
+ AI(ScummEngine_v100he *vm);
void resetAI();
void cleanUpAI();
@@ -188,10 +190,20 @@ private:
int getMaxCollectors(int pool);
public:
- Common::Array<int> lastXCoord[5];
- Common::Array<int> lastYCoord[5];
+ Common::Array<int> _lastXCoord[5];
+ Common::Array<int> _lastYCoord[5];
ScummEngine_v100he *_vm;
+
+ AIEntity *_aiType[5];
+
+ int _aiState;
+ int _behavior;
+ int _energyHogType;
+
+ patternList *_moveList[5];
+
+ const int32 *_mcpParams;
};
} // End of namespace Scumm
diff --git a/engines/scumm/he/moonbase/ai_traveller.cpp b/engines/scumm/he/moonbase/ai_traveller.cpp
index 51060ad..8294ea3 100644
--- a/engines/scumm/he/moonbase/ai_traveller.cpp
+++ b/engines/scumm/he/moonbase/ai_traveller.cpp
@@ -210,7 +210,7 @@ IContainedObject *Traveller::createChildObj(int index, int &completionFlag) {
retTraveller->setPosX(xCoord);
// Iterate through the previous action list, making sure this one isn't on it
- for (Common::Array<int>::iterator i = (_ai->lastXCoord[whoseTurn]).begin(), j = (_ai->lastYCoord[whoseTurn]).begin(); i != (_ai->lastXCoord[whoseTurn]).end(); i++, j++) {
+ for (Common::Array<int>::iterator i = (_ai->_lastXCoord[whoseTurn]).begin(), j = (_ai->_lastYCoord[whoseTurn]).begin(); i != (_ai->_lastXCoord[whoseTurn]).end(); i++, j++) {
// Check if this shot is the same as the last time we tried
if ((*i == retTraveller->getPosX()) && (*j == retTraveller->getPosY())) {
retTraveller->setDisabled();
More information about the Scummvm-git-logs
mailing list