// ============================================================== // This file is part of Glest (www.glest.org) // // Copyright (C) 2001-2005 Martio Figueroa // // You can redistribute this code and/or modify it under // the terms of the GNU General Public License as published // by the Free Software Foundation; either version 2 of the // License, or (at your option) any later version // ============================================================== #ifndef _GLEST_GAME_SCRIPT_MANAGER_H_ #define _GLEST_GAME_SCRIPT_MANAGER_H_ #ifdef WIN32 #include #include #endif #include #include #include "lua_script.h" #include "components.h" #include "game_constants.h" #include #include "xml_parser.h" #include "randomgen.h" #include "leak_dumper.h" #include "platform_util.h" using std::string; using std::list; using Shared::Graphics::Vec2i; using Shared::Lua::LuaScript; using Shared::Lua::LuaHandle; using Shared::Xml::XmlNode; using Shared::Util::RandomGen; namespace Glest{ namespace Game{ class World; class Unit; class GameCamera; // ===================================================== // class ScriptManagerMessage // ===================================================== class ScriptManagerMessage { private: string text; string header; int factionIndex; int teamIndex; bool messageNotTranslated; public: ScriptManagerMessage(); ScriptManagerMessage(const string &text, const string &header, int factionIndex=-1,int teamIndex=-1,bool messageNotTranslated=false); const string &getText() const {return text;} const string &getHeader() const {return header;} int getFactionIndex() const {return factionIndex;} int getTeamIndex() const {return teamIndex;} bool getMessageNotTranslated() const { return messageNotTranslated; } void saveGame(XmlNode *rootNode); void loadGame(const XmlNode *rootNode); }; class PlayerModifiers{ public: PlayerModifiers(); void disableAi() {aiEnabled= false;} void enableAi() {aiEnabled= true;} void setAsWinner() {winner= true;} void disableConsume() {consumeEnabled= false;} void enableConsume() {consumeEnabled= true;} bool getWinner() const {return winner;} bool getAiEnabled() const {return aiEnabled;} bool getConsumeEnabled() const {return consumeEnabled;} void saveGame(XmlNode *rootNode); void loadGame(const XmlNode *rootNode); private: bool winner; bool aiEnabled; bool consumeEnabled; }; // ===================================================== // class ScriptManager // ===================================================== enum UnitTriggerEventType { utet_None = 0, utet_HPChanged = 1, utet_EPChanged, utet_LevelChanged, utet_FieldChanged, utet_SkillChanged }; enum CellTriggerEventType { ctet_Unit, ctet_UnitPos, ctet_Faction, ctet_FactionPos, ctet_UnitAreaPos, ctet_FactionAreaPos, ctet_AreaPos }; class CellTriggerEvent { public: CellTriggerEvent(); CellTriggerEventType type; int sourceId; int destId; Vec2i destPos; Vec2i destPosEnd; int triggerCount; std::map eventStateInfo; std::map > eventLookupCache; void saveGame(XmlNode *rootNode); void loadGame(const XmlNode *rootNode); }; class TimerTriggerEvent { public: TimerTriggerEvent(); bool running; //time_t startTime; //time_t endTime; int startFrame; int endFrame; int triggerSecondsElapsed; void saveGame(XmlNode *rootNode); void loadGame(const XmlNode *rootNode); }; class ScriptManager { private: typedef list MessageQueue; private: //lua string code; LuaScript luaScript; //world World *world; GameCamera *gameCamera; //misc MessageQueue messageQueue; GraphicMessageBox messageBox; string displayText; int errorCount; //last created unit string lastCreatedUnitName; int lastCreatedUnitId; //last dead unit string lastDeadUnitName; int lastDeadUnitId; int lastDeadUnitCauseOfDeath; //last dead unit's killer string lastDeadUnitKillerName; int lastDeadUnitKillerId; //last attacked unit string lastAttackedUnitName; int lastAttackedUnitId; //last attacking unit string lastAttackingUnitName; int lastAttackingUnitId; // end game state bool gameOver; bool gameWon; PlayerModifiers playerModifiers[GameConstants::maxPlayers]; int currentTimerTriggeredEventId; int currentCellTriggeredEventId; int currentCellTriggeredEventUnitId; int currentCellTriggeredEventAreaEntryUnitId; int currentCellTriggeredEventAreaExitUnitId; int currentEventId; std::map CellTriggerEventList; std::map TimerTriggerEventList; bool inCellTriggerEvent; std::vector unRegisterCellTriggerEventList; bool registeredDayNightEvent; int lastDayNightTriggerStatus; std::map UnitTriggerEventList; int lastUnitTriggerEventUnitId; UnitTriggerEventType lastUnitTriggerEventType; RandomGen random; const XmlNode *rootNode; std::map luaSavedGameData; private: static ScriptManager* thisScriptManager; private: static const int messageWrapCount; static const int displayTextWrapCount; public: ScriptManager(); ~ScriptManager(); void init(World* world, GameCamera *gameCamera,const XmlNode *rootNode); //message box functions void addMessageToQueue(ScriptManagerMessage msg); bool getMessageBoxEnabled() const {return !messageQueue.empty();} GraphicMessageBox* getMessageBox() {return &messageBox;} string getDisplayText() const {return displayText;} const PlayerModifiers *getPlayerModifiers(int factionIndex) const {return &playerModifiers[factionIndex];} //events void onMessageBoxOk(bool popFront=true); void onResourceHarvested(); void onUnitCreated(const Unit* unit); void onUnitDied(const Unit* unit); void onUnitAttacked(const Unit* unit); void onUnitAttacking(const Unit* unit); void onGameOver(bool won); void onCellTriggerEvent(Unit *movingUnit); void onTimerTriggerEvent(); void onDayNightTriggerEvent(); void onUnitTriggerEvent(const Unit *unit, UnitTriggerEventType event); bool getGameWon() const; bool getIsGameOver() const; void saveGame(XmlNode *rootNode); void loadGame(const XmlNode *rootNode); private: string wrapString(const string &str, int wrapCount); //wrappers, commands void networkShowMessageForFaction(const string &text, const string &header,int factionIndex); void networkShowMessageForTeam(const string &text, const string &header,int teamIndex); void networkSetCameraPositionForFaction(int factionIndex, const Vec2i &pos); void networkSetCameraPositionForTeam(int teamIndex, const Vec2i &pos); void showMessage(const string &text, const string &header); void clearDisplayText(); void setDisplayText(const string &text); void addConsoleText(const string &text); void addConsoleLangText(const char *fmt,...); void DisplayFormattedText(const char *fmt,...); void DisplayFormattedLangText(const char *fmt,...); void setCameraPosition(const Vec2i &pos); void shakeCamera(int shakeIntensity, int shakeDuration, bool cameraDistanceAffected, int unitId); void createUnit(const string &unitName, int factionIndex, Vec2i pos); void createUnitNoSpacing(const string &unitName, int factionIndex, Vec2i pos); void setLockedUnitForFaction(const string &unitName, int factionIndex , bool lock); void destroyUnit(int unitId); void giveKills(int unitId, int amount); void morphToUnit(int unitId,const string &morphName, int ignoreRequirements); void moveToUnit(int unitId,int destUnitId); void giveAttackStoppedCommand(int unitId, const string &valueName,int ignoreRequirements); void playStaticSound(const string &playSound); void playStreamingSound(const string &playSound); void stopStreamingSound(const string &playSound); void stopAllSound(); void togglePauseGame(int pauseStatus); void playStaticVideo(const string &playVideo); void playStreamingVideo(const string &playVideo); void stopStreamingVideo(const string &playVideo); void stopAllVideo(); void giveResource(const string &resourceName, int factionIndex, int amount); void givePositionCommand(int unitId, const string &producedName, const Vec2i &pos); void giveProductionCommand(int unitId, const string &producedName); void giveAttackCommand(int unitId, int unitToAttackId); void giveUpgradeCommand(int unitId, const string &upgradeName); void giveStopCommand(int unitId); void disableAi(int factionIndex); void enableAi(int factionIndex); void disableConsume(int factionIndex); void enableConsume(int factionIndex); int registerCellTriggerEventForUnitToUnit(int sourceUnitId, int destUnitId); int registerCellTriggerEventForUnitToLocation(int sourceUnitId, const Vec2i &pos); int registerCellTriggerEventForFactionToUnit(int sourceFactionId, int destUnitId); int registerCellTriggerEventForFactionToLocation(int sourceFactionId, const Vec2i &pos); int registerCellAreaTriggerEventForUnitToLocation(int sourceUnitId, const Vec4i &pos); int registerCellAreaTriggerEventForFactionToLocation(int sourceFactionId, const Vec4i &pos); int registerCellAreaTriggerEvent(const Vec4i &pos); int getCellTriggerEventCount(int eventId); void unregisterCellTriggerEvent(int eventId); int startTimerEvent(); int startEfficientTimerEvent(int triggerSecondsElapsed); int resetTimerEvent(int eventId); int stopTimerEvent(int eventId); int getTimerEventSecondsElapsed(int eventId); int getCellTriggeredEventId(); int getTimerTriggeredEventId(); int getCellTriggeredEventAreaEntryUnitId(); int getCellTriggeredEventAreaExitUnitId(); int getCellTriggeredEventUnitId(); void setRandomGenInit(int seed); int getRandomGen(int minVal, int maxVal); int getWorldFrameCount(); bool getAiEnabled(int factionIndex); bool getConsumeEnabled(int factionIndex); void setPlayerAsWinner(int factionIndex); void endGame(); void startPerformanceTimer(); void endPerformanceTimer(); Vec2i getPerformanceTimerResults(); //wrappers, queries int getIsUnitAlive(int unitId); Vec2i getStartLocation(int factionIndex); Vec2i getUnitPosition(int unitId); int getUnitFaction(int unitId); const string getUnitName(int unitId); const string getUnitDisplayName(int unitId); int getResourceAmount(const string &resourceName, int factionIndex); const string &getLastCreatedUnitName(); int getLastCreatedUnitId(); void setUnitPosition(int unitId, Vec2i pos); void addCellMarker(Vec2i pos, int factionIndex, const string ¬e, const string &textureFile); void removeCellMarker(Vec2i pos, int factionIndex); void showMarker(Vec2i pos, int factionIndex, const string ¬e, const string &textureFile, int flashCount); const string &getLastDeadUnitName(); int getLastDeadUnitId(); int getLastDeadUnitCauseOfDeath(); const string &getLastDeadUnitKillerName(); int getLastDeadUnitKillerId(); const string &getLastAttackedUnitName(); int getLastAttackedUnitId(); const string &getLastAttackingUnitName(); int getLastAttackingUnitId(); int getUnitCount(int factionIndex); int getUnitCountOfType(int factionIndex, const string &typeName); const string getSystemMacroValue(const string &key); const string getPlayerName(int factionIndex); vector getUnitsForFaction(int factionIndex,const string& commandTypeName, int field); int getUnitCurrentField(int unitId); void loadScenario(const string &name, bool keepFactions); int isFreeCellsOrHasUnit(int field, int unitId,Vec2i pos); int isFreeCells(int unitSize, int field,Vec2i pos); int getHumanFactionId(); void highlightUnit(int unitId, float radius, float thickness, Vec4f color); void unhighlightUnit(int unitId); bool selectUnit(int unitId); void unselectUnit(int unitId); void addUnitToGroupSelection(int unitId,int groupIndex); void recallGroupSelection(int groupIndex); void removeUnitFromGroupSelection(int unitId,int group); void setAttackWarningsEnabled(bool enabled); bool getAttackWarningsEnabled(); int getIsDayTime(); int getIsNightTime(); float getTimeOfDay(); void registerDayNightEvent(); void unregisterDayNightEvent(); void registerUnitTriggerEvent(int unitId); void unregisterUnitTriggerEvent(int unitId); int getLastUnitTriggerEventUnitId(); UnitTriggerEventType getLastUnitTriggerEventType(); int getUnitProperty(int unitId, UnitTriggerEventType type); const string getUnitPropertyName(int unitId, UnitTriggerEventType type); void disableSpeedChange(); void enableSpeedChange(); bool getSpeedChangeEnabled(); void storeSaveGameData(string name, string value); string loadSaveGameData(string name); ControlType getFactionPlayerType(int factionIndex); // ----------------------------------------------------------------------- static void error(LuaHandle* luaHandle, const megaglest_runtime_error *mgErr, const char* file, const char* function, int line); //callbacks, commands static int networkShowMessageForFaction(LuaHandle* luaHandle); static int networkShowMessageForTeam(LuaHandle* luaHandle); static int networkSetCameraPositionForFaction(LuaHandle* luaHandle); static int networkSetCameraPositionForTeam(LuaHandle* luaHandle); static int showMessage(LuaHandle* luaHandle); static int setDisplayText(LuaHandle* luaHandle); static int addConsoleText(LuaHandle* luaHandle); static int addConsoleLangText(LuaHandle* luaHandle); static int DisplayFormattedText(LuaHandle* luaHandle); static int DisplayFormattedLangText(LuaHandle* luaHandle); static int clearDisplayText(LuaHandle* luaHandle); static int setCameraPosition(LuaHandle* luaHandle); static int shakeCamera(LuaHandle* luaHandle); static int shakeCameraOnUnit(LuaHandle* luaHandle); static int createUnit(LuaHandle* luaHandle); static int createUnitNoSpacing(LuaHandle* luaHandle); static int setLockedUnitForFaction(LuaHandle* luaHandle); static int destroyUnit(LuaHandle* luaHandle); static int giveKills(LuaHandle* luaHandle); static int morphToUnit(LuaHandle* luaHandle); static int moveToUnit(LuaHandle* luaHandle); static int giveAttackStoppedCommand(LuaHandle* luaHandle); static int playStaticSound(LuaHandle* luaHandle); static int playStreamingSound(LuaHandle* luaHandle); static int stopStreamingSound(LuaHandle* luaHandle); static int stopAllSound(LuaHandle* luaHandle); static int togglePauseGame(LuaHandle* luaHandle); static int playStaticVideo(LuaHandle* luaHandle); static int playStreamingVideo(LuaHandle* luaHandle); static int stopStreamingVideo(LuaHandle* luaHandle); static int stopAllVideo(LuaHandle* luaHandle); static int giveResource(LuaHandle* luaHandle); static int givePositionCommand(LuaHandle* luaHandle); static int giveProductionCommand(LuaHandle* luaHandle); static int giveAttackCommand(LuaHandle* luaHandle); static int giveUpgradeCommand(LuaHandle* luaHandle); static int disableAi(LuaHandle* luaHandle); static int enableAi(LuaHandle* luaHandle); static int disableConsume(LuaHandle* luaHandle); static int enableConsume(LuaHandle* luaHandle); static int getAiEnabled(LuaHandle* luaHandle); static int getConsumeEnabled(LuaHandle* luaHandle); static int registerCellTriggerEventForUnitToUnit(LuaHandle* luaHandle); static int registerCellTriggerEventForUnitToLocation(LuaHandle* luaHandle); static int registerCellTriggerEventForFactionToUnit(LuaHandle* luaHandle); static int registerCellTriggerEventForFactionToLocation(LuaHandle* luaHandle); static int registerCellAreaTriggerEventForUnitToLocation(LuaHandle* luaHandle); static int registerCellAreaTriggerEventForFactionToLocation(LuaHandle* luaHandle); static int registerCellAreaTriggerEvent(LuaHandle* luaHandle); static int getCellTriggerEventCount(LuaHandle* luaHandle); static int unregisterCellTriggerEvent(LuaHandle* luaHandle); static int startTimerEvent(LuaHandle* luaHandle); static int startEfficientTimerEvent(LuaHandle* luaHandle); static int resetTimerEvent(LuaHandle* luaHandle); static int stopTimerEvent(LuaHandle* luaHandle); static int getTimerEventSecondsElapsed(LuaHandle* luaHandle); static int getCellTriggeredEventId(LuaHandle* luaHandle); static int getTimerTriggeredEventId(LuaHandle* luaHandle); static int getCellTriggeredEventAreaEntryUnitId(LuaHandle* luaHandle); static int getCellTriggeredEventAreaExitUnitId(LuaHandle* luaHandle); static int getCellTriggeredEventUnitId(LuaHandle* luaHandle); static int setRandomGenInit(LuaHandle* luaHandle); static int getRandomGen(LuaHandle* luaHandle); static int getWorldFrameCount(LuaHandle* luaHandle); static int setPlayerAsWinner(LuaHandle* luaHandle); static int endGame(LuaHandle* luaHandle); static int startPerformanceTimer(LuaHandle* luaHandle); static int endPerformanceTimer(LuaHandle* luaHandle); static int getPerformanceTimerResults(LuaHandle* luaHandle); //callbacks, queries static int getIsUnitAlive(LuaHandle* luaHandle); static int getStartLocation(LuaHandle* luaHandle); static int getUnitPosition(LuaHandle* luaHandle); static int getUnitFaction(LuaHandle* luaHandle); static int getUnitName(LuaHandle* luaHandle); static int getUnitDisplayName(LuaHandle* luaHandle); static int getResourceAmount(LuaHandle* luaHandle); static int getLastCreatedUnitName(LuaHandle* luaHandle); static int getLastCreatedUnitId(LuaHandle* luaHandle); static int setUnitPosition(LuaHandle* luaHandle); static int addCellMarker(LuaHandle* luaHandle); static int removeCellMarker(LuaHandle* luaHandle); static int showMarker(LuaHandle* luaHandle); static int getLastDeadUnitName(LuaHandle* luaHandle); static int getLastDeadUnitId(LuaHandle* luaHandle); static int getLastDeadUnitCauseOfDeath(LuaHandle* luaHandle); static int getLastDeadUnitKillerName(LuaHandle* luaHandle); static int getLastDeadUnitKillerId(LuaHandle* luaHandle); static int getLastAttackedUnitName(LuaHandle* luaHandle); static int getLastAttackedUnitId(LuaHandle* luaHandle); static int getLastAttackingUnitName(LuaHandle* luaHandle); static int getLastAttackingUnitId(LuaHandle* luaHandle); static int getUnitCount(LuaHandle* luaHandle); static int getUnitCountOfType(LuaHandle* luaHandle); static int getGameWon(LuaHandle* luaHandle); static int getIsGameOver(LuaHandle* luaHandle); static int getSystemMacroValue(LuaHandle* luaHandle); static int getPlayerName(LuaHandle* luaHandle); static int scenarioDir(LuaHandle* luaHandle); static int loadScenario(LuaHandle* luaHandle); static int getUnitsForFaction(LuaHandle* luaHandle); static int getUnitCurrentField(LuaHandle* luaHandle); static int isFreeCellsOrHasUnit(LuaHandle* luaHandle); static int isFreeCells(LuaHandle* luaHandle); static int getHumanFactionId(LuaHandle* luaHandle); static int highlightUnit(LuaHandle* luaHandle); static int unhighlightUnit(LuaHandle* luaHandle); static int giveStopCommand(LuaHandle* luaHandle); static int selectUnit(LuaHandle* luaHandle); static int unselectUnit(LuaHandle* luaHandle); static int addUnitToGroupSelection(LuaHandle* luaHandle); static int recallGroupSelection(LuaHandle* luaHandle); static int removeUnitFromGroupSelection(LuaHandle* luaHandle); static int setAttackWarningsEnabled(LuaHandle* luaHandle); static int getAttackWarningsEnabled(LuaHandle* luaHandle); static int getIsDayTime(LuaHandle* luaHandle); static int getIsNightTime(LuaHandle* luaHandle); static int getTimeOfDay(LuaHandle* luaHandle); static int registerDayNightEvent(LuaHandle* luaHandle); static int unregisterDayNightEvent(LuaHandle* luaHandle); static int registerUnitTriggerEvent(LuaHandle* luaHandle); static int unregisterUnitTriggerEvent(LuaHandle* luaHandle); static int getLastUnitTriggerEventUnitId(LuaHandle* luaHandle); static int getLastUnitTriggerEventType(LuaHandle* luaHandle); static int getUnitProperty(LuaHandle* luaHandle); static int getUnitPropertyName(LuaHandle* luaHandle); static int disableSpeedChange(LuaHandle* luaHandle); static int enableSpeedChange(LuaHandle* luaHandle); static int getSpeedChangeEnabled(LuaHandle* luaHandle); static int storeSaveGameData(LuaHandle* luaHandle); static int loadSaveGameData(LuaHandle* luaHandle); static int getFactionPlayerType(LuaHandle* luaHandle); }; }}//end namespace #endif