function cast_spell(&$objSrcUser, &$objTrgUser, $arrSpell, $amount, $minHours) { $arrTrgStats = $objTrgUser->get_stats(); $arrSrcStats = $objSrcUser->get_stats(); include_once "inc/functions/war.php"; $modifier = war_alli($arrSrcStats[ALLIANCE], $arrTrgStats[ALLIANCE]); if ($modifier < 1) { echo "Sorry leader, this is a war only spell!"; include_game_down(); exit; } $intLength = rand($arrSpell[DURMIN], $arrSpell[DURMAX]); $intDamage = max($intLength, 1); $result["text_news"] = "LEADER! We have heard reports of a strange illness afflicting our lands! We suspect an enemy has infected our people with a <b class=negative>virus</b> of some kind. It will take <b class=negative>{$intDamage}</b> months to contain the virus."; $result["text_screen"] = "Your mage has engineered a mystical virus that will plague the people of " . $arrTrgStats[TRIBE] . ". Our mage estimates it will take their tribe {$intDamage} months to contain the virus."; $result["casted"] = $amount; $result["damage"] = 1; $objTrgUser->set_spell(VIRUS, $intDamage); return $result; }
function cast_spell(&$objSrcUser, &$objTrgUser, $arrSpell, $amount, $minHours, $dmg) { $arrTrgStats = $objTrgUser->get_stats(); $targetid = $arrTrgStats["id"]; $res = mysql_query("SELECT unit5 FROM army WHERE id = {$targetid}"); $arrTrgArmys = mysql_fetch_assoc($res); $arrSrcStats = $objSrcUser->get_stats(); $sourceid = $arrSrcStats["id"]; include_once "inc/functions/war.php"; $search = mysql_query("SELECT kingdom FROM stats WHERE id = {$sourceid}"); $search = mysql_fetch_array($search); $search2 = mysql_query("SELECT kingdom FROM stats WHERE id = {$targetid}"); $search2 = mysql_fetch_array($search2); $modifier = war_alli($search['kingdom'], $search2['kingdom']); $arrTrgMilReturns = $objTrgUser->get_milreturns(); $thieves = $arrTrgArmys[UNIT5] - ($arrTrgMilReturns["unit5_t1"] + $arrTrgMilReturns["unit5_t2"] + $arrTrgMilReturns["unit5_t3"] + $arrTrgMilReturns["unit5_t4"]); $totalDamage = 0; for ($x = 1; $x <= $amount; $x++) { $rndDamage = rand(20, 60) * 0.001; $intDamage = floor($dmg * $thieves * $rndDamage); $totalDamage += $intDamage; $thieves -= $intDamage; } if ($amount > 1) { $plural = "s"; } else { $plural = ""; } $result["text_news"] = "You have had {$amount} group{$plural} of thieves leave, totalling <b><font class=negative>{$totalDamage}</font></b> thieves."; $result["text_screen"] = "Your influence has disbanded {$totalDamage} of " . $arrTrgStats[TRIBE] . "s thieves<br>"; $result["damage"] = $totalDamage; $result["casted"] = $amount; $newThieves = $arrTrgArmys["unit5"] - $totalDamage; $objTrgUser->set_army(UNIT5, $newThieves); $retained = $totalDamage; if ($modifier >= 1) { $retained = floor($retained * 0.75); } $update = mysql_query("UPDATE army SET unit5_t4 = unit5_t4 + {$retained} WHERE id = {$arrTrgStats['id']}"); return $result; }
function do_op(&$objSrcUser, &$objTrgUser, $cnt, $thieves, $mod) { include_once "inc/functions/war.php"; $modifier = war_alli($objSrcUser->get_stat(ALLIANCE), $objTrgUser->get_stat(ALLIANCE)); if ($modifier != 2) { echo "You can only do this thievery operation against a target you are at war with."; include_game_down(); exit; } $percentage = 0.0075; // $alliance = $objTrgUser->get_alliance(); // $alliance_size = $alliance->get_alliance_size() * 80; // include_once('inc/functions/bonuses.php'); // $arrSci = getSciences($alliance->get_allianceid()); // $science_defence_bonus = $arrSci['def']; // if ($science_defence_bonus > 1) // $science_defence_bonus = 1; // $percentage -= ($science_defence_bonus / 100); if ($percentage < 0.0055) { $percentage = 0.0055; } $academies = $objTrgUser->get_build(ACADEMIES); $totalburned = 0; for ($x = 1; $x <= $cnt; $x++) { $max_burn = floor($academies * $percentage * $mod); if ($thieves <= 50 || $max_burn <= 0) { $max_burn = 0; } $burnable = floor($thieves / ($objTrgUser->get_build(LAND) / 2) * $max_burn); if ($burnable >= $max_burn) { $burnable = $max_burn; } $academies -= $burnable; $totalburned += $burnable; } $objTrgUser->set_build(ACADEMIES, $academies); $result["fame"] = floor($totalburned * 3); $result["text_screen"] = "Tunneling has destroyed {$totalburned} academies of the enemy!"; $result["text_news"] = 'Unfortunately we have found <span class="negative">' . $totalburned . '</negative> academies burned to the ground.'; return $result; }
function doAttack(&$objSrcUser, &$objTrgUser, $arrSentArmy) { $srcKd = $objSrcUser->get_stat(KINGDOM); $trgKd = $objTrgUser->get_stat(KINGDOM); $arrTrgBuilds = $objTrgUser->get_builds(); $iSrcLand = $objSrcUser->get_build(LAND); $strSrcRace = $objSrcUser->get_stat(RACE); $arrTrgArmys = $objTrgUser->get_armys(); $arrTrgMilRet = $objTrgUser->get_milreturns(); //========================================================================== // Blasphemy Crusade Attack: Destroy T/M Buildings and gain Fame //========================================================================== $destroyed = 0.04; $modifier = war_alli($srcKd, $trgKd); if ($modifier == 2) { $destroyed *= 1.5; } elseif ($modifier == 0 && war_target($trgKd) != 0) { $destroyed *= 0.95; } // Demolish x % Guilds $iDamaged_Guilds = $arrTrgBuilds[GUILDS]; if ($iDamaged_Guilds > $arrTrgBuilds[LAND] * $destroyed) { $iDamaged_Guilds = round($arrTrgBuilds[LAND] * $destroyed); } // Demolish x % Academies $iDamaged_Academies = $arrTrgBuilds[ACADEMIES]; if ($iDamaged_Academies > $arrTrgBuilds[LAND] * $destroyed) { $iDamaged_Academies = round($arrTrgBuilds[LAND] * $destroyed); } // Demolish x % Hideouts $iDamaged_Hideouts = $arrTrgBuilds[HIDEOUTS]; if ($iDamaged_Hideouts > $arrTrgBuilds[LAND] * $destroyed) { $iDamaged_Hideouts = round($arrTrgBuilds[LAND] * $destroyed); } // Kill x % Thieves $iThieves_killed = round(($arrTrgArmys[UNIT5] - ($arrTrgMilRet[UNIT5_T1] + $arrTrgMilRet[UNIT5_T2] + $arrTrgMilRet[UNIT5_T3] + $arrTrgMilRet[UNIT5_T4])) * ($destroyed * 1.25)); // Total # Buildings destroyed (to calc fame) $iDamaged_Total = $iDamaged_Academies + $iDamaged_Guilds + $iDamaged_Hideouts; // Ravens do 1/3 Damage if ($strSrcRace == "Raven") { $iThieves_killed = round(0.333 * $iThieves_killed); $iDamaged_Total = round(0.333 * $iDamaged_Total); $iDamaged_Academies = round(0.333 * $iDamaged_Academies); $iDamaged_Guilds = round(0.333 * $iDamaged_Guilds); $iDamaged_Hideouts = round(0.333 * $iDamaged_Hideouts); } $arrBuilds = array(GUILDS => $arrTrgBuilds[GUILDS] - $iDamaged_Guilds, HIDEOUTS => $arrTrgBuilds[HIDEOUTS] - $iDamaged_Hideouts, ACADEMIES => $arrTrgBuilds[ACADEMIES] - $iDamaged_Academies, LAND => $arrTrgBuilds[LAND] - $iDamaged_Total, LAND_T2 => $arrTrgBuilds[LAND_T2] + $iDamaged_Total); // Save new stats to DB $objTrgUser->set_builds($arrBuilds); $objTrgUser->set_army(UNIT5, $arrTrgArmys[UNIT5] - $iThieves_killed); //========================================================================== // Return time //========================================================================== $wait = 6; if ($strSrcRace == "Raven") { $wait = 1; } elseif ($strSrcRace == "Mori Hai" || $strSrcRace == "Dragon") { $wait = 5; } elseif ($strSrcRace == "Viking") { $wait = 4; } $objSrcUser->set_user_info(NEXT_ATTACK, $wait); //========================================================================== // Calculate Fame Gains //========================================================================== $fame_win = 0; // Fame only if target and source is in war if ($modifier == 2) { $ratio = min(1, $arrTrgBuilds[LAND] / $iSrcLand); $fame_win = round($ratio * $iDamaged_Total); // fame bonus from being in war $fame_win *= 1.2; } // Cannot take more fame than what the target has $fame_win = round($fame_win); $target_fame = $objTrgUser->get_stat(FAME); if ($fame_win > $target_fame) { $fame_win = $target_fame; } $fame1 = $objSrcUser->get_stat(FAME) + $fame_win; $fame2 = $target_fame - $fame_win; $objSrcUser->set_stat(FAME, $fame1); $objTrgUser->set_stat(FAME, $fame2); //========================================================================== $arrResults['gained_fame'] = $fame_win; $arrResults['killed_thieves'] = $iThieves_killed; $arrResults['damaged_academies'] = $iDamaged_Academies; $arrResults['damaged_guilds'] = $iDamaged_Guilds; $arrResults['damaged_hideouts'] = $iDamaged_Hideouts; $arrResults['damaged_total'] = $iDamaged_Total; return $arrResults; }
function doAttack(&$objSrcUser, &$objTrgUser, $arrSentArmy) { $srcId = $objSrcUser->get_userid(); $trgId = $objTrgUser->get_userid(); $srcKd = $objSrcUser->get_stat(KINGDOM); $trgKd = $objTrgUser->get_stat(KINGDOM); $arrTrgBuilds = $objTrgUser->get_builds(); $iSrcLand = $objSrcUser->get_build(LAND); //========================================================================== // Standard Attack: Acres and Fame //========================================================================== $gains = pow($arrTrgBuilds[LAND] / $iSrcLand, 2) + $arrTrgBuilds[LAND] / ($iSrcLand * 3); $gains = min($gains, 1); $standard_gains = 0.115 * $gains; // Oleg Hai bonus $strSrcRace = $objSrcUser->get_stat(RACE); if ($strSrcRace == "Oleg Hai") { $standard_gains *= 1.3; } if ($standard_gains * $arrTrgBuilds[LAND] > $iSrcLand * 1.3 * $standard_gains) { $standard_gains *= $iSrcLand * 1.3 / $arrTrgBuilds[LAND]; } if ($arrTrgBuilds[LAND] > $iSrcLand * 3) { $standard_gains /= 2; } //========================================================================== // War effects on gains //========================================================================== include_once "inc/functions/war.php"; $modifier = war_alli($srcKd, $trgKd); if ($modifier == 2) { $standard_gains *= 1.2; } $target = war_target($trgKd); if ($target != 0 && $modifier == 0) { $standard_gains *= 0.95; } //========================================================================== // Spell effects on gains //========================================================================== if ($objTrgUser->get_spell(FOREST) > 0) { $standard_gains *= 0.8; } if ($objSrcUser->get_spell(MORTALITY) > 0) { $standard_gains += 0.01; } //========================================================================== // Bottom feed penalty on gains //========================================================================== if ($arrTrgBuilds[LAND] / $iSrcLand < 0.8 && $arrTrgBuilds[LAND] < 1500) { $bottom_feeder_difference = $arrTrgBuilds[LAND] / $iSrcLand; $bottom_feeder_penalty = (0.8 - $bottom_feeder_difference) / 10; $standard_gains -= 5 * $bottom_feeder_penalty; } elseif ($arrTrgBuilds[LAND] / $iSrcLand < 0.8 && $arrTrgBuilds[LAND] > 1499) { $bottom_feeder_difference = $arrTrgBuilds[LAND] / $iSrcLand; $bottom_feeder_penalty = (0.85 - $bottom_feeder_difference) / 10; $standard_gains -= 5 * $bottom_feeder_penalty; } //========================================================================== // Minimum Gains limit //========================================================================== if ($standard_gains < 0.01) { $standard_gains = 0.01; } //========================================================================== // Calculate Acre Gains //========================================================================== include_once 'inc/functions/build.php'; $arrBuildVars = getBuildingVariables($objTrgUser->get_stat(RACE)); $arrBuildVars = $arrBuildVars['variables']; $max_build = $objTrgUser->get_number_build_types(); $total_grab = 0; // Built for ($i = 1; $i <= $max_build; $i++) { $strVar = trim($arrBuildVars[$i]); $acres_won[$strVar] = round($arrTrgBuilds[$strVar] * $standard_gains); $buildings = $objTrgUser->get_build($strVar); $land = $objTrgUser->get_build(LAND); $arrBuilds = array($strVar => $buildings - $acres_won[$strVar], LAND => $land - $acres_won[$strVar]); $objTrgUser->set_builds($arrBuilds); $total_grab += $acres_won[$strVar]; } // 1 hour for ($i = 1; $i <= $max_build; $i++) { $strVar = trim($arrBuildVars[$i]); $strVar = $strVar . "_t1"; $acres_won[$strVar] = round($arrTrgBuilds[$strVar] * $standard_gains); $buildings = $objTrgUser->get_build($strVar); $land = $objTrgUser->get_build(LAND); $arrBuilds = array($strVar => $buildings - $acres_won[$strVar], LAND => $land - $acres_won[$strVar]); $objTrgUser->set_builds($arrBuilds); $total_grab += $acres_won[$strVar]; } // 2 hours for ($i = 1; $i <= $max_build; $i++) { $strVar = trim($arrBuildVars[$i]); $strVar = $strVar . "_t2"; $acres_won[$strVar] = round($arrTrgBuilds[$strVar] * $standard_gains); $buildings = $objTrgUser->get_build($strVar); $land = $objTrgUser->get_build(LAND); $arrBuilds = array($strVar => $buildings - $acres_won[$strVar], LAND => $land - $acres_won[$strVar]); $objTrgUser->set_builds($arrBuilds); $total_grab += $acres_won[$strVar]; } // 3 hours for ($i = 1; $i <= $max_build; $i++) { $strVar = trim($arrBuildVars[$i]); $strVar = $strVar . "_t3"; $acres_won[$strVar] = round($arrTrgBuilds[$strVar] * $standard_gains); $buildings = $objTrgUser->get_build($strVar); $land = $objTrgUser->get_build(LAND); $arrBuilds = array($strVar => $buildings - $acres_won[$strVar], LAND => $land - $acres_won[$strVar]); $objTrgUser->set_builds($arrBuilds); $total_grab += $acres_won[$strVar]; } // 4 hours for ($i = 1; $i <= $max_build; $i++) { $strVar = trim($arrBuildVars[$i]); $strVar = $strVar . "_t4"; $acres_won[$strVar] = round($arrTrgBuilds[$strVar] * $standard_gains); $buildings = $objTrgUser->get_build($strVar); $land = $objTrgUser->get_build(LAND); $arrBuilds = array($strVar => $buildings - $acres_won[$strVar], LAND => $land - $acres_won[$strVar]); $objTrgUser->set_builds($arrBuilds); $total_grab += $acres_won[$strVar]; } // Explored $explore_gains = 0.2; $acres_explored = round($total_grab * $explore_gains); $land = $objSrcUser->get_build(LAND); $objSrcUser->set_build(LAND, $land + $acres_explored); //========================================================================== // Record //========================================================================== $fetch_record = mysql_query("Select * from records where id = 1"); $fetch_record = @mysql_fetch_array($fetch_record); if ($total_grab > $fetch_record['grab']) { $id = $objSrcUser->get_userid(); $update = mysql_query("Update records set grab = {$total_grab}, grab_id = {$id} where id = 1"); } //========================================================================== // Return time //========================================================================== $wait = 4; // 4 hour attack time if ($strSrcRace == "Raven") { $wait = 1; } elseif ($strSrcRace == "Mori Hai" || $strSrcRace == "Dragon") { $wait = 3; } $landtime = 'land_t' . $wait; $objSrcUser->set_user_info(NEXT_ATTACK, $wait); //========================================================================== // Add land to incoming //========================================================================== if ($total_grab > 0) { $old_land = $objSrcUser->get_build($landtime); $objSrcUser->set_build($landtime, $total_grab + $old_land); } //========================================================================== // Calculate Fame Gains //========================================================================== $fame_win = max(0, $total_grab * 2); // War effects include_once 'inc/functions/war.php'; $objSrcAlliance = $objSrcUser->get_alliance(); if (checkWarBetween($objSrcAlliance, $trgKd)) { // Update land counter in new war system March 06, 2008 Martel $iNeeded = $objSrcAlliance->get_war('land_needed'); $objSrcAlliance->set_war('land_needed', max(0, $iNeeded - $total_grab)); // War effects on fame $fame_win *= 1.2; } // Cannot take more fame than what the target has $fame_win = round($fame_win); $target_fame = $objTrgUser->get_stat(FAME); if ($fame_win > $target_fame) { $fame_win = $target_fame; } $fame1 = $objSrcUser->get_stat(FAME) + $fame_win; $fame2 = $target_fame - $fame_win; $objSrcUser->set_stat(FAME, $fame1); $objTrgUser->set_stat(FAME, $fame2); //========================================================================== $arrResults['gained_acres'] = $total_grab; $arrResults['explored_acres'] = $acres_explored; $arrResults['gained_fame'] = $fame_win; return $arrResults; }
function make_magic2(&$objSrcUser, $i_intTargetid, &$arrSpells, $i_strSpellName, $i_intSpelltimes, $i_blnStopOnSuccess, $i_blnMinHours, $i_minHours) { $iUserID = $objSrcUser->get_userid(); $damageModifier = 1; mt_srand((double) microtime() * 1000000); $objTrgUser = new clsUser($i_intTargetid); $arrSrcStats = $objSrcUser->get_stats(); $arrTrgStats = $objTrgUser->get_stats(); $arrTrgBuild = $objTrgUser->get_builds(); $intCasterMageLevel = get_mage_level($objSrcUser); $intTargetMageLevel = get_mage_level($objTrgUser); if ($arrTrgStats[ALLIANCE] == "0") { echo "This Player Has Either Been Deleted Or Suspended"; free_casting_now($iUserID); include_game_down(); exit; } // war check include_once "inc/functions/war.php"; // Gotland was here $warmodifier = war_alli($objTrgUser->get_stat(ALLIANCE), $objSrcUser->get_stat(ALLIANCE)); if ($warmodifier > 1) { $res = mysql_query("SELECT defiance FROM spells WHERE id = {$iUserID}"); $line = mysql_fetch_assoc($res); $damageModifier = $damageModifier * 1.1; if ($line["defiance"] > 0) { $damageModifier = $damageModifier * 1.1; } } $target = war_target($arrTrgStats[ALLIANCE]); if ($target != 0 && $damageModifier == 0) { //what is this supposed to do? right now it does nothing at all - AI $damageModifier = $damageModifier * 0.95; } $lastWar = mysql_query("SELECT last_target, last_end FROM war WHERE id = " . $arrSrcStats[ALLIANCE]); $lastWar = mysql_fetch_array($lastWar); $timeCounter = mysql_query("SELECT hour_counter FROM admin_global_time"); $timeCounter = mysql_fetch_array($timeCounter); // Spell type = SPELL_SELF, SPELL_ALLIANCE, SPELL_ENEMY etc (integers) $strSpellType = $arrSpells[$i_strSpellName]['type']; // Spell Display = full name of spell $strSpellDisplay = $arrSpells[$i_strSpellName]['display']; if ($arrTrgStats[ALLIANCE] == $lastWar['last_target'] && $strSpellType == SPELL_ENEMY) { if ($timeCounter['hour_counter'] <= $lastWar['last_end'] + 12) { echo '<div class="center">The war is not even over for 12 hours. Give them some time to recover!</div>'; free_casting_now($iUserID); include_game_down(); exit; } } include_once 'inc/functions/update.php'; check_to_update($objTrgUser->get_userid()); // Include the code for the spell about to be cast require_once "inc/spells/" . $i_strSpellName . ".php"; // Check for casting "harmful" spells on yourself if ($iUserID == $objTrgUser->get_userid() && ($strSpellType == SPELL_ENEMY || $strSpellType == SPELL_ALL || $strSpellType == SPELL_WAR)) { echo '<div class="center">' . "I'm sorry you cannot cast " . $strSpellDisplay . " upon yourself.\n"; echo "<br /><br /><br /><a href=main.php?cat=game&page=mystic&magekd=" . $objSrcUser->get_stat(ALLIANCE) . ">Back to Mystics</a></div>"; free_casting_now($iUserID); include_game_down(); exit; } // Martel: Heal may only target alliance members // SPELL_ALLIANCE only on allimates $iSrcAlli = $objSrcUser->get_stat(ALLIANCE); $iTrgAlli = $objTrgUser->get_stat(ALLIANCE); if ($strSpellType == SPELL_ALLIANCE && $iTrgAlli != $iSrcAlli) { echo '<div class="center">' . "Sorry but you cannot cast " . $strSpellDisplay . " on non-allies.<br />"; echo "<br /><br /><br /><a href=\"main.php?cat=game&page=mystic&magekd=" . $objTrgUser->get_stat(ALLIANCE) . "\">Back to Mystics</a></div>"; free_casting_now($iUserID); include_game_down(); exit; } // SPELL_ENEMY not on own alli if ($strSpellType == SPELL_ENEMY && $iTrgAlli == $iSrcAlli) { echo '<div class="center">' . "Sorry, but I refuse to do harm to our alliance members.<br />"; echo "<br /><br /><br /><a href=\"main.php?cat=game&page=mystic&magekd=" . $objTrgUser->get_stat(ALLIANCE) . "\">Back to Mystics</a></div>"; free_casting_now($iUserID); include_game_down(); exit; } // Check for target protection period if ($objTrgUser->get_user_info(HOURS) < PROTECTION_HOURS) { // Removed code-reuse of the copy-paste variety - AI 30/09/06 if ($strSpellType != SPELL_SELF) { $iRemaining = PROTECTION_HOURS - $objTrgUser->get_user_info(HOURS); echo '<div id="textMedium"><p>' . 'It appears that the tribe you wish to target is still ' . 'materializing. Our Mage estimates that it will take another ' . $iRemaining . ' updates for the area to become a stable part of ' . 'our reality.' . "</p><p>" . '<a href="main.php?cat=game&page=mystic&magekd=' . $objTrgUser->get_stat(ALLIANCE) . '">Back to Mystics</a>' . '</p>' . '</div>'; free_casting_now($iUserID); include_game_down(); exit; } } // Check for own protection period (this is also checked in mystic2.inc.php if ($objSrcUser->get_user_info(HOURS) < PROTECTION_HOURS) { if ($strSpellType != SPELL_SELF) { echo '<div id="textMedium"><p>' . 'You are still under protection.' . "</p><p>" . '<a href="main.php?cat=game&page=mystic&magekd=' . $objSrcUser->get_stat(ALLIANCE) . '">Back to Mystics</a>' . '</p>' . '</div>'; free_casting_now($iUserID); include_game_down(); exit; } } // Check for visioning a spirit if ($objTrgUser->get_stat(RACE) == 'Spirit' && $i_strSpellName == 'vision') { echo '<div id="textMedium"><p>' . "Your mystics are confused, they can't see anything at all." . "</p><p>" . '<a href="main.php?cat=game&page=mystic&magekd=' . $objSrcUser->get_stat(ALLIANCE) . '">Back to Mystics</a>' . '</p>' . '</div>'; free_casting_now($iUserID); include_game_down(); exit; } // Check for casting jura on a Templar - AI 11/02/2007 if ($objTrgUser->get_stat(RACE) == 'Templar' && $i_strSpellName == "juranimosity") { echo "Sorry, but " . $objTrgUser->get_stat(TRIBE) . " does not have any thieves for me to disband."; echo "<br /><br /><br /><a href=\"main.php?cat=game&page=mystic&magekd=" . $objTrgUser->get_stat(ALLIANCE) . ">Back to Mystics</a>"; free_casting_now($iUserID); include_game_down(); exit; } // check the user has cast it at lest 1 time if ($i_intSpelltimes <= 0) { echo "Sorry but you must cast this spell at least 1 time.<br />"; echo "<br /><br /><br /><a href=main.php?cat=game&page=mystic&magekd=" . $objTrgUser->get_stat(ALLIANCE) . ">Back to Mystics</a>"; free_casting_now($iUserID); include_game_down(); exit; } // Added by Genia4, checks that the user didnt ask to cast a self-spell until it succeeds for less than 1 hours. if ($i_blnMinHours && $i_minHours <= 0) { echo "Sorry but you must tell your mage for how much time you want the self spell.<br />"; echo "<br /><br /><br /><a href=main.php?cat=game&page=mystic&magekd=" . $objTrgUser->get_stat(ALLIANCE) . ">Back to Mystics</a>"; free_casting_now($iUserID); include_game_down(); exit; } // check the user has cast it no more than X times if ($i_intSpelltimes > MAX_SPELL_CASTS) { echo "Sorry but you can't auto-cast more than " . MAX_SPELL_CASTS . " times in a row in the interests of reducing server lag.<br />"; echo "<br /><br /><br /><a href=main.php?cat=game&page=mystic&magekd=" . $objTrgUser->get_stat(ALLIANCE) . ">Back to Mystics</a>"; free_casting_now($iUserID); include_game_down(); exit; } // check they aren't trying to cast a spell beyond their level, they must've modified the // form directly to do this....TSKTSK! $iMageLevel = get_mage_level($objSrcUser); // Martel: Added age 22 to implement high acreage spells // And removed again - AI 30/09/06 //$arrSrcBuild = $objSrcUser->get_builds(); //$iTotalAcres = $arrSrcBuild[LAND]; if ($iMageLevel < $arrSpells[$i_strSpellName]['level']) { echo "I'm sorry, you cannot cast " . $strSpellDisplay . "."; echo "<br /><br /><br /><a href=main.php?cat=game&page=mystic&magekd=" . $objSrcUser->get_stat(ALLIANCE) . ">Back to Mystics</a>"; free_casting_now($iUserID); include_game_down(); exit; } if (!clsBlock::isOpAllowed($objSrcUser, $objTrgUser) && $strSpellType != SPELL_SELF) { echo '<div id="textMedium"><p>' . 'Someone else from the same IP has already opped this tribe during the last 8 hours.' . '</p><p>' . '<a href="main.php?cat=game&page=mystic">Return</a>' . '</p></div>'; clsBlock::reportOp($objSrcUser, $objTrgUser, 'Spell: ' . $i_strSpellName, false); free_casting_now($iUserID); include_game_down(); exit; } $intOldPower = $objSrcUser->get_spell(POWER); //Check for Thwart $trgThwart = 1; if ($strSpellType != SPELL_SELF) { $arrTrgSpells = $objTrgUser->get_spells(); if ($arrTrgSpells[THWART] > 0) { $trgThwart = 0.75; } } //Churches // Tragedy: april 20th 2002: // adding a cap of max 80% effectiveness on churches, ergo max 20% of land $church_percentage = min(0.2, $arrTrgBuild['churches'] / $arrTrgBuild['land']); //frost: added high elves church bonus if ($objTrgUser->get_stat(RACE) == 'High Elf') { $church_bonus = $church_percentage * 4; } else { $church_bonus = $church_percentage * 3.5; } // Skathen: May 10th 2002: // Stop churches affecting self spells // Stop selected target affecting self spells // Martel: version 2.0, same purpose if ($strSpellType == SPELL_SELF) { //next line a small hack to prevent possible future bugs $objTrgUser = $objSrcUser; $church_bonus = 0; $trgThwart = 1; $intTargetMageLevel = 12 - $intCasterMageLevel; if ($intTargetMageLevel <= 4) { $intTargetMageLevel = 4; } if ($objSrcUser->get_user_info(HOURS) < PROTECTION_HOURS) { $intTargetMageLevel = 3; } } $chance_to_cast = formulate_chance($intCasterMageLevel, $intTargetMageLevel, $arrSpells[$i_strSpellName]); //========================================================================== // Main block - calculates success-rates, calls the specific spell-function //========================================================================== //How many spells can we cast ? //since we don't have 'infinity', we'll use an arbitrarily large number $totalAvailable = $arrSpells[$i_strSpellName]['cost'] > 0 ? floor($intOldPower / $arrSpells[$i_strSpellName]['cost']) : 9999999999.0; if ($totalAvailable > $i_intSpelltimes) { $totalAvailable = $i_intSpelltimes; } /* check the tribe still has the power to cast one time*/ if ($totalAvailable <= 0) { echo '<div class="center">' . "I'm sorry, you don't have enough Magic Power to cast that spell."; echo "<br /><br /><br /><a href=main.php?cat=game&page=mystic&magekd=" . $objTrgUser->get_stat(ALLIANCE) . ">Back to Mystics</a></div>"; free_casting_now($iUserID); include_game_down(); exit; } /* check for casting on a Nazgul, but only if its not a self spell */ if ($strSpellType != SPELL_SELF && $objTrgUser->get_stat(RACE) == "Nazgul") { $nazgulBonus = 0.2; } else { $nazgulBonus = 0; } // added nazgul casting failures if ($objSrcUser->get_stat(RACE) == "Nazgul") { $nazgulPenalty = 0.25; } else { $nazgulPenalty = 0; } /* check for casting on a Dragon, casting on dragon gives 50% less damage */ if ($objTrgUser->get_stat(RACE) == "Dragon") { $damageModifier *= 0.5; } // Roar of the horde fireball if ($strSpellType == SPELL_ENEMY && ($objTrgUser->get_stat(RACE) == "Uruk Hai" || $objTrgUser->get_stat(RACE) == "Oleg Hai" || $objTrgUser->get_stat(RACE) == "Mori Hai")) { $id = $objTrgUser->get_userid(); $seek = mysql_query("Select * from spells where id = {$id}"); $seek = mysql_fetch_array($seek); if ($seek['roar'] > 0 && $seek['forest'] == 0) { $rothBonus = 1 / 7; } else { $rothBonus = 0; } } else { $rothBonus = 0; } //Formulate the independent failure-chances. ML=magelevel, CH=Church-protection, race=race-protection, etc... $P_ML = 1 - $trgThwart * min($chance_to_cast, 290) / 300; $P_CH = $church_bonus; //$P_race1 -- used to be dragon protection $P_race2 = $nazgulBonus; $P_race3 = $nazgulPenalty; $P_roth = $rothBonus; // Martel: Adding exceptions here (alliance spell) if ($strSpellType == SPELL_ALLIANCE) { $P_CH = 0; $P_roth = 0; } //Calculate total chance of success per spell $P_success = (1 - $P_ML) * (1 - $P_CH) * (1 - $P_race2) * (1 - $P_race3) * (1 - $P_roth); //Loop through the number of spells casted, randomly decide wether it succeeds or fails. //When it fails, randomly choose a reason based on the relative failure-rates of all possible failure-reasons //Note that Stop-On-Success will be dealt with later on, by the spell-include-function $cntSpellSuccess = 0; $cntSF_total = 0; $cntSF_ML = 0; $cntSF_CH = 0; $cntSF_race2 = 0; $cntSF_race3 = 0; $cntSF_roth = 0; //Don't worry too much about the math behind it. It's correct and assures a fair distribution over the various 'reasons for failure' $P_fail_Total = $P_ML + $P_CH + $P_race2 + $P_race3 + $P_roth; $P_fail_ML = $P_ML / $P_fail_Total; $P_fail_CH = $P_CH / $P_fail_Total; $P_fail_race2 = $P_race2 / $P_fail_Total; $P_fail_race3 = $P_race3 / $P_fail_Total; $P_fail_roth = $P_roth / $P_fail_Total; if ($i_blnStopOnSuccess && $i_blnMinHours && $strSpellType == SPELL_SELF) { $i_blnStopOnSuccess = FALSE; } if ($i_blnMinHours && $strSpellType != SPELL_SELF) { $i_blnStopOnSuccess = TRUE; } for ($x = 1; $x <= $totalAvailable; $x++) { $random = rand(1, 10000) / 10000; if ($random < $P_success) { $cntSpellSuccess++; //Stop-On-Success check if ($i_blnStopOnSuccess == 1) { $totalAvailable = $x; break; } } else { $cntSF_total++; //Why did the spell fail ? Default ML-difference, CHs, race-protection, roth-protection, etc... $random = rand(1, 10000) / 10000; if ($random <= $P_fail_ML) { $cntSF_ML++; } if ($random > $P_fail_ML && $random <= $P_fail_ML + $P_fail_CH) { $cntSF_CH++; } if ($random > $P_fail_ML + $P_fail_CH && $random <= $P_fail_ML + $P_fail_CH + $P_fail_race2) { $cntSF_race2++; } if ($random > $P_fail_ML + $P_fail_CH + $P_fail_race2 && $random <= $P_fail_ML + $P_fail_CH + $P_fail_race2 + $P_fail_race3) { $cntSF_race3++; } if ($random > $P_fail_ML + $P_fail_CH + $P_fail_race2 + $P_fail_race3) { $cntSF_roth++; } } } // Ok, now we're done with calcing how many spells will succeed and why they will fail, we proceed to actually casting the spells // Call with: SpellCaster-object, Target-object, Spellname, Times-to-cast, Minimum-hours if (!$i_blnMinHours) { $minHours = 0; } else { $minHours = $i_minHours; } if ($cntSpellSuccess > 0) { $spellResult = cast_spell($objSrcUser, $objTrgUser, $arrSpells[$i_strSpellName], $cntSpellSuccess, $minHours, $damageModifier); } else { // Gotland: initialize the spellresult to avoid error message in case all attempts failed $spellResult["casted"] = 0; $spellResult["damage"] = 0; $spellResult["text_news"] = ""; $spellResult["text_screen"] = ""; } // $spellResult structure: (it's an array) // ["damage"] = 'Damage' done, could be used to calculate fame, not used for that right now. // ["casted"] = Amount of spells casted // ["text_screen"] = Return-text for the spell, to be outputted on the screen // ["text_news"] = text for the tribenews of the victim // Spend the mana and save back to to the db $manaSpent = ($spellResult["casted"] + $cntSF_total) * $arrSpells[$i_strSpellName]['cost']; $objSrcUser->set_spell(POWER, $intOldPower - $manaSpent); $dtTimestamp = date(TIMESTAMP_FORMAT); // Print out spell-casting-report if ($cntSpellSuccess == 0) { $spellResult["casted"] = 0; } $strReport = "<p>" . "Your mage has casted the spell " . ($spellResult["casted"] + $cntSF_total) . " times.<br />" . "He succeeded " . $spellResult["casted"] . " times and failed " . $cntSF_total . " times.<br />"; if ($cntSF_ML > 0) { $strReport .= $cntSF_ML . " failures he blames on lack of training.<br />"; } if ($cntSF_CH > 0) { $strReport .= $cntSF_CH . " of his cast-attempts were stopped by the Gods.<br />"; } if ($cntSF_race2 > 0) { $strReport .= $cntSF_race2 . " spells failed due to ancient Nazgul protection.<br />"; } if ($cntSF_race3 > 0) { $strReport .= $cntSF_race3 . " times your mage was hindered by our Nazgul curse.<br />"; } if ($cntSF_roth > 0) { // Roar of the Hoard "fireball bonus" // M: Updated to use objects. August 05, 2007 $citizens = $objSrcUser->get_pop(CITIZENS); $totalKilled = 0; for ($x = 1; $x <= $cntSF_roth; $x++) { $killed = ceil($citizens * 0.05); if ($citizens - $killed < 2000) { $killed = rand(10, 45); } if ($citizens - $killed < 100) { $killed = rand(2, 4); } if ($citizens - $killed < 50) { $killed = 0; } $citizens -= $killed; $totalKilled += $killed; } $objSrcUser->set_pop(CITIZENS, $citizens); $strReport .= '</p><p>Those orks must be under the influence of some spell. ' . $cntSF_roth . ' spells were returned by them in the form of ' . 'fireballs! <strong class="negative">' . number_format($totalKilled) . '</strong> citizens were killed.</p><p>'; } if ($cntSpellSuccess > 0) { $strReport .= "</p><p>Your mage reports the following results:<br />"; $strReport .= $spellResult["text_screen"] . "<br />"; } if ($spellResult["damage"] == 0) { $intFameWon = fame_win($objSrcUser, $objTrgUser, 0); } else { if ($i_strSpellName == "enforced") { $fame = floor($spellResult["damage"] * 0.1); } else { $fame = floor($spellResult["casted"] * $arrSpells[$i_strSpellName][FAME]); } $intFameWon = fame_win($objSrcUser, $objTrgUser, $fame); $strReport .= "</p><p>Your Mage gained a total of <strong class='positive'>" . number_format($intFameWon) . " fame</strong>.</p><p>"; } // Add spell-message to target tribenews if (isset($spellResult["text_news"])) { if ($spellResult["text_news"] != "" && $spellResult["casted"] > 0) { // Insert upwards compatibility with spells that do allinews // - AI 02/12/06 $strAlliMsgTemp = ""; if (isset($spellResult["alli_news"])) { $strAlliMsgTemp = $spellResult["alli_news"]; } $strMsgTemp = $spellResult["text_news"]; insert_news_item($i_strSpellName, $objTrgUser->get_userid(), $iUserID, 2, $strMsgTemp, $strAlliMsgTemp); //trigger news flag of defender $objTrgUser->set_user_info(LAST_NEWS, 1); } } // Add failed-spells message to target tribenews if ($strSpellType != SPELL_SELF && $i_strSpellName != "vision" && $cntSF_total > 0) { if ($cntSF_total > 1) { $plural = "s"; } else { $plural = ""; } $strMsgTemp = "Our Mage has detected {$cntSF_total} failed " . $strSpellDisplay . " spell{$plural} coming from " . $arrSrcStats[TRIBE] . "(#" . $arrSrcStats[ALLIANCE] . ")."; $strAlliMsgTemp = ""; insert_news_item($i_strSpellName, $objTrgUser->get_userid(), $iUserID, 2, $strMsgTemp, $strAlliMsgTemp); //trigger news flag of defender $objTrgUser->set_user_info(LAST_NEWS, 1); } // Check for kill-by-fireball. if ($spellResult["damage"] <= -100) { obj_test_for_kill($objTrgUser, $objSrcUser); } // AI's block system if ($strSpellType != SPELL_SELF) { clsBlock::logOp($objSrcUser, $objTrgUser, 'Spell: ' . $i_strSpellName); } $strReport .= "</p>" . "<p>" . "<a href=main.php?cat=game&page=mystic&magekd=" . $objTrgUser->get_stat(ALLIANCE) . ">Back to Mystics</a>" . "</p>"; // Print out the Report echo '<div id="textBig">' . '<h2>' . "Mystics Report " . '</h2>' . $strReport . '</div>'; // As requested... Show spells on success. Will people ever be satisfied? :p if ($spellResult["casted"] > 0 && $strSpellType == SPELL_SELF) { include_once 'inc/pages/advisors.inc.php'; echo '<br/>' . get_effecting_spells_table($objSrcUser); } free_casting_now($iUserID); include_game_down(); exit; }
function include_mystic2_text() { include_once "inc/functions/magic.php"; include_once "inc/functions/spells.php"; include_once "inc/functions/news.php"; $strSpellName = strval($_POST["selSpellname"]); $intSpellTimes = intval($_POST["txtAmount"]); $iTrgUserid = intval($_POST["selTarget"]); $minHours = intval($_POST["minHours"]); $blnStopOnSuccess = FALSE; if (isset($_POST["chkStop"]) && $_POST["chkStop"] == "yes") { $blnStopOnSuccess = TRUE; } // Species5618 19-2-2004: added processing of Minimum hours checkbox $blnMinHours = FALSE; if (isset($_POST["chkMin"]) && $_POST["chkMin"] == "yes") { $blnMinHours = TRUE; } $objSrcUser =& $GLOBALS["objSrcUser"]; $arrSrcStats = $objSrcUser->get_stats(); $arrSpells = set_spell_vars($objSrcUser); $strSpellType = $arrSpells[$strSpellName]['type']; // Can't cast damaging spells in protection if ($arrSpells[$strSpellName]['fame'] > 0) { obj_check_protection($objSrcUser, "magic"); } if (empty($iTrgUserid) || $iTrgUserid == $objSrcUser->get_userid()) { if ($strSpellType == SPELL_SELF || $strSpellType == SPELL_ALLIANCE) { $iTrgUserid = $objSrcUser->get_userid(); } else { echo '<div class="center">Please select a target.</div>'; include_game_down(); exit; } } include_once 'inc/functions/update.php'; check_to_update($iTrgUserid); $objTrgUser = new clsUser($iTrgUserid); $arrTrgStats = $objTrgUser->get_stats(); include_once "inc/functions/war.php"; $modifier = war_alli($arrSrcStats[ALLIANCE], $arrTrgStats[ALLIANCE]); if ($modifier < 1 && $strSpellType == SPELL_WAR) { echo '<div class="center">' . 'War only spell, you cannot cast it on this target!' . '</div>'; include_game_down(); exit; } // M: Allow self spells even if target is paused if (($arrTrgStats[KILLED] > 0 || $arrTrgStats[RESET_OPTION] == 'yes') && $strSpellType != SPELL_SELF) { echo $strDiv = '<div id="textMedium"><p>' . 'This tribe is dead or has reset.' . '<br /><br />' . '<a href="main.php?cat=game&page=mystic">' . 'Try Again ?' . '</a>' . '</p></div>'; } elseif ($objTrgUser->isPaused() && $strSpellType != SPELL_SELF) { echo $strDiv = '<div id="textMedium"><p>' . 'This tribe is paused.' . '<br /><br />' . '<a href="main.php?cat=game&page=mystic">' . 'Try Again ?' . '</a>' . '</p></div>'; } else { // Doubleclick-protection. Sets a field in the DB when the script loads, // field will be turned "off" when the thing is done. // Added by Species5618, 10-3-2004 $magic_busy = $objSrcUser->get_spell(CASTING_NOW); if ($magic_busy == BUSY) { echo $strDiv = '<div class="center">' . "Spells are being processed at the moment, please don't " . "doubleclick the button, even though the server might not " . "respond immediately." . '<br /><br />' . '<a href="main.php?cat=game&page=mystic">' . 'Try Again ?' . '</a>' . '</div>'; include_game_down(); exit; } else { $objSrcUser->set_spell(CASTING_NOW, BUSY); make_magic2($objSrcUser, $iTrgUserid, $arrSpells, $strSpellName, $intSpellTimes, $blnStopOnSuccess, $blnMinHours, $minHours); // frost: 'free' casting_now is in inc/functions/magic.php, because // here it's getting ignored } } }
function make_thievery(&$objSrcUser, &$objTrgUser, $local_action, $amount_sent, $amount_ops, $stop_on_success) { global $HTTP_SERVER_VARS, $connection; check_to_update($objTrgUser->get_userid()); if ($objTrgUser->get_stat(ALLIANCE) == 0) { echo "This player has been either deleted or suspended"; include_game_down(); exit; } //frost: global protection routine $global_protection = mysql_query("SELECT global_protection FROM admin_switches"); $global_protection = mysql_fetch_array($global_protection); if ($global_protection['global_protection'] == "on") { echo "<br /><br /><br />Because of a global event all tribes in ORKFiA are under protection.<br />Please read the announcement in the forum."; include_game_down(); exit; } mt_srand((double) microtime() * 1000000); $amount_sent = floor($amount_sent); if (!file_exists("inc/ops/" . $local_action . ".php")) { echo "Missing file: inc/ops/{$local_action}.php"; include_game_down(); exit; } $fn = "inc/ops/" . $local_action . ".php"; include $fn; $kingdom = $objTrgUser->get_stat(ALLIANCE); if ($amount_sent <= 0) { echo "Not sending ANY thieves on a thievery mission doesn't accomplish much<br /><br />"; echo "<a href=main.php?cat=game&page=thievery&kd={$kingdom}>Try again</a>"; include_game_down(); exit; } if ($objSrcUser->get_userid() == $objTrgUser->get_userid() && get_op_type() == "aggressive") { echo "You must choose an appropriate target.<br /><br />"; echo "<a href=main.php?cat=game&page=thievery&kd={$kingdom}>Try again ?</a>"; include_game_down(); exit; } if ($objTrgUser->get_user_info(hours) < PROTECTION_HOURS && get_op_type() != "self") { $iRemaining = PROTECTION_HOURS - $objTrgUser->get_user_info(HOURS); $strProtectionMsg = '<div id="textMedium"><p>' . 'It appears that the tribe you wish to target is still ' . 'materializing. The head of our thieves estimates that it will ' . 'take another ' . $iRemaining . ' updates for the area to become ' . 'a stable part of reality.'; echo $strProtectionMsg . "</p><p>"; echo "<a href=main.php?cat=game&page=thievery&kd={$kingdom}>Try again ?</a>" . '</p></div>'; include_game_down(); exit; } if ($amount_ops <= 0) { echo '<div id="textMedium"><p>' . "You didn't do anything..." . "<p><a href=main.php?cat=game&page=thievery&kd={$kingdom}>Try again</a>" . '</p></div>'; include_game_down(); exit; } $credits = $objSrcUser->get_thievery(CREDITS); $op_cost = get_op_cost($local_action, $objSrcUser->get_build(LAND)); if ($credits < $op_cost) { echo '<div id="textMedium"><p>' . "Sorry, every aggressive thievery operation " . "requires thievery points and you don't have enough to perform this type of operation.</p>" . "<p><a href=main.php?cat=game&page=thievery&kd={$kingdom}>Try again</a>" . '</p></div>'; include_game_down(); exit; } // Tried to send more operations than have op-credits if ($credits < $amount_ops * $op_cost) { $amount_ops = floor($credits / $op_cost); } if ($amount_sent > $objSrcUser->get_army_home(UNIT5)) { echo '<div id="textMedium"><p>' . "We don't have enough thieves to send even 1 operation in the way you've requested, please specify a different amount.</p>" . "<p><a href=main.php?cat=game&page=thievery&kd={$kingdom}>Try again</a>" . '</p></div>'; include_game_down(); exit; } if (!clsBlock::isOpAllowed($objSrcUser, $objTrgUser) && get_op_type() != "self") { echo '<div id="textMedium"><p>' . 'Someone else from the same IP has already opped this tribe during the last 8 hours.' . '</p><p>' . '<a href="main.php?cat=game&page=thievery">Return</a>' . '</p></div>'; clsBlock::reportOp($objSrcUser, $objTrgUser, 'Thief op: ' . $local_action, false); free_casting_now($iUserID); include_game_down(); exit; } // Dragon 50% damage reduction. For war-bonusses change this modifier as well, instead of directly editing the ops-files. // -Martel wuz here- (50% reduction works now) include_once 'inc/functions/get.php'; if ($objTrgUser->get_stat(RACE) == 'Dragon') { $modifier = 0.5; } else { $modifier = 1; } // War-check include_once "inc/functions/war.php"; $warmodifier = war_alli($objTrgUser->get_stat(ALLIANCE), $objSrcUser->get_stat(ALLIANCE)); if ($warmodifier > 1) { $modifier *= 1.1; if ($objSrcUser->get_spell(DEFIANCE) > 0) { $modifier *= 1.1; } } $target = war_target($objTrgUser->get_stat(ALLIANCE)); if ($target != 0 && $warmodifier == 0) { $modifier *= 0.95; } $total_sent = $amount_ops * $amount_sent; // Ugly way of doing it... but here the div for the report starts. Timesaver. echo '<div id="textBig">' . '<h2>' . 'Thievery Report' . '</h2>' . '<p>'; if ($total_sent > $objSrcUser->get_army_home(UNIT5)) { $amount_ops = floor($objSrcUser->get_army_home(UNIT5) / $amount_sent); echo "We don't have enough thieves to send that many operations, we've sent less instead.<br /><br />"; } // GUARDHOUSES // Tragedy: april 20th 2002: // adding a cap of max 80% effectiveness on guardhouses, ergo max 20% of land $guard_percentage = min(0.2, $objTrgUser->get_build(GUARDHOUSES) / $objTrgUser->get_build(LAND)); if (get_op_type() != "self") { $P_guard = $guard_percentage * 3.5; } else { $P_guard = 0; } //THIEVES TRAP //Species 5618: 17-01-2005 //special self-op provides 15% thievery protection if ($objTrgUser->get_thievery(TRAP) > 0 && get_op_type() != "self") { $P_trap = 0.15; } else { $P_trap = 0; } $defthiefs = $objTrgUser->get_army_home(UNIT5); if ($defthiefs < 10) { $defthiefs = 10; } $d_user_tpa = $defthiefs / $objTrgUser->get_build(LAND); //Templars don't have thieves - AI 10/02/2007 if ($objTrgUser->get_stat(RACE) == 'Templar') { $d_user_tpa = 0; } $off_thieves = $objSrcUser->get_army_home(UNIT5); $thieves_lost = 0; $cntOpSuccess = 0; $cntOF_total = 0; $cntOF_tpa = 0; $cntOF_gh = 0; $cntOF_trap = 0; $d_land = $objTrgUser->get_build(LAND); $o_land = $objSrcUser->get_build(LAND); for ($x = 1; $x <= $amount_ops; $x++) { if (get_op_type() == "aggressive") { $o_user_tpa = $off_thieves / $o_land; if ($d_user_tpa > 0.25) { $tpa_vs_tpa = $o_user_tpa / $d_user_tpa / 1.5; } else { $tpa_vs_tpa = 1; } $tpa_vs_tpa = min(max($tpa_vs_tpa, 0.05), 1); $chance = get_op_chance() / 100 * $tpa_vs_tpa; if ($o_land < 0.5 * $d_land || $o_land > 2 * $d_land) { $chance /= 2; } $P_tpa = 1 - $chance; } else { $P_tpa = 1 - get_op_chance() / 100; } $P_success = (1 - $P_tpa) * (1 - $P_guard) * (1 - $P_trap); //Randomly decide wether the op succeeds or fails. //When it fails, randomly choose a reason based on the relative failure-rates of all possible failure-reasons //Don't worry too much about the math behind it. It's correct and assures a fair distribution over the various 'reasons for failure' $P_fail_Total = $P_tpa + $P_guard + $P_trap; $P_fail_tpa = $P_tpa / $P_fail_Total; $P_fail_guard = $P_guard / $P_fail_Total; $P_fail_trap = $P_trap / $P_fail_Total; $random = rand(1, 10000) / 10000; if ($random < $P_success) { $cntOpSuccess++; //Stop-On-Success check if ($stop_on_success == "yes") { $amount_ops = $x; break; } } else { $cntOF_total++; //Why did the op fail ? TPA-diff or GH failure or Thieves Trap? $random = rand(1, 10000) / 10000; if ($random <= $P_fail_trap) { $cntOF_trap++; $thieves_lost += ceil($amount_sent * 0.05 * 1.3); } elseif ($random <= $P_fail_trap + $P_fail_guard) { $cntOF_gh++; $thieves_lost += ceil($amount_sent * (rand(5, 15) / 100)); } else { $cntOF_tpa++; $thieves_lost += ceil($amount_sent * 0.05); } } //Lower amount of thieves so chances are correctly recalculated during the next iteration. $off_thieves -= $amount_sent; } if (get_op_type() == "self" && $local_action != "trap") { $thieves_lost = 0; } //Now call the actual op. //The $opResult return-value is an array consisting of 3 values: //- $opResult["fame"], fame gained/lost //- $opResult["text_screen"], text to be shown on screen //- $opResult["text_news"], text to be shown in enemy tribenews if ($local_action == "ambush" && $cntOpSuccess > 0) { $cntOpSuccess = 1; } if ($cntOpSuccess > 0) { $opResult = do_op($objSrcUser, $objTrgUser, $cntOpSuccess, $amount_sent, $modifier); } else { $opResult["fame"] = 0; } $total_sent = $amount_ops * $amount_sent; if ($thieves_lost > $total_sent) { $thieves_lost = $total_sent; } $plural1 = ""; $plural2 = "was"; if ($amount_ops > 1) { $plural1 = "s"; $plural2 = "were"; } $plural3 = "thief"; if ($total_sent > 1) { $plural3 = "thieves"; } echo "{$amount_ops} operation{$plural1}, a total of {$total_sent} {$plural3}, {$plural2} sent on its way.<br />"; if ($cntOpSuccess == 1) { $plural = ""; $plural3 = "was"; } else { $plural = "s"; $plural3 = "were"; } if ($cntOF_total == 1) { $plural2 = "has"; } else { $plural2 = "have"; } echo "{$cntOpSuccess} operation{$plural} {$plural3} reported to be successful, {$cntOF_total} {$plural2} failed.<br /><br />"; if ($cntOF_tpa == 1) { $plural = ""; $plural2 = "has"; } else { $plural = "s"; $plural2 = "have"; } if ($cntOF_tpa > 0 && get_op_type() == "aggressive" && $d_user_tpa != 0) { echo "{$cntOF_tpa} operation{$plural} {$plural2} failed because the enemy thieves intercepted ours.<br />"; } elseif ($cntOF_tpa > 0 && get_op_type() == "aggressive" && $d_user_tpa == 0) { echo "{$cntOF_tpa} operation{$plural} {$plural2} failed because our thieves got spotted by enemy military.<br />"; } if ($cntOF_gh == 1) { $plural = ""; $plural2 = "has"; } else { $plural = "s"; $plural2 = "have"; } if ($cntOF_gh > 0) { echo "Enemy guardstations caused {$cntOF_gh} operation{$plural} to fail<br />"; } if ($cntOF_trap == 1) { $plural = ""; $plural2 = "was"; } else { $plural = "s"; $plural2 = "were"; } if ($cntOF_trap > 0) { echo "{$cntOF_trap} of our operations were caught by traps the enemy had set for us<br />"; } if ($opResult["fame"] != 0) { $trgFame = $objTrgUser->get_stat(FAME); if ($opResult["fame"] > $trgFame) { $opResult["fame"] = $trgFame; } $newDFame = $trgFame - $opResult["fame"]; $objTrgUser->set_stat(FAME, $newDFame); $newFame = $objSrcUser->get_stat(FAME) + $opResult["fame"]; $objSrcUser->set_stat(FAME, $newFame); } if ($amount_ops != 1) { $plural = "these"; $plural2 = "s"; } else { $plural = "this"; $plural2 = ""; } if ($thieves_lost == 1) { $plural3 = 'f'; } else { $plural3 = 'ves'; } echo "With {$plural} operation{$plural2} we have gained <b class=positive>" . $opResult["fame"] . " fame</b> and lost " . number_format($thieves_lost) . " thie" . $plural3 . ".<br /><br />"; $dplayer = $objTrgUser->get_userid(); $userid = $objSrcUser->get_userid(); $tribe = stripslashes($objSrcUser->get_stat(TRIBE)); $iSrcAid = $objSrcUser->get_stat(ALLIANCE); if ($cntOF_total > 0 && get_op_type() == "aggressive") { if ($cntOF_total > 1) { $plural = 's'; } else { $plural = ''; } $timestamp = date(TIMESTAMP_FORMAT); $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"]; $create['event'] = "INSERT INTO `news` (`id`, `time`, `ip`, `type`, `duser`, `ouser`, `result`, `text`, `kingdom_text`)\n VALUES ('', '{$timestamp}', '{$ip}', '{$local_action}', '{$dplayer}', '{$userid}', 'fail',\n 'We have caught {$cntOF_total} operation{$plural} of enemy thieves from {$tribe} (#{$iSrcAid}) tresspassing on our land.','') "; $created['event'] = mysql_query($create['event'], $connection); //trigger news flag of defender $objTrgUser->set_user_info(LAST_NEWS, $timestamp); } if ($cntOpSuccess > 0) { if (get_op_type() == "aggressive") { // echo name and alli $strTrgTribe = stripslashes($objTrgUser->get_stat(TRIBE)); $iTrgAlliance = $objTrgUser->get_stat(ALLIANCE); echo "As your thieves return from {$strTrgTribe} (#{$iTrgAlliance}) the foreman reports the following result:" . '</p>'; } else { echo "The foreman of our thieves reports the following result:" . '</p>'; } echo '<div style="padding: 0 15px">' . $opResult["text_screen"] . '</div>' . '<p>'; if ($opResult["text_news"] != "") { $timestamp = date(TIMESTAMP_FORMAT); $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"]; $create['event'] = "INSERT INTO `news` (`id`, `time`, `ip`, `type`, `duser`, `ouser`, `result`, `text`, `kingdom_text`)\n VALUES ('', '{$timestamp}', '{$ip}', '{$local_action}', '{$dplayer}', '{$userid}', '1',\n '{$opResult['text_news']}','') "; $created['event'] = mysql_query($create['event'], $connection); //trigger news flag of defender $objTrgUser->set_user_info(LAST_NEWS, $timestamp); } } if (get_op_type() == "aggressive" || get_op_name() == "Thieves Trap (SELF)") { $total_cost = $amount_ops * $op_cost; $credits = $objSrcUser->get_thievery(CREDITS) - $total_cost; $objSrcUser->set_thievery(CREDITS, $credits); } $returning = $total_sent - $thieves_lost; $returnTime = 3; if ($objSrcUser->get_stat(RACE) == 'Spirit') { $returnTime = 2; } $col = UNIT5 . "_t" . $returnTime; $thievesout = $objSrcUser->get_milreturn($col); $objSrcUser->set_milreturn($col, $thievesout + $returning); $thievesleft = $objSrcUser->get_army(UNIT5) - $thieves_lost; $objSrcUser->set_army(UNIT5, $thievesleft); obj_test_for_kill($objTrgUser, $objSrcUser); if (get_op_type() != "self") { clsBlock::logOp($objSrcUser, $objTrgUser, 'Thief op: ' . $local_action); } echo '</p>' . '<p>' . '<a href="main.php?cat=game&page=thievery&kd=' . $kingdom . '">Return</a>' . '</p>' . '</div>'; }
function doAttack(&$objSrcUser, &$objTrgUser, $arrSentArmy) { $srcKd = $objSrcUser->get_stat(ALLIANCE); $trgKd = $objTrgUser->get_stat(ALLIANCE); $strSrcRace = $objSrcUser->get_stat(RACE); $iSrcLand = $objSrcUser->get_build(LAND); $arrTrgBuilds = $objTrgUser->get_builds(); $gains = pow($arrTrgBuilds[LAND] / $iSrcLand, 2) + $arrTrgBuilds[LAND] / ($iSrcLand * 3); $gains = min($gains, 1); $quick_gains = 0.01 * $gains; // 1% Land Gain if ($strSrcRace == "Oleg Hai") { $quick_gains = $quick_gains * 1.3; } //========================================================================== // Calculate Acre Gains //========================================================================== include_once 'inc/functions/build.php'; $arrBuildVars = getBuildingVariables($objTrgUser->get_stat(RACE)); $arrBuildVars = $arrBuildVars['variables']; $max_build = $objTrgUser->get_number_build_types(); $total_grab = 0; for ($i = 1; $i <= $max_build; $i++) { $strVar = trim($arrBuildVars[$i]); $acres_won[$strVar] = round($arrTrgBuilds[$strVar] * $quick_gains); $buildings = $objTrgUser->get_build($strVar); $land = $objTrgUser->get_build(LAND); $arrBuilds = array($strVar => $buildings - $acres_won[$strVar], LAND => $land - $acres_won[$strVar]); $objTrgUser->set_builds($arrBuilds); $total_grab = $total_grab + $acres_won[$strVar]; } // Explored $explore_gains = 0.2; $acres_explored = round($total_grab * $explore_gains); $land = $objSrcUser->get_build(LAND); $objSrcUser->set_build(LAND, $land + $acres_explored); //========================================================================== // Calculate Citizens Killed //========================================================================== $trgCits = $objTrgUser->get_pop(CITIZENS); $max_kill = $trgCits * 0.2; $trgRace = $objTrgUser->get_stat(RACE); if ($max_kill < $arrTrgBuilds[LAND] * 3 && $trgRace != "Dragon") { $max_kill = $arrTrgBuilds[LAND] * 3; } elseif ($max_kill < $arrTrgBuilds[LAND] * 2 && $trgRace == "Dragon") { $max_kill = $arrTrgBuilds[LAND] * 2; } // War effects on max kill include_once "inc/functions/war.php"; $modifier = war_alli($srcKd, $trgKd); if ($modifier == 2) { $max_kill = $max_kill * 1.2; } // Martel: small bug fixed, $arrTrgBuilds not $arrTrgBuild $wallsPercent = $arrTrgBuilds[WALLS] * 100 / $arrTrgBuilds[LAND]; if ($wallsPercent > 20) { $wallsPercent = 20; } // frost: age 18, each % walls shelters 2% citizen for ($y = 1; $y <= $wallsPercent; $y++) { $max_kill *= 0.98; } // Max citizens to kill == citizens available $max_kill = round($max_kill); if ($max_kill > $trgCits) { $max_kill = $trgCits; } if ($max_kill > 0) { $intCitizens_alive = $trgCits - $max_kill; $objTrgUser->set_pop(CITIZENS, $intCitizens_alive); } else { $max_kill = 0; } // Let's see if we killed the tribe include_once 'inc/functions/generic.php'; obj_test_for_kill($objTrgUser, $objSrcUser); //========================================================================== // Calculate Cash Gains and Fame //========================================================================== $trgMoney = $objTrgUser->get_good(MONEY); $mod = 1; $stolen_crowns = round($trgMoney * 0.04); if ($arrTrgBuilds[LAND] > $iSrcLand) { $fame_win = round($total_grab * 1.0); } elseif ($arrTrgBuilds[LAND] < $iSrcLand * 0.7) { $fame_win = round(-$total_grab * 1.0); $mod = $arrTrgBuilds[LAND] * 1.3 / $iSrcLand; } else { $fame_win = round($total_grab * 1.2); } if ($mod < 0.7) { $mod = 0.7; } $max_crowns = round($arrTrgBuilds[LAND] * 500); $stolen_crowns = min(round($stolen_crowns * $mod), round($max_crowns)); $objTrgUser->set_good(MONEY, $trgMoney - $stolen_crowns); $money = $objSrcUser->get_good(MONEY); $objSrcUser->set_good(MONEY, $money + $stolen_crowns); //========================================================================== // Return time //========================================================================== $wait = 4; // 4 hour attack time if ($strSrcRace == "Raven") { $wait = 1; } elseif ($strSrcRace == "Mori Hai" || $strSrcRace == "Dragon") { $wait = 3; } $landtime = 'land_t' . $wait; $objSrcUser->set_user_info(NEXT_ATTACK, $wait); //========================================================================== // Add land to incoming //========================================================================== if ($total_grab > 0) { $old_land = $objSrcUser->get_build($landtime); $objSrcUser->set_build($landtime, $total_grab + $old_land); } //========================================================================== // Calculate Fame Gains //========================================================================== // War effects $objSrcAlliance = $objSrcUser->get_alliance(); require_once 'inc/functions/war.php'; if (checkWarBetween($objSrcAlliance, $trgKd)) { // Update land counter in new war system March 06, 2008 Martel $iNeeded = $objSrcAlliance->get_war('land_needed'); $objSrcAlliance->set_war('land_needed', max(0, $iNeeded - $total_grab)); // War effects on fame $fame_win *= 1.2; } // Cannot take more fame than what the target has $fame_win = round($fame_win); $target_fame = $objTrgUser->get_stat(FAME); if ($fame_win > $target_fame) { $fame_win = $target_fame; } $fame1 = $objSrcUser->get_stat(FAME) + $fame_win; $fame2 = $target_fame - $fame_win; $objSrcUser->set_stat(FAME, $fame1); $objTrgUser->set_stat(FAME, $fame2); //========================================================================== $arrResults['gained_acres'] = $total_grab; $arrResults['explored_acres'] = $acres_explored; $arrResults['gained_fame'] = $fame_win; $arrResults['gained_crowns'] = $stolen_crowns; $arrResults['killed_citizens'] = $max_kill; return $arrResults; }