PHost - Formeln

PHost 4.1h


Inhalt

Einleitung

Dieses 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.

Notation

Variablennamen (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.

Abs(X) Absolutwert (Betrag) von X
ArcTan(X,Y) Arcus-Tangens von X/Y (vier Quadranten), ergibt Winkel in Bogenmaß
Wenn für X und Y entsprechend X/Y-Koordinatendifferenzen übergeben werden, entspricht der Winkel, wenn nach Gradmaß konvertiert, einem Winkel, wie er in Scanner-Berichten angegeben wird (0=Nord, 90=Ost, 180=Süd, 270=West). Beachte, dass die konventionelle mathematische Definition der ArcTan-Funktion Y/X als Parameter verwendet, nicht X/Y, und somit andere Winkel ergibt (0=Ost, entgegen dem Uhrzeigersinn).
Ceil(X) Nächst-größere ganze Zahl, mit Erhalt des Vorzeichens (Aufrunden, falls die Zahl Nachkommastellen hat). Beispiel: Ceil(10.0) = 10, Ceil(10.1) = 11, Ceil(-5.2) = -6
Cos(X) Kosinus von X, Parameter ist in Bogenmaß
ERnd(X) Runden auf näheste ganze Zahl (falls der Parameter genau auf .5 endet, wird in Richtung der nächsten geraden Zahl gerundet)
Exp(X) Exponentialfunktion (2.7182^X)
Ln(X) Natürlicher Logarithmus
Max(X,Y,...) Maximum
Min(X,Y,...) Minimum
PI Die Kreiszahl π = 3.14159265358979323846
Random(X) Zufällige ganze Zahl, zwischen 0 (eingeschlossen) und X (nicht eingeschlossen). Beispielsweise ergibt Random(3) eins von 0, 1, 2.
Round(X) Runden auf näheste ganze Zahl (falls der Parameter genau auf .5 endet, wird aufgerundet)
Sgn(X) Vorzeichen von X (+1 wenn positiv, -1 wenn negativ, 0 wenn Null)
Sin(X) Sinus von X, Parameter ist in Bogenmaß
Sqrt(X) Quadratwurzel von X
Trunc(X) Abschneiden der Nachkommastellen. Beispiel: Trunc(10.0) = 10, Trunc(10.1) = 10, Trunc(-5.2) = -5
X^N X-hoch-N (Potenzierung)

Nach oben


Allgemein

Score (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:

  • deine eigenen Zahlen
  • Num_capital_ships und Num_freighters deiner Verbündeten, die dir das Schiffs-Privileg bieten
  • Num_planets und Num_starbases deiner Verbündeten, die dir das Planeten-Privileg bieten

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.

Nach oben


Planeten

Übersicht über Aktionen auf Planeten

Diese 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.

Schritt Zufriedenheit/Bevölkerung Mineralien/Industrie Details
Zugverarbeitung (Phase 1) Kolonisten von/zu eigenen Schiffen transferiert. Ressourcen von/zu eigenen Schiffen transferiert. Ressourcen werden für Gebäude, Sternenbasen, Raumschiffteile und Munition ausgegeben (Sternenbasen werden zu diesem Zeitpunkt errichtet, alles andere wurde bereits vom Client erstellt).
LargeMeteors, MeteorShowers Meteore machen unglücklich und töten Bevölkerung. Meteore und Meteoritenhagel bringen Mineralien für den Planetenkern. Formeln
DeluxeSuperSpy Super Spy Deluxe löst Ionenpuls aus, dadurch Verlust von Verteidigung
CargoDump Bodenkampf Formeln
Training Schiffe verbrauchen Vorräte für das Training
GatherMission Schiffe laden Mineralien auf
SpecialMissions_1 Lizards hissen Formeln
BuildFighters, BuildTorpedoes Schiffe laden Mineralien auf
ShipBuilding_1 Durch Klonen werden Ressourcen verbraucht.
DumpOldBaseParts Sternenbasen recyceln alte Raumschiffteile
BaseMissions_1 Sternenbasen recyclen Raumschiffe, danach bauen sie die Verteidigung aus oder laden Torpedos auf Raumschiffe
FreeFighters Sternenbasen bauen "Gratis"-Raumjäger
GloryDevices Glory Devices töten Bevölkerung und amorphe Ureinwohner Glory Devices beschädigen den Planeten Formeln
ColonizeMission Colonize-Schiffe bringen Kolonisten Colonize-Schiffe bringen Mineralien Formeln
BaseMissions_2 Sternenbasen tanken Schiffe auf bzw. entladen sie
Combat Im Kampf können Einwohner sterben.
Zufriedenheit ändert sich bei Übernahmen.
Verteidigungsposten werden zerstört Wirkung auf Planeten, Kampf
Terraforming Terraforming macht den Planeten besser bewohnbar.
SensorSweep Sensor Sweep entdeckt Planeten entsprechend dem industriellen Ausbau. Formeln
SpecialMissions_2 Pillage / RGA machen Einwohner unglücklich Pillage / RGA zerstören planetare Einrichtungen, Dark Sense findet die Situation nachher Formeln
PlanetaryProduction Bergbau, Produktion von Vorräten, Trans-Uran-Zerfall Formeln
PlanetaryHappiness Wenn die Zufriedenheit 29 oder niedriger beträgt, werden die Steuern auf 0 gesetzt. Danach wird die neue Zufriedenheit ermittelt. Formeln
PlanetaryTaxation Steuern werden eingesammelt Formeln
PlanetaryGrowth Wachstum Formeln
PlanetaryLosses Tod durch Extremklima, danach Verluste durch Aufstände Überbevölkerung verbraucht Vorräte, danach Strukturverfall, danach Verluste durch Aufstände, danach frühstücken die Amorphe ihre Kolonistenration Formeln
ShipBuilding_2 Durch Klonen werden Ressourcen verbraucht.
Assimilation Cyborgs assimilieren Eingeborene Formeln

Gebäude-Limits

Maximale 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äge

Groß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).

Bodenkampf

Bodenkampf 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.

Hiss

Hiss 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-Abtastung

Gebä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 Angriffe

Pillage (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 produzieren

Bergbau: 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

Besteuerung

Steuern 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ölkerungswachstum

Maximale 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.

Assimilation

Cyborgs 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.

Nach oben


Schiffe

Übersicht über Aktionen auf Schiffen

Diese 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.

Schritt Fracht, Treibstoff, Tarnung Schaden, Mannschaft, Mission Details
Zugverarbeitung (Phase 1) Frachttransfer von/zu eigenen Einheiten. Schiffe, die tarnen sollen, tun dies. Client wählt die Mission. Die Gültigkeit von Tow/Intercept-Aufträgen wird jetzt überprüft.
TransferOwner Schiffe enttarnen nach Besitzerwechsel Mission und Kurs werden nach Besitzerwechsel gelöscht
AntiCloak_1 Lokis enttarnen Schiffe
DeluxeSuperSpy Ionenpuls kann Schiffe enttarnen
RobMission Schiffe rauben oder werden beraubt
GamblingShips Geld durch Spielhallen
CargoDump, CargoTransfer Schiffe erhalten Fracht
Überschüssige Fracht wird zurückgegeben
Bodenkampf
TrimShipCargo Überladung wird entfernt
CrewExchange Mission Crew Exchange
Training Mission Training Formeln
BeamTransfers Schiffe übergeben/erhalten Fracht
GatherMission, BeamUpCredits Schiffe laden Fracht auf
MineLaying Schiffe wandeln Torpedos in Minenfelder um Formeln
MineSweeping Schiffe sammeln Torpedos aus Minenfeldern Formeln
WebDraining Schiffe verlieren in Fangminenfeldern Sprit
IonStormEffects Ionenstürme enttarnen Schiffe werden beschädigt und verlieren Mannschaft Formeln
SpecialMissions_1 Super Refit, Repair Ship, Self Repair
BuildFighters Build Fighters
BuildTorpedoes mkt usw.
Alchemy Alchemiefunktionen
ShipBuildOrders Schiffe, die sich klonen wollen, werden auf Warp 0 gesetzt
BaseMissions_1 Schiffe erhalten Torpedos Schiffe werden repariert oder verschrottet, oder zur Aufgabe gezwungen
SupplyRepair_1 Vorräte werden für... ...Reparatur benutzt Formeln
BoardingParties Schiffe werden geentert Formeln
TowResolution Tow-Konflikte werden aufgelöst Formeln
Movement Treibstoffverbrauch durch Bewegung und Tarnung
Minentreffer können Schiffe enttarnen
Minentreffer beschädigen Schiffe Bewegungs-Formeln
Allg. Treibstoffverbrauch
GloryDevices Schaden von explodierenden Glory Devices Formeln
Chunneling Treibstoffverbrauch durch Chunnel Chunneling löscht Waypoints
AntiCloak_2 Lokis enttarnen Schiffe
ColonizeMission Schiffe landen auf Planeten und werden verschrottet Formeln
SupplyRepair_2 Vorräte werden für... ...Reparatur benutzt Formeln
BaseMissions_2 Sternenbasen tanken Schiffe auf oder entladen diese
Combat Treibstoffverbrauch
Enttarnung durch Schaden
Borg sammeln Trümmer auf
Schiffe nehmen Schaden, verlieren Mannschaft, wechseln den Besitzer Formeln
SupplyRepair_3 Vorräte werden für... ...Reparatur benutzt Formeln
SensorSweep Formeln
SpecialMissions_2 Plündernde Schiffe sammeln Geld/Vorräte auf Formeln
Experience Erfahrungs-Upgrades

Allgemeine Formeln für Schiffe

Fü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).

Masse

Viele 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.

  • Die Hüllenmasse (Hull_mass) ist einfach die Masse der Hülle des Schiffs. Sie wird benutzt, um Effekte zu berechnen, die die Hülle oder in diese eingebaute Geräte betreffen.
  • Die Gesamtmasse (Total_ship_mass) ist die Masse des kompletten Schiffes.
  • Die Kampfmasse (Combat_mass) wird im Kapitel über Kampf definiert, und beschreibt die Widerstandsfähigkeit des Schiffes gegen gegnerische Waffen.
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.

Tarnung

Schiffe, 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 erhalten

Schiffe 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)

Training

Schiffe, 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 Repair

Die 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

Boarding

Schiffe 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)
  • Engine_tech ist der Techlevel des Triebwerks (also 10 für den Transwarp Drive)
  • Eff_engines ist die Anzahl Triebwerke des Schiffs, mal zwei wenn das Schiff gravitonische Triebwerke hat, plus weitere 2, wenn das Schiff einen Stufe-2-Traktorstrahl hat.
  • Movement_distance ist eine Schätzung, wie weit das Schiff sich diesen Zug regulär bewegen wird.
    • Waypoint_distance ist die Entfernung zum Zielpunkt. Für Schiffe, die hyperspringen wollen, wird hier 350 eingesetzt, unabhängig vom eigentlichen Zielpunkt.
    • Max_dist ist die maximale Entfernung, die das Schiff laut seiner eingestellten Geschwindigkeit zurücklegen kann, siehe bei den Bewegungsformeln. Ein normales Schiff mit Warp 9 hat hier den Wert 81.
    • Max_allowed_by_fuel ist die maximale Entfernung, die das Schiff zurücklegen kann, bis ihm der Treibstoff ausgeht. Bei der Berechnung der Stärke des Schleppers wird hier die Masse des abgeschleppten Schiffes mit berücksichtigt.

Movement

Allgemein

Bevor 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

Spritverbrauch

Fuel_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 Entfernung

Die 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:

  • Aufgrund des Ceil(...) ist sichergestellt, dass du immer deine Maximaldistanz zurücklegen kannst. Eine Entfernung von 81 ly wird mit Warp 9 also immer geschafft, es wird nicht passieren, dass du durch Rundungseffekte nur einen kürzeren Weg schaffst. Für die Berechnung des Spritverbrauchs wird der zusätzliche Weg nicht mit eingerechnet (er ergibt aber beim Ramscoop auch keinen zusätzlichen Treibstoffgewinn).
  • Durch Rundungseffekte kann es passieren, dass Minentreffer etwas außerhalb eines Minenfeldes gemeldet werden.

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.

Ramscoop

Schiffe 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.

Gravitation

Die 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:

  • AllowGravityWells ist aktiviert;
  • Das Schiff umkreist nicht bereits einen Planeten
  • Das Schiff hat sich selbst bewegt (geschleppte Schiffe bewegen sich mit dem schleppenden Schiff, und werden dann von Gravitation beeinflusst, wenn der Schlepper beeinflusst wird);
  • Wenn das Schiff einen Hypersprung ausgeführt hat, wird es nur beeinflusst, wenn AllowHyperjumpGravWells eingeschaltet ist;
  • Wenn das Schiff sich normal bewegt, wird es nur betroffen, wenn es nicht Warp 1 fliegt.

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ösung

Fü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ünge

Hypersprung-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 Device

Wenn 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)

Kolonisieren

Schiffe 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.

Nach oben


Kampf

Startparameter für Raumschiffe

  • Solange keine andere Regel festlegt, dass das Schiff ohne Schilde beginnt, ist der Startwert der Schilde:
    Trunc(100 - 2*Damage/3)
                         ...bei Lizard-Schiffen
    Trunc(100 - Damage)  ...sonst
    Insbesondere werden die Schilde nicht durch den Treibstoffvorrat eines Schiffes beeinflusst. Wenn ein Schiff ohne Treibstoff gegen einen Planeten kämpft (aufgrund des Kommandocodes NUK), wird es dennoch den Kampf mit vollen Schilden beginnen, wenn keine andere Regel etwas anderes bestimmt.
  • Die Kampfmasse (combat mass) eines Schiffes ist:
    Hull_mass + Trunc(ESB_Rate * Engine_cost / 100)
    ...plus 50 if ship is Fed
    Dabei ist Engine_cost der Preis eines Triebwerkes des Schiffes. ESB_Rate ist die Summe der folgenden Komponenten:
  • Die Bewaffnung eines Schiffes ist nur eingeschränkt funktionsfähig, wenn das Schiff beschädigt ist.
    Beam_count =
       Ship_beams        ...wenn das Schiff Volle Bewaffnung hat
       Min(Ship_beams, Max_beams - Trunc(Max_beams * Damage / Divisor))
                         ...sonst
    
    Tube_count =
       Ship_tubes        ...wenn das Schiff Volle Bewaffnung hat
       Min(Ship_tubes, Max_tubes - Trunc(Max_tubes * Damage / Divisor))
                         ...sonst
    
    Bay_count =
       Basis_bays + Bonus_bays
       ...mit
          Basis_bays =
             Ship_bays   ...wenn das Schiff Volle Bewaffnung hat
             Max_bays - Trunc(Max_bays * Ship_damage / Divisor)
                         ...sonst
          Bonus_bays =
             ExtraFighterBays + EModExtraFighterBays
                         ...wenn Basis_bays > 0
             0           ...sonst
    
    Divisor =
       150               ...für Lizardschiffe
       100               ...sonst
    Max_beams, Max_tubes und Max_bays sind die Maximalwerte, die für diesen Schiffstyp möglich sind.

Startparameter für Planeten

Die 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 Kampf

Daten der Waffen

Beam_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 Waffen

Jeder Waffentreffer wird durch drei Angaben charakterisiert:

  • Expl_Power ist die Sprengkraft der Waffe, die Schilde und Hülle beschädigt.
  • Kill_Power ist die Strahlung, die von der Waffe ausgeht und Crew tötet.
  • Waffen können Todesstrahlen aussenden, die sich etwas anders verhalten als normale Waffen. Todesstrahlen töten auch dann Mannschaft eines Schiffes, wenn das Schiff noch Schilde hat, und beschädigen das Schiff selbst nicht.

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 Kampf

Die 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 Combat

Die 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 Schiffe

Schiff 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ümmer

Wenn 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 Planeten

Planet 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.

Nach oben


Minenfelder

Übersicht über Aktionen mit Minenfeldern

Diese Tabelle listet alle Ereignisse auf, die Minenfelder direkt oder indirekt betreffen, in der Reihenfolge, in der sie passieren.

Schritt Aktion Details
MinefieldDecay Minenfelder verfallen Formulas
MineLaying Schiffe legen Minen (z.B. Missionen Lay Mines und Lay Web Mines). Formeln
MinesDestroyMines Überlappende feindliche Minenfelder zerstören einander. Formeln
MineSweeping Schiffe räumen gegnerische Minen und sammeln eigene Minen auf. Formeln
MinefieldScan Schiffe senden Minenscan-Berichte
WebDraining Fangminen-Felder entziehen Schiffen Treibstoff
MoveIonStorms Ionenstürme bewegen sich (heißt: es ergibt sich aus ihrer alten Position, welche Minenfelder sie verdecken)
BuildTorpedoes Schiffe bauen Torpedos (heißt: die auf den Schiffen gebauten Torpedos können nicht im gleichen Zug gelegt werden).
BaseMissions_1 Enthält die Mission Load Torpedoes onto Ships (heißt: neu aufgeladene Torpedos können nicht im gleichen Zug gelegt werden).
Movement Schiffe bewegen sich (und sind damit durch Minenfelder gefährdet). Formeln zu Minentreffern
SupplyRepair_2 Schiffe reparieren sich (z.B. beheben Minentreffer-Schaden)
BaseMissions_2 Enthält die Mission Refuel Ships, welche neuen Treibstoff auf Schiffe lädt (die z.B. in Fangminen welchen verloren haben)
Combat Kampf Formeln für den Kampf

Allgemein

Minenfelder 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

Minenlegen

Torpedo-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 explodieren

Voraussetzungen: 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:

  • Minenfelder haben unterschiedliche Typen (Fangminen vs. normal) und AllowMinesDestroyWebs ist ausgeschaltet (Standardeinstellungen)
  • Minenfelder gehören dem selben Spieler
  • Minenfeld-Besitzer sind verbündet und haben eine beidseitige Minenfeld-Allianz

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äumen

Minenrä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.

Minentreffer

Minentreffer-Wahrscheinlichkeit

Die 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 Minentreffers

Damage_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):

  • wenn das Schiff eine Fangmine getroffen hat, verliert es Max(WebHitFuelLoss, Fuel/6) kt Treibstoff und hält an (Warp 0).
  • Wenn das Schiff den Lizards gehört und mehr als 150% Schaden hat, explodiert es. Lizard-Schiffe mit mehr als 100% Schaden können ihre Bewegung beenden (und somit beispielsweise ein abgeschlepptes Schiff ans Ziel bringen), explodieren aber am Ende der Bewegung.
  • wenn das Schiff nicht dem Lizard gehört und 100% Schaden erreicht hat, explodiert es.
  • wenn das Schiff DamageLevelForCloakFail überschreitet, muss es enttarnen (das beeinflusst seine Minen-Treffer-Rate für mögliche weitere Bewegung).
  • wenn das Schiff Triebwerkspanzerung besitzt, fliegt es normal weiter (es sei denn, es wurde durch eine Fangmine auf Warp 0 gebremst).
  • sonst,
    • wenn HullTechNotSlowedByMines = 0, wird die Geschwindigkeit anhand der Tempolimit-Formel am Anfang dieses Abschnitts neu ermittelt. Die Bewegung wird dann für die restliche Zeit mit der geringeren Geschwindigkeit fortgesetzt. In anderen Worten, Permitted_dist wird auf Distance_moved + New_max_dist * (1.0 - Movement_time_used) reduziert.
    • sonst, wenn Hull_tech < HullTechNotSlowedByMines, wird die Permitted_dist um 10 ly reduziert. Ein normales Schiff mit Warp 9 hat beispielsweise eine Permitted_dist von 81 ly. Der erste Minentreffer senkt diese auf 71 ly, der zweite auf 61 ly, und so weiter.
    • sonst, wenn Hull_tech >= HullTechNotSlowedByMines, bewegt sich das Schiff normal weiter.

Nach oben


Wurmlöcher (wormholes)

Allgemeine Daten

Die 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 scannen

Sei 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.

  • Schiffe mit der Funktion ScansAllWormholes sehen alle so gefundenen Wurmlöcher.
  • Andere Schiffe sehen nur das jeweils näheste Wurmloch, das auf diese Weise gefunden wurde (das muss nicht das näheste Wurmloch sein, es könnte ein anderes Wurmloch näher dran sein, welches zufällig übersehen wurde).

Wurmlöcher durchqueren

Schiffe 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

Nach oben


Ionenstürme

Ionenstü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ürme

Speed   = 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ürme

Initial_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 aktiviert

Mit aktivierter Endloskarte (AllowWraparoundMap=Yes) entstehen Stürme an einer zufälligen Position mit einer zufälligen Richtung.

Endloskarte deaktiviert

Bei 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ürme

Voltage_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ürme

Voltage_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ürme

Stü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.

Auswirkungen

Schiffe: 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:

  • Der Radius des Ionensturms ist größer als der Radius des Minenfeldes, also Storm_radius > Minefield_radius.
  • Das Zentrum des Minenfelds liegt innerhalb des Ionensturms, also Distance_between_centers <= Storm_radius
  • Das scannende Schiff gehört nicht dem Besitzer des Minenfeldes.

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.

Nach oben


Letzte Aktualisierung 31 May 2015.


Mail support@phost.de for support, ideas, bug reports, questions. Contact Details