PHost - FormelnPHost 4.1h |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Docs v4.x
|
InhaltEinleitungDieses Dokument beschreibt alle Formeln und Abläufe des PHost. Spieler, die nichts dem Zufall überlassen, können hier genau planen. Wenn du denkst, dass ein Aspekt des Hostlaufes dokumentiert werden sollte, schreib eine Mail an die PHost-Gruppe. Dieses Dokument ist nach dem Hauptdarsteller einer Aktion gruppiert. Beispielsweise betrifft die Mission Pillage Planeten und ist daher bei den Planeten einsortiert. Nach Möglichkeit sind die Formeln in der Reihenfolge aufgelistet, wie sie während des Hostlaufs benötigt werden. Die genaue Reihenfolge aller Ereignisse ist auf der Seite zum Hostablauf beschrieben. NotationVariablennamen (Hull_mass, Native_race, ...) sollten selbsterklärend sein. Wir benutzen die allgemeine mathematische Notation, insbesondere ist / die normale Division (gebrochene Zahlen). Konfigurationseinträge werden direkt aufgeführt, mit Links zu ihrer Beschreibung. Eff_ConfigOption bezeichnet den Wert einer ConfigOption, mit den entsprechenden Modifikatoren EModConfigOption entsprechend der Erfahrung des Schiffes. Intern rechnet PHost oft mit Personen-Zahlen, wie sie auch in der alten Dokumentation verwendet wurden. In diesem Dokument wurden die Zahlen oftmals in die bekannteren Clans umgewandelt. Da VGA Planets keine "halben" Clans handhaben kann, rundet PHost sowieso nach jedem Schritt. Einige Formeln nutzen dennoch weiterhin Personenzahlen. In diesen ist Colonist_clans die Anzahl Clans (z.B. 32), Colonists die Anzahl Personen (z.B. 3200). Wenn eine Folge von "wenn..."-Sätzen angegeben ist, gilt der erste, der zutrifft.
AllgemeinScore (Punktestand)PHost erstellt eine Datei score.log, in der die Spieler nach der Standard-Punktwertung aufgeführt sind. Diese einfache Wertung wird wie folgt ermittelt: Score = Num_planets * 10 + Num_capital_ships * 10 + Num_freighters + Num_starbases * 120 Als Capital ship zählt jedes Schiff mit mindestens einer Waffe, sei es ein Outrider mit einem Laser, oder ein bis zu den Zähnen bewaffneter Todesstern. Viele Client-Programme zeigen ebenfalls diese Punktwertung an. Sie ermitteln die Punkte aus den Num_planets-Werten usw., die in den Result-Dateien abgelegt sind. Wenn ScoringMethod auf None gesetzt ist, sendet PHost nicht alle diese Werte, so dass falsche Punktestände angezeigt werden. Folgende Werte werden bei ScoringMethod=None übertragen:
Diese Werte berücksichtigen die Fernsteuerung. Damit können sie sich von der Anzahl Einheiten unterscheiden, die du tatsächlich im Result findest. Wenn du beispielsweise 20 Schiffe hast und weitere 5 fernsteuerst, enthält dein RST 25 Schiffe, für den Punktestand enthält Num_ships aber nur deine eigenen 20. PlanetenÜbersicht über Aktionen auf PlanetenDiese Tabelle zeigt alle Aktionen, die einen Planeten betreffen. Auf der linken Seite stehen die Schritte des Hostablaufes in chronologischer Reihenfolge. Die mittlere Spalte enthält Aktionen, die die Bevölkerung und deren Zufriedenheit betreffen (wie "Besteuerung findet vor der Vermehrung statt"), die rechte Spalte enthält alle Aktionen, die die Mineralienvorräte und Gebäude betreffen (wie "Beam-Up-Multiple passiert vor lfm" (hint, hint)). Die letzte Spalte, "Details", verweist auf den relevanten Abschnitt dieses Dokuments, falls vorhanden.
Gebäude-LimitsMaximale Anzahl Gebäude: Die maximale Anzahl Gebäude, die du auf einem Planeten bauen kannst, hängt von der Bevölkerung des Planeten ab. Maximum_mines = Colonist_clans ...wenn Colonist_clans < 200 Round(200 + Sqrt(Colonist_clans - 200)) ...wenn Colonist_clans >= 200 Maximum_factories = Colonist_clans ...wenn Colonist_clans < 100 Round(100 + Sqrt(Colonist_clans - 100)) ...wenn Colonist_clans >= 100 Maximum_defense_posts = Colonist_clans ...wenn Colonist_clans < 50 Round(50 + Sqrt(Colonist_clans - 50)) ...wenn Colonist_clans >= 50 Du musst diese Bedingungen nicht ständig erfüllen. Du kannst Fabriken bauen und nachher Kolonisten auf ein Schiff laden, PHost berücksichtigt diese Möglichkeit beim Überprüfen von Bauanweisungen. Gebäude oberhalb des durch die Bevölkerung des Planeten entstehenden Limits verfallen dann jedoch mit der in StructureDecayPerTurn angegebenen Geschwindigkeit. Meteor-EinschlägeGroße Meteore töten Einwohner und machen sie unglücklich. Meteoritenhagel beeinflussen die Bevölkerung nicht. Colonists_survived = Colonists * (Random(91)+10) / 100 Colonist_happiness_change = -(Random(31) + 50) Natives_survived = Natives * (Random(100)+1) / 100 Native_happiness_change = -(Random(31) + 50) Einfach ausgedrückt sterben bis zu 90% der Kolonisten und bis zu 99% der Eingeborenen, sie verlieren dabei 50 bis 80 Happiness-Punkte. Die Mineralienmengen, die dem Planetenkern (nicht der Oberfläche!) hinzugefügt werden, können konfiguriert werden (LargeMeteorOreRanges, MeteorShowerOreRanges). BodenkampfBodenkampf findet statt, wenn ein feindlich gesinntes Schiff mit dem Schiff-Planet-Transporter auf einem fremden Planeten Kolonisten ablädt. Im Bodenkampf töten sich Angreifer und Verteidiger gegenseitig, entsprechend ihrer Angriffsstärken, bis nur noch eine Partei übrig bleibt. Ground_attack_result = "Angreifer siegt mit Trunc(Result/Attacker_rate) verbleibenden Clans" ...wenn Result >= 0 "Verteidiger siegt mit Trunc(-Result/Defender_rate) verbleibenden Clans" ...wenn Result < 0 ...mit Attacker_rate = GroundKillFactor[Ship_owner] Defender_rate = GroundDefenseFactor[Planet_owner] + Planet_defense / 20 Result = (Attacking_clans * Attacker_rate) - (Defending_clans * Defender_rate) Wenn das Ergebnis einen Sieg mit 0 verbleibenden Clans ergibt (möglicherweise durch Runden), ist der Planet nacher unbewohnt. Imperial Assault: Wenn ein erfolgreicher Imperial Assault ausgeführt wird, lautet das Ergebnis immer "Angreifer siegt mit Attacking_clans verbleibenden Clans", unabhängig von der Anzahl der Defending_clans und deren Angriffs- und Verteidigungsstärken. Imperial Assault ist erfolgreich, wenn die Voraussetzungen für die Anwendung der Schiffsfunktion Imperial Assault erfüllt sind. HissHiss hebt die Zufriedenheit auf dem Planeten an, sowohl für Kolonisten, als auch für Eingeborene um den gleichen Wert. Die Formel lautete bisher Hiss_happiness_change = Min(Number_of_hissing_ships, MaxShipsHissing) * HissEffectRate Seit PHost 4.1 ist HissEffectRate allerdings für jeden Spieler separat einstellbar (arrayized). Im allgemeinen Fall ist Hiss_happiness_change daher die Summer der HissEffectRaten der ersten MaxShipsHissing Schiffe, die an dem Planeten hissen. Diese können verschiedenen Spielern gehören, die verschiedene Hiss-Raten haben. Hiss findet vor der Besteuerung statt. Nachdem Hissen die Zufriedenheit angehoben hat, wird sie durch Besteuerung wieder gesenkt. Sensoren-AbtastungGebäude beeinflussen die Sichtbarkeit für fremde Sensoren. Industry_detection_chance = 0% ...wenn Mines < MinesForDetectable und Factories < FactoriesForDetectable 0% ...wenn Defense >= DefenseForUndetectable 100% - (Defense / DefenseForUndetectable * 100%) ...in allen anderen Fällen Industry_level_reported = "minimal" ...wenn (Mines + Factories) < 30 "leicht" ...wenn (Mines + Factories) < 60 "mäßig" ...wenn (Mines + Factories) < 90 "bedeutend" ...wenn (Mines + Factories) < 120 "stark" ...wenn (Mines + Factories) >= 120 Bioscan_detection_chance = 0% ...wenn Defense >= 20 0% ...wenn das Schiff keinen Bioscanner hat 100% ...wenn das Schiff den verbesserten Bioscanner hat 20% ...sonst Besondere AngriffePillage (plündern): Schiffe mit der Pillage-Mission plündern den Planeten, um Geld und Vorräte zu erhalten. Außerdem werden Einwohner getötet, die dadurch unglücklich werden. Supplies_made = Trunc((Colonist_clans + Native_clans) / 100) Money_made = Trunc((Colonist_clans + Native_clans) / 100) Colonist_clans_survived = Trunc(Colonist_clans * 0.8 - 20) Native_clans_survived = Trunc(Native_clans * 0.8 - 120) Colonist_happy_change = -10 Native_happy_change = -10 RGA: Schiffe mit der Rebel Ground Attack-Mission zerstören planetare Ressourcen. Sie töten Kolonisten, der Rest wird dadurch unglücklich. Die sarkastischen Ureinwohner freuen sich darüber. Money_remaining = Trunc(Money * 0.7) Supplies_remaining = Trunc(Supplies * 0.6) Defense_remaining = Trunc(Defense_posts * 0.8) Mines_remaining = Trunc(Mines * 0.4) Factories_remaining = Trunc(Factories * 0.7) Colonist_clans_survived = Trunc(Colonist_clans * 0.8) Colonist_happy_change = -60 Native_happy_change = +40 Planeten produzierenBergbau: Die maximale Mineralienmenge, die pro Zug abgebaut werden kann, hängt von der Dichte der Mineralien ab. Max_minerals_mined = Round(Mining_rate * Mine_count / 100) ...mit Mining_rate = Round(RaceMiningRate * Mineral_density / 100) * RF ...und RF = 2 für Reptilans, 1 sonst Minerals_mined = Min(Max_minerals_mined, Minerals_in_core) (v4.1:) PHost vor Version 4.1 nutzte hier Trunc statt Round. Die neue Formel ergibt immer etwas mehr Mineralien. Vorräte (Supplies): Fabriken und bovinoide Ureinwohner produzieren Vorräte. Supplies_made = Trunc((Factory_contribution + Bovinoid_contribution) * ProductionRate) / 100) ...mit Factory_contribution = Factories Bovinoid_contribution = Min(Trunc(Native_clans / 100), Colonist_clans) ...wenn Eingeborene Bovinoide sind 0 ...sonst Trans-Uran-Zerfall: Neue Mineralien bilden sich im Planetenkern. Beachte, dass das nach dem Bergbau passiert, so dass du die neuen Mineralien nicht direkt nutzen kannst. Trans-Uran-Zerfall findet für alle vier Mineralien separat statt. New_minerals_in_core = Trunc((TransuraniumDecayRate * Mineral_density + 50) / 100) Zufriedenheit (Happiness)Deine Steuerforderung ändert die Zufriedenheit der Bevölkerung. Beachte, dass die Änderung vor der eigentlichen Besteuerung erfolgt. Wenn die Zufriedenheit (Happiness) vor diesem Schritt unter 30 liegt, wird der Steuersatz auf 0% gesetzt (und die neue Zufriedenheit wird mit diesem Wert berechnet). Wenn die Zufriedenheit nach diesem Schritt unter 30 liegt, werden ebenfalls keine Steuern eingetrieben. Colonist_happiness_change = Trunc(10 - Sqrt(Colonist_clans / 10000) - Abs(Temperature - Target_temperature) / Temp_divisor - (Mines + Factories) / 300 - Colonist_tax * 0.8) ...mit Target_temperature = 100 und Temp_divisor = 66 wenn Kolonisten Crystals sind und CrystalsPreferDeserts eingeschaltet ist ...mit Target_temperature = 50 und Temp_divisor = 33 sonst Native_happiness_change = Trunc(5 + Native_gov_number / 2 - Sqrt(Native_clans / 10000) - (Mines + Factories) / 200 - Native_tax * 0.85) ...plus 10 wenn Eingeborene Avians sind Die Native_gov_numbers sind bei den Regeln zu Planeten aufgelistet (also 6 für Monarchie, so dass der erste Term dann 6/2 = 3 würde). Die Zufriedenheit der Bevölkerung wird so zusammengefasst: Happiness_level = "happy" ...wenn Happiness >= 90 "calm" ...wenn Happiness >= 70 "unhappy" ...wenn Happiness >= 50 "very angry" ...wenn Happiness >= 40 "rioting" ...wenn Happiness >= 20 "fighting" ...wenn Happiness < 20 Happiness_change_level = "hate you" ...wenn Happiness_change < -5 "angry about you" ...wenn Happiness_change < 0 "undecided" ...wenn Happiness_change = 0 "like your leadership" ...wenn Happiness_change <= 4 "love you" ...wenn Happiness_change >= 5 BesteuerungSteuern von Kolonisten und Eingeborenen werden eingesammelt. Taxes_collected = Taxes_from_colonists + Taxes_from_natives ...höchstens MaxPlanetaryIncome Taxes_from_colonists = Round(Round(Colonist_clans * Colonist_tax / 1000) * ColonistTaxRate / 100) ...wenn Colonist_happiness >= 30 0 ...wenn Colonist_happiness < 30 Taxes_from_natives = 0 ...wenn Native_happiness < 30 0 ...wenn Eingeborene Amorphe sind Round(Min(Colonist_clans, Natives_due) * IF * NativeTaxRate / 100) ...mit Natives_due = Round(Native_clans * Native_gov_number * Native_tax / 5000) ...mit IF = 2 bei insektoiden Eingeborenen, IF = 1 sonst Die Native_gov_number (z.B. 6 für Monarchy) ist in den Regeln zu Planeten tabelliert. BevölkerungswachstumMaximale Einwohnerzahl: Die maximale Bevölkerung eines Planeten ist konstant und hängt nur vom Klima ab. Wenn ClimateLimitsPopulation aktiviert ist, können auf einem Planeten der optimalen Temperatur 100000 Clans (10 Millionen Kolonisten) leben. Wenn entsprechend konfiguriert, können Vorräte (Supplies) genutzt werden, um mehr Kolonisten zu erlauben. Eff_max_colonist_clans = Trunc(Eff_max_colonists / 100) Eff_max_colonists = Max_colonists + Supply_bonus ...wenn ClimateLimitsPopulation eingeschaltet ist ...mindestens 1 25000000 ...sonst Max_colonists = Trunc(10000000 * Sin(Temperature * PI / 200)) ...wenn die Kolonisten Crystals sind und CrystalsPreferDeserts eingeschaltet ist und CrystalSinTempBehavior eingeschaltet ist und Temperature >= 15 300 + MaxColTempSlope * Temperature ...wenn die Kolonisten Crystals sind und CrystalsPreferDeserts eingeschaltet ist und CrystalSinTempBehavior eingeschaltet ist und Temperature < 15 100000 * Temperature ...wenn die Kolonisten Crystals sind und CrystalsPreferDeserts eingeschaltet ist und CrystalSinTempBehavior is disabled 9000000 ...wenn die Kolonisten Rebels sind und Temperature < 20 300 + MaxColTempSlope * Temperature ...wenn Temperature < 15 100 + (100-Temperature) * MaxColTempSlope ...wenn Temperature > 84 ...mindestens 6000 wenn die Kolonisten Klingonen, Robots oder Rebels oder Colony sind Trunc(10000000 * Sin(Temperature * PI / 100)) ...in allen anderen Fällen Supply_bonus = Trunc(100 * Supplies / 40) ...wenn AllowEatingSupplies eingeschaltet ist 0 ...sonst Beachte, dass diese Formeln mit Kolonisten rechnen, nicht Clans. In einer künftigen PHost-Version werden die Formeln möglicherweise auf Clans vereinfacht, das ergibt jedoch ein geringfügig anderes Rundungsverhalten. Für Eingeborene gelten einfachere Formeln. Das absolute Maximum sind 15.6 Millionen Eingeborene (156000 Clans) für die meisten Völker, 10 Millionen für Silikonoide, wenn diese hohe Temperaturen mögen. Vorräte helfen hier nicht, um das Limit anzuheben. Max_native_clans = 156000 ...wenn ClimateLimitsPopulation ausgeschaltet ist 1000 * Temperature ...wenn es silikonoide Eingeborene sind und CrystalsPreferDeserts eingeschaltet ist und PHost 3.3c oder neuer verwendet wird Trunc(Sin(Temperature * PI / 100) * 156000) ...in den anderen Fällen Man könnte es als Fehler bezeichnen, dass Siliconoide bei CrystalsPreferDeserts die 15.6-Millionen-Grenze nicht erreichen. Die Formel noch einmal zu ändern würde die Sache aber nur komplizierter machen. Wachstum: Wachstum hängt von Besteuerung und Klima ab. Die Bevölkerung wächst niemals über die Wachstumsgrenze hinaus. Die maximale Wachstumsrate pro Zug beträgt 5%. Colonist_growth_in_clans = Trunc(Round(Colonist_growth_rate * Colonist_clans / 100) * RaceGrowthRate / 100) ...maximal Eff_max_colonist_clans - Colonist_clans Colonist_growth_rate = 0 ...wenn Colonist_clans >= Eff_max_colonist_clans 0 ...wenn Colonist_happiness < 70 0 ...wenn die Kolonisten Crystals sind und CrystalsPreferDeserts eingeschaltet ist und CrystalSinTempBehavior eingeschaltet ist und Temperature < 15 5 * Sin(Temperature * PI / 200) / (1 + Colonist_tax / 5) ...wenn die Kolonisten Crystals sind und CrystalsPreferDeserts eingeschaltet ist und CrystalSinTempBehavior eingeschaltet ist und Temperature >= 15 5 * (Temperature / 100) / (1 + Colonist_tax / 5) ...wenn die Kolonisten Crystals sind und CrystalsPreferDeserts eingeschaltet ist und CrystalSinTempBehavior ausgeschaltet ist 0 ...wenn Temperature < 15 0 ...wenn Temperature > 84 5 * Sin(Temperature * PI / 100) / (1 + Colonist_tax / 5) ...in allen anderen Fällen Eingeborene wachsen ähnlich, allerdings mit einer maximalen Geschwindigkeit von 4%. Auf unbesetzten Planeten wachsen Eingeborene nicht(!). Native_growth_in_clans = Trunc(Round(Native_growth_rate * Native_clans) / 100) ...maximal Max_native_clans - Native_clans Native_growth_rate = 0 ...wenn Native_clans >= Max_native_clans 0 ...wenn Native_happiness < 70 4 * (Temperature / 100) / (1 + Native_tax / 5) ...wenn es silikonoide Eingeborene sind und CrystalsPreferDeserts eingeschaltet ist und PHost 3.3c oder neuer verwendet wird 4 * Sin(Temperature * PI / 100) / (1 + Native_tax / 5) ...in den anderen Fällen Verluste auf PlanetenÜberbevölkerung verbraucht Vorräte: Überbevölkerung unter den Kolonisten verbraucht Vorräte, wenn aktiviert. Supply_loss = 0 ...wenn AllowEatingSupplies ausgeschaltet ist 0 ...wenn ClimateLimitsPopulation ausgeschaltet ist 0 ...wenn Colonists <= Max_colonists Trunc((Colonists - Max_colonists) / 4000) + 1 ...sonst Wenn weniger Supplies verfügbar sind, werden sie alle aufgebraucht, ohne weitere negative Folgen. Tote durch Extremklima (Climate Deaths): Überbevölkerung (Kolonisten und Eingeborene) führt zu Todesfällen. Colonist_clans_dying = 0 ...wenn ClimateLimitsPopulation ausgeschaltet ist 0 ...wenn Colonist_clans <= Eff_max_colonist_clans Min(Trunc(Colonist_clans * ClimateDeathRate / 100), Eff_max_colonist_clans - Colonist_clans) ...sonst Native_clans_dying = 0 ...wenn ClimateLimitsPopulation ausgeschaltet ist 0 ...wenn der Planet unbewohnt ist 0 ...wenn Native_clans <= Max_native_clans Min(Trunc(Native_clans * NativeClimateDeathRate / 100), Max_native_clans - Native_clans) ...sonst Wenn die Bevölkerung die absolute Obergrenze von 250000 Clans (25 Millionen Einwohner) überschreitet, werden die Clans, die das Limit überschreiten, sterben und als Todesfälle durch Extremklima (climate deaths) berichtet, auch wenn ClimateLimitsPopulation deaktiviert ist. Eff_max_colonist_clans wird nach dem Verbrauchen von Vorräten berechnet, und benutzt die neue (geringere) Menge Vorräte. Es wird die gleiche Formel wie beim Wachstum benutzt, jedoch nicht die gleichen Werte. Struktur-Verluste: Gebäude auf Planeten können durch Aufstände zerstört werden, oder durch fehlende Wartung verfallen (wenn zu wenig Kolonisten auf dem Planeten vorhanden sind). Mine_loss = Mine_decay + Riot_loss Factory_loss = Factory_decay + Riot_loss Defense_loss = Defense_decay ...mit Riot_loss = 10 ...wenn Planet Kolonisten hat und Colonist_happiness < 40 10 ...wenn Planet Eingeborene hat und Native_happiness < 40 0 ...sonst Mine_decay = Max(Min(Mines - Maximum_mines, Eff_StructureDecay), 0) Factory_decay = Max(Min(Factories - Maximum_factories, Eff_StructureDecay), 0) Defense_decay = Max(Min(Defense_posts - Maximum_defense_posts, Eff_StructureDecay), 0) Eff_StructureDecay = StructureDecayOnUnowned ...auf unbesetzten Planeten StructureDecayPerTurn[Planet_owner] ...sonst Tote durch Bürgerkrieg: Kämpfende Kolonisten und/oder Eingeborene töten Bevölkerung. Selbst wenn sich nur eine Bevölkerungsgruppe im Bürgerkrieg befindet, leidet die andere darunter. Colonist_clans_dying = Ceil(Colonist_clans * (40 - Colonist_happiness) / 500) ...wenn Colonist_happiness < 20 Ceil(Colonist_clans * (40 - Native_happiness) / 2500) ...wenn Planet Eingeborene hat und Native_happiness < 20 0 ...sonst Native_clans_dying = Ceil(Native_clans * (40 - Native_happiness) / 500) ...wenn Native_happiness < 20 Ceil(Native_clans * (40 - Colonist_happiness) / 2500) ...wenn Planet Kolonisten hat und Colonist_happiness < 20 0 ...sonst Verluste durch amorphe Eingeborene: Amorphe Eingeborene verspeisen Kolonisten nach allen anderen Verlusten. Colonist_clans_eaten = 0 ...wenn Eingeborene nicht Amorph sind 5 ...wenn Native_happiness >= 70 20 ...wenn Native_happiness >= 50 40 ...sonst Wenn die Amorphen all deine Kolonisten oder noch mehr fressen, verlierst du den Planeten. AssimilationCyborgs assimilieren Eingeborene und verwandeln sie in Kolonisten. Ein assimilierter Eingeborenen-Clan ergibt einen Cyborg-Kolonisten-Clan. Native_clans_assimilated = Trunc(Colonist_clans * BorgAssimilationRate / 100) ...maximal Native_clans PHost vor Version 4.1 / 3.5 hat hier Ceil(...) eingeborene Clans entfernt, aber nur Trunc(...) Kolonisten-Clans hinzugefügt. SchiffeÜbersicht über Aktionen auf SchiffenDiese Tabelle listet alle Ereignisse, die Schiffe betreffen, in der richtigen Reihenfolge auf. Effekte wurden grob in zwei Kategorien sortiert, auch wenn die Unterteilung hier nicht so klar ist wie in der Planeten-Tabelle.
Allgemeine Formeln für SchiffeFür eine Vielzahl von Operationen müssen Schiffe Treibstoff verbrennen oder bereithalten. Zusätzlich zu den hier gelisteten Operationen erfordern viele Manöver, dass das Schiff mindestens eine Kilotonne Treibstoff im Tank hat (die aber nicht verbraucht wird). Auch für den Kampf ist eine Voraussetzung die Verfügbarkeit von Treibstoff (von der Verteidigung gegen Planeten mit NUK abgesehen). MasseViele Formeln hängen von der Masse eines Schiffes ab. Es gibt drei verschiedene Massen, die für die Berechnungen von Interesse sind: die Hüllenmasse, die Gesamtmasse, und die Kampfmasse.
Total_ship_mass = Hull_mass + Fuel + Supplies + Colonists (Fracht) + Tritanium + Molybdenum + Duranium (Fracht) + Torpedoes + Fighters (Munition) + Num_torp_launchers * Torp_launcher_mass (Masse der Torpedorohre) + Num_beams * Beam_mass (Masse der Geschütze) Raumjäger-Startrampen (fighter bays) haben kein Gewicht. Sie sind fest in die Hülle integriert und in deren Masse enthalten. Geld, Triebwerke und Mannschaft haben ebenfalls kein eigenes Gewicht. Die Massen werden jedes Mal, wenn sie benötigt werden, neu berechnet. Wenn sich also der Inhalt deines Frachtraums ändert, ändert sich deine Masse sofort. TarnungSchiffe, die tarnen, benötigen Treibstoff. Fuel_burned_by_cloak = 0 ...wenn Schiff Verbesserte Tarnung hat Trunc(CloakFuelBurn * Max(Hull_mass, 100) / 100) ...sonst Fuel_needed_before_movement = 1 + Fuel_burned_by_cloak Fuel_needed_after_movement = 1 Schiffe müssen enttarnen, wenn sie während des Zuges weniger als Fuel_needed haben. Nach dem Verbrauch des normal für die Tarnung benötigten Treibstoffes muss noch eine Kilotonne verbleiben, leergelaufene Schiffe können nicht tarnen. Betrieb aufrecht erhaltenSchiffe verbrauchen nach der Bewegung Treibstoff. Wenn sie nicht genug Treibstoff haben, passiert nichts Schlimmes, allerdings hat das Schiff eben nachher keinen Treibstoff mehr. Fuel_burned_per_turn = Ceil(Hull_mass * FuelUsagePerTurnFor100KT / 100) Schiffe verbrauchen nach jedem Kampf Treibstoff. Wenn sie nicht genug Treibstoff haben, passiert nichts Schlimmes, allerdings hat das Schiff eben nachher keinen Treibstoff mehr (und muss mit Kämpfen aufhören). Fuel_burned_per_fight = Ceil(Hull_mass * FuelUsagePerFightFor100KT / 100) TrainingSchiffe, die trainieren, nutzen Vorräte des Planetens, den sie umkreisen, um Erfahrung zu erlangen. Experience_added = Trunc(Rate * Points / (Sqrt(Hull_Crew) + 1)) ...mit Points = Supplies wenn Supplies <= 25 Points = 25 + Sqrt(8*(Supplies-25)) sonst Rate = Trunc(EPTrainingScale * Academy_bonus / 100) Academy_bonus = 100 für normale Schiffe Academy_bonus = EPAcademyScale für Akademieschiffe (v4.0i:) Akademie-Schiffe erhalten beim Training die vierfache Erfahrung. Siehe Training für eine umfangreichere Beschreibung des Trainings. Supply RepairDie Reparatur mit Supplies findet mehrfach während des Spielzuges statt. Dieser Mechanismus ist automatisch, es gibt nichts, das ihn anhalten oder erzwingen könnte. Schiffe benötigen dafür keinen Treibstoff. Damage_repaired = Min(Damage, Trunc(Supplies_on_ship / 5)) Supplies_used = 5 * Damage_repaired BoardingSchiffe mit der Fähigkeit Boarding (also normalerweise alle Privateer- und Tholian-Schiffe) können gegnerische Schiffe ohne Treibstoff entern, indem sie sie abschleppen. Unkooperative Crewmitglieder des Gegners werden dabei in den Weltraum ausgesetzt und durch eigene Crew ersetzt. New_crew_on_boarded_ship = Traitors + Crew_beamed_over New_crew_on_boarding_ship = Crew_on_boarding_ship - Crew_beamed_over ...mit Traitors = Crew_on_boarded_ship ...wenn geenterte Schiff dem Privateer gehörte Trunc(0.9 * Crew_on_boarded_ship) ...wenn geenterte Schiff dem Fed gehörte Trunc(0.7 * Crew_on_boarded_ship) ...wenn geenterte Schiff dem Colony gehörte Trunc(0.4 * Crew_on_boarded_ship) ...wenn geenterte Schiff dem Empire gehörte 0 ...sonst Crew_beamed_over = Min(Boarded_ship_full_crew - Traitors, Trunc(Boarding_ship_crew / 2)) Wenn diese Formeln New_crew_on_boarding_ship unter 2 bringen würden, nutzt PHost stattdessen Traitors mindestens 2 und Crew_beamed_over = 0. (v4.1f:) PHost vor Version 4.1f verwendete immer genau 2 Crewmitglieder, auch dann, wenn Traitors mehr ergab. Abschleppen (Towing)Für weitere Informationen zum Towing, siehe Auflösung von Tow-Konflikten. Tow_strength = Engine_contribution + Movement_contribution ...wenn Schiff Treibstoff hat 0 ...wenn Schiff keinen Treibstoff hat Engine_contribution = Engine_tech^2 * Eff_engines * Warp_factor * TowStrengthEngineScale Movement_contribution = Movement_distance * TowStrengthDistanceScale ...mit Movement_distance = Min(Waypoint_distance, Max_dist, Max_allowed_by_fuel)
MovementAllgemeinBevor ein Schiff seine Bewegung beginnt, muss sein Kurs feststehen (in Form eines X/Y-Koordinatenpaares, bzw. tatsächlich in Form einer relativen Bewegung dX/dY). Über die Intercept-Auflösung stellt PHost das für Schiffe auf Abfangkursen sicher. Wenn eine Endloskarte benutzt wird, fliegen Schiffe auf dem kürzestmöglichen Weg zu ihrem Ziel. Anstatt 1900 ly nach Westen zu fliegen, fliegen sie also lieber 100 ly nach Osten. Nach der Überquerung der Kartengrenze werden sie wieder in die normale Karte versetzt: wenn ein Schiff zu einem Punkt 50 ly östlich der rechten Kartengrenze (also außerhalb der Karte) fliegt, landet es 50 ly östlich der linken Grenze (innerhalb). Geschwindigkeits-Limit: Beschädigte Schiffe müssen abbremsen. Die Höchstgeschwindigkeit beträgt allerdings auch dann Warp 9, wenn diese Formel einen höheren Wert ergibt. Max_speed = 9 ...wenn das Schiff Triebwerkspanzerung hat 15 - Trunc(Damage/10) ...wenn das Schiff dem Lizard gehört 10 - Trunc(Damage/10) ...sonst Grundlagen: Zuerst wird die maximal mögliche Entfernung ermittelt, die du mit deinem Warpfaktor zurücklegen kannst. Das ist die erlaubte Maximalentfernung für das Schiff. Beide Werte können während der Bewegung verändert werden. Max_dist = Warp^2 ...für normale Triebwerke Warp^2 * 2 ...für gravitonische Triebwerke Permitted_dist = Max_dist ...wenn das Schiff Treibstoff hat 1 ...wenn das Schiff keinen Treibstoff hat und AllowNoFuelMovement eingeschaltet ist 0 ...wenn das Schiff keinen Treibstoff hat und AllowNoFuelMovement ausgeschaltet ist Für die Bewegung nutzt PHost eine zeitbasierte Interpretation. Schiffe haben eine Zeiteinheit, um sich zu bewegen. Sie müssen diese Einheit nicht vollständig nutzen. Ein Schiff, das mit Warp 8 auf ein 32 ly entferntes Ziel zufliegt, erreicht dieses bereits nach einer halben Zeiteinheit. Minentreffer können ein Schiff nach einem Teil seiner geplanten Bewegung anhalten oder bremsen. Wenn ein abgeschlepptes Schiff nach einem Minentreffer freibricht, kann es die verbleibende Zeit nutzen, sein eigenes Ziel zu erreichen. Die Entfernung, die das Schiff schließlich zurücklegt, wird über diese Gleichung bestimmt: Movement_distance = Max_dist * Movement_time SpritverbrauchFuel_usage = Trunc((ERnd(Total_ship_mass/10) * Distance * Engine_fuel_usage) / (10000 * Max_dist)) ...wenn UseAccurateFuelModel ausgeschaltet ist Total_ship_mass * (1.0 - Exp(-(Engine_fuel_usage * Distance) / (Max_dist * 100000))) ...wenn UseAccurateFuelModel eingeschaltet ist Beachte, dass die UseAccurateFuelModel-Formel gebrochene Zahlen liefern kann. Falls die Bewegung in mehrere Phasen aufgeteilt wird (z.B. weil das Schiff eine Mine trifft), werden diese Brüche aufaddiert und am Ende arithmetisch gerundet. Im Gegensatz dazu rundet die nicht-akkurate Formel nach jedem Schritt. Wenn das Schiff seinen Flug erfolgreich absolviert (also keine Mine trifft), hat Distance den Wert Movement_distance. Davon gehen Client-Programme aus, wenn sie deinen Treibstoffverbrauch ermitteln. Engine_fuel_usage ist Teil der Definition der Triebwerke (engspec.dat) und ist für alle Triebwerke und Geschwindigkeiten verschieden. Die meisten Referenzdokumente listen Engine_fuel_usage / (Warp^2) auf, da das schönere Zahlen ergibt. Zurückgelegte EntfernungDie Bewegung eines Schiffes wird exakt berechnet. PHost ermittelt den Winkel zum Ziel des Schiffes, und bewegt es mit doppelt-genauen Fließkommazahlen dorthin. Damit kann es passieren, dass ein Schiff nach 17.3 ly Bewegung am Punkt (2351.56, 1792.35) eine Mine trifft. In Berichten über Minentreffer muss PHost daher runden, ebenso, wenn das Schiff am Ende der Bewegung wieder im Spieluniversum ankommt. New_position = (Waypoint_X, Waypoint_Y) ...wenn Distance_moved = Distance_to_waypoint (Ziel erreicht) (Position_X + Ceil(Distance_moved * Sin(Heading)), Position_Y + Ceil(Distance_moved * Cos(Heading))) ...mit Heading = ArcTan(Waypoint_X - Position_X, Waypoint_Y - Position_Y) Zwei interessante Eigenschaften dieser Formel:
Wenn du beispielsweise ein Ziel in 90 ly Entfernung einstellst, wird dein Schif wahrscheinlich z.B. 81.4 ly fliegen, aber nur Treibstoff für 81 ly benötigen. Auch der Ramscoop wird nur Treibstoff für 81 ly erzeugen. RamscoopSchiffe mit Ramscoop sammeln während ihrer Reise die dünne interstellare Materie auf und wandeln sie in Treibstoff um. Dieser Treibstoff steht allerdings erst nach der Bewegung zur Verfügung. Während der Bewegung kann er noch nicht benutzt werden. Wenn das Schiff eine Fangmine trifft, wird es zuerst Treibstoff an das Minenfeld verlieren, und danach den Treibstoff vom Ramscoop erhalten (es wird den Zug also mit Treibstoff beenden, auch wenn die Fangminen es vorher leergesaugt hatten). Fuel_made_by_ramscoop = Trunc(RamScoopFuelPerLY * (Distance_moved_uncloaked + 0.5*Distance_moved_cloaked)) Ein Schiff kann einen Teil seiner Reise getarnt und einen weiteren ungetarnt zurücklegen, wenn es eine Mine trifft und dadurch die Grenze DamageLevelForCloakFail erreicht. Nur während normaler Bewegung wird Treibstoff hergestellt. Bei Hypersprüngen, Chunnels, und allen Arten von Bewegung, die nicht von den Triebwerken des Schiffes ausgelöst wurden (z.B. wenn das Schiff geschleppt oder von einem Ionensturm mitgerissen wird) wird nichts produziert. Das Schiff darf aber ein anderes Schiff schleppen oder abfangen. Berichten zufolge erzeugen Schiffe auf Abfangmission in einigen HOST-Versionen keinen Treibstoff, daher tun sie das auch in PHost bis Version 4.0e nicht. In neueren Versionen besteht diese Einschränkung nicht mehr. GravitationDie Masse eines Planeten wird alle Schiffe in einer bestimmten Entfernung (Standard: 3 ly) an den Planeten ziehen. Das kann benutzt werden, um Sprit zu sparen: fliege einfach nur bis zum Rand der Gravitation, und lass den Planeten den Rest erledigen. Um innerhalb der Gravitation zu fliegen, muss das Schiff Warp 1 haben; Schiffe mit Warp 1 werden nicht beeinflusst. Voraussetzungen:
Ein Schiff wird zu dem Planeten gezogen, für den folgendes gilt:
Wenn diese Bedingungen für mehr als einen Planeten zutreffen, wird das Schiff zu dem mit der höheren Id gezogen. Wenn die Bedingungen auf keinen Planeten zutreffen, wird das Schiff nicht von Gravitation beeinflusst. Während das Schiff von der Gravitation bewegt wird, benötigt es keinen Treibstoff und riskiert auch keinen Minentreffer. Intercept-AuflösungFür die Bewegung benötigt PHost für jedes Schiff einen bekannten Kurs. Für die Intercept-Mission sortiert PHost die Schiffe daher derart, dass alle Abfang-Ziele vor den abfangenden Schiffen bewegt werden. Bei zyklischen Intercepts ist das nicht möglich, so dass folgende Sonderbehandlung stattfindet: Waypoint_X = (Sum(Position_X) + Adjust_X) / Num_ships_in_loop Waypoint_Y = (Sum(Position_Y) + Adjust_Y) / Num_ships_in_loop Adjust_X = 0 ...wenn AllowWraparoundMap ausgeschaltet ist i * Map_dimension_X ...mit 0 <= i < Num_ships_in_loop so dass Sum((Position_X - Waypoint_X)^2) minimal wird Adjust_Y = 0 ...wenn AllowWraparoundMap ausgeschaltet ist j * Map_dimension_Y ...mit 0 <= j < Num_ships_in_loop so dass Sum((Position_Y - Waypoint_Y)^2) minimal wird Die Parameter Adjust_X und Adjust_Y werden nur bei Endloskarten benutzt und dienen dazu, die von den Schiffen zurückgelegte Strecke zu minimieren. Um sie zu finden, werden alle möglichen Werte für i und j ausprobiert und die am besten passende Lösung wird gewählt. In PHost vor 4.0k/3.4m sind diese Werte immer 0. HypersprüngeHypersprung-Schiffe können anstelle ihrer normalen Triebwerke ihren Hyperantrieb benutzen. Die Bedingungen dafür sind beim Kommandocode HYP aufgeführt. Fuel_used = 50 New_position = (Waypoint_X, Waypoint_Y) ...wenn Distance_to_waypoint >= 340 und Distance_to_waypoint <= 360 (Position_X + Sgn(DX) * Trunc(350 * Abs(DX) / Distance_to_waypoint) + 0.4999999, Position_Y + Sgn(DY) * Trunc(350 * Abs(DY) / Distance_to_waypoint) + 0.4999999) ...mit DX = Waypoint_X - Position_X DY = Waypoint_Y - Position_Y Glory DeviceWenn Glory devices gezündet werden, nehmen alle Schiffe und Planeten an der selben Position Schaden. Das Glory-Schiff selbst explodiert und wird damit zerstört. Damage_done_to_ship = Trunc(Trunc(100 * MineHitDamageFor100KT / Hull_mass) / DF) ...mit DF = 10 ...bei GloryDeviceLowDamage (die bessere Version), wenn Schiff dem gleichen Spieler gehört wie Glory Device oder Spieler verbündet sind und GD-Besitzer Schiffs- und Kampf-Privileg bietet DF = 5 ...bei GloryDeviceHighDamage (die einfachere Version) wenn Schiff dem gleichen Spieler gehört wie Glory Device oder Spieler verbündet sind und GD-Besitzer Schiffs- und Kampf-Privileg bietet DF = 1 ...sonst Supplies_added_to_planet = Trunc(Native_clans / 10) ...wenn Eingeborene Amorphe sind 0 ...sonst Native_clans_survived = 0 ...wenn Eingeborene Amorphe sind Native_clans ...wenn Eingeborene Bovinoide oder Reptilien sind Trunc(0.6 * Native_clans) ...sonst Colonist_clans_survived = Colonist_clans ...wenn Kolonisten Lizards oder Crystals sind Trunc(0.6 * Colonist_clans) ...sonst Mines_remaining = Trunc(0.75 * Mines) Factories_remaining = Trunc(0.75 * Factories) Defense_posts_remaining = Trunc(0.75 * Defense_posts) KolonisierenSchiffe können mit der Mission Colonize auf Planeten landen. Dort werden sie entladen und zerlegt, um eine neue Kolonie zu beginnen. Nutze das nur, wenn du das Schiff wirklich loswerden willst, normalerweise reicht es aus, einfach Kolonisten auszuladen, um eine Kolonie zu beginnen. Colonist_clans_on_planet = Colonist_clans_on_ship + Trunc(Ship_crew / 100) + 1 Neutronium_added_to_planet = Neutronium_on_ship Money_added_to_planet = Money_on_ship Tritanium_added_to_planet = Tritanium_on_ship + Trunc(RecycleRate * Tritanium_built_into_ship / 100) ...mit Tritanium_built_into_ship = Hull_tritanium_cost + Engine_tritanium_cost * Num_engines + Beam_tritanium_cost * Num_beams + Torp_launcher_tritanium_cost * Num_torp_launchers Duranium und Molybdenum werden nach den gleichen Formeln wie Tritanium wiedergewonnen. Beachte, dass die Munition des Schiffs nicht aufgearbeitet wird und keine Mineralien für die Kolonie ergibt. KampfStartparameter für Raumschiffe
Startparameter für PlanetenDie Verteidigung eines Planeten wird geschwächt, wenn der Planet beschädigt wird. Eff_Planet_Defense = Trunc(Planet_Defense * (100 - Damage) / 100) Eff_Base_Defense = Trunc(Base_Defense * (100 - Damage) / 100) Eff_Total_Defense = Trunc((Base_Defense + Planet_Defense) * (100 - Damage) / 100) Beachte, dass aufgrund von Rundungseffekten Eff_Total_Defense einen anderen Wert haben kann als Eff_Planet_Defense + Eff_Base_Defense. Wenn eine Sternenbasis beschädigt wird, werden die Techlevels abgesenkt. Hier ist die Formel für die Geschütze (beam tech), die auch auf die anderen Gebiete zutrifft. Eff_Beam_Tech = Beam_Tech ...höchstens Trunc((100 - Base_damage) / 10) ...mindestens 1 Ausrüstung eines Planeten im Kampf Combat_mass = 100 + Eff_Planet_Defense ...plus Eff_Base_Defense wenn Basis vorhanden Beam_type = Round(Sqrt(Eff_Planet_Defense / 2)) ...wenn keine Basis vorhanden Max(obiges, Eff_Beam_Tech) ...wenn Basis vorhanden Beam_count = Round(Sqrt(Eff_Total_Defense / 3)) ...maximal 10 wenn AllowAlternativeCombat ausgeschaltet ist ...maximal 20 wenn AllowAlternativeCombat eingeschaltet ist Torp_type = Round(Sqrt(Eff_Planet_Defense / 2)) ...wenn keine Basis vorhanden Max(obiges, Eff_Torp_Tech) ...wenn Basis vorhanden Tube_count = Round(Sqrt(Eff_Total_Defense / 4)) ...maximal 20 Torp_count = Tube_count * PlanetaryTorpsPerTube ...plus Trunc(Base_torp_cost / Torp_money_cost(Torp_type)) wenn Basis vorhanden und UseBaseTorpsInCombat eingeschaltet ...maximal 255 Base_torp_cost = Torp_money_cost(1) * Torps_in_storage(1) + Torp_money_cost(2) * Torps_in_storage(2) ... + Torp_money_cost(10) * Torps_in_storage(10) Bay_count = Round(Sqrt(Eff_Planet_Defense)) ...plus 5 if base present Fighter_count = Round(Sqrt(Eff_Planet_Defense)) + Base_fighters Formeln für den KampfDaten der WaffenBeam_hit_odds = Eff_BeamHitOdds + Trunc((Beam_Kill_Power + Beam_Expl_Power) * Eff_BeamHitBonus / 100) Beam_recharge_rate = BeamRechargeRate + Trunc((Beam_Kill_Power + Beam_Expl_Power) * Eff_BeamRechargeBonus / 100) Beam_recharge_per_tick = Random(Beam_recharge_rate) Torp_hit_odds = Eff_TorpHitOdds + Trunc((Torp_Kill_Power + Torp_Expl_Power) * Eff_TorpHitBonus / 100) Torp_recharge_rate = Eff_TubeRechargeRate + Trunc((Torp_Kill_Power + Torp_Expl_Power) * Eff_TubeRechargeBonus / 100) Torp_recharge_per_tick = Random(Torp_recharge_rate) Bay_recharge_rate = Eff_BayRechargeRate + Eff_BayRechargeBonus * Num_Bays Bay_recharge_per_tick = Random(Bay_recharge_rate) Eff_XXX ist der effektive Wert einer Konfigurationsoption, und setzt sich aus dem eigentlichen Wert aus der Konfigurationsdatei sowie den Erfahrungs-Boni der Einheit, die die Waffe benutzt, zusammen. Wirkung der WaffenJeder Waffentreffer wird durch drei Angaben charakterisiert:
Geschütze: Expl_Power und Kill_Power werden der Definition des Waffensystemes entnommen. Ein Geschütz schießt Todesstrahlen, wenn der Expl_Power 0 ist. Wenn der Besitzer der Waffe Privateer ist, wird die Kill_Power verdreifacht. Der Ladezustand der Waffe beeinflusst die Wirkung; ein Geschütz, das bei Ladung 600 abgefeuert wird, hat nur 60% der normalen Energie. Expl_Power = Trunc(Beam_expl_power * Beam_charge / 1000) Kill_Power = Trunc(Beam_kill_power * Beam_charge / 1000) * PF ...mit PF=3 wenn Geschütz dem Privateer gehört, PF=1 sonst Torpedos: Expl_Power und Kill_Power werden der Definition des Waffensystemes entnommen. Beachte, dass die Werte noch einmal verdoppelt werden, wenn AllowAlternativeCombat deaktiviert ist (einige Clients zeigen bereits die verdoppelten Werte an). Ein Torpedo mit Expl_Power = 0 strahlt Todesstrahlen ab. Fighters (Raumjäger): Expl_Power und Kill_Power entsprechen den Parametern FighterBeamExplosive und FighterBeamKill. Jäger schießen niemals Todesstrahlen. Normaler KampfDie folgenden Formeln werden benutzt, wenn AllowAlternativeCombat ausgeschaltet ist. Alle Schadenswerte sind dann ganze Zahlen, Waffen richten mindestens einen Punkt Schaden an (töten aber möglicherweise keine Crew). Shield_damage = Trunc(1.5 + ((Expl_Power * Eff_ShieldDamageScaling + Kill_Power * Eff_ShieldKillScaling) / (Mass + 1))) Hull_damage = Trunc(1.5 + ((Shield_damage * Eff_HullDamageScaling / (Mass + 1))) Crew_killed = Trunc(0.5 + ((Kill_Power * Eff_CrewKillScaling) / (Mass + 1))) ...mindestens 1, wenn die Waffe Todesstrahlen schießt. Alternative CombatDie folgenden Formeln werden benutzt, wenn AllowAlternativeCombat eingeschaltet ist. In diesem Fall können die Ergebnisse gebrochene Zahlen sein, Schaden wird entsprechend in gebrochenen Zahlen aufgezeichnet. Waffen können auch weniger als einen Schadenspunkt anrichten. Shield_damage = (Expl_Power * Eff_ShieldDamageScaling + Kill_Power * Eff_ShieldKillScaling) / (Mass + 1) Hull_damage = (Expl_Power * Eff_HullDamageScaling) / (Mass + 1) Crew_killed = (Kill_Power * Eff_CrewKillScaling) / (Mass + 1) Eff_XXX ist der effektive Wert einer Konfigurationsoption, und setzt sich aus dem eigentlichen Wert aus der Konfigurationsdatei sowie den Erfahrungs-Boni der getroffenen Einheit zusammen (dies sind die Defensiv-Boni). Ergebnis für SchiffeSchiff gekapert: Wenn ein Schiff im Kampf gekapert wurde (weil seine Mannschaft getötet wurde), wechselt es den Besitzer. Es erhält eine kleine Notbesatzung (das kapernde Schiff verliert jedoch keine weitere Crew). Crew_after_combat = Min(10, Hull_crew) Cyborgs laden TrümmerWenn ein Borg-Schiff (PlayerRace = 6) ein anderes Schiff zerstört, versucht es danach, dessen Trümmer an Bord zu nehmen. Neutronium_gathered = Neutronium_on_ship Tritanium_gathered = Tritanium_on_ship + Hull_tritanium_cost Duranium und Molybdenum werden anhand der gleichen Formel wie Tritanium aufgeladen. Die Mineralien werden in der Reihenfolge Tritanium, Duranium, Molybdenum aufgesammelt, wenn der Frachtraum schon vorher voll ist, werden übrig bleibende Mineralien nicht mitgenommen. Ergebnis für PlanetenPlanet verloren: Wenn ein Planet im Kampf verloren wird, ändert er den Besitzer. Eine Basis wird dabei zerstört. Defense_after_combat = 0 Colonists_after_combat = Trunc(Colonists * Eff_SurvivalRate / 100) ...mit Eff_SurvivalRate = Trunc(ColonistCombatCaptureRate[Ship_Owner] * ColonistCombatSurvivalRate[Planet_Owner] / 100) ...mindestens 1 Colonist_happiness_after_combat = Colonist_happiness - Trunc(Eff_SurvivalRate / 2) ...at least MinimumHappiness Experience_points_after_combat = Trunc(Experience_points * Eff_SurvivalRate / 100) Natives_after_combat = Trunc(Natives * NativeCombatSurvivalRate / 100) Native_happiness_after_combat = Native_happiness - 20 ...mindestens MinimumHappiness Planet siegt: Im Kampf genutzte Munition wird zuerst aus dem Lager der Sternenbasis genommen. Es ist auch die Sternenbasis, die zuerst Schaden nimmt. Fighters_lost = Min(Fighters_launched_in_combat, Base_fighters) Der Torpedovorrad, der im Kampf benutzt wird, wird aus allen am Lager befindlichen Typen zusammengestellt. Deshalb muss die Basis auch Torpedos aller Typen abgeben, wenn sie im Kampf Torpedos feuert. PHost nutzt dafür folgenden Algorithmus: Torpedo_costs = Torps_fired * Torp_money_cost(Torp_type) Repeat For i:=1 To 10 (Schleife über alle Torpedotypen) If (Torps_in_storage(i) > 0) And (Torpedo_costs > Torp_money_cost(i)) Einen Torpedo des Typs type i entfernen Torpedo_costs um Torp_money_cost(i) verringern EndIf EndFor Until die innere Schleife keine weiteren Torpedos entfernen kann Damit wird versucht, die Verluste gleichmäßig über alle Typen zu verteilen. Endzustand: Ein Planet kann pro Zug an mehreren Kämpfen teilnehmen. Nachdem diese alle überstanden sind, werden die Auswirkungen des Schadens ermittelt. Base_damage_after_combat =
Base_damage + Damage_taken
...wenn das 100 oder mehr sind, wird die Basis zerstört
Base_defense_after_combat =
Trunc(Base_defense * Damage_taken / 100)
Max_base_tech =
Max(1, Trunc((100 - Base_damage_after_combat) / 10))
Defense_after_combat =
Trunc(Planet_defense * Damage_taken / 100)
Max_base_tech ist der höchste Techlevel, den die Sternenbasis nach dem Kampf noch haben kann. Techlevels, die diese Grenze überschreiten, werden entsprechend gesenkt. MinenfelderÜbersicht über Aktionen mit MinenfeldernDiese Tabelle listet alle Ereignisse auf, die Minenfelder direkt oder indirekt betreffen, in der Reihenfolge, in der sie passieren.
AllgemeinMinenfelder enthalten eine ganzzahlige Anzahl Minen-Einheiten. Daraus wird der Radius des Minenfeldes ermittelt: Minefield_radius = Sqrt(Mine_units) Intern verwendet PHost diesen exakten Wert. In Nachrichten wird der Radius als Trunc(Minefield_radius), der Durchmesser als 2 * Trunc(Minefield_radius) gemeldet. Einige Clients werten die Mine_units direkt aus und stellen Minenfelder etwas exakter dar. Beispielsweise zeigt PCC Round(Minefield_radius) an. Minen-Verfall (mine decay)Minenfelder verfallen jeden Zug und werden dadurch kleiner. Mine_units_after_decay = Trunc(Mine_units * (100 - MineDecayRate) / 100) ...bei normalen Minenfeldern Trunc(Mine_units * (100 - WebMineDecayRate) / 100) ...bei Fangminenfeldern MinenlegenTorpedo-Schiffe können Minen legen. Für das Legen von Fangminen gelten die selben Formeln. Torps_laid = Min(Torps_available, Trunc((Max_units - Existing_units) / Conversion_rate)) ...0 wenn Conversion_rate 0 ist oder Existing_units >= Max_units ...mit Conversion_rate = Trunc(Torp_type^2 * Min(UnitsPerTorpRate[Ship_owner], UnitsPerTorpRate[Minefield_owner]) / 100) Max_units = MaximumMinefieldRadius[Minefield_owner] ^ 2 ...wenn es ein normales Minenfeld ist MaximumWebMinefieldRadius[Minefield_owner] ^ 2 ...wenn es ein Fangminenfeld ist Units_laid = Torps_laid * Conversion_rate Falls ein Minenfeld vergrößert wird, ist Existing_units die Anzahl Mineneinheiten in dem Feld, ansonsten ist es 0. Torps_available ist die Anzahl Torpedos, die für das Minenlegen freigegeben sind (über den Kommandocode mdX oder eine erweiterte Mission wie Lay Minefield). Beachte, dass Ship_owner und Minefield_owner verschieden sein können, wenn miX oder eine erweiterte Mission benutzt wird. Es ist nicht möglich, zu einem Minenfeld, das fast seine Maximalgröße erreicht hat, weitere Minen hinzuzufügen. Beispielsweise können Robots einem Minenfeld mit 99 ly Radius (=9801 Einheiten) kein Mark-8-Torpedo (Typ 10) hinzufügen, wenn der Radius auf 100 ly begrenzt ist: die neue Größe, 9801+400 = 10201 wäre größer als das erlaubte Maximum 10000. In pathologischen Konfigurationen kann es sogar unmöglich sein, ein neues Minenfeld zu legen, weil bereits ein einzelner Torpedo das Limit überschreitet. Überlappende Minenfelder explodierenVoraussetzungen: Wenn zwei Minenfelder überlappen, also Radius_1 + Radius_2 > Sqrt((X_1-X_2)^2 + (Y_1-Y_2)^2) gilt, beeinflussen sie einander, sofern nicht mindestens eins der folgenden zutrifft:
Im 1:1-Fall, wenn also zwei gegnerische Minenfelder überlappen, wird folgende Formel benutzt: Mines_exploding = Min(Units_1, Units_2) ...wenn Dist = 0 Units_1 ...wenn A < 0 Units_2 ...wenn A > D Units_1 - A^2 ...sonst ...mit D = Entfernung der Zentren der Minenfelder A = (Units_1 - Units_2 + D^2) / (2*D) Units_1, Units_2 = Anzahl Minen-Einheiten in beiden Feldern Diese Formel wird verwendet, wenn AlternativeMinesDestroyMines eingeschaltet ist und ein gelegtes oder vergrößertes Minenfeld ein anderes überlappt. In diesem Fall geht PHost alle Minenfelder in Id-Reihenfolge durch, sucht nach feindlichen Überlappungen, und wendet obige Formel an. Während des Schritts Mines destroy Mines im Hostablauf verwendet PHost komplexere Formeln. Die Grundidee ist dabei folgende: wenn ein Minenfeld N gegnerische Minenfelder überlappt, so wird es mit einer Geschwindigkeit von N Minen-Einheiten pro Zeiteinheit schrumpfen. Wir können nun für jedes Paar Minenfelder ausrechnen, wie lange es bei dieser Geschwindigkeit schrumpfen muss, damit die Überlappung verschwindet. PHost ermittelt nun die minimale solche Zeit, und entfernt aus jedem Minenfeld N * Zeit Einheiten. Damit ist mindestens eine Überlappung verschwunden. Nun werden die Geschwindigkeiten erneut berechnet und der Algorithmus beginnt von vorn, wenn weitere Überlappungen existieren. Time_until_overlap_gone = Min(U1 / S1, U2 / S2) ...wenn D=0 (konzentrische Minenfelder) U1 / S1 ...wenn U2*S1 - U1*S2 >= D^2 * S1 (Feld 2 eliminiert Feld 1 vollständig) U2 / S2 ...wenn U1*S2 - U2*S1 >= D^2 * S2 (Feld 1 eliminiert Feld 2 vollständig) (U1 - A^2) / S1 ...wenn S1 = S2 ((U1-U2-D^2)*S1 - (U1-U2+D^2)*S2 + 2*Sqrt(D^2 * (U2*S1^2 - (U1+U2-D^2)*S1*S2 + U1*S2^2))) / (S1 - S2)^2 ...sonst ...mit D = Entfernung der Zentren der Minenfelder A = (U1 - U2 + D^2) / (2*D) U1,U2 = Mineneinheiten in beiden Feldern (Units_1, Units_2) S1,S2 = Verlust-Geschwindigkeiten, Anzahl Überlappungen beider Felder Die überwältigende letzte Formel ist die Lösung zu Sqrt(U1 - S1*x) + Sqrt(U2 - S2*x) = D und wurde mit Mathematica ermittelt. Der tatsächlich verwendete Programmcode ist stark auf Geschwindigkeit optimiert. PHost betrachtet nicht alle Minenfelder auf einmal, vielmehr werden die Minenfelder zuerst in Gruppen eingeteilt (wähle ein beliebiges Minenfeld, füge der Gruppe alle Minenfelder hinzu, die anhand Besitzer/Position/Typ mit diesem interagieren, füge alle Felder hinzu, die mit den gerade hinzugefügten Feldern interagieren, usw.). Außerdem wird, um Fortschritt garantieren zu können, die Zeit immer um mindestens einen Minimalwert Epsilon fortgeschrieben, wodurch es passieren kann, dass ein Minenfeld eine Handvoll Einheiten mehr verliert, als zur Entfernung aller Überlappungen nötig gewesen wäre. Epsilon ist momentan das Reziproke der maximalen Überlappungszahl der aktuellen Gruppe, mindestens jedoch 1/16. Dieser Wert wurde empirisch durch Testen als Kompromiss zwischen Genauigkeit und Geschwindigkeit ermittelt. Um in einem Client Mines-Destroy-Mines vorherzusagen, reicht es vermutlich aus, Epsilon von 1/16 anzunehmen. Nach der Ermittlung aller Verluste versucht PHost, sie wieder in die Spieldaten zu übernehmen und an Spieler zu melden. Die zitierten Formeln können zu Ergebnissen wie "Minenfeld-Paar #17/#233 verliert 0.12 Einheiten" führen. Da die Anzahl Mineneinheiten aber eine ganze Zahl sein muss, muss hier gerundet werden. Wenn Loss(A,B) der Verlust eines Minenfeld-Paares A/B ist, den obiger Algorithmus ermittelt hat, dann ergibt sich die Anzahl, die in util.dat-Eintrag 29 und in der Subraumnachricht gemeldet wird, nach der Formel Rounded_loss(A,B) = Min(Ceil(Loss(A,B)), Units_A, Units_B) Neu v4.1a: Falls aufgrund dieser Formel ein Minenfeld weniger Minen verliert, als zur Auflösung aller Überlappungen nötig war, entfernt PHost nachträglich die überschüssigen Minen mit util.dat-Eintrag 53. Das passiert üblicherweise nur, wenn ein Minenfeld sehr viele andere Felder überlappt. Minen räumenMinenräumen kann auf zwei Arten geschehen: normales Minenräumen und Scooping (aufsammeln). Scooping wird mit dem Kommandocode msc oder der erweiterten Mission Scoop Torpedoes ausgewählt. Normalerweise werden alle feindlichen Minenfelder in Sichtweite gescannt, und wenn möglich zerstört. Beim Scooping werden zusätzlich Minen aus eigenen Minenfeldern aufgesammelt und wieder in Torpedos umgewandelt. Units_swept = Beam_contribution + Fighter_contribution Beam_contribution = Beam_count * Beam_type^2 * Sweep_rate ...mit Sweep_rate gleich WebMineSweepRate oder MineSweepRate ...wenn das Schiff Geschütze hat, in Reichweite ist, und das Feld nicht von einem Ionensturm verdeckt wird 0 ...sonst Fighter_contribution = Fighter_count * FighterSweepRate ...wenn das Schiff Startrampen hat, innerhalb FighterSweepRange ist, und das Minenfeld ein normales Minenfeld ist oder das Schiff den Colonies gehört und AllowColoniesSweepWebs aktiv ist 0 ...sonst Torps_scooped = Min(Trunc(Mine_units / Conversion_rate), Free_cargo_room, Mission_limit) ...mit Conversion_rate = Trunc(Torp_type^2 * UnitsPerTorpRate[Ship_owner] / 100) Units_scooped = Mine_units ...wenn Trunc(MineUnits / Conversion_rate) = Torps_scooped Torps_scooped * Conversion_rate ...sonst Die Formel für Units_scooped bedeutet, in anderen Worten: wenn nach dem Sammeln der gewünschten Anzahl Torpedos das Äquivalent von weniger als einem Torpedo übrig bleibt (also weniger als Conversion_rate Minen-Einheiten), wird das Minenfeld komplett geräumt. Wenn die Mission Scoop Torpedoes benutzt wird, gibt der Parameter die maximale Anzahl Torpedos an, die aus jedem betreffenden Minenfeld entnommen werden soll, nicht die Gesamtzahl. Dies wird durch die Variable Mission_limit symbolisiert. Wenn die normale Mine-Sweep-Mission mit msc benutzt wird, gibt es kein Mission_limit. MinentrefferMinentreffer-WahrscheinlichkeitDie Wahrscheinlichkeit, dass ein Schiff eine Mine trifft, hängt von der Art des Minenfeldes und der Geschwindigkeit des Schiffs ab. Mine_hit_odds = 0 ...wenn Speed <= Safe_warp Max(0, Base - (9 - Speed) * Bonus / 100) ...mit (Base, Bonus) = WebMineHitOdds, WebMineOddsWarpBonusX100 ...wenn Fangminenfeld MineHitOdds, MineOddsWarpBonusX100 ...wenn ungetarntes Schiff, normales Minenfeld MineHitOddsWhenCloakedX10/10, CloakMineOddsWarpBonusX100 ...wenn getarntes Schiff, normales Minenfeld Wenn du in diese Formeln die normalen, ganzzahligen Werte aus der Konfiguration einsetzt, erhältst du eine (möglicherweise gebrochene) Prozentzahl, von 0 bis 100. Dies ist die Wahrscheinlichkeit, dass du eine Mine triffst, wenn du dich im Minenfeld 1 ly bewegst. Alle verwendeten Optionen können für jeden Spieler separat eingestellt werden. Für die Ermittlung der Trefferquote bei der Bewegung eines Schiffes werden die Werte des Schiffsbesitzers benutzt; der Besitzer des Minenfeldes ist irrelevant. Um zu ermitteln, ob ein Schiff ein Minenfeld erfolgreich durchquert bzw. ob und wo es eine Mine trifft, verwendet PHost die üblichen Formeln der Wahrscheinlichkeitsrechnung. Für dich am interessantesten ist sicher die Formel, wie hoch die Wahrscheinlichkeit ist, dass das Schiff ein Minenfeld einer bestimmten Größe erfolgreich durchquert (die jedoch als solche in PHost nicht benutzt wird): Prozentzahl = 100 * (((100 - Mine_hit_odds)/100) ^ Distance) Wirkungen eines MinentreffersDamage_taken = Trunc(100 * MineHitDamageFor100KT / Hull_mass) ...für normale Minen Trunc(100 * WebHitDamageFor100KT / Hull_mass) ...für Fangminen Andere Auswirkungen eines Minentreffers (es werden alle Möglichkeiten überprüft, in dieser Reihenfolge):
Wurmlöcher (wormholes)Allgemeine DatenDie Größe des Wurmloch-Endpunktes hängt von der Masse ab. Wormhole_radius = (Wormhole_mass ^ (WrmEntryPowerX100 / 100)) / 2 Intern verwendet PHost die exakten Zahlen mit Kommastellen. In Ufos wird Trunc(Wormhole_radius) übermittelt (Versionen bis 3.3d setzen immer den Wert 5 ein). Bewegung der Endpunkte: Wurmloch-Endpunkte bewegen sich jeden Zug. Sie bewegen sich WrmDisplacement Lichtjahre in X/Y-Richtung auf ihr Ziel zu, und zusätzlich noch einen zufälligen Wert bis zu WrmRandDisplacement. Endpoint_displacement = Waypoint_displacement + Random_displacement ...mit Random_displacement = Random(1 + 2*WrmRandDisplacement) - WrmRandDisplacement Waypoint_displacement = Waypoint_position - Endpoint_position ...höchstens WrmDisplacement ...mindestens -WrmDisplacement Größenänderungen: Wurmlöcher ändern Masse und Instabilität jeden Zug. Mass_change = WrmMassAdd + Random(1 + 2*WrmRandMass) - WrmRandMass Instability_change = -WrmStabilityAddX10 / 10 + Random(1 + 2*WrmRandStability) - WrmRandStability Die Masse ist eine ganze Zahl zwischen 1 und 32767, die Instabilität ist eine (möglicherweise gebrochene) Zahl zwischen 0 und 100. Wenn die Masse durch diesen Vorgang auf 0 fällt, ist das Wurmloch kollabiert und PHost setzt die Start- und End-Koordinaten auf (0,0). Nach Wurmlöchern scannenSei Ship_dist die Entfernung zwischen dem scannenden Schiff und dem Mittelpunkt des Wurmloch-Eingangs (die X,Y aus wormhole.txt). Deterministischer Scan: Ein Schiff sieht alle Wurmlöcher, für die Ship_dist <= WrmScanRange gilt. Ein Schiff mit der ScansAllWormholes-Funktion sieht alle Wurmlöcher, für die Ship_dist <= 2 * WrmScanRange gilt. Diese Regeln werden nur verwendet, wenn WrmScanRange nicht 0 ist. Probabilistischer Scan: Die Wahrscheinlichkeit, ein Wurmloch zu sehen, hängt von dessen Masse ab. Detection_radius = 10 * Wormhole_mass ^ (1/3) Detection_chance = 100% ...wenn Ship_dist <= Detection_radius (4 - (Ship_dist/Detection_radius)^2) * 33.3% ...wenn Detection_radius < Ship_dist <= 2*Detection_radius 0% ...wenn Ship_dist > 2*Detection_radius Für jedes Wurmloch wird gewürfelt.
Wurmlöcher durchquerenSchiffe müssen innerhalb einer Entfernung von Wormhole_radius vom Zentrum des Endpunktes sein, um das Wurmloch betreten zu können. Beim Durchqueren eines Wurmloches belastest du dieses Wurmloch. Je stärker du das Wurmloch belastest, desto höher ist die Wahrscheinlichkeit, dass die Reise fehlschlägt. Wormhole_stress = 0 ...wenn Ship_mass < Wormhole_mass ((Ship_mass / Wormhole_mass) - 1)^2 ...sonst Travel_failure_odds = Wormhole_stress + Wormhole_instability + (Wormhole_stress*Wormhole_instability / 10) Travel_failure_figure = Random(100) Travel_fuel_usage = Fuel_usage(Equiv_distance, WrmTravelWarpSpeed) ...mit Equiv_distance = Wormhole_distance / WrmTravelDistDivisor Beachte, dass PHost bis Version 4.0j/3.4l den Wert Travel_failure_odds auf eine ganze Zahl abrundet. Spätere Versionen verwenden den genauen Wert. Mögliche Ergebnisse einer Wurmloch-Reise: Travel_fuel_usage > Fuel Durchquerung schlägt fehl: New_ship_X = 1000 + Random(2001) New_ship_Y = 1000 + Random(2001) Damage_taken = 25 + Random(75) Travel_fuel_usage <= Fuel und Travel_failure_figure >= Travel_failure_odds Sichere Durchquerung: New_ship_X = Endpoint_X - 10 + Random(21) New_ship_Y = Endpoint_Y - 10 + Random(21) Damage_taken = 0 Travel_fuel_usage <= Fuel and Travel_failure_figure < Travel_failure_odds Erfolgreiche Durchquerung, Schaden genommen: New_ship_X = Endpoint_X - 10 + Random(21) New_ship_Y = Endpoint_Y - 10 + Random(21) Damage_taken = (Travel_failure_odds - Travel_failure_figure) ^ 2 Die Instabilität eines Wurmloches gibt eine Bewertung der Sicherheit des Wurmloches an. Ein Wurmloch wird in eine der folgenden Kategorien eingeordnet, die den Spielern mitgeteilt wird: Wormhole_stability_rating = "very stable" ...wenn Wormhole_instability <= 5 "stable" ...wenn Wormhole_instability <= 15 "mostly stable" ...wenn Wormhole_instability <= 30 "unstable" ...wenn Wormhole_instability <= 50 "very unstable" ...wenn Wormhole_instability <= 80 "completely unstable" ...sonst IonenstürmeIonenstürme werden in Klassen aufgeteilt, die im Regelwerk beschrieben sind. Die Ergebnisse dieser Formeln werden durch die Einstellungen MaximumIonStormRadius und MaximumIonStormVoltage begrenzt. Bewegung der StürmeSpeed = 8 ...wenn Voltage > 250 6 ...wenn Radius < 200 2 + Random(3) ...sonst, also zufällig zwischen 2 und 4 Heading = Old_heading - 10 + Random(21) ...also Änderung um +/- 10 Grad Neue IonenstürmeInitial_voltage = 5 + Random(Trunc(Number_of_ships_in_game) / 5) ...später im Spiel also stärkere Stürme Initial_radius = 10 + Random(190) ...also 10 bis 200 Die Start-Geschwindigkeit wird anhand der normalen Bewegungsregeln festgelegt. Die Startposition hängt von AllowWraparoundMap ab. Endloskarte aktiviertMit aktivierter Endloskarte (AllowWraparoundMap=Yes) entstehen Stürme an einer zufälligen Position mit einer zufälligen Richtung. Endloskarte deaktiviertBei deaktivierter Endloskarte (AllowWraparoundMap=No) entstehen Stürme in den äußeren Bereichen der Karte und bewegen sich ungefähr nach innen. Zuerst wählte PHost einen Winkel Angle (0..360 Grad) und eine Entfernung Distance (500..1200). Initial_X = Round(Center_X + Sin(Angle)*Distance*Size_X/2000) Initial_Y = Round(Center_Y + Sin(Angle)*Distance*Size_Y/2000) Initial_heading = Angle + 140 + Random(81) ...also in Richtung des Zentrums des Universums, aber bis zu 40 Grad nach rechts oder links abweichend Die Werte Center_X/Y und Size_X/Y sind Zentrum und Ausdehnung des Universums und werden von WraparoundRectangle abgeleitet. Dieser Parameter sollte daher dennoch korrekt gesetzt sein, obwohl keine Endloskarte benutzt wird. Mit der Standardeinstellung von WraparoundRectangle = 1000,1000,3000,3000 werden Ionenstürme in einem Abstand von 500 bis 1200 Lichtjahren vom Zentrum der Galaxis entstehen. Das ist das gleiche Verhalten wie in HOST. Für größere, kleiner, oder nicht quadratische Universen, wird durch diese Berechnungsvorschrift die Entfernung angepasst. Wachsende StürmeVoltage_change = 2 * Random(6) ...also 0 bis 10 in Schritten von Zwei Radius_change = Random(4) ...also 0 bis 3 New_voltage = Old_voltage + Voltage_change + Additional_gain New_radius = Old_radius - Radius_change ...wenn Old_radius > Radius_change 1 - (Old_radius - Radius_change) ...sonst Der Wert Additional_gain besteht aus vier Boni, die jedem Sturm gegeben werden. Beachte, dass wachsende Stürme immer ungerade Ladung haben; wenn die Ladung um eins wächst, wandelt sich der Sturm in einen abklingenden Sturm um. Alle vier Bedingungen werden überprüft, damit kann sich der Bonus zwischen Null und Vier bewegen. Additional_gain = +1 ...wenn die zweite Regel für New_radius benutzt wurde +1 ...mit 1% Wahrscheinlichkeit +1 ...mit 2.5% Wahrscheinlichkeit, wenn New_voltage > 320 ist +1 ...mit 10% Wahrscheinlichkeit, wenn New_voltage > 500 ist Abklingende StürmeVoltage_change = 4 + 2 * Random(6) ...also 4 bis 14 in Schritten von Zwei Radius_change = Random(11) ...also 0 bis 10 New_voltage = Old_voltage - Voltage_change ...der Sturm verschwindet, wenn das Ergebnis 0 oder weniger ist New_radius = Old_radius + Radius_change Pfannkuchen-Effekt (Pancaking effect): Der Pfannkuchen-Effekt tritt mit einer Wahrscheinlichkeit von 1:33 nach der normalen Radius- und Ladungs-Änderung auf. Hierdurch kann der Sturm auch wieder in einen wachsenden Sturm verwandelt werden. Voltage_after_pancaking = Round(Sqrt(New_voltage)) Radius_after_pancaking = 2 * New_radius Verschmelzende StürmeStürme Id_1 und Id_2 verschmelzen, wenn sie sich teilweise überlappen: Distance_of_centers^2 <= Radius_1^2 + Radius_2^2. New_X = Trunc((X_1 * Voltage_1 + X_2 * Voltage_2) / (Voltage_1 + Voltage_2)) New_Y = Trunc((Y_1 * Voltage_1 + Y_2 * Voltage_2) / (Voltage_1 + Voltage_2)) ...gewichteter Mittelwert; näher zum Zentrum des stärkeren Sturms New_Radius = Trunc(Sqrt(Radius_1^2 + Radius_2^2)) ...der neue Sturm ist größer als die ursprünglichen New_voltage = Trunc((Voltage_1 * Radius_1^2 + Voltage_2 * Radius_2^2) / (Radius_1^2 + Radius_2^2)) ...gewichteter Mittelwert Die Id-Nummer des neuen Sturmes ist die Id des stärkeren Sturms; bei gleichen Stürmen die höhere von beiden. Richtung und Geschwindigkeit werden von diesem Sturm beibehalten. Ob der Sturm wächst oder abklingt ergibt sich aus der errechneten New_voltage. AuswirkungenSchiffe: Alle Stürme enttarnen Schiffe, die kein verbessertes Tarngerät haben. Stürme, die stärker als 150 MeV sind, beeinflussen alle Schiffe, die nicht tarnen oder derart enttarnt wurden, und die keinen Ionenschild haben. Insbesondere bedeutet das, dass Schiffe mit Verbesserter Tarnung vor Ionenstürmen sicher sind, solange sie tarnen. Damit können sie aber im Sturm nichts weiter unternehmen. Schiffe mit Ionenschild können dagegen jede mögliche Mission ausführen, ohne Gefahr zu laufen, vom Sturm beschädigt zu werden. Der Ionenschild alleine hilft allerdings nicht, die Tarnung aufrecht zu erhalten. Ship_new_location_X = Round(Ship_location_X + Sin(Heading) * Distance) Ship_new_location_Y = Round(Ship_location_Y + Cos(Heading) * Distance) ...mit Distance = 0.75 * Storm_warp^2 Heading = Storm_heading * PI/180 (also Winkel im Bogenmaß) Ship_damage_taken = Trunc((Random(200) + Storm_voltage - Ship_mass - 20 * Ship_engine) * Exp_modificator) ...mit Exp_modificator = 1 ...wenn NumExperienceLevels = 0 1 - (Ship_experience_level / NumExperienceLevels) ...sonst ...plus 50 wenn Schiff keinen Treibstoff hat ...natürlich mindestens 0 Ship_damage = Ship_damage + Ship_damage_taken Ship_crew = Trunc(Ship_crew * (100 - Ship_damage_taken) / 100) Ship_experience_gain = Trunc(EPShipIonStorm100MEV * (Storm_voltage - 100) / 100) Minenfelder: Ionenstürme können Minenfelder verdecken, so dass Schiffe sie nicht sehen können. Ein Minenfeld wird verdeckt, wenn alle der folgenden Bedingungen zutreffen:
Ein verdecktes Minenfeld kann mit Geschützen alleine nicht geräumt oder gesehen werden. Wenn das Schiff jedoch seine Raumjäger zum Minenräumen einsetzen kann (FighterSweepRate ist nicht null), werden diese das Minenfeld sehen und räumen. Letzte Aktualisierung 31 May 2015. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
support@phost.de for support, ideas, bug reports, questions. Contact Details | Mail