<?php
/*
//--------------------PARA TESTEO-----------------------------
$Attackers = array(
0 => array(id, technos, officiers, ships) [PRINCIPAL],
1 => ... [OPCIONAL],
...
);

$Defenders = array(
0 => array(id, technos, officiers, ships) [PRINCIPAL],
1 => ... [OPCIONAL],
...
);

$Attack = array(
array(23, array('military_tech' => 4, 'defence_tech' => 7, 'shield_tech' => 3), array('rpg_amiral' => 2), array(
201 => 2,
202 => 665,
203 => 400,
217 => 13,
)),
array(57, array('military_tech' => 6, 'defence_tech' => 4, 'shield_tech' => 5), array('rpg_amiral' => 3), array(
201 => 2,
213 => 665,
215 => 400,
220 => 13,
)),
);

$Defend = array(
array(23, array('military_tech' => 4, 'defence_tech' => 7, 'shield_tech' => 3), array('rpg_amiral' => 2), array(
201 => 2,
202 => 665,
203 => 400,
404 => 13,
)),
array(57, array('military_tech' => 6, 'defence_tech' => 4, 'shield_tech' => 5), array('rpg_amiral' => 3), array(
201 => 2,
213 => 665,
215 => 400,
407 => 13,
)),
);


$time_start = microtime(true);

Battle($Attack, $Defend, 6, 70, false);

$time_end = microtime(true);
$totaltime = $time_end - $time_start;
die($totaltime);
*/
//--------------------[FIN] PARA TESTEO-----------------------------
function Battle($Attackers, $Defenders, $MaxRounds = 6, $DefenseReg = 70, $EMPmissileBlock = false){
    global $lang, $resource, $reslist, $pricelist, $CombatCaps, $game_config;
   
    $Array = GenerateCombatArray($Attackers, $Defenders, $EMPmissileBlock);   
    $AttackersFleets = $Array[0];
    $DefendersFleets = $Array[1];   
    unset($Array);
    $Battles = array();
   
    for($Round = 1; $Round <= $MaxRounds; $Round++){
        $Battles[$Round - 1] = array();
        $Battles[$Round - 1]['attackers'] = array();
        $Battles[$Round - 1]['defenders'] = array();
        $AttAny = false;
        $DefAny = false;
        foreach($AttackersFleets as $Order => $Player){
            $Battles[$Round - 1]['attackers'][$Order] = array();
            $Count = RestShips($Player);
            if($Count['total'] == 0){
                $Battles[$Round - 1]['attackers'][$Order]['Ships'] = 0;
            }else{
                $Battles[$Round - 1]['attackers'][$Order]['Ships'] = $Count['all'];
                $AttAny = true;
            }        
        }
        foreach($DefendersFleets as $Order =>  $Player){
            $Battles[$Round - 1]['defenders'][$Order] = array();
            $Count = RestShips($Player);
            if($Count['total'] == 0){
                $Battles[$Round - 1]['defenders'][$Order]['Ships'] = 0;
            }else{
                $Battles[$Round - 1]['defenders'][$Order]['Ships'] = $Count['all'];
                $DefAny = true;
            }        
        }
        CombatRound($AttackersFleets, $DefendersFleets);
        $Battles[$Round - 1]['Materials'] = RoundClean($AttackersFleets, $DefendersFleets);
        if($AttAny == false or $DefAny == false){
            break;
        }
    }
    $TotalMetal = 0;
    $TotalCrystal = 0;
    $TotalAttackersLost = 0;
    $TotalDefendersLost = 0;
    foreach($Battles as $Array){
        $TotalMetal += $Array['Materials']['debris']['metal'];
        $TotalCrystal += $Array['Materials']['debris']['crystal'];
        $TotalAttackersLost += $Array['Materials']['lostunits'][0];
        $TotalDefendersLost += $Array['Materials']['lostunits'][1];   
    }
    $Won = WhoWonBattle($AttackersFleets, $DefendersFleets);
    $Repair = RepairDefenses($DefendersFleets, $DefenseReg);
    return array('rounds' => $Battles, 'debris' => array('metal' => $TotalMetal, 'crystal' => $TotalCrystal), 'lostunits' => array('attackers' => $TotalAttackersLost, 'defenders' => $TotalDefendersLost), 'repair' => $Repair, 'attackers' => $AttackersFleets, 'defenders'=> $DefendersFleets, 'won' => $Won);
}
function WhoWonBattle($AttackersFleets, $DefendersFleets){

        $Attackers = 0;
        $Defenders = 0;
        foreach($AttackersFleets as $Order => $Player){
            $Count = RestShips($Player);
            if($Count['total'] == 0){
               
            }else{
                $Attackers++;
            }        
        }
        foreach($DefendersFleets as $Order =>  $Player){
            $Count = RestShips($Player);
            if($Count['total'] == 0){
               
            }else{
                $Defenders++;
            }        
        }
    if($Attackers > 0 and $Defenders > 0){
        return 'w';
    }elseif($Attackers == 0){   
        return 'r';
    }elseif($Defenders == 0){
        return 'a';
    }else{
        return 'w';
    }
}
function RepairDefenses(&$DefendersFleets, $DefenseReg = 70){
    global $lang, $resource, $reslist, $pricelist, $CombatCaps, $game_config;
    $return = array();
    foreach($DefendersFleets as $Array){
        foreach($Array as $Pass){
                if(in_array($Pass['ship'], $reslist['defense']) and $Pass['destroyed'] == 0){
                    $rand = mt_rand(0, 100);
                    $rand2 = mt_rand(-10, 10);
                    
                    if($rand <= ($DefenseReg + $rand2)){
                        $Pass['shield'] == 1;
                        $Pass['integrity'] == 1;
                        $Pass['destroyed'] == 0;
                        if(!isset($return[$Pass['ship']])){
                            $return[$Pass['ship']] = 0;
                        }
                        $return[$Pass['ship']]++;
                    }
                }
                        
        }   
    }   
return $return;
}
function RoundClean(&$AttackersFleets, &$DefendersFleets){
    global $lang, $resource, $reslist, $pricelist, $CombatCaps, $game_config;
    $Debris = array('metal' => 0, 'crystal' => 0);
    $LostUnits = array(0 => 0, 1 => 0);
    foreach($AttackersFleets as $Array){
        foreach($Array as $Pass){
                $Pass['shield'] == $CombatCaps[$Pass['ship']]['shield'];
                if($Pass['integrity'] <= 0 and $Pass['destroyed'] == 0){
                    if(in_array($Pass['ship'], $reslist['fleet'])){
                        $Debris['metal'] += $pricelist[$Pass['ship']]['metal'] * 0.7;
                        $Debris['crystal'] += $pricelist[$Pass['ship']]['crystal'] * 0.7;
                    }
                    $LostUnits[0] += ($pricelist[$Pass['ship']]['metal'] + $pricelist[$Pass['ship']]['crystal'] + $pricelist[$Pass['ship']]['deuterium'] + $pricelist[$Pass['ship']]['hidrogeno']);
                    $Pass['destroyed'] = 1;
                }
               
                        
        }   
    }
    foreach($DefendersFleets as $Array){
        foreach($Array as $Pass){
                $Pass['shield'] == $CombatCaps[$Pass['ship']]['shield'];
                if($Pass['integrity'] <= 0 and $Pass['destroyed'] == 0){
                    if(in_array($Pass['ship'], $reslist['fleet']) or defined('DEFENSE_TO_DEBRIS')){
                        $Debris['metal'] += $pricelist[$Pass['ship']]['metal'] * 0.7;
                        $Debris['crystal'] += $pricelist[$Pass['ship']]['crystal'] * 0.7;
                    }
                    $LostUnits[1] += ($pricelist[$Pass['ship']]['metal'] + $pricelist[$Pass['ship']]['crystal'] + $pricelist[$Pass['ship']]['deuterium'] + $pricelist[$Pass['ship']]['hidrogeno']);
                    $Pass['destroyed'] = 1;
                }
                        
        }   
    }
    return array('debris' => $Debris,'lostunits' => $LostUnits);
}
function CombatRound(&$AttackersFleets, &$DefendersFleets){
    global $lang, $resource, $reslist, $pricelist, $CombatCaps, $game_config;
    $Counts = array();
    $Counts['attackers'] = array();
    $Counts['attackers']['total'] = 0;
    $Counts['defenders'] = array();
    $Counts['defenders']['total'] = 0;
    foreach($AttackersFleets as $Order => $Array){
        $Counts['attackers'][$Order] = 0;
        $Counts['attackers']['total']++;
        foreach($Array as $Pass){
            if($Pass['destroyed'] == 1){
                continue;
            }
            $Counts['attackers'][$Order]++;
        }
   
    }
    foreach($DefendersFleets as $Order => $Array){
        $Counts['defenders'][$Order] = 0;
        $Counts['defenders']['total']++;
        foreach($Array as $Pass){
            if($Pass['destroyed'] == 1){
                continue;
            }
            $Counts['defenders'][$Order]++;
        }
   
    }
    foreach($AttackersFleets as $Array){
        foreach($Array as $Pass){
                if($Pass['destroyed'] == 1){
                    continue;
                }
                $now = true;
                while($now == true){
                    $now = false;
                    $Rand1 = mt_rand(0, ($Counts['defenders']['total'] - 1));
                    $Rand2 = mt_rand(0, ($Counts['defenders'][$Rand1] - 1));
                    $AttackTo =& $DefendersFleets[$Rand1][$Rand2];
                    if($AttackTo['destroyed'] == 1){
                        $now = true;
                    }
                    if($CombatCaps[$Pass['ship']]['sd'][$AttackTo['ship']] > 1){
                        $rand = mt_rand(0, $CombatCaps[$Pass['ship']]['sd'][$AttackTo['ship']]);
                        if($rand <= ($CombatCaps[$Pass['ship']]['sd'][$AttackTo['ship']] - 1)){
                            $now = true;
                        }
                    }
                    $ShieldRest = $Pass['attack'] - $AttackTo['shield'];
                    $AttackIntegrityPercent = ($AttackTo['integrity']*30/100);
                    if($ShieldRest > 0){
                        $AttackTo['shield'] = 0;
                        $AttackTo['integrity'] -= $ShieldRest;
                        $TheAttack = $ShieldRest;
                    }else{
                        $AttackTo['shield'] -= $Pass['attack'];
                        $TheAttack = $Pass['attack'];
                    }
                    
                    if($AttackIntegrityPercent < $TheAttack){
                        $rand = mt_rand(0, 100);
                        if($rand <= 30){
                            $AttackTo['shield'] = 0;
                            $AttackTo['integrity'] = 0;
                        }
                    }
                }
                        
        }   
    }
    foreach($DefendersFleets as $Array){
        foreach($Array as $Pass){
                if($Pass['destroyed'] == 1){
                    continue;
                }
                $now = true;
                while($now == true){
                    $now = false;
                    $Rand1 = mt_rand(0, ($Counts['attackers']['total'] - 1));
                    $Rand2 = mt_rand(0, ($Counts['attackers'][$Rand1] - 1));
                    $AttackTo =& $AttackersFleets[$Rand1][$Rand2];
                    if($AttackTo['destroyed'] == 1){
                        $now = true;
                    }
                    if($CombatCaps[$Pass['ship']]['sd'][$AttackTo['ship']] > 1){
                        $rand = mt_rand(0, $CombatCaps[$Pass['ship']]['sd'][$AttackTo['ship']]);
                        if($rand <= ($CombatCaps[$Pass['ship']]['sd'][$AttackTo['ship']] - 1)){
                            $now = true;
                        }
                    }
                    $ShieldRest = $Pass['attack'] - $AttackTo['shield'];
                    $AttackIntegrityPercent = ($AttackTo['integrity']*30/100);
                    if($ShieldRest > 0){
                        $AttackTo['shield'] = 0;
                        $AttackTo['integrity'] -= $ShieldRest;
                        $TheAttack = $ShieldRest;
                    }else{
                        $AttackTo['shield'] -= $Pass['attack'];
                        $TheAttack = $Pass['attack'];
                    }
                    
                    if($AttackIntegrityPercent < $TheAttack){
                        $rand = mt_rand(0, 100);
                        if($rand <= 30){
                            $AttackTo['shield'] = 0;
                            $AttackTo['integrity'] = 0;
                        }
                    }
                }
                        
        }   
    }
}

function RestShips($Player){
    global $lang, $resource, $reslist, $pricelist, $CombatCaps, $game_config;
    $Ships = array();
    $TotalShips = 0;
    foreach($Player as $Ship){
        if(!isset($Ships[$Ship['ship']])){
            $Ships[$Ship['ship']] = array();
            $Ships[$Ship['ship']]['count'] = 0;
            $Ships[$Ship['ship']]['attack'] = 0;
            $Ships[$Ship['ship']]['integrity'] = 0;
            $Ships[$Ship['ship']]['shield'] = 0;   
        }
        if($Ship['integrity'] > 0){
            $Ships[$Ship['ship']]['count']++;
            $Ships[$Ship['ship']]['attack'] += $Ship['attack'];
            $Ships[$Ship['ship']]['integrity'] += $Ship['integrity'];
            $Ships[$Ship['ship']]['shield'] += $Ship['shield'];   
            $TotalShips++;
        }
    }
    return array('total' => $TotalShips, 'all' => $Ships);
}


function GenerateCombatArray($Attackers, $Defenders, $EMPmissileBlock = false){
    global $lang, $resource, $reslist, $pricelist, $CombatCaps, $game_config;
    $AttackersFleets = array();
    $DefendersFleets = array();
    foreach($Attackers as $Order => $Array){
        $AttackersFleets[$Order] = array();
        foreach($Array[3] as $Ship => $Count){
            $count = count($AttackersFleets[$Order]);
            for($Pass = $count; $Pass <= ($Count + $count); $Pass++){
                $AttackersFleets[$Order][$Pass] = array(
                'ship' => $Ship,
                'attack' => ($CombatCaps[$Ship]['attack'] * (1 + (0.1 * ($Array[1]['military_tech']) + (0.05 * $Array[2]['rpg_amiral'])))),
                'shield' => ($CombatCaps[$Ship]['shield'] * (1 + (0.1 * ($Array[1]['defence_tech']) + (0.05 * $Array[2]['rpg_amiral'])))),
                'integrity' => ((($pricelist[$Ship]['metal'] + $pricelist[$Ship]['crystal']) / 10) * (1 + (0.1 * ($Array[1]['shield_tech']) + (0.05 * $Array[2]['rpg_amiral'])))),
                'destroyed' => 0,
                );
            }
        }
    }
    foreach($Defenders as $Order => $Array){
        $DefendersFleets[$Order] = array();
        foreach($Array[3] as $Ship => $Count){
            $count = count($DefendersFleets[$Order]);
            for($Pass = $count; $Pass <= ($Count + $count); $Pass++){
                if(in_array($Ship, $reslist['fleet'])){
                    $DefendersFleets[$Order][$Pass] = array(
                    'ship' => $Ship,
                    'attack' => ($CombatCaps[$Ship]['attack'] * (1 + (0.1 * ($Array[1]['military_tech']) + (0.05 * $Array[2]['rpg_amiral'])))),
                    'shield' => ($CombatCaps[$Ship]['shield'] * (1 + (0.1 * ($Array[1]['defence_tech']) + (0.05 * $Array[2]['rpg_amiral'])))),
                    'integrity' => ((($pricelist[$Ship]['metal'] + $pricelist[$Ship]['crystal']) / 10) * (1 + (0.1 * ($Array[1]['shield_tech']) + (0.05 * $Array[2]['rpg_amiral'])))),
                    'destroyed' => 0,
                    );
                }elseif(in_array($Ship, $reslist['defense']) and $EMPmissileBlock == false){
                    $DefendersFleets[$Order][$Pass] = array(
                    'ship' => $Ship,
                    'attack' => ($CombatCaps[$Ship]['attack'] * (1 + (0.1 * ($Array[1]['military_tech']) + (0.05 * $Array[2]['rpg_amiral'])))),
                    'shield' => ($CombatCaps[$Ship]['shield'] * (1 + (0.1 * ($Array[1]['defence_tech']) + (0.05 * $Array[2]['rpg_amiral'])))),
                    'integrity' => ((($pricelist[$Ship]['metal'] + $pricelist[$Ship]['crystal']) / 10) * (1 + (0.1 * ($Array[1]['shield_tech']) + (0.05 * $Array[2]['rpg_amiral'])))),
                    'destroyed' => 0,
                    );                    
                }else{
                    $DefendersFleets[$Order][$Pass] = array(
                    'ship' => $Ship,
                    'attack' => 0,
                    'shield' => ($CombatCaps[$Ship]['shield'] * (1 + (0.1 * ($Array[1]['defence_tech']) + (0.05 * $Array[2]['rpg_amiral'])))),
                    'integrity' => ((($pricelist[$Ship]['metal'] + $pricelist[$Ship]['crystal']) / 10) * (1 + (0.1 * ($Array[1]['shield_tech']) + (0.05 * $Array[2]['rpg_amiral'])))),
                    'destroyed' => 0,
                    );               
                }
            }
        }
    }
    return array(0 => $AttackersFleets, 1 => $DefendersFleets);
}
?> 