public static function checkForCascadingLogs($pack) { $quests = dbconnection::queryArray("SELECT * FROM quests WHERE game_id = '{$pack->game_id}'"); $completedRecords = dbconnection::queryArray("SELECT * FROM user_log WHERE game_id = '{$pack->game_id}' AND user_id = '{$pack->auth->user_id}' AND event_type = 'COMPLETE_QUEST' AND deleted = 0 GROUP BY content_id"); $incompleteQuests = array(); for ($i = 0; $i < count($quests); $i++) { $completed = false; for ($j = 0; $j < count($completedRecords); $j++) { if ($quests[$i]->quest_id == $completedRecords[$j]->content_id) { $completed = true; } } if (!$completed) { $incompleteQuests[] = $quests[$i]; } } $reqQueryPack = new stdClass(); $reqQueryPack->game_id = $pack->game_id; $reqQueryPack->user_id = $pack->auth->user_id; $questQueryPack = new stdClass(); $questQueryPack->game_id = $pack->game_id; $questQueryPack->auth = $pack->auth; $questQueryPack->silent = true; //logPlayerCompletedQuest would otherwise recursively call this function. Might as well save it for the end. $dirty = false; for ($i = 0; $i < count($incompleteQuests); $i++) { $reqQueryPack->requirement_root_package_id = $incompleteQuests[$i]->complete_requirement_root_package_id; $questQueryPack->quest_id = $incompleteQuests[$i]->quest_id; if (requirements::evaluateRequirementPackage($reqQueryPack)) { client::logPlayerCompletedQuest($questQueryPack); $dirty = true; } } if ($dirty) { client::checkForCascadingLogs($pack); } //log changed, potentially requiring more logs }