Ergebnis 1 bis 9 von 9

Thema: Berechnung Stadtunterhalt nach Anzahl der Staedte [BTS 3.19]

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

    Berechnung Stadtunterhalt nach Anzahl der Staedte [BTS 3.19]

    Berechnung Stadtunterhalt nach Stadtanzahl – NumOfCitiesMaintenance [BTS 3.19]

    Die Unterhalstkosten einer Stadt setzten sich zusammen aus:

    CityMaintenance = DistanceMaintenance + NumOfCitiesMaintenance + CorporationCost + ColonyCost

    Genaugenommen muss dieser Ausdruck noch mit einem Modifier (MaintenanceModifier) multipliziert werden. Dieser beträgt 1 (ohne Courthouse) bzw. 0,5 (mit Gericht). In diesem Posting wird nur der Einfluss „NumOfCitiesMaintenance“ diskutiert, also der Einfluss der Stadtanzahl auf die Unterhaltskosten.

    Den C++ Code für die Berechnung findet man in der cvCity.cpp
    Achtung Spoiler:

    int CvCity::calculateNumCitiesMaintenance() const
    {
    return (calculateNumCitiesMaintenanceTimes100() / 100);
    }

    int CvCity::calculateNumCitiesMaintenanceTimes100() const
    {
    int iNumCitiesPercent = 100;

    iNumCitiesPercent *= (getPopulation() + 17);
    iNumCitiesPercent /= 18;

    iNumCitiesPercent *= GC.getWorldInfo(GC.getMapINLINE().getWorldSize()).getNumCitiesMaintenancePercent();
    iNumCitiesPercent /= 100;

    iNumCitiesPercent *= GC.getHandicapInfo(getHandicapType()).getNumCitiesMaintenancePercent();
    iNumCitiesPercent /= 100;

    int iNumVassalCities = 0;
    for (int iPlayer = 0; iPlayer < MAX_CIV_PLAYERS; iPlayer++)
    {
    CvPlayer& kLoopPlayer = GET_PLAYER((PlayerTypes)iPlayer);
    if (kLoopPlayer.getTeam() != getTeam() && GET_TEAM(kLoopPlayer.getTeam()).isVassal(getTeam()))
    {
    iNumVassalCities += kLoopPlayer.getNumCities();
    }
    }
    iNumVassalCities /= std::max(1, GET_TEAM(getTeam()).getNumMembers());

    int iNumCitiesMaintenance = (GET_PLAYER(getOwnerINLINE()).getNumCities() + iNumVassalCities) * iNumCitiesPercent;

    iNumCitiesMaintenance = std::min(iNumCitiesMaintenance, GC.getHandicapInfo(getHandicapType()).getMaxNumCitiesMaintenance() * 100);

    iNumCitiesMaintenance *= std::max(0, (GET_PLAYER(getOwnerINLINE()).getNumCitiesMaintenanceModifier() + 100));
    iNumCitiesMaintenance /= 100;

    FAssert(iNumCitiesMaintenance >= 0);

    return iNumCitiesMaintenance;
    }



    Die etwas freundlichere Formulierung des Programmcodes sieht dann so aus:

    NumOfCitiesMaintenance=
    100 x (CityPop + 17)/18) x WorldSize_M/100 x Handicap_M/100 x NumOfCities)/100


    Diese Formel darf nur angewendet werden, wenn das Ergebnis das „CityHandicap“ nicht übersteigt. Z.B. beträgt das CityHandicap für Kaiser 7. Also wenn die Kosten aufgrund der Rechenformel 7 übersteigen, bleiben sie auf 7 stehen. Die Kosten sind also gedeckelt.
    Im Folgenden erkläre ich die in der Formel angewandten Parameter.

    Achtung bei der Verifizierung der Formel bin ich immer wieder auf Abweichungen gestossen, da ich im Excel mit Float und nicht mit Integer gerechnet habe. Jede Division in der Formel von Links nach rechts muss auf einen Integer Wert gerundet werden, bevor weitergerechnet wird.

    A) CitiesHandicap:

    CitiesHandicap: Auf Spielstufe Siedler können die Unterhaltskosten für Stadtanzahl pro Stadt 4 Gold nicht übersteigen (auf Deity sind es 8). Die Formel zur Berechnung NumOfCitiesMaintenance kommt nur zum Einsatz, wenn das Ergebnis kleiner als das CitiesHandicap ist.



    B) Handicap_M:
    Der Handicap Modifier ist von der gewählten Spielstufe abhängig. Er wird in der Formel durch 100 geteilt und geht als Multiplikator ein. Auf Deity ist der Multiplikator 1 bei Siedler 40/100 also 0,4. „NumOfCitiesMaintenace“ wird somit auf Siedler um mehr als die Hälfte verringert.


    C) WorldSize_M:
    Der Worldsize Modifier berücksichtigt die Kartengrösse. Auf kleinen Karten ist „NumOfCitiesMaintenace“ grösser als auf grossen Karten. Also Städte kosten auf kleinen Karten mehr Unterhalt als auf Grossen.



    D) CityPop:
    CityPop ist die grösse der Stadt. Grosse Städte haben eine höheren Stadtunterhalt als kleine.

    E) NumOfCities:
    Anzahl der Städte des Spielers.
    Angehängte Grafiken Angehängte Grafiken
    Geändert von Makkaroni (07. August 2012 um 12:19 Uhr) Grund: Phyton ersetzt durch C++

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

    Interpretation der Formel

    Schwierigkeitsgrad:
    Die Spielstufe hat Einfluss auf die Unterhaltskosten. Die Summe „NumOfCitiesMaintenance“ für 5 Pop-5 Städte auf einer Standardkarte beträgt auf Siedler 3,5 Gold. Könnte man während einer Partie die Spielstufe ändern, müsste man für die gleichen Städte auf Deity 9 Gold bezahlen.



    Kartengrösse:5 Pop-5 Städte kosten auf Spielstufe Emporer auf der Kartengrösse Duel 12 Gold. Auf einer riesigen Karte veringern sich die Kosten für die gleichen Städte auf 5,25 Gold.


    Stadtanzahl:Mit jeder neu gegründeten Stadt wächst die „NumOfCitiesMaintenance“. In der hier gezeigten Grafik wurden alle Städte auf Pop=5 gesetzt (Standardkarte, Kaiser). Für diesen Fall steigen die Kosten für jede weitere Stadt um 0,32 pro Stadt solange an, bis sie in die Deckelung laufen. Diese wird in diesem Fall bei 20 Städten erreicht.
    Deckelung: In Abhängigkeit des Schwierigkeitsgrades gibt es einen maximalen Wert für NumOfCityMaintenance. Im Fall von Kaiser ist es 7. D.h. NumOfCitiesmaintenance kann nicht grösser als 7 werden.
    Möchte man wissen, ob man sich in seinem Spiel bereits im gedeckelten Bereich befindet, kann man die „NumOfCitiesMaintenance“ im Stadtbildschirm aufrufen. „NumOfCitiesMaintenance“ hat dann für alle Städte des Spielers den gleichen Wert.
    Der Anstieg der Unterhaltskosten aufgrund der Stadtanzahl ist für die frühen Städte stärker als für spätere.
    Das Plateau in der Grafik wird früher erreicht wenn die Stadtanzahl gösser als 5 ist. Haben alle Städte die Grösse Pop=12, wird das Plateau nach 15 Städten erreicht (Kaiser, Standardkarte).



    Was kostet eine neue Stadt?
    Anhand eines Beispieles (Kaiser, Standardkarte) soll aufgezeigt erden was passiert, wenn ein neue Stadt gegründet wird. In diesem Beispiel hat der Spieler bereits 10 Städte. Die „NumOfCitiesMaintenance“ ist von der CityPop abhängig und wird durch die roten Balken gezeigt. In der Stadt Uruk beträgt die NumOfCitiesMaintenance vor der Stadtgründung 4,4 Gold. Der gesamt NumOfCitiesMaintenance-Unterhalt für alle 10 Städte ist 36,5 Gold.

    Nach Gründung der Stadt Larsa steigt die NumOfCitiesMaintenance in allen Städten des Spielers auf einen Schlag an. In Uruk steigt der Wert von 4,4 auf 4,84 Gold. Der Gesamt NumOfCitiesMaintenance-Unterhalt beträgt jetzt für 11 Städte 43,12 Gold.
    Man kann diesen Wert ungefähr abschätzen indem man die Formel dieses Postings anwendet. Dazu muss man nur eine Durchschnittszahl der Bevölkerung aller seiner Städte abschätzen. Das sei hier mal illustriert. Annahme für durchschnittliche Pop=7 in allen Städten des Spielers. Dann ergibt sich:

    Vor Stadtgründung (10 Städte): NumCityMaint=100x(7+17)/18)x30/100x90/100 x 10)/100 x 10 = 35
    Nach StadtGründung (11 Städte): NumCityMaint=100x(7+17)/18)x30/100x90/100 x 11)/100 x 11= 42,4

    Im Testspiel ist der genaue Wert 43,12 (gegenüber 42,4). Es ist also möglich den zu erwartenden Anstieg der Stzadunterhaltskosten relativ genau abschzuschätzen. Wobei im realen Spiel auch noch die Distancemaintenance bedacht werden muss. Komplizierter wird es allerdings wenn nur in einigen der Städte Gerichte stehen.

    Angehängte Grafiken Angehängte Grafiken
    Geändert von Makkaroni (02. August 2012 um 11:10 Uhr)

  3. #3
    Waddehaddedudeda Avatar von Cybah
    Registriert seit
    01.09.06
    Beiträge
    30.450
    Respekt, aber wozu brauchst du das so genau?
    Pucc's Lets Plays BASE 6.0: #1 #2 #3 #4 #5

    Download von BASE 6.4 [D]: HIER (klick mich!) (Stand: 08.07.2022)

  4. #4
    Freund der Nudel Avatar von Makkaroni
    Registriert seit
    29.07.08
    Beiträge
    612
    Zitat Zitat von Cybah Beitrag anzeigen
    Respekt, aber wozu brauchst du das so genau?
    Ja recht hast du da irgendwie schon, denn eigentlich lehrt die Civ-Erfahrung mit den Unterhalstkosten umzugehen, ohne dass man anfangen muss Gleichungen nachzurechnen.
    Wenn man mal die Auswirkungen der Überexpansion in einem Spiel erfahren hat, reisst man im nächsten Spiel die Städte nieder anstatt sie einzunehmen.
    Zudem setzt man sich auch Zielpunkte wie etwa: Gegen 0 BC sollte man etwa 6 Städte haben. So vermeidet man, dass der Unterhalt zu stark auf die Kolbenbremse tritt.

    Der Civ-Anfänger kann hoffentlich nach dem Verzehr dieses Posts verstehen, warum die Unterhaltskosten nicht linear steigen. Also etwa folgende Situation:
    Ich habe eine positive Bilanz in meinem Empire und nehme +12 Gold ein. Wenn ich jetzt eine Stadt erobere, die sich selbst trägt, also Unterhalt = Einnahmen,
    kann meine Empire-Bilanz trotzdem negativ werden, da alle bestehenden Städte mit einem Schlag teurer werden.
    Es wird nämlich die Annahme gemacht:
    Meine Städte kosten etwa 4 Gold Unterhalt. Dann wird die neu eroberte Stadt auch 4 Gold kosten.
    Tatsächlich kann die Stadt je nach Bedingungen (Anzahl der Städte, Stadtentfernung zum Palast) 2 -3 mal so teuer sein also dem Empire 8 - 12 Gold kosten anstelle der erwarteten 4 Gold.

    Die Lesebiblithek verstehe ich als ein Medium um u.a. die Spielmechanik zu erklären. Und dazu greift man am besten auf den Programmcode zurück.
    Ich war bei meinen Recherchen schon überrascht, dass es hier im Forum nach 5 BTS-Jahren (BTS gibt es seid 2007 oder?) keine Formel für den Stadtunterhalt gibt. Selbst bei den Civfanatics
    habe ich nur eine unverifizierte Formel gefunden, die dann auch noch Fehler hatte.

    Man kann nach Lesen des Beitrags z.B. auch Verstehen warum nach dem Sklaven in einer Stadt die Stadtunterhaltskosten zurückgehen. Nämlich weil die CityPop, die
    in "NumOfCitiesMaintenance" als auch in die "DistanceMaintenance" eingeht, verkleinert wird.
    Interessanterweise spart man mehr Unterhaltskosten ein, wenn man in einer weit entfernten Stadt sklavt.

    Solche Dinge kann man eben nur verstehen, wenn man sich die Formel und die Abhängigkeiten der Parameter anschaut.
    Auch wenn man es letzten Endes gar nicht braucht, wenn man sein Lieblingsspiel spielt ...

  5. #5
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757


    Aber zu deinem ersten Beitrag: das ist kein Python-Code, sondern C++ -Code.

  6. #6
    Freund der Nudel Avatar von Makkaroni
    Registriert seit
    29.07.08
    Beiträge
    612
    Zitat Zitat von alpha civ Beitrag anzeigen


    Aber zu deinem ersten Beitrag: das ist kein Python-Code, sondern C++ -Code.
    Danke für die Klarstellung. Aber wieso list man im Zusammenhang mit Civ immer was ueber Python?

  7. #7
    Registrierter Benutzer Avatar von Walther
    Registriert seit
    04.12.05
    Beiträge
    7.667
    Zitat Zitat von Makkaroni Beitrag anzeigen
    Danke für die Klarstellung. Aber wieso list man im Zusammenhang mit Civ immer was ueber Python?
    Die Basis von civ4 ist C++-Code, der muss für den Rechner entsprechend übersetzt werden um dann als Programm (.exe) oder Bibliothek (.dll) ausführbar zu sein. In der Regel ist das für den Modder nicht machbar aber die Informationen in dem Quellcode sind natürlich Gold wert. Das eigentlich Modding wird mit Python durchgeführt. Also alle Oberflächenelemente, Datenfenster etc. liegen als Python-Skripte vor. Der C++ wird dann von den Python-Skripten aufgerufen bzw. teilweise wird auch der Python-Code von C++ aufgerufen. Das macht dann die Moddingfähigkeit aus.

  8. #8
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Zitat Zitat von Makkaroni Beitrag anzeigen
    Danke für die Klarstellung. Aber wieso list man im Zusammenhang mit Civ immer was ueber Python?
    Man kann Civ4 in drei unterschiedlichen Stufen modden.
    Die erste (und leichteste) ist XML-Modding. Hier kann man Daten verändern, z. B. Einheitenwerte.
    Die zweite Stufe sind Python-Skripte. Mit ihnen kann man auf Spielereignisse reagieren, z. B. was (zusätzlich) passieren soll, wenn eine Stadt erobert wird usw. Man kann mit Python auch am Interface rumschrauben.
    Theoretisch kann man auch mit Python Civ4 um neue Spielelemente erweitern. Problem ist dann nur eine schlechtere Performance, da Python-Code erst interpretiert werden muss, bevor er ausgeführt werden kann. Aus diesem Grund gibt es die dritte Stufe: C++-Modding. Hier kann man sich austoben, z.B. kann man neue Ereignisse einbringen, auf die man dann mittels Python reagieren kann. Man braucht aber auch eine höhere Einarbeitungszeit. Während man guten Python-Code nach ein paar Monaten Einarbeitungszeit schreiben kann, benötigt man für C++ erheblich mehr Zeit, um die Sprache zu lernen.
    Hat man erstmal C++ erlernt, muss man sich noch mit dem SDK selbst herumschlagen, da es anfangs schwer ist, den Überblick zu bekommen. Und man muss sich damit beschäftigen, den C++-Code zu einer DLL zu kompilieren. Hier gibt es zum Glück ein idiotensicheres Tutorial (selbst getestet ), so das zumindest kein wirkliches Problem ist.

  9. #9
    Alter Mann Avatar von UnderStatement
    Registriert seit
    09.01.10
    Ort
    Zwischen den Meeren
    Beiträge
    133
    Den Beitrag fand ich nun echt interessant. Probiere gerade als Kaiser riesige Karten und verstehe jetzt im Detail, wie die gewaltigen Unterhaltskosten für 50 Städte zusammen kommen.
    Toll fände ich eine Ergänzung: wie unverschämt und ab wann cheatet die KI auf den verschiedenen Schwierigkeitsstufen? Meinen KI-Freunden scheint auch der Unterhalt für 200 Städte nicht weh zu tun und seien sie teilweise noch so armselig...

Berechtigungen

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