Ergebnis 1 bis 3 von 3

Thema: Berechnung Stadtunterhalt für Entfernung vom Palast [BTS 3.19]

  1. #1
    Freund der Nudel Avatar von Makkaroni
    Registriert seit
    29.07.08
    Beiträge
    612

    Berechnung Stadtunterhalt für Entfernung vom Palast [BTS 3.19]

    Distance City Maintenance – Stadtunterhalt nach Entfernung [BTS 3.19]

    Ich möchte hier die Berechnung des Stadtunterhalts aufgrund der Entfernung der gegründeten Stadt zur Hauptstadt erklären. Die Stadtunterhaltskosten setzen sich vollständig zusammen aus:

    CityMaintenance = DistanceMaintenance + NumOfCitiesMaintenance + Corporation Cost + Colony Cost

    Die DistanceMaintenance kann man im Stadtbildschirm ablesen, indem man mit dem Mauszeiger über Maintenance fährt. Im Pulldownmenü sieht man dann den Betrag für „Distance from Palace“.




    Die Formel zur Berechnung der Unterhaltskosten der Entfernung zur Hauptstadt (DistanceMaintenace) lautet:
    DistanceMaintenance=
    (100 x (MaxDistanceCityMaint x Distance) x (CityPop + 7) / 10 x (Civic_M + 100) / 100 x WorldSize_M/100 x Handicap_M/100) / MaxPlotDistance


    Wenn Staatseigentum ausgeschlossen wird, lässt es sich kürzer darstellen:

    DistanceMaintenance=
    (100 x (25 x Distance) x (CityPop + 7) / 10 x WorldSize_M/100 x Handicap_M/100) / MaxPlotDistance


    Nun die Erklärung der Parameter, von denen die DistanceMaintenance abhängig ist:
    A) Der Worldsize Modifier “WorldSize_M” kann in der Civ4WorldInfo.xml unter „iDistanceMaintenancePercent“ nachgeschlagen werden. Er liegt zwischen 50% auf Duel und 100% auf Huge Karten. Man kann aber aufgrund der ansteigenden Werte von kleinen nach grossen Karten nicht einfach darauf schliessen, dass die Kosten im Fall grosser Karten grösser werden.



    B) Der Handicap Modifier „Handicap_M“ aus Civ4HandicapInfo.xml. Er steigt von 45 % für Siedler auf 100% für Unsterblich/Gottheit an. Hier gibt es einen linearen Zusammenhang. Je höher der Schwierigkeitsgrad dest höher die Unterhaltskosten für Stadtentfernung.



    C) Die Konstante „MaxCityDistanceMaintenance“ ist immer gleich 25.
    D) „CityPop“ ist die Stadtgrösse. Ja, es ist tatsächlich so, dass die Maintenancekosten für die Entfernung zur Haupstadt steigen, wenn die Stadt wächst.
    E) „Distance“ ist die Entfernung der Stadt zur Hauptstadt. Dabei wird die nach Civ-Enfernung (PlotDistance) gezählt, die nicht mit der StepDistance (gilt für die Bewegung von Einheiten) verwechselt werden darf. Jeder kennt wohl das Fatcross für den Stadtbildschirm, das für 2 Felder Entfernung vom Zentrum besteht. Die Entfernung 2 ist die Plotdistance. Die Diagonalen Felder im 2. Ring haben die Plotdistance=3 und sind nicht mehr bewirtschaftbar


    F) „MaxPlotDistance“ ist die maximal mögliche Entfernung zweier Punkte auf der gespielten Karte.
    Ich habe versucht diese Werte in Abhängikeit der Karte zu berechnen, dann aber aufgegeben. An dieser Stelle kann ich nur MaxPlotDistance für cylindrische Karten angeben, die beim Spielstart unter „Custom Game“ generiert werden. Cylindrische Karten haben einen Nord/Südpol der unpassierbar ist und können auf der Cylindermantelfläche umfahren werden. Es ist für mich der am meisten gespielte Kartentyp. Die im folgenden gezeigte Tabelle sagt aus, dass für ein Spiel auf einer Standardkarte (64 x 40) die maximal mögliche Plotentfernung 55 beträgt. Dieser Wert muss dann als Konstante in die Formel oben eingesetzt werden.



    G) Der CivicModifier„Civic_M“ ist immer 0 ausser -100 wenn die Regierungsform Staatseigentum ist. Im Fall von Civic_M = -100 erhält man für DistanceMaintenance =0, d.h. die Entfernungskosten entfallen.
    Somit kennen wir alle Variablen, die zur Berechnung der DistanceMaintenance erforderlich sind. Die Formel habe ich aus der cvCity.cpp abgeleitet:

    Achtung Spoiler:

    int CvCity::calculateDistanceMaintenanceTimes100() const
    {
    CvCity* pLoopCity;
    int iWorstCityMaintenance;
    int iBestCapitalMaintenance;
    int iTempMaintenance;
    int iLoop;

    iWorstCityMaintenance = 0;
    iBestCapitalMaintenance = MAX_INT;
    for (pLoopCity = GET_PLAYER(getOwnerINLINE()).firstCity(&iLoop); pLoopCity != NULL; pLoopCity = GET_PLAYER(getOwnerINLINE()).nextCity(&iLoop))
    {
    iTempMaintenance = 100 * (GC.getDefineINT("MAX_DISTANCE_CITY_MAINTENANCE") * plotDistance(getX_INLINE(), getY_INLINE(), pLoopCity->getX_INLINE(), pLoopCity->getY_INLINE()));

    iTempMaintenance *= (getPopulation() + 7);
    iTempMaintenance /= 10;
    iTempMaintenance *= std::max(0, (GET_PLAYER(getOwnerINLINE()).getDistanceMaintenan ceModifier() + 100));
    iTempMaintenance /= 100;
    iTempMaintenance *= GC.getWorldInfo(GC.getMapINLINE().getWorldSize()). getDistanceMaintenancePercent();
    iTempMaintenance /= 100;
    iTempMaintenance *= GC.getHandicapInfo(getHandicapType()).getDistanceM aintenancePercent();
    iTempMaintenance /= 100;
    iTempMaintenance /= GC.getMapINLINE().maxPlotDistance();
    iWorstCityMaintenance = std::max(iWorstCityMaintenance, iTempMaintenance);
    if (pLoopCity->isGovernmentCenter())
    {
    iBestCapitalMaintenance = std::min(iBestCapitalMaintenance, iTempMaintenance);
    }
    }
    iTempMaintenance = std::min(iWorstCityMaintenance, iBestCapitalMaintenance);
    FAssert(iTempMaintenance >= 0);
    return iTempMaintenance;

    Angehängte Grafiken Angehängte Grafiken

  2. #2
    Freund der Nudel Avatar von Makkaroni
    Registriert seit
    29.07.08
    Beiträge
    612

    Interpretation der Variablen für die Stadtentfernungskosten

    WorldSize_M:
    Die Stadtentfernungskosten sind auf grossen Karten kleiner als auf kleinen Karten. Das verwundert nicht da hier ja die Unterhaltskosten aufgrund des hier nicht diskutierten Anteils „NumOfCitiesMaintenance“ entsprechend höher ausfallen.


    Handicap_M:
    Die Stadtentfernungskosten steigen mit wachsenden Schwierigkeitsgrad. Eine Stadt (Pop=4, Distance=4) die auf Siedler 0,72 Gold kostet, würde auf Unsterblich oder Deity 1,6 kosten. So gesehen muss man auf höheren Level mit weniger Geld auskommen.


    Distance:
    Die Entfernungskosten steigen linear mit wachsender Entfernung von der Hauptstadt an. Anbei ein Beispiel für Mapsize=Standard; Handicap=Emporer; CityPop=4. Ist die Stadt 3 Felder entfernt, betragen die Entfernungskosten 1,14. Im Fall von Distance=55 steigen die Entfernungskosten auf 21,28. Wenn man sich beim Siedeln manchmal nicht für ein bestimmtes Feld entscheiden kann, so kann man etwa 0,3 Gold pro Runde sparen, wenn man das Feld wählt, das näher zur Hauptstadt liegt.


    CityPop:
    Eigentlich habe ich nicht erwartet, dass Stadtenfernungskosten von der Stadtgrösse abhängig ist. Die folgende Graphik gilt für Mapsize=Standard; Handicap=Emporer; Distance=10. Eine Pop-2 Stadt kostet demnach 2,76 Gold, gegenüber einer Pop-10 Stadt mit 5,53 Gold. Ein Bürger kostet danach etwa 0,3 Gold. Sklavt man 3 Bürger spart man etwa 1 Gold pro Runde an Unterhalt.



    Gruss von,
    Makkaroni
    Angehängte Grafiken Angehängte Grafiken

  3. #3
    Freund der Nudel Avatar von Makkaroni
    Registriert seit
    29.07.08
    Beiträge
    612

    Illustration der Rechenformel anhand eines Beispiels

    Erklärung der Formel anhand eines Beispiels:

    Im Screenshot unten aus einem Kaiserspiel auf Standardkarte sieht man den Stadtbildschirm der Stadt Bad_Tibra (CityPop=7).
    Weiter unten liegt die Hauptstadt. Die Markierungen 1 – 5 zeigen wie die Plotdistance gezählt wird, um die Entfernung zum Palast zu bestimmen. Hier gilt Distance = 5. Der Parameter Handicap_M = 95 für Kaiser. Der Parameter Worldsize_M = 80 für eine Standardkarte. Die MaxPlotSize für eine cylindrische Standardkarte = 55.

    Wenden wir die nun Formel an:
    DistanceMaintenance=
    (100 x (25 x Distance) x (CityPop + 7) / 10 x WorldSize_M/100 x Handicap_M/100) / MaxPlotDistance


    DistanceMaintenance=
    (100 x (25 x 5) x ( 7 + 7)/10 x 80/100 x 95/100) / 55 = 241

    Hierbei werde die Zahlen als Integerwerte behandelt d.h. Nachkommastellen gehen verloren. Der Wert 241 muss noch durch 100 dividiert werden: Ergebnis = 2.41



    ... und für alle Fans der Lesebibliothek gibt es in Kürze die Berechnung der "NumOfCitiesMaintenance"

    Gruss,
    Makkaroni
    Angehängte Grafiken Angehängte Grafiken
    Geändert von Makkaroni (01. August 2012 um 00:42 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •