function unit_processOrder($unitID, $quantity, $caveID, $details) { global $db; if ($quantity == -1) { $quantity = MAX_SIMULTAN_BUILDED_UNITS; while (!processProductionCost($GLOBALS['unitTypeList'][$unitID], $caveID, $details, $quantity) && $quantity != 0) { $quantity--; } if ($quantity <= 0) { return 4; } } else { if ($quantity > MAX_SIMULTAN_BUILDED_UNITS || $quantity <= 0) { return 4; } // take the production costs from cave if (!processProductionCost($GLOBALS['unitTypeList'][$unitID], $caveID, $details, $quantity)) { return 2; } } $prodTime = 0; // calculate the production time; if ($time_formula = $GLOBALS['unitTypeList'][$unitID]->productionTimeFunction) { $time_eval_formula = formula_parseToPHP($time_formula, '$details'); eval('$prodTime=' . $time_eval_formula . ';'); } $prodTime *= BUILDING_TIME_BASE_FACTOR * $quantity; $now = time(); $sql = $db->prepare("INSERT INTO " . EVENT_UNIT_TABLE . " (caveID, unitID, quantity, " . "start, end) VALUES (:caveID, :unitID, :quantity, :start, :end)"); $sql->bindValue('caveID', $caveID, PDO::PARAM_INT); $sql->bindValue('unitID', $unitID, PDO::PARAM_INT); $sql->bindValue('quantity', $quantity, PDO::PARAM_INT); $sql->bindValue('start', time_toDatetime($now), PDO::PARAM_STR); $sql->bindValue('end', time_toDatetime($now + $prodTime), PDO::PARAM_STR); if (!$sql->execute() || $sql->rowCount() == 0) { processProductionCostSetBack($GLOBALS['unitTypeList'][$unitID], $caveID, $details, $quantity); return 2; } return 3; }
function unit_processOrder($unitID, $quantity, $caveID, $db, $details) { global $defenseSystemTypeList, $unitTypeList, $buildingTypeList, $scienceTypeList, $resourceTypeList; if ($quantity > MAX_SIMULTAN_BUILDED_UNITS || $quantity <= 0) { return 4; } $set = array(); $setBack = array(); $where = array("WHERE caveID = '{$caveID}'"); // get all the resource costs foreach ($unitTypeList[$unitID]->resourceProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $formula *= $quantity; $dbField = $resourceTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - {$formula}"); array_push($setBack, "{$dbField} = {$dbField} + {$formula}"); array_push($where, "{$dbField} >= {$formula}"); } } // get all the unit costs foreach ($unitTypeList[$unitID]->unitProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $formula *= $quantity; $dbField = $unitTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - {$formula}"); array_push($setBack, "{$dbField} = {$dbField} + {$formula}"); array_push($where, "{$dbField} >= {$formula}"); } } // get all the building costs foreach ($unitTypeList[$unitID]->buildingProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $formula *= $quantity; $dbField = $buildingTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - {$formula}"); array_push($setBack, "{$dbField} = {$dbField} + {$formula}"); array_push($where, "{$dbField} >= {$formula}"); } } // get all the external costs foreach ($unitTypeList[$unitID]->externalProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $formula *= $quantity; $dbField = $defenseSystemTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - {$formula}"); array_push($setBack, "{$dbField} = {$dbField} + {$formula}"); array_push($where, "{$dbField} >= {$formula}"); } } // generate SQL if (sizeof($set)) { $set = implode(", ", $set); $set = "UPDATE Cave SET {$set} "; $setBack = implode(", ", $setBack); $setBack = "UPDATE Cave SET {$setBack} WHERE caveID = '{$caveID}'"; } // generate dependecies foreach ($unitTypeList[$unitID]->buildingDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$buildingTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($unitTypeList[$unitID]->maxBuildingDepList as $key => $value) { if ($value != -1) { array_push($where, "{$buildingTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($unitTypeList[$unitID]->defenseSystemDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$defenseSystemTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($unitTypeList[$unitID]->maxDefenseSystemDepList as $key => $value) { if ($value != -1) { array_push($where, "{$defenseSystemTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($unitTypeList[$unitID]->resourceDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$resourceTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($unitTypeList[$unitID]->maxResourceDepList as $key => $value) { if ($value != -1) { array_push($where, "{$resourceTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($unitTypeList[$unitID]->scienceDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$scienceTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($unitTypeList[$unitID]->maxScienceDepList as $key => $value) { if ($value != -1) { array_push($where, "{$scienceTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($unitTypeList[$unitID]->unitDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$unitTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($unitTypeList[$unitID]->maxUnitDepList as $key => $value) { if ($value != -1) { array_push($where, "{$unitTypeList[$key]->dbFieldName} <= {$value}"); } } $where = implode(" AND ", $where); if (!$db->query($set . $where) || !$db->affected_rows() == 1) { return 2; } $prodTime = 0; // calculate the production time; if ($time_formula = $unitTypeList[$unitID]->productionTimeFunction) { $time_eval_formula = formula_parseToPHP($time_formula, '$details'); eval('$prodTime=' . $time_eval_formula . ';'); } $prodTime *= BUILDING_TIME_BASE_FACTOR * $quantity; $now = time(); $query = sprintf("INSERT INTO Event_unit (caveID, unitID, quantity, " . "`start`, `end`) VALUES (%d, %d, %d, '%s', '%s')", $caveID, $unitID, $quantity, time_toDatetime($now), time_toDatetime($now + $prodTime)); if (!$db->query($query)) { $db->query($setBack); return 2; } return 3; }
function improvement_processOrder($buildingID, $caveID, $caveData, $db) { global $defenseSystemTypeList, $unitTypeList, $buildingTypeList, $scienceTypeList, $resourceTypeList; $building = $buildingTypeList[$buildingID]; $maxLevel = round(eval('return ' . formula_parseToPHP("{$building->maxLevel};", '$caveData'))); $set = array(); $setBack = array(); $where = array("WHERE caveID = '{$caveID}'", "{$building->dbFieldName} < {$maxLevel}"); // get all the resource costs foreach ($building->resourceProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $dbField = $resourceTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - ({$formula})"); array_push($setBack, "{$dbField} = {$dbField} + ({$formula})"); array_push($where, "{$dbField} >= ({$formula})"); } } // get all the unit costs foreach ($building->unitProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $dbField = $unitTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - {$formula}"); array_push($setBack, "{$dbField} = {$dbField} + {$formula}"); array_push($where, "{$dbField} >= {$formula}"); } } // get all the building costs foreach ($building->buildingProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $dbField = $buildingTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - {$formula}"); array_push($setBack, "{$dbField} = {$dbField} + {$formula}"); array_push($where, "{$dbField} >= {$formula}"); } } // get all the external costs foreach ($building->externalProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $dbField = $defenseSystemTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - {$formula}"); array_push($setBack, "{$dbField} = {$dbField} + {$formula}"); array_push($where, "{$dbField} >= {$formula}"); } } // generate SQL if (sizeof($set)) { $set = implode(", ", $set); $set = "UPDATE Cave SET {$set} "; $setBack = implode(", ", $setBack); $setBack = "UPDATE Cave SET {$setBack} WHERE caveID = '{$caveID}'"; } // generate dependecies foreach ($building->buildingDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$buildingTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($building->maxBuildingDepList as $key => $value) { if ($value != -1) { array_push($where, "{$buildingTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($building->defenseSystemDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$defenseSystemTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($building->maxDefenseSystemDepList as $key => $value) { if ($value != -1) { array_push($where, "{$defenseSystemTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($building->resourceDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$resourceTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($building->maxResourceDepList as $key => $value) { if ($value != -1) { array_push($where, "{$resourceTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($building->scienceDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$scienceTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($building->maxScienceDepList as $key => $value) { if ($value != -1) { array_push($where, "{$scienceTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($building->unitDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$unitTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($building->maxUnitDepList as $key => $value) { if ($value != -1) { array_push($where, "{$unitTypeList[$key]->dbFieldName} <= {$value}"); } } $where = implode(" AND ", $where); if (!$db->query($set . $where) || !$db->affected_rows() == 1) { return 2; } $prodTime = 0; // calculate the production time; if ($time_formula = $building->productionTimeFunction) { $time_eval_formula = formula_parseToPHP($time_formula, '$caveData'); $time_eval_formula = "\$prodTime={$time_eval_formula};"; eval($time_eval_formula); } $prodTime *= BUILDING_TIME_BASE_FACTOR; $now = time(); $query = sprintf("INSERT INTO Event_expansion (caveID, expansionID, " . "`start`, `end`) VALUES (%d, %d, '%s', '%s')", $caveID, $buildingID, time_toDatetime($now), time_toDatetime($now + $prodTime)); if (!$db->query($query)) { $db->query($setBack); return 2; } return 3; }
function wonder_processTribeWonder($caveID, $wonderID, $casterTribe, $targetTribe) { global $db; // check if wonder exists and is TribeWonder if (isset($GLOBALS['wonderTypeList'][$wonderID]) || !$wonder->isTribeWonder) { $wonder = $GLOBALS['wonderTypeList'][$wonderID]; } else { return -33; } // check if tribes exist $targetTribeData = tribe_getTribeByTag($targetTribe); $casterTribeData = tribe_getTribeByTag($casterTribe); if (!$targetTribeData || !$casterTribeData) { return -15; } // check if tribe is valid if (!$targetTribeData['valid']) { return -34; } // check if caster tribe ist valid if (!$casterTribeData['valid']) { return -35; } $targetTribeRelations = relation_getRelationsForTribe($targetTribe); $casterTribeRelations = relation_getRelationsForTribe($casterTribe); $wonderPossible = false; foreach ($wonder->targetsPossible as $targetsPossible) { // check target if ($targetsPossible['target'] == 'own' && strtoupper($casterTribe) != strtoupper($targetTribe)) { continue; } if ($targetsPossible['target'] == 'other' && strtoupper($casterTribe) == strtoupper($targetTribe)) { continue; } // check relation $check = wonder_checkRelations($targetsPossible['relation'], $targetTribe, $casterTribe, $casterTribeRelations, $targetTribeRelations); if ($check == true) { $wonderPossible = true; break; } } if ($wonderPossible == false) { return -37; } // take wonder Costs from TribeStorage $memberNumber = tribe_getNumberOfMembers($casterTribe); if (!processProductionCost($wonder, 0, NULL, $memberNumber, true)) { return -33; } // does the wonder fail? if ((double) rand() / (double) getRandMax() > $wonder->chance) { return 11; // wonder did fail } // schedule the wonder's impacts // create a random factor between -0.3 and +0.3 $delayRandFactor = rand(0, getrandmax()) / getrandmax() * 0.6 - 0.3; // now calculate the delayDelta depending on the first impact's delay $delayDelta = $wonder->impactList[0]['delay'] * $delayRandFactor; // get targets $targets = tribe_getTribeWonderTargets($targetTribe); if (!$targets || sizeof($targets) == 0) { return -33; } $now = time(); // loop over targets foreach ($targets as $target) { // loop over impacts foreach ($wonder->impactList as $impactID => $impact) { $delay = (int) (($delayDelta + $impact['delay']) * WONDER_TIME_BASE_FACTOR); $sql = $db->prepare("INSERT INTO " . EVENT_WONDER_TABLE . " (casterID, sourceID, targetID, \n wonderID, impactID, start, end) \n VALUES (:playerID, :caveID, :targetID, :wonderID, :impactID, :start, :end)"); $sql->bindValue('playerID', 0, PDO::PARAM_INT); // playerID 0, for not receiving lots of wonder-end-messages $sql->bindValue('caveID', $caveID, PDO::PARAM_INT); $sql->bindValue('targetID', $target['caveID'], PDO::PARAM_INT); $sql->bindValue('wonderID', $wonderID, PDO::PARAM_INT); $sql->bindValue('impactID', $impactID, PDO::PARAM_INT); $sql->bindValue('start', time_toDatetime($now), PDO::PARAM_STR); $sql->bindValue('end', time_toDatetime($now + $delay), PDO::PARAM_STR); $sql->execute(); } // end foreach impactList } // end foreach target // send caster messages $messageClass = new Messages(); $sourceMessage = 'Sie haben auf den Stamm "' . $targetTribe . '" ein Stammeswunder ' . $wonder->name . ' erwirkt.'; $messageClass->sendSystemMessage($_SESSION['player']->playerID, 9, 'Stammeswunder erwirkt auf "' . $targetTribe . '"', $sourceMessage); // send target messages $targetPlayersArray = array(); foreach ($targets as $target) { if (!isset($targetPlayersArray[$target['playerID']])) { $targetPlayersArray[$target['playerID']] = $target; } } foreach ($targetPlayersArray as $target) { $targetMessage = 'Der Stamm "' . $casterTribe . '" hat ein Stammeswunder auf deine Höhlen gewirkt'; $messageClass->sendSystemMessage($target['playerID'], 9, 'Stammeswunder!', $targetMessage); } return 12; }
function weather_generate($db) { global $db; // get regions $regions = getRegions(); // get weather $weather = weather_getWeatherWonders($db); foreach ($regions as $region) { if (!$region['startRegion']) { weather_log('Skipping unused region %s.', $region['name']); continue; } weather_log('Processing region %s.', $region['name']); // pick a random weather $regionweather = $weather[array_rand($weather)]; weather_log('Selected Weather: %s', $regionweather->name); // save weather information in DB $query = "UPDATE `Regions` " . "SET `weather` = {$regionweather->weatherID} " . "WHERE `regionID` = {$region['regionID']}"; if (!$db->query($query)) { weather_log('Failed to execute query: %s', $query); return -1; } foreach ($regionweather->impactList as $impactID => $impact) { $delay = (int) (($delayDelta + $impact['delay']) * WEATHER_TIME_BASE_FACTOR); $now = time(); $query = sprintf("INSERT INTO Event_weather " . "(`regionID`, `weatherID`, `impactID`, `start`, `end`) " . "VALUES (%d, %d, %d, '%s', '%s')", $region['regionID'], $regionweather->weatherID, $impactID, time_toDatetime($now), time_toDatetime($now + $delay)); if (!$db->query($query)) { weather_log('Failed to execute query: %s', $query); return -1; } } } }
public static function addHistoryEntry($playerID, $entry, $timestamp = -1) { global $db; if ($timestamp == -1) { $timestamp = time(); } // prepare query $sql = $db->prepare("INSERT INTO " . PLAYER_HISTORY_TABLE . " \n (playerID, timestamp, entry) \n VALUES\n (:playerID, :timestamp, :entry)"); $sql->bindValue('playerID', $playerID, PDO::PARAM_INT); $sql->bindValue('timestamp', time_toDatetime($timestamp), PDO::PARAM_STR); $sql->bindValue('entry', $entry, PDO::PARAM_STR); return $sql->execute(); }
/** user wants to initiate artefact. thus he has first to pay the fee successfully * then the status of the artefact can be set to ARTEFACT_INITIATING. */ function artefact_beginInitiation($artefact) { global $db, $resourceTypeList, $buildingTypeList, $unitTypeList, $scienceTypeList, $defenseSystemTypeList; // Artefakt muss einweihbar sein if ($artefact['initiated'] != ARTEFACT_UNINITIATED) { return _('Dieses Artefakt kann nicht noch einmal eingeweiht werden.'); } // Hol das Einweihungsritual $ritual = artefact_getRitualByID($artefact['initiationID']); if ($ritual === FALSE) { return _('Fehler: Ritual nicht gefunden.'); } // get initiation costs $costs = array(); $temp = array_merge($resourceTypeList, $buildingTypeList, $unitTypeList, $scienceTypeList, $defenseSystemTypeList); foreach ($temp as $val) { if ($ritual[$val->dbFieldName]) { $costs[$val->dbFieldName] = $ritual[$val->dbFieldName]; } } $set = array(); $setBack = array(); $where = array("WHERE caveID = '{$artefact['caveID']}'"); // get all the costs foreach ($costs as $key => $value) { array_push($set, "{$key} = {$key} - ({$value})"); array_push($setBack, "{$key} = {$key} + ({$value})"); array_push($where, "{$key} >= ({$value})"); } // generate SQL if (sizeof($set)) { $set = implode(", ", $set); $set = "UPDATE Cave SET {$set} "; $setBack = implode(", ", $setBack); $setBack = "UPDATE Cave SET {$setBack} WHERE caveID = '{$artefact['caveID']}'"; } $where = implode(" AND ", $where); // substract costs //echo "try to substract costs:<br>" . $set.$where . "<br><br>"; if (!$db->query($set . $where) || !$db->affected_rows() == 1) { return _('Es fehlen die notwendigen Voraussetzungen.'); } // register event $now = time(); $sql = sprintf("INSERT INTO Event_artefact " . "(caveID, artefactID, event_typeID, `start`, `end`) " . "VALUES (%d, %d, 1, '%s', '%s')", $artefact['caveID'], $artefact['artefactID'], time_toDatetime($now), time_toDatetime($now + $ritual['duration'])); if (!$db->query($sql)) { $db->query($setBack); return _('Sie weihen bereits ein anderes Artefakt ein.'); } // finally set status to initiating $sql = "UPDATE Artefact SET initiated = " . ARTEFACT_INITIATING . " WHERE artefactID = {$artefact['artefactID']}"; $dbresult = $db->query($sql); if (!$dbresult) { return _('Fehler: Artefakt konnte nicht auf ARTEFACT_INITIATING gestellt werden.'); } return _('erfolgreich eingeweiht'); }
function science_processOrder($scienceID, $caveID, $cave) { global $defenseSystemTypeList, $buildingTypeList, $scienceTypeList, $resourceTypeList, $unitTypeList; global $config, $db; $science = $scienceTypeList[$scienceID]; $maxLevel = round(eval('return ' . formula_parseToPHP("{$science->maxLevel};", '$cave'))); // check, that this science isn't researched in an other cave at the // same time $sql = $db->prepare("SELECT event_scienceID\n FROM " . EVENT_SCIENCE_TABLE . "\n WHERE playerID = :playerID \n AND scienceID = :scienceID"); $sql->bindValue('playerID', $_SESSION['player']->playerID, PDO::PARAM_INT); $sql->bindValue('scienceID', $scienceID, PDO::PARAM_INT); if ($sql->rowCountSelect() != 0) { return 4; } // check for scienceMaxDeps in Event_Handler $dep_count = 0; $deps = ''; foreach ($science->maxScienceDepList as $key => $value) { if ($value != -1 && $cave[$scienceTypeList[$key]->dbFieldName] > $value - 1) { if ($dep_count) { $deps .= ", "; } $deps .= $key; $dep_count++; } } if ($dep_count) { $sql = $db->prepare("SELECT event_scienceID\n FROM " . EVENT_SCIENCE_TABLE . "\n WHERE playerID = :playerID\n AND scienceID IN ({$deps})"); $sql->bindValue('playerID', $_SESSION['player']->playerID, PDO::PARAM_INT); if ($sql->rowCountSelect() != 0) { return 5; } } // take production costs from cave if (!processProductionCost($science, $caveID, $cave)) { return 2; } $prodTime = 0; // calculate the production time; if ($time_formula = $science->productionTimeFunction) { $time_eval_formula = formula_parseToPHP($time_formula, '$cave'); $time_eval_formula = "\$prodTime={$time_eval_formula};"; eval($time_eval_formula); } $prodTime *= SCIENCE_TIME_BASE_FACTOR; $now = time(); $sql = $db->prepare("INSERT INTO " . EVENT_SCIENCE_TABLE . " (caveID, playerID, scienceID, " . "start, end) VALUES (:caveID, :playerID, :scienceID, :start, :end)"); $sql->bindValue('caveID', $caveID, PDO::PARAM_INT); $sql->bindValue('playerID', $_SESSION['player']->playerID, PDO::PARAM_INT); $sql->bindValue('scienceID', $scienceID, PDO::PARAM_INT); $sql->bindValue('start', time_toDatetime($now), PDO::PARAM_STR); $sql->bindValue('end', time_toDatetime($now + $prodTime), PDO::PARAM_STR); if (!$sql->execute() || !$sql->rowCount() == 1) { processProductionCostSetBack($science, $caveID, $cave); return 2; } return 3; }
function wonder_processOrder($playerID, $wonderID, $caveID, $coordX, $coordY, $caveData, $db) { global $defenseSystemTypeList, $unitTypeList, $buildingTypeList, $scienceTypeList, $resourceTypeList, $wonderTypeList, $WONDERRESISTANCE; if ($wonderTypeList[$wonderID]->target == "same") { $targetID = $caveID; $query = "SELECT * FROM Cave " . "WHERE caveID = '{$targetID}' "; if (!($result = $db->query($query)) || !($targetData = $result->nextRow())) { return -3; } $coordX = $targetData['xCoord']; $coordY = $targetData['yCoord']; } else { // check the target cave $query = "SELECT * FROM Cave " . "WHERE xCoord = '{$coordX}' " . "AND yCoord = '{$coordY}'"; if (!($result = $db->query($query)) || !($targetData = $result->nextRow())) { return -3; } $targetID = $targetData['caveID']; } // check, if cave allowed if ($wonderTypeList[$wonderID]->target == "own") { $allowed = $playerID == $targetData['playerID']; } else { if ($wonderTypeList[$wonderID]->target == "other") { $allowed = $playerID != $targetData['playerID']; } else { // $wonderTypeList[$wonderID]->target == "all" or == "same" $allowed = 1; } } if (!$allowed) { return -2; } $set = array(); $setBack = array(); $where = array("WHERE caveID = '{$caveID}' "); // get all the resource costs foreach ($wonderTypeList[$wonderID]->resourceProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $dbField = $resourceTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - ({$formula})"); array_push($setBack, "{$dbField} = {$dbField} + ({$formula})"); array_push($where, "{$dbField} >= ({$formula})"); } } // get all the unit costs foreach ($wonderTypeList[$wonderID]->unitProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $dbField = $unitTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - {$formula}"); array_push($setBack, "{$dbField} = {$dbField} + {$formula}"); array_push($where, "{$dbField} >= {$formula}"); } } foreach ($wonderTypeList[$wonderID]->buildingProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $dbField = $buildingTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - {$formula}"); array_push($setBack, "{$dbField} = {$dbField} + {$formula}"); array_push($where, "{$dbField} >= {$formula}"); } } // generate SQL if (sizeof($set)) { $set = implode(", ", $set); $set = "UPDATE Cave SET {$set} "; $setBack = implode(", ", $setBack); $setBack = "UPDATE Cave SET {$setBack} WHERE caveID = '{$caveID}'"; } // generate dependecies foreach ($wonderTypeList[$wonderID]->buildingDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$buildingTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($wonderTypeList[$wonderID]->maxBuildingDepList as $key => $value) { if ($value != -1) { array_push($where, "{$wonderTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($wonderTypeList[$wonderID]->defenseSystemDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$defenseSystemTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($wonderTypeList[$wonderID]->maxDefenseSystemDepList as $key => $value) { if ($value != -1) { array_push($where, "{$defenseSystemTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($wonderTypeList[$wonderID]->resourceDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$resourceTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($wonderTypeList[$wonderID]->maxResourceDepList as $key => $value) { if ($value != -1) { array_push($where, "{$resourceTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($wonderTypeList[$wonderID]->scienceDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$scienceTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($wonderTypeList[$wonderID]->maxScienceDepList as $key => $value) { if ($value != -1) { array_push($where, "{$scienceTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($wonderTypeList[$wonderID]->unitDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$unitTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($wonderTypeList[$wonderID]->maxUnitDepList as $key => $value) { if ($value != -1) { array_push($where, "{$unitTypeList[$key]->dbFieldName} <= {$value}"); } } $where = implode(" AND ", $where); if (!$db->query($set . $where) || $db->affected_rows() != 1) { return 0; } // calculate the chance and evaluate into $chance if ($chance_formula = $wonderTypeList[$wonderID]->chance) { $chance_eval_formula = formula_parseToPHP($chance_formula, '$caveData'); $chance_eval_formula = "\$chance={$chance_eval_formula};"; eval($chance_eval_formula); } // if this wonder is offensive // calculate the wonder resistance and evaluate into $resistance // TODO: Wertebereich der Resistenz ist derzeit 0 - 1, also je höher desto resistenter if ($wonderTypeList[$wonderID]->offensiveness == "offensive") { $resistance_eval_formula = formula_parseToPHP($WONDERRESISTANCE, '$targetData'); $resistance_eval_formula = "\$resistance={$resistance_eval_formula};"; eval($resistance_eval_formula); } else { $resistance = 0.0; } // does the wonder fail? if ((double) rand() / (double) getRandMax() > $chance - $resistance) { return 2; // wonder did fail } // schedule the wonder's impacts // create a random factor between -0.3 and +0.3 $delayRandFactor = rand(0, getrandmax()) / getrandmax() * 0.6 - 0.3; // now calculate the delayDelta depending on the first impact's delay $delayDelta = $wonderTypeList[$wonderID]->impactList[0]['delay'] * $delayRandFactor; foreach ($wonderTypeList[$wonderID]->impactList as $impactID => $impact) { $delay = (int) (($delayDelta + $impact['delay']) * WONDER_TIME_BASE_FACTOR); $now = time(); $query = sprintf("INSERT INTO Event_wonder (casterID, sourceID, targetID, " . "wonderID, impactID, `start`, `end`) " . "VALUES (%d, %d, %d, %d, %d, '%s', '%s')", $playerID, $caveID, $targetID, $wonderID, $impactID, time_toDatetime($now), time_toDatetime($now + $delay)); if (!$db->query($query)) { $db->query($setBack); return -1; } } // create messages $sourceMessage = "Sie haben auf die Höhle in {$coordX}/{$coordY} ein Wunder " . $wonderTypeList[$wonderID]->name . " erwirkt."; $targetMessage = "Der Besitzer der Höhle in {$caveData['xCoord']}/{$caveData['yCoord']} " . "hat auf Ihre Höhle in {$coordX}/{$coordY} ein Wunder gewirkt."; messages_sendSystemMessage($playerID, 9, "Wunder erwirkt auf {$coordX}/{$coordY}", $sourceMessage, $db); messages_sendSystemMessage($targetData['playerID'], 9, "Wunder!", $targetMessage, $db); return 1; }
function wonder_processOrder($playerID, $wonderID, $caveID, $coordX, $coordY, $caveData) { global $db; if ($GLOBALS['wonderTypeList'][$wonderID]->target == "same") { $targetID = $caveID; $sql = $db->prepare("SELECT * FROM " . CAVE_TABLE . " \n WHERE caveID = :targetID"); $sql->bindValue('targetID', $targetID); if (!$sql->execute() || !($targetData = $sql->fetch(PDO::FETCH_ASSOC))) { return -3; } $sql->closeCursor(); $coordX = $targetData['xCoord']; $coordY = $targetData['yCoord']; } else { // check the target cave $sql = $db->prepare("SELECT * FROM " . CAVE_TABLE . " \n WHERE xCoord = :coordX\n AND yCoord = :coordY"); $sql->bindValue('coordX', $coordX, PDO::PARAM_INT); $sql->bindValue('coordY', $coordY, PDO::PARAM_INT); if (!$sql->execute() || !($targetData = $sql->fetch(PDO::FETCH_ASSOC))) { return -3; } $sql->closeCursor(); $targetID = $targetData['caveID']; } // check, if cave allowed if ($GLOBALS['wonderTypeList'][$wonderID]->target == "own") { $allowed = $playerID == $targetData['playerID']; } else { if ($GLOBALS['wonderTypeList'][$wonderID]->target == "other") { $allowed = $playerID != $targetData['playerID']; } else { // $wonderTypeList[$wonderID]->target == "all" or == "same" $allowed = 1; } } if (!$allowed) { return -2; } // take production costs from cave if (!processProductionCost($GLOBALS['wonderTypeList'][$wonderID], $caveID, $caveData)) { return 0; } // calculate the chance and evaluate into $chance if ($chance_formula = $GLOBALS['wonderTypeList'][$wonderID]->chance) { $chance_eval_formula = formula_parseToPHP($chance_formula, '$caveData'); $chance_eval_formula = "\$chance={$chance_eval_formula};"; eval($chance_eval_formula); } // if this wonder is offensive // calculate the wonder resistance and evaluate into $resistance // TODO: Wertebereich der Resistenz ist derzeit 0 - 1, also je höher desto resistenter if ($GLOBALS['wonderTypeList'][$wonderID]->offensiveness == "offensive") { $resistance_eval_formula = formula_parseToPHP(GameConstants::WONDER_RESISTANCE, '$targetData'); $resistance_eval_formula = "\$resistance={$resistance_eval_formula};"; eval($resistance_eval_formula); } else { $resistance = 0.0; } // does the wonder fail? if ((double) rand() / (double) getRandMax() > $chance - $resistance) { return 2; // wonder did fail } // schedule the wonder's impacts // create a random factor between -0.3 and +0.3 $delayRandFactor = rand(0, getrandmax()) / getrandmax() * 0.6 - 0.3; // now calculate the delayDelta depending on the first impact's delay $delayDelta = $GLOBALS['wonderTypeList'][$wonderID]->impactList[0]['delay'] * $delayRandFactor; foreach ($GLOBALS['wonderTypeList'][$wonderID]->impactList as $impactID => $impact) { $delay = (int) (($delayDelta + $impact['delay']) * WONDER_TIME_BASE_FACTOR); $now = time(); $sql = $db->prepare("INSERT INTO " . EVENT_WONDER_TABLE . " (casterID, sourceID, targetID, \n wonderID, impactID, start, end) \n VALUES (:playerID, :caveID, :targetID, :wonderID, :impactID, :start, :end)"); $sql->bindValue('playerID', $playerID, PDO::PARAM_INT); $sql->bindValue('caveID', $caveID, PDO::PARAM_INT); $sql->bindValue('targetID', $targetID, PDO::PARAM_INT); $sql->bindValue('wonderID', $wonderID, PDO::PARAM_INT); $sql->bindValue('impactID', $impactID, PDO::PARAM_INT); $sql->bindValue('start', time_toDatetime($now), PDO::PARAM_STR); $sql->bindValue('end', time_toDatetime($now + $delay), PDO::PARAM_STR); if (!$sql->execute()) { //give production costs back processProductionCostSetBack($GLOBALS['wonderTypeList'][$wonderID], $caveID, $caveData); return -1; } } // create messages $messageClass = new Messages(); $sourceMessage = 'Sie haben auf die Höhle in ' . $coordX . '/' . $coordY . ' ein Wunder ' . $GLOBALS['wonderTypeList'][$wonderID]->name . ' erwirkt.'; $targetMessage = 'Der Besitzer der Höhle in ' . $caveData['xCoord'] . '/' . $caveData['yCoord'] . ' hat auf Ihre Höhle in ' . $coordX . '/' . $coordY . ' ein Wunder gewirkt.'; // create xml message $casterxml = new SimpleXMLElement('<?xml version=\'1.0\' encoding=\'utf-8\'?><wonderMessageCaster></wonderMessageCaster>'); $casterxml->addChild('timestamp', time()); $casterxml->addChild('wonderType', 'caster'); $casterxml->addChild('source'); $casterxml->source->addChild('xCoord', $caveData['xCoord']); $casterxml->source->addChild('yCoord', $caveData['yCoord']); $casterxml->source->addChild('caveName', $caveData['name']); $casterxml->addChild('target'); $casterxml->target->addChild('xCoord', $targetData['xCoord']); $casterxml->target->addChild('yCoord', $targetData['yCoord']); $casterxml->target->addChild('caveName', $targetData['name']); $casterxml->addChild('wonderName', $GLOBALS['wonderTypeList'][$wonderID]->name); $targetxml = new SimpleXMLElement('<?xml version=\'1.0\' encoding=\'utf-8\'?><wonderMessageTarget></wonderMessageTarget>'); $targetxml->addChild('timestamp', time()); $targetxml->addChild('wonderType', 'target'); $targetxml->addChild('source'); $targetxml->source->addChild('xCoord', $caveData['xCoord']); $targetxml->source->addChild('yCoord', $caveData['yCoord']); $targetxml->source->addChild('caveName', $caveData['name']); $targetxml->addChild('target'); $targetxml->target->addChild('xCoord', $targetData['xCoord']); $targetxml->target->addChild('yCoord', $targetData['yCoord']); $targetxml->target->addChild('caveName', $targetData['name']); $messageClass->sendSystemMessage($playerID, 9, 'Wunder erwirkt auf ' . $coordX . '/' . $coordY, $sourceMessage, $casterxml->asXML()); $messageClass->sendSystemMessage($targetData['playerID'], 9, 'Wunder!', $targetMessage, $targetxml->asXML()); return 1; }
function page_ore() { //TODO return; global $db; $now = time(); // increment time diff count if (isset($_SESSION['ore_time'])) { $diff = $now - $_SESSION['ore_time']; if (!isset($_SESSION['ore_time_diff'][$diff])) { $_SESSION['ore_time_diff'][$diff] = 1; } else { $_SESSION['ore_time_diff'][$diff]++; } // increment counter and log if required if (++$_SESSION['ore_counter'] == 50) { $sql = $db->prepare("INSERT INTO ore_log\n (playerID, time_diff, stamp, sid)\n VALUES (:playerID, :time_diff, :stamp, :sid)"); $sql->bindValue('playerID', $_SESSION['player']->playerID, PDO::PARAM_INT); $sql->bindValue('time_diff', addslashes(var_export($_SESSION['ore_time_diff'], TRUE)), PDO::PARAM_INT); $sql->bindValue('stamp', addslashes(time_toDatetime($now)), PDO::PARAM_STR); $sql->bindValue('sid', session_id(), PDO::PARAM_STR); $sql->execute(); $_SESSION['ore_counter'] = 0; } } // set new timestamp $_SESSION['ore_time'] = $now; }
function addHistoryEntry($db, $playerID, $entry, $timestamp = -1) { if ($timestamp == -1) { $timestamp = time(); } // prepare query $query = sprintf("INSERT INTO `player_history` (`playerID`, `timestamp`, " . "`entry`) VALUES (%d, '%s', '%s')", (int) $playerID, time_toDatetime($timestamp), addslashes($entry)); return $db->query($query); }
function setMovementEvent($caveID, $caveData, $targetX, $targetY, $unit, $resource, $movementID, $reqFood, $absDuration, $artefactID, $heroID, $caveSpeedFactor) { global $db; // ziel-hoehlenID holen $sql = $db->prepare("SELECT caveID FROM " . CAVE_TABLE . " \n WHERE xCoord = :targetX AND yCoord = :targetY"); $sql->bindValue('targetX', $targetX, PDO::PARAM_INT); $sql->bindVAlue('targetY', $targetY, PDO::PARAM_INT); if ($sql->rowCountSelect() != 1) { return 1; } if (!$sql->execute()) { return 1; } $row = $sql->fetch(); $sql->closeCursor(); $targetCaveID = $row['caveID']; // updates fuer cave basteln $update = "UPDATE " . CAVE_TABLE . " "; $updateRollback = "UPDATE " . CAVE_TABLE . " "; $where = "WHERE caveID = {$caveID} "; $whereRollback = "WHERE caveID = {$caveID} "; $set = $setRollback = array(); foreach ($unit as $unitID => $value) { if (!empty($value)) { $set[] = $GLOBALS['unitTypeList'][$unitID]->dbFieldName . " = " . $GLOBALS['unitTypeList'][$unitID]->dbFieldName . " - {$value} "; $setRollback[] = $GLOBALS['unitTypeList'][$unitID]->dbFieldName . " = " . $GLOBALS['unitTypeList'][$unitID]->dbFieldName . " + {$value} "; $where .= "AND " . $GLOBALS['unitTypeList'][$unitID]->dbFieldName . " >= {$value} "; $where .= "AND {$value} >= 0 "; // check for values bigger 0! } } foreach ($resource as $resourceID => $value) { $value_to_check = $value; if ($resourceID == GameConstants::FUEL_RESOURCE_ID) { $value += $reqFood; } if (!empty($value) || !empty($value_to_check)) { $set[] = $GLOBALS['resourceTypeList'][$resourceID]->dbFieldName . " = " . $GLOBALS['resourceTypeList'][$resourceID]->dbFieldName . " - {$value} "; $setRollback[] = $GLOBALS['resourceTypeList'][$resourceID]->dbFieldName . " = " . $GLOBALS['resourceTypeList'][$resourceID]->dbFieldName . " + {$value} "; $where .= "AND " . $GLOBALS['resourceTypeList'][$resourceID]->dbFieldName . " >= {$value} "; if (!empty($value_to_check)) { $where .= "AND {$value_to_check} >= 0 "; } } } $update = $update . "SET " . implode(", ", $set) . $where; $updateRollback = $updateRollback . "SET " . implode(", ", $setRollback) . $whereRollback; if (!$db->exec($update)) { return 2; } // remove the artefact if any if ($artefactID > 0) { // TODO: what should happen, if the first succedes but one of the other fails afterwards if (!artefact_removeEffectsFromCave($artefactID)) { $db->query($updateRollback); return 3; } if (!artefact_uninitiateArtefact($artefactID)) { $db->query($updateRollback); return 3; } if (!artefact_removeArtefactFromCave($artefactID)) { $db->query($updateRollback); return 3; } } // remove hero if any if ($heroID > 0) { if (!hero_removeHeroFromCave($heroID)) { return 3; } } // insert fuer movement_event basteln $now = time(); $insert = "INSERT INTO " . EVENT_MOVEMENT_TABLE . " (caveID, source_caveID, target_caveID, movementID, `start`, `end`, artefactID, heroID, speedFactor, exposeChance, "; $i = 0; foreach ($unit as $uID => $val) { if (!empty($val)) { if ($i++ != 0) { $insert .= " , "; } $insert .= $GLOBALS['unitTypeList'][$uID]->dbFieldName; } } foreach ($resource as $rID => $val) { if (!empty($val)) { $insert .= " , " . $GLOBALS['resourceTypeList'][$rID]->dbFieldName; } } $speedFactor = getMaxSpeedFactor($unit) * $caveSpeedFactor; // determine expose chance $exposeChance = (double) rand() / (double) getRandMax(); $insert .= sprintf(" ) VALUES (%d, %d, %d, %d, " . "'%s', '%s', %d, %d, %f, %f, ", $caveID, $caveID, $targetCaveID, $movementID, time_toDatetime($now), time_toDatetime($now + $absDuration * 60), $artefactID, $heroID, $speedFactor, $exposeChance); $i = 0; foreach ($unit as $val) { if (!empty($val)) { if ($i++ != 0) { $insert .= " , "; } $insert .= $val; } } foreach ($resource as $val) { if (!empty($val)) { $insert .= " , " . $val; } } $insert .= " )"; if (!$db->exec($insert)) { // update rueckgaengig machen $db->query($updateRollback); return 3; } return 0; }
function weather_generate() { global $db; // get regions $regions = getRegions(); // get weather $weather = weather_getWeatherWonders(); foreach ($regions as $region) { if (!$region['startRegion']) { weather_log('Skipping unused region %s.', $region['name']); continue; } weather_log('Processing region %s.', $region['name']); // pick a random weather $regionweather = $weather[array_rand($weather)]; weather_log('Selected Weather: %s', $regionweather->name); // save weather information in DB $sql = $db->prepare("UPDATE " . REGIONS_TABLE . "\n SET weather = :weather\n WHERE regionID = :regionID"); $sql->bindValue('weather', $regionweather->weatherID, PDO::PARAM_INT); $sql->bindValue('regionID', $region['regionID'], PDO::PARAM_INT); if (!$sql->execute()) { weather_log('Failed to execute query: %s', $query); return -1; } $sql = $db->prepare("INSERT INTO " . EVENT_WEATHER_TABLE . "\n (regionID, weatherID, impactID, start, end)\n VALUES (:regionID, :weatherID, :impactID, :start, :end)"); foreach ($regionweather->impactList as $impactID => $impact) { $delay = (int) ($impact['delay'] * WEATHER_TIME_BASE_FACTOR); $now = time(); $sql->bindValue('regionID', $region['regionID'], PDO::PARAM_INT); $sql->bindValue('weatherID', $regionweather->weatherID, PDO::PARAM_INT); $sql->bindValue('impactID', $impactID, PDO::PARAM_INT); $sql->bindValue('start', time_toDatetime($now), PDO::PARAM_STR); $sql->bindValue('end', time_toDatetime($now + $delay), PDO::PARAM_STR); if (!$sql->execute()) { weather_log('Failed to execute query'); return -1; } } } }
function improvement_processOrder($buildingID, $caveID, $caveData) { global $db; $sql = $db->prepare("SELECT count(*) as count\n FROM " . EVENT_EXPANSION_TABLE . " \n WHERE caveID = :caveID"); $sql->bindValue('caveID', $caveID, PDO::PARAM_INT); if (!$sql->execute()) { return 2; } $return = $sql->fetch(); $sql->closeCursor(); if ($return['count'] != 0) { return 2; } $building = $GLOBALS['buildingTypeList'][$buildingID]; // take production costs from cave if (!processProductionCost($building, $caveID, $caveData)) { return 2; } $prodTime = 0; // calculate the production time; if ($time_formula = $building->productionTimeFunction) { $time_eval_formula = formula_parseToPHP($time_formula, '$caveData'); $time_eval_formula = "\$prodTime={$time_eval_formula};"; eval($time_eval_formula); } $prodTime *= BUILDING_TIME_BASE_FACTOR; $now = time(); $sql = $db->prepare("INSERT INTO " . EVENT_EXPANSION_TABLE . " \n (caveID, expansionID, start, end) \n VALUES (:caveID, :expansionID, :start, :end)"); $sql->bindValue('caveID', $caveID, PDO::PARAM_INT); $sql->bindValue('expansionID', $buildingID, PDO::PARAM_INT); $sql->bindValue('start', time_toDatetime($now), PDO::PARAM_STR); $sql->bindValue('end', time_toDatetime($now + $prodTime), PDO::PARAM_STR); if (!$sql->execute() || !$sql->rowCount() == 1) { processProductionCostSetBack($building, $caveID, $caveData); return 2; } return 3; }
/** user wants to initiate artefact. thus he has first to pay the fee successfully * then the status of the artefact can be set to ARTEFACT_INITIATING. */ function artefact_beginInitiation($artefact) { global $db; // Artefakt muss einweihbar sein if ($artefact['initiated'] != ARTEFACT_UNINITIATED) { return -5; } // Hol das Einweihungsritual $ritual = artefact_getRitualByID($artefact['initiationID']); if ($ritual === FALSE) { return -1; } // get initiation costs $costs = array(); $temp = array_merge($GLOBALS['resourceTypeList'], $GLOBALS['buildingTypeList'], $GLOBALS['unitTypeList'], $GLOBALS['scienceTypeList'], $GLOBALS['defenseSystemTypeList']); foreach ($temp as $val) { if (isset($ritual[$val->dbFieldName])) { if ($ritual[$val->dbFieldName]) { $costs[$val->dbFieldName] = $ritual[$val->dbFieldName]; } } } $set = array(); $setBack = array(); $where = array("WHERE caveID = '{$artefact['caveID']}'"); // get all the costs foreach ($costs as $key => $value) { array_push($set, "{$key} = {$key} - ({$value})"); array_push($setBack, "{$key} = {$key} + ({$value})"); array_push($where, "{$key} >= ({$value})"); } $where = implode(" AND ", $where); // generate SQL if (sizeof($set)) { $set = implode(", ", $set); if (!$db->exec("UPDATE " . CAVE_TABLE . " SET {$set} {$where}")) { return -2; } $setBack = implode(", ", $setBack); $setBack = "UPDATE " . CAVE_TABLE . " SET {$setBack} WHERE caveID = '{$artefact['caveID']}'"; } else { return -2; } // register event $now = time(); $sql = $db->prepare("INSERT INTO " . EVENT_ARTEFACT_TABLE . "\n (caveID, artefactID, event_typeID, start, end)\n VALUES\n (:caveID, :artefactID, 1, :start, :end)"); $sql->bindValue('caveID', $artefact['caveID'], PDO::PARAM_INT); $sql->bindValue('artefactID', $artefact['artefactID'], PDO::PARAM_INT); $sql->bindValue('start', time_toDatetime($now), PDO::PARAM_STR); $sql->bindValue('end', time_toDatetime($now + $ritual['duration']), PDO::PARAM_STR); if (!$sql->execute()) { $db->query($setBack); return -3; } // finally set status to initiating $sql = $db->prepare("UPDATE " . ARTEFACT_TABLE . "\n SET initiated = " . ARTEFACT_INITIATING . " \n WHERE artefactID = :artefactID"); $sql->bindValue('artefactID', $artefact['artefactID'], PDO::PARAM_INT); if (!$sql->execute()) { $db->query($setBack); return -4; } return 1; }
function science_processOrder($scienceID, $caveID, $playerID, $caveData, $db) { global $defenseSystemTypeList, $buildingTypeList, $scienceTypeList, $resourceTypeList, $unitTypeList, $config; $science = $scienceTypeList[$scienceID]; $maxLevel = round(eval('return ' . formula_parseToPHP("{$science->maxLevel};", '$caveData'))); // check, that this science isn't researched in an other cave at the // same time $sql = "SELECT event_scienceID FROM Event_science " . "WHERE playerID='{$playerID}' AND scienceID = '{$scienceID}'"; $r = $db->query($sql); if (!$r) { page_dberror(); } if (!$r->isEmpty()) { return 4; } // check for scienceMaxDeps in Event_Handler $dep_count = 0; foreach ($science->maxScienceDepList as $key => $value) { if ($value != -1 && $caveData[$scienceTypeList[$key]->dbFieldName] > $value - 1) { if ($dep_count) { $deps .= ","; } $deps .= $key; $dep_count++; } } if ($dep_count) { $query = "SELECT event_scienceID FROM Event_science " . "WHERE playerID = '{$playerID}' AND scienceID IN ({$deps})"; if (!($r = $db->query($query))) { page_dberror(); } if (!$r->isEmpty()) { return 5; } } $set = array(); $setBack = array(); $where = array("WHERE caveID = '{$caveID}'", "{$science->dbFieldName} < {$maxLevel}"); // get all the resource costs foreach ($science->resourceProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $dbField = $resourceTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - ({$formula})"); array_push($setBack, "{$dbField} = {$dbField} + ({$formula})"); array_push($where, "{$dbField} >= ({$formula})"); } } // get all the unit costs foreach ($science->unitProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $dbField = $unitTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - {$formula}"); array_push($setBack, "{$dbField} = {$dbField} + {$formula}"); array_push($where, "{$dbField} >= {$formula}"); } } // get all the building costs foreach ($science->buildingProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $dbField = $buildingTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - {$formula}"); array_push($setBack, "{$dbField} = {$dbField} + {$formula}"); array_push($where, "{$dbField} >= {$formula}"); } } // get all the external costs foreach ($science->externalProductionCost as $key => $value) { if ($value != "" && $value != "0") { $formula = formula_parseToSQL($value); $dbField = $defenseSystemTypeList[$key]->dbFieldName; array_push($set, "{$dbField} = {$dbField} - {$formula}"); array_push($setBack, "{$dbField} = {$dbField} + {$formula}"); array_push($where, "{$dbField} >= {$formula}"); } } // generate SQL if (sizeof($set)) { $set = implode(", ", $set); $set = "UPDATE Cave SET {$set} "; $setBack = implode(", ", $setBack); $setBack = "UPDATE Cave SET {$setBack} WHERE caveID = '{$caveID}'"; } // generate dependecies foreach ($science->buildingDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$buildingTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($science->maxBuildingDepList as $key => $value) { if ($value != -1) { array_push($where, "{$buildingTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($science->defenseSystemDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$defenseSystemTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($science->maxDefenseSystemDepList as $key => $value) { if ($value != -1) { array_push($where, "{$defenseSystemTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($science->resourceDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$resourceTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($science->maxResourceDepList as $key => $value) { if ($value != -1) { array_push($where, "{$resourceTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($science->scienceDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$scienceTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($science->maxScienceDepList as $key => $value) { if ($value != -1) { array_push($where, "{$scienceTypeList[$key]->dbFieldName} <= {$value}"); } } foreach ($science->unitDepList as $key => $value) { if ($value != "" && $value != "0") { array_push($where, "{$unitTypeList[$key]->dbFieldName} >= {$value}"); } } foreach ($science->maxUnitDepList as $key => $value) { if ($value != -1) { array_push($where, "{$unitTypeList[$key]->dbFieldName} <= {$value}"); } } $where = implode(" AND ", $where); if (!$db->query($set . $where) || !$db->affected_rows() == 1) { return 2; } $prodTime = 0; // calculate the production time; if ($time_formula = $science->productionTimeFunction) { $time_eval_formula = formula_parseToPHP($time_formula, '$caveData'); $time_eval_formula = "\$prodTime={$time_eval_formula};"; eval($time_eval_formula); } $prodTime *= SCIENCE_TIME_BASE_FACTOR; $now = time(); $query = sprintf("INSERT INTO Event_science (caveID, playerID, scienceID, " . "`start`, `end`) VALUES (%d, %d, %d, '%s', '%s')", $caveID, $playerID, $scienceID, time_toDatetime($now), time_toDatetime($now + $prodTime)); if (!$db->query($query)) { $db->query($setBack); return 2; } return 3; }
function merchant_processOrder($tradeID, $caveID, $caveData) { global $db; $sql = $db->prepare("SELECT LockTill < :LockTill as allowed\n FROM " . TRADELOCK_TABLE . "\n WHERE PlayerID= :playerID \n AND cat = :cat"); $sql->bindValue('LockTill', date("Y-m-d H:i:s", time()), PDO::PARAM_STR); $sql->bindValue('playerID', $_SESSION['player']->playerID, PDO::PARAM_INT); $sql->bindValue('cat', $GLOBALS['tradeTypeList'][$tradeID]->category, PDO::PARAM_STR); if ($sql->execute()) { $row = $sql->fetch(PDO::FETCH_ASSOC); if ($row["allowed"] == 0 && $row) { return -2; } } $sql = $db->prepare("DELETE FROM " . TRADELOCK_TABLE . "\n WHERE PlayerID= :playerID\n AND cat = :cat"); $sql->bindValue('playerID', $_SESSION['player']->playerID, PDO::PARAM_INT); $sql->bindValue('cat', $GLOBALS['tradeTypeList'][$tradeID]->category, PDO::PARAM_STR); if (!$sql->execute()) { return -1; } // take production costs from cave if (!processProductionCost($GLOBALS['tradeTypeList'][$tradeID], $caveID, $caveData)) { return 0; } $now = time(); if ($GLOBALS['tradeTypeList'][$tradeID]->category == "potion") { foreach ($GLOBALS['tradeTypeList'][$tradeID]->impactList[0]['potions'] as $potionID => $potion) { if (!$GLOBALS['potionTypeList'][$potionID]) { processProductionCostSetBack($GLOBALS['tradeTypeList'][$tradeID], $caveID, $caveData); return -1; } $sql = $db->prepare("UPDATE " . PLAYER_TABLE . "\n SET " . $GLOBALS['potionTypeList'][$potionID]->dbFieldName . " = " . $GLOBALS['potionTypeList'][$potionID]->dbFieldName . " + :absolute \n WHERE playerID = :playerID"); $sql->bindValue('absolute', $potion['absolute'], PDO::PARAM_INT); $sql->bindValue('playerID', $_SESSION['player']->playerID, PDO::PARAM_INT); if (!$sql->execute() || $sql->rowCount() == 0) { processProductionCostSetBack($GLOBALS['tradeTypeList'][$tradeID], $caveID, $caveData); return -1; } } } else { // create a random factor between -0.3 and +0.3 $delayRandFactor = rand(0, getrandmax()) / getrandmax() * 0.6 - 0.3; // now calculate the delayDelta depending on the first impact's delay $delayDelta = $GLOBALS['tradeTypeList'][$tradeID]->impactList[0]['delay'] * $delayRandFactor; foreach ($GLOBALS['tradeTypeList'][$tradeID]->impactList as $impactID => $impact) { $delay = (int) (($delayDelta + $impact['delay']) * WONDER_TIME_BASE_FACTOR); $sql = $db->prepare("INSERT INTO " . EVENT_TRADE_TABLE . " \n (targetID, tradeID, impactID, start, end)\n VALUES (:targetID, :tradeID, :impactID, :start, :end)"); $sql->bindValue('targetID', $caveID, PDO::PARAM_INT); $sql->bindValue('tradeID', $tradeID - 1, PDO::PARAM_INT); $sql->bindValue('impactID', $impactID, PDO::PARAM_INT); $sql->bindValue('start', time_toDatetime($now), PDO::PARAM_STR); $sql->bindValue('end', time_toDatetime($now + $delay), PDO::PARAM_STR); if (!$sql->execute() || $sql->rowCount() == 0) { processProductionCostSetBack($GLOBALS['tradeTypeList'][$tradeID], $caveID, $caveData); return -1; } } } $lock = $now + $GLOBALS['tradeCategoriesTypeList'][$GLOBALS['tradeTypeList'][$tradeID]->category]->secondsbetween; $sql = $db->prepare("INSERT INTO " . TRADELOCK_TABLE . " \n (PlayerID, cat, LockTill)\n VALUES (:playerID, :cat, :LockTill)"); $sql->bindValue('playerID', $_SESSION['player']->playerID, PDO::PARAM_INT); $sql->bindValue('cat', $GLOBALS['tradeTypeList'][$tradeID]->category, PDO::PARAM_STR); $sql->bindValue('LockTill', time_toDatetime($lock), PDO::PARAM_STR); if (!$sql->execute() || $sql->rowCount() == 0) { return -1; } return 1; }
public static function processWonder($wonderID, $casterTribeData, $targetTribeName) { global $db; if ($wonderID < 0 || empty($casterTribeData) || empty($targetTribeName)) { return -30; } // check if wonder exists and is TribeWonder if (isset($GLOBALS['wonderTypeList'][$wonderID]) || !$wonder->isTribeWonder) { $wonder = $GLOBALS['wonderTypeList'][$wonderID]; } else { return -33; } // check if tribes exist $targetTribeData = Tribe::getID($targetTribeName, true); if (empty($targetTribeData)) { return -15; } $casterTribeID = $casterTribeData['tribeID']; $targetTribeID = $targetTribeData['tribeID']; // check if tribe is valid if (!$targetTribeData['valid']) { return -34; } // check if caster tribe ist valid if (!$casterTribeData['valid']) { return -35; } $casterTribeRelations = TribeRelation::getRelations($casterTribeID); $targetTribeRelations = TribeRelation::getRelations($targetTribeID); $wonderPossible = false; foreach ($wonder->targetsPossible as $targetsPossible) { // check target if ($targetsPossible['target'] == 'own' && $casterTribeID !== $targetTribeID) { continue; } if ($targetsPossible['target'] == 'other' && $casterTribeID === $targetTribeID) { continue; } // check relation $check = self::checkRelations($targetsPossible['relation'], $targetTribeID, $casterTribeID, $casterTribeRelations, $targetTribeRelations); if ($check == true) { $wonderPossible = true; break; } } if ($wonderPossible == false) { return -37; } // take wonder Costs from TribeStorage $memberNumber = Tribe::getMemberCount($casterTribeID); if (!processProductionCost($wonder, 0, NULL, $memberNumber, true)) { return -33; } // does the wonder fail? if ((double) rand() / (double) getRandMax() > $wonder->chance) { return 11; // wonder did fail } // schedule the wonder's impacts // create a random factor between -0.3 and +0.3 $delayRandFactor = rand(0, getrandmax()) / getrandmax() * 0.6 - 0.3; // now calculate the delayDelta depending on the first impact's delay $delayDelta = $wonder->impactList[0]['delay'] * $delayRandFactor; // get targets $targets = Tribe::getPlayerList($targetTribeID, false, true); if (sizeof($targets) == 0) { return -33; } $now = time(); // loop over targets foreach ($targets as $playerID => $playerData) { foreach ($playerData['caves'] as $caveID => $caveData) { // loop over impacts foreach ($wonder->impactList as $impactID => $impact) { $delay = (int) (($delayDelta + $impact['delay']) * WONDER_TIME_BASE_FACTOR); $sql = $db->prepare("INSERT INTO " . EVENT_WONDER_TABLE . "\n (casterID, sourceID, targetID, wonderID, impactID, start, end)\n VALUES\n (:playerID, :caveID, :targetID, :wonderID, :impactID, :start, :end)"); $sql->bindValue('playerID', 0, PDO::PARAM_INT); // playerID 0, for not receiving lots of wonder-end-messages $sql->bindValue('caveID', $casterTribeID, PDO::PARAM_INT); $sql->bindValue('targetID', $caveID, PDO::PARAM_INT); $sql->bindValue('wonderID', $wonderID, PDO::PARAM_INT); $sql->bindValue('impactID', $impactID, PDO::PARAM_INT); $sql->bindValue('start', time_toDatetime($now), PDO::PARAM_STR); $sql->bindValue('end', time_toDatetime($now + $delay), PDO::PARAM_STR); $sql->execute(); } // end foreach impactList } } // end foreach target // send caster messages $messageClass = new Messages(); $messageClass->sendSystemMessage($_SESSION['player']->playerID, 9, sprintf(_("Stammeswunder erwirkt auf %s"), $targetTribeData['tag']), sprintf(_("Sie haben auf den Stamm %s ein Stammeswunder %s erwirkt."), $targetTribeData['tag'], $wonder->name)); // send target messages $targetPlayersArray = array(); foreach ($targets as $target) { if (!isset($targetPlayersArray[$target['playerID']])) { $targetPlayersArray[$target['playerID']] = $target; } } foreach ($targetPlayersArray as $target) { $messageClass->sendSystemMessage($target['playerID'], 9, 'Stammeswunder!', sprintf(_("Der Stamm %s hat ein Stammeswunder auf deine Höhlen gewirkt."), $casterTribeData['tag'])); } return 12; }
function createRitual($caveID, $playerID, $ritual, $hero, &$ownCaves) { global $db; $cave = getCaveSecure($caveID, $playerID); $duration = $ritual['duration']; unset($ritual['duration']); // get ritual costs $costs = array(); $temp = array_merge($GLOBALS['resourceTypeList'], $GLOBALS['buildingTypeList'], $GLOBALS['unitTypeList'], $GLOBALS['scienceTypeList'], $GLOBALS['defenseSystemTypeList']); foreach ($temp as $val) { if (array_key_exists($val->dbFieldName, $ritual)) { if ($ritual[$val->dbFieldName]['value']) { $costs[$val->dbFieldName] = $ritual[$val->dbFieldName]['value']; } } } $set = array(); $setBack = array(); $where = array("WHERE caveID = '{$caveID}'"); // get all the costs foreach ($costs as $key => $value) { array_push($set, "{$key} = {$key} - ({$value})"); array_push($setBack, "{$key} = {$key} + ({$value})"); array_push($where, "{$key} >= ({$value})"); } $where = implode(" AND ", $where); // generate SQL if (sizeof($set)) { $set = implode(", ", $set); if (!$db->exec("UPDATE " . CAVE_TABLE . " SET {$set} {$where}")) { return -3; } $setBack = implode(", ", $setBack); $setBack = "UPDATE " . CAVE_TABLE . " SET {$setBack} WHERE caveID = '{$caveID}'"; } else { return -7; } $now = time(); $sql = $db->prepare("INSERT INTO " . EVENT_HERO_TABLE . "\n (caveID, playerID, heroID, start, end, blocked) \n VALUES\n (:caveID, :playerID, :heroID, :start, :end, :blocked)"); $sql->bindValue('caveID', $caveID, PDO::PARAM_INT); $sql->bindValue('playerID', $playerID, PDO::PARAM_INT); $sql->bindValue('heroID', $hero['heroID'], PDO::PARAM_INT); $sql->bindValue('start', time_toDatetime($now), PDO::PARAM_STR); $sql->bindValue('end', time_toDatetime($now + $duration), PDO::PARAM_STR); $sql->bindValue('blocked', 0, PDO::PARAM_INT); if ($sql->execute()) { $sql->closeCursor(); $sql = $db->prepare("UPDATE " . HERO_TABLE . "\n SET isAlive = -1,\n caveID = :caveID\n WHERE heroID = :heroID"); $sql->bindValue('heroID', $hero['heroID'], PDO::PARAM_INT); $sql->bindValue('caveID', $caveID, PDO::PARAM_INT); if (!$sql->execute()) { $db->query($setBack); return -7; } // update cave $ownCaves[$caveID] = getCaveSecure($caveID, $_SESSION['player']->playerID); return 2; } }
/** * */ function defense_processOrder($defenseID, $caveID, $cave) { global $db; // take production costs from cave if (!processProductionCost($GLOBALS['defenseSystemTypeList'][$defenseID], $caveID, $cave)) { return 6; } // calculate the production time; $prodTime = 0; if ($time_formula = $GLOBALS['defenseSystemTypeList'][$defenseID]->productionTimeFunction) { $time_eval_formula = formula_parseToPHP($time_formula, '$cave'); $time_eval_formula = "\$prodTime = {$time_eval_formula};"; eval($time_eval_formula); } $prodTime *= DEFENSESYSTEM_TIME_BASE_FACTOR; $now = time(); $sql = $db->prepare("INSERT INTO " . EVENT_DEFENSE_SYSTEM_TABLE . " \n (caveID, defenseSystemID, start, end)\n VALUES\n (:caveID, :defenseID, :start, :end)"); $sql->bindValue('caveID', $caveID, PDO::PARAM_INT); $sql->bindValue('defenseID', $defenseID, PDO::PARAM_INT); $sql->bindValue('start', time_toDatetime($now), PDO::PARAM_STR); $sql->bindValue('end', time_toDatetime($now + $prodTime), PDO::PARAM_STR); if (!$sql->execute() || $sql->rowCount() == 0) { //give production costs back processProductionCostSetBack($GLOBALS['defenseSystemTypeList'][$defenseID], $caveID, $cave); return 6; } return 7; }
/** * */ function externals_performOrder($externalID, $caveID, $cave, $db) { global $defenseSystemTypeList, $unitTypeList, $buildingTypeList, $scienceTypeList, $resourceTypeList; $external = $defenseSystemTypeList[$externalID]; $maxLevel = round(eval('return ' . formula_parseToPHP("{$external->maxLevel};", '$cave'))); $set = array(); $setBack = array(); $where = array("WHERE caveID = '{$caveID}'", "{$external->dbFieldName} < {$maxLevel}"); // get all the resource costs foreach ($external->resourceProductionCost as $key => $value) { if ($value) { $formula = formula_parseToSQL($value); $dbField = $resourceTypeList[$key]->dbFieldName; $set[] = "{$dbField} = {$dbField} - ({$formula})"; $setBack[] = "{$dbField} = {$dbField} + ({$formula})"; $where[] = "{$dbField} >= ({$formula})"; } } // get all the unit costs foreach ($external->unitProductionCost as $key => $value) { if ($value) { $formula = formula_parseToSQL($value); $dbField = $unitTypeList[$key]->dbFieldName; $set[] = "{$dbField} = {$dbField} - ({$formula})"; $setBack[] = "{$dbField} = {$dbField} + ({$formula})"; $where[] = "{$dbField} >= ({$formula})"; } } // get all the building costs foreach ($external->buildingProductionCost as $key => $value) { if ($value) { $formula = formula_parseToSQL($value); $dbField = $buildingTypeList[$key]->dbFieldName; $set[] = "{$dbField} = {$dbField} - ({$formula})"; $setBack[] = "{$dbField} = {$dbField} + ({$formula})"; $where[] = "{$dbField} >= ({$formula})"; } } // get all the external costs foreach ($external->externalProductionCost as $key => $value) { if ($value) { $formula = formula_parseToSQL($value); $dbField = $defenseSystemTypeList[$key]->dbFieldName; $set[] = "{$dbField} = {$dbField} - ({$formula})"; $setBack[] = "{$dbField} = {$dbField} + ({$formula})"; $where[] = "{$dbField} >= ({$formula})"; } } // generate SQL if (sizeof($set)) { $set = implode(", ", $set); $set = "UPDATE Cave SET {$set} "; $setBack = implode(", ", $setBack); $setBack = "UPDATE Cave SET {$setBack} WHERE caveID = '{$caveID}'"; } // generate dependencies foreach ($external->buildingDepList as $key => $value) { if ($value) { $where[] = "{$buildingTypeList[$key]->dbFieldName} >= {$value}"; } } foreach ($external->maxBuildingDepList as $key => $value) { if ($value != -1) { $where[] = "{$buildingTypeList[$key]->dbFieldName} <= {$value}"; } } foreach ($external->defenseSystemDepList as $key => $value) { if ($value) { $where[] = "{$defenseSystemTypeList[$key]->dbFieldName} >= {$value}"; } } foreach ($external->maxDefenseSystemDepList as $key => $value) { if ($value != -1) { $where[] = "{$defenseSystemTypeList[$key]->dbFieldName} <= {$value}"; } } foreach ($external->resourceDepList as $key => $value) { if ($value) { $where[] = "{$resourceTypeList[$key]->dbFieldName} >= {$value}"; } } foreach ($external->maxResourceDepList as $key => $value) { if ($value != -1) { $where[] = "{$resourceTypeList[$key]->dbFieldName} <= {$value}"; } } foreach ($external->scienceDepList as $key => $value) { if ($value) { $where[] = "{$scienceTypeList[$key]->dbFieldName} >= {$value}"; } } foreach ($external->maxScienceDepList as $key => $value) { if ($value != -1) { $where[] = "{$scienceTypeList[$key]->dbFieldName} <= {$value}"; } } foreach ($external->unitDepList as $key => $value) { if ($value) { $where[] = "{$unitTypeList[$key]->dbFieldName} >= {$value}"; } } foreach ($external->maxUnitDepList as $key => $value) { if ($value != -1) { $where[] = "{$unitTypeList[$key]->dbFieldName} <= {$value}"; } } $where = implode(" AND ", $where); if (!$db->query($set . $where) || !$db->affected_rows() == 1) { return _('Der Auftrag konnte nicht erteilt werden. Es fehlen die notwendigen Voraussetzungen.'); } // calculate the production time; $prodTime = 0; if ($time_formula = $external->productionTimeFunction) { $time_eval_formula = formula_parseToPHP($time_formula, '$cave'); $time_eval_formula = "\$prodTime={$time_eval_formula};"; eval($time_eval_formula); } $prodTime *= DEFENSESYSTEM_TIME_BASE_FACTOR; $now = time(); $query = sprintf("INSERT INTO Event_defenseSystem (caveID, defenseSystemID, " . "`start`, `end`) VALUES (%d, %d, '%s', '%s')", $caveID, $externalID, time_toDatetime($now), time_toDatetime($now + $prodTime)); if (!$db->query($query)) { $db->query($setBack); return _('Der Auftrag konnte nicht erteilt werden. Es fehlen die notwendigen Voraussetzungen.'); } return _('Der Auftrag wurde erteilt.'); }
function page_ore() { global $params, $db; $now = time(); // increment time diff count $_SESSION['ore_time_diff'][$now - $_SESSION['ore_time']]++; // increment counter and log if required if (++$_SESSION['ore_counter'] == 50) { $query = sprintf("INSERT INTO ore_log (playerID, time_diff, stamp, sid) " . "VALUES (%d, '%s', '%s', '%s')", $params->SESSION->player->playerID, addslashes(var_export($_SESSION['ore_time_diff'], TRUE)), addslashes(time_toDatetime($now)), session_id()); $db->query($query); $_SESSION['ore_counter'] = 0; } // set new timestamp $_SESSION['ore_time'] = $now; }