BWAPI
trunk/bwapi/BWAPI/Source/BWAPI/GameImpl.h
Go to the documentation of this file.
00001 #pragma once
00002 
00003 namespace BW    { class  Unit; }
00004 namespace BW    { struct Bullet; }
00005 namespace BWAPI { class  Player; }
00006 namespace BWAPI { class  PlayerImpl; }
00007 namespace BWAPI { class  Unit; }
00008 namespace BWAPI { class  UnitImpl; }
00009 namespace BWAPI { class  Bullet; }
00010 namespace BWAPI { class  BulletImpl; }
00011 namespace BWAPI { class  Command; }
00012 namespace BWAPI { class  AIModule; }
00013 
00014 #include <BWAPI/AIModule.h>
00015 #include <BWAPI/Game.h>
00016 #include <BWAPI/Server.h>
00017 #include <BWAPI/Map.h>
00018 #include <BWAPI/Client/Shape.h>
00019 #include <BWAPI/Client/GameData.h>
00020 
00021 #include <BW/Dialog.h>
00022 #include <BW/OrderTypes.h>
00023 
00028 namespace BWAPI
00029 {
00031   class GameImpl : public Game
00032   {
00033     public :
00034       virtual std::set< Force* >&  getForces();
00035       virtual std::set< Player* >& getPlayers();
00036       virtual std::set< Unit* >&   getAllUnits();
00037       virtual std::set< Unit* >&   getMinerals();
00038       virtual std::set< Unit* >&   getGeysers();
00039       virtual std::set< Unit* >&   getNeutralUnits();
00040  
00041       virtual std::set< Unit* >&   getStaticMinerals();
00042       virtual std::set< Unit* >&   getStaticGeysers();
00043       virtual std::set< Unit* >&   getStaticNeutralUnits();
00044 
00045       virtual std::set< Bullet* >& getBullets();
00046       virtual std::set< Position >& getNukeDots();
00047       virtual std::list< Event >&  getEvents();
00048 
00049       virtual Force   *getForce(int forceID);
00050       virtual Player  *getPlayer(int playerID);
00051       virtual Unit    *getUnit(int unitID);
00052       virtual Unit    *indexToUnit(int unitIndex);
00053       virtual Region  *getRegion(int regionID);
00054 
00055       virtual GameType getGameType();
00056 
00057       virtual int      getLatency();
00058       virtual int      getFrameCount();
00059       virtual int      getReplayFrameCount();
00060       virtual int      getFPS();
00061       virtual double   getAverageFPS();
00062 
00063       virtual Position getMousePosition();
00064       virtual bool     getMouseState(MouseButton button);
00065       virtual bool     getMouseState(int button);
00066       virtual bool     getKeyState(Key key);
00067       bool             getKeyState(int key);
00068 
00069       virtual Position getScreenPosition();
00070       virtual void     setScreenPosition(int x, int y);
00071       virtual void     setScreenPosition(BWAPI::Position p);
00072 
00073       virtual void     pingMinimap(int x, int y);
00074       virtual void     pingMinimap(BWAPI::Position p);
00075 
00076       virtual bool     isFlagEnabled(int flag);
00077       virtual void     enableFlag(int flag);
00078 
00079       virtual std::set<Unit*>& getUnitsOnTile(int x, int y);
00080       virtual std::set<Unit*>& getUnitsInRectangle(int left, int top, int right, int bottom) const;
00081       virtual std::set<Unit*>& getUnitsInRectangle(BWAPI::Position topLeft, BWAPI::Position bottomRight) const;
00082       virtual std::set<Unit*>& getUnitsInRadius(BWAPI::Position center, int radius) const;
00083 
00084       virtual Error       getLastError() const;
00085       virtual bool        setLastError(BWAPI::Error e);
00086 
00087       virtual int         mapWidth();
00088       virtual int         mapHeight();
00089       virtual std::string mapFileName();
00090       virtual std::string mapPathName();
00091       virtual std::string mapName();
00092       virtual std::string mapHash();
00093 
00094       virtual bool isWalkable(int x, int y);
00095       virtual int  getGroundHeight(int x, int y);
00096       virtual int  getGroundHeight(TilePosition position);
00097       virtual bool isBuildable(int x, int y, bool includeBuildings = false);
00098       virtual bool isBuildable(TilePosition position, bool includeBuildings = false);
00099       virtual bool isVisible(int x, int y);
00100       virtual bool isVisible(TilePosition position);
00101       virtual bool isExplored(int x, int y);
00102       virtual bool isExplored(TilePosition position);
00103       virtual bool hasCreep(int x, int y);
00104       virtual bool hasCreep(TilePosition position);
00105       virtual bool hasPower(int tileX, int tileY, UnitType unitType = UnitTypes::None) const;
00106       virtual bool hasPower(TilePosition position, UnitType unitType = UnitTypes::None) const;
00107       virtual bool hasPower(int tileX, int tileY, int tileWidth, int tileHeight, UnitType unitType = UnitTypes::None) const;
00108       virtual bool hasPower(TilePosition position, int tileWidth, int tileHeight, UnitType unitType = UnitTypes::None) const;
00109       virtual bool hasPowerPrecise(int x, int y, UnitType unitType = UnitTypes::None ) const;
00110       virtual bool hasPowerPrecise(Position position, UnitType unitType = UnitTypes::None) const;
00111 
00112       virtual bool canBuildHere(const Unit* builder, TilePosition position, UnitType type, bool checkExplored = false);
00113       virtual bool canMake(const Unit* builder, UnitType type);
00114       virtual bool canResearch(const Unit* unit, TechType type);
00115       virtual bool canUpgrade(const Unit* unit, UpgradeType type);
00116 
00117       virtual std::set< TilePosition >& getStartLocations();
00118 
00123       virtual void printf(const char *format, ...);
00124       virtual void sendText(const char *format, ...);
00125       virtual void sendTextEx(bool toAllies, const char *format, ...);
00126 
00131       virtual void changeRace(BWAPI::Race race);
00132       virtual bool isInGame();
00133       virtual bool isMultiplayer();
00134       virtual bool isBattleNet();
00135       virtual bool isPaused();
00136       virtual bool isReplay();
00137 
00142       virtual void startGame();
00143       virtual void pauseGame();
00144       virtual void resumeGame();
00145       virtual void leaveGame();
00146       virtual void restartGame();
00147       virtual void setLocalSpeed(int speed = -1);
00148       virtual bool issueCommand(const std::set<BWAPI::Unit*>& units, UnitCommand command);
00149       virtual std::set<BWAPI::Unit*>& getSelectedUnits();
00150       virtual Player *self();
00151       virtual Player *enemy();
00152       virtual Player *neutral();
00153       virtual std::set<BWAPI::Player*>& allies();
00154       virtual std::set<BWAPI::Player*>& enemies();
00155       virtual std::set<BWAPI::Player*>& observers();
00156 
00157       virtual void setTextSize(int size = 1);
00158       virtual void drawText(int ctype, int x, int y, const char *format, ...);
00159       virtual void drawTextMap(int x, int y, const char *format, ...);
00160       virtual void drawTextMouse(int x, int y, const char *format, ...);
00161       virtual void drawTextScreen(int x, int y, const char *format, ...);
00162 
00163       virtual void drawBox(int ctype, int left, int top, int right, int bottom, Color color, bool isSolid = false);
00164       virtual void drawBoxMap(int left, int top, int right, int bottom, Color color, bool isSolid = false);
00165       virtual void drawBoxMouse(int left, int top, int right, int bottom, Color color, bool isSolid = false);
00166       virtual void drawBoxScreen(int left, int top, int right, int bottom, Color color, bool isSolid = false);
00167 
00168       virtual void drawTriangle(int ctype, int ax, int ay, int bx, int by, int cx, int cy, Color color, bool isSolid = false);
00169       virtual void drawTriangleMap(int ax, int ay, int bx, int by, int cx, int cy, Color color, bool isSolid = false);
00170       virtual void drawTriangleMouse(int ax, int ay, int bx, int by, int cx, int cy, Color color, bool isSolid = false);
00171       virtual void drawTriangleScreen(int ax, int ay, int bx, int by, int cx, int cy, Color color, bool isSolid = false);
00172 
00173       virtual void drawCircle(int ctype, int x, int y, int radius, Color color, bool isSolid = false);
00174       virtual void drawCircleMap(int x, int y, int radius, Color color, bool isSolid = false);
00175       virtual void drawCircleMouse(int x, int y, int radius, Color color, bool isSolid = false);
00176       virtual void drawCircleScreen(int x, int y, int radius, Color color, bool isSolid = false);
00177 
00178       virtual void drawEllipse(int ctype, int x, int y, int xrad, int yrad, Color color, bool isSolid = false);
00179       virtual void drawEllipseMap(int x, int y, int xrad, int yrad, Color color, bool isSolid = false);
00180       virtual void drawEllipseMouse(int x, int y, int xrad, int yrad, Color color, bool isSolid = false);
00181       virtual void drawEllipseScreen(int x, int y, int xrad, int yrad, Color color, bool isSolid = false);
00182 
00183       virtual void drawDot(int ctype, int x, int y, Color color);
00184       virtual void drawDotMap(int x, int y, Color color);
00185       virtual void drawDotMouse(int x, int y, Color color);
00186       virtual void drawDotScreen(int x, int y, Color color);
00187 
00188       virtual void drawLine(int ctype, int x1, int y1, int x2, int y2, Color color);
00189       virtual void drawLineMap(int x1, int y1, int x2, int y2, Color color);
00190       virtual void drawLineMouse(int x1, int y1, int x2, int y2, Color color);
00191       virtual void drawLineScreen(int x1, int y1, int x2, int y2, Color color);
00192 
00193       virtual void *getScreenBuffer();
00194 
00195       virtual int getLatencyFrames();
00196       virtual int getLatencyTime();
00197       virtual int getRemainingLatencyFrames();
00198       virtual int getRemainingLatencyTime();
00199 
00200       virtual int  getRevision();
00201       virtual bool isDebug();
00202       virtual bool isLatComEnabled();
00203       virtual void setLatCom(bool isEnabled);
00204       virtual bool isGUIEnabled();
00205       virtual void setGUI(bool enabled = true);
00206 
00207       virtual int getInstanceNumber();
00208       virtual int getAPM(bool includeSelects = false);
00209 
00210       virtual bool setMap(const char *mapFileName);
00211       virtual void setFrameSkip(int frameSkip = 1);
00212 
00213       virtual bool hasPath(Position source, Position destination) const;
00214 
00215       virtual bool setAlliance(BWAPI::Player *player, bool allied = true, bool alliedVictory = true);
00216       virtual bool setVision(BWAPI::Player *player, bool enabled = true);
00217       virtual int  elapsedTime() const;
00218 
00219       virtual void setCommandOptimizationLevel(int level = 2);
00220       virtual int  countdownTimer() const;
00221 
00222       virtual const std::set<BWAPI::Region*> &getAllRegions() const;
00223       virtual BWAPI::Region *getRegionAt(int x, int y) const;
00224       virtual BWAPI::Region *getRegionAt(BWAPI::Position position) const;
00225 
00226       virtual int getLastEventTime() const;
00227 
00228       virtual bool setReplayVision(BWAPI::Player *player, bool enabled = true);
00229       virtual bool setRevealAll(bool reveal = true);
00230 
00231       //Internal BWAPI commands:
00232       GameImpl();
00233       ~GameImpl();
00234 
00235       void update(); 
00236       void loadAutoMenuData();
00237       void onMenuFrame();
00238       PlayerImpl *_getPlayer(int id);
00239       int _currentPlayerId();
00240       void pressKey(int key);
00241       void mouseDown(int x, int y);
00242       void mouseUp(int x, int y);
00243 
00249       void changeSlot(BW::Orders::ChangeSlot::Slot slot, u8 slotID);
00250       void addToCommandBuffer(Command* command);
00251       void onGameStart();
00252       void onGameEnd();
00253       int  stormIdToPlayerId(int dwStormId);
00254       void onSendText(const char* text);
00255       void onReceiveText(int playerId, std::string text);
00256       bool parseText(const char* text);
00257       bool inScreen(int ctype, int x, int y);
00258       bool inScreen(int ctype, int x1, int y1, int x2, int y2);
00259       bool inScreen(int ctype, int x1, int y1, int x2, int y2, int x3, int y3);
00260       void lockFlags();
00261       bool enabled;
00262       bool _isInGame() const;
00263       bool _isSinglePlayer() const;
00264       bool _isBattleNet();
00265       bool _isReplay() const;
00266       void _changeRace(int slot, BWAPI::Race race);
00267       int _getLobbyRace(int slot);
00268       Race lastKnownRaceBeforeStart[8];
00269 
00270       void loadSelected();
00271       void copyMapToSharedMemory();
00272       void moveToSelectedUnits();
00273       void executeCommand(UnitCommand command, bool addCommandToLatComBuffer = true);
00274       bool addToCommandOptimizer(UnitCommand command);
00275 
00276       void chooseNewRandomMap();
00277       static void SendClientEvent(BWAPI::AIModule *module, Event &e);
00278 
00279       UnitImpl   *getUnitFromIndex(int index);
00280       BulletImpl *getBulletFromIndex(int index);
00281       PlayerImpl *BWAPIPlayer;
00282       PlayerImpl *enemyPlayer;
00283 
00284       std::set<int> invalidIndices;
00285       std::list<std::string > sentMessages;
00286       void onSaveGame(char *name);
00287       std::list<Event> events;
00288       int bulletCount;
00289       BW::dialog *myDlg;
00290       Server server;
00291       std::vector<BWAPI::UnitImpl*> lastEvadedUnits;
00292       bool onStartCalled;
00293       std::string lastMapGen;
00294       bool outOfGame;
00295       std::string autoMenuMode;
00296       std::string autoMenuMapPath;
00297       std::string autoMenuGameName;
00298       bool isHost;
00299       int  autoMapTryCount;
00300       std::vector<std::string> autoMapPool;
00301       std::string autoMapIteration;
00302       std::string lastAutoMapString;
00303       unsigned int lastAutoMapEntry;
00304 
00306       int frameCount;
00307       void refreshSelectionStates();
00308       BW::Unit *savedUnitSelection[12];
00309       bool wantSelectionUpdate;
00310 
00311       bool startedClient;
00312 
00313       UnitImpl *unitArray[UNIT_ARRAY_MAX_LENGTH];
00314       bool isTournamentCall;
00315       const GameData* getGameData() const;
00316       GameData* data;
00317       
00318       int drawShapes();
00319       void processEvents();
00320       Unit *_unitFromIndex(int index);
00321 
00322       int  commandOptimizerLevel;
00323 
00324       HMODULE hAIModule;
00325       AIModule *client;
00326 
00327       HMODULE hTournamentModule;
00328       AIModule *tournamentAI;
00329 
00330       PlayerImpl *players[PLAYER_COUNT];
00331 
00332       void dropPlayers();
00333       std::vector<PlayerImpl*> droppedPlayers;
00334     private :
00335       Map map;
00336 
00337       std::set<BWAPI::UnitImpl*> aliveUnits; //units alive on current frame
00338       std::set<BWAPI::UnitImpl*> dyingUnits; //units leaving aliveUnits set on current frame
00339 
00340       std::vector<BWAPI::UnitImpl*> discoverUnits; //units entering accessibleUnits set on current frame
00341       std::set<BWAPI::Unit*> accessibleUnits; //units that are accessible to the client on current frame
00342       std::vector<BWAPI::UnitImpl*> evadeUnits; //units leaving accessibleUnits set on current frame
00343 
00344       std::set<BWAPI::Unit*>  selectedUnitSet;
00345       std::set<BWAPI::Unit*>  emptySet;
00346       std::set<TilePosition>  startLocations;
00347 
00348       std::set<BWAPI::Force*>  forces;
00349       std::set<BWAPI::Player*> playerSet;
00350 
00351       std::set<BWAPI::Unit*>   minerals;
00352       std::set<BWAPI::Unit*>   geysers;
00353       std::set<BWAPI::Unit*>   neutralUnits;
00354       std::set<BWAPI::Bullet*> bullets;
00355       std::set<Position>       nukeDots;
00356       std::set<BWAPI::UnitImpl*> pylons;
00357       Util::RectangleArray<std::set<Unit*> > unitsOnTileData;
00358 
00359       std::set<BWAPI::Unit*> staticMinerals;
00360       std::set<BWAPI::Unit*> staticGeysers;
00361       std::set<BWAPI::Unit*> staticNeutralUnits;
00362 
00363       std::set<BWAPI::Region*> regionsList;
00364 
00365       BulletImpl* bulletArray[BULLET_ARRAY_MAX_LENGTH];
00366       std::vector<std::vector<Command *> > commandBuffer;
00368       void updateUnits();
00369       void updateBullets();
00370       void computeUnitExistence();
00371       void computePrimaryUnitSets();
00372       void extractUnitData();
00373       void augmentUnitData();
00374       void applyLatencyCompensation();
00375       void computeSecondaryUnitSets();
00380       std::string savedMapHash;
00381       bool flags[BWAPI::Flag::Max];
00382       TournamentModule  *tournamentController;
00383       bool              bTournamentMessageAppeared;
00384       BWAPI::Error lastError;
00385       std::list<UnitImpl*> deadUnits;
00386       u32 cheatFlags;
00387       std::string autoMenuLanMode;
00388       std::string autoMenuRace;
00389       std::string autoMenuEnemyRace[8];
00390       unsigned int autoMenuEnemyCount;
00391       unsigned int autoMenuMinPlayerCount;
00392       unsigned int autoMenuMaxPlayerCount;
00393       unsigned int autoMenuWaitPlayerTime;
00394       std::string autoMenuGameType;
00395       std::string autoMenuRestartGame;
00396       std::string autoMenuSaveReplay;
00397 #ifdef _DEBUG
00398       std::string autoMenuPause;
00399 #endif
00400       std::string rn_BWAPIName;
00401       std::string rn_BWAPIRace;
00402       std::string rn_MapName;
00403       std::string rn_AlliesNames;
00404       std::string rn_AlliesRaces;
00405       std::string rn_EnemiesNames;
00406       std::string rn_EnemiesRaces;
00407       DWORD endTick;
00408       std::set<Player*> _allies;
00409       std::set<Player*> _enemies;
00410       std::set<Player*> _observers;
00411 
00412       bool inGame;
00413       bool actStartedGame;
00414       bool actRaceSel;
00415 
00416       DWORD  startTickCount;
00417       DWORD  lastTickCount;
00418       int    accumulatedFrames;
00419       int    fps;
00420       double averageFPS;
00421       int botAPM_noselects;
00422       int botAPM_selects;
00423       double botAPMCounter_noselects;
00424       double botAPMCounter_selects;
00425 
00426       int  textSize;
00427 
00428       bool pathDebug;
00429       bool unitDebug;
00430       bool grid;
00431 
00432       bool externalModuleConnected;
00433       bool calledMatchEnd;
00434       bool tournamentCheck(int type, void *parameter = NULL);
00435       std::vector<UnitCommand> commandOptimizer[BWAPI_UNIT_COMMAND_TYPE_COUNT];
00436 
00437       int lastEventTime;
00438       int addShape(const BWAPIC::Shape &s);
00439       int addString(const char* text);
00440       int addText(BWAPIC::Shape &s, const char* text);
00441 
00442   };
00450   extern GameImpl BroodwarImpl;
00451 };
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines