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 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; }
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 tribe_processKickMember($playerID, $tag) { if (empty($playerID)) { return -38; } if (tribe_isLeader($playerID, $tag)) { return -39; } // do not kick in wartime if (!relation_leaveTribeAllowed($tag)) { return -40; } // blocked if (!tribe_changeTribeAllowedForPlayerID($playerID)) { return -3; } // get player $player = getPlayerByID($playerID); // no such player if (!$player) { return -41; } // remove player if (!tribe_leaveTribe($playerID, $tag)) { return -41; } Player::addHistoryEntry($playerID, sprintf(_("wird aus dem Stamm '%s' geworfen"), $tag)); // block player tribe_setBlockingPeriodPlayerID($playerID); tribe_sendTribeMessage($tag, TRIBE_MESSAGE_MEMBER, "Spieler rausgeschmissen", "Der Spieler {$player['name']} wurde soeben vom Anführer aus dem Stamm ausgeschlossen."); $messagesClass = new Messages(); $messagesClass->sendSystemMessage($playerID, 8, "Stammausschluss.", "Sie wurden aus dem Stamm {$tag} ausgeschlossen. Bitte loggen Sie sich aus und melden Sie sich wieder an, damit das Stammesmenü bei Ihnen wieder richtig funktioniert."); return 13; }