Location: PHPKode > projects > Skrupel KI > skrupelki/ki_basis/sternenbasen_basis/basen_schiffbau_basis.php
<?php
/**
 * Autor: Wasserleiche (hide@address.com) 
 * 
 * Abstrakte Oberklasse fuer den Bau von Schiffen.
 */
abstract class basen_schiffbau_basis {
	
	/**
	 * Baut ein neues Schiff an der Sternenbasis des uebergebenen Planeten.
	 * arguments: $planeten_id - Die Datenbank-ID des Planeten, an dessen Sternenbasis ein Schiff 
	 * 			  gebaut werden soll.
	 */
	abstract static function baueNeuesSchiff($planeten_id);
	
	/**
	 * Ermittelt alle Klassen-Informationen als Array zur uebergebenen Klassen-ID der uebergebenen Rasse.
	 * arguments: $klassen_id - Die Klassen-ID des Schiffs, dessen Informationen gesucht sind.
	 * 			  $rasse - Die Rasse des gesuchten Schiffs.
	 * returns: Ein Array der Klassen-Informationen des gesuchten Schiffs.
	 * 			null, falls es das gesucht Schiff nicht verfuegbar ist.
	 */
	static function ermittleSchiffArray($klassen_id, $rasse) {
		foreach(eigenschaften::$schiff_arrays as $schiff_array) {
			$rasse_index = count($schiff_array) - 1;
			$volk = $schiff_array[$rasse_index];
			if($klassen_id == $schiff_array[1] && $rasse == $volk) return $schiff_array;
		}
		return null;
	}
	
	/**
	 * Ermittelt die Kosten fuer den Bau von einer Menge von Antrieben fuer einen bestimmten Antriebs-Level.
	 * arguments: $antriebe - Die Anzahl der Antriebe, deren Kosten ermittelt werden sollen.
	 * 			  $antriebs_level - Die Stufe der Antriebe, deren Kosten ermittelt werden sollen.
	 */
	static function ermittleAntriebsKosten($antriebe, $antriebs_level) {
		$kosten_cantox = 0;
		$kosten_min1 = 0;
		$kosten_min2 = 0;
		$kosten_min3 = 0;
		$antriebs_level--;
		if($antriebs_level >= 8) $antriebs_level--;
		for($k=1; $k<=$antriebe; $k++) {
			$kosten_cantox += eigenschaften::$basen_schiffbau_infos->antriebs_kosten[0][$antriebs_level];
			$kosten_min1 += eigenschaften::$basen_schiffbau_infos->antriebs_kosten[1][$antriebs_level];
			$kosten_min2 += eigenschaften::$basen_schiffbau_infos->antriebs_kosten[2][$antriebs_level];
			$kosten_min3 += eigenschaften::$basen_schiffbau_infos->antriebs_kosten[3][$antriebs_level];
		}
		return array($kosten_cantox, $kosten_min1, $kosten_min2, $kosten_min3);
	}
	
	/**
	 * Ermittelt die Kosten fuer den Bau von einer Menge von Energetik-Waffen fuer einen bestimmten 
	 * Energetik-Level.
	 * arguments: $waffen - Die Anzahl der Energetik-Waffen, deren Kosten ermittelt werden sollen.
	 * 			  $energetik_level - Die Stufe der Energetik, deren Kosten ermittelt werden sollen.
	 * returns: Die Kosten (in Cantox) fuer die Energetik.
	 */
	static function ermittleEnergetikKosten($waffen, $energetik_level) {
		$kosten_cantox = 0;
		$kosten_min1 = 0;
		$kosten_min2 = 0;
		$kosten_min3 = 0;
		$energetik_level--;
		for($n=1; $n<=$waffen; $n++) {
			$kosten_cantox += eigenschaften::$basen_schiffbau_infos->energetik_kosten[0][$energetik_level];
			$kosten_min1 += eigenschaften::$basen_schiffbau_infos->energetik_kosten[1][$energetik_level];
			$kosten_min2 += eigenschaften::$basen_schiffbau_infos->energetik_kosten[2][$energetik_level];
			$kosten_min3 += eigenschaften::$basen_schiffbau_infos->energetik_kosten[3][$energetik_level];
		}
		return array($kosten_cantox, $kosten_min1, $kosten_min2, $kosten_min3);
	}
	
	/**
	 * Ermittelt die Kosten fuer den Bau von einer Menge von Projektil-Waffen fuer einen bestimmten 
	 * Projektil-Level.
	 * arguments: $waffen - Die Anzahl der Projektil-Waffen, deren Kosten ermittelt werden sollen.
	 * 			  $projektil_level - Die Stufe der Projektil, deren Kosten ermittelt werden sollen.
	 * returns: Die Kosten (in Cantox) fuer die Projektil.
	 */
	static function ermittleProjektilKosten($waffen, $projektil_level) {
		$kosten_cantox = 0;
		$kosten_min1 = 0;
		$kosten_min2 = 0;
		$kosten_min3 = 0;
		$projektil_level--;
		for($i=1; $i<=$waffen; $i++) {
			$kosten_cantox += eigenschaften::$basen_schiffbau_infos->projektil_kosten[0][$projektil_level];
			$kosten_min1 += eigenschaften::$basen_schiffbau_infos->projektil_kosten[1][$projektil_level];
			$kosten_min2 += eigenschaften::$basen_schiffbau_infos->projektil_kosten[2][$projektil_level];
			$kosten_min3 += eigenschaften::$basen_schiffbau_infos->projektil_kosten[3][$projektil_level];
		}
		return array($kosten_cantox, $kosten_min1, $kosten_min2, $kosten_min3);
	}
	
	/**
	 * Ermittelt die naechste Nummer fuer den Namen des naechsten Schiffs, das gebaut wird. Dabei soll kein Name 
	 * doppelt vorkommen (was sonst moeglich waere durch zerstoerte Schiffe), sodass jedes Schiff eine eigene 
	 * Nummer hat. Es werden vorhandene als auch im Bau befindliche Schiffe beruecksichtigt.
	 * returns: Die naechste Nummer fuer den Namen eines neuen Schiffs.
	 */
	static function ermittleNaechsteSchiffNummer() {
		$spiel_id = eigenschaften::$spiel_id;
		$comp_id = eigenschaften::$comp_id;
		$namen = @mysql_query("SELECT name FROM skrupel_schiffe WHERE (besitzer='$comp_id') 
			AND (spiel='$spiel_id')");
		$schiff_nummern = array();
		$syntax_laenge = strlen(eigenschaften::$basen_schiffbau_infos->schiff_namen_synax);
		while($name = @mysql_fetch_array($namen)) {
			$name = $name['name'];
			$namen_laenge = strlen($name);
			$nummer_laenge = $namen_laenge - $syntax_laenge;
			$nummer = substr($name, $syntax_laenge, $nummer_laenge);
			$schiff_nummern[] = $nummer;
		}
		$namen = @mysql_query("SELECT schiffbau_name FROM skrupel_sternenbasen WHERE (besitzer='$comp_id') 
			AND (spiel='$spiel_id') AND (schiffbau_status=1)");
		while($name = @mysql_fetch_array($namen)) {
			$name = $name['schiffbau_name'];
			$namen_laenge = strlen($name);
			$nummer_laenge = $namen_laenge - $syntax_laenge;
			$nummer = substr($name, $syntax_laenge, $nummer_laenge);
			$schiff_nummern[] = $nummer;
		}
		$namen_anzahl = count($schiff_nummern);
		if($namen_anzahl == 0) return 1;
		$bekannte_nummern = array();
		for($i=0; $i < $namen_anzahl; $i++) {
			if(!(in_array($schiff_nummern[$i], $bekannte_nummern))) $bekannte_nummern[] = $schiff_nummern[$i];
		}
		sort($bekannte_nummern);
		if($bekannte_nummern[0] != 1) return 1;
		for($i=0; $i < count($bekannte_nummern); $i++) {
			$aktuelle_nummer = $bekannte_nummern[$i];
			if($aktuelle_nummer != $i+1) return $bekannte_nummern[$i] - 1;
		}
		return count($bekannte_nummern) + 1;
	}
	
	/**
	 * Gibt ein Schiff in einer Sternenbasis in Auftrag, damit es in der naechsten Runde verfuegbar ist.
	 * arguments: $schiff_array - Ein Array mit Informationen des zu bauenden Schiffs aus schiffe.txt.
	 * 			  $rasse - Die Rasse, der das zu bauende Schiff angehoert.
	 * 			  $planeten_id - Die Datenbank-ID des Planeten, an dessen Sternenbasis das Schiff gebaut 
	 * 							 werden soll.
	 * 			  $energetik_stufe - Die Energetik-Stufe der Waffen, die das Schiff haben soll.
	 * 			  $projektile_stufe - Die Projektil-Stufe der Waffen, die das Schiff haben soll.
	 * 			  $antrieb_stufe - Die Antriebs-Stufe, die das Schiff haben soll.
	 */
	static function stelleSchiffAuftrag($schiff_array, $planeten_id, $rasse, 
								$energetik_stufe,  $projektile_stufe, $antrieb_stufe) {
		$schiff_name = eigenschaften::$basen_schiffbau_infos->schiff_namen_synax;
		$schiff_nummer = self::ermittleNaechsteSchiffNummer();
		$schiff_name = $schiff_name.$schiff_nummer;
		@mysql_query("UPDATE skrupel_sternenbasen SET schiffbau_status=1, schiffbau_klasse ='$schiff_array[1]', 
				schiffbau_bild_gross ='$schiff_array[3]', schiffbau_tank='$schiff_array[13]', 
				schiffbau_bild_klein ='$schiff_array[4]', schiffbau_crew='$schiff_array[15]', 
				schiffbau_masse='$schiff_array[16]', schiffbau_fracht='$schiff_array[12]', 
				schiffbau_antriebe='$schiff_array[14]', schiffbau_energetik='$schiff_array[9]', 
				schiffbau_projektile='$schiff_array[10]', schiffbau_hangar='$schiff_array[11]', 
				schiffbau_klasse_name='$schiff_array[0]', schiffbau_rasse='$rasse', 
				schiffbau_fertigkeiten='$schiff_array[17]', schiffbau_techlevel='$schiff_array[2]', 
				schiffbau_energetik_stufe='$energetik_stufe', schiffbau_antriebe_stufe='$antrieb_stufe', 
				schiffbau_projektile_stufe='$projektile_stufe', schiffbau_name='$schiff_name' 
				WHERE planetid='$planeten_id'");
	}
	
	/**
	 * Baut das uebergebene Schiff an der Sternenbasis des uebergebenen Planten. Zu erst werden die Resourcen 
	 * des Planeten fuer den Bau des Rumpfes ueberprueft. Sind diese Ausreichend, wird ueberprueft, ob die 
	 * Resourcen fuer die Antriebe ausreichen (gegebenenfalls wird eine niedrigere Antriebsstufe gebaut, 
	 * gemaess antrieb_toleranz_limit). Sind diese auch ausreichend, werden die Resourcen fuer die 
	 * Waffensysteme ueberprueft (und gegebenenfalls wird eine niedrigere Waffenstufe gebaut, gemaess 
	 * waffen_toleranz_limit). Sind alle Resourcen verfuegbar, wird das Schiff in Auftrag gegeben.
	 * arguments: $planeten_id - Die Datenbank-ID des Planeten, auf dessen Sternenbasis das Schiff gebaut 
	 * 							 werden soll.
	 * 			  $klassen_id - Die Klassen-ID des zu bauenden Schiffs.
	 * 			  $rasse - Die Rasse, der das Schiff angehoert.
	 * 			  $min_waffen - true, wenn das zu bauende Schiff die schwaechsten Waffen erhalten soll. 
	 * 							false, sonst.
	 * 			  $min_antrieb - true, wenn das zu bauende Schiff den langsamsten Antrieb erhalten soll. 
	 * 							 false, sonst.
	 * returns: true - Falls das Schiff erfolgreich in Auftrag gegeben wurde (Dh. alle Resourcen fuer den Bau 
	 * 				   sind ausreichend und wurden vom Planeten abgezogen).
	 * 			false - Falls die Resourcen fuer den Rumpf, die Antriebe oder die Waffensysteme nicht 
	 * 					ausreichen oder	ein andere Fehler aufgetreten ist.
	 */
	static function baueSchiff($planeten_id, $klassen_id, $rasse, $min_waffen, $min_antrieb) {
		$schiff_array = self::ermittleSchiffArray($klassen_id, $rasse);
		$cantox = ki_basis::ermittleResource($planeten_id, "cantox");
		$min1 = ki_basis::ermittleResource($planeten_id, "min1");
		$min2 = ki_basis::ermittleResource($planeten_id, "min2");
		$min3 = ki_basis::ermittleResource($planeten_id, "min3");
		//Reichen die Resourcen des Planeten schon fuer den Bau des Rumpfes nicht, wird abgebrochen.
		if($cantox < $schiff_array[5] 
		|| $min1 < $schiff_array[6] 
		|| $min2 < $schiff_array[7] 
		|| $min3 < $schiff_array[8]) return false;
		$antrieb_cantox = 0; $antrieb_min1 = 0; $antrieb_min2 = 0; $antrieb_min3 = 0;
		$antrieb_stufe = 0;
		//Hier wird unterschieden, ob der minimale Antrieb verwendet werden soll (zB. bei 
		//Schiffen mit Subpartikelcluster oder Quarksreorganistor).
		if($min_antrieb) {
			$antrieb_stufe = 1;
			$antriebs_kosten = self::ermittleAntriebsKosten($schiff_array[14], $antrieb_stufe);
			$antrieb_cantox = $antriebs_kosten[0]; $antrieb_min1 = $antriebs_kosten[1];
			$antrieb_min2 = $antriebs_kosten[2]; $antrieb_min3 = $antriebs_kosten[3];
			if(!($cantox >= $schiff_array[5] + $antrieb_cantox) 
			|| !($min1 >= $schiff_array[6] + $antrieb_min1) 
			|| !($min2 >= $schiff_array[7] + $antrieb_min2) 
			|| !($min3 >= $schiff_array[8] + $antrieb_min3)) 
				return false;
		} else {
			//Diese Schleife realisiert das Toleranz-Niveau fuer den Bau der Antriebe.
			for($n=0; $n <= eigenschaften::$basen_schiffbau_infos->antrieb_toleranz_limit; $n++) {
				$antrieb_stufe = sternenbasen_basis::ermittleTechLevel($planeten_id, "t_antrieb") - $n;
				$antriebs_kosten = self::ermittleAntriebsKosten($schiff_array[14], $antrieb_stufe);
				$antrieb_cantox = $antriebs_kosten[0]; $antrieb_min1 = $antriebs_kosten[1];
				$antrieb_min2 = $antriebs_kosten[2]; $antrieb_min3 = $antriebs_kosten[3];
				if(($cantox >= $schiff_array[5] + $antrieb_cantox) 
				&& ($min1 >= $schiff_array[6] + $antrieb_min1) 
				&& ($min2 >= $schiff_array[7] + $antrieb_min2) 
				&& ($min3 >= $schiff_array[8] + $antrieb_min3)) break;
				else {
					$antrieb_cantox = 0; $antrieb_min1 = 0;
					$antrieb_min2 = 0; $antrieb_min3 = 0;
				}
			}
		}
		//Sind die Kosten alle 0, so wurde kein Antrieb gefunden, der bezahlbar ist.
		if($antrieb_cantox == 0 && $antrieb_min1 == 0 
		&& $antrieb_min2 == 0 && $antrieb_min3 == 0) return false;
		
		$energetik_cantox = 0; $energetik_min1 = 0; $energetik_min2 = 0; $energetik_min3 = 0;
		$energetik_stufe = 0;
		//Hier werden die Energetik-Waffen gebaut.
		if($schiff_array[9] > 0) {
			//Hier wird unterschieden, ob die minimalen Energetik-Waffen verwendet werden soll 
			//(zB. bei Schiffen mit Subpartikelcluster oder Quarksreorganistor oder auch Frachtern).
			if($min_waffen) {
				$energetik_stufe = 1;
				$energetik_kosten = self::ermittleEnergetikKosten($schiff_array[9], $energetik_stufe);
				$energetik_cantox = $energetik_kosten[0]; $energetik_min1 = $energetik_kosten[1]; 
				$energetik_min2 = $energetik_kosten[2]; $energetik_min3 = $energetik_kosten[3];
				if(!($cantox - $antrieb_cantox - $schiff_array[5] >= $energetik_cantox) 
				|| !($min1 - $antrieb_min1 - $schiff_array[6] >= $energetik_min1) 
				|| !($min2 - $antrieb_min2 - $schiff_array[7] >= $energetik_min2) 
				|| !($min3 - $antrieb_min3 - $schiff_array[8] >= $energetik_min3)) 
					return false;
			} else {
				//Diese Schleife realisiert das Toleranz-Niveau fuer den Bau der Energie-Waffen.
				for($n=0; $n <= eigenschaften::$basen_schiffbau_infos->waffen_toleranz_limit; $n++) {
					$energetik_stufe = sternenbasen_basis::ermittleTechLevel($planeten_id, "t_energie") - $n;
					$energetik_kosten = self::ermittleEnergetikKosten($schiff_array[9], $energetik_stufe);
					$energetik_cantox = $energetik_kosten[0]; $energetik_min1 = $energetik_kosten[1]; 
					$energetik_min2 = $energetik_kosten[2]; $energetik_min3 = $energetik_kosten[3];
					if(($cantox - $antrieb_cantox - $schiff_array[5] >= $energetik_cantox) 
					&& ($min1 - $antrieb_min1 - $schiff_array[6] >= $energetik_min1) 
					&& ($min2 - $antrieb_min2 - $schiff_array[7] >= $energetik_min2) 
					&& ($min3 - $antrieb_min3 - $schiff_array[8] >= $energetik_min3)) break;
					else {
						$energetik_cantox = 0; $energetik_min1 = 0; 
						$energetik_min2 = 0; $energetik_min3 = 0;
					}
				}
				//Sind die Kosten alle 0, so wurde keine Energetik-Waffe gefunden, der bezahlbar ist.
				if($energetik_cantox == 0 && $energetik_min1 == 0 
				&& $energetik_min2 == 0 && $energetik_min3 == 0) return false;
			}
		}
		
		$projektil_cantox = 0; $projektil_min1 = 0; $projektil_min2 = 0; $projektil_min3 = 0;
		$projektil_stufe = 0;
		//Hier werden die Projektil-Waffen gebaut.
		if($schiff_array[10] > 0) {
			//Hier wird unterschieden, ob die minimalen Projektil-Waffen verwendet werden soll 
			//(zB. bei Schiffen mit Subpartikelcluster oder Quarksreorganistor oder auch Frachtern)
			if($min_waffen) {
				$projektil_stufe = 1;
				$projektil_kosten = self::ermittleProjektilKosten($schiff_array[10], $projektil_stufe);
				$projektil_cantox = $projektil_kosten[0]; $projektil_min1 = $projektil_kosten[1]; 
				$projektil_min2 = $projektil_kosten[2]; $projektil_min3 = $projektil_kosten[3];
				if(!($cantox - $antrieb_cantox - $energetik_cantox - $schiff_array[5] >= $projektil_cantox) 
				|| !($min1 - $antrieb_min1 - $energetik_min1 - $schiff_array[6] >= $projektil_min1) 
				|| !($min2 - $antrieb_min2 - $energetik_min2 - $schiff_array[7] >= $projektil_min2) 
				|| !($min3 - $antrieb_min3 - $energetik_min3 - $schiff_array[8] >= $projektil_min3))
					return false;
			} else {
				//Diese Schleife realisiert das Toleranz-Niveau fuer den Bau der Projektil-Waffen.
				for($n=0; $n <= eigenschaften::$basen_schiffbau_infos->waffen_toleranz_limit; $n++) {
					$projektil_stufe = sternenbasen_basis::ermittleTechLevel($planeten_id, "t_explosiv") - $n;
					$projektil_kosten = self::ermittleProjektilKosten($schiff_array[10], $projektil_stufe);
					$projektil_cantox = $projektil_kosten[0]; $projektil_min1 = $projektil_kosten[1]; 
					$projektil_min2 = $projektil_kosten[2]; $projektil_min3 = $projektil_kosten[3];
					if(($cantox - $antrieb_cantox - $energetik_cantox - $schiff_array[5] >= $projektil_cantox) 
					&& ($min1 - $antrieb_min1 - $energetik_min1 - $schiff_array[6] >= $projektil_min1) 
					&& ($min2 - $antrieb_min2 - $energetik_min2 - $schiff_array[7] >= $projektil_min2) 
					&& ($min3 - $antrieb_min3 - $energetik_min3 - $schiff_array[8] >= $projektil_min3)) break;
					else {
						$projektil_cantox = 0; $projektil_min1 = 0;
						$projektil_min2 = 0; $projektil_min3 = 0;
					}
				}
				//Sind die Kosten alle 0, so wurde keine Projektil-Waffe gefunden, der bezahlbar ist.
				if($projektil_cantox == 0 && $projektil_min1 == 0 
				&& $projektil_min2 == 0 && $projektil_min3 == 0) return false;
			}
		}
		
		//Jetzt werden die Resourcen fuer den Bau des Rumpfes, der Antriebe und der Waffen vom
		//Planeten abgezogen.
		ki_basis::zieheResourcenAb("cantox", 
					$schiff_array[5] + $antrieb_cantox + $projektil_cantox + $energetik_cantox, $planeten_id);
		ki_basis::zieheResourcenAb("min1", 
					$schiff_array[6] + $antrieb_min1 + $projektil_min1 + $energetik_min1, $planeten_id);
		ki_basis::zieheResourcenAb("min2", 
					$schiff_array[7] + $antrieb_min2 + $projektil_min2 + $energetik_min2, $planeten_id);
		ki_basis::zieheResourcenAb("min3", 
					$schiff_array[8] + $antrieb_min3 + $projektil_min3 + $energetik_min3, $planeten_id);
		
		self::stelleSchiffAuftrag($schiff_array, $planeten_id, $rasse, $energetik_stufe, $projektil_stufe, 
								  $antrieb_stufe);
		return true;
	}
}
?>
Return current item: Skrupel KI