<?
include("html.php");
include(
"html2.php");

/* -------------------------------------------------
  General Game Functions
  ---------------------------------------------------- */

// Execute a database query (with error checking)
// This function is used to execute ALL mysql_queries within the game
function dbquery($query) {
    global 
$link$stats$admin$irongate;
    
$oquery $query;
    
$query trim($query);
    
$quoted false;
    
$nquery "";
    if (
$irongate) {
        
$numericcounter 0;
        
$querytype strtoupper(substr($query0strpos($query" ")));
    }
    for (
$i 0$i strlen($query); $i++) {
        if ((
substr($query$i1) == "\"") && (substr($nquery, -1) != "\\"))
            
$quoted = !$quoted;
        if ((!
$quoted) && (substr($query$i1) == ";"))
            break;
        if ((
$irongate) && ($querytype == "UPDATE")) {
            if ((!
$quoted) && (!$inwhereclause) && (strtoupper(substr($query$i5)) == "WHERE")) {
                
$inwhereclause true;
                
$whereclause substr($query$i);
            }
            if ((!
$quoted) && (strtoupper(substr($query$i5)) == "LIMIT"))
                
$limited $i;
            if ((!
$quoted) && (is_numeric(substr($query$i1))))
                
$numericcounter++;
            if ((!
$quoted) && ($numericcounter 0) && (!is_numeric(substr($query$i1)))) {
                if (
$numericcounter >= 7)
                    
$assurelimit true;
                
$numericcounter 0;
            }
        }
        
$nquery .= substr($query$i1);
    }
    if ((
$assurelimit) && ($limited 0))
        
$nquery substr($nquery0$limited) . "LIMIT 1;";
    else if (
$assurelimit)
        
$nquery .= " LIMIT 1";
    
$query "$nquery;";
    
$giveback mysql_query($query);
    if (
$admin) {
        
$addon "<BR><tt>$query</tt>";
        if (
$oquery != $query)
            
$addon .= "<hr><tt>$oquery</tt>";
    }
    if (
mysql_errno ())
        
theEnd("MySQL Query Error (<i>" mysql_errno() . "</i>) " mysql_error() . "$addon");
    
$stats[queries]++;
    return 
$giveback;
}

//returns the number of units on the market of a specific type which are prices at or below the given price. Excludes the user, dead, disabled, and vacationed warlords.
//this gets called from ajaxmarket.php, where $users is not global, so we need to feed in the players number manually instead of using globals
function getUnitsBelowPrice($price$type$playernum){ 
    global 
$playerdb$marketdb$time;
    
$available sqleval("SELECT SUM(amount),$playerdb.vacation,$playerdb.land,$playerdb.disabled FROM $marketdb a
                                    INNER JOIN 
$playerdb
                                    ON a.seller=
$playerdb.num
                                WHERE type='
$type
                                AND seller!=
$playernum
                                AND time<=
$time
                                AND price<=
$price
                                AND vacation=0
                                AND disabled=0
                                AND land>0;"
);    
    if (
$available) return $available;
    else return 
0;
}

function 
getMinMarketPrice($type,$playernum){
    global 
$playerdb$marketdb$time;
    
$minprice sqleval("SELECT MIN(price),$playerdb.vacation,$playerdb.land,$playerdb.disabled    FROM $marketdb a
                                    INNER JOIN 
$playerdb
                                    ON a.seller=
$playerdb.num
                                WHERE type='
$type
                                AND seller!=
$playernum 
                                AND time<=
$time
                                AND vacation=0
                                AND disabled=0
                                AND land>0;"
);
    if (
$minprice) return $minprice;
    else return 
0;
}

function 
getMaxMarketPrice($type,$playernum){
    global 
$playerdb$marketdb$time;
    
$maxprice sqleval("SELECT MAX(price),$playerdb.vacation,$playerdb.land,$playerdb.disabled    FROM $marketdb a
                                    INNER JOIN 
$playerdb
                                    ON a.seller=
$playerdb.num
                                WHERE type='
$type
                                AND seller!=
$playernum 
                                AND time<=
$time
                                AND vacation=0
                                AND disabled=0
                                AND land>0;"
);
    if (
$maxprice) return $maxprice;
    else return 
0;
}

// Take a specified number of turns performing the given action
// Valid actions (so far): cash, land, war; others will be added as necessary
function takeTurns($numturns$action$stop=0) {
    global 
$config$cterms$trplst$prdlst$tplst$time$warflag$turnout$playerdb;
    global 
$users$urace$uera$landgained$cashgained$foodgained$runesgained;
    global 
$condenseoutput$netincomeneg$netfoodneg$netleaderneg$networkerneg;
    
    
    
//storehouse
    
if ($users[clan]){
        
$uclan loadClan($users[clan]);
    }
    
//storehouse
    
    
    
if ($users[health] > 100)
        
$users[health] = 100;

    
$urace[ind] *= $uera["t_ind"];
    
$urace[runes] *= $uera["t_rune"];

    if (
$numturns $users[turns])
        
TheEnd('<span class="cbad">FATAL ERROR</span>: attempted to use more $cterms[turns] than available!</span>');

    if ((
$action == 'cash') || ($action == 'land') || ($action == 'farm') || ($action == 'runes'))// || ($action == 'magic')) // Actions which can be aborted
        
$nonstop 0;
    else
        
$nonstop 1;

    if (
$turnout == "") {
        
$turnout = array();
        
$turnout[turnsinside] = 0;
    }
    
$taken 0;
    while (
$taken $numturns) {     // use up specified number of turns
        
$taken++;
        
$users[networth] = getNetworth($users);
        if (
$action == 'land') {     // exploring?

            
$tmp gimmeLand($users[land], $urace[expl], $uera["t_land"]);
            
$users[land] += $tmp;
            
$users[freeland] += $tmp;
            
$landgained += $tmp;
            
        }
        
$size calcSizeBonus($users[networth]);  // size bonus/penalty
        
$loanrate $config[loanbase] + $size;   // update savings and loan
        
$saverate $config[savebase] - $size;
        
$users[loan] *= + ($loanrate 52 100);
        if ((
$users[turnsused] > $config[protection]) && ($users[savings] < getMaxSave($users)))  // no savings interest while under protection
            
$users[savings] *= + ($saverate 52 100);
        
$users[loan] = round($users[loan]);
        
$users[savings] = round($users[savings]);
        
//if ($users[savings] > ($users[networth] * 10))
        //    $users[savings] = $users[networth] * 10;
// income
        
$income getCashGain($users$urace);
        if((
$urace[ability] == 33) && ($users[abilitytime] > $time)) //commerce
        
{
            
$income round(1.1 $income);
        }
        else if (
$users[clan]) 
        {
                
$iscommerce 0;
                
$clanmem dbquery("SELECT * FROM $playerdb WHERE clan=$users[clan];");
                while (
$cuser mysql_fetch_array($clanmem)) {
                    
$crace loadRace($cuser[race]);
                    if ((
$crace[ability] == 33) && ($cuser[abilitytime] >= $time)) {
                        
$iscommerce 1;
                        break;
                    }
                }
                if (
$iscommerce
                    
$income round(1.04 $income); //ally commerce
        
}
        if (
$action == 'cash')     // cashing?
            
$income round($income 1.25);
        
$wartax 0;
        if (
$warflag)      // war tax?
            
$wartax $networth 1000;
// expenses
        
$loanpayed round($users[loan] / 200);
        
$expenses getCashLoss($users$urace);
        
$money $income - ($expenses $loanpayed $wartax);
        
        
//storehouse
        
$storemoney=0;
        if (
$users[clan] && $money 0  && $uclan[members] > 1)
        {
            
$storemoney min($uclan[cash],round(-1*$money $uclan[storepct]/100));
            
$money += $storemoney;
            
$uclan[cash] -= $storemoney;
        }
        
//storehouse
        
        
$cashgained += $money;
        
$users[loan] -= $loanpayed;
        
$users[cash] += $money;
// build extra units
        
$tmppeasants 0;
        
reset($trplst);
        while (list(
$key$val) = each($trplst)) {
            ${
$val} = ceil(($users[peasants]*($config[$val][prod]/100)*$urace[ind]*$config[indc]*(sqrt($users[industry]/$users[land]))* ($users["ind_$val"] / 100)));
            
$users[$val] += $ {$val};
            
$users[peasants] -= ${$val}*$config[workerconversion]/($config[$val][prod]*$urace[ind]*$config[indc]);
            
$tmppeasants -= ${$val}*$config[workerconversion]/($config[$val][prod]*$urace[ind]*$config[indc]); //save this for the status report later
        
}
// update products
        // Food
        
$foodpro getFoodGain($users$urace);
        
$foodcon getFoodLoss($users$urace);
        if((
$urace[ability] == 17) && ($users[abilitytime] > $time)) //rain dance
        
{
            
$foodpro round(1.1 $foodpro);
        }
        else if (
$users[clan]) 
        {
                
$isenriched 0;
                
$clanmem dbquery("SELECT * FROM $playerdb WHERE clan=$users[clan];");
                while (
$cuser mysql_fetch_array($clanmem)) {
                    
$crace loadRace($cuser[race]);
                    if ((
$crace[ability] == 17) && ($cuser[abilitytime] >= $time)) {
                        
$isenriched 1;
                        break;
                    }
                }
                if (
$isenriched
                    
$foodpro round(1.04 $foodpro); //ally rain dance
        
}
        
//}
        
        
        
        
        
$food $foodpro $foodcon;
        
        
//storehouse
        
$storefood=0;
        if (
$users[clan] && $food 0  && $uclan[members] > 1)
        {
            
$storefood min($uclan[food],round(-$food $uclan[storepct]/100));
            
$food += $storefood;
            
$uclan[food] -= $storefood;
        }
        
//storehouse
        
        
        
$users[food] += $food;
        
$foodgained += $food;

// health
        
$maxhealth round(100 - (($users[tax] - 10) / 2));
        if((
$urace[ability] == 15) && ($users[abilitytime] > $time))
            
$maxhealth 100;

        if ((
$users[health] < $maxhealth) && ($users[health] < 100))
            
$users[health]++;

        
// Rain Dance
        /*if (($action == 'farm') && ($urace[ability] == 17) && ($users[abilitytime] > $time))
        {
            $chance = ($users[farms] / ($users[land] * 2)) * 100;
            if(mt_rand(0,100) <= $chance)
                $users[health]++;
        }*/

        // Tax Break
        /*if (($action == 'cash') && ($urace[ability] == 15) && ($users[abilitytime] > $time))
        {
            $chance = (($users[shops] + $users[homes]) / ($users[land] * 2)) * 100;
            if(mt_rand(0,100) <= $chance)
                $users[health]++;
        }
        if($users[health] > 100) $users[health] = 100;*/ 
// taxes
        
$taxrate $users[tax] / 100;
        if (
$users[tax] > 40)
            
$taxpenalty = ($taxrate 0.40) / 2;
        if (
$users[tax] < 20)
            
$taxpenalty = ($taxrate 0.20) / 2;
// update population
        
$popbase getMaxPopulation($users$urace$uera);
        
        
$peasmult 1;

        
$peasants = ($popbase $users[peasants]);
        if (
$peasants >= 0){
            
$peasants round($config[wkrjoin]*$urace[workers]*$peasants*$peasmult);
        }
        else{
            
$peasants round($config[wkrleave]*$peasants);
        }
        
$users[peasants] += $peasants;
// gain loyalty
        
$runes 0;
        if ((
$users[labs] / $users[land]) > .15)
            
$runes mt_rand(round($users[labs] * 1.1), round($users[labs] * 1.5));
        else
            
$runes round($users[labs] * 1.1);
        
$runes round($runes $urace[runes]);
        
$users[runes] += $runes;
        if (
$action == 'runes') {
            
$users[runes] += round($runes 0.25);
            
$runesgained += round($runes 1.25);
        }
        
$wizards 0;


        
$maxwizards $users[labs]*$config[maxwiz];
        
$eqwizards $users[labs]*$config[fullwiz];
        if (
$users[wizards] > $maxwizards) {
            
$wizards round($users[wizards] * -0.05);
        }
        elseif (
$users[wizards] <= $maxwizards && $users[wizards] >= $eqwizards) {
            
$wizards 0;
        }
        elseif (
$users[wizards] < $eqwizards) {
            if (
$eqwizards == 0) {
                
$wizards 0;
            }
            else {
                
$wizards min($eqwizards-$users[wizards],($eqwizards $users[wizards])*$config[wizjoin]*(1-$users[wizards]/(2*$eqwizards))*($users[land]/$users[labs]));
            }
        }
        else {
            
$wizards 0;
        }
        
$users[wizards] += $wizards;
        if (
$wizards 0) {
            
$tmppeasants -= min($wizards 5$users[peasants]);
            
$users[peasants] -= min($wizards 5$users[peasants]);
        }
        

// print status report
        
$turnoutvars array_merge(array("income""expenses""wartax""loanpayed""money""peasants""tmppeasants""wizards""runes""storemoney""storefood"), $trplst);
        
reset($prdlst);
        while (list(
$key$val) = each($prdlst)) {
            
$turnoutvars[] = $val;
            
$turnoutvars[] = $val "pro";
            
$turnoutvars[] = $val "con";
        }

        for (
$i 0$i count($turnoutvars); $i++) {
            if ((
$condenseoutput == "yes") || ($condenseoutput == "hidden")) {
                
$turnout["$turnoutvars[$i]"] += $ {"$turnoutvars[$i]"};
            } else {
                
$turnout["$turnoutvars[$i]"] = ${"$turnoutvars[$i]"};
            }
        }
        if ((
$condenseoutput != "yes") && ($condenseoutput != "hidden"))
            
printTurnTable($turnout);
        else
            
$turnout[turnsinside]++;

        
$users[turnsused]++;
        
$users[turns]--;
// ran out of money/food? lose 3% of all units
$goneout = array();
        
$withdraw = array();
        
reset($prdlst);
        while (list(
$key$val) = each($prdlst)) {
            if (
$users[$val] < 0) {
                
$goneout[] = $uera[$val];
                
$users[$val] = 0;
            }
        }
        if (
$users[cash] < 0) {
            if (
$users[savings] >= -1*$users[cash]){
                
$users[savings] += $users[cash];
                
$users[cash] = 0;
                
$withdraw[] = $cterms[cash];
            }
            else if (
$users[loan] < getMaxSave($users)/$users[cash]){
                
$users[loan] -= $users[cash];
                
$users[cash] = 0;
                
$withdraw[] = $cterms[cash];
            }
            else{
                
$goneout[] = $cterms[cash];
                
$users[cash] = 0;
            }
        }
        if (
count($goneout) > 0) {
            
$users[peasants] = round($users[peasants] * .97);
            
reset($trplst);
            while (list(
$key$val) = each($trplst))
                
$users[$val] = round($users[$val] * .97);
            
$users[wizards] = round($users[wizards] * .97);
            if (
$users[food] < 0)
                
$users[food] = 0;
            if (
$users[cash] < 0)
                
$users[cash] = 0;
?><span class="cbad">Due to lack of <?= implode(" and "$goneout?>, 3% of your <?= $cterms[army?> has left!<?
            
if ($nonstop) {
?></span><br><?
            
} else {
?> <?= $cterms[turns?> were stopped!</span><br><?
                
break;
            }
        }
        elseif(
count($withdraw) > 0) {
?><span class="cbad">You rush to Cluny's hut to secure funds...<?
            
if ($nonstop) {
?></span><br><?
            
} else {
?> <?= $cterms[turns?> were stopped!</span><br><?
                
break;
            }
        }

        if ((
$netincomeneg == "yes") && ($nonstop == 0) && ($money 0))
            break;
        if ((
$netfoodneg == "yes") && ($nonstop == 0) && ($food 0))
            break;
        if ((
$netleaderneg == "yes") && ($nonstop == 0) && ($wizards <= 0))
            break;
        if ((
$networkerneg == "yes") && ($nonstop == 0) && ($peasants 0))
            break;
    }

    if ((
$netincomeneg == "yes") && ($action == 'magic') && ($money 0))
        return 
true;
    if ((
$netfoodneg == "yes") && ($action == 'magic') && ($food 0))
        return 
true;
    if ((
$netleaderneg == "yes") && ($action == 'magic') && ($wizards <= 0))
        return 
true;
    if ((
$networkerneg == "yes") && ($action == 'magic') && ($peasants 0))
        return 
true;

    if (
$condenseoutput == "yes")
        
printTurnTable($turnout);
    
$users[idle] = $time;
    
reset($tplst);
    
saveUserDataNet($users"networth land freeland savings loan cash " implode(" "$tplst) . " health peasants runes wizards turnsused turns idle");
    
    
//storehouse
    
if ($users[clan]){
        
saveClanData($uclan"cash food armtrp lndtrp flytrp seatrp");
    }
    
//storehouse
    
    
    
$urace[ind] /= $uera["t_ind"];
    
$urace[runes] /= $uera["t_rune"];
    if (
$users[health] == $maxhealth && $users[health] < 100){
        
?><span class="cwarn">Your high tax rate is restricting your health! Use the heal buff to heal fully!<??></span><br><?
    
}
    return 
$taken;
}


function 
takeBuffTurns($numturns$stop=0$bufflist) {
    global 
$config$cterms$trplst$prdlst$tplst$time$warflag$turnout$playerdb;
    global 
$users$urace$uera$landgained$cashgained$foodgained$runesgained;
    global 
$condenseoutput$netincomeneg$netfoodneg$netleaderneg$networkerneg;
    if (
$users[health] > 100)
        
$users[health] = 100;

    
$ecocost getBuffCost(ecobuff$users);
    
$indycost getBuffCost(indybuff$users);
    
$warcost getBuffCost(warbuff$users);

    
$buffcost 0;
    if (
$bufflist[ecobuff] != none) {
        
$buffcost += $ecocost;
    }
    if (
$bufflist[indybuff] != none) {
        
$buffcost += $indycost;
    }
    if (
$bufflist[warbuff] != none) {
        
$buffcost += $warcost;
    }
    
    
//storehouse
    
if ($users[clan]){
        
$uclan loadClan($users[clan]);
    }
    
//storehouse
    
    
$urace[ind] *= $uera["t_ind"];
    
$urace[runes] *= $uera["t_rune"];

    if (
$numturns $users[turns])
        
TheEnd('<span class="cbad">FATAL ERROR</span>: attempted to use more $cterms[turns] than available!</span>');

    
//buffed turns can always be aborted
    
$nonstop 0;


    if (
$turnout == "") {
        
$turnout = array();
        
$turnout[turnsinside] = 0;
    }
    
$taken 0;
    while (
$taken $numturns) {     // use up specified number of turns
    
        
if ($users[runes] < $buffcost) {
            
?><span class="cbad">...Not Enough <?= $uera[runes?><?
            ?>
 <?= $cterms[turns?> were stopped!</span><br><?
                
break;
        }
        else
        
$power getBuffPower($users$urace);
        
$users[runes] -= $buffcost;
        
$taken++;
        
$users[networth] = getNetworth($users);

        
$size calcSizeBonus($users[networth]);  // size bonus/penalty
        
$loanrate $config[loanbase] + $size;   // update savings and loan
        
$saverate $config[savebase] - $size;
        
$users[loan] *= + ($loanrate 52 100);
        if ((
$users[turnsused] > $config[protection]) && ($users[savings] < getMaxSave($users)))  // no savings interest while under protection
            
$users[savings] *= + ($saverate 52 100);
        
$users[loan] = round($users[loan]);
        
$users[savings] = round($users[savings]);

// build extra units
        
$tmppeasants 0;
        
reset($trplst);
        while (list(
$key$val) = each($trplst)) {
            ${
$val} = ceil(($users[peasants]*($config[$val][prod]/100)*$urace[ind]*$config[indc]*(sqrt($users[industry]/$users[land]))* ($users["ind_$val"] / 100)));
            if (
$bufflist[indybuff] == 'recruit') {
                ${
$val} = round(${$val} * $power);
            }
            
$users[$val] += ${$val};
            if (
$bufflist[indybuff] == 'train') {
                
$users[peasants] -= ${$val}*$config[workerconversion]*(1-($power-1))/($config[$val][prod]*$urace[ind]*$config[indc]);
                
$tmppeasants -= ${$val}*$config[workerconversion]*(1-($power-1))/($config[$val][prod]*$urace[ind]*$config[indc]);
            }
            else {
                
$users[peasants] -= ${$val}*$config[workerconversion]/($config[$val][prod]*$urace[ind]*$config[indc]);
                
$tmppeasants -= ${$val}*$config[workerconversion]/($config[$val][prod]*$urace[ind]*$config[indc]); //save this for the status report later
            
}
            
        }
// update products    
        
        // income
        
$income getCashGain($users$urace);
        if((
$urace[ability] == 33) && ($users[abilitytime] > $time)) //commerce
        
{
            
$income round(1.1 $income);
        }
        else if (
$users[clan]) 
        {
                
$iscommerce 0;
                
$clanmem dbquery("SELECT * FROM $playerdb WHERE clan=$users[clan];");
                while (
$cuser mysql_fetch_array($clanmem)) {
                    
$crace loadRace($cuser[race]);
                    if ((
$crace[ability] == 33) && ($cuser[abilitytime] >= $time)) {
                        
$iscommerce 1;
                        break;
                    }
                }
                if (
$iscommerce
                    
$income round(1.04 $income); //ally commerce
        
}
        if (
$bufflist[ecobuff] == 'cashinc')     // buffing income?
            
$income round($income $power);
        
$wartax 0;
        if (
$warflag)      // war tax?
            
$wartax $networth 1000;
        
// expenses
        
$loanpayed round($users[loan] / 200);
        
$expenses getCashLoss($users$urace);
        if (
$bufflist[ecobuff] == 'cashexp'//buffing expenses?
            
$expenses round($expenses * (1-($power-1)));
        
$money $income - ($expenses $loanpayed $wartax);
        
        
//storehouse
        
$storemoney=0;
        if (
$users[clan] && $money 0  && $uclan[members] > 1)
        {
            
$storemoney min($uclan[cash],round(-$money $uclan[storepct]/100));
            
$money += $storemoney;
            
$uclan[cash] -= $storemoney;
        }
        
//storehouse
        
        
        
$cashgained += $money;
        
$users[loan] -= $loanpayed;
        
$users[cash] += $money;
        
        
        
// Food
        
$foodpro getFoodGain($users$urace);
        
$foodcon getFoodLoss($users$urace);
        if((
$urace[ability] == 17) && ($users[abilitytime] > $time)) //rain dance
        
{
            
$foodpro round(1.1 $foodpro);
        }
        else if (
$users[clan]) 
        {
                
$isenriched 0;
                
$clanmem dbquery("SELECT * FROM $playerdb WHERE clan=$users[clan];");
                while (
$cuser mysql_fetch_array($clanmem)) {
                    
$crace loadRace($cuser[race]);
                    if ((
$crace[ability] == 17) && ($cuser[abilitytime] >= $time)) {
                        
$isenriched 1;
                        break;
                    }
                }
                if (
$isenriched
                    
$foodpro round(1.04 $foodpro); //ally rain dance
        
}
        if (
$bufflist[ecobuff] == 'foodinc')     // buff food income?
        
{
            
$foodpro round($power $foodpro);
        }
        if (
$bufflist[ecobuff] == 'foodexp'//buff expenses?
        
{
            
$foodcon round($foodcon * (1-($power-1)));
        }
        
$food $foodpro $foodcon;
        
        
//storehouse
        
$storefood=0;
        if (
$users[clan] && $food && $uclan[members] > 1)
        {
            
$storefood min($uclan[food],round($food * -$uclan[storepct]/100));
            
$food += $storefood;
            
$uclan[food] -= $storefood;
        }
        
//storehouse
        
        
        
$users[food] += $food;
        
$foodgained += $food;
        
// health
        
$maxhealth round(100 - (($users[tax] - 10) / 2));
        if((
$urace[ability] == 15) && ($users[abilitytime] > $time))
            
$maxhealth 100;
        if ((
$users[health] < $maxhealth) && ($users[health] < 100))
            
$users[health]++;
        if ((
$users[health] < 100) && $bufflist[warbuff] == 'heal'){ //buff health
            
if (mt_rand(0,100) < 200*($power-1)) $users[health]++;
        }

// update population
        
$popbase getMaxPopulation($users$urace$uera);
        
$peasants = ($popbase $users[peasants]);
        if (
$peasants >= 0)
                {
                    if (
$bufflist[indybuff] == 'workers') {
                        
$peasmult $power;
                    }
                    else {
                        
$peasmult 1;
                    }
                    
$peasants round($config[wkrjoin]*$urace[workers]*$peasmult*$peasants);
                }
                else
                {
                    if (
$bufflist[indybuff] == 'workers') {
                        
$peasmult 1-($power-1);
                    }
                    else {
                        
$peasmult 1;
                    }
                    
$peasants round($config[wkrleave]*$peasmult*$peasants);
                }
        
$users[peasants] += $peasants;
        
$runes 0;
        if ((
$users[labs] / $users[land]) > .15)
            
$runes mt_rand(round($users[labs] * 1.1), round($users[labs] * 1.5));
        else
            
$runes round($users[labs] * 1.1);
        
$runes round($runes $urace[runes]);
        
$users[runes] += $runes;
        if (
$action == 'runes') {
            
$users[runes] += round($runes 0.25);
            
$runesgained += round($runes 1.25);
        }
        
$wizards 0;
// These values in the midst of adjustment
        
if ($bufflist[warbuff] == 'leaders'){
            
$maxwizards $users[labs]*($config[maxwiz]+$config[buffwiz]);
            
$eqwizards $users[labs]*($config[fullwiz]+$config[buffwiz]);
        }
        else {
            
$maxwizards $users[labs]*$config[maxwiz];
            
$eqwizards $users[labs]*$config[fullwiz];
        }
        if (
$users[wizards] > $maxwizards) {
            
$wizards round($users[wizards] * -0.05);
        }
        elseif (
$users[wizards] <= $maxwizards && $users[wizards] >= $eqwizards) {
            
$wizards 0;
        }
        elseif (
$users[wizards] < $eqwizards) {
            if (
$eqwizards == 0) {
                
$wizards 0;
            }
            else {
                
$wizards min($eqwizards-$users[wizards],($eqwizards $users[wizards])*$config[wizjoin]*(1-$users[wizards]/(2*$eqwizards))*($users[land]/$users[labs]));
            }
        }
        else {
            
$wizards 0;
        }
        
$users[wizards] += $wizards;
        if (
$wizards 0) {
            
$tmppeasants -= min($wizards 5$users[peasants]);
            
$users[peasants] -= min($wizards 5$users[peasants]);
        }
        

// print status report
        
$turnoutvars array_merge(array("income""expenses""wartax""loanpayed""money""peasants""tmppeasants""wizards""runes""storemoney""storefood"), $trplst);
        
reset($prdlst);
        while (list(
$key$val) = each($prdlst)) {
            
$turnoutvars[] = $val;
            
$turnoutvars[] = $val "pro";
            
$turnoutvars[] = $val "con";
        }

        for (
$i 0$i count($turnoutvars); $i++) {
            if ((
$condenseoutput == "yes") || ($condenseoutput == "hidden")) {
                
$turnout["$turnoutvars[$i]"] += $ {"$turnoutvars[$i]"};
            } else {
                
$turnout["$turnoutvars[$i]"] = ${"$turnoutvars[$i]"};
            }
        }
        if ((
$condenseoutput != "yes") && ($condenseoutput != "hidden"))
            
printTurnTable($turnout);
        else
            
$turnout[turnsinside]++;

        
$users[turnsused]++;
        
$users[turns]--;
// ran out of money/food? lose 3% of all units
        
$goneout = array();
        
$withdraw = array();
        
reset($prdlst);
        while (list(
$key$val) = each($prdlst)) {
            if (
$users[$val] < 0) {
                
$goneout[] = $uera[$val];
                
$users[$val] = 0;
            }
        }
        if (
$users[cash] < 0) {
            if (
$users[savings] >= -1*$users[cash]){
                
$users[savings] += $users[cash];
                
$users[cash] = 0;
                
$withdraw[] = $cterms[cash];
            }
            else if (
$users[loan] < getMaxSave($users)/$users[cash]){
                
$users[loan] -= $users[cash];
                
$users[cash] = 0;
                
$withdraw[] = $cterms[cash];
            }
            else{
                
$goneout[] = $cterms[cash];
                
$users[cash] = 0;
            }
        }
        if (
count($goneout) > 0) {
            
$users[peasants] = round($users[peasants] * .97);
            
reset($trplst);
            while (list(
$key$val) = each($trplst))
                
$users[$val] = round($users[$val] * .97);
            
$users[wizards] = round($users[wizards] * .97);
            if (
$users[food] < 0)
                
$users[food] = 0;
            if (
$users[cash] < 0)
                
$users[cash] = 0;
?><span class="cbad">Due to lack of <?= implode(" and "$goneout?>, 3% of your <?= $cterms[army?> has left!<?
            
if ($nonstop) {
?></span><br><?
            
} else {
?> <?= $cterms[turns?> were stopped!</span><br><?
                
break;
            }
        }
        elseif(
count($withdraw) > 0) {
?><span class="cbad">You rush to Cluny's hut to secure funds...<?
            
if ($nonstop) {
?></span><br><?
            
} else {
?> <?= $cterms[turns?> were stopped!</span><br><?
                
break;
            }
        }

        if ((
$netincomeneg == "yes") && ($nonstop == 0) && ($money 0))
            break;
        if ((
$netfoodneg == "yes") && ($nonstop == 0) && ($food 0))
            break;
        if ((
$netleaderneg == "yes") && ($nonstop == 0) && ($wizards <= 0))
            break;
        if ((
$networkerneg == "yes") && ($nonstop == 0) && ($peasants 0))
            break;
    }

    if ((
$netincomeneg == "yes") && ($action == 'magic') && ($money 0))
        return 
true;
    if ((
$netfoodneg == "yes") && ($action == 'magic') && ($food 0))
        return 
true;
    if ((
$netleaderneg == "yes") && ($action == 'magic') && ($wizards <= 0))
        return 
true;
    if ((
$networkerneg == "yes") && ($action == 'magic') && ($peasants 0))
        return 
true;

    if (
$condenseoutput == "yes")
        
printTurnTable($turnout);
    
$users[idle] = $time;
    
reset($tplst);
    
saveUserDataNet($users"networth land freeland savings loan cash " implode(" "$tplst) . " health peasants runes wizards turnsused turns idle");
    
//storehouse
    
if ($users[clan]){
        
saveClanData($uclan"cash food armtrp lndtrp flytrp seatrp");
    }
    
//storehouse
    
$urace[ind] /= $uera["t_ind"];
    
$urace[runes] /= $uera["t_rune"];
    if (
$users[health] == $maxhealth && $users[health] < 100){
    
?><span class="cwarn">Your high tax rate is restricting your health! Use the heal buff to heal fully!<??></span><br><?
    
}
    return 
$taken;
}




function 
takeAutoScoutTurns($numturns$action$users) {
    global 
$config$cterms$trplst$prdlst$tplst$time$turnout;
    global 
$landgained$cashgained$foodgained;

    
$uera loadEra($users[era]);
    
$urace loadRace($users[race]);

    if (
$users[health] > 100)
        
$users[health] = 100;

    
$urace[ind] *= $uera["t_ind"];
    
$urace[runes] *= $uera["t_rune"];

    if (
$numturns $users[turns])
        
TheEnd('<span class="cbad">FATAL ERROR</span>: attempted to use more $cterms[turns] than available!</span>');

    if ((
$action == 'cash') || ($action == 'land') || ($action == 'farm') || ($action == 'runes'))// || ($action == 'magic')) // Actions which can be aborted
        
$nonstop 0;
    else
        
$nonstop 1;

    if (
$turnout == "") {
        
$turnout = array();
        
$turnout[turnsinside] = 0;
    }
    
$taken 0;
    while (
$taken $numturns) {     // use up specified number of turns
        
$taken++;
        
$users[networth] = getNetworth($users);
        if (
$action == 'land') {     // exploring?
            
$tmp gimmeLand($users[land], $urace[expl], $uera["t_land"]);
            
$users[land] += $tmp;
            
$users[freeland] += $tmp;
            
$landgained += $tmp;
        }
        
$size calcSizeBonus($users[networth]);  // size bonus/penalty
// income
        
$income round(((pci($users$urace) * ($users[tax] / 100) * ($users[health] / 100) * $users[peasants]) + ($users[shops] * 500)) / $size);
        if (
$action == 'cash')     // cashing?
            
$income round($income 1.25);
        
$wartax 0;
        if (
$warflag)      // war tax?
            
$wartax $networth 1000;
// expenses
        
$loanpayed round($users[loan] / 200);
        
$expenses = ($users[land] * 8) + ($users[wizards] * .5) + ($users[cities] * 750000);
        
reset($trplst);
        while (list(
$key$val) = each($trplst))
            
$expenses += $users[$val] * $config[$val][cost][cash];
        
$expenses round($expenses);
        
$expbonus round($expenses * ($urace[costs] - (($users[barracks] + ($users[cities] * 500)) / $users[land])));
        if (
$expbonus $expenses 2)    // expenses bonus limit
            
$expbonus round($expenses 2);
        
$expenses -= $expbonus;
        
$money $income - ($expenses $loanpayed $wartax);
        
$cashgained += $money;
        
$users[loan] -= $loanpayed;
        
$users[cash] += $money;

// update products
        // Food
        
$foodpro round(($users[freeland] * 5) + ($users[farms] * 75) * $urace[farms]);
        
$foodcon = ($users[peasants] * .01) + ($users[wizards] * .25);
        
reset($trplst);
        while (list(
$key$val) = each($trplst))
            
$foodcon += $users[$val] * $config[$val][cost][food];
        
$foodcon *= $urace[food];
        
$foodcon round($foodcon);
        if (
$action == 'farm')     // farming?
            
$foodpro round(1.25 $foodpro);
        
$food $foodpro $foodcon;
        
$users[food] += $food;
        
$foodgained += $food;

// health
        
if (($users[health] < 100 - (($users[tax] - 10) / 2)) && ($users[health] < 100))
            
$users[health]++;

// update population
        
$popbase getMaxPopulation($users$urace$uera);

        
$peasants = ($popbase $users[peasants]);
        if (
$peasants 0)
                {
                         
$peasmult 1;
                         
$peasants round($config[wkrjoin]*$urace[workers]*$peasants);
                }
                else
                {
                        
$peasmult 1;
                        
$peasants round($config[wkrleave]*$peasants);
                }
        
//$peasants = round($peasants * $peasmult);
        //if (($action == "cash") || ($action == "farm"))
        //    $peasants -= abs(floor($users[peasants]/40000));
        //else if ($action == "runes")
        //    $peasants += abs(floor($users[peasants]/40000));
        
$users[peasants] += $peasants;

        
$users[turnsused]++;
        
$users[turns]--;
    }

    
$users[idle] = $time;
    
reset($tplst);
    
saveUserDataNet($users"networth land freeland savings loan cash " implode(" "$tplst) . " health peasants runes wizards turnsused turns idle");
    
$urace[ind] /= $uera["t_ind"];
    
$urace[runes] /= $uera["t_rune"];
    return 
$taken;
}

// prepare message to be inserted in the database
function prepareMessage($msg)
{
    
swearCheck($msg);
    
$msg trim($msg);
    
$msg htmlspecialchars(strip_tags($msg)); // dont allow HTML tags
    
$msg formatBBcode($msg);
    
$msg addslashes($msg);

    return 
$msg;
}

function 
getAttackStatus($users$enemy$mclan$pclan)
{
    global 
$config$theme;

    
$attacks_left = ($theme[attack_limit] + 1) - $enemy[attacks];

    
$attackText "<span class=\"cgood\">$attacks_left attacks left</span>";
    
//if (($users[clan] > 0) && ($enemy[clan] > 0) && (($mclan[war1] == $pclan[clan]) || ($mclan[war2] == $pclan[clan]) || ($mclan[war3] == $pclan[clan])))
    //    $attackText = "<span class=\"cgood\">Unlimited</span>";
    
if ($enemy[turnsused] <= $config[protection])
        
$attackText "<span class=\"cbad\">Protection</span>";
    if (
$enemy[vacation] > $config[vacationdelay])
        
$attackText "<span class=\"cbad\">Vacation</span>";
    if (
$enemy[attacks] > $theme[attack_limit])
        
$attackText "<span class=\"cbad\">Maxed</span>";
    if ((
$enemy[era] != $users[era]) && ($users[gate] <= time()) && ($enemy[gate] <= time()))
        
$attackText "<span class=\"cbad\">No Raiders</span>";
    if ((
$users[clan] > 0) && ($enemy[clan] > 0) && ($enemy[clan] == $users[clan]))
        
$attackText "<span class=\"cbad\">Clanmate</span>";
    
//if (($users[clan] > 0) && ($enemy[clan] > 0) && (($mclan[ally1] == $pclan[clan]) || ($mclan[ally2] == $pclan[clan]) || ($mclan[ally3] == $pclan[clan])))
    //    $attackText = "<span class=\"cbad\">Allied</span>";
    
if ($enemy[networth] > $users[networth] * 20)
        
$attackText "<span class=\"cbad\">Too Big</span>";
    if (
$users[networth] > $enemy[networth] * 20)
        
$attackText "<span class=\"cbad\">Too Small</span>";
    if (
$enemy[land] == 0)
        
$attackText "<span class=\"cbad\">Dead</span>";
    if (
$enemy[disabled] == 2)
        
$attackText "<span class=\"cbad\">Admin</span>";
    if (
$enemy[disabled] > 2)
        
$attackText "<span class=\"cwarning\">Disabled</span>";
    if (
$enemy[num] == $users[num])
        
$attackText "Yourself";

        return 
$attackText;
}



// returns the requested networth
function getNetworth(&$user) {
    global 
$config$tplst$marketdb$trplst;
    
$networth = ($user[wizards] * 2) + ($user[peasants] * 3) + (($user[cash] + $user[savings]/$user[loan] * 2) / ($config[armtrp][market])) + ($user[land] * 500) + ($user[freeland] * 100) + ($user[cities] * 750000);
    
$market_goods dbquery("SELECT type, seller, amount FROM $marketdb WHERE seller=$user[num];");
    while (
$market mysql_fetch_array($market_goods)) {
        
// the following line adds market networth to user networth
        //$networth += $market[amount] * ($config[$market[type]][market] / $config[armtrp][market]);
    
}
    
reset($trplst);
    while (list(
$key$val) = each($trplst))
        
$networth += $user[$val] * ($config[$val][market] / $config[armtrp][market]);
    
$networth += $user[food] * ($config[food][market] / ($config[armtrp][market]));
    return 
max(floor($networth), 1);
}

function 
getCloakedNetworth($user) {
    
$fakenw $user['networth'];
    for (
$i 0$i $user['ability']; $i++)
        
$fakenw -= ( $fakenw 0.01);
    return 
$fakenw;
}

function 
updateRankings() {
    global 
$playerdb;

    
$users2 dbquery("SELECT disabled, networth, num, rank, ability, abilitytime FROM $playerdb ORDER BY disabled ASC, networth DESC;");

    
$data = array();
    while (
$user mysql_fetch_assoc($users2)) {
        if (
$user['ability'] > 0) {
            
$user['networth'] = round(getCloakedNetworth($user), 0);
        }
        
$data[] = $user;
    }

    
usort($data'mysort');

    
$urank 0;
    foreach (
$data as $user) {
        
$urank++;
        if (
$urank != $user[rank])
            
dbquery("UPDATE $playerdb SET rank=$urank WHERE num=$user[num];");
    }
}

function 
updateNetworths() {
    global 
$playerdb;

    
$userlist dbquery("SELECT * FROM $playerdb;");
    while (
$user mysql_fetch_array($userlist))
        
dbquery("UPDATE $playerdb SET networth=" getNetworth($user) . " WHERE num=$user[num];");
}

// loads the theme admin options
function loadaTheme() {
    global 
$themedb;

    return 
mysql_fetch_array(dbquery("SELECT * FROM $themedb;"));
}

function 
findTheme($arg) {
    global 
$users$styles;

    foreach (
$styles as $key => $val) {
        if (
$arg == $val)
            return 
$key;
    }

    return 
0;
}

// loads the information for the specified user number
function loadUser($num) {
    global 
$playerdb;
    return 
mysql_fetch_array(dbquery("SELECT * FROM $playerdb WHERE num=$num;"));
}

// loads the information for the specified race number
function loadRace($race) {
    global 
$racedb;
    return 
mysql_fetch_array(dbquery("SELECT * FROM $racedb WHERE id=$race;"));
}

// loads the information for the specified era number
function loadEra($era) {
    global 
$eradb;
    
$mera mysql_fetch_array(dbquery("SELECT * FROM $eradb WHERE id=$era;"));
    if (
$mera[id] == "") { // burrowed, perhaps?
        
$mera mysql_fetch_array(dbquery("SELECT * FROM $eradb WHERE id=" . ($era mysql_num_rows(dbquery("SELECT id FROM $eradb;"))) . ";"));
        
$mera[id] = $era;
        
$mera[name] = "Burrowed " $mera[name];
    }
    return 
$mera;
}

// loads the information for the specified clan number
function loadClan($num) {
    global 
$clandb$cterms;
    if (
$clan dbquery("SELECT * FROM $clandb WHERE num=$num;"))
        return 
mysql_fetch_array($clan);
    else
        
theEnd("The specified $cterms[clan] number could not be found.");
}

// Loads all clan tags into an associative array
function loadClanTags() {
    global 
$clandb;
    
$clans dbquery("SELECT num,tag FROM $clandb;");
    while (
$clan mysql_fetch_array($clans))
        
$ctags["$clan[num]"] = $clan[tag];
    
$ctags["0"] = "<span></span>";
    return 
$ctags;
}

// Loads all race names into an associative array, intended for the scorelists
function loadRaceTags() {
    global 
$racedb;
    
$races dbquery("SELECT id,name FROM $racedb;");
    while (
$race mysql_fetch_array($races))
        
$rtags["$race[id]"] = $race[name];
    return 
$rtags;
}

// Loads all era names, intended for the scorelists
function loadEraTags() {
    global 
$eradb;
    
$eras dbquery("SELECT id,name FROM $eradb;");
    
$neras mysql_num_rows($eras);
    while (
$era mysql_fetch_array($eras)) {
        
$etags["$era[id]"] = $era[name];
    }
    return 
$etags;
}

// Example: saveUserData($users,"cash networth armtrp lndtrp flytrp seatrp etc");
function saveUserData(&$user$data) {
    global 
$playerdb$lockdb$admin;
    if (
$lockdb)
        return;
    
$items explode(" "$data);
    
$update "";
    
$i 0;
    while (
$tmp $items[$i++]) {
        
$data $user[$tmp];
        if (
is_numeric($data))
            
$update .= "$tmp=$data";
        else {
            
$data mysql_real_escape_string($data);
            
$update .= "$tmp=\"$data\"";
        }
        if (
$items[$i])
            
$update .= ", ";
    }
    if (!
dbquery("UPDATE $playerdb SET $update WHERE num=$user[num];"))
        
theEnd("FATAL ERROR: Failed to update player data $update for user #$user[num]!<!--prob1--><BR>\n" . (($admin) ? "<BR>" mysql_error() : "If this problem persists, please contact the administrator."));
}

// Saves data for a particular user, updating their networth in the process
// MUST specify "networth" among the fields to save!
// Example: saveUserDataNet($users,"networth cash armtrp lndtrp flytrp seatrp etc");
function saveUserDataNet(&$user$data) {
    
$user[networth] = getNetworth($user);
    return 
saveUserData($user$data);
}

// Example: saveClanData($uclan,"name motd ally1 war3");
function saveClanData(&$clan$data) {
    global 
$clandb$lockdb$cterms;
    if (
$lockdb)
        return;
    
$items explode(" "$data);
    
$update "";
    
$i 0;
    while (
$tmp $items[$i++]) {
        
$data $clan[$tmp];
        if (
is_numeric($data))
            
$update .= "$tmp=$data";
        else {
            
$data mysql_real_escape_string($data);
            
//sqlQuotes($clan[$tmp]);
            
$update .= "$tmp=\"$data\"";
        }
        if (
$items[$i])
            
$update .= ",";
    }
    if (!
dbquery("update $clandb set $update where num=$clan[num];"))
        print 
"FATAL ERROR: Failed to update $cterms[clan] data $update for clan #$clan[num]!<BR>\n";
}

function 
getPlayerNumber($name) {
    global 
$playerdb;
    
$name stripslashes($name);
    if (
is_numeric($name)) {
        return 
$name;
    } else if (
substr($name01) == "#") {
        return 
getPlayerNumber(substr($name1));
    } else if (
$name == "") {
        
theEnd("You must enter a name to search for a player.");
    } else {
        
$name mysql_real_escape_string($name);
        
$get dbquery("SELECT num, empire FROM $playerdb WHERE empire LIKE \"$name%\";");
        
$dup 0;
        
$found false;
        
$players "";
        while (
$ge mysql_fetch_array($get)) {
            
$returnval $ge[num];
            
$found true;
            
$dup++;
            
$players .= "\n    <li>$ge[empire]</li>";
        }
        if (!
$found)
            
theEnd("No player was found to match that name ($name)");
        if (
$dup == 1) {
            return 
$returnval;
        } else {
            
theEnd("Multiple players have that name ($name)!<BR><b>Players with that name:</b><ul>$players\n</ul>");
        }
    }
}

function 
getClanNum() {
    global 
$users$clandb$theme;

    
$clanmem loadClanMems();

    
$min mysql_fetch_array(dbquery("SELECT min(members) as min_c FROM $clandb;"));
    
$clan_selects dbquery("SELECT num,name FROM $clandb where members=$min[min_c];");
    
$clanmem = array();
    
$i 1;
    while (
$clan mysql_fetch_array($clan_selects)) {
        
$clanmem[$i] = $clan[num];
        
$i++;
    }

    
$rand_v mt_rand(1$i-1);
    
$clan_v $clanmem[$rand_v];
    if(
$clan_v && $clan_v 5)
        
dbquery("UPDATE $clandb SET members=members+1 where num=$clan_v;");
    return 
$clan_v;
}

function 
addNews($event$src$dest$data) {
    global 
$newsdb$time$lockdb$admin;
    if (
$lockdb)
        return;
    if (
is_array($data)) {
        
$dato = array();
        while (list(
$key$val) = each($data))
            
$dato[count($dato)] = "$key:$val";
        
$data implode(";"$dato);
    }

    
dbquery("INSERT INTO $newsdb (time,num_s,clan_s,num_d,clan_d,event,data) VALUES ($time,$src[num],$src[clan],$dest[num],$dest[clan],$event,\"$data\");");
}

function 
addNewsLand($event$src$dest$land$data) {
    global 
$newsdb$time$lockdb;
    if (
$lockdb)
        return;
    if (
$data == "0")
        
$data "";
    if (
is_array($data)) {
        
$dato = array();
        while (list(
$key$val) = each($data))
            
$dato[count($dato)] = "$key:$val";
        
$data implode(";"$dato);
    }

    
dbquery("INSERT INTO $newsdb (time,num_s,clan_s,num_d,clan_d,event,acres,data) VALUES ($time,$src[num],$src[clan],$dest[num],$dest[clan],$event,$land,\"$data\");");
}

function 
addNewsTowers($event$src$dest$towerloss$data) { //PILLAGE KLUDGE
    
global $newsdb$time$lockdb;
    if (
$lockdb)
        return;
    if (
$data == "0")
        
$data "";
    if (
is_array($data)) {
        
$dato = array();
        while (list(
$key$val) = each($data))
            
$dato[count($dato)] = "$key:$val";
        
$data implode(";"$dato);
    }

    
dbquery("INSERT INTO $newsdb (time,num_s,clan_s,num_d,clan_d,event,destroyed_towers,data) VALUES ($time,$src[num],$src[clan],$dest[num],$dest[clan],$event,$towerloss,\"$data\");");
}


function 
getSalePrice($type) {
    global 
$config;
    if (
$type == food){
        return 
$config[$type][market] * .50;}
    else{
        return 
$config[$type][market] * .16;}
}

function 
getAverageActiveLand(){
    global 
$playerdb;
    
$land sqleval("SELECT SUM(land) FROM $playerdb WHERE disabled=0 AND vacation=0 AND land>0;");
    
$players sqleval("SELECT COUNT(*) FROM $playerdb WHERE disabled=0 AND vacation=0 AND land>0;");
    if(
$players 0){
        return 
$land/$players;
    }
    else{
        return 
0;
    }
}

function 
getMaxSave($users)
{
    return 
round(1800000*$users[networth] * ($users[shops] / $users[land]) / (sqrt(500000000+$users[networth])))-1;
}

function 
getMaxStore($uclan){
    global 
$playerdb$users;
    
$storemax=0;
    
$allusers dbquery("SELECT networth,shops,land FROM $playerdb WHERE clan=$users[clan] AND disabled=0 AND vacation=0 AND land>0;");
    
$numactive sqleval("SELECT COUNT(*) FROM $playerdb WHERE clan=$users[clan] AND disabled=0 AND vacation=0 AND land>0;");
    while (
$clanmate mysql_fetch_array($allusers)){
        
$storemax += getMaxSave($clanmate);
    }
    if (
$numactive 2) return 0;
    else return 
$storemax;
}

function 
getActiveClanMembers($uclan){
    global 
$playerdb$users;
    
$active sqleval("SELECT COUNT(*) FROM $playerdb WHERE clan=$users[clan] AND disabled=0 AND vacation=0 AND land>0;");
    return 
$active;
}

function 
getFoodGain($users$urace) {
    
$size calcSizeBonus($users[networth]);
    
$foodpro round((($users[foodpct]/100) * ($users[peasants]*(2.67*(1+$users[farms]/(2*$users[land]))) * ($users[health]/100) * ($users[tax]/100)) + (($users[freeland] * 10) + ($users[farms] * 33))) * $urace[farms] /$size);
    return 
$foodpro;
}

function 
getFoodLoss($users$urace) {
    global 
$config$trplst;

    
$foodcon = (($users[peasants] * .05) + ($users[wizards] * .25))*(1+$users[cashpct]/100);
    
reset($trplst);
    while (list(
$key$val) = each($trplst))
        
$foodcon += $users[$val] * $config[$val][cost][food];
    
$foodcon *= $urace[food];
    
$foodcon round($foodcon $config[foodmult]);
    return 
$foodcon;
}

function 
getCashGain($users$urace) {
    
$size calcSizeBonus($users[networth]);
    
$income round((($users[cashpct]/100) * ((pci($users$urace) * ($users[tax] / 100) * ($users[health]/100) * $users[peasants])) + ($users[shops] * 475 $urace[pci])) / $size);
    return 
$income;
}

function 
getCashLoss($users$urace) {
    global 
$config$trplst;
    
$expenses = ($users[land] * 8) + ($users[wizards] * 1.0) + ($users[cities] * 750000);
    
reset($trplst);
    while (list(
$key$val) = each($trplst)){
        
$expenses += $users[$val] * $config[$val][cost][cash];
        
$test $config[$val][cost][cash];
    }
    
$expenses round($expenses);
    
$expbonus = ($urace[costs] - (($users[barracks] + $users[industry]/3.5 + ($users[cities] * 500)) / $users[land]));
    if (
$expbonus 0.65)    // expenses bonus limit
        
$expbonus 0.65;
    
$expenses round($expenses $expbonus $config[cashmult]);

    return 
$expenses;
}

//calculate buff costs
function getBuffCost($buff$users) {
    global 
$config;
    
$basecost $users[land] * $config[buffcostmult] + 100;
    if (
$buff == ecobuff) {
        return 
$basecost * (+ ($users[shops]+$users[homes]+$users[cities]*1500+$users[barracks]+$users[cities]*500+$users[farms])/$users[land]);
    }
    else if (
$buff == indybuff) {
        return 
$basecost * (+ ($users[industry]+$users[homes]+$users[cities]*1500+$users[barracks]+$users[cities]*500)/$users[land]);
    }
    else if (
$buff == warbuff) {
        return 
$basecost * ($users[labs]/$users[land]);
    }
    else {
        return 
0;
    }
}

function 
getAttackBuffCost($act$users$urace) {
    global 
$config;
    
$basecost $users[labs] * $config[buffcostmult] + 100;
    if (
$act == offense) {
        
$basecost *= $config[offensecost];
    }
    else if (
$act == murder) {
        
$basecost *= $config[murdercost];
    }
    else if (
$act == sabotage) {
        
$basecost *= $config[sabotagecost];
    }
    else if (
$act == pillage) {
        
$basecost *= $config[pillagecost];
    }
    else if (
$act == enslave) {
        
$basecost *= $config[enslavecost];
    }
    else {
        
$basecost 0;
    }
    
$basecost *= $urace[magic]*($users[labs]/(100*$users[land]));
    return 
$basecost;
}

function 
getWizardPower($users$urace) {
    return 
1+$users[wizards]*sqrt(min((1+$users[wizards]/(100*$users[land])),1.75)*$urace[magic])*$users[health]/100;
}

function 
getBuffPower($users$urace) {
    global 
$config;
    return 
min(1.21+$users[wizards]/(100*$users[land])) + min(1$users[wizards]/(20*$users[land]))*(0.07854 0.04 atan(15 * ($urace[magic]-1)));//return max($config[minbuff],min($config[maxbuff]*sqrt($urace[magic]),(1+$users[wizards]/(100*$users[land]))*sqrt($urace[magic])));
}

function 
getMaxPopulation($users$urace$uera) {
    global 
$config;
    return 
round(($users[shops]*$config[wkrshops] + ($users[homes]+$users[cities]*1500)*$config[wkrhomes] + $users[industry]*$config[wkrindustry] + ($users[barracks]+$users[cities]*500)*$config[wkrbarracks] + $users[labs]*$config[wkrlabs] + $users[farms]*$config[wkrfarms] + $users[towers]*$config[wkrtowers] + $users[freeland]*$config[wkrfree])*exp(-($users[tax]-10)*($users[tax]-10)/(50*50))*$uera["t_peasants"]);
}

//get the defense points from towers for various attack types
function getTowerDefense($type$defender$dera$drace) {
    global 
$config;
    
$tdefense $defender[towers] * $config[towerdp] * min(1$defender[armtrp] / ($config[towerarmtrp] * $defender[towers] + 1));
    switch (
$type) {
        case 
'armtrp':
            
$armdef $defender[armtrp] * $dera[d_armtrp] * $drace[defense] * $defender[health]/100;
            
$tdefense min($tdefense + ($defender[health]/100)*$drace[defense]*($config[towershare]*sqrt($defender[towers]/(10*$defender[land])))*($defender[lndtrp]*$dera[d_lndtrp] + $defender[flytrp]*$dera[d_flytrp] + $defender[seatrp]*$dera[d_seatrp])/($dera[d_armtrp]+$config[armtrp][prod]),$armdef);
            break;
        case 
'lndtrp':
            
$lnddef $defender[lndtrp] * $dera[d_lndtrp] * $drace[defense] * $defender[health]/100;
            
$tdefense min($tdefense + ($defender[health]/100)*$drace[defense]*($config[towershare]*sqrt($defender[towers]/(10*$defender[land])))*($defender[armtrp]*$dera[d_armtrp] + $defender[flytrp]*$dera[d_flytrp] + $defender[seatrp]*$dera[d_seatrp])/($dera[d_lndtrp]+$config[lndtrp][prod]),$lnddef);
            break;
        case 
'flytrp':
            
$flydef $defender[flytrp] * $dera[d_flytrp] * $drace[defense] * $defender[health]/100;
            
$tdefense min($tdefense + ($defender[health]/100)*$drace[defense]*($config[towershare]*sqrt($defender[towers]/(10*$defender[land])))*($defender[armtrp]*$dera[d_armtrp] + $defender[lndtrp]*$dera[d_lndtrp] + $defender[seatrp]*$dera[d_seatrp])/($dera[d_flytrp]+$config[flytrp][prod]),$flydef);
            break;
        case 
'seatrp':
            
$seadef $defender[seatrp] * $dera[d_seatrp] * $drace[defense] * $defender[health]/100;
            
$tdefense min($tdefense + ($defender[health]/100)*$drace[defense]*($config[towershare]*sqrt($defender[towers]/(10*$defender[land])))*($defender[armtrp]*$dera[d_armtrp] + $defender[lndtrp]*$dera[d_lndtrp] + $defender[flytrp]*$dera[d_flytrp])/($dera[d_seatrp]+$config[seatrp][prod]),$seadef);
            break;
    }
    return 
$tdefense;
 }

// code executed during a reset
function executeReset($eraname) {
    global 
$marketstatsdb$marketdb$newsdb$messagedb$clandb$clanmsg$lotterydb$config$playerdb$espydb$trplst$botdb;
    
// TRUNCATE

    
$num_admins 3;

    
mquery("TRUNCATE $marketdb;");
    
mquery("TRUNCATE $newsdb;");
    
mquery("TRUNCATE $messagedb;");
    
mquery("TRUNCATE $clandb;");
    
mquery("TRUNCATE $clanmsg;");
    
mquery("TRUNCATE $lotterydb;");
    
mquery("TRUNCATE $espydb;");
    
mquery("TRUNCATE $botdb;");
    
mquery("DELETE FROM aalsob WHERE server = \"$config[server]\";");

    
$legends dbquery("SELECT name, IP, REALIP, email, empire, num, land, networth FROM $playerdb WHERE rank <= 40 AND land > 0 AND disabled = 0 ORDER BY rank DESC;");
    while (
$legend mysql_fetch_array($legends)) {
        
mquery("INSERT INTO legends VALUES (\"$legend[name]\",\"$legend[IP]\",\"$legend[REALIP]\",\"$legend[email]\",\"$legend[empire]\",$legend[num],$legend[land],$legend[networth],\"$eraname\");");
    }

    
mquery("UPDATE servers SET news = \"The Server Was Reset\", turns = 0 WHERE name = \"$config[server]\";");
    
mquery("DELETE FROM $playerdb WHERE num > " $num_admins ";");
    
mquery("ALTER TABLE `$playerdb` PACK_KEYS = 0 CHECKSUM = 0 DELAY_KEY_WRITE = 0 AUTO_INCREMENT = 4;");
    
mquery("INSERT INTO $lotterydb\n    ( num, ticket, cash     ) VALUES\n    ( 0  , 0     , 100000000),    #current jackpot\n    ( 0  , 1     , 100000000),    #last jackpot\n    ( 0  , 2     , 0        ),\n    ( 0  , 3     , 0        ),\n    ( 0  , 4     , 0        );");
    
dbquery("UPDATE $marketstatsdb SET totalsold=0;"); //MARKET NET
    
dbquery("UPDATE $marketstatsdb SET totalspent=0;"); //MARKET NET
    
reset($trplst);
    while (list(
$key$val) = each($trplst)) {
        
$tmp $config[$val][net];
        
dbquery("UPDATE $marketstatsdb SET marketval=$tmp WHERE type='$val';");
    }
    
$tmp $config[food][net];
    
dbquery("UPDATE $marketstatsdb SET marketval=$tmp WHERE type='food';");
}

function 
compileEspyStats($enemy) {

    
$e $enemy;

    
$data = array();
    
$data[turns] = $e[turns];
    
$data[turnsstored] = $e[turnsstored];
    
$data[rank] = $e[rank];
    
$data[peasants] = $e[peasants];
    
$data[land] = $e[land];
    
$data[cash] = $e[cash];
    
$data[food] = $e[food];
    
$data[runes] = $e[runes];
    
$data[networth] = $e[networth];
    
$data[era] = $e[era];
    
$data[race] = $e[race];
    
$data[health] = $e[health];
    
$data[tax] = $e[tax];
    
$data[armtrp] = $e[armtrp];
    
$data[lndtrp] = $e[lndtrp];
    
$data[flytrp] = $e[flytrp];
    
$data[seatrp] = $e[seatrp];
    
$data[wizards] = $e[wizards];

    if (
is_array($data)) {
        
$dato = array();
        while (list(
$key$val) = each($data))
            
$dato[count($dato)] = "$key:$val";
        
$data implode(";"$dato);
    }

    return 
$data;
}

function 
getTimeString($total) {
    if (empty(
$total)) {
        return 
"No time provided";
    }

    
$seconds_day 86400// number of seconds in a day

    
$days floor($total $seconds_day);
    
$leftover $total $seconds_day;

    
$hours round(($leftover 60) / 601);

    if (
$hours == 24)
    {
        
$hours 0;
    }

    
$timeString "";
    
$dayString "day";
    
$hourString "hour";

    if (
$days != 1)
        
$dayString .= "s";
    if (
$hours != 1)
        
$hourString .= "s";

    if ((
$days != 0) && ($hours != 0)) {
        
$timeString $days " " $dayString " and " $hours " " $hourString;
    } else if (
$days != 0)
        
$timeString $days " " $dayString;
    else if (
$hours != 0)
        
$timeString $hours " " $hourString;


    return 
$timeString;
}

function 
numNewMessages() {
    global 
$messagedb$users;
    return 
sqleval("SELECT COUNT(*) FROM $messagedb WHERE dest=$users[num] AND time>$users[msgtime] AND deleted=0;");
}

function 
numTotalMessages() {
    global 
$messagedb$users;
    return 
sqleval("SELECT COUNT(*) FROM $messagedb WHERE dest=$users[num] AND deleted=0;");
}

function 
numClanPosts() {
    global 
$uclan$users$clanmsg;
    return 
sqleval("SELECT COUNT(*) from $clanmsg WHERE clan=$users[clan];");
}

function 
loadClanMems() {
    global 
$clandb;
    
$clans dbquery("SELECT num,members FROM $clandb;");
    while (
$clan mysql_fetch_array($clans))
        
$ctags["$clan[num]"] = $clan[members];
    
$ctags["0"] = "None";
    return 
$ctags;
}

function 
getTotalLand($user) {
    return 
$user['freeland'] + $user['shops'] + $user['home'] + $user['industry'] + $user['barracks'] + $user['labs'] + $user['farms'] + $user['towers'];
}

// function to return amount of land
function gimmeLand($currland$bonus$era) {
    
$gimmelandceil ceil((/ ($currland .00022 .25)) * 20 $bonus $era);
    if (
$gimmelandceil <= 80)
        return 
$gimmelandceil;
    else
        return 
80;
}

function 
calcSizeBonus($networth) {
    if (
$networth <= 100000)
        
$size 0.524;
    elseif (
$networth <= 500000)
        
$size 0.887;
    elseif (
$networth <= 1000000)
        
$size 1.145;
    elseif (
$networth <= 10000000)
        
$size 1.294;
    elseif (
$networth <= 100000000)
        
$size 1.454;
    else
        
$size 1.674;
    return 
$size;
}

/* -------------------------------------------------
  Utility Functions
  ---------------------------------------------------- */

// evaluate an SQL query, return first cell of first row
// useful for "SELECT count(*) ..." queries
function sqleval($query) {
    
$data mysql_fetch_row(dbquery($query));
    return 
$data[0];
}

function 
getNextInc($table) {
    
$status dbquery("SHOW TABLE STATUS LIKE '$table';");
    
$res mysql_fetch_assoc($status);
    return 
$res['Auto_increment'];
}

// adds commas to a number
function commas($str) {
    return 
number_format($str0"."",");
}

// randomize the mt_rand() function
function randomize() {
    
mt_srand((double) microtime() * 1000000);
}

// replace ' with '' to avoid malformed SQL queries '
function sqlQuotes(&$str) {
    
$str str_replace("'""''"stripslashes($str));
}

// remove commas, make integer
function fixInputNum(&$num) {
    
$num str_replace(","""$num);
    if (
ereg("k\$"$num))
        
$num round(substr($num0, -1)) * 1000;
    else if (
ereg("mil\$"$num))
        
$num round(substr($num0, -3)) * 1000000;
    else if (
ereg("bil\$"$num))
        
$num round(substr($num0, -3)) * 1000000000;
    else if (
ereg("tril\$"$num))
        
$num round(substr($num0, -3)) * 1000000000000;
    
$num round($num);
    
$num round(abs($num));
}

// pluralize a string
function plural($num$plur$sing) {
    if (
$num != 1)
        return 
$plur;
    else
        return 
$sing;
}

// prints a number, colored according to its positivity/negativity.
// Set nosign=1 to omit the +/-
function printCNum($amt$prefix$nosign) {
    
$pos "+";
    
$neg "-";
    if (
$nosign)
        
$neg $pos "";
    
$color "cneutral";
    if(
$amt 0$color "cbad";
    if(
$amt 0$color "cgood";
?>
<span class=<?=$color?>>
    <? if($amt 0) print $neg.$prefix;
        if(
$amt 0) print $pos.$prefix;
    
?><?=commas(abs($amt))?></span><?
  
}

  function 
pci($user$race) {
      return 
round(38 * ($user[shops] / (2*$user[land])) * $race[pci]);
  }

  function 
formatBBcode($msg) {
      
//BBcode stuff
      
$bbfind = array('/(\[[Bb]\])(.+)(\[\/[Bb]\])/''/(\[[Ii]\])(.+)(\[\/[Ii]\])/''/(\[url=)(.+)(\])(.+)(\[\/url\])/');
      
$bbrplc = array('<b>\\2</b>''<i>\\2</i>''<a href="\\2">\\4</a>');
      
$msg_body preg_replace($bbfind$bbrplc$msg);
      return 
$msg_body;
  }

  function 
swearCheck(&$str) {
      
$str " " $str " ";
      
$original $str;
      
$toreplace = array("fuck""shit"" ass ""dumbass""bastard""fag""a$$""damn""dick""pussy""bitch""wanker""dammit""douche""douchebag");
      
$replacewh = array("[----]""[poo]"" [butt] "" [butt]""[meanie]""[happy]""[butt]""[darn]""[lance]""[female]""[lady]""[gent]""[darnit]""[gent]""[gent]");
      for (
$i 0$i count($toreplace); $i++) {
          
$str str_ireplace($toreplace[$i], "<b>" $replacewh[$i] . "</b>"$str);
      }
      if (
$original != $str)
          print 
"Please do not use swear words anywhere within the game or forums:<br><blockquote>\"$str\"</blockquote>Your message has been filtered.\n";
  }

  function 
ifEq($black$white$print) {
      if (
$black == $white)
          return 
$print;
  }

  function 
mysort($a$b) {
      if (
$a['disabled'] == $b['disabled']) {
          
// sort networth DESC
          
if ($a['networth'] == $b['networth'])
              return 
0;
          return 
$a['networth'] > $b['networth'] ? -1;
      }
      return 
$a['disabled'] < $b['disabled'] ? -1;
  }

// used for resets
  
function mquery($query) {

      
$goon true;
      if (!
$goon) {
          echo 
"<div><tt>$query</tt></div>";
          return;
      }
      if (
mysql_query($query))
          echo 
"<div class=\"cgood\"><b>Success</b>: <tt>$query</tt></div>";
      else {
          echo 
"<div class=\"cbad\"><b>FAILED</b>: <tt>$query</tt></div>";
          
$goon false;
      }
  }

  function 
unFormatCodes($txt) {

      
$txt preg_replace("#<i>(.+?)</i>#is""\[i\]\\1\[/i\]"$txt);
      
$txt preg_replace("#<b>(.+?)</b>#is""\[b\]\\1\[/b\]"$txt);
      
$txt preg_replace("#<s>(.+?)</s>#is""\[s\]\\1\[/s\]"$txt);
      
$txt preg_replace("#<u>(.+?)</u>#is""\[u\]\\1\[/u\]"$txt);

      
$txt preg_replace("#<ul>#""\[LIST\]"$txt);
      
$txt preg_replace("#<li>#""\[*\]"$txt);
      
$txt preg_replace("#</ul>#""\[/LIST\]"$txt);
      
$txt stripslashes($txt);
      return 
$txt;
  }

  function 
formatCodes($txt) {
      
$txt preg_replace("#\[b\](.+?)\[/b\]#is""<b>\\1</b>"$txt);
      
$txt preg_replace("#\[i\](.+?)\[/i\]#is""<i>\\1</i>"$txt);
      
$txt preg_replace("#\[u\](.+?)\[/u\]#is""<u>\\1</u>"$txt);
      
$txt preg_replace("#\[s\](.+?)\[/s\]#is""<s>\\1</s>"$txt);
      
$txt preg_replace("#\[list\]#i""<ul>"$txt);
      
$txt preg_replace("#\[\*\]#""<li>"$txt);
      
$txt preg_replace("#\[/list\]#i""</ul>"$txt);
      return 
$txt;
  }

  function 
glink($glossary) {
      global 
$action$users;
      if (
$users[tips] == 0)
          return 
" <a href=\"lhelp.php?page=$action&glossary=$glossary\" target=\"lhelp\" style=\"font-weight: normal\">(?)</a>";
  }

  function 
power($num$power) {
      
$value 1;
      for (
$i 1$i <= $power$i++)
          
$value *= $num;
  }
?>