Location: PHPKode > projects > Skrupel KI > skrupelki/ki_basis/schiffe_basis/frachter_basis.php
<?php
/**
 * Autor: Wasserleiche (hide@address.com)
 * 
 * Abstrakte Oberklasse fuer Frachter.
 */
abstract class frachter_basis extends schiffe_basis {
	
	/**
	 * Prueft, ob es sinnvoll oder erforderlich ist, weiter zu kolonisieren.
	 */
	abstract static function mehrKolonien();
	
	/**
	 * Analysiert den Status jedes einzelnen Frachters und entscheidet, wie er sich verhalten soll.
	 */
	abstract function verwalteFrachter();
	
	/**
	 * Prueft, ob das uebergebene Schiff in der naehe eines Planeten ist, an dem eine neue Sternenbasis gebaut
	 * werden soll. Falls ja, wird (egal ob das Schiff in einer Route ist oder nicht) das Schiff 
	 * dort hingeschickt.
	 * arguments: $schiff_id - Die Datenbank-ID des Schiffs, das zur neuen Basis fliegen soll.
	 * returns: true - Falls das Schiff zur naechsten neuen Basis geschickt wurde.
	 * 			false - Sonst.
	 */
	function zuNeuenBasis($schiff_id) {
		$schiff_daten = @mysql_query("SELECT kox, koy, routing_status FROM skrupel_schiffe 
			WHERE id='$schiff_id'");
		$schiff_daten = @mysql_fetch_array($schiff_daten);
		$schiff_x = $schiff_daten['kox'];
		$schiff_y = $schiff_daten['koy'];
		$schiff_routen_status = $schiff_daten['routing_status'];
		$spiel_id = eigenschaften::$spiel_id;
		//Zuerst werden die Koordinaten aller Planeten bestimmt, auf denen eine neue Basis gebaut werden soll.
		$koords = @mysql_query("SELECT p.x_pos, p.y_pos, p.id FROM skrupel_planeten p, skrupel_ki_neuebasen nb 
			WHERE (p.id=nb.planeten_id) AND (p.spiel='$spiel_id')");
		$neue_basen_koords = array();
		while($koord = @mysql_fetch_array($koords)) {
			$neue_basen_koords[] = array('x'=>$koord['x_pos'], 'y'=>$koord['y_pos'], 'id'=>$koords['id']);
		}
		if(count($neue_basen_koords) == 0) return;
		//Nun wird der naechste Planet bestimmt.
		$neue_basis = ki_basis::ermittleNahesZiel($schiff_id, $neue_basen_koords, 
								eigenschaften::$bekannte_wurmloch_koords);
		$strecke = floor(ki_basis::berechneStrecke($neue_basis['x'], $neue_basis['y'], $schiff_x, $schiff_y));
		//Das Schiff wird nur dort hingeflogen, falls es nicht zu weit entfernt ist und nicht schon da ist.
		if($strecke <= eigenschaften::$frachter_infos->max_frachter_reichweite && $strecke != 0) {
			$warp = $this->ermittleMaximumWarp($schiff_id);
			$this->fliegeSchiff($schiff_id, $neue_basis['x'], $neue_basis['y'], $warp, $neue_basis['id']);
			//Alle relevanten Routen-Infos werden geloescht, damit es nicht zu einem Konflikt kommt und 
			//damit die Planeten-IDs aus der Route wieder frei fuer andere Frachter sind.
			if($schiff_routen_status == 2) 
				@mysql_query("UPDATE skrupel_schiffe SET routing_status=0, routing_id='' WHERE id='$schiff_id'");
			return true;
		}
		return false;
	}
	
	/**
	 * Aktualisiert den Routen-Logbuch-Eintrag des uebergebenen Schiffes mit dem uebergebenen Planeten.
	 * arguments: $schiff_id - Die Datenbank-ID des Schiffs, dessen Routen-Logbuch-Eintrag aktualisiert wird.
	 * 			  $planeten_id - Die Datenbank-ID des Planeten, das als letztes vom Schiff besucht wurde.
	 */
	function updateLogBuchRoute($schiff_id, $planeten_id) {
		@mysql_query("UPDATE skrupel_schiffe SET logbuch='$planeten_id' WHERE id='$schiff_id'");
	}
	
	/**
	 * Entfernt den uebergebenen Planeten aus allen Frachter-Routen der KI. Es wird kein Planet geloescht, der 
	 * eigentlich beliefert werden soll!
	 * arguments: $planeten_id - Die Datenbank-ID des Planeten, der aus allen Frachter-Routen entfernt wird.
	 */
	static function entfernePlanetenAusRouten($planeten_id) {
		foreach(eigenschaften::$frachter_ids as $frachter_id) {
			$route = @mysql_query("SELECT routing_id, routing_status FROM skrupel_schiffe 
				WHERE id='$frachter_id'");
			$route = @mysql_fetch_array($route);
			if($route == null || $route['routing_status'] == 0 || $route['routing_id'] == null 
			|| $route['routing_id'] == '' || $route['routing_id'] == "") continue;
			$route = $route['routing_id'];
			$planeten_ids = explode(':', $route);
			$routen_laenge = count($planeten_ids) - 2;
			if($planeten_ids[$routen_laenge] == $planeten_id) continue;
			$neue_route = array();
			foreach($planeten_ids as $id) {
				if($id != $planeten_id) $neue_route[] = $id;
			}
			$neue_route = implode(':', $neue_route);
			@mysql_query("UPDATE skrupel_schiffe SET routing_id='$neue_route' WHERE id='$frachter_id'");
		}
	}
	
	/**
	 * Ermittlet alle Datenbank-IDs von Planeten, die in einer Route eines Schiffs der KI ist.
	 * returns: Ein Array mit Datenbank-IDs von Planeten, die in einer Route sind.
	 */
	function ermittlePlanetenInRouten() {
		$planeten_in_routen = array();
		foreach(eigenschaften::$frachter_routen as $route) {
			foreach($route as $planeten_id) $planeten_in_routen[] = $planeten_id;
		}
		return $planeten_in_routen;
	}
	
	/**
	 * Ermittelt alle Routen von Frachtern und speichert diese als Arrays von Datenbank-IDs der Planeten 
	 * in eigenschaften::$frachter_routen.
	 */
	function ermittleRouten() {
		eigenschaften::$frachter_routen = array();
		foreach(eigenschaften::$frachter_ids as $frachter_id) {
			$route = @mysql_query("SELECT routing_id FROM skrupel_schiffe 
				WHERE (id='$frachter_id') AND (routing_status=2)");
			$route = @mysql_fetch_array($route);
			if($route != null) {
				$route = $route['routing_id'];
				$planeten_ids = explode(':', $route);
				eigenschaften::$frachter_routen[] = $planeten_ids;
			}
		}
	}
	
	/**
	 * Ermittelt die Anzahl der Routen, die den uebergebenen Planeten beliefern.
	 * arguments: $planeten_id - Die Datenbank-ID des Planeten, dessen Liefer-Routen ermittelt werden sollen.
	 * returns: Die Anzahl der Routen, die diesen Planeten mit Resourcen versorgen.
	 */
	function ermittleRoutenVonPlanet($planeten_id) {
		$planet_routen = 0;
		foreach(eigenschaften::$frachter_routen as $route) {
			//Es muss Minus 2 sein, da das letzte Array-Element null ist wegen explode().
			$routenlaenge = count($route)-2;
			if($route[$routenlaenge] == $planeten_id) $planet_routen++;
		}
		return $planet_routen;
	}
	
	/**
	 * Ermittelt alle Frachter, die Kolonisten geladen haben, bis auf den uebergebenen Frachter.
	 * arguments: $schiff_id - Die Datebank-ID des Schiffs, das ignoriert werden soll.
	 * returns: Alle Frachter mit Kolonisten (bis auf das uebergebene Schiff) als Array.
	 */
	static function ermittleAndereKolonieSchiffe($schiff_id) {
		$andere_kolo_schiffe = array();
		foreach(eigenschaften::$frachter_ids as $frachter_id) {
			$frachter_leute = @mysql_query("SELECT fracht_leute FROM skrupel_schiffe 
				WHERE (id='$frachter_id') AND (NOT (id='$schiff_id'))");
			$frachter_leute = @mysql_fetch_array($frachter_leute);
			$frachter_leute = $frachter_leute['fracht_leute'];
			if($frachter_leute >= eigenschaften::$frachter_kolo_infos->kolo_leute) 
				$andere_kolo_schiffe[] = $frachter_id;
		}
		return $andere_kolo_schiffe;
	}
	
	/**
	 * Belaedt das uebergebene Schiff mit Kolonisten, Vorraeten und Cantox. Die Mengen pro Planet, 
	 * der besiedelt werden soll, haengen von eigenschaften::$frachter_kolo_infos->kolo_cantox, 
	 * eigenschaften::$frachter_kolo_infos->kolo_leute und 
	 * eigenschaften::$frachter_kolo_infos->kolo_vorrat ab. Es wird ausserdem das Schiff betankt 
	 * und die Resourcen werden vom Planeten auch abgezogen. Ausserdem werden Resourcen nur fuer
	 * so viele Planeten beladen, bis der Frachtraum des Schiffs voll ist oder bis fuer soviele Kolonien 
	 * wie in eigenschaften::$frachter_kolo_infos->kolo_max_kolonien geladen wurde.
	 * Es findet keine Ueberpruefung statt, ob das Schiff bei einem Planeten ist!
	 * arguments: $schiff_id - Die Datenbank-ID des zu beladenen Schiffs.
	 */
	function beladeKolonieSchiff($schiff_id) {
		$schiff_infos = @mysql_query("SELECT kox, koy, frachtraum FROM skrupel_schiffe WHERE id='$schiff_id'");
		$schiff_infos = @mysql_fetch_array($schiff_infos);
		$x_pos = $schiff_infos['kox'];
		$y_pos = $schiff_infos['koy'];
		$frachtraum = $schiff_infos['frachtraum'];
		$spiel_id = eigenschaften::$spiel_id;
		$resourcen = @mysql_query("SELECT kolonisten, cantox, vorrat, id FROM skrupel_planeten 
			WHERE (x_pos='$x_pos') AND (y_pos='$y_pos') AND (spiel='$spiel_id')");
		$resourcen = @mysql_fetch_array($resourcen);
		$planeten_id = $resourcen['id'];
		$leute_max = ($resourcen['kolonisten'] / 2) + 1000;
		$max_kolonien_leute = eigenschaften::$frachter_kolo_infos->kolo_leute 
							  * eigenschaften::$frachter_kolo_infos->kolo_max_kolonien;
		if($leute_max > $max_kolonien_leute) $leute_max = $max_kolonien_leute;
		$fracht_cantox = 0; 
		$fracht_leute = 0; 
		$fracht_vorrat = 0;
		$noch_mehr = true;
		while($noch_mehr) {
			$fracht_cantox += eigenschaften::$frachter_kolo_infos->kolo_cantox;
			$fracht_leute += eigenschaften::$frachter_kolo_infos->kolo_leute;
			$fracht_vorrat += eigenschaften::$frachter_kolo_infos->kolo_vorrat;
			if((($fracht_leute / 100) + $fracht_vorrat) > $frachtraum 
			|| ($fracht_leute > $leute_max) 
			|| ($fracht_cantox > $resourcen['cantox']) 
			|| ($fracht_vorrat > $resourcen['vorrat'])) {
				$fracht_cantox = $fracht_cantox - eigenschaften::$frachter_kolo_infos->kolo_cantox;
				$fracht_leute = $fracht_leute - eigenschaften::$frachter_kolo_infos->kolo_leute;
				$fracht_vorrat = $fracht_vorrat - eigenschaften::$frachter_kolo_infos->kolo_vorrat;
				$noch_mehr = false;
			}
		}
		$this->tankeLeminStart($schiff_id, $planeten_id);
		@mysql_query("UPDATE skrupel_schiffe SET fracht_leute='$fracht_leute', fracht_cantox='$fracht_cantox', 
			fracht_vorrat='$fracht_vorrat' WHERE id='$schiff_id'");
		ki_basis::zieheResourcenAb("kolonisten", $fracht_leute, $planeten_id);
		ki_basis::zieheResourcenAb("cantox", $fracht_cantox, $planeten_id);
		ki_basis::zieheResourcenAb("vorrat", $fracht_vorrat, $planeten_id);
	}
	
	/**
	 * Der Planet, bei dem das uebergebene Schiff ist, wird kolonisiert, dh. es werden Kolonisten, Vorraete 
	 * und Cantox auf dem Planeten geladen (gemaess eigenschaften::$frachter_kolo_infos->kolo_leute, 
	 * eigenschaften::$frachter_kolo_infos->kolo_vorrat und 
	 * eigenschaften::$frachter_kolo_infos->kolo_cantox). Ausserdem wird das Schiff betankt. Sind noch 
	 * genuegend Leute fuer weitere Planeten im Frachtraum, so wird zum naechsten unbewohnten Planeten 
	 * geflogen. Sonst wird zum naechsten wichtigen Planeten geflogen.
	 * arguments: $schiff_id - Die Datenbank-ID des Schiffs, das kolonisiert.
	 */
	function kolonisierePlanet($schiff_id) {
		$schiff_infos = @mysql_query("SELECT kox, koy, fracht_leute, fracht_cantox, fracht_vorrat 
			FROM skrupel_schiffe WHERE id='$schiff_id'");
		$schiff_infos = @mysql_fetch_array($schiff_infos);
		$spiel_id = eigenschaften::$spiel_id;
		$schiff_x = $schiff_infos['kox'];
		$schiff_y = $schiff_infos['koy'];
		$schiff_leute = $schiff_infos['fracht_leute'];
		$schiff_cantox = $schiff_infos['fracht_cantox'];
		$schiff_vorrat = $schiff_infos['fracht_vorrat'];
		$planeten_id = @mysql_query("SELECT id FROM skrupel_planeten 
			WHERE (x_pos='$schiff_x') AND (y_pos='$schiff_y') AND (spiel='$spiel_id')");
		$planeten_id = @mysql_fetch_array($planeten_id);
		$planeten_id = $planeten_id['id'];
		if($schiff_leute >= eigenschaften::$frachter_kolo_infos->kolo_leute 
		&& $schiff_cantox >= 10 && $schiff_vorrat >= 1) {
			$kolo_leute = eigenschaften::$frachter_kolo_infos->kolo_leute;
			$kolo_cantox = eigenschaften::$frachter_kolo_infos->kolo_cantox;
			$kolo_vorrat = eigenschaften::$frachter_kolo_infos->kolo_vorrat;
			//Falls das Schiff zB. durch Piraten  beraubt wurde, so wird hier vermieden, dass Frachter auf einmal 
			//negative Resourcen haben.
			if($schiff_cantox < eigenschaften::$frachter_kolo_infos->kolo_cantox) $kolo_cantox = $schiff_cantox;
			if($schiff_vorrat < eigenschaften::$frachter_kolo_infos->kolo_vorrat) $kolo_vorrat = $schiff_vorrat;
			$comp_id = eigenschaften::$comp_id;
			@mysql_query("UPDATE skrupel_planeten SET kolonisten_new='$kolo_leute', cantox='$kolo_cantox', 
				vorrat='$kolo_vorrat', kolonisten_spieler='$comp_id' WHERE id='$planeten_id'");
			$leute = $schiff_leute - eigenschaften::$frachter_kolo_infos->kolo_leute;
			$cantox = $schiff_cantox - eigenschaften::$frachter_kolo_infos->kolo_cantox;
			$vorrat = $schiff_vorrat - eigenschaften::$frachter_kolo_infos->kolo_vorrat;
			//Hier wird nochmals sicher gestellt, dass Frachter keine negativen Resourcen bekommen.
			if($cantox < 0) $cantox = 0;
			if($vorrat < 0) $vorrat = 0;
			@mysql_query("UPDATE skrupel_schiffe SET fracht_leute='$leute', fracht_cantox='$cantox', 
				fracht_vorrat='$vorrat' WHERE id='$schiff_id'");
		}
		$this->tankeLemin($schiff_id, $planeten_id);
		eigenschaften::$kolonien_ids[] = $planeten_id;
		$schiff_leute = @mysql_query("SELECT fracht_leute FROM skrupel_schiffe WHERE id='$schiff_id'");
		$schiff_leute = @mysql_fetch_array($schiff_leute);
		if($schiff_leute['fracht_leute'] < eigenschaften::$frachter_kolo_infos->kolo_leute || $schiff_cantox < 10 
		|| $schiff_vorrat == 0) 
			$this->zuWichtigenPlaneten($schiff_id);
		else $this->fliegeKolonieSchiff($schiff_id);
	}
	
	/**
	 * Fliegt das uebegebene Schiff zum naechsten unbewohnten Planeten in Sichtweite. Dabei werden keine 
	 * Planeten angeflogen, die schon als nicht lohnend identifiziert wurden.
	 * arguments: $schiff_id - Die Datenbank-ID des zu fliegenden Schiffs.
	 */
	static function fliegeKolonieSchiff($schiff_id) {
		$start = @mysql_query("SELECT kox, koy FROM skrupel_schiffe WHERE id='$schiff_id'");
		$start = @mysql_fetch_array($start);
		$x_start = $start['kox'];
		$y_start = $start['koy'];
		$antrieb_stufe = schiffe_basis::ermittleMaximumWarp($schiff_id);
		$schlechte_planeten = ki_basis::ermittleSchlechtePlaneten();
		$ausnahmen = array_merge(eigenschaften::$kolonien_ids, $schlechte_planeten);
		$spiel_id = eigenschaften::$spiel_id;
		$comp_id = eigenschaften::$comp_id;
		$min_kolo = eigenschaften::$frachter_kolo_infos->kolo_leute;
		$planeten = @mysql_query("SELECT p.id FROM skrupel_planeten p WHERE (p.spiel='$spiel_id') 
			AND (p.besitzer=0) AND (EXISTS (SELECT * FROM skrupel_schiffe s WHERE (s.zielid=p.id) 
			AND (s.besitzer='$comp_id') AND (s.fracht_leute >= '$min_kolo')))");
		while($planet = @mysql_fetch_array($planeten)) {
			$ausnahmen[] = $planet['id'];
		}
		$naher_planet = ki_basis::ermittleNahenPlaneten($x_start, $y_start, $ausnahmen, false, true);
		schiffe_basis::fliegeSchiff($schiff_id, $naher_planet['x'], $naher_planet['y'], 
			$antrieb_stufe, $naher_planet['id']);
	}
}
?>
Return current item: Skrupel KI