HB/game/Class/class.flotte.php

281 lines
10 KiB
PHP

<?php
/***************************************************************************
* class.flotte.php
* ------------------
* begin : Samedi 20 septembre 2008
* update : Samedi 20 septembre 2008
* email : nemunaire@gmail.com
*
*
***************************************************************************/
class Flotte{
var $id_flotte,
$nom,
$start_planete,
$start_time,
$end_planete,
$end_time,
$ret_planete,
$ret_time,
$vaisseaux = array(),
$tactique = 0,
$mission,
$vitesse,
$statut = 0,
$last,
$contenu = array(0,0,0),
$contenuMax = 0,
$modifFlotte = array();
/**
* Constructeur
* @param int $id id de la flotte à importer
*
* @return void
* @access public
*/
function Flotte($id = 0){
if (!empty($id)) {
global $var___db, $config, $table_flottes;
global $nomvaisnVAR, $ressoVAR;
$bdd = new bdd();
$bdd->connexion();
$bdd->escape($id);
$flotte = $bdd->unique_query("SELECT * FROM $table_flottes WHERE id = $id;");
$bdd->query("UPDATE $table_flottes SET last = ".time()." WHERE id = $id;"); //Obtention d'un vérrou de 10 seconde sur la flotte
$bdd->deconnexion();
if (!empty($flotte)) {
$this->id_flotte = $flotte["id"];
$this->nom = $flotte["nom"];
$this->start_planete = $flotte["start_planete"];
$this->start_time = $flotte["start_time"];
$this->end_planete = $flotte["end_planete"];
$this->end_time = $flotte["end_time"];
$this->ret_planete = $flotte["ret_planete"];
$this->ret_time = $flotte["ret_time"];
$this->tactique = $flotte["tactique"];
$this->mission = $flotte["mission"];
$this->statut = $flotte["statut"];
$this->last = $flotte["last"];
foreach($nomvaisnVAR as $vais){
$this->vaisseaux[] = $flotte[$vais];
}
foreach($ressoVAR as $contenu){
$this->contenu[] = $flotte[$contenu];
}
$this->calculer();
}
}
}
function calculer(){
global $nomvais_rs;
//Calcul de la capacité maximale d'embarquement de la flotte
foreach($this->vaisseaux as $key => $vais){
$this->contenuMax += $nomvais_rs[$key] * $vais;
}
}
function load_planete(){
if (is_numeric($this->start_planete) && !empty($this->start_planete)) {
$this->start_planete = new Planete($this->start_planete);
}
if (is_numeric($this->end_planete) && !empty($this->end_planete)) {
$this->end_planete = new Planete($this->end_planete);
}
if (is_numeric($this->ret_planete) && !empty($this->ret_planete)) {
$this->ret_planete = new Planete($this->ret_planete);
}
}
function calc_deplacement($start_galaxie, $start_systeme, $start_position, $end_galaxie, $end_systeme, $end_position, $vitesse, $returnArray = false, $returnConso = false){
//Si la planète de départ n'est pas chargée, on charge les planètes
if (is_numeric($this->start_planete)) $this->load_planete();
global $config, $nomvais_vitesseP, $nomvais_vitesseS, $nomvais_vitesseG, $nomvais_rs;
$this->vitesse = $vitesse;
//Calcul de la longueur du déplacement
$diff_galaxie = abs($start_galaxie - $end_galaxie);
$diff_systeme = abs($start_systeme - $end_systeme);
$diff_position = abs($start_position - $end_position);
$diff_centre_position_start = abs(ceil($config['nb_amas']/2) - $start_position);
$diff_centre_systeme_start = abs(ceil($config['nb_systeme']/2) - $start_systeme);
$diff_centre_position_end = abs(ceil($config['nb_amas']/2) - $end_position);
$diff_centre_systeme_end = abs(ceil($config['nb_systeme']/2) - $end_systeme);
//Calcul du temps de déplacement pour chaque vaisseau
$temps = array(); $conso = array(0, 0, 0);
foreach($this->vaisseaux as $key => $vais){
//S'il n'y a pas de vaisseaux de ce type, on ne calcul pas leur vitesse
if ($vais == 0) continue;
//Calcul du temps de déplacement entre planètes
if ($start_systeme == $end_systeme && $start_galaxie == $end_galaxie) {
$temps[0][$key] = (10/$nomvais_vitesseP[$key]) * (1 + 0.1 * $diff_position);
$temps[1][$key] = $temps[2][$key] = 0;
}
//Calcul du temps de déplacement entre système
elseif ($start_galaxie == $end_galaxie) {
$temps[0][$key] = (10/$nomvais_vitesseP[$key]) * (1 + 0.1 * ($diff_centre_position_start + $diff_centre_position_end));
$temps[1][$key] = (20/$nomvais_vitesseS[$key]) * (2 + 1 * $diff_systeme);
$temps[2][$key] = 0;
}
//Calcul du temps de déplacement entre galaxies
else {
$temps[0][$key] = (10/$nomvais_vitesseP[$key]) * (1 + 0.1 * ($diff_centre_position_start + $diff_centre_position_end));
$temps[1][$key] = (20/$nomvais_vitesseS[$key]) * (2 + 1 * ($diff_centre_systeme_start + $diff_centre_systeme_end));
$temps[2][$key] = (50/$nomvais_vitesseG[$key]) * (2 + 1.5 * $diff_galaxie);
}
//Calcul du bonus pour le réacteur à combustion
$techR = $this->start_planete->technologies[1];
if ($techR & 56) $bonus = 0.7;
elseif ($techR & 24) $bonus = 0.8;
elseif ($techR & 8) $bonus = 0.9;
else $bonus = 1;
$temps[0][$key] *= $bonus * 1/$vitesse;
$conso[0] += $vais * $temps[0][$key] * $bonus / exp($vitesse/5);
//Calcul du bonus pour le réacteur à fusion
$techR = $this->start_planete->technologies[1];
if ($techR & 448) $bonus = 0.7;
elseif ($techR & 192) $bonus = 0.8;
elseif ($techR & 64) $bonus = 0.9;
else $bonus = 1;
$temps[1][$key] *= $bonus * 1/$vitesse;
$conso[1] += $vais * $temps[1][$key] * $bonus / exp($vitesse/7.5);
//Calcul du bonus pour le réacteur à fusion de type II
$techR = $this->start_planete->technologies[1];
if ($techR & 3584) $bonus = 0.7;
elseif ($techR & 1536) $bonus = 0.8;
elseif ($techR & 512) $bonus = 0.9;
else $bonus = 1;
$temps[2][$key] *= $bonus * 1/$vitesse;
$conso[2] += $vais * $temps[2][$key] * $bonus / exp($vitesse/10);
}
//Si les chasseurs peuvent rentrer dans les cales des vaisseaux, on les enlèves
if ($this->contenuMax - ($this->contenu[0] + $this->contenu[1] + $this->contenu[2]) - ($this->vaisseaux[4] * $nomvais_rs[4] + $this->vaisseaux[5] * $nomvais_rs[5]) >= ($this->vaisseaux[4] + $this->vaisseaux[5]) * 200) {
$temps[2][4] = $temps[2][5] = $temps[1][4] = $temps[1][5] = $temps[0][4] = $temps[0][5] = 0;
}
//On calcul le temps de déplacement maximal
if ($returnArray) return $temps;
elseif ($returnConso) return array(max($temps[0]) + max($temps[1]) + max($temps[2]), ceil($conso[0]+$conso[1]+$conso[2]));
else return (max($temps[0]) + max($temps[1]) + max($temps[2]));
}
function check_mission(){
//On vérifie qu'un calcul ne soit pas déjà en cours
if ($this->last >= time() - 10) return false;
elseif ($this->start_time + $this->end_time < time()) return false;
elseif ($this->statut == 1 && ($this->ret_time > time() || $this->start_time + $this->end_time * 2 >= time())) return $this->retourner();
switch($this->mission){
case 0:
case 5:
return $this->stationner();
break;
case 1:
return $this->transporter();
break;
case 2:
return $this->coloniser();
break;
case 3:
return $this->espionner();
break;
case 4:
return $this->attaquer();
break;
}
}
function rappeler(){
if ($this->start_time + $this->end_time >= time()) return false;
else {
$this->end_time = time() - $this->start_time + 10;
$this->mission = 5;
if (!in_array('mission', $this->modifFlotte)) $this->modifFlotte[] = 'mission';
if (!in_array('end_time', $this->modifFlotte)) $this->modifFlotte[] = 'end_time';
return true;
}
}
function retourner(){
//Si la planète de départ n'est pas chargée, on charge les planètes
if (is_numeric($this->start_planete)) $this->load_planete();
//Si on a demandé une planète particulière au retour
if (!empty($this->ret_time) && !empty($this->ret_planete) && !is_numeric($this->ret_planete)) {
foreach($this->vaisseaux as $key => $vais){
$this->ret_planete->vaisseaux[$key] += $vais;
}
}
//Si le retour se fait sur la planète source
else {
foreach($this->vaisseaux as $key => $vais){
$this->start_planete->vaisseaux[$key] += $vais;
}
}
$this->modifFlotte = "DELETE";
}
/**
* Destructeur
*
* @return void
* @access public
*/
function __destruct(){
global $var___db, $config, $table_flottes;
$nb = count($this->modifFlotte);
$out = array();
$bdd = new bdd();
$bdd->connexion();
if ($this->modifFlotte === "DELETE") $bdd->query("DELETE FROM $table_flottes WHERE id = ".$this->id_flotte.";");
else {
for($i = 0; $i < $nb; $i++){
if (!is_array($this->{$this->modifFlotte[$i]})) {
$bdd->escape($this->{$this->modifFlotte[$i]});
if (is_int($this->{$this->modifFlotte[$i]}) || is_float($this->{$this->modifFlotte[$i]})) $out[] .= $this->modifFlotte[$i]." = ".$this->{$this->modifFlotte[$i]};
else $out[] .= $this->modifFlotte[$i]." = '".$this->{$this->modifFlotte[$i]}."'";
}
else {
if ($this->modifFlotte[$i] == "contenu") $calc = "resso";
elseif ($this->modifFlotte[$i] == "vaisseaux") $calc = "nomvaisn";
if (!isset(${$calc.'VAR'})) global ${$calc.'VAR'};
$nombr = count(${$calc.'VAR'});
for($j = 0; $j < $nombr; $j++){
$bdd->escape($this->{$this->modifFlotte[$i]}[$j]);
$out[] = ${$calc.'VAR'}[$j]." = ".$this->{$this->modifFlotte[$i]}[$j];
}
}
}
if (empty($id_flotte)) {
$out1 = ''; $out2 = '';
global $nomvaisnVAR;
foreach ($this->vaisseaux as $key => $vais){
$out1 .= ', '.${$calc.'VAR'}[$key];
$out2 .= ', '.$vais;
}
$sql = "INSERT INTO $table_flottes (id_user, mission, start_time, start_planete, end_time, end_planete, vitesse, contenu_metal, contenu_cristal, contenu_hydrogene, tactique, nom$out1) VALUES ('".$start_planete->id_user."', '".$this->mission."', '".$this->start_time."', '".$start_planete->id."', '".$this->end_time."', '".$this->end_planete."', '".$this->vitesse."', '".$this->contenu[0]."', '".$this->contenu[1]."', '".$this->contenu[2]."', '".$this->tactique."', '".$this->nom."'$out2);";
var_dump($sql);
//$bdd->query($sql);
}
elseif (!empty($out)) $bdd->query("UPDATE $table_flottes SET ".implode(', ', $out).", last = 0 WHERE id = ".$this->id_flotte.";");
else $bdd->query("UPDATE $table_flottes SET last = 0 WHERE id = ".$this->id_flotte.";");
}
$bdd->deconnexion();
}
}
?>