From 84452f863384f121afbccb148418c0768fb88c80 Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Wed, 10 Oct 2012 05:44:14 +0000 Subject: [PATCH] - added new cell trigger lua function to be able to detect when any unit enters or exits a region of cells: int registerCellAreaTriggerEvent(Vec4i pos) int getCellTriggeredEventAreaEntryUnitId(); int getCellTriggeredEventAreaExitUnitId(); --- source/glest_game/game/script_manager.cpp | 100 ++++++++++++++++++++++ source/glest_game/game/script_manager.h | 20 ++++- 2 files changed, 119 insertions(+), 1 deletion(-) diff --git a/source/glest_game/game/script_manager.cpp b/source/glest_game/game/script_manager.cpp index 302d6d154..72f84b560 100644 --- a/source/glest_game/game/script_manager.cpp +++ b/source/glest_game/game/script_manager.cpp @@ -211,6 +211,8 @@ ScriptManager::ScriptManager() { currentEventId = 0; inCellTriggerEvent = false; rootNode = NULL; + currentCellTriggeredEventAreaEntryUnitId = 0; + currentCellTriggeredEventAreaExitUnitId = 0; } ScriptManager::~ScriptManager() { @@ -295,6 +297,7 @@ void ScriptManager::init(World* world, GameCamera *gameCamera, const XmlNode *ro luaScript.registerFunction(registerCellAreaTriggerEventForUnitToLocation, "registerCellAreaTriggerEventForUnitToLocation"); luaScript.registerFunction(registerCellAreaTriggerEventForFactionToLocation, "registerCellAreaTriggerEventForFactionToLocation"); + luaScript.registerFunction(registerCellAreaTriggerEvent, "registerCellAreaTriggerEvent"); luaScript.registerFunction(getCellTriggerEventCount, "getCellTriggerEventCount"); luaScript.registerFunction(unregisterCellTriggerEvent, "unregisterCellTriggerEvent"); @@ -306,6 +309,9 @@ void ScriptManager::init(World* world, GameCamera *gameCamera, const XmlNode *ro luaScript.registerFunction(getCellTriggeredEventId, "triggeredCellEventId"); luaScript.registerFunction(getTimerTriggeredEventId, "triggeredTimerEventId"); + luaScript.registerFunction(getCellTriggeredEventAreaEntryUnitId, "triggeredEventAreaEntryUnitId"); + luaScript.registerFunction(getCellTriggeredEventAreaExitUnitId, "triggeredEventAreaExitUnitId"); + luaScript.registerFunction(setRandomGenInit, "setRandomGenInit"); luaScript.registerFunction(getRandomGen, "getRandomGen"); luaScript.registerFunction(getWorldFrameCount, "getWorldFrameCount"); @@ -599,6 +605,8 @@ void ScriptManager::onCellTriggerEvent(Unit *movingUnit) { __FILE__,__FUNCTION__,__LINE__,movingUnit->getId(),event.type,movingUnit->getPos().getString().c_str(), event.sourceId,event.destId,event.destPos.getString().c_str()); bool triggerEvent = false; + currentCellTriggeredEventAreaEntryUnitId = 0; + currentCellTriggeredEventAreaExitUnitId = 0; switch(event.type) { case ctet_Unit: @@ -714,6 +722,51 @@ void ScriptManager::onCellTriggerEvent(Unit *movingUnit) { } break; + case ctet_AreaPos: + { + // Is the unit already in the cell range? If no check if they are entering it + if(event.eventStateInfo.find(movingUnit->getId()) == event.eventStateInfo.end()) { + //printf("ctet_FactionPos event.destPos = [%s], movingUnit->getPos() [%s]\n",event.destPos.getString().c_str(),movingUnit->getPos().getString().c_str()); + + bool srcInDst = false; + for(int x = event.destPos.x; srcInDst == false && x <= event.destPosEnd.x; ++x) { + for(int y = event.destPos.y; srcInDst == false && y <= event.destPosEnd.y; ++y) { + + srcInDst = world->getMap()->isInUnitTypeCells(movingUnit->getType(), Vec2i(x,y),movingUnit->getPos()); + if(srcInDst == true) { + if(SystemFlags::getSystemSettingType(SystemFlags::debugLUA).enabled) SystemFlags::OutputDebug(SystemFlags::debugLUA,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + + currentCellTriggeredEventAreaEntryUnitId = movingUnit->getId(); + event.eventStateInfo[movingUnit->getId()] = Vec2i(x,y).getString(); + } + } + } + triggerEvent = srcInDst; + } + // If unit is already in cell range check if they are leaving? + else { + bool srcInDst = false; + for(int x = event.destPos.x; srcInDst == false && x <= event.destPosEnd.x; ++x) { + for(int y = event.destPos.y; srcInDst == false && y <= event.destPosEnd.y; ++y) { + + srcInDst = world->getMap()->isInUnitTypeCells(movingUnit->getType(), Vec2i(x,y),movingUnit->getPos()); + if(srcInDst == true) { + if(SystemFlags::getSystemSettingType(SystemFlags::debugLUA).enabled) SystemFlags::OutputDebug(SystemFlags::debugLUA,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + + //event.eventStateInfo[movingUnit->getId()] = Vec2i(x,y); + } + } + } + triggerEvent = (srcInDst == false); + if(triggerEvent == true) { + currentCellTriggeredEventAreaExitUnitId = movingUnit->getId(); + + event.eventStateInfo.erase(movingUnit->getId()); + } + } + } + break; + } if(triggerEvent == true) { @@ -1126,6 +1179,23 @@ int ScriptManager::registerCellAreaTriggerEventForFactionToLocation(int sourceFa return eventId; } +int ScriptManager::registerCellAreaTriggerEvent(const Vec4i &pos) { + CellTriggerEvent trigger; + trigger.type = ctet_AreaPos; + trigger.sourceId = -1; + trigger.destPos.x = pos.x; + trigger.destPos.y = pos.y; + trigger.destPosEnd.x = pos.z; + trigger.destPosEnd.y = pos.w; + + int eventId = currentEventId++; + CellTriggerEventList[eventId] = trigger; + + if(SystemFlags::getSystemSettingType(SystemFlags::debugLUA).enabled) SystemFlags::OutputDebug(SystemFlags::debugLUA,"In [%s::%s Line: %d] trigger cell event when reaching pos: %s, eventId = %d\n",__FILE__,__FUNCTION__,__LINE__,pos.getString().c_str(),eventId); + + return eventId; +} + int ScriptManager::getCellTriggerEventCount(int eventId) { int result = 0; if(CellTriggerEventList.find(eventId) != CellTriggerEventList.end()) { @@ -1353,6 +1423,17 @@ int ScriptManager::getTimerTriggeredEventId() { return currentTimerTriggeredEventId; } +int ScriptManager::getCellTriggeredEventAreaEntryUnitId() { + ScriptManager_STREFLOP_Wrapper streflopWrapper; + return currentCellTriggeredEventAreaEntryUnitId; +} + +int ScriptManager::getCellTriggeredEventAreaExitUnitId() { + ScriptManager_STREFLOP_Wrapper streflopWrapper; + return currentCellTriggeredEventAreaExitUnitId; +} + + void ScriptManager::setRandomGenInit(int seed) { ScriptManager_STREFLOP_Wrapper streflopWrapper; random.init(seed); @@ -1796,6 +1877,13 @@ int ScriptManager::registerCellAreaTriggerEventForFactionToLocation(LuaHandle* l return luaArguments.getReturnCount(); } +int ScriptManager::registerCellAreaTriggerEvent(LuaHandle* luaHandle) { + LuaArguments luaArguments(luaHandle); + int result = thisScriptManager->registerCellAreaTriggerEvent(luaArguments.getVec4i(-1)); + luaArguments.returnInt(result); + return luaArguments.getReturnCount(); +} + int ScriptManager::getCellTriggerEventCount(LuaHandle* luaHandle) { LuaArguments luaArguments(luaHandle); int result = thisScriptManager->getCellTriggerEventCount(luaArguments.getInt(-1)); @@ -1973,6 +2061,18 @@ int ScriptManager::getTimerTriggeredEventId(LuaHandle* luaHandle){ return luaArguments.getReturnCount(); } +int ScriptManager::getCellTriggeredEventAreaEntryUnitId(LuaHandle* luaHandle){ + LuaArguments luaArguments(luaHandle); + luaArguments.returnInt(thisScriptManager->getCellTriggeredEventAreaEntryUnitId()); + return luaArguments.getReturnCount(); +} + +int ScriptManager::getCellTriggeredEventAreaExitUnitId(LuaHandle* luaHandle){ + LuaArguments luaArguments(luaHandle); + luaArguments.returnInt(thisScriptManager->getCellTriggeredEventAreaExitUnitId()); + return luaArguments.getReturnCount(); +} + int ScriptManager::setRandomGenInit(LuaHandle* luaHandle){ LuaArguments luaArguments(luaHandle); thisScriptManager->setRandomGenInit(luaArguments.getInt(-1)); diff --git a/source/glest_game/game/script_manager.h b/source/glest_game/game/script_manager.h index f957d4cbd..0f5980736 100644 --- a/source/glest_game/game/script_manager.h +++ b/source/glest_game/game/script_manager.h @@ -102,7 +102,8 @@ enum CellTriggerEventType { ctet_Faction, ctet_FactionPos, ctet_UnitAreaPos, - ctet_FactionAreaPos + ctet_FactionAreaPos, + ctet_AreaPos }; class CellTriggerEvent { @@ -116,6 +117,8 @@ public: int triggerCount; + std::map eventStateInfo; + void saveGame(XmlNode *rootNode); void loadGame(const XmlNode *rootNode); }; @@ -182,6 +185,10 @@ private: int currentTimerTriggeredEventId; int currentCellTriggeredEventId; + + int currentCellTriggeredEventAreaEntryUnitId; + int currentCellTriggeredEventAreaExitUnitId; + int currentEventId; std::map CellTriggerEventList; std::map TimerTriggerEventList; @@ -280,6 +287,8 @@ private: 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(); @@ -287,9 +296,13 @@ private: int resetTimerEvent(int eventId); int stopTimerEvent(int eventId); int getTimerEventSecondsElapsed(int eventId); + int getCellTriggeredEventId(); int getTimerTriggeredEventId(); + int getCellTriggeredEventAreaEntryUnitId(); + int getCellTriggeredEventAreaExitUnitId(); + void setRandomGenInit(int seed); int getRandomGen(int minVal, int maxVal); int getWorldFrameCount(); @@ -400,6 +413,8 @@ private: 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); @@ -411,6 +426,9 @@ private: static int getCellTriggeredEventId(LuaHandle* luaHandle); static int getTimerTriggeredEventId(LuaHandle* luaHandle); + static int getCellTriggeredEventAreaEntryUnitId(LuaHandle* luaHandle); + static int getCellTriggeredEventAreaExitUnitId(LuaHandle* luaHandle); + static int setRandomGenInit(LuaHandle* luaHandle); static int getRandomGen(LuaHandle* luaHandle); static int getWorldFrameCount(LuaHandle* luaHandle);