function put() { global $db_game, $params; // get artefact $artefactID = intval($params->artefactID); $artefact = artefact_getArtefactByID($artefactID); if (!sizeof($artefact)) { $this->msgs[] = 'No such cave: (' . $params->xCoord . '|' . $params->yCoord . ')'; return $this->getList(); } // artefact has to be in limbo if ($artefact['initiated'] || $artefact['caveID'] || $artefact['event_movementID']) { $this->msgs[] = 'Artefact is not in limbo'; return $this->getList(); } // put form submitted if ($params->artefacts_put_submit) { // get cave $cave = getCaveByCoords($db_game, $params->xCoord, $params->yCoord); // no such cave if (!sizeof($cave)) { $this->msgs[] = 'No such cave: (' . $params->xCoord . '|' . $params->yCoord . ')'; } else { $this->msgs[] = artefact_putArtefactIntoCave($db_game, $artefactID, $cave['caveID']) ? "Artefact put into cave." : "Error puttin artefact into cave."; } return $this->getList(); } $template = tmpl_open("modules/Module_Artefacts/templates/put.ihtml"); // insert artefact data tmpl_set($template, '/', $artefact); return tmpl_parse($template); }
/** user wants to remove the artefact from cave or another user just robbed that user. * remove the artefact from its cave */ function artefact_removeArtefactFromCave($artefactID) { global $db; $artefact = artefact_getArtefactByID($artefactID); if (sizeof($artefact) == 0) { return FALSE; } $sql = "UPDATE Artefact SET caveID = 0 WHERE artefactID = {$artefact['artefactID']}"; $dbresult = $db->query($sql); if (!$dbresult) { return FALSE; } $sql = "UPDATE Cave SET artefacts = artefacts - 1 WHERE caveID = {$artefact['caveID']}"; $dbresult = $db->query($sql); if (!$dbresult) { return FALSE; } return TRUE; }
function artefact_getDetail($caveID, &$myCaves) { global $template; $messageText = array(-5 => array('type' => 'error', 'message' => _('Dieses Artefakt kann nicht noch einmal eingeweiht werden.')), -4 => array('type' => 'error', 'message' => _('Fehler: Artefakt konnte nicht auf ARTEFACT_INITIATING gestellt werden.')), -3 => array('type' => 'error', 'message' => _('Sie weihen bereits ein anderes Artefakt ein.')), -2 => array('type' => 'error', 'message' => _('Es fehlen die notwendigen Voraussetzungen.')), -1 => array('type' => 'error', 'message' => _('Fehler: Ritual nicht gefunden.')), 0 => array('type' => 'notice', 'message' => _('Über dieses Artefakt weiß man nichts!')), 1 => array('type' => 'success', 'message' => _('Die Einweihung des Artefakts wurde gestartet!'))); // open template $template->setFile('artefactDetail.tmpl'); $show_artefact = TRUE; $artefactID = Request::getVar('artefactID', 0); $artefact = artefact_getArtefactByID($artefactID); if (empty($artefact)) { $messageID = 0; } else { $description_initiated = $artefact['description_initiated']; unset($artefact['description_initiated']); // Gott oder nicht? if ($_SESSION['player']->tribe != GOD_ALLY) { // gibts nicht oder nicht in einer Höhle if (!$artefact['caveID']) { $show_artefact = FALSE; } else { $cave = getCaveByID($artefact['caveID']); // leere Höhle if (!$cave['playerID']) { $show_artefact = FALSE; } else { $owner = getPlayerByID($cave['playerID']); // Besitzer ist ein Gott if ($owner['tribe'] == GOD_ALLY) { $show_artefact = FALSE; } } } } $showRitual = 0; $showStatus = 0; $template->addVars(array('show_artefact' => $show_artefact)); if ($show_artefact) { $artefact['img'] = $artefact['uninitiationImg']; // Bild vom uninitalisierten Artefakt per default anzeigen! // eigene Höhle ... if (isset($myCaves[$artefact['caveID']])) { $showStatus = 1; // Ritual ausführen? if (Request::isPost('initiate')) { $messageID = artefact_beginInitiation($artefact); // reload $myCaves = getCaves($_SESSION['player']->playerID); // wenn noch uneingeweiht und in der "richtigen" Höhle, ritual zeigen } else { if ($artefact['caveID'] == $caveID && $artefact['initiated'] == ARTEFACT_UNINITIATED) { // Check, ob bereits eingeweiht wird. if (sizeof(artefact_getArtefactInitiationsForCave($caveID)) == 0) { $showRitual = 1; // Hol das Einweihungsritual $ritual = artefact_getRitualByID($artefact['initiationID']); // Hol die Kosten und beurteile ob genug da ist $merged_game_rules = array_merge($GLOBALS['resourceTypeList'], $GLOBALS['buildingTypeList'], $GLOBALS['unitTypeList'], $GLOBALS['scienceTypeList'], $GLOBALS['defenseSystemTypeList']); $cost = array(); foreach ($merged_game_rules as $val) { if (isset($ritual[$val->dbFieldName])) { if ($ritual[$val->dbFieldName]) { $object_context = ceil($ritual[$val->dbFieldName]) > floor($myCaves[$artefact['caveID']][$val->dbFieldName]) ? 'less-' : 'enough '; array_push($cost, array('object' => $val->name, 'amount' => $ritual[$val->dbFieldName], 'class' => $object_context)); } } } $artefact['initiation'] = array('cost' => $cost, 'name' => $ritual['name'], 'description' => $ritual['description'], 'duration' => time_formatDuration($ritual['duration']), 'initiate' => 1); } else { $showRitual = -1; } } elseif ($artefact['caveID'] == $caveID && $artefact['initiated'] == ARTEFACT_INITIATING) { // Arte wird gerade eingeweiht $showRitual = -1; } } // "geheime" Beschreibung nur zeigen, wenn eingeweiht if ($artefact['initiated'] == ARTEFACT_INITIATED) { $artefact['description_initiated'] = $description_initiated; // Besitzer des Artefaktes und initalisiert? Richtiges Artefakt Bild anzeigen if (isset($myCaves[$artefact['caveID']])) { $artefact['img'] = $artefact['initiationImg']; } } } $template->addVars(array('artefact' => $artefact)); $template->addVars(array('showRitual' => $showRitual)); $template->addVars(array('showStatus' => $showStatus)); } else { // über dieses Artefakt weiß man nichts! $messageID = 0; } } $template->addVar('status_msg', isset($messageID) ? $messageText[$messageID] : ''); }
/** user wants to remove the artefact from cave or another user just robbed that user. * remove the artefact from its cave */ function artefact_removeArtefactFromCave($artefactID) { global $db; $artefact = artefact_getArtefactByID($artefactID); if (sizeof($artefact) == 0) { return false; } $sql = $db->prepare("UPDATE " . ARTEFACT_TABLE . "\n SET caveID = 0\n WHERE artefactID = :artefactID"); $sql->bindValue('artefactID', $artefact['artefactID'], PDO::PARAM_INT); if (!$sql->execute() || $sql->rowCount() == 0) { return false; } $sql = $db->prepare("UPDATE " . CAVE_TABLE . "\n SET artefacts = artefacts - 1\n WHERE caveID = :caveID"); $sql->bindValue('caveID', $artefact['caveID'], PDO::PARAM_INT); if (!$sql->execute() || $sql->rowCount() == 0) { return false; } return true; }
function artefact_getDetail($caveID, &$myCaves, $artefactID) { global $params, $config, $resourceTypeList, $buildingTypeList, $unitTypeList, $scienceTypeList, $defenseSystemTypeList; $template = tmpl_open($params->SESSION->player->getTemplatePath() . 'artefactdetail.ihtml'); $show_artefact = TRUE; $artefact = artefact_getArtefactByID($artefactID); $description_initiated = $artefact['description_initiated']; unset($artefact['description_initiated']); // Gott oder nicht? if ($params->SESSION->player->tribe != GOD_ALLY) { // gibts nicht oder nicht in einer Höhle if (!$artefact['caveID']) { $show_artefact = FALSE; } else { $cave = getCaveByID($artefact['caveID']); // leere Höhle if (!$cave['playerID']) { $show_artefact = FALSE; } else { $owner = getPlayerByID($cave['playerID']); // Besitzer ist ein Gott if ($owner['tribe'] == GOD_ALLY) { $show_artefact = FALSE; } } } } if ($show_artefact) { // eigene Höhle ... if (array_key_exists($artefact['caveID'], $myCaves)) { // Ritual ausführen? if (isset($params->POST->initiate)) { $message = artefact_beginInitiation($artefact); tmpl_set($template, 'message', $message); // reload $myCaves = getCaves($params->SESSION->player->playerID); } else { if ($artefact['caveID'] == $caveID && $artefact['initiated'] == ARTEFACT_UNINITIATED) { // Check, ob bereits eingeweiht wird. if (sizeof(artefact_getArtefactInitiationsForCave($caveID)) == 0) { // Hol das Einweihungsritual $ritual = artefact_getRitualByID($artefact['initiationID']); // Hol die Kosten und beurteile ob genug da ist $merged_game_rules = array_merge($resourceTypeList, $buildingTypeList, $unitTypeList, $scienceTypeList, $defenseSystemTypeList); $cost = array(); foreach ($merged_game_rules as $val) { if ($ritual[$val->dbFieldName]) { $object_context = ceil($ritual[$val->dbFieldName]) > floor($myCaves[$artefact['caveID']][$val->dbFieldName]) ? 'LESS' : 'ENOUGH'; array_push($cost, array('object' => $val->name, $object_context . '/amount' => $ritual[$val->dbFieldName])); } } $artefact['INITIATION'] = array('COST' => $cost, 'name' => $ritual['name'], 'description' => $ritual['description'], 'duration' => time_formatDuration($ritual['duration']), 'HIDDEN' => array(array('name' => "artefactID", 'value' => $artefact['artefactID']), array('name' => "modus", 'value' => ARTEFACT_DETAIL), array('name' => "initiate", 'value' => 1))); } else { tmpl_iterate($template, 'ARTEFACT/NO_INITIATION'); } } } // "geheime" Beschreibung nur zeigen, wenn eingeweiht if ($artefact['initiated'] == ARTEFACT_INITIATED) { $artefact['description_initiated'] = $description_initiated; } } tmpl_set($template, 'ARTEFACT', $artefact); } else { tmpl_set($template, 'message', _('Über dieses Artefakt weiss man nichts.')); } return tmpl_parse($template); }
function digest_getMovements($meineHoehlen, $doNotShow, $showDetails) { global $resourceTypeList, $unitTypeList, $params, $db, $ua_movements; // caveIDs einsammeln $caveIDs = array(); foreach ($meineHoehlen as $caveID => $value) { $caveIDs[] = $caveID; } $str_caveIDs = implode(",", $caveIDs); // Bewegungen besorgen $query = "SELECT * " . "FROM Event_movement " . "WHERE (source_caveID IN ({$str_caveIDs}) OR (target_caveID IN ({$str_caveIDs}))) " . "ORDER BY event_end ASC"; $dbresult = $db->query($query); if (!$dbresult) { return array(); } // bewegungen durchgehen $result = array(); while ($row = $dbresult->nextrow(MYSQL_ASSOC)) { // "do not show" movements should not be shown // ADDED by chris--- for returns if (!$params->SESSION->user['show_returns']) { if (in_array($row['movementID'], $doNotShow)) { continue; } } // is own movement? $row['isOwnMovement'] = in_array($row['caveID'], $caveIDs); ///////////////////////////////// // SICHTWEITE BESCHRÄNKEN /* We got some problems, as reverse movements should not ALWAYS be visible. * For example a transport reverse movement should be visible, but a * spy reverse movement should not... * As a work around we will fix it by not showing any adverse reverse movement. * * The original code is following... if (!$row['isOwnMovement']){ if ($ua_movements[$row['movementID']]->returnID == -1){ $sichtweite = getVisionRange($meineHoehlen[$row['source_caveID']]) * $row['speedFactor']; $distance = time() - (time_timestampToTime($row['event_end']) - getDistanceByID($srcID, $destID) * $row['speedFactor']); } else { $sichtweite = getVisionRange($meineHoehlen[$row['target_caveID']]) * $row['speedFactor']; $distance = ceil((time_timestampToTime($row['event_end']) - time())/60); } if ($sichtweite < $distance) continue; } */ // compute visibility if (!$row['isOwnMovement']) { // don't show adverse reverse movements if ($ua_movements[$row['movementID']]->returnID == -1) { continue; } $sichtweite = getVisionRange($meineHoehlen[$row['target_caveID']]) * $row['speedFactor']; $distance = ceil((time_timestampToTime($row['event_end']) - time()) / 60); if ($sichtweite < $distance) { continue; } } ///////////////////////////////// // ***** fremde unsichtbare bewegung ***** if ($row['isOwnMovement'] == 0) { if ($ua_movements[$row['movementID']]->mayBeInvisible) { $anzahl_sichtbarer_einheiten = 0; foreach ($unitTypeList as $unitType) { if ($unitType->visible) { $anzahl_sichtbarer_einheiten += $row[$unitType->dbFieldName]; } } if ($anzahl_sichtbarer_einheiten == 0) { continue; } } } $tmp = array('eventID' => $row['event_movementID'], 'caveID' => $row['caveID'], 'source_caveID' => $row['source_caveID'], 'target_caveID' => $row['target_caveID'], 'movementID' => $row['movementID'], 'event_start' => date("d.m.Y H:i:s", time_timestampToTime($row['event_start'])), 'event_end' => date("d.m.Y H:i:s", time_timestampToTime($row['event_end'])), 'isOwnMovement' => intval($row['isOwnMovement']), 'seconds_before_end' => time_timestampToTime($row['event_end']) - time(), 'movementID_description' => $ua_movements[$row['movementID']]->description); // Quelldaten $source = digest_getCaveNameAndOwnerByCaveID($row['source_caveID']); foreach ($source as $key => $value) { $tmp['source_' . $key] = $value; } // Zieldaten $target = digest_getCaveNameAndOwnerByCaveID($row['target_caveID']); foreach ($target as $key => $value) { $tmp['target_' . $key] = $value; } // ***** Einheiten, Rohstoffe und Artefakte ***** if ($showDetails) { if ($row['artefactID']) { $tmp['ARTEFACT'] = artefact_getArtefactByID($row['artefactID']); } $units = array(); foreach ($unitTypeList as $value) { if (!$row[$value->dbFieldName]) { continue; } if (!$row['isOwnMovement'] && !$value->visible) { continue; } $units[] = array('name' => $value->name, 'value' => $row[$value->dbFieldName]); } if (sizeof($units)) { $tmp['UNITS'] = $units; } $resources = array(); foreach ($resourceTypeList as $value) { if (!$row[$value->dbFieldName]) { continue; } $resources[] = array('name' => $value->name, 'value' => $row[$value->dbFieldName]); } if (sizeof($resources)) { $tmp['RESOURCES'] = $resources; } if ($row['isOwnMovement'] && $ua_movements[$row['movementID']]->returnID != -1 && !$row['artefactID'] && !$row['blocked']) { $tmp['CANCEL'] = array("modus" => MOVEMENT, "eventID" => $row['event_movementID']); } } $result[] = $tmp; } return $result; }
function export_movement_irc($movementID) { global $db; require_once 'lib/Movement.php'; require_once 'include/digest.inc.php'; // gather data $ua_movements = Movement::getMovements(); $move = export_getSingleMovement($movementID); if (!sizeof($move)) { return 'Es wurde keine Bewegung gefunden!'; } // get Cave data $sourceCaveData = getCaveNameAndOwnerByCaveID($move['source_caveID']); $targetCaveData = getCaveNameAndOwnerByCaveID($move['target_caveID']); // check if it's a player related movement if ($sourceCaveData['player_name'] !== $_SESSION['player']->name && $targetCaveData['player_name'] !== $_SESSION['player']->name) { return 'Nur eigene Bewegungen erlaubt!'; } // artefact data $artefactData = array(); if ($move['artefactID'] != 0) { $artefactData = artefact_getArtefactByID($move['artefactID']); } // header $header = "Bewegungsart: 4" . $ua_movements[$move['movementID']]->description . "\n"; $header .= "Startzeitpunkt:4 " . time_formatDatetime($move['start']) . "\n"; $header .= "Endzeitpunkt:4 " . time_formatDatetime($move['end']) . "\n"; // movement source $source = "Starthöhle: 4" . $sourceCaveData['cave_name'] . " "; $source .= " (" . $sourceCaveData['xCoord'] . "|" . $sourceCaveData['yCoord'] . ") "; if ($sourceCaveData['player_name']) { $source .= "des Spielers 4" . $sourceCaveData['player_name'] . " "; $source .= "aus dem Stamme 4" . $sourceCaveData['player_tribe'] . " "; } $source .= "\n"; // movement target $target = "Zielhöhle: 4" . $targetCaveData['cave_name']; $target .= " (" . $targetCaveData['xCoord'] . "|" . $targetCaveData['yCoord'] . ") "; if ($targetCaveData['player_name']) { $target .= "des Spielers 4 " . $targetCaveData['player_name'] . " "; $target .= "aus dem Stamme 4" . $targetCaveData['player_tribe'] . " "; } $target .= "\n"; // units $units = "Einheiten: "; foreach ($GLOBALS['unitTypeList'] as $unitsID => $unitDetail) { if ($move[$unitDetail->dbFieldName] > 0) { if ($move['isOwnMovement'] || $unitDetail->visible) { $units .= $unitDetail->name . ": " . ($ua_movements[$move['movementID']]->fogUnit && !$move['isOwnMovement'] ? calcFogUnit($move[$unitDetail->dbFieldName]) : $move[$unitDetail->dbFieldName]) . ", "; } } } $units = substr($units, 0, -2); // resources $resources = ""; foreach ($GLOBALS['resourceTypeList'] as $resourceID => $resourceDetail) { if ($move[$resourceDetail->dbFieldName] > 0) { $resources .= $resourceDetail->name . ": " . ($ua_movements[$move['movementID']]->fogResource && !$move['isOwnMovement'] ? calcFogResource($move[$resourceDetail->dbFieldName]) : $move[$resourceDetail->dbFieldName]) . ", "; } } if ($resources !== "") { $resources = "transportierte Rohstoffe: " . $resources; $resources = substr($resources, 0, -2); } // Artefacts $artefact = ''; if ($move['artefactID'] != 0) { $artefact = "transportierte Artefakte: " . $artefactData['name']; } // Hero $hero = ''; if ($move['heroID'] != 0 && $move['isOwnMovement']) { $hero = "Held läuft mit!"; } $irc = ""; $irc .= $header; $irc .= $source; $irc .= $target . "\n"; $irc .= $units . "\n"; $irc .= $resources . "\n"; $irc .= $artefact . "\n"; $irc .= $hero . "\n"; return $irc; }
function digest_getMovements($ownCave, $doNotShow, $showDetails) { global $db; // get movements $ua_movements = Movement::getMovements(); // caveIDs einsammeln $caveIDs = implode(', ', array_map(array($db, 'quote'), array_keys($ownCave))); // Bewegungen besorgen $query = "SELECT *\n FROM " . EVENT_MOVEMENT_TABLE . "\n WHERE source_caveID IN (" . $caveIDs . ")\n OR target_caveID IN (" . $caveIDs . ")\n ORDER BY end ASC, event_movementID ASC"; if (!($sql = $db->query($query))) { return array(); } $rows = $sql->fetchAll(); $sql->closeCursor(); // bewegungen durchgehen $result = array(); foreach ($rows as $row) { // "do not show" movements should not be shown if (in_array($row['movementID'], $doNotShow)) { continue; } // is own movement? $row['isOwnMovement'] = in_array($row['caveID'], array_keys($ownCave)); ///////////////////////////////// // SICHTWEITE BESCHRÄNKEN /* We got some problems, as reverse movements should not ALWAYS be visible. * For example a transport reverse movement should be visible, but a * spy reverse movement should not... * As a work around we will fix it by not showing any adverse reverse movement. * * The original code is following... if (!$row['isOwnMovement']){ if ($ua_movements[$row['movementID']]->returnID == -1){ $sichtweite = getVisionRange($ownCave[$row['source_caveID']]) * $row['speedFactor']; $distance = time() - (time_fromDatetime($row['end']) - getDistanceByID($srcID, $destID) * $row['speedFactor']); } else { $sichtweite = getVisionRange($ownCave[$row['target_caveID']]) * $row['speedFactor']; $distance = ceil((time_fromDatetime($row['end']) - time())/60); } if ($sichtweite < $distance) continue; } */ // compute visibility if (!$row['isOwnMovement']) { // don't show adverse reverse movements if ($ua_movements[$row['movementID']]->returnID == -1) { continue; } $sichtweite = getVisionRange($ownCave[$row['target_caveID']]) * $row['speedFactor']; $distance = ceil((time_fromDatetime($row['end']) - time()) / 60); if ($sichtweite < $distance) { continue; } } ///////////////////////////////// // ***** fremde unsichtbare bewegung ***** if ($row['isOwnMovement'] == 0) { if ($ua_movements[$row['movementID']]->mayBeInvisible) { $anzahl_sichtbarer_einheiten = 0; foreach ($GLOBALS['unitTypeList'] as $unitType) { if ($unitType->visible) { $anzahl_sichtbarer_einheiten += $row[$unitType->dbFieldName]; } } if ($anzahl_sichtbarer_einheiten == 0) { continue; } } } $tmp = array('event_id' => $row['event_movementID'], 'cave_id' => $row['caveID'], 'source_cave_id' => $row['source_caveID'], 'target_cave_id' => $row['target_caveID'], 'movement_id' => $row['movementID'], 'event_start' => time_fromDatetime($row['start']), 'event_start_date' => time_formatDatetime($row['start']), 'event_end' => time_fromDatetime($row['end']), 'event_end_date' => time_formatDatetime($row['end']), 'isOwnMovement' => intval($row['isOwnMovement']), 'seconds_before_end' => time_fromDatetime($row['end']) - time(), 'movement_id_description' => $ua_movements[$row['movementID']]->description); // Quelldaten $source = getCaveNameAndOwnerByCaveID($row['source_caveID']); foreach ($source as $key => $value) { $tmp['source_' . $key] = $value; } // Zieldaten $target = getCaveNameAndOwnerByCaveID($row['target_caveID']); foreach ($target as $key => $value) { $tmp['target_' . $key] = $value; } // ***** Einheiten, Rohstoffe und Artefakte ***** if ($showDetails) { // show artefact if ($row['artefactID']) { $tmp['artefact'] = artefact_getArtefactByID($row['artefactID']); } // show hero if ($row['heroID']) { $tmp['hero'] = "Held läuft mit!"; } // eval(GameConstants::EXPOSE_INVISIBLE) // FIXME (mlunzena): oben holen wir schon bestimmte Höhlendaten, // das sollte man zusammenfassen.. $target = getCaveByID($row['target_caveID']); $expose = eval('return ' . formula_parseToPHP(GameConstants::EXPOSE_INVISIBLE . ";", '$target')); // show units $units = array(); foreach ($GLOBALS['unitTypeList'] as $unit) { // this movement does not contain units of that type if (!$row[$unit->dbFieldName]) { continue; } // expose invisible units // if it is your own move // if unit is visible if (!$row['isOwnMovement'] && !$unit->visible) { // if target cave's EXPOSEINVISIBLE is > than exposeChance if ($expose <= $row['exposeChance']) { // do not expose continue; } else { // do something // for example: // $row[$unit->dbFieldName] *= 2.0 * (double)rand() / (double)getRandMax(); } } $units[] = array('unitID' => $unit->unitID, 'dbFieldName' => $unit->dbFieldName, 'name' => $unit->name, 'value' => $ua_movements[$row['movementID']]->fogUnit && !$row['isOwnMovement'] ? calcFogUnit($row[$unit->dbFieldName]) : $row[$unit->dbFieldName]); } if (sizeof($units)) { $tmp['units'] = $units; } $resources = array(); foreach ($GLOBALS['resourceTypeList'] as $resource) { if (!$row[$resource->dbFieldName]) { continue; } $resources[] = array('name' => $resource->name, 'dbFieldName' => $resource->dbFieldName, 'value' => $ua_movements[$row['movementID']]->fogResource && !$row['isOwnMovement'] ? calcFogResource($row[$resource->dbFieldName]) : $row[$resource->dbFieldName]); } if (sizeof($resources)) { $tmp['resources'] = $resources; } if ($row['isOwnMovement'] && $ua_movements[$row['movementID']]->returnID != -1 && !$row['artefactID'] && !$row['blocked']) { $tmp['cancel'] = array("modus" => UNIT_MOVEMENT, "eventID" => $row['event_movementID']); } } $result[] = $tmp; } return $result; }
function digest_getMovements($ownCave, $doNotShow, $showDetails) { global $db; // get movements $ua_movements = Movement::getMovements(); // caveIDs einsammeln $caveIDs = implode(', ', array_map(array($db, 'quote'), array_keys($ownCave))); $targetExtraFilds = formula_parseToSelectSQL(GameConstants::EXPOSE_INVISIBLE); $sqlExtra = array(); foreach ($targetExtraFilds as $field) { $sqlTargetExtra[] = 'tc.' . $field . ' AS target_' . $field; } $sql = $db->prepare("SELECT em.*, sc.name AS source_cave_name, sp.name AS source_player_name, st.tag AS source_player_tribe, sc.xCoord AS source_xCoord, sc.yCoord AS source_yCoord, tc.name AS target_cave_name, tp.name AS target_player_name, tt.tag AS target_player_tribe, tc.xCoord AS target_xCoord, tc.yCoord AS target_yCoord " . (!empty($sqlTargetExtra) ? ', ' . implode(', ', $sqlTargetExtra) : '') . "\n FROM " . EVENT_MOVEMENT_TABLE . " em\n LEFT JOIN " . CAVE_TABLE . " sc ON sc.caveID = em.source_caveID\n LEFT JOIN " . PLAYER_TABLE . " sp ON sp.playerID = sc.playerID\n LEFT JOIN " . TRIBE_TABLE . " st ON st.tribeID = sp.tribeID\n LEFT JOIN " . CAVE_TABLE . " tc ON tc.caveID = em.target_caveID\n LEFT JOIN " . PLAYER_TABLE . " tp ON tp.playerID = tc.playerID\n LEFT JOIN " . TRIBE_TABLE . " tt ON tt.tribeID = tp.tribeID\n WHERE em.source_caveID IN (" . $caveIDs . ")\n OR em.target_caveID IN (" . $caveIDs . ")\n ORDER BY em.end ASC, em.event_movementID ASC"); if (!$sql->execute()) { return array(); } $rows = $sql->fetchAll(PDO::FETCH_ASSOC); $sql->closeCursor(); // bewegungen durchgehen $result = array(); foreach ($rows as $row) { // "do not show" movements should not be shown if (in_array($row['movementID'], $doNotShow)) { continue; } // is own movement? $row['isOwnMovement'] = in_array($row['caveID'], array_keys($ownCave)); ///////////////////////////////// // SICHTWEITE BESCHRÄNKEN /* We got some problems, as reverse movements should not ALWAYS be visible. * For example a transport reverse movement should be visible, but a * spy reverse movement should not... * As a work around we will fix it by not showing any adverse reverse movement. * * The original code is following... if (!$row['isOwnMovement']){ if ($ua_movements[$row['movementID']]->returnID == -1){ $sichtweite = getVisionRange($ownCave[$row['source_caveID']]) * $row['speedFactor']; $distance = time() - (time_fromDatetime($row['end']) - getDistanceByID($srcID, $destID) * $row['speedFactor']); } else { $sichtweite = getVisionRange($ownCave[$row['target_caveID']]) * $row['speedFactor']; $distance = ceil((time_fromDatetime($row['end']) - time())/60); } if ($sichtweite < $distance) continue; } */ // compute visibility if (!$row['isOwnMovement']) { // don't show adverse reverse movements if ($ua_movements[$row['movementID']]->returnID == -1) { continue; } $sichtweite = getVisionRange($ownCave[$row['target_caveID']]) * $row['speedFactor']; $distance = ceil((time_fromDatetime($row['end']) - time()) / 60); if ($sichtweite < $distance) { continue; } } ///////////////////////////////// // ***** fremde unsichtbare bewegung ***** if ($row['isOwnMovement'] == 0) { if ($ua_movements[$row['movementID']]->mayBeInvisible) { $anzahl_sichtbarer_einheiten = 0; foreach ($GLOBALS['unitTypeList'] as $unitType) { if ($unitType->visible) { $anzahl_sichtbarer_einheiten += $row[$unitType->dbFieldName]; } } if ($anzahl_sichtbarer_einheiten == 0) { continue; } } } $tmp = array('event_id' => $row['event_movementID'], 'cave_id' => $row['caveID'], 'source_cave_id' => $row['source_caveID'], 'target_cave_id' => $row['target_caveID'], 'movement_id' => $row['movementID'], 'event_start' => time_fromDatetime($row['start']), 'event_start_date' => time_formatDatetime($row['start']), 'event_end' => time_fromDatetime($row['end']), 'event_end_date' => time_formatDatetime($row['end']), 'isOwnMovement' => intval($row['isOwnMovement']), 'seconds_before_end' => time_fromDatetime($row['end']) - time(), 'movement_id_description' => $ua_movements[$row['movementID']]->description, 'source_cave_name' => $row['source_cave_name'], 'source_player_name' => $row['source_player_name'], 'source_player_tribe' => $row['source_player_tribe'], 'source_xCoord' => $row['source_xCoord'], 'source_yCoord' => $row['source_yCoord'], 'target_cave_name' => $row['target_cave_name'], 'target_player_name' => $row['target_player_name'], 'target_player_tribe' => $row['target_player_tribe'], 'target_xCoord' => $row['target_xCoord'], 'target_yCoord' => $row['target_yCoord']); // ***** Einheiten, Rohstoffe und Artefakte ***** if ($showDetails) { // show artefact if ($row['artefactID']) { $tmp['artefact'] = artefact_getArtefactByID($row['artefactID']); } // show hero if ($row['heroID']) { $tmp['hero'] = "Held läuft mit!"; } // eval(GameConstants::EXPOSE_INVISIBLE) // FIXME (mlunzena): oben holen wir schon bestimmte Höhlendaten, // das sollte man zusammenfassen.. foreach ($targetExtraFilds as $field) { $target[$field] = $row['target_' . $field]; } $expose = eval('return ' . formula_parseToPHP(GameConstants::EXPOSE_INVISIBLE . ";", '$target')); // show units $units = array(); foreach ($GLOBALS['unitTypeList'] as $unit) { // this movement does not contain units of that type if (!$row[$unit->dbFieldName]) { continue; } // expose invisible units // if it is your own move // if unit is visible if (!$row['isOwnMovement'] && !$unit->visible) { // if target cave's EXPOSEINVISIBLE is > than exposeChance if ($expose <= $row['exposeChance']) { // do not expose continue; } else { // do something // for example: // $row[$unit->dbFieldName] *= 2.0 * (double)rand() / (double)getRandMax(); } } $units[] = array('unitID' => $unit->unitID, 'dbFieldName' => $unit->dbFieldName, 'name' => $unit->name, 'value' => $ua_movements[$row['movementID']]->fogUnit && !$row['isOwnMovement'] ? calcFogUnit($row[$unit->dbFieldName]) : $row[$unit->dbFieldName]); } if (sizeof($units)) { $tmp['units'] = $units; } $resources = array(); foreach ($GLOBALS['resourceTypeList'] as $resource) { if (!$row[$resource->dbFieldName]) { continue; } $resources[] = array('name' => $resource->name, 'dbFieldName' => $resource->dbFieldName, 'value' => $ua_movements[$row['movementID']]->fogResource && !$row['isOwnMovement'] ? calcFogResource($row[$resource->dbFieldName]) : $row[$resource->dbFieldName]); } if (sizeof($resources)) { $tmp['resources'] = $resources; } if ($row['isOwnMovement'] && $ua_movements[$row['movementID']]->returnID != -1 && !$row['artefactID'] && !$row['blocked']) { $tmp['cancel'] = array("modus" => UNIT_MOVEMENT, "eventID" => $row['event_movementID']); } } $result[] = $tmp; } return $result; }