function getHeroByPlayer($playerID) { global $db; // set database query with playerID $sql = $db->prepare("SELECT *\n FROM " . HERO_TABLE . "\n WHERE playerID = :playerID"); $sql->bindValue('playerID', $playerID); if (!$sql->execute()) { return null; } $hero = $sql->fetch(PDO::FETCH_ASSOC); $sql->closeCursor(); if (empty($hero)) { return null; } if ($hero['heroTypeID'] == 1000) { return $hero; } $hero['id'] = $GLOBALS['heroTypesList'][$hero['heroTypeID']]['id']; $hero['typeName'] = $GLOBALS['heroTypesList'][$hero['heroTypeID']]['name']; $hero['path'] = _('hero_imperator.gif'); $hero['location'] = _('tot'); if ($hero['id'] == 'Defender') { $hero['path'] = _('hero_defender.gif'); } if ($hero['id'] == 'Constructor') { $hero['path'] = _('hero_constructor.gif'); } $hero['lvlUp'] = eval("return " . hero_parseFormulas($GLOBALS['heroTypesList'][$hero['heroTypeID']]['lvlUp_formula']) . ";"); $hero['expLeft'] = $hero['lvlUp'] - $hero['exp']; if ($hero['healPoints'] == 0 || $hero['isAlive'] == false) { $hero['location'] = _('tot'); $hero['path'] = _('hero_death.gif'); } else { if ($hero['isMoving']) { $hero['location'] = _('in Bewegung'); } else { $cave = getCaveByID($hero['caveID']); $hero['location'] = $cave['name'] . " in (" . $cave['xCoord'] . "|" . $cave['yCoord'] . ")"; } } return $hero; }
/** * Adjusts deviating cave's effects * * @param dbgame * the link to the game DB * @return all caveIDs */ function adjust_adjustCave($db, $caveID) { global $effectTypeList, $terrainList, $checkOnly; // get cave $cave = getCaveByID($caveID); // get artefact effects $artefactEffects = artefact_recalculateEffects($caveID); // get wonder effects $wonderEffects = wonder_recalc($caveID, $db); // check each effect $adjustments = array(); foreach ($effectTypeList as $effectID => $effect) { // get actual value $actual = $cave[$effect->dbFieldName]; // get nominal value $nominal = $artefactEffects[$effectID] + $wonderEffects[$effectID]; $nominal += (double) $terrainList[$cave['terrain']]['effects'][$effectID]; // check for deviation if ($actual != $nominal) { // log difference adjust_log('%4d: %-30s nominal:%f actual:%f', $caveID, $effect->dbFieldName, $nominal, $actual); // collect adjustments $adjustments[] = sprintf('%s = %f', $effect->dbFieldName, $nominal); } } // prepare query $query = sprintf('UPDATE Cave SET %s WHERE caveID = %d', implode(", ", $adjustments), $caveID); // adjust cave if (0 != sizeof($adjustments) && !$checkOnly) { adjust_log('Adjusting cave %d (%s)', $caveID, $cave['name']); // send query if (!$db->query($query)) { adjust_log('Error! "%s": %s', $query, mysql_error()); } } }
public static function setDonations($value_array, $caveID, &$caveData) { global $db; if (!sizeof($value_array)) { return -8; } $fields_cave = $fields_storage = $fields_donations = $fields_resources = $where = array(); foreach ($value_array as $resourceID => $value) { $value = floor(abs($value)); // nur positive und ganze zahlen zulässig! if ($value) { if (isset($GLOBALS['resourceTypeList'][$resourceID])) { $resource = $GLOBALS['resourceTypeList'][$resourceID]; // wartezeit einer Ressource nicht abgewartet? Abbruch! if (isset($_SESSION['player']->donateLocked['tribe'][$resource->dbFieldName]) && $_SESSION['player']->donateLocked['tribe'][$resource->dbFieldName] > time()) { return -9; } // check if resource is over maxDonation value if ($resource->maxTribeDonation < $value) { return -9; } // check for enough resources in cave if ($caveData[$resource->dbFieldName] < $value) { return -10; } $fields_cave[] = $resource->dbFieldName . " = " . $resource->dbFieldName . " - " . $value; $fields_storage[] = $resource->dbFieldName . " = " . $resource->dbFieldName . " + " . $value; $fields_resources[] = $resource->dbFieldName; $fields_donations[] = $value; $where[] = " AND " . $resource->dbFieldName . " >= " . $value; } } } $sql = $db->prepare("INSERT INTO " . TRIBE_STORAGE_DONATIONS_TABLE . "(playerID, tribeID, timestamp, " . implode(", ", $fields_resources) . ")\n VALUES (:playerID, :tribeID, :timestamp, " . implode(", ", $fields_donations) . ")"); $sql->bindValue('playerID', $_SESSION['player']->playerID, PDO::PARAM_INT); $sql->bindValue('tribeID', $_SESSION['player']->tribeID, PDO::PARAM_STR); $sql->bindValue('timestamp', time(), PDO::PARAM_INT); if (!$sql->execute()) { return -11; } $sql = $db->prepare("UPDATE " . TRIBE_TABLE . " SET\n " . implode(", ", $fields_storage) . "\n WHERE tag LIKE :tribe"); $sql->bindValue('tribe', $_SESSION['player']->tribe, PDO::PARAM_STR); if (!$sql->execute()) { return -11; } $sql = $db->prepare("UPDATE " . CAVE_TABLE . " SET\n " . implode(", ", $fields_cave) . "\n WHERE caveID = :caveID\n " . implode(" ", $where)); $sql->bindValue('caveID', $caveID, PDO::PARAM_INT); if (!$sql->execute()) { return -20; } // update caves $caveData = getCaveByID($caveID); // update Timeout foreach ($value_array as $resourceID => $value) { if ($value) { if (isset($GLOBALS['resourceTypeList'][$resourceID])) { $newTime = time() + TRIBE_STORAGE_DONATION_INTERVAL * 60 * 60; Player::setDonateLocked($_SESSION['player']->playerID, 'tribe', $GLOBALS['resourceTypeList'][$resourceID]->dbFieldName, $newTime); } } } return 4; }
function determineCoordsFromParameters($caveData, $mapSize) { // default Werte: Koordinaten of the given caveData (that is the data of the presently selected own cave) $xCoord = $caveData['xCoord']; $yCoord = $caveData['yCoord']; $message = ''; // wenn in die Minimap geklickt wurde, zoome hinein if (($minimap_x = Request::getVar('minimap_x', 0)) && ($minimap_y = Request::getVar('minimap_y', 0)) && ($scaling = Request::getVar('scaling', 0)) !== 0) { $xCoord = Floor($minimap_x * 100 / $scaling) + $mapSize['minX']; $yCoord = Floor($minimap_y * 100 / $scaling) + $mapSize['minY']; } else { if ($caveName = Request::getVar('caveName', '')) { $coords = getCaveByName($caveName); if (!$coords['xCoord']) { $message = sprintf(_('Die Höhle mit dem Namen: "%s" konnte nicht gefunden werden!'), $caveName); } else { $xCoord = $coords['xCoord']; $yCoord = $coords['yCoord']; $message = sprintf(_('Die Höhle mit dem Namen: "%s" befindet sich in (%d|%d).'), $caveName, $xCoord, $yCoord); } } else { if (($targetCaveID = Request::getVar('targetCaveID', 0)) > 0) { $coords = getCaveByID($targetCaveID); if ($coords === null) { $message = sprintf(_('Die Höhle mit der ID: "%d" konnte nicht gefunden werden!'), $targetCaveID); } else { $xCoord = $coords['xCoord']; $yCoord = $coords['yCoord']; $message = sprintf(_('Die Höhle mit der ID: "%d" befindet sich in (%d|%d).'), $targetCaveID, $xCoord, $yCoord); } } else { if (Request::getVar('xCoord', 0) && Request::getVar('yCoord', 0)) { $xCoord = Request::getVar('xCoord', 0); $yCoord = Request::getVar('yCoord', 0); } } } } // Koordinaten begrenzen if ($xCoord < $mapSize['minX']) { $xCoord = $mapSize['minX']; } if ($yCoord < $mapSize['minY']) { $yCoord = $mapSize['minY']; } if ($xCoord > $mapSize['maxX']) { $xCoord = $mapSize['maxX']; } if ($yCoord > $mapSize['maxY']) { $yCoord = $mapSize['maxY']; } return array('xCoord' => $xCoord, 'yCoord' => $yCoord, 'message' => $message); }
function takeover_transfer_cave_to($caveID, $playerID) { global $db; // check parameters $caveID = (int) $caveID; $playerID = (int) $playerID; // get player $winner = Player::getPlayer($playerID, true); if (!sizeof($winner)) { echo "ERROR (takeover_transfer_cave_to): Could not transfer Cave {$caveID} to Player {$playerID}.\n"; return FALSE; } // secureCaveCredits $hasCredits = $winner['secureCaveCredits'] > 0 ? 1 : 0; // transfer cave to player $sql = $db->prepare("UPDATE " . CAVE_TABLE . "\n SET playerID = :playerID,\n takeoverable = 0,\n secureCave = :secureCave\n WHERE caveID = :caveID"); $sql->bindValue('playerID', $playerID, PDO::PARAM_INT); $sql->bindValue('secureCave', $hasCredits, PDO::PARAM_INT); $sql->bindValue('caveID', $caveID, PDO::PARAM_INT); if (!$sql->execute()) { return FALSE; } // update secureCaveCredits $sql = $db->prepare("UPDATE " . PLAYER_TABLE . "\n SET secureCaveCredits = GREATEST(0, secureCaveCredits - 1)\n WHERE playerID = :playerID"); $sql->bindValue('playerID', $playerID, PDO::PARAM_INT); if (!$sql->execute()) { echo "ERROR (takeover_transfer_cave_to): Could not update secureCaveCredits of Player {$playerID}.\n"; return FALSE; } // copy sciences if (sizeof($GLOBALS['scienceTypeList'])) { $set = array(); foreach ($GLOBALS['scienceTypeList'] as $science) { $temp = $science->dbFieldName; $set[] = "{$temp} = '{$winner[$temp]}'"; } $set = implode(", ", $set); $sql = $db->prepare("UPDATE " . CAVE_TABLE . "\n SET " . $set . "\n WHERE playerID = :playerID"); $sql->bindValue('playerID', $playerID, PDO::PARAM_INT); if (!$sql->execute()) { echo "ERROR (takeover_transfer_cave_to): Could not update sciences of Player {$playerID}.\n"; return FALSE; } } // get the cave's data $cave = getCaveByID($caveID); takeover_send_transfer($playerID, $cave); }
/** This function computes the distance between two caves using their IDs. */ function getDistanceByID($srcID, $destID) { $srcCave = getCaveByID($srcID); $destCave = getCaveByID($destID); return getDistanceByCoords($srcCave['xCoord'], $srcCave['yCoord'], $destCave['xCoord'], $destCave['yCoord']); }
function unit_Movement($caveID, &$ownCave) { global $db, $template; $safeForm = true; // get movements $ua_movements = Movement::getMovements(); $details = $ownCave[$caveID]; /***************************************************************************/ /** **/ /** CHECK ARTEFACTS **/ /** **/ /***************************************************************************/ // artefact moving: get ID if any // // $params->POST->myartefacts will be // NULL, if it is not set at all // -1 when choosing no artefact to move // 0 if there was a real choice // default: Move No Artefact (this var holds the artefactID to move) $moveArtefact = 0; // this array shall contain the artefacts if any $myartefacts = array(); // does the cave contain an artefact at least? if ($details['artefacts'] > 0) { // get artefacts $myartefacts = artefact_getArtefactsReadyForMovement($caveID); $moveArtefactID = Request::getVar('myartefacts', 0); // was an artefact chosen? if ($moveArtefactID > 0) { // now check, whether this artefactID belongs to this cave foreach ($myartefacts as $key => $value) { // if found, set it if ($moveArtefactID == $value['artefactID']) { $moveArtefact = $moveArtefactID; break; } } } } // now $moveArtefact should contain 0 for 'move no artefact' // or the artefactID of the artefact to be moved /***************************************************************************/ /***************************************************************************/ /***************************************************************************/ /** * HERO MOVEMENT */ $moveHero = 0; if ($details['hero'] != 0) { $hero = getHeroByPlayer($_SESSION['player']->playerID); if ($hero['isAlive'] != 1) { $details['hero'] = 0; } } if ($details['hero'] != 0 && Request::getVar('moveHero', false) == true) { $moveHero = $details['hero']; } /** * END HERO MOVEMENTS */ // put user, its session and nogfx flag into session $_SESSION['player'] = Player::getPlayer($_SESSION['player']->playerID); // get Map Size $size = getMapSize(); $dim_x = ($size['maxX'] - $size['minX'] + 1) / 2; $dim_y = ($size['maxY'] - $size['minY'] + 1) / 2; $foodPerCave = eval('return ' . formula_parseToPHP(GameConstants::MOVEMENT_COST . ';', '$details')); $minutesPerCave = eval('return ' . formula_parseToPHP(GameConstants::MOVEMENT_SPEED . ';', '$details')); $minutesPerCave *= MOVEMENT_TIME_BASE_FACTOR / 60; if (Request::getVar('moveit', false) && sizeof(Request::getVar('unit', array('' => '')))) { $targetXCoord = Request::getVar('targetXCoord', 0); $targetYCoord = Request::getVar('targetYCoord', 0); $targetCaveName = Request::getVar('targetCaveName', ''); $targetCaveID = Request::getVar('targetCaveID', 0); $movementID = Request::getVar('movementID', 0); // check for scripters check_timestamp(Request::getVar('tstamp', 0)); $validCaveName = false; // targetCaveID >>> coords if ($targetCaveID > 0) { $result = getCaveByID(intval($targetCaveID)); if (sizeof($result) != 0) { $targetXCoord = $result['xCoord']; $targetYCoord = $result['yCoord']; $validCaveName = true; } // name >>> coords } else { if ($targetCaveName != "") { $result = getCaveByName($targetCaveName); if (sizeof($result) != 0) { $targetXCoord = $result['xCoord']; $targetYCoord = $result['yCoord']; $validCaveName = true; } } } // get target player $result = getCaveByCoords(intval($targetXCoord), intval($targetYCoord)); if (sizeof($result) != 0) { $targetPlayer = new Player(getPlayerByID($result['playerID'])); } // Array von Nullwerten befreien $unit = array_filter(Request::getVar('unit', array('' => '')), "filterZeros"); $unit = array_map("checkFormValues", $unit); $resource = array_map("checkFormValues", Request::getVar('rohstoff', array('' => ''))); // Test, ob Einheitentragekapazität ausgelastet $overloaded = 0; foreach ($resource as $resKey => $aRes) { $capacity = 0; foreach ($unit as $unitKey => $aUnit) { if (isset($GLOBALS['unitTypeList'][$unitKey]->encumbranceList[$resKey])) { $capacity += $aUnit * $GLOBALS['unitTypeList'][$unitKey]->encumbranceList[$resKey]; } } if ($capacity < $aRes) { $overloaded = 1; break; } } $denymovement_nonenemy = false; $denymovement_targetwar = false; if ($movementID == 2) { // move units/resources if (strtoupper($targetPlayer->tribe) != strtoupper($_SESSION['player']->tribe)) { //may tade in own tribe $ownTribe = $_SESSION['player']->tribe; $targetTribe = $targetPlayer->tribe; $targetIsNonPlayer = $targetPlayer->playerID == 0; $ownTribeAtWar = tribe_isAtWar($ownTribe, TRUE); $targetTribeAtWar = tribe_isAtWar($targetTribe, TRUE); $TribesMayTrade = relation_areAllies($ownTribe, $targetTribe) || relation_areEnemys($ownTribe, $targetTribe) || $targetIsNonPlayer; $denymovement_nonenemy = $ownTribeAtWar && !$TribesMayTrade; $denymovement_targetwar = $targetTribeAtWar && !$TribesMayTrade; } } // check if army is small enough for hero $denymovement_hero = false; if ($moveHero && (Request::getVar('movementID', 0) == 3 || Request::getVar('movementID', 0) == 6)) { //calculate size of army $armySize = 0; foreach ($unit as $unitID => $value) { $armySize += $GLOBALS['unitTypeList'][$unitID]->hitPoints * $value; } if ($armySize > $hero['exp']) { $denymovement_hero = true; } } if (Request::getVar('movementID', 0) == 0) { $msg = array('type' => 'error', 'message' => _('Bitte Bewegungsart auswählen!')); $moveHero = 0; } else { if (!sizeof($unit)) { $msg = array('type' => 'error', 'message' => _('Es sind keine Einheiten ausgewählt!')); $moveHero = 0; } else { if (($targetXCoord == 0 || $targetYCoord == 0) && $targetCaveName == "") { $msg = array('type' => 'error', 'message' => _('Es fehlt eine Zielkoordinate oder ein Zielhöhlenname!')); $moveHero = 0; } else { if (($targetXCoord == 0 || $targetYCoord == 0) && !($targetCaveName == "") && $validCaveName === FALSE) { $msg = array('type' => 'error', 'message' => sprintf(_('Es gibt keine Höhle mit dem Namen "%s"!'), $targetCaveName)); $moveHero = 0; } else { if ($overloaded) { $msg = array('type' => 'error', 'message' => _('Deine Krieger können die Menge an Ressourcen nicht tragen!!')); $moveHero = 0; } else { if (beginner_isCaveProtectedByCoord($targetXCoord, $targetYCoord)) { $msg = array('type' => 'error', 'message' => _('Die Zielhöhle steht unter Anfängerschutz.')); $moveHero = 0; } else { if (beginner_isCaveProtectedByID($caveID)) { $msg = array('type' => 'error', 'message' => _('Ihre Höhle steht unter Anfängerschutz. Sie können den Schutz sofort unter dem Punkt <a href="?modus=cave_detail">Bericht über diese Höhle</a> beenden')); $moveHero = 0; } else { if (Request::getVar('movementID', 0) == 6 && cave_isCaveSecureByCoord($targetXCoord, $targetYCoord)) { $msg = array('type' => 'error', 'message' => _('Sie können diese Höhle nicht übernehmen. Sie ist gegen übernahmen geschützt.')); $moveHero = 0; } else { if ($denymovement_nonenemy) { $msg = array('type' => 'error', 'message' => _('Sie können im Krieg keine Einheiten zu unbeteiligten Parteien verschieben!')); } else { if ($denymovement_targetwar) { $msg = array('type' => 'error', 'message' => _('Sie können keine Einheiten zu kriegführenden Stämmen verschieben, wenn Sie unbeteiligt sind.')); $moveHero = 0; } else { if ($denymovement_hero) { $msg = array('type' => 'error', 'message' => _('Die Armee ist zu groß um vom Helden unterstützt zu werden!')); $moveHero = 0; } else { // Entfernung x Dauer pro Höhle x größter Geschwindigkeitsfaktor x Bewegungsfaktor $duration = ceil(getDistanceByCoords($details['xCoord'], $details['yCoord'], $targetXCoord, $targetYCoord) * $minutesPerCave * getMaxSpeedFactor($unit) * $ua_movements[$movementID]->speedfactor); $distance = ceil(getDistanceByCoords($details['xCoord'], $details['yCoord'], $targetXCoord, $targetYCoord)); $tmpdist = 0; $i = 0; if ($distance > 15) { $distance = $distance - 15; $tmpdist = 15; if (floor($distance / 5) < 11) { $tmpdist += $distance % 5 * (1 - 0.1 * floor($distance / 5)); } for ($i = 1; $i <= floor($distance / 5) && $i < 11; $i++) { $tmpdist += 5 * (1 - 0.1 * ($i - 1)); } } else { $tmpdist = $distance; } // Dauer x Rationen x Größe einer Ration x Bewegungsfaktor $reqFood = ceil($tmpdist * $minutesPerCave * getMaxSpeedFactor($unit) * $ua_movements[$movementID]->speedfactor * calcRequiredFood($unit) * $foodPerCave * $ua_movements[$movementID]->foodfactor); if ($details[$GLOBALS['resourceTypeList'][GameConstants::FUEL_RESOURCE_ID]->dbFieldName] < $reqFood) { $msg = array('type' => 'error', 'message' => _('Nicht genug Nahrung zum Ernähren der Krieger auf ihrem langen Marsch vorhanden!')); } else { $msgID = setMovementEvent($caveID, $details, $targetXCoord, $targetYCoord, $unit, $resource, $movementID, $reqFood, $duration, $moveArtefact, $moveHero, $minutesPerCave * $ua_movements[$movementID]->speedfactor); switch ($msgID) { case 0: $msg = array('type' => 'success', 'message' => sprintf(_('Die Krieger wurden losgeschickt und haben %d Nahrung mitgenommen!'), $reqFood)); $safeForm = false; break; case 1: $msg = array('type' => 'error', 'message' => _('In diesen Koordinaten liegt keine Höhle!')); $moveHero = 0; break; case 2: $msg = array('type' => 'error', 'message' => _('Für diese Bewegung sind nicht genügend Einheiten/Rohstoffe verfügbar!')); $moveHero = 0; break; case 3: $msg = array('type' => 'error', 'message' => _('Schwerer Fehler: Bitte Admin kontaktieren!')); $moveHero = 0; break; } } } } } } } } } } } } } } else { if (Request::isPost('action') && Request::getVar('action', '') == 'cancel' && ($eventID = Request::getVar('eventID', 0))) { $msgID = reverseMovementEvent($caveID, $eventID); switch ($msgID) { case 0: $msg = array('type' => 'success', 'message' => _('Die Einheiten kehren zurück!')); break; case 1: $msg = array('type' => 'error', 'message' => _('Fehler bei der Rückkehr!')); break; } } else { if (Request::getVar('moveit', false) && !sizeof(Request::getVar('unit', array('' => '')))) { $msg = array('type' => 'error', 'message' => _('Einheiten mitnehmen?')); } } } // refresh this cave $temp = getCaveSecure($caveID, $_SESSION['player']->playerID); $ownCave[$caveID] = $details = $temp; // make sure that bagged artefacts are not shown again if ($moveArtefact != 0) { $myartefacts = artefact_getArtefactsReadyForMovement($caveID); } // make sure that moved hero is not shown again if ($moveHero != 0) { $details['hero'] = 0; } // ////////////////////////////////////////////////////////////// // Create the page // ////////////////////////////////////////////////////////////// // open template $template->setFile('unitMovement.tmpl'); $template->addVars(array('currentX' => $details['xCoord'], 'currentY' => $details['yCoord'], 'dim_x' => $dim_x, 'dim_y' => $dim_y, 'speed' => $minutesPerCave, 'fuel_id' => GameConstants::FUEL_RESOURCE_ID, 'fuel_name' => $GLOBALS['resourceTypeList'][GameConstants::FUEL_RESOURCE_ID]->name, 'movement_cost_constant' => $foodPerCave, 'resource_types' => GameConstants::MAX_RESOURCE, 'status_msg' => isset($msg) ? $msg : '')); // movements $selectable_movements = array(); foreach ($ua_movements as $value) { if ($value->playerMayChoose) { $selectable_movements[] = get_object_vars($value); } } $template->addVar('selectable_movements', $selectable_movements); // resources $resources = array(); foreach ($GLOBALS['resourceTypeList'] as $resourceID => $dummy) { if (!$GLOBALS['resourceTypeList'][$resourceID]->nodocumentation) { $resources[] = array('resource_id' => $GLOBALS['resourceTypeList'][$resourceID]->resourceID, 'name' => $GLOBALS['resourceTypeList'][$resourceID]->name, 'current_amount' => "0" + $details[$GLOBALS['resourceTypeList'][$resourceID]->dbFieldName], 'dbFieldName' => $GLOBALS['resourceTypeList'][$resourceID]->dbFieldName, 'value' => $safeForm && isset($resource[$resourceID]) && $resource[$resourceID] > 0 ? $resource[$resourceID] : ''); } } $template->addVar('resource', $resources); // units table $unitprops = array(); $units = array(); foreach ($GLOBALS['unitTypeList'] as $unitID => $dummy) { // if no units of this type, next type if (!$details[$GLOBALS['unitTypeList'][$unitID]->dbFieldName]) { continue; } $temp = array(); $encumbrance = array(); foreach ($GLOBALS['resourceTypeList'] as $resourceID => $dummy) { if (!$GLOBALS['resourceTypeList'][$resourceID]->nodocumentation) { $encumbrance[$resourceID] = array('resourceID' => $resourceID, 'load' => "0" + (isset($GLOBALS['unitTypeList'][$unitID]->encumbranceList[$resourceID]) ? $GLOBALS['unitTypeList'][$unitID]->encumbranceList[$resourceID] : 0)); $temp[] = "0" + (isset($GLOBALS['unitTypeList'][$unitID]->encumbranceList[$resourceID]) ? $GLOBALS['unitTypeList'][$unitID]->encumbranceList[$resourceID] : 0); } } $units[] = array('name' => $GLOBALS['unitTypeList'][$unitID]->name, 'unit_id' => $unitID, 'food_cost' => $GLOBALS['unitTypeList'][$unitID]->foodCost, 'resource_load' => implode(",", $temp), 'speed_factor' => $GLOBALS['unitTypeList'][$unitID]->wayCost, 'max_unit_count' => $details[$GLOBALS['unitTypeList'][$unitID]->dbFieldName], 'encumbrance' => $encumbrance, 'hitPoints' => $GLOBALS['unitTypeList'][$unitID]->hitPoints, 'value' => $safeForm && isset($unit[$unitID]) ? $unit[$unitID] : ''); } $template->addVar('unit_list', $units); // weitergereichte Koordinaten if (!Request::getVar('movementID', 0) || $safeForm) { if (Request::getVar('targetCaveID', 0) > 0) { $caveData = getCaveByID(Request::getVar('targetCaveID', 0)); $template->addVars(array('target_x_coord' => $caveData['xCoord'], 'target_y_coord' => $caveData['yCoord'], 'target_cave_name' => $caveData['name'])); } else { $template->addVars(array('target_x_coord' => Request::getVar('targetXCoord', ''), 'target_y_coord' => Request::getVar('targetYCoord', ''), 'target_cave_name' => Request::getVar('targetCaveName', ''))); } } // weitere Paramter $template->addVar('params', array(array('name' => 'modus', 'value' => UNIT_MOVEMENT), array('name' => 'moveit', 'value' => 'true'), array('name' => 'trigger', 'value' => 'self'), array('name' => 'tstamp', 'value' => "" . time()))); $movements = digest_getMovements(array($caveID => $details), array(), true); $ownMovement = $oppMovement = array(); foreach ($movements as $move) { if ($move['isOwnMovement']) { $ownMovement[] = $move; } else { $oppMovement[] = $move; } } $template->addVars(array('ownMovement' => $ownMovement, 'oppMovement' => $oppMovement)); // artefakte if (sizeof($myartefacts) != 0) { //tmpl_set($template, '/ARTEFACTS/ARTEFACT', $myartefacts); $template->addVar('artefact', $myartefacts); } // hero if ($details['hero'] != 0) { $template->addVar('hero', $hero); } // Module "CaveBookmarks" Integration // FIXME should know whether the module is installed if (TRUE) { // get model $cb_model = new CaveBookmarks_Model(); // get bookmarks $bookmarks = $cb_model->getCaveBookmarks(true); // set bookmarks if (sizeof($bookmarks)) { $template->addVar('bookmarks_cave', $bookmarks); } } }
function effect_getEffectWonderDetailContent($caveID, $caveData) { global $buildingTypeList, $defenseSystemTypeList, $resourceTypeList, $scienceTypeList, $unitTypeList, $wonderTypeList, $effectTypeList, $terrainList, $config, $params, $db; // don't show the resource bar $no_resource_flag = 1; // open the template $template = @tmpl_open('./templates/' . $config->template_paths[$params->SESSION->user['template']] . '/effectWonderDetail.ihtml'); $wonders = wonder_getActiveWondersForCaveID($caveID, $db); $wondersData = array(); if ($wonders) { foreach ($wonders as $key => $data) { $wonderData = array("name" => $wonderTypeList[$data['wonderID']]->name, "end" => $data['end_time']); $effectsData = array(); // iterating through effectTypes foreach ($effectTypeList as $effect) { if ($value = $data[$effect->dbFieldName] + 0) { $effectsData[] = array("name" => $effect->name, "value" => ($value > 0 ? "+" : "") . $value); } } // iterating through resourceTypes foreach ($resourceTypeList as $resource) { if ($value = $data[$resource->dbFieldName] + 0) { $effectsData[] = array("name" => $resource->name, "value" => ($value > 0 ? "+" : "") . $value); } } // iterating through buildingTypes foreach ($buildingTypeList as $building) { if ($value = $data[$building->dbFieldName] + 0) { $effectsData[] = array("name" => $building->name, "value" => ($value > 0 ? "+" : "") . $value); } } // iterating through scienceTypes foreach ($scienceTypeList as $science) { if ($value = $data[$science->dbFieldName] + 0) { $effectsData[] = array("name" => $science->name, "value" => ($value > 0 ? "+" : "") . $value); } } // iterating through unitTypes foreach ($unitTypeList as $unit) { if ($value = $data[$unit->dbFieldName] + 0) { $effectsData[] = array("name" => $unit->name, "value" => ($value > 0 ? "+" : "") . $value); } } // iterating through defenseSystemTypes foreach ($defenseSystemTypeList as $defenseSystem) { if ($value = $data[$defenseSystem->dbFieldName] + 0) { $effectsData[] = array("name" => $defenseSystem->name, "value" => ($value > 0 ? "+" : "") . $value); } } $wonderData['EFFECT'] = $effectsData; $wondersData[] = $wonderData; } // end iterating through active wonders } // ADDED by chris--- for terrain effects **************************** global $effect, $effectname; $terraineffectData = array(); $cave = getCaveByID($caveID); $terrainvalue = $cave['terrain']; $terraineffectsData[] = array("name" => $terrainList[$terrainvalue]['name'] . ":", "value" => ""); for ($t = 0; $t < count($effect[$terrainvalue]); $t++) { $effectvalue = explode(" = ", $effect[$terrainvalue][$t]); $effectkey[$t] = $effectvalue[0]; $effectv[$t] = substr($effectvalue[1], 1, -1); $terraineffectsData[] = array("name" => $effectname[$terrainvalue][$t], "value" => $effectv[$t]); } // ******************************************************************* // ADDED by chris--- for leadership $leadermultiplier = 0; if ($caveData['science_faith'] > 0) { $leadermultiplier = $caveData['building_leader'] * 0.05 + 1 * ($caveData['building_betterleader'] * 0.1) + 1; } if ($caveData['science_darkness'] > 0) { $leadermultiplier = $caveData['building_orcleader'] * 0.05 + 1 * ($caveData['building_betterorcleader'] * 0.1) + 1; } if ($caveData['science_hex'] > 0) { $leadermultiplier = $caveData['building_soeldnerleader'] * 0.05 + 1 * ($caveData['building_bettersoeldnerleader'] * 0.1) + 1; } // ----------------------------------------- $effectsData = array(); foreach ($effectTypeList as $data) { $value = $caveData[$data->dbFieldName] + 0; // ADDED by chris--- for leadership if ($leadermultiplier > 0) { if ($data->dbFieldName == "effect_rangeattack_factor") { if ($value > 0) { $value = $value * $leadermultiplier; } else { $value = $leadermultiplier - 1; } } if ($data->dbFieldName == "effect_arealattack_factor") { if ($value > 0) { $value = $value * $leadermultiplier; } else { $value = $leadermultiplier - 1; } } if ($data->dbFieldName == "effect_attackrate_factor") { if ($value > 0) { $value = $value * $leadermultiplier; } else { $value = $leadermultiplier - 1; } } if ($data->dbFieldName == "effect_defenserate_factor") { if ($value > 0) { $value = $value * $leadermultiplier; } else { $value = $leadermultiplier - 1; } } if ($data->dbFieldName == "effect_ranged_damage_resistance_factor") { if ($value > 0) { $value = $value * $leadermultiplier; } else { $value = $leadermultiplier - 1; } } } // --------------------------------------------- for ($t = 0; $t < count($effect[$terrainvalue]); $t++) { if ($data->dbFieldName == $effectkey[$t]) { $value = $value - $effectv[$t]; } } if ($value) { $effectsData[] = array("name" => $data->name, "value" => $value); } } // end iterating through effectTypes $data = array(); if (!sizeof($wondersData)) { $data['NOWONDER'] = array('dummy' => ""); } else { $data['WONDER'] = $wondersData; } if (!sizeof($effectsData)) { $data['NOEFFECT'] = array('dummy' => ""); } else { $data['EFFECT'] = $effectsData; } if (sizeof($terraineffectsData) < 2) { $data['TERRAINNOEFFECT'] = array('dummy' => ""); } else { $data['TERRAINEFFECT'] = $terraineffectsData; } tmpl_set($template, "/", $data); return tmpl_parse($template); }
function getCaveMapContent() { global $params, $config, $terrainList; // template öffnen $template = tmpl_open('./templates/map.ihtml'); // Grundparameter setzen tmpl_set($template, 'modus', MAP); // Koordinaten eingegeben ? if (isset($params->xCoord) && isset($params->yCoord)) { $xCoord = $params->xCoord; $yCoord = $params->yCoord; } else { $xCoord = 1; $yCoord = 1; } // Größe der Karte wird benötigt $mapSize = getMapSize(); // wenn in die Minimap geklickt wurde, zoome hinein if (!empty($params->POST->minimap_x) && !empty($params->POST->minimap_y) && $params->POST->scaling != 0) { $xCoord = Floor($params->POST->minimap_x * 100 / $params->POST->scaling) + $mapSize['minX']; $yCoord = Floor($params->POST->minimap_y * 100 / $params->POST->scaling) + $mapSize['minY']; } else { if (!empty($params->POST->caveName)) { $coords = getCaveByName($params->POST->caveName); if (sizeof($coords) == 0) { $message = 'Die Höhle mit dem Namen: "' . $params->POST->caveName . '" konnte nicht gefunden werden!'; } else { $xCoord = $coords['xCoord']; $yCoord = $coords['yCoord']; $message = 'Die Höhle mit dem Namen: "' . $params->POST->caveName . '" befindet sich in (' . $xCoord . ' | ' . $yCoord . ').'; } } else { if (!empty($params->POST->targetCaveID)) { $coords = getCaveByID($params->POST->targetCaveID); if ($coords === null) { $message = 'Die Höhle mit der ID: "' . $params->POST->targetCaveID . '" konnte nicht gefunden werden!'; } else { $xCoord = $coords['xCoord']; $yCoord = $coords['yCoord']; $message = 'Die Höhle mit der ID: "' . $params->POST->targetCaveID . '" befindet sich in (' . $xCoord . ' | ' . $yCoord . ').'; } } else { if (!empty($params->POST->xCoord) && !empty($params->POST->yCoord)) { $xCoord = $params->POST->xCoord; $yCoord = $params->POST->yCoord; } } } } if (isset($messageID)) { tmpl_set($template, '/MESSAGE/message', $message); } // Koordinaten begrenzen if ($xCoord < $mapSize['minX']) { $xCoord = $mapSize['minX']; } if ($yCoord < $mapSize['minY']) { $yCoord = $mapSize['minY']; } if ($xCoord > $mapSize['maxX']) { $xCoord = $mapSize['maxX']; } if ($yCoord > $mapSize['maxY']) { $yCoord = $mapSize['maxY']; } // width und height anpassen $mapwidth = isset($params->width) ? intval($params->width) : MAPWIDTH; $mapheight = isset($params->height) ? intval($params->height) : MAPHEIGHT; $MAP_WIDTH = min($mapwidth, $mapSize['maxX'] - $mapSize['minX'] + 1); $MAP_HEIGHT = min($mapheight, $mapSize['maxY'] - $mapSize['minY'] + 1); // Nun befinden sich in $xCoord und $yCoord die gesuchten Koordinaten. // ermittele nun die linke obere Ecke des Bildausschnittes $minX = min(max($xCoord - intval($MAP_WIDTH / 2), $mapSize['minX']), $mapSize['maxX'] - $MAP_WIDTH + 1); $minY = min(max($yCoord - intval($MAP_HEIGHT / 2), $mapSize['minY']), $mapSize['maxY'] - $MAP_HEIGHT + 1); // ermittele nun die rechte untere Ecke des Bildausschnittes $maxX = $minX + $MAP_WIDTH - 1; $maxY = $minY + $MAP_HEIGHT - 1; // get the map details $caveDetails = getCaveDetailsByCoords($minX, $minY, $maxX, $maxY); $map = array(); foreach ($caveDetails as $cave) { $cell = array('terrain' => strtolower($terrainList[$cave['terrain']]['name']), 'alt' => "{$cave['cavename']} - ({$cave['xCoord']}|{$cave['yCoord']})", 'link' => "modus=" . MAP_DETAIL . "&targetCaveID={$cave['caveID']}"); // unbewohnte Höhle if ($cave['playerID'] == 0) { // als Frei! zeigen, wenn man missionieren kann if (sizeof($caves) < $params->SESSION->user['takeover_max_caves'] && $cave['takeoverable'] == 1) { $text = "Frei!"; $file = "icon_cave_empty"; // als Einöde zeigen, wenn man nicht mehr missionieren kann } else { $text = "Einöde"; $file = "icon_waste"; } // bewohnte Höhle } else { // eigene Höhle if ($cave['playerID'] == $params->SESSION->user['playerID']) { $file = "icon_cave_own"; } else { $file = "icon_cave_other"; } // mit Artefakt if ($cave['artefacts'] != 0 && ($cave['tribe'] != GOD_ALLY || $params->SESSION->user['tribe'] == GOD_ALLY)) { $file .= "_artefact"; } // link zum Tribe einfügen $cell['link_tribe'] = "modus=" . TRIBE_DETAIL . "&tribe=" . urlencode(unhtmlentities($cave['tribe'])); // Stamm abkürzen $decodedTribe = unhtmlentities($cave['tribe']); if (strlen($decodedTribe) > 10) { $cell['text_tribe'] = htmlentities(substr($decodedTribe, 0, 8)) . ".."; } else { $cell['text_tribe'] = $cave['tribe']; } // Besitzer $decodedOwner = unhtmlentities($cave['name']); if (strlen($decodedOwner) > 10) { $text = htmlentities(substr($decodedOwner, 0, 8)) . ".."; } else { $text = $cave['name']; } // übernehmbare Höhlen können gekennzeichnet werden if ($cave['secureCave'] != 1) { $cell['unsecure'] = array('dummy' => ''); } } $cell['file'] = $file; $cell['text'] = $text; // Wenn die Höhle ein Artefakt enthält und man berechtigt ist -> anzeigen if ($cave['artefacts'] != 0 && ($cave['tribe'] != GOD_ALLY || $params->SESSION->user['tribe'] == GOD_ALLY)) { $cell['artefacts'] = $cave['artefacts']; $cell['artefacts_text'] = "Artefakte: {$cave['artefacts']}"; } $map[$cave['xCoord']][$cave['yCoord']] = $cave; } // Karte mit Beschriftungen ausgeben // über alle Zeilen for ($j = $minY - 1; $j <= $maxY + 1; ++$j) { tmpl_iterate($template, '/ROWS'); // über alle Spalten for ($i = $minX - 1; $i <= $maxX + 1; ++$i) { tmpl_iterate($template, '/ROWS/CELLS'); // leere Zellen if (($j == $minY - 1 || $j == $maxY + 1) && ($i == $minX - 1 || $i == $maxX + 1)) { tmpl_set($template, "/ROWS/CELLS", getEmptyCell()); // x-Beschriftung } else { if ($j == $minY - 1 || $j == $maxY + 1) { tmpl_set($template, "/ROWS/CELLS", getLegendCell('x', $i)); // y-Beschriftung } else { if ($i == $minX - 1 || $i == $maxX + 1) { tmpl_set($template, "/ROWS/CELLS", getLegendCell('y', $j)); // Kartenzelle } else { tmpl_set($template, "/ROWS/CELLS", getMapCell($map, $i, $j)); } } } } } $width = $mapSize['maxX'] - $mapSize['minX'] + 1; $height = $mapSize['maxY'] - $mapSize['minY'] + 1; // compute mapcenter coords $mcX = $minX + intval($MAP_WIDTH / 2); $mcY = $minY + intval($MAP_HEIGHT / 2); tmpl_set($template, "/MINIMAP", array('file' => "images/minimap.png.php?x=" . $xCoord . "&y=" . $yCoord, 'modus' => MAP, 'width' => intval($width * MINIMAP_SCALING / 100), 'height' => intval($height * MINIMAP_SCALING / 100), 'scaling' => MINIMAP_SCALING)); tmpl_set($template, '/O', array('modus' => MAP, 'x' => $mcX + $MAP_WIDTH, 'y' => $mcY)); tmpl_set($template, '/SO', array('modus' => MAP, 'x' => $mcX + $MAP_WIDTH, 'y' => $mcY + $MAP_HEIGHT)); tmpl_set($template, '/S', array('modus' => MAP, 'x' => $mcX, 'y' => $mcY + $MAP_HEIGHT)); tmpl_set($template, '/SW', array('modus' => MAP, 'x' => $mcX - $MAP_WIDTH, 'y' => $mcY + $MAP_HEIGHT)); tmpl_set($template, '/W', array('modus' => MAP, 'x' => $mcX - $MAP_WIDTH, 'y' => $mcY)); tmpl_set($template, '/NW', array('modus' => MAP, 'x' => $mcX - $MAP_WIDTH, 'y' => $mcY - $MAP_HEIGHT)); tmpl_set($template, '/N', array('modus' => MAP, 'x' => $mcX, 'y' => $mcY - $MAP_HEIGHT)); tmpl_set($template, '/NO', array('modus' => MAP, 'x' => $mcX + $MAP_WIDTH, 'y' => $mcY - $MAP_HEIGHT)); return tmpl_parse($template); }
function effect_getEffectWonderDetailContent($caveID, $caveData) { global $buildingTypeList, $defenseSystemTypeList, $resourceTypeList, $scienceTypeList, $unitTypeList, $wonderTypeList, $effectTypeList, $terrainList, $config, $params, $db; // don't show the resource bar $no_resource_flag = 1; // open the template $template = tmpl_open($params->SESSION->player->getTemplatePath() . 'effectWonderDetail.ihtml'); $wonders = wonder_getActiveWondersForCaveID($caveID, $db); $wondersData = array(); if ($wonders) { foreach ($wonders as $key => $data) { if ($wonderTypeList[$data['wonderID']]->groupID == 0 or $wonderTypeList[$data['wonderID']]->groupID == 3) { $wonderData = array("name" => $wonderTypeList[$data['wonderID']]->name, "end" => $data['end_time']); $effectsData = array(); // iterating through effectTypes foreach ($effectTypeList as $effect) { if ($value = $data[$effect->dbFieldName] + 0) { $effectsData[] = array("name" => $effect->name, "value" => ($value > 0 ? "+" : "") . $value); } } // iterating through resourceTypes foreach ($resourceTypeList as $resource) { if ($value = $data[$resource->dbFieldName] + 0) { $effectsData[] = array("name" => $resource->name, "value" => ($value > 0 ? "+" : "") . $value); } } // iterating through buildingTypes foreach ($buildingTypeList as $building) { if ($value = $data[$building->dbFieldName] + 0) { $effectsData[] = array("name" => $building->name, "value" => ($value > 0 ? "+" : "") . $value); } } // iterating through scienceTypes foreach ($scienceTypeList as $science) { if ($value = $data[$science->dbFieldName] + 0) { $effectsData[] = array("name" => $science->name, "value" => ($value > 0 ? "+" : "") . $value); } } // iterating through unitTypes foreach ($unitTypeList as $unit) { if ($value = $data[$unit->dbFieldName] + 0) { $effectsData[] = array("name" => $unit->name, "value" => ($value > 0 ? "+" : "") . $value); } } // iterating through defenseSystemTypes foreach ($defenseSystemTypeList as $defenseSystem) { if ($value = $data[$defenseSystem->dbFieldName] + 0) { $effectsData[] = array("name" => $defenseSystem->name, "value" => ($value > 0 ? "+" : "") . $value); } } $wonderData['EFFECT'] = $effectsData; $wondersData[] = $wonderData; } } // end iterating through active wonders } // ADDED by chris--- for terrain effects **************************** global $effect, $effectname; $terraineffectData = array(); $cave = getCaveByID($caveID); $terrainvalue = $cave['terrain']; $terraineffectsData[] = array("name" => $terrainList[$terrainvalue]['name'] . ":", "value" => ""); for ($t = 0; $t < count($effect[$terrainvalue]); $t++) { $effectvalue = explode(" = ", $effect[$terrainvalue][$t]); $effectkey[$t] = $effectvalue[0]; $effectv[$t] = substr($effectvalue[1], 1, -1); $terraineffectsData[] = array("name" => $effectname[$terrainvalue][$t], "value" => $effectv[$t]); } // ******************************************************************* $effectsData = array(); foreach ($effectTypeList as $data) { $value = $caveData[$data->dbFieldName] + 0; if ($value) { $effectsData[] = array("name" => $data->name, "value" => $value); } } // end iterating through effectTypes $data = array(); if (!sizeof($wondersData)) { $data['NOWONDER'] = array('dummy' => ""); } else { $data['WONDER'] = $wondersData; } if (!sizeof($effectsData)) { $data['NOEFFECT'] = array('dummy' => ""); } else { $data['EFFECT'] = $effectsData; } if (sizeof($terraineffectsData) < 2) { $data['TERRAINNOEFFECT'] = array('dummy' => ""); } else { $data['TERRAINEFFECT'] = $terraineffectsData; } // put user, its session and nogfx flag into session $_SESSION['player'] = Player::getPlayer($params->SESSION->player->playerID); $params->SESSION->player = $_SESSION['player']; $data['farmpoints'] = $params->SESSION->player->fame; $data['rules_path'] = RULES_PATH; tmpl_set($template, "/", $data); return tmpl_parse($template); }
function takeover_transfer_cave_to($caveID, $playerID) { global $db, $scienceTypeList; // check parameters $caveID = intval($caveID); $playerID = intval($playerID); // get player $winner = getPlayerByID($playerID); if (!sizeof($winner)) { echo "ERROR (takeover_transfer_cave_to): Could not transfer Cave {$caveID} to Player {$playerID}.\n"; return FALSE; } // secureCaveCredits $hasCredits = $winner['secureCaveCredits'] > 0 ? 1 : 0; // transfer cave to player $query = "UPDATE Cave SET playerID = {$playerID}, takeoverable = 0, " . "secureCave = '{$hasCredits}' WHERE caveID = {$caveID}"; if (!DEBUG) { if (!$db->query($query)) { echo "ERROR (takeover_transfer_cave_to): Could not update Cave {$caveID}.\n"; return FALSE; } } else { echo "DEBUG: {$query} \n"; } // update secureCaveCredits $query = "UPDATE Player SET secureCaveCredits = GREATEST(0, secureCaveCredits - 1) " . "WHERE playerID = {$playerID}"; if (!DEBUG) { if (!$db->query($query)) { echo "ERROR (takeover_transfer_cave_to): Could not update secureCaveCredits of Player {$playerID}.\n"; return FALSE; } } else { echo "DEBUG: {$query} \n"; } // copy sciences if (sizeof($scienceTypeList)) { $set = array(); foreach ($scienceTypeList as $science) { $temp = $science->dbFieldName; $set[] = "{$temp} = '{$winner[$temp]}'"; } $set = implode(", ", $set); $query = "UPDATE Cave SET {$set} WHERE playerID = {$playerID}"; if (!DEBUG) { if (!$db->query($query)) { echo "ERROR (takeover_transfer_cave_to): Could not update sciences of Player {$playerID}.\n"; return FALSE; } } else { echo "DEBUG: {$query} \n"; } } // get the cave's data $cave = getCaveByID($caveID); takeover_send_transfer($playerID, $cave); }
function getCaveReport($caveID, $ownCaves, $targetCaveID, $method) { global $template; if (!$targetCaveID) { $template->throwError('Es wurde keine Höhle ausgewählt.'); return; } if ($method == 'ajax') { $shortVersion = true; $template->setFile('mapDetailAjax.tmpl'); } else { $shortVersion = false; $template->setFile('mapDetail.tmpl'); } $cave = getCaveByID($targetCaveID); $caveDetails = array(); $playerDetails = array(); $showArtePossible = false; if ($cave['playerID'] != 0) { $caveDetails = getCaves($cave['playerID']); $playerDetails = getPlayerByID($cave['playerID']); $showArtePossible = $playerDetails['tribe'] != GOD_ALLY ? true : false; } $cave['terrain_name'] = $GLOBALS['terrainList'][$cave['terrain']]['name']; $cave['terrain_img'] = $GLOBALS['terrainList'][$cave['terrain']]['img']; $region = getRegionByID($cave['regionID']); if ($cave['artefacts'] != 0 && ($showArtePossible || $_SESSION['player']->tribe == GOD_ALLY)) { $cave['artefact'] = true; } $template->addVar('cave_details', $cave); if ($cave['playerID'] != 0) { $template->addVar('player_details', $playerDetails); /**************************************************************************************************** * * Alle Höhlen des Spielers ausgeben * ****************************************************************************************************/ $caves = array(); foreach ($caveDetails as $key => $value) { $temp = array('caveName' => $value['name'], 'xCoord' => $value['xCoord'], 'yCoord' => $value['yCoord'], 'terrain' => $GLOBALS['terrainList'][$value['terrain']]['name'], 'caveSize' => floor($value[CAVE_SIZE_DB_FIELD] / 50) + 1, 'secureCave' => $value['secureCave']); if ($value['artefacts'] != 0 && ($playerDetails['tribe'] != GOD_ALLY || $_SESSION['player']->tribe == GOD_ALLY)) { $temp['artefact'] = true; } $caves[] = $temp; } $template->addVar('player_caves', $caves); } else { if (sizeof($ownCaves) < $_SESSION['player']->takeover_max_caves && $cave['takeoverable'] == 1) { $template->addVar('takeoverable', true); } } }
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 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); }
require_once "include/config.inc.php"; require_once "include/params.inc.php"; require_once "include/db.inc.php"; require_once "include/basic.lib.php"; // init request class $request = new Request(); $caveID = $request->getVar('cave_id', 0); if ($caveID == 0) { exit(1); } $filename = "temp/{$caveID}.png"; if (!file_exists($filename)) { define("NAME_LENGTH", 21); $config = new Config(); $db = DbConnect(); $cave = getCaveByID($caveID); if ($cave === 0) { exit(1); } $name = unhtmlentities($cave['name']); if (strlen($cave['name']) > NAME_LENGTH) { $cave['name'] = substr($cave['name'], 0, NAME_LENGTH - 2) . ".."; } /* Create imagickdraw object */ $draw = new ImagickDraw(); /* Annotate some text */ $draw->setFontSize(13); $draw->annotation(5, 20, "{$cave['name']}"); $draw->setFontSize(10); $draw->annotation(5, 33, "({$cave['xCoord']}|{$cave['yCoord']})"); /* Create a new imagick object */
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] : ''); }
function unitAction($caveID, &$meineHoehlen) { global $config, $db, $MAX_RESOURCE, $MOVEMENTCOSTCONSTANT, $MOVEMENTSPEEDCONSTANT, $params, $resourceTypeList, $unitTypeList, $FUELRESOURCEID; // get movements $ua_movements = Movement::getMovements(); $details = $meineHoehlen[$caveID]; /***************************************************************************/ /** **/ /** CHECK ARTEFACTS **/ /** **/ /***************************************************************************/ // artefact moving: get ID if any // // $params->POST->myartefacts will be // NULL, if it is not set at all // -1 when choosing no artefact to move // 0 if there was a real choice // default: Move No Artefact (this var holds the artefactID to move) $moveArtefact = 0; // this array shall contain the artefacts if any $myartefacts = array(); // does the cave contain an artefact at least? if ($details['artefacts'] > 0) { // get artefacts $myartefacts = artefact_getArtefactsReadyForMovement($caveID); // was an artefact chosen? if ((int) $params->POST->myartefacts > 0) { $tempID = (int) $params->POST->myartefacts; // now check, whether this artefactID belongs to this cave foreach ($myartefacts as $key => $value) { // if found, set it if ($tempID == $value['artefactID']) { $moveArtefact = $tempID; break; } } } } // now $moveArtefact should contain 0 for 'move no artefact' // or the artefactID of the artefact to be moved /***************************************************************************/ /***************************************************************************/ /***************************************************************************/ // put user, its session and nogfx flag into session $_SESSION['player'] = Player::getPlayer($params->SESSION->player->playerID); $params->SESSION->player = $_SESSION['player']; // get Map Size $size = getMapSize(); $dim_x = ($size['maxX'] - $size['minX'] + 1) / 2; $dim_y = ($size['maxY'] - $size['minY'] + 1) / 2; $foodPerCave = eval('return ' . formula_parseToPHP($MOVEMENTCOSTCONSTANT . ';', '$details')); $minutesPerCave = eval('return ' . formula_parseToPHP($MOVEMENTSPEEDCONSTANT . ';', '$details')); $minutesPerCave *= MOVEMENT_TIME_BASE_FACTOR / 60; if (isset($params->POST->moveit) && sizeof($params->POST->unit)) { $targetXCoord = intval($params->POST->targetXCoord); $targetYCoord = intval($params->POST->targetYCoord); $targetCaveName = $params->POST->targetCaveName; $targetCaveID = intval($params->POST->targetCaveID); $movementID = intval($params->POST->movementID); // check for scripters check_timestamp($params->POST->tstamp); $validCaveName = FALSE; // targetCaveID >>> coords if (isset($targetCaveID) && $targetCaveID > 0) { $result = getCaveByID(intval($targetCaveID)); if (sizeof($result) != 0) { $targetXCoord = $result['xCoord']; $targetYCoord = $result['yCoord']; $validCaveName = TRUE; } // name >>> coords } else { if (isset($targetCaveName)) { $result = getCaveByName($targetCaveName); if (sizeof($result) != 0) { $targetXCoord = $result['xCoord']; $targetYCoord = $result['yCoord']; $validCaveName = TRUE; } } } // get target player $result = getCaveByCoords(intval($targetXCoord), intval($targetYCoord)); if (sizeof($result) != 0) { $targetPlayer = new Player(getPlayerByID($result['playerID'])); } // Array von Nullwerten befreien $unit = array_filter($params->POST->unit, "filterZeros"); $unit = array_map("checkFormValues", $unit); $resource = array_map("checkFormValues", $params->POST->rohstoff); // Test, ob Einheitentragekapazität ausgelastet foreach ($resource as $resKey => $aRes) { $capacity = 0; foreach ($unit as $unitKey => $aUnit) { $capacity += $aUnit * $unitTypeList[$unitKey]->encumbranceList[$resKey]; } if ($capacity < $aRes) { $overloaded = 1; break; } } if ($movementID == 2) { // move units/resources if (strtoupper($targetPlayer->tribe) != strtoupper($params->SESSION->player->tribe)) { //may tade in own tribe $ownTribe = $params->SESSION->player->tribe; $targetTribe = $targetPlayer->tribe; $targetIsNonPlayer = $targetPlayer->playerID == 0; $ownTribeAtWar = tribe_isAtWar($ownTribe, TRUE, $db); $targetTribeAtWar = tribe_isAtWar($targetTribe, TRUE, $db); $TribesMayTrade = relation_areAllies($ownTribe, $targetTribe, $db) || relation_areEnemys($ownTribe, $targetTribe, $db) || $targetIsNonPlayer; $denymovement_nonenemy = $ownTribeAtWar && !$TribesMayTrade; $denymovement_targetwar = $targetTribeAtWar && !$TribesMayTrade; } } if ($params->POST->movementID == 0) { $msg = _('Bitte Bewegungsart auswählen!'); } else { if (!sizeof($unit)) { $msg = _('Es sind keine Einheiten ausgewählt!'); } else { if (empty($targetXCoord) || empty($targetYCoord) and empty($targetCaveName)) { $msg = _('Es fehlt eine Zielkoordinate oder ein Zielhöhlenname!'); } else { if (empty($targetXCoord) || empty($targetYCoord) and !empty($targetCaveName) and $validCaveName === FALSE) { $msg = sprintf(_('Es gibt keine Höhle mit dem Namen "%s"!'), $targetCaveName); } else { if ($overloaded) { $msg = _('Deine Krieger können die Menge an Ressourcen nicht tragen!!'); } else { if (beginner_isCaveProtectedByCoord($targetXCoord, $targetYCoord, $db)) { $msg = _('Die Zielhöhle steht unter Anfängerschutz.'); } else { if (beginner_isCaveProtectedByID($caveID, $db)) { $msg = _('Ihre Höhle steht unter Anfängerschutz. Sie können den Schutz sofort unter dem Punkt <a href="?modus=cave_detail">Bericht über diese Höhle</a> beenden'); } else { if ($params->POST->movementID == 6 && cave_isCaveSecureByCoord($targetXCoord, $targetYCoord, $db)) { $msg = _('Sie können diese Höhle nicht übernehmen. Sie ist gegen Übernahmen geschützt.'); } else { if ($denymovement_nonenemy) { $msg = _('Sie können im Krieg keine Einheiten zu unbeteiligten Parteien verschieben!'); } else { if ($denymovement_targetwar) { $msg = _('Sie können keine Einheiten zu kriegführenden Stämmen verschieben, wenn Sie unbeteiligt sind.'); } else { // Entfernung x Dauer pro Höhle x größter Geschwindigkeitsfaktor x Bewegungsfaktor $duration = ceil(getDistanceByCoords($details['xCoord'], $details['yCoord'], $targetXCoord, $targetYCoord) * $minutesPerCave * getMaxSpeedFactor($unit) * $ua_movements[$movementID]->speedfactor); $distance = ceil(getDistanceByCoords($details['xCoord'], $details['yCoord'], $targetXCoord, $targetYCoord)); $tmpdist = 0; $i = 0; if ($distance > 15) { $distance = $distance - 15; $tmpdist = 15; if (floor($distance / 5) < 11) { $tmpdist += $distance % 5 * (1 - 0.1 * floor($distance / 5)); } for ($i = 1; $i <= floor($distance / 5) && $i < 11; $i++) { $tmpdist += 5 * (1 - 0.1 * ($i - 1)); } } else { $tmpdist = $distance; } // Dauer x Rationen x Größe einer Ration x Bewegungsfaktor $reqFood = ceil($tmpdist * $minutesPerCave * getMaxSpeedFactor($unit) * $ua_movements[$movementID]->speedfactor * calcRequiredFood($unit) * $foodPerCave * $ua_movements[$movementID]->foodfactor); if ($details[$resourceTypeList[$FUELRESOURCEID]->dbFieldName] < $reqFood) { $msg = _('Nicht genug Nahrung zum Ernähren der Krieger auf ihrem langen Marsch vorhanden!'); } else { $msgID = setMovementEvent($caveID, $details, $targetXCoord, $targetYCoord, $unit, $resource, $movementID, $reqFood, $duration, $moveArtefact, $minutesPerCave * $ua_movements[$movementID]->speedfactor); switch ($msgID) { case 0: $msg = sprintf(_('Die Krieger wurden losgeschickt und haben %d Nahrung mitgenommen!'), $reqFood); break; case 1: $msg = _('In diesen Koordinaten liegt keine Höhle!'); break; case 2: $msg = _('Für diese Bewegung sind nicht genügend Einheiten/Rohstoffe verfügbar!'); break; case 3: $msg = _('Schwerer Fehler: Bitte Admin kontaktieren!'); } } } } } } } } } } } } } else { if (!empty($params->POST->eventID)) { $msgID = reverseMovementEvent($caveID, $params->POST->eventID); switch ($msgID) { case 0: $msg = _('Die Einheiten kehren zurück!'); break; case 1: $msg = _('Fehler bei der Rückkehr!'); break; } } } // refresh this cave $temp = getCaveSecure($caveID, $params->SESSION->player->playerID); $meineHoehlen[$caveID] = $details = $temp->nextRow(MYSQL_ASSOC); // make sure that bagged artefacts are not shown again if ($moveArtefact != 0) { $myartefacts = artefact_getArtefactsReadyForMovement($caveID); } // ////////////////////////////////////////////////////////////// // Create the page // ////////////////////////////////////////////////////////////// $template = tmpl_open($params->SESSION->player->getTemplatePath() . 'unitaction.ihtml'); // messages if (isset($msg)) { tmpl_set($template, '/MESSAGE/msg', $msg); } // javascript support tmpl_set($template, 'currentX', $details['xCoord']); tmpl_set($template, 'currentY', $details['yCoord']); tmpl_set($template, 'dim_x', $dim_x); tmpl_set($template, 'dim_y', $dim_y); tmpl_set($template, 'speed', $minutesPerCave); tmpl_set($template, 'fuel_id', $FUELRESOURCEID); tmpl_set($template, 'fuel_name', $resourceTypeList[$FUELRESOURCEID]->name); tmpl_set($template, 'movementcostconstant', $foodPerCave); tmpl_set($template, "resourceTypes", $MAX_RESOURCE); tmpl_set($template, "rules_path", RULES_PATH); // movements $selectable_movements = array(); foreach ($ua_movements as $value) { if ($value->playerMayChoose) { $selectable_movements[] = get_object_vars($value); } } tmpl_set($template, 'SELECTACTION', $selectable_movements); // resources $resources = array(); for ($res = 0; $res < sizeof($resourceTypeList); $res++) { if (!$resourceTypeList[$res]->nodocumentation) { $resources[] = array('resourceID' => $resourceTypeList[$res]->resourceID, 'name' => $resourceTypeList[$res]->name, 'currentAmount' => "0" + $details[$resourceTypeList[$res]->dbFieldName], 'dbFieldName' => $resourceTypeList[$res]->dbFieldName); } } tmpl_set($template, 'RESOURCE', $resources); tmpl_set($template, 'TOTAL', $resources); tmpl_set($template, 'RESOURCE_LUGGAGE', $resources); // units table $unitprops = array(); $units = array(); for ($i = 0; $i < sizeof($unitTypeList); $i++) { // if no units of this type, next type if (!$details[$unitTypeList[$i]->dbFieldName]) { continue; } $temp = array(); $encumbrance = array(); for ($j = 0; $j < count($resourceTypeList); $j++) { if (!$resourceTypeList[$j]->nodocumentation) { $encumbrance[$j] = array('resourceID' => $j, 'load' => "0" + $unitTypeList[$i]->encumbranceList[$j]); $temp[] = "0" + $unitTypeList[$i]->encumbranceList[$j]; } } $unitprops[] = array('unitID' => $unitTypeList[$i]->unitID, 'foodCost' => $unitTypeList[$i]->foodCost, 'speedFactor' => $unitTypeList[$i]->wayCost, 'resourceLoad' => implode(",", $temp), 'maxWarriorAnzahl' => $details[$unitTypeList[$i]->dbFieldName]); $units[] = array('name' => $unitTypeList[$i]->name, 'modus' => UNIT_PROPERTIES, 'unitID' => $unitTypeList[$i]->unitID, 'foodCost' => $unitTypeList[$i]->foodCost, 'speedFactor' => $unitTypeList[$i]->wayCost, 'maxWarriorAnzahl' => $details[$unitTypeList[$i]->dbFieldName], 'warriorID' => $i, 'ENCUMBRANCE' => $encumbrance); } tmpl_set($template, 'UNITPROPS', $unitprops); tmpl_set($template, 'SELECTWARRIOR', $units); // weitergereichte Koordinaten if (empty($params->POST->movementID)) { tmpl_set($template, 'targetXCoord', $params->POST->targetXCoord); tmpl_set($template, 'targetYCoord', $params->POST->targetYCoord); tmpl_set($template, 'targetCaveName', $params->POST->targetCaveName); } // weitere Paramter $hidden = array(array('name' => 'modus', 'value' => UNIT_MOVEMENT), array('name' => 'moveit', 'value' => 'true'), array('name' => 'trigger', 'value' => 'self'), array('name' => 'tstamp', 'value' => "" . time())); tmpl_set($template, 'PARAMS', $hidden); $movements = digest_getMovements(array($caveID => $details), array(), true); //$movements = digest_getMovements($meineHoehlen, array(), true); foreach ($movements as $move) { if ($move['isOwnMovement']) { tmpl_iterate($template, 'MOVEMENT/MOVE'); tmpl_set($template, 'MOVEMENT/MOVE', $move); } else { tmpl_iterate($template, 'OPPMOVEMENT/MOVE'); tmpl_set($template, 'OPPMOVEMENT/MOVE', $move); } } // artefakte if (sizeof($myartefacts) != 0) { tmpl_set($template, '/ARTEFACTS/ARTEFACT', $myartefacts); } // Module "CaveBookmarks" Integration // FIXME should know whether the module is installed if (TRUE) { // show CAVEBOOKMARKS context tmpl_set($template, '/CAVEBOOKMARKS/iterate', ''); // get model $cb_model = new CaveBookmarks_Model(); // get bookmarks $bookmarks = $cb_model->getCaveBookmarks(true); // set bookmarks if (sizeof($bookmarks)) { tmpl_set($template, '/CAVEBOOKMARKS/CAVEBOOKMARK', $bookmarks); tmpl_set($template, '/CAVEBOOKMARKS/CAVEBOOKMARKJS', $bookmarks); } } return tmpl_parse($template); }
function getCaveReport($meineHoehlen, $caveID, $targetCaveID, $playerID) { global $params, $config, $terrainList; $cave = getCaveByID($targetCaveID); $caveDetails = array(); $playerDetails = array(); // ADDED by chris--- for Quests // ---------------------------------------------------------- global $db; // checking if this cave is a quest cave and if its visible to the player (than he knows the quest) // if he does not know the quest the cave is invisible if (isCaveQuestCave($targetCaveID, $db) && isCaveInvisibleToPlayer($targetCaveID, $playerID, $db)) { $cave['playerID'] = 0; } // ---------------------------------------------------------- if ($cave['playerID'] != 0) { $caveDetails = getCaves($cave['playerID']); $playerDetails = getPlayerFromID($cave['playerID']); // ADDED by chris--- for farmschutz if (FARMSCHUTZ_ACTIVE == 1) { $farmschutz = getFarmschutz($cave['playerID']); } else { $farmschutz = ""; } } $template = @tmpl_open('./templates/' . $config->template_paths[$params->SESSION->user['template']] . '/mapdetail.ihtml'); if ($cave['protected']) { tmpl_set($template, 'PROPERTY', 'Anfängerschutz aktiv'); } if (!$cave['secureCave'] && $cave['playerID']) { tmpl_iterate($template, 'PROPERTY'); tmpl_set($template, 'PROPERTY', 'übernehmbar!'); } // ADDED by chris--- for Quests -------------------------------------------------------------------------------- if ($cave['quest_cave'] && !isCaveInvisibleToPlayer($cave['caveID'], $playerID, $db) && $cave['invisible_name'] != "") { $cave['name'] = $cave['invisible_name']; } // ------------------------------------------------------------------------------------------------------- $addCaveLink = "?modus=" . CAVE_BOOK_ADD . "&id=" . $targetCaveID; // ADDED by chris--- for cavebook tmpl_set($template, '/', array('cavename' => $cave['name'], 'xcoord' => $cave['xCoord'], 'ycoord' => $cave['yCoord'], 'terrain' => $terrainList[$cave['terrain']]['name'], 'movementlink' => "?modus=" . MOVEMENT . "&targetXCoord=" . $cave['xCoord'] . "&targetYCoord=" . $cave['yCoord'] . "&targetCaveName=" . unhtmlentities($cave['name']), 'backlink' => "?modus=" . MAP . "&xCoord=" . $cave['xCoord'] . "&yCoord=" . $cave['yCoord'])); if ($cave['playerID'] != 0) { tmpl_set($template, '/OCCUPIED', array('playerLink' => "?modus=" . PLAYER_DETAIL . "&detailID=" . $playerDetails['playerID'], 'caveOwner' => $playerDetails['name'], 'farmschutz' => $farmschutz, 'adressbook_add_modus' => MESSAGE_BOOK_ADD, 'addCaveLink' => $addCaveLink)); if ($playerDetails['tribe']) { tmpl_set($template, '/OCCUPIED/TRIBE', array('tribeLink' => "?modus=" . TRIBE_DETAIL . "&tribe=" . urlencode(unhtmlentities($playerDetails['tribe'])), 'ownersTribe' => $playerDetails['tribe'])); } if ($cave['artefacts'] != 0 && ($playerDetails['tribe'] != GOD_ALLY || $params->SESSION->user['tribe'] == GOD_ALLY)) { tmpl_set($template, '/OCCUPIED/ARTEFACT/artefactLink', "?modus=" . ARTEFACT_LIST . "&caveID={$caveID}"); } $caves = array(); foreach ($caveDetails as $key => $value) { if (!(isCaveQuestCave($value['caveID'], $db) && isCaveInvisibleToPlayer($value['caveID'], $playerID, $db))) { $temp = array('caveName' => $value['name'], 'xCoord' => $value['xCoord'], 'ycoord' => $value['yCoord'], 'terrain' => $terrainList[$value['terrain']]['name'], 'caveSize' => floor($value[CAVE_SIZE_DB_FIELD] / 50) + 1, 'movementLink' => "?modus=" . MOVEMENT . "&targetXCoord=" . $value['xCoord'] . "&targetYCoord=" . $value['yCoord'] . "&targetCaveName=" . unhtmlentities($value['name'])); if ($value['artefacts'] != 0 && ($playerDetails['tribe'] != GOD_ALLY || $params->SESSION->user['tribe'] == GOD_ALLY)) { $temp['ARTEFACT'] = array('artefactLink' => "?modus=" . ARTEFACT_LIST . "&caveID={$caveID}"); } if ($value['protected'] && $value['playerID']) { $temp['PROPERTY'] = array('text' => 'Schutz'); } else { if (!$value['secureCave']) { $temp['PROPERTY'] = array('text' => 'übernehmbar'); } } $caves[] = $temp; } } tmpl_set($template, '/OCCUPIED/CAVES', $caves); } else { if (sizeof($meineHoehlen) < $params->SESSION->user['takeover_max_caves'] && $cave['takeoverable'] == 1) { tmpl_set($template, 'TAKEOVERABLE', array('modus' => TAKEOVER, 'caveID' => $caveID, 'targetXCoord' => $cave['xCoord'], 'targetYCoord' => $cave['yCoord'])); } } return tmpl_parse($template); }
function getCaveReport($caveID, $ownCaves, $targetCaveID, $method) { global $template; if (!$targetCaveID) { $template->throwError('Es wurde keine Höhle ausgewählt.'); return; } if ($method == 'ajax') { $shortVersion = true; $template->setFile('mapDetailAjax.tmpl'); } else { $shortVersion = false; $template->setFile('mapDetail.tmpl'); } $cave = getCaveByID($targetCaveID); $caveDetails = array(); $playerDetails = null; $showArtePossible = false; if ($cave['playerID'] != 0) { $caveDetails = getCaves($cave['playerID']); $playerDetails = Player::getPlayer($cave['playerID']); $showArtePossible = $playerDetails->tribe != GOD_ALLY ? true : false; } $cave['terrain_name'] = $GLOBALS['terrainList'][$cave['terrain']]['name']; $cave['terrain_img'] = $GLOBALS['terrainList'][$cave['terrain']]['img']; if ($GLOBALS['terrainList'][$cave['terrain']]['tribeRegion']) { $cave['terrain_description'] = $GLOBALS['terrainList'][$cave['terrain']]['description']; $cave['terrain_tribe_cave'] = $GLOBALS['terrainList'][$cave['terrain']]['tribeRegion']; $attackerTribe = Tribe::getByID($cave['lastAttackingTribeID']); $cave['tribe_cave_tag'] = $attackerTribe['tag']; } $region = getRegionByID($cave['regionID']); // Wenn die Höhle ein Artefakt enthält und man berechtigt ist -> anzeigen if ($cave['hasArtefact'] && ($showArtePossible || $_SESSION['player']->tribe == GOD_ALLY)) { $cave['hasArtefact'] = true; } else { $cave['hasArtefact'] = false; } if ($cave['hasPet'] && ($showArtePossible || $_SESSION['player']->tribe == GOD_ALLY)) { $cave['hasPet'] = true; } else { $cave['hasArtefact'] = false; } $template->addVar('cave_details', $cave); if ($cave['playerID'] != 0) { $template->addVar('player_details', $playerDetails); /**************************************************************************************************** * * Alle Höhlen des Spielers ausgeben * ****************************************************************************************************/ $caves = array(); foreach ($caveDetails as $key => $value) { $temp = array('caveName' => $value['name'], 'xCoord' => $value['xCoord'], 'yCoord' => $value['yCoord'], 'terrain' => $GLOBALS['terrainList'][$value['terrain']]['name'], 'caveSize' => floor($value[CAVE_SIZE_DB_FIELD] / 50) + 1, 'secureCave' => $value['secureCave']); if ($value['hasArtefact'] && ($playerDetails->tribe != GOD_ALLY || $_SESSION['player']->tribe == GOD_ALLY)) { $temp['artefact'] = true; } if ($value['hasPet'] && ($playerDetails->tribe != GOD_ALLY || $_SESSION['player']->tribe == GOD_ALLY)) { $temp['pet'] = true; } $caves[] = $temp; } $template->addVar('player_caves', $caves); } else { if (sizeof($ownCaves) < $_SESSION['player']->takeover_max_caves) { if ($cave['starting_position'] == 0 && $cave['takeoverable'] == 0 && $cave['takeover_level'] > 0) { $template->addVar('maybe_takeoverable', true); } else { if ($cave['takeoverable'] == 1) { $template->addVar('takeoverable', true); } } } } }
function getCaveReport($meineHoehlen, $caveID, $targetCaveID) { global $params, $config, $terrainList; $cave = getCaveByID($targetCaveID); $caveDetails = array(); $playerDetails = array(); if ($cave['playerID'] != 0) { $caveDetails = getCaves($cave['playerID']); $playerDetails = getPlayerByID($cave['playerID']); } $template = tmpl_open($params->SESSION->player->getTemplatePath() . 'mapdetail.ihtml'); if ($cave['protected']) { tmpl_set($template, 'PROPERTY', _('Anfängerschutz aktiv')); } if (!$cave['secureCave'] && $cave['playerID']) { tmpl_iterate($template, 'PROPERTY'); tmpl_set($template, 'PROPERTY', _('übernehmbar')); } $region = getRegionByID($cave['regionID']); tmpl_set($template, array('cavename' => $cave['name'], 'xcoord' => $cave['xCoord'], 'ycoord' => $cave['yCoord'], 'terrain' => $terrainList[$cave['terrain']]['name'], 'region' => $region['name'], 'movementlink' => sprintf("?modus=unit_movement&targetXCoord=%d&targetYCoord=%d&targetCaveName=%s", $cave['xCoord'], $cave['yCoord'], unhtmlentities($cave['name'])), 'backlink' => sprintf("?modus=map&xCoord=%d&yCoord=%d", $cave['xCoord'], $cave['yCoord']))); if ($cave['playerID'] != 0) { tmpl_set($template, '/OCCUPIED', array('playerLink' => "?modus=player_detail&detailID=" . $playerDetails['playerID'], 'caveOwner' => $playerDetails['name'])); if ($playerDetails['tribe']) { tmpl_set($template, '/OCCUPIED/TRIBE', array('tribeLink' => "?modus=tribe_detail&tribe=" . urlencode(unhtmlentities($playerDetails['tribe'])), 'ownersTribe' => $playerDetails['tribe'])); } if ($cave['artefacts'] != 0 && ($playerDetails['tribe'] != GOD_ALLY || $params->SESSION->player->tribe == GOD_ALLY)) { tmpl_set($template, '/OCCUPIED/ARTEFACT/artefactLink', "?modus=artefact_list&caveID={$caveID}"); } $caves = array(); foreach ($caveDetails as $key => $value) { $temp = array('caveName' => $value['name'], 'xCoord' => $value['xCoord'], 'ycoord' => $value['yCoord'], 'terrain' => $terrainList[$value['terrain']]['name'], 'caveSize' => floor($value[CAVE_SIZE_DB_FIELD] / 50) + 1, 'movementLink' => "?modus=unit_movement&targetXCoord=" . $value['xCoord'] . "&targetYCoord=" . $value['yCoord'] . "&targetCaveName=" . unhtmlentities($value['name'])); if ($value['artefacts'] != 0 && ($playerDetails['tribe'] != GOD_ALLY || $params->SESSION->player->tribe == GOD_ALLY)) { $temp['ARTEFACT'] = array('artefactLink' => "?modus=artefact_list&caveID={$caveID}"); } if ($value['protected'] && $value['playerID']) { $temp['PROPERTY'] = array('text' => _('Anfängerschutz aktiv')); } else { if (!$value['secureCave']) { $temp['PROPERTY'] = array('text' => _('übernehmbar')); } } $caves[] = $temp; } tmpl_set($template, '/OCCUPIED/CAVES', $caves); } else { if (sizeof($meineHoehlen) < $params->SESSION->player->takeover_max_caves && $cave['takeoverable'] == 1) { tmpl_set($template, 'TAKEOVERABLE', array('modus' => TAKEOVER, 'caveID' => $caveID, 'targetXCoord' => $cave['xCoord'], 'targetYCoord' => $cave['yCoord'])); } } return tmpl_parse($template); }
function cave_giveUpCave($caveID, $playerID, $tribeID) { global $db; $sql = $db->prepare("UPDATE " . CAVE_TABLE . "\n SET playerID = 0,\n takeoverable = 0,\n protection_end = NOW()+0,\n secureCave = 0\n WHERE playerID = :playerID\n AND caveID = :caveID\n AND starting_position = 0"); $sql->bindValue('playerID', $playerID, PDO::PARAM_INT); $sql->bindValue('caveID', $caveID, PDO::PARAM_INT); if (!$sql->execute() || $sql->rowCount() == 0) { return false; } $sql = $db->prepare("UPDATE " . CAVE_TABLE . " c\n SET name = (SELECT name FROM " . CAVE_ORGINAL_NAME_TABLE . " co WHERE co.caveID = :caveID)\n WHERE c.caveID = :caveID"); $sql->bindValue('caveID', $caveID, PDO::PARAM_INT); $sql->execute(); @unlink("/var/www/speed/images/temp/{$caveID}.png"); // delete all scheduled Events // Event_movement - will only be deleted, when a new player gets that cave // Event_artefact - can't be deleted, as it would result in serious errors // Event_wonder - FIX ME: don't know $db->query("DELETE FROM " . EVENT_DEFENSE_SYSTEM_TABLE . " WHERE caveID = '{$caveID}'"); $db->query("DELETE FROM " . EVENT_EXPANSION_TABLE . " WHERE caveID = '{$caveID}'"); $db->query("DELETE FROM " . EVENT_SCIENCE_TABLE . " WHERE caveID = '{$caveID}'"); $db->query("DELETE FROM " . EVENT_UNIT_TABLE . " WHERE caveID = '{$caveID}'"); $db->query("DELETE FROM " . EVENT_HERO_TABLE . " WHERE caveID = '{$caveID}'"); if ($tribeID != 0) { $ownRelations = TribeRelation::getRelations($tribeID); foreach ($ownRelations['own'] as $actRelation) { $ownType = $actRelation['relationType']; if ($GLOBALS['relationList'][$ownType]['isPrepareForWar'] || $GLOBALS['relationList'][$ownType]['isWar']) { $newfame = $actRelation['fame'] - NONSECURE_CAVE_VAlUE * NONSECURE_CAVE_GIVEUP_FAKTOR; $sql = $db->prepare("UPDATE " . RELATION_TABLE . "\n SET fame = :newfame\n WHERE tribeID = :actTribeRelation\n AND tribeID_target = :actTargetRelation"); $sql->bindValue('newfame', $newfame, PDO::PARAM_INT); $sql->bindValue('actTribeRelation', $actRelation['tribeID'], PDO::PARAM_INT); $sql->bindValue('actTargetRelation', $actRelation['tribeID_target'], PDO::PARAM_INT); $sql->execute(); } } } // delete hero $caveData = getCaveByID($caveID); if ($caveData['hero'] != 0) { hero_killHero($playerID); } return 1; }
function wonder_getWonderContent($playerID, $caveID, &$details) { global $buildingTypeList, $resourceTypeList, $wonderTypeList, $unitTypeList, $config, $params, $db; // messages $messageText = array(-4 => "Die Zielsiedlung steht unter Schutz. Der Zauber kann nicht erwirkt werden.", -3 => "Die angegebene Zielsiedlung wurde nicht gefunden.", -2 => "Der Zauber kann nicht auf die angegbene Zielsiedlung erwirkt " . "werden.", -1 => "Es ist ein Fehler bei der Verarbeitung Ihrer Anfrage aufgetreten. " . "Bitte wenden Sie sich an die Administratoren.", 0 => "Der Zauber kann nicht erwirkt werden. Es fehlen die " . "notwendigen Voraussetzungen.", 1 => "Das Erwirken des Zaubers scheint Erfolg zu haben.", 2 => "Die Götter haben Ihr Flehen nicht erhört! Die " . "eingesetzten Opfergaben sind natürlich dennoch verloren. " . "Mehr Glück beim nächsten Mal!"); // ADDED by chris--- for cavebook ----------------------- if ($params->POST->targetCaveID != -1) { $targetCave = getCaveByID($params->POST->targetCaveID); $x = $targetCave[xCoord]; $y = $targetCave[yCoord]; } else { $x = $params->POST->xCoord; $y = $params->POST->yCoord; } // ------------------------------------------------------ // and changed $params->POST->xCoord to $x etc if (isset($params->POST->wonderID)) { $messageID = wonder_processOrder($playerID, $params->POST->wonderID, $caveID, $x, $y, $details, $db); $reload = 1; } if ($reload) { // this isn't that elegant... $r = getCaveSecure($caveID, $params->SESSION->user['playerID']); if ($r->isEmpty()) { page_dberror(); } $details = $r->nextRow(); } $template = @tmpl_open("./templates/" . $config->template_paths[$params->SESSION->user['template']] . "/wonder.ihtml"); // Show a special message if (isset($messageID)) { tmpl_set($template, '/MESSAGE/message', $messageText[$messageID]); } // ADDED by chris--- for cavebook --------------------------------- // Getting entries $cavelist = cavebook_getEntries($params->SESSION->user['playerID']); // Show the cave table $cavebook = array(); for ($ix = 0; $ix < sizeof($cavelist[id]); $ix++) { $cavebook[$ix][cavebook_entry] = $cavelist[name][$ix]; $cavebook[$ix][cavebook_id] = $cavelist[id][$ix]; $cavebook[$ix][cavebook_x] = $cavelist[x][$ix]; $cavebook[$ix][cavebook_y] = $cavelist[y][$ix]; } // -------------------------------------------------------------- // Show the wonder table for ($i = 0; $i < sizeof($wonderTypeList); $i++) { $wonder = $wonderTypeList[$i]; // the current building $result = rules_checkDependencies($wonder, $details); if ($result === TRUE) { tmpl_iterate($template, 'WONDER'); tmpl_set($template, "WONDER/alternate", $count++ % 2 ? "alternate" : ""); tmpl_set($template, 'WONDER', array('name' => $wonder->name, 'wonderID' => $i, 'modus' => WONDER_DETAIL, 'caveID' => $caveID)); // iterate ressourcecosts foreach ($wonder->resourceProductionCost as $resourceID => $function) { $cost = ceil(eval('return ' . formula_parseToPHP($function . ';', '$details'))); if ($cost) { tmpl_iterate($template, "WONDER/RESSOURCECOST"); if ($details[$resourceTypeList[$resourceID]->dbFieldName] >= $cost) { tmpl_set($template, "WONDER/RESSOURCECOST/ENOUGH/value", $cost); } else { tmpl_set($template, "WONDER/RESSOURCECOST/LESS/value", $cost); } tmpl_set($template, "WONDER/RESSOURCECOST/dbFieldName", $resourceTypeList[$resourceID]->dbFieldName); tmpl_set($template, "WONDER/RESSOURCECOST/name", $resourceTypeList[$resourceID]->name); } } // iterate unitcosts foreach ($wonder->unitProductionCost as $unitID => $function) { $cost = ceil(eval('return ' . formula_parseToPHP($function . ';', '$details'))); if ($cost) { tmpl_iterate($template, "WONDER/UNITCOST"); if ($details[$unitTypeList[$unitID]->dbFieldName] >= $cost) { tmpl_set($template, "WONDER/UNITCOST/ENOUGH/value", $cost); } else { tmpl_set($template, "WONDER/UNITCOST/LESS/value", $cost); } tmpl_set($template, "WONDER/UNITCOST/name", $unitTypeList[$unitID]->name); } } // show the wonder link tmpl_set($template, 'WONDER/BUILD_LINK', array('action' => WONDER, 'wonderID' => $wonder->wonderID, 'cave_book_link' => CAVE_BOOK, 'BOOKENTRY' => $cavebook, 'caveID' => $caveID)); } else { if ($params->SESSION->user['show_unqualified'] && $result !== FALSE && !$wonder->nodocumentation) { tmpl_iterate($template, '/UNQUALIFIEDWONDERS/WONDER'); tmpl_set($template, '/UNQUALIFIEDWONDERS/WONDER', array('alternate' => $count_unqualified++ % 2 ? "" : "alternate", 'modus' => WONDER_DETAIL, 'wonderID' => $i, 'caveID' => $caveID, 'name' => $wonder->name, 'dependencies' => $result)); } } } return tmpl_parse($template); }
/** * Adjusts deviating cave's effects * * @param dbgame * the link to the game DB * @return all caveIDs */ function adjust_adjustCave($db, $caveID) { global $checkOnly; // get cave $cave = getCaveByID($caveID); // get artefact effects $artefactEffects = artefact_recalculateEffects($caveID); // get wonder effects $wonderEffects = wonder_recalc($caveID, $db); // check each effect $adjustments = array(); foreach ($GLOBALS['effectTypeList'] as $effectID => $effect) { // get actual value $actual = $cave[$effect->dbFieldName]; // get nominal value $nominal = $artefactEffects[$effectID] + $wonderEffects[$effectID]; $nominal += (double) $GLOBALS['terrainList'][$cave['terrain']]['effects'][$effectID]; // check for deviation if ($actual != $nominal) { // log difference adjust_log('%4d: %-30s nominal:%f actual:%f', $caveID, $effect->dbFieldName, $nominal, $actual); // collect adjustments $adjustments[] = sprintf('%s = %f', $effect->dbFieldName, $nominal); } } // prepare query $set = implode(", ", $adjustments); $sql = $db->prepare("UPDATE " . CAVE_TABLE . " SET {$set} WHERE caveID = :caveID"); $sql->bindValue('caveID', $caveID, pdo::PARAM_INT); // adjust cave if (0 != sizeof($adjustments) && !$checkOnly) { adjust_log('Adjusting cave %d (%s)', $caveID, $cave['name']); // send query if (!$sql->execute()) { adjust_log('Error! "%s": %s', $query, $sql->errorInfo()); } } }