- 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();
This commit is contained in:
Mark Vejvoda 2012-10-10 05:44:14 +00:00
parent 0449fbea2b
commit 84452f8633
2 changed files with 119 additions and 1 deletions

View File

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

View File

@ -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<int,string> 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<int,CellTriggerEvent> CellTriggerEventList;
std::map<int,TimerTriggerEvent> 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);