[PHost Logo]

Formeln
Der Portable Host
Version 4.0i

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.

Die genaue Abfolge der Ereignisse ist auf der Seite über den Host-Ablauf dokumentiert.

Das Dokument ist nach dem Auslöser einer Aktion gruppiert. Beispielsweise ist Pillage eine Schiffsmission und wird damit im Abschnitt Schiffe dokumentiert. Kampf betrifft Schiffe und Planeten und wird separat dokumentiert.

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 in die bekannteren Clans umgewandelt. Da VGA Planets keine "halben" Clans handhaben kann, hat PHost sowieso nach jedem Schritt gerundet.

Wenn eine Folge von "wenn..."-Sätzen angegeben ist, gilt der erste, der zutrifft.

Trunc(X) Nachkommastellen von X abschneiden
Round(X) X runden (auf die näheste ganze Zahl; aufrunden, wenn die Zahl genau auf .5 endet)
ERnd(X) X runden (auf die näheste ganze Zahl; wenn die Zahl genau auf .5 endet, wird in Richtung der nähesten ganzen Zahl gerundet)
Ceil(X) Nächst-größere ganze Zahl (aufrunden, wenn die Zahl Nachkommastellen hat)
Sqrt(X) Quadratwurzel von X
Exp(X) Exponentialfunktion (2.7182^X)
Ln(X) Natürlicher Logarithmus von X
Random(X) Zufallszahl zwischen 0 (inklusiv) bis zu X (nicht inklusiv). Beispielsweise liefert Random(3) eine der Zahlen 0, 1 oder 2.
PI Die Zahl PI = 3.14159265358979323846

Nach oben


Schiffe

Allgemein

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

Fuel_burned_per_fight =
   Ceil(Ship_hull_mass * FuelUsagePerFightFor100KT / 100)

Wirkung der Missionen

Pillage-Mission der Klingonen: 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

Nach oben


Planeten

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

Gebäude

Maximum: 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. Die dann überschüssigen Gebäude verfallen mit der in StructureDecayPerTurn angegebenen Geschwindigkeit.

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

Produktion

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

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

Zufriedenheit (Happiness): Änderung der Zufriedenheit durch Besteuerung. 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).

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 der Besitzer Crystal und CrystalsPreferDeserts aktiv ist
   ...mit Target_temperature = 50 and Temp_divisor = 33
      sonst

Native_happiness_change =
   Trunc(5 + Native_gov_factor / 2
         - Sqrt(Native_clans / 10000)
         - (Mines + Factories) / 200
         - Native_tax * 0.85)
   ...plus 10 bei Avian-Eingeborenen

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

Bergbau: Die maximale Mineralienmenge, die pro Zug abgebaut werden kann, hängt von der Dichte der Mineralien ab.

Max_minerals_mined =
   Trunc(Mining_rate * Mine_count / 100)
   ...mit Mining_rate = Trunc(RaceMiningRate * Mineral_density / 100) * RF
   ...und RF = 2 for Reptilian natives, 1 otherwise

Minerals_mined =
   Min(Max_minerals_mined, Minerals_in_core)
   

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.

New_minerals_in_core =
   Trunc((TransuraniumDecayRate * Mineral_density + 50) / 100)

Bevölkerung

Cyborg-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

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 =
   Max_colonist_clans + Supply_bonus
      ...wenn ClimateLimitsPopulation eingeschaltet ist
   250000
      ...sonst (25 Millionen Kolonisten)

Max_colonist_clans =
   Max(Trunc(100000 * Sin(Temperature * PI / 200)), 1)
                    ...wenn die Kolonisten Crystals sind
                       und CrystalsPreferDeserts eingeschaltet ist
                       und CrystalSinTempBehavior eingeschaltet ist
                       und Temperature >= 15
   3 + Trunc(MaxColTempSlope * Temperature / 100)
                    ...wenn die Kolonisten Crystals sind
                       und CrystalsPreferDeserts eingeschaltet ist
                       und CrystalSinTempBehavior eingeschaltet ist
                       und Temperature < 15
   Max(1000 * Temperature, 1)
                    ...wenn die Kolonisten Crystals sind
                       und CrystalsPreferDeserts eingeschaltet ist
                       und CrystalSinTempBehavior ausgeschaltet ist
   90000
                    ...wenn die Kolonisten Rebels sind und Temperature < 20
                       (9 Millionen Kolonisten)
   3 + Trunc(MaxColTempSlope * Temperature / 100)
                    ...wenn Temperature < 15
   1 + Trunc((100-Temperature) * MaxColTempSlope / 100)
                    ...wenn Temperature > 84
                    ...mindestens 60 bei Klingonen, Robots, Rebels oder Colonies
   Trunc(100000 * Sin(Temperature * PI / 100))
                    ...in allen anderen Fällen

Supply_bonus =
   Trunc(Supplies / 40)
                    ...wenn AllowEatingSupplies eingeschaltet ist
   0                ...sonst

Für Eingeborene gelten einfachere Formeln. Das absolute Maximum sind 15.6 Millionen Eingeborene (156000 Clans). Vorräte helfen hier nicht, um das Limit anzuheben.

Max_native_clans =
   156000
                    ...wenn ClimateLimitsPopulation ausgeschaltet ist
   100000 * 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 / 10000) *
           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 Colonist_clans <= Max_colonist_clans
   Trunc((Colonist_clans - Max_colonist_clans) / 40 + 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.

Ü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)).

Schritt Zufriedenheit/Bevölkerung Mineralien/Industrie
LargeMeteors, MeteorShowers Meteore machen unglücklich. Meteore und Meteoritenhagel bringen Mineralien für den Planetenkern.
CargoDump Bodenkampf
Training Schiffe verbrauchen Vorräte für das Training
GatherMission Schiffe laden Mineralien auf
SpecialMissions_1 Lizards hissen
BuildFighters, BuildTorpedoes Schiffe laden Mineralien auf
ShipBuilding_1 Durch Klonen werden Ressourcen verbraucht.
DumpOldBaseParts Sternenbasen recyceln alte Raumschiffteile
BaseMissions_1 Sternenbasen recyceln 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
ColonizeMission Colonize-Schiffe bringen Kolonisten Colonize-Schiffe bringen Mineralien
BaseMissions_2 Sternenbasen tanken Schiffe auf bzw. entladen sie
Combat Im Kampf können Einwohner sterben. Verteidigungsposten werden zerstört.
TerraForming Terraforming macht den Planeten besser bewohnbar.
SensorSweep Sensor Sweep entdeckt Planeten entsprechend dem industriellen Ausbau.
SpecialMissions_2 Pillage / RGA machen Einwohner unglücklich Pillage / RGA zerstören planetare Einrichtungen, Dark Sense findet die Situation nachher
PlanetaryProduction Bergbau, Produktion von Vorräten, Trans-Uran-Zerfall
PlanetaryHappiness Wenn die Zufriedenheit 29 oder niedriger beträgt, werden die Steuern auf 0 gesetzt. Danach wird die neue Zufriedenheit ermittelt.
PlanetaryTaxation Steuern werden eingesammelt
PlanetaryGrowth Wachstum
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
ShipBuilding_2 Durch Klonen werden Ressourcen verbraucht.
Assimilation Cyborgs assimilieren Eingeborene

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.

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

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


Combat

Startparameter für Raumschiffe

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)

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(above, 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(above, 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
   ...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)

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
Torp_recharge_rate = Eff_TubeRechargeRate
    + Trunc((Torp_Kill_Power + Torp_Expl_Power) * Eff_TubeRechargeBonus
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:

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.

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.

Shield_damage = (Expl_Power * Eff_ShieldDamageScaling
                 + Kill_Power * Eff_ShieldKillScaling) / (Mass + 1)
         wenn AllowAlternativeCombat eingeschaltet ist
              = Trunc(obiges + 1.5)
         wenn AllowAlternativeCombat ausgeschaltet ist

Hull_damage = (Expl_Power * Eff_HullDamageScaling) / (Mass + 1)
         wenn AllowAlternativeCombat eingeschaltet ist
            = Trunc(1.5 + (Shield_damage * Eff_HullDamageScaling
                             / (Mass + 1))
         wenn AllowAlternativeCombat ausgeschaltet ist

Crew_killed = (Kill_Power * Eff_CrewKillScaling) / (Mass + 1)
         wenn AllowAlternativeCombat eingeschaltet ist
            = Trunc(obiges + 0.5)
         wenn AllowAlternativeCombat ausgeschaltet ist
         ...mindestens 1, wenn AllowAlternativeCombat ausgeschaltet
            ist und die Waffe Todesstrahlen feuert.

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

Nach oben


Dieses Dokument wird vom Portable Host Projekt (support@phost.de) gepflegt.

Letzte Aktualisierung 23 January 2005.