public function __construct($code, $concept, $imp, $units) { parent::__construct($code, $concept, $imp, $units); $this->code = $code; $this->date = getdate(); $this->concept = $concept; $this->imp = $imp; $this->units = $units; }
public function loadEarnables($issue_id) { $issue = Issue::find($issue_id); $receivable = Receivable::with('installments_not_paid')->where('issue_id', '=', $issue_id)->first(); $registrations = Registration::where('student_id', '=', $issue->student_id)->where('cost_is_paid', '=', 0)->get(); $movements = Movement::where('issue_id', '=', $issue_id)->get(); $punishments = Punishment::where('issue_id', '=', $issue_id)->where('paid', '=', 0)->get(); $resigns = Resign::where('issue_id', '=', $issue_id)->where('is_earned', '=', 0)->get(); $responses = array('receivable' => $receivable, 'registrations' => $registrations, 'movements' => $movements, 'punishments' => $punishments, 'resigns' => $resigns); return $responses; }
function reverseMovementEvent($caveID, $eventID) { global $db; // get movements $ua_movements = Movement::getMovements(); // get current time $now = time(); // get movement $sql = $db->prepare("SELECT * FROM " . EVENT_MOVEMENT_TABLE . " \n WHERE event_movementID = :eventID"); $sql->bindValue('eventID', $eventID, PDO::PARAM_INT); if ($sql->rowCountSelect() == 0) { return 1; } if (!$sql->execute()) { return 1; } $move = $sql->fetch(PDO::FETCH_ASSOC); // check movement // blocked if ($move['blocked']) { return 1; } // not reversable if ($ua_movements[$move['movementID']]->returnID == -1) { return 1; } // not own movement if ($caveID != $move['caveID']) { return 1; } // expired if (time_fromDatetime($move['end']) < $now) { return 1; } // build query $start = time_fromDatetime($move['start']); $end = time_fromDatetime($move['end']); $diff = $now - $start; $sql = $db->prepare("UPDATE " . EVENT_MOVEMENT_TABLE . " SET source_caveID = target_caveID, " . "target_caveID = caveID, " . "movementID = :returnID, end = :endTime, start = :startTime " . "WHERE blocked = 0 AND caveID = source_caveID AND " . "caveID = :caveID AND event_movementID = :movementID"); $sql->bindValue('returnID', $ua_movements[$move['movementID']]->returnID, PDO::PARAM_INT); $sql->bindValue('endTime', time_toDatetime($now + $diff), PDO::PARAM_STR); $sql->bindValue('startTime', time_toDatetime($now), PDO::PARAM_STR); $sql->bindValue('caveID', $caveID, PDO::PARAM_STR); $sql->bindValue('movementID', $eventID, PDO::PARAM_STR); $sql->execute(); return intval($sql->rowCount() != 1); }
function execute($caveID, $caves) { global $unitTypeList; // get model $model = new EventReports_Movements_Model($caveID, $caves); // get movements $movements = $model->getGroupedMovements(); // get movement categories $ua_movements = Movement::getMovements(); // prepare data for the view $categories = array(); // foreach movement category.. foreach ($movements as $category => $moves) { // set name and caves-header $category = array('name' => $ua_movements[$category]->description, 'cave' => $caves); // foreach unittype.. foreach ($unitTypeList as $unitType) { // get sum $sum = isset($moves[$unitType->dbFieldName]) ? array_sum($moves[$unitType->dbFieldName]) : 0; if (!$sum) { continue; } // set name and sum $unit = array('name' => $unitType->name, 'dbFieldName' => $unitType->dbFieldName, 'sum' => $sum); // foreach cave.. foreach ($caves as $caveID => $cave) { if (!isset($moves[$unitType->dbFieldName][$caveID])) { $unit['cave'][] = array('amount' => 0); continue; } $unit['cave'][] = array('amount' => intval($moves[$unitType->dbFieldName][$caveID])); } $category['unit'][] = $unit; } $categories[] = $category; } // create View $view = new EventReports_Movements_View($_SESSION['player']->language, $_SESSION['player']->template); // set tmpl data if (sizeof($categories)) { $view->setCategories($categories); } // return view //return $view->toString(); // FIXME return array($view->getTitle(), $view->getContent()); }
/** * @param Movement $move * @return Position * return Posizione di Move. */ public function calculateNewPoint(Movement $move) { $destination = new Position($this->x, $this->y); switch ($move->getDirection()) { case Movement::NORTH: $destination->setY($destination->getY() + $move->getSpeed()); break; case Movement::SOUTH: $destination->setY($destination->getY() - $move->getSpeed()); break; case Movement::WEST: $destination->setX($destination->getX() - $move->getSpeed()); break; case Movement::EAST: $destination->setX($destination->getX() + $move->getSpeed()); break; default: throw new \RuntimeException('errore direzione'); } return $destination; }
} } } } // post to a new Movement } else { if ($method === "POST") { // convert POSTed JSON to an object verifyXsrf(); $requestContent = file_get_contents("php://input"); $requestObject = json_decode($requestContent); $movementDate = new DateTime(); if (empty($requestObject->movementDate) === false) { $movementDate->setTimestamp($requestObject->movementDate / 1000); } $movement = new Movement(null, $requestObject->fromLocationId, $requestObject->toLocationId, $requestObject->productId, $requestObject->unitId, $requestObject->userId, $requestObject->cost, $movementDate, $requestObject->movementType, $requestObject->price); $movement->insert($pdo); $reply->data = "Movement created OK"; if ($requestObject->quantity !== null) { $productLocation = new ProductLocation($requestObject->toLocationId, $requestObject->productId, $requestObject->unitId, $requestObject->quantity); $productLocation->insert($pdo); $reply->data = "ProductLocation created OK"; } } } // create an exception to pass back to the RESTful caller } catch (Exception $exception) { $reply->status = $exception->getCode(); $reply->message = $exception->getMessage(); unset($reply->data); }
public function destroy($code) { $earnings = Earning::where('code', '=', $code)->get(); foreach ($earnings as $earning) { switch ($earning->earnable_type) { case 'Receivable': $receivable = Receivable::find($earning->earnable_id); $receivable->balance += $receivable->balance + $earning->payment; $receivable->save(); $earning->delete(); break; case 'Installment': $installment = Installment::find($earning->earnable_id); $installment->balance += $installment->balance + $earning->payment; $installment->paid = 0; $installment->save(); $earning->delete(); break; case 'Registration': $registration = Registration::find($earning->earnable_id); $registration->cost_is_paid = 0; $registration->save(); $earning->delete(); break; case 'Movement': $movement = Movement::find($earning->earnable_id); $movement->paid = 0; $movement->save(); $earning->delete(); break; case 'Punishment': $punishment = Punishment::find($earning->earnable_id); $punishment->paid = 0; $punishment->save(); $earning->delete(); break; case 'Resign': $resign = Resign::find($earning->earnable_id); $resign->is_earned = 0; $resign->save(); $earning->delete(); break; default: $earning->delete(); break; } } }
} else { if ($method === "DELETE") { verifyXsrf(); $productAlerts = ProductAlert::getProductAlertByProductId($pdo, $productId); foreach ($productAlerts as $productAlert) { $productAlert->delete($pdo); } $finishedProducts = FinishedProduct::getFinishedProductByRawMaterialId($pdo, $productId); foreach ($finishedProducts as $finishedProduct) { $finishedProduct->delete($pdo); } $productLocations = ProductLocation::getProductLocationByProductId($pdo, $productId); foreach ($productLocations as $productLocation) { $productLocation->delete($pdo); } $movements = Movement::getMovementByProductId($pdo, $productId); foreach ($movements as $movement) { $movement->delete($pdo); } $product = Product::getProductByProductId($pdo, $productId); $product->delete($pdo); $reply->data = "Product deleted OK"; } } } } // create an exception to pass back to the RESTful caller } catch (Exception $exception) { $reply->status = $exception->getCode(); $reply->message = $exception->getMessage(); unset($reply->data);
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 export_movement_irc($movementID) { global $db; require_once 'lib/Movement.php'; require_once 'include/digest.inc.php'; // gather data $ua_movements = Movement::getMovements(); $move = export_getSingleMovement($movementID); if (!sizeof($move)) { return 'Es wurde keine Bewegung gefunden!'; } // get Cave data $sourceCaveData = getCaveNameAndOwnerByCaveID($move['source_caveID']); $targetCaveData = getCaveNameAndOwnerByCaveID($move['target_caveID']); // check if it's a player related movement if ($sourceCaveData['player_name'] !== $_SESSION['player']->name && $targetCaveData['player_name'] !== $_SESSION['player']->name) { return 'Nur eigene Bewegungen erlaubt!'; } // artefact data $artefactData = array(); if ($move['artefactID'] != 0) { $artefactData = artefact_getArtefactByID($move['artefactID']); } // header $header = "Bewegungsart: 4" . $ua_movements[$move['movementID']]->description . "\n"; $header .= "Startzeitpunkt:4 " . time_formatDatetime($move['start']) . "\n"; $header .= "Endzeitpunkt:4 " . time_formatDatetime($move['end']) . "\n"; // movement source $source = "Starthöhle: 4" . $sourceCaveData['cave_name'] . " "; $source .= " (" . $sourceCaveData['xCoord'] . "|" . $sourceCaveData['yCoord'] . ") "; if ($sourceCaveData['player_name']) { $source .= "des Spielers 4" . $sourceCaveData['player_name'] . " "; $source .= "aus dem Stamme 4" . $sourceCaveData['player_tribe'] . " "; } $source .= "\n"; // movement target $target = "Zielhöhle: 4" . $targetCaveData['cave_name']; $target .= " (" . $targetCaveData['xCoord'] . "|" . $targetCaveData['yCoord'] . ") "; if ($targetCaveData['player_name']) { $target .= "des Spielers 4 " . $targetCaveData['player_name'] . " "; $target .= "aus dem Stamme 4" . $targetCaveData['player_tribe'] . " "; } $target .= "\n"; // units $units = "Einheiten: "; foreach ($GLOBALS['unitTypeList'] as $unitsID => $unitDetail) { if ($move[$unitDetail->dbFieldName] > 0) { if ($move['isOwnMovement'] || $unitDetail->visible) { $units .= $unitDetail->name . ": " . ($ua_movements[$move['movementID']]->fogUnit && !$move['isOwnMovement'] ? calcFogUnit($move[$unitDetail->dbFieldName]) : $move[$unitDetail->dbFieldName]) . ", "; } } } $units = substr($units, 0, -2); // resources $resources = ""; foreach ($GLOBALS['resourceTypeList'] as $resourceID => $resourceDetail) { if ($move[$resourceDetail->dbFieldName] > 0) { $resources .= $resourceDetail->name . ": " . ($ua_movements[$move['movementID']]->fogResource && !$move['isOwnMovement'] ? calcFogResource($move[$resourceDetail->dbFieldName]) : $move[$resourceDetail->dbFieldName]) . ", "; } } if ($resources !== "") { $resources = "transportierte Rohstoffe: " . $resources; $resources = substr($resources, 0, -2); } // Artefacts $artefact = ''; if ($move['artefactID'] != 0) { $artefact = "transportierte Artefakte: " . $artefactData['name']; } // Hero $hero = ''; if ($move['heroID'] != 0 && $move['isOwnMovement']) { $hero = "Held läuft mit!"; } $irc = ""; $irc .= $header; $irc .= $source; $irc .= $target . "\n"; $irc .= $units . "\n"; $irc .= $resources . "\n"; $irc .= $artefact . "\n"; $irc .= $hero . "\n"; return $irc; }
function 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); } } }
public function payment($id) { $movement = Movement::find($id); $movement->paid = 1; $movement->save(); $earning = new Earning(); $earning->project_id = Auth::user()->curr_project_id; $earning->location_id = Auth::user()->location_id; $earning->issue_id = $movement->issue_id; $earning->employee_id = $movement->employee_id; $earning->earning_date = date('Y-m-d'); $earning->earnable_type = 'Movement'; $earning->earnable_id = $movement->id; $earning->code = $this->generateEarningCode(); $earning->signature = $this->generateSignature(); $earning->payment = $movement->movement_costs + $movement->upgrade_costs; $earning->save(); }
/** * Test Getting Valid Movement By MovementType **/ public function testGetValidMovementByMovementType() { // create a new Movement $newMovement = new Movement(null, $this->fromLocation->getLocationId(), $this->toLocation->getLocationId(), $this->product->getProductId(), $this->unitOfMeasure->getUnitId(), $this->user->getUserId(), $this->VALID_cost, $this->VALID_movementDate, $this->VALID_movementType, $this->VALID_price); $newMovement->insert($this->getPDO()); // grab the data from guzzle and enforce the status' match our expectations $response = $this->guzzle->get('https://bootcamp-coders.cnm.edu/~invtext/backend/php/api/movement/?movementType=' . $newMovement->getMovementType()); $this->assertSame($response->getStatusCode(), 200); $body = $response->getBody(); $movement = json_decode($body); $this->assertSame(200, $movement->status); }
function digest_getMovements($ownCave, $doNotShow, $showDetails) { global $db; // get movements $ua_movements = Movement::getMovements(); // caveIDs einsammeln $caveIDs = implode(', ', array_map(array($db, 'quote'), array_keys($ownCave))); // Bewegungen besorgen $query = "SELECT *\n FROM " . EVENT_MOVEMENT_TABLE . "\n WHERE source_caveID IN (" . $caveIDs . ")\n OR target_caveID IN (" . $caveIDs . ")\n ORDER BY end ASC, event_movementID ASC"; if (!($sql = $db->query($query))) { return array(); } $rows = $sql->fetchAll(); $sql->closeCursor(); // bewegungen durchgehen $result = array(); foreach ($rows as $row) { // "do not show" movements should not be shown if (in_array($row['movementID'], $doNotShow)) { continue; } // is own movement? $row['isOwnMovement'] = in_array($row['caveID'], array_keys($ownCave)); ///////////////////////////////// // SICHTWEITE BESCHRÄNKEN /* We got some problems, as reverse movements should not ALWAYS be visible. * For example a transport reverse movement should be visible, but a * spy reverse movement should not... * As a work around we will fix it by not showing any adverse reverse movement. * * The original code is following... if (!$row['isOwnMovement']){ if ($ua_movements[$row['movementID']]->returnID == -1){ $sichtweite = getVisionRange($ownCave[$row['source_caveID']]) * $row['speedFactor']; $distance = time() - (time_fromDatetime($row['end']) - getDistanceByID($srcID, $destID) * $row['speedFactor']); } else { $sichtweite = getVisionRange($ownCave[$row['target_caveID']]) * $row['speedFactor']; $distance = ceil((time_fromDatetime($row['end']) - time())/60); } if ($sichtweite < $distance) continue; } */ // compute visibility if (!$row['isOwnMovement']) { // don't show adverse reverse movements if ($ua_movements[$row['movementID']]->returnID == -1) { continue; } $sichtweite = getVisionRange($ownCave[$row['target_caveID']]) * $row['speedFactor']; $distance = ceil((time_fromDatetime($row['end']) - time()) / 60); if ($sichtweite < $distance) { continue; } } ///////////////////////////////// // ***** fremde unsichtbare bewegung ***** if ($row['isOwnMovement'] == 0) { if ($ua_movements[$row['movementID']]->mayBeInvisible) { $anzahl_sichtbarer_einheiten = 0; foreach ($GLOBALS['unitTypeList'] as $unitType) { if ($unitType->visible) { $anzahl_sichtbarer_einheiten += $row[$unitType->dbFieldName]; } } if ($anzahl_sichtbarer_einheiten == 0) { continue; } } } $tmp = array('event_id' => $row['event_movementID'], 'cave_id' => $row['caveID'], 'source_cave_id' => $row['source_caveID'], 'target_cave_id' => $row['target_caveID'], 'movement_id' => $row['movementID'], 'event_start' => time_fromDatetime($row['start']), 'event_start_date' => time_formatDatetime($row['start']), 'event_end' => time_fromDatetime($row['end']), 'event_end_date' => time_formatDatetime($row['end']), 'isOwnMovement' => intval($row['isOwnMovement']), 'seconds_before_end' => time_fromDatetime($row['end']) - time(), 'movement_id_description' => $ua_movements[$row['movementID']]->description); // Quelldaten $source = getCaveNameAndOwnerByCaveID($row['source_caveID']); foreach ($source as $key => $value) { $tmp['source_' . $key] = $value; } // Zieldaten $target = getCaveNameAndOwnerByCaveID($row['target_caveID']); foreach ($target as $key => $value) { $tmp['target_' . $key] = $value; } // ***** Einheiten, Rohstoffe und Artefakte ***** if ($showDetails) { // show artefact if ($row['artefactID']) { $tmp['artefact'] = artefact_getArtefactByID($row['artefactID']); } // show hero if ($row['heroID']) { $tmp['hero'] = "Held läuft mit!"; } // eval(GameConstants::EXPOSE_INVISIBLE) // FIXME (mlunzena): oben holen wir schon bestimmte Höhlendaten, // das sollte man zusammenfassen.. $target = getCaveByID($row['target_caveID']); $expose = eval('return ' . formula_parseToPHP(GameConstants::EXPOSE_INVISIBLE . ";", '$target')); // show units $units = array(); foreach ($GLOBALS['unitTypeList'] as $unit) { // this movement does not contain units of that type if (!$row[$unit->dbFieldName]) { continue; } // expose invisible units // if it is your own move // if unit is visible if (!$row['isOwnMovement'] && !$unit->visible) { // if target cave's EXPOSEINVISIBLE is > than exposeChance if ($expose <= $row['exposeChance']) { // do not expose continue; } else { // do something // for example: // $row[$unit->dbFieldName] *= 2.0 * (double)rand() / (double)getRandMax(); } } $units[] = array('unitID' => $unit->unitID, 'dbFieldName' => $unit->dbFieldName, 'name' => $unit->name, 'value' => $ua_movements[$row['movementID']]->fogUnit && !$row['isOwnMovement'] ? calcFogUnit($row[$unit->dbFieldName]) : $row[$unit->dbFieldName]); } if (sizeof($units)) { $tmp['units'] = $units; } $resources = array(); foreach ($GLOBALS['resourceTypeList'] as $resource) { if (!$row[$resource->dbFieldName]) { continue; } $resources[] = array('name' => $resource->name, 'dbFieldName' => $resource->dbFieldName, 'value' => $ua_movements[$row['movementID']]->fogResource && !$row['isOwnMovement'] ? calcFogResource($row[$resource->dbFieldName]) : $row[$resource->dbFieldName]); } if (sizeof($resources)) { $tmp['resources'] = $resources; } if ($row['isOwnMovement'] && $ua_movements[$row['movementID']]->returnID != -1 && !$row['artefactID'] && !$row['blocked']) { $tmp['cancel'] = array("modus" => UNIT_MOVEMENT, "eventID" => $row['event_movementID']); } } $result[] = $tmp; } return $result; }
function digest_getMovements($ownCave, $doNotShow, $showDetails) { global $db; // get movements $ua_movements = Movement::getMovements(); // caveIDs einsammeln $caveIDs = implode(', ', array_map(array($db, 'quote'), array_keys($ownCave))); $targetExtraFilds = formula_parseToSelectSQL(GameConstants::EXPOSE_INVISIBLE); $sqlExtra = array(); foreach ($targetExtraFilds as $field) { $sqlTargetExtra[] = 'tc.' . $field . ' AS target_' . $field; } $sql = $db->prepare("SELECT em.*, sc.name AS source_cave_name, sp.name AS source_player_name, st.tag AS source_player_tribe, sc.xCoord AS source_xCoord, sc.yCoord AS source_yCoord, tc.name AS target_cave_name, tp.name AS target_player_name, tt.tag AS target_player_tribe, tc.xCoord AS target_xCoord, tc.yCoord AS target_yCoord " . (!empty($sqlTargetExtra) ? ', ' . implode(', ', $sqlTargetExtra) : '') . "\n FROM " . EVENT_MOVEMENT_TABLE . " em\n LEFT JOIN " . CAVE_TABLE . " sc ON sc.caveID = em.source_caveID\n LEFT JOIN " . PLAYER_TABLE . " sp ON sp.playerID = sc.playerID\n LEFT JOIN " . TRIBE_TABLE . " st ON st.tribeID = sp.tribeID\n LEFT JOIN " . CAVE_TABLE . " tc ON tc.caveID = em.target_caveID\n LEFT JOIN " . PLAYER_TABLE . " tp ON tp.playerID = tc.playerID\n LEFT JOIN " . TRIBE_TABLE . " tt ON tt.tribeID = tp.tribeID\n WHERE em.source_caveID IN (" . $caveIDs . ")\n OR em.target_caveID IN (" . $caveIDs . ")\n ORDER BY em.end ASC, em.event_movementID ASC"); if (!$sql->execute()) { return array(); } $rows = $sql->fetchAll(PDO::FETCH_ASSOC); $sql->closeCursor(); // bewegungen durchgehen $result = array(); foreach ($rows as $row) { // "do not show" movements should not be shown if (in_array($row['movementID'], $doNotShow)) { continue; } // is own movement? $row['isOwnMovement'] = in_array($row['caveID'], array_keys($ownCave)); ///////////////////////////////// // SICHTWEITE BESCHRÄNKEN /* We got some problems, as reverse movements should not ALWAYS be visible. * For example a transport reverse movement should be visible, but a * spy reverse movement should not... * As a work around we will fix it by not showing any adverse reverse movement. * * The original code is following... if (!$row['isOwnMovement']){ if ($ua_movements[$row['movementID']]->returnID == -1){ $sichtweite = getVisionRange($ownCave[$row['source_caveID']]) * $row['speedFactor']; $distance = time() - (time_fromDatetime($row['end']) - getDistanceByID($srcID, $destID) * $row['speedFactor']); } else { $sichtweite = getVisionRange($ownCave[$row['target_caveID']]) * $row['speedFactor']; $distance = ceil((time_fromDatetime($row['end']) - time())/60); } if ($sichtweite < $distance) continue; } */ // compute visibility if (!$row['isOwnMovement']) { // don't show adverse reverse movements if ($ua_movements[$row['movementID']]->returnID == -1) { continue; } $sichtweite = getVisionRange($ownCave[$row['target_caveID']]) * $row['speedFactor']; $distance = ceil((time_fromDatetime($row['end']) - time()) / 60); if ($sichtweite < $distance) { continue; } } ///////////////////////////////// // ***** fremde unsichtbare bewegung ***** if ($row['isOwnMovement'] == 0) { if ($ua_movements[$row['movementID']]->mayBeInvisible) { $anzahl_sichtbarer_einheiten = 0; foreach ($GLOBALS['unitTypeList'] as $unitType) { if ($unitType->visible) { $anzahl_sichtbarer_einheiten += $row[$unitType->dbFieldName]; } } if ($anzahl_sichtbarer_einheiten == 0) { continue; } } } $tmp = array('event_id' => $row['event_movementID'], 'cave_id' => $row['caveID'], 'source_cave_id' => $row['source_caveID'], 'target_cave_id' => $row['target_caveID'], 'movement_id' => $row['movementID'], 'event_start' => time_fromDatetime($row['start']), 'event_start_date' => time_formatDatetime($row['start']), 'event_end' => time_fromDatetime($row['end']), 'event_end_date' => time_formatDatetime($row['end']), 'isOwnMovement' => intval($row['isOwnMovement']), 'seconds_before_end' => time_fromDatetime($row['end']) - time(), 'movement_id_description' => $ua_movements[$row['movementID']]->description, 'source_cave_name' => $row['source_cave_name'], 'source_player_name' => $row['source_player_name'], 'source_player_tribe' => $row['source_player_tribe'], 'source_xCoord' => $row['source_xCoord'], 'source_yCoord' => $row['source_yCoord'], 'target_cave_name' => $row['target_cave_name'], 'target_player_name' => $row['target_player_name'], 'target_player_tribe' => $row['target_player_tribe'], 'target_xCoord' => $row['target_xCoord'], 'target_yCoord' => $row['target_yCoord']); // ***** Einheiten, Rohstoffe und Artefakte ***** if ($showDetails) { // show artefact if ($row['artefactID']) { $tmp['artefact'] = artefact_getArtefactByID($row['artefactID']); } // show hero if ($row['heroID']) { $tmp['hero'] = "Held läuft mit!"; } // eval(GameConstants::EXPOSE_INVISIBLE) // FIXME (mlunzena): oben holen wir schon bestimmte Höhlendaten, // das sollte man zusammenfassen.. foreach ($targetExtraFilds as $field) { $target[$field] = $row['target_' . $field]; } $expose = eval('return ' . formula_parseToPHP(GameConstants::EXPOSE_INVISIBLE . ";", '$target')); // show units $units = array(); foreach ($GLOBALS['unitTypeList'] as $unit) { // this movement does not contain units of that type if (!$row[$unit->dbFieldName]) { continue; } // expose invisible units // if it is your own move // if unit is visible if (!$row['isOwnMovement'] && !$unit->visible) { // if target cave's EXPOSEINVISIBLE is > than exposeChance if ($expose <= $row['exposeChance']) { // do not expose continue; } else { // do something // for example: // $row[$unit->dbFieldName] *= 2.0 * (double)rand() / (double)getRandMax(); } } $units[] = array('unitID' => $unit->unitID, 'dbFieldName' => $unit->dbFieldName, 'name' => $unit->name, 'value' => $ua_movements[$row['movementID']]->fogUnit && !$row['isOwnMovement'] ? calcFogUnit($row[$unit->dbFieldName]) : $row[$unit->dbFieldName]); } if (sizeof($units)) { $tmp['units'] = $units; } $resources = array(); foreach ($GLOBALS['resourceTypeList'] as $resource) { if (!$row[$resource->dbFieldName]) { continue; } $resources[] = array('name' => $resource->name, 'dbFieldName' => $resource->dbFieldName, 'value' => $ua_movements[$row['movementID']]->fogResource && !$row['isOwnMovement'] ? calcFogResource($row[$resource->dbFieldName]) : $row[$resource->dbFieldName]); } if (sizeof($resources)) { $tmp['resources'] = $resources; } if ($row['isOwnMovement'] && $ua_movements[$row['movementID']]->returnID != -1 && !$row['artefactID'] && !$row['blocked']) { $tmp['cancel'] = array("modus" => UNIT_MOVEMENT, "eventID" => $row['event_movementID']); } } $result[] = $tmp; } return $result; }
/** * test grabbing a all Movements that do not exist * * @expectedException **/ public function testGetInvalidAllMovements() { // grab all movements with a page number that does not exist $page = 2; $pdoMovement = Movement::getAllMovements($this->getPDO(), $page); foreach ($pdoMovement as $pdoM) { $this->assertNull($pdoM); } }