![]() |
Formeln
|
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.
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ß |
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) |
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.
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 |
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.
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 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 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.
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
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
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)
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
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.
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
Ü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.
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.
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 |
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.
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.
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.
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.
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)
Schiffe, die trainieren, nutzen Vorräte des Planetens, den sie umkreisen, um Erfahrung zu erlangen.
Experience_added = EPTrainingScale * Points / (Sqrt(Hull_Crew) + 1) ...mit Points = Supplies wenn Supplies <= 25 Points = 25 + Sqrt(8*(Supplies-25)) sonst
(v4.0i:) Akademie-Schiffe erhalten beim Training die vierfache Erfahrung.
Siehe Training für eine umfangreichere Beschreibung des Trainings.
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
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 = 2 und Crew_beamed_over = 0.
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)
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
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.
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 * Cos(Heading)), Position_Y + Ceil(Distance_moved * Sin(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.
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.
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:
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.
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.
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
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)
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.
Trunc(100 - 2*Damage/3) ...bei Lizard-Schiffen Trunc(100 - Damage) ...sonst
Hull_mass + Trunc(ESB_Rate * Engine_cost / 100) ...plus 50 if ship is FedDabei ist Engine_cost der Preis eines Triebwerkes des Schiffes. ESB_Rate ist die Summe der folgenden Komponenten:
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 ...sonstMax_beams, Max_tubes und Max_bays sind die Maximalwerte, die für diesen Schiffstyp möglich sind.
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
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.
Jeder 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.
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.
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).
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)
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.
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 * ColonistCombatSurvivalRate / 100) Colonist_happiness_after_combat = Colonist_happiness - Trunc(ColonistCombatSurvivalRate / 2) ...mindestens MinimumHappiness Experience_points_after_combat = Trunc(Experience_points * ColonistCombatSurvivalRate / 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.
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 |
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.
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
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.
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:
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.
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.
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)
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):
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).
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 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ürme werden in Klassen aufgeteilt, die im Regelwerk beschrieben sind.
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
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
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
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.
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:
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 20 September 2008.