Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}
Beispiel #5
0
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;
}
Beispiel #6
0
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&amp;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&amp;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&amp;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&amp;page=mystic&amp;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&amp;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&amp;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;
}
Beispiel #7
0
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&amp;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&amp;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&amp;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
        }
    }
}
Beispiel #8
0
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&amp;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&amp;page=thievery&amp;kd=' . $kingdom . '">Return</a>' . '</p>' . '</div>';
}
Beispiel #9
0
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;
}