Für alle die sich immer schon mal gefragt haben wie der Militärwert in der Demo zustande kommt oder warum die Stadtstaaten plötzlich doch keine Angst haben gibt es hier ein paar aus dem Quellcode herausgefischte Erkenntnisse:
Den ganzen Text gibts mit schönen Formeln (aber ohne Smileys) als PDF im Anhang.
1. Unit Power
Civ weist jeder Einheit einen gewissen Wert zu um dessen Stärke einzuschätzen. Im Quellcode heißt der Power deswegen nenn ich den jetzt auch einfach mal so. Dieser Wert hat mit Kampfstärke oder Kämpfen nix zu tun sondern dient nur dazu die Armeestärke einzuschätzen. Die Power einer Einheit hängt ab von:
- Einheitentyp
- Anzahl Beförderungen/Level
- Hitpoints
Der vom Einheitentyp abhängige Grundwert wird in Abhängigkeit von Bewegungspunkten/Kampfstärke und besonderen Fähigkeiten für jede Einheit beim Spielstart berechnet. Für eine einfache Nahkampfeinheit die sonst nix besonderes kann (z.B. Krieger) ist das Kampfstärke^1.5, für alles andere (Speerkämpfer, Katapult…) wird’s aber schon recht kompliziert. Deshalb hab ich im Anhang eine Excel-Datei in der die Grundwerte pro Einheit alle drinstehen.
Der Grundwert wird dann pro Level der Einheit um 12,5% (nichtkumulativ) erhöht, also folgendermaßen:
L = Level der Einheit
G = Grundwert
PL = Power nach Berücksichtigung des Levels
PL = G*(1+L*0,125)
Man beachte dass Einheiten (ohne Beförderung) bei Level 1 Starten, es gibt also immer mindestens auf den Basiswert 12,5% oben drauf. Das Ergebnis wird abgerundet.
Danach wird noch mit dem Anteil der Hitpoints multipliziert:
H = Hitpoints (zwischen 0 und 100)
P = Power der Einheit
P = (PL*H)/100
Das Ergebnis wird wieder abgerundet.
2. Militärwert
Der Militärwert errechnet sich zunächst einmal ganz einfach dadurch dass die Power jeder einzelnen Einheit aufsummiert wird, Schiffe aber nur zur Hälfte (abrunden) gezählt werden.
Danach wird das Gold noch Folgendermaßen berücksichtigt:
S = Summer der Einheitenpower wie oben beschrieben
G = Anzahl Gold
M = Militärwert
M = S*(1+√G/100)
Auch hier wird wieder (aber nur ganz am Ende) abgerundet.
Es wird allerdings nicht mehr als 10.000 Gold berücksichtigt, der Militärwert kann also maximal doppelt so groß sein wie die Summe der Einheitenstärke.
Damit erhält man den internen Militärwert des Spiels mit dem die Stadtstaaten (s.u.) und die KI ihre Berechnungen anstellen. Man muss noch sagen dass dieser Wert am Anfang jeder Runde berechnet wird, bevor der eigene Rundenwechsel eingeläutet wird (also bevor neues Gold erwirtschaftet wird und Einheiten fertig gebaut werden).
Die Demo zeigt diesen Wert aber leider nicht an sondern versteckt ihn ein bisschen. Angezeigt wird letzten Endes folgendes:
√M*2000
Hier wird zur Abwechslung mal (weil in Lua ausgeführt) normal auf/abgerundet, spielt aber durch die Multiplikation mit 2000 keine sooo große Rolle .
Wenn man die Formel kennt ist es dann aber auch nicht mehr schwer (durch 2000 Teilen und Quadrieren) aus dem Demowert den eigentlichen Militärwert zurück zu berechnen.
3. Stadtstaaten
Für die Erpressung von Stadtstaaten muss man einen Score über 0 drücken (kann man sich ja im Tooltip ganz schön anzeigen lassen), die verschiedenen Komponenten stehen in folgender Tabelle:
Komponente Score
Komponente Score Grundwiederstand - 110 Platzierung Militärwert 0 bis 75 Militär in der Nähe 0 bis 125 Kanonenboot Sozialpolitik 50% von Score bei Platzierung Militärwert und Militär in Nähe Einfluss (das wofür man Zahlen muss) kleiner als 30 - 300 Wurde in den letzten 10 Runden erpresst - 300 Wurde in den letzten 20 Runden erpresst - 40 Verbündet - 10 Hat Schutzversprechen von anderer Civilisation - 20 Feindlich gesinnt - 10 Militärisch - 10
Wenn man kein Gold sondern einen Bautrupp klauen möchte kommt noch folgendes hinzu:
- - 30 Zusätzlich für das Einheitklauenwollen (man könnte auch anders sagen, um einen Bautrupp zu klauen braucht man einen Score von 30).
- - 300 Falls der Stadtstaat echt weniger Bevölkerung als 4 hat (also 1-3)
Zu Militär in Nähe:
In einem gewissen Radius wird die Einheitenpower der Einheiten des Spielers und der des Stadtstaats summiert (hier zählen Schiffe normal). Der Radius ist Kartenbreite/10 (abrunden). Die Maße der Verschiedenen Kartengrößen kann man sich z.B. hier anschauen. Außerdem bekommt der Stadtstaat noch seine Stadtstärke folgendermaßen hinzugerechnet:
PS = Power der Stadt
S = Stadtstärke (angezeigt)
PS=S^1,5
Dann Wird der Quotient dieser Summen gebildet, also Summe Spielerpower durch Summe Stadtstaatenpower. In Abhängigkeit von diesem Quotienten gibt’s folgenden Score:
Quotient Score >= 3 125 >= 2 100 >= 1,5 75 >= 1 50 >= 0,5 25
Zu Militär Insgesamt:
Hier wird aus allen Militärwerten (s.o.) eine Liste erstellt, die Liste sortiert und in Abhängigkeit der eigenen Position auf dieser Liste gibt’s Punkte. Bei Gleichstand entscheidet der Sortieralgorithmus! Es ist also nicht so wie bei der Demo, dass bei Gleichstand jeder für sich 1. Ist.
Der Score berechnet sich aus der Position folgendermaßen:
S = Score durch Militärranking
P = Position in der Liste (beginnt bei 0 und geht bis Spieleranzahl – 1)
A = Anzahl der Spieler
S = (A-P)/A*75
Man bekommt also Maximal 75 und Minimal 75/A Punkte.
Quellenangabe
Ich weiß nicht ob das rechtlich einwandfrei ist den Code von Firaxis hier im Forum zu posten (zumindest hab ich nirgendwo was gefunden dass ich das darf), deswegen hab ich mal davon abgesehen und einfach nur beschrieben was passiert… Trotzdem natürlich noch in paar Hinweise, wo man was findet:
Die Grundpowerwerte werden von Civ gecacht und ich hab den Cache ausgelesen. Berechnet werden Sie in der CvUnitClass.cpp CvUnitEntry:: DoUpdatePower(). Falls sich da jemand für interessieren sollte bitte nicht wundern, der Code macht teilweise mehr oder weniger das Gegenteil von dem was als Kommentar drübersteht . Die Berücksichtigung von Level und Hitpoints ist in CvUnit.cpp CvUnit::GetPower(), die Aufsummierung und die Goldberücksichtigung in CvPlayer.cpp CvPlayer::calculateMilitaryMight(). Die Aufbereitung für die Demo findet sich in der Demographics.lua (die liegt im Spieleverzeichnis und nicht beim Code von Firaxis, genauen Pfad hab ich gerade vergessen…). Und die Berechnung des Scores für die Stadtstaatenerpressung macht CvMinorAI::CalculateBullyMetric in CvMinorCivAI.cpp