Location: PHPKode > projects > Skrupel KI > skrupelki/ki_leicht/sternenbasen_leicht/sternenbasen_leicht.php
<?php
/**
 * Autor: Wasserleiche (hide@address.com)
 * 
 * Implementierung von sternenbasen_basis.
 */
class sternenbasen_leicht extends sternenbasen_basis {
	
	/**
	 * Ermittelt einen geeigneten Planeten, um eine neue Sternenbasis zu bauen. In dieser Implementierung wird 
	 * dieser Planet anhand der groessten Bevoelkerungszahl und des Abstandes zu anderen Sternenbasen ermittelt.
	 * Die Bevoelkerungszahl ist deshalb mit entscheidend, weil eine Sternenbasis viel Cantox fuer den Ausbau und 
	 * spaeter viele Vorraete (fuer das Subpartikelclusterschiff) fuer den Schiffsbau benoetigt.
	 * Bessere Implementierungen koennten zB. die Anzahl umliegender Planeten oder die Nahe 
	 * zum Feind beruecksichtigen.
	 * returns: Die Datenbank-ID des Planeten, auf dem eine neue Sternenbasis sinnvoll erscheint.
	 * 			null, falls kein passender Planet gefunden wurde.
	 */
	function ermittleNeuenBasenPlaneten() {
		$spiel_id = eigenschaften::$spiel_id;
		$comp_id = eigenschaften::$comp_id;
		$planeten_infos = @mysql_query("SELECT id, x_pos, y_pos FROM skrupel_planeten 
			WHERE (sternenbasis=0) AND (besitzer='$comp_id') AND (spiel='$spiel_id') ORDER BY kolonisten DESC");
		$planeten_id = null;
		while($planeten_info = @mysql_fetch_array($planeten_infos)) {
			if(ki_basis::planetWirdAngegriffen($planeten_info['id'])) continue;
			
			$x_neue_basis = $planeten_info['x_pos'];
			$y_neue_basis = $planeten_info['y_pos'];
			if(count(eigenschaften::$basen_planeten_ids) == 0) {
				$planeten_id = $planeten_info['id'];
				break;
			}
			$basen_koords = @mysql_query("SELECT x_pos, y_pos FROM skrupel_planeten 
				WHERE (sternenbasis=2) AND (besitzer='$comp_id') AND (spiel='$spiel_id')");
			while($basen_pos = @mysql_fetch_array($basen_koords)) {
				$x_basis = $basen_pos['x_pos'];
				$y_basis = $basen_pos['y_pos'];
				$strecke = floor(ki_basis::berechneStrecke($x_neue_basis, $y_neue_basis, $x_basis, $y_basis));
				if($strecke >= eigenschaften::$basen_neu_infos->min_basen_abstand) {
					$planeten_id = $planeten_info['id'];
					break;
				}
			}
			if($planeten_id != null) break;
		}
		return $planeten_id;
	}
	
	/**
	 * Verwaltet alle Jaeger und Frachter, die mit zu wenig Lemin im All sind oder auf einem Planeten 
	 * mit wenig Lemin sind.
	 * arguments: $basen_planeten_id - Die Datenbank-ID des Planeten, von dem aus Raumfalten mit Lemin 
	 * 								   zu gestrandeten Schiffen gesendet werden sollen.
	 */
	function verwalteSchiffeOhneLemin($basen_planeten_id) {
		$planeten_res = @mysql_query("SELECT cantox, lemin FROM skrupel_planeten WHERE id='$basen_planeten_id'");
		$planeten_res = @mysql_fetch_array($planeten_res);
		$planet_cantox = $planeten_res['cantox'];
		$planet_lemin = $planeten_res['lemin'];
		$spiel_id = eigenschaften::$spiel_id;
		$comp_id = eigenschaften::$comp_id;
		$lemin_grenze = eigenschaften::$raumfalten_infos->raumfalte_min_lemin;
		$ziel_schiffe = @mysql_query("SELECT id, status, kox, koy FROM skrupel_schiffe WHERE (spiel='$spiel_id') 
			AND (besitzer='$comp_id') AND (kox_old=0) AND (koy_old=0) AND (lemin < '$lemin_grenze')");
		while($schiff_daten = @mysql_fetch_array($ziel_schiffe)) {
			$schiff_id = $schiff_daten['id'];
			if($this->SchiffHatLeminRaumfalte($schiff_id)) continue;
			$status = $schiff_daten['status'];
			$x = $schiff_daten['kox'];
			$y = $schiff_daten['koy'];
			//Ist das Schiff bei einem Planeten mit genug Lemin, so wird keine Raumfalte gesendet.
			if($status == 2) {
				$schiff_planet_lemin = @mysql_query("SELECT lemin FROM skrupel_planeten 
					WHERE (x_pos='$x') AND (y_pos='$y') AND (spiel='$spiel_id')");
				$schiff_planet_lemin = @mysql_fetch_array($schiff_planet_lemin);
				if($schiff_planet_lemin['lemin']>eigenschaften::$raumfalten_infos->raumfalte_max_planeten_lemin) 
					continue;
			}
			$lemin_raumfalte = 0;
			if(in_array($schiff_id, eigenschaften::$frachter_ids)) 
				$lemin_raumfalte = eigenschaften::$raumfalten_infos->raumfalte_frachter_lemin;
			else $lemin_raumfalte = eigenschaften::$raumfalten_infos->raumfalte_jaeger_lemin;
			if($planet_cantox < (8 * $lemin_raumfalte) || $lemin_raumfalte > $planet_lemin) continue;
			$res_array = array(0, 0, $lemin_raumfalte, 0, 0, 0);
			$this->sendeRaumfalte($schiff_id, $basen_planeten_id, false, $res_array);
		}
	}
	
	/**
	 * Versorgt andere Planeten mit Sternenbasen oder neue Basen-Planeten mit Raumfalten vom uebergebenen 
	 * Planeten mit Sternenbasis aus.
	 * arguments: $planeten_id - Die Datenbank-ID es Planeten, von dem aus andere Sternenbasen/neue Basen-Planeten
	 * 							 per Raumfalte versorgt werden sollen.
	 */
	function versorgeAndereBasen($planeten_id) {
		$basen_planeten = array_merge(eigenschaften::$basen_planeten_ids, eigenschaften::$neue_basis_planeten);
		if(count($basen_planeten) == 0) return;
		$planeten_res = @mysql_query("SELECT cantox, min1, min2, min3, lemin FROM skrupel_planeten 
			WHERE id='$planeten_id'");
		$planeten_res = @mysql_fetch_array($planeten_res);
		$cantox = $planeten_res['cantox'];
		$min1 = $planeten_res['min1'];
		$min2 = $planeten_res['min2'];
		$min3 = $planeten_res['min3'];
		$lemin = $planeten_res['lemin'];
		foreach($basen_planeten as $planet) {
			if($planet == $planeten_id || count($this->ermittlePlanetenRaumfalten($planet)) > 
			eigenschaften::$raumfalten_infos->max_raumfalten_pro_planet) continue;
			$planeten_res = @mysql_query("SELECT cantox, min1, min2, min3, lemin FROM skrupel_planeten 
				WHERE id='$planet'");
			$planeten_res = @mysql_fetch_array($planeten_res);
			$cantox_planet = $planeten_res['cantox'];
			$min1_planet = $planeten_res['min1'];
			$min2_planet = $planeten_res['min2'];
			$min3_planet = $planeten_res['min3'];
			$lemin_planet = $planeten_res['lemin'];
			$raumfalte_min1 = $min1 - eigenschaften::$raumfalten_infos->raumfalte_min_min1_basen;
			if(eigenschaften::$raumfalten_infos->max_min1_basen < $min1_planet 
			|| $raumfalte_min1 < 0) $raumfalte_min1 = 0;
			$raumfalte_min2 = $min2 - eigenschaften::$raumfalten_infos->raumfalte_min_min2_basen;
			if(eigenschaften::$raumfalten_infos->max_min2_basen < $min2_planet 
			|| $raumfalte_min2 < 0) $raumfalte_min2 = 0;
			$raumfalte_min3 = $min3 - eigenschaften::$raumfalten_infos->raumfalte_min_min3_basen;
			if(eigenschaften::$raumfalten_infos->max_min3_basen < $min3_planet 
			|| $raumfalte_min3 < 0) $raumfalte_min3 = 0;
			$raumfalte_lemin = $lemin - eigenschaften::$raumfalten_infos->raumfalte_min_lemin_basen;
			if(eigenschaften::$raumfalten_infos->max_lemin_basen < $lemin_planet 
			|| $raumfalte_lemin < 0) $raumfalte_lemin = 0;
			$resourcen = array(0, 0, $raumfalte_lemin, $raumfalte_min1, $raumfalte_min2, $raumfalte_min3);
			$cantox_kosten = $this->berechneRaumfaltenKosten($resourcen);
			$raumfalte_cantox = $cantox - eigenschaften::$raumfalten_infos->raumfalte_min_cantox_basen 
								-$cantox_kosten;
			if(eigenschaften::$raumfalten_infos->max_cantox_basen < $cantox_planet 
			|| $raumfalte_cantox < 0) $raumfalte_cantox = 0;
			$resourcen[0] = $raumfalte_cantox;
			if($this->sendeRaumfalte($planet, $planeten_id, true, $resourcen)) {
				$planeten_res = @mysql_query("SELECT cantox, min1, min2, min3, lemin FROM skrupel_planeten 
					WHERE id='$planeten_id'");
				$planeten_res = @mysql_fetch_array($planeten_res);
				$cantox = $planeten_res['cantox'];
				$min1 = $planeten_res['min1'];
				$min2 = $planeten_res['min2'];
				$min3 = $planeten_res['min3'];
				$lemin = $planeten_res['lemin'];
			}
		}
	}
	
	/**
	 * Verwaltet alle Sternenbasen bezueglich des Ausbaus der Technologien und des Bauens neuer Sternenbasen.
	 * Diese Implementierung baut eine neue Sternenbasis, sobald alle vorhanden einen gewissen Ausbaugrad 
	 * erreicht haben. Kann die neue Basis aufgrund von Resourcenmangel auf dem Planeten noch nicht gebaut 
	 * werden, wird sie dem Array eigenschaften::$neue_basis_planeten hinzugefuegt, damit in der Naehe 
	 * befindliche Frachter diesen Planeten mit Resourcen versorgen.
	 */
	function verwalteBasen() {
		$fertig_ausgebaute_basen = 0;
		if(count(eigenschaften::$basen_planeten_ids) == 0) {
			$neuer_basis_planet = $this->ermittleNeuenBasenPlaneten();
			$this->baueNeueSternenbasis($neuer_basis_planet);
			return;
		}
		foreach(eigenschaften::$basen_planeten_ids as $planeten_id) {
			if($this->ermittleTechLevel($planeten_id, "t_huelle") >= 7 
			&& $this->ermittleTechLevel($planeten_id, "t_antrieb") >= 8) {
				$this->verwalteSchiffeOhneLemin($planeten_id);
			}
			$this->erweitereBasen($planeten_id);
			if(eigenschaften::$tick >= eigenschaften::$planeten_infos->kein_auto_bau_limit) 
				$this->baueBasisVerteidigung($planeten_id);
			basen_schiffbau_leicht::baueNeuesSchiff($planeten_id);
			$basis_infos = @mysql_query("SELECT t_huelle, t_antrieb, t_energie, t_explosiv 
				FROM skrupel_sternenbasen WHERE planetid='$planeten_id'");
			$basis_infos = @mysql_fetch_array($basis_infos);
			if($basis_infos['t_huelle'] >= eigenschaften::$basen_neu_infos->neue_basis_min_rumpf 
			&& $basis_infos['t_antrieb'] >= eigenschaften::$basen_neu_infos->neue_basis_min_antrieb 
			&& $basis_infos['t_energie'] >= eigenschaften::$basen_neu_infos->neue_basis_min_waffen 
			&& $basis_infos['t_explosiv'] >= eigenschaften::$basen_neu_infos->neue_basis_min_waffen) {
				$this->versorgeAndereBasen($planeten_id);
				$fertig_ausgebaute_basen++;
			}
		}
		if($fertig_ausgebaute_basen == count(eigenschaften::$basen_planeten_ids)) {
			if(count(eigenschaften::$neue_basis_planeten) == 0) {
				$neuer_basis_planet = $this->ermittleNeuenBasenPlaneten();
				$this->baueNeueSternenbasis($neuer_basis_planet);
				return;
			}
			foreach(eigenschaften::$neue_basis_planeten as $neuer_basis_planet) {
				$this->baueNeueSternenbasis($neuer_basis_planet);
			}
		}
	}
}
?>
Return current item: Skrupel KI