void MissionCompare(struct RBNode* _GuyNode, struct LinkedList* _Missions) { if(_GuyNode == NULL) return; for(struct LnkLst_Node* _Itr = _Missions->Front; _Itr != NULL; _Itr = _Itr->Next) { struct Mission* _Mission = _Itr->Data; double _Percent = _Mission->MeanPercent; struct MissionFrame _Frame = {0}; static int _Fired = 0; _Frame.Owner = _GuyNode->Data; if(_Mission->Trigger != 0 && CallMissionCond(g_LuaState, _Mission->Trigger, &_Frame) == 0) continue; if(_Fired == 0 && _Mission == StrToMission("BANDT.1")) { _Fired = 1; MissionCall(g_LuaState, _Mission, g_GameWorld.Player, NULL); } for(uint8_t i = 0; i < _Mission->MeanModsSz; ++i) { if(_Mission->MeanModTrig[i] == 0 || CallMissionCond(g_LuaState, _Mission->MeanModTrig[i], &_Frame) != 0) _Percent = _Percent * _Mission->MeanMods[i]; } if(Rand() / ((double)0xFFFFFFFFFFFFFFFF) <= _Percent) MissionCall(g_LuaState, _Mission, _GuyNode->Data, NULL); } MissionCompare(_GuyNode->Left, _Missions); MissionCompare(_GuyNode->Right, _Missions); }
void MissionOnEvent(struct MissionEngine* _Engine, uint32_t _EventType, struct BigGuy* _Guy) { Assert(_EventType < EventUserOffset()); for(struct LnkLst_Node* _Itr = _Engine->EventMissions[_EventType].Front; _Itr != NULL; _Itr = _Itr->Next) { struct Mission* _Mission = _Itr->Data; struct MissionFrame _Frame = {0}; _Frame.Owner = _Guy; _Frame.Mission = _Mission; if(CallMissionCond(g_LuaState, _Mission->Trigger, &_Frame) != 0) MissionCall(g_LuaState, _Mission, NULL, _Guy); } }
void BulletinItemOnClick(struct BulletinItem* _Item, lua_State* _State, struct BigGuy* _Selector) { MissionCall(_State, _Item->SuccMission, _Selector, _Item->Owner); }