Seite 61 von 219 ErsteErste ... 115157585960616263646571111161 ... LetzteLetzte
Ergebnis 901 bis 915 von 3275

Thema: PAE V Patch 4 (01.09.2018)

  1. #901
    Registrierter Benutzer Avatar von JohnDay
    Registriert seit
    26.12.12
    Beiträge
    4.915
    Jeder Programmierer, Modder freut sich wenn er neue Spieler für seine Kreation begeistern und gewinnen kann. Vor allem wird aber der Prozentsatz besonders hoch sein an Spielern, die sein Spiel schon bisher genutzt haben und schon Erfahrungen damit gemacht haben.
    Bisher waren die Folgen recht unangenehm, wenn man einen an eine Einheit angeschlossenen General verloren hat. Wenn das nun mit einem angeschlossenen Feldherrn anders ist, dann ist das eine wichtige, ja eine gewaltige Änderung finde ich. Schließlich waren die Folgen bisher wirklich dramatisch, wenn einem das passierte. Das ist etwas, was dann auch kommuniziert gehört! Es ist ja keine kleine Änderung, sondern soll zu einem anderen Verhalten der Spieler führen. Nur einmal gemachte Erfahrungen über Bord zu werfen, das tun die wenigsten Menschen. Wer also seine Erfahrungen gemacht hat, wird sich also auch unbewußt weiterhin danach verhalten. Darüber gibt es jede Menge Studien und der Mensch ist nun mal ein Gewohnheitstier. Nur wenige Menschen ändern ihr Verhalten, selbst wenn sie anderslautende Informationen haben. Damit die Spieler von PAE überhaupt eine Chance haben ihr Verhalten da zu ändern, dafür muss man sie darauf aufmerksam machen. Mit einem riesen großen Ausrufezeichen wenn du mich fragst! Vor allem in einer offiziellen Version ja .

    Das ich mich beschwert habe zuviele Informationen zu bekommen, daran kann ich mich übrigends nicht erinnern. Vielleicht habe ich gesagt, Pie soll sich nicht soviel Arbeit machen, aber informiert werden möchte man und auch ich doch schon! Wenn dürfte das also ziemlich aus dem Zusammenhang heraus gerissen sein, wenn du meinst, ich hätte mich über zuviele Informationen beschwert. Das kann ich mir eigentlich kaum vorstellen .

    Thema Große Persönlichkeiten:

    Aktuell steht in der Leiste bei mir die nächste Stadt in der eine Große Persönlichkeit auftauchen wird und wieviele Punkte ich pro Runde bekomme, wieviele ich habe und wieviele ich noch brauche damit sie erscheint. Bisher gab es Händler, Wissenschaftler und Baumeister. Nicht einmal einen wirklichen echten General.

    Dafür kam es mir so vor, dass ich Feldherrn nicht nur aus Einheiten herausgelöst habe, sondern auch für große geschlagene Schlachten bekommen habe. Habe nicht so darauf geachtet, aber ich glaube es war so. Vor allem, wenn die Kämpfe innerhalb meiner Kulturgrenzen lagen. Das liegt vielleicht an einem Weltwunder? Könnte man da nicht einen echte Großen General für bekommen? Schließlich möchte ich meine Militärakademien auch bauen können. Zumindest ein paar und nicht nur eine innerhalb von mehreren hundert Runden.

    Aber kann es sein, dass der Große General da mal aus der Liste der erscheinenden Großen Persönlichkeiten heraus genommen wurde? So kommt es mir jedenfalls im Moment vor. Im Moment habe ich in meinem wirklich schon fortgeschrittenen Spiel jedenfalls noch gar keinen gehabt und das ist doch definitiv zu wenig, oder findest du nicht?

    Grüße John
    Geändert von JohnDay (11. Januar 2017 um 01:06 Uhr)

  2. #902
    Registrierter Benutzer
    Registriert seit
    21.03.12
    Beiträge
    23.260
    Die Features von Beta-Patch-Versionen müssen doch net kommuniziert werden.
    Jeder Programmierer, Modder freut sich wenn er neue Spieler für seine Kreation begeistern und gewinnen kann. Vor allem wird aber der Prozentsatz besonders hoch sein an Spielern, die sein Spiel schon bisher genutzt haben und schon Erfahrungen damit gemacht haben.
    Bisher waren die Folgen recht unangenehm, wenn man einen an eine Einheit angeschlossenen General verloren hat. Wenn das nun mit einem angeschlossenen Feldherrn anders ist, dann ist das eine wichtige, ja eine gewaltige Änderung finde ich. Schließlich waren die Folgen bisher wirklich dramatisch, wenn einem das passierte. Das ist etwas, was dann auch kommuniziert gehört! Es ist ja keine kleine Änderung, sondern soll zu einem anderen Verhalten der Spieler führen. Nur einmal gemachte Erfahrungen über Bord zu werfen, das tun die wenigsten Menschen. Wer also seine Erfahrungen gemacht hat, wird sich also auch unbewußt weiterhin danach verhalten. Darüber gibt es jede Menge Studien und der Mensch ist nun mal ein Gewohnheitstier. Nur wenige Menschen ändern ihr Verhalten, selbst wenn sie anderslautende Informationen haben. Damit die Spieler von PAE überhaupt eine Chance haben ihr Verhalten da zu ändern, dafür muss man sie darauf aufmerksam machen. Mit einem riesen großen Ausrufezeichen wenn du mich fragst!
    Kommt doch mit dem Release Das Zeug hier im Thread ist einfach nicht fertig, guck dir mal die Ingametexte an, die sind teilweise auch noch Chaos. Aber das braucht man ja net anpassen, bevor es nicht richtig feststeht.

    Hattest du dich da damals net beschwert und Pie darauf gesagt, dass er es ändert? Habs auch nur durch Code lesen rausgefunden ^^
    Das ich mich beschwert habe zuviele Informationen zu bekommen, daran kann ich mich übrigends nicht erinnern. Vielleicht habe ich gesagt, Pie soll sich nicht soviel Arbeit machen, aber informiert werden möchte man und auch ich doch schon! Wenn dürfte das also ziemlich aus dem Zusammenhang heraus gerissen sein, wenn du meinst, ich hätte mich über zuviele Informationen beschwert. Das kann ich mir eigentlich kaum vorstellen.
    Nee , dass die Generalstodrevolte zu heftig sei.

    Thema GP: in der Liste war der GG nie. Der hat ne eigene Leiste die links vom Techbalken und im F5-Screen angezeigt wird. Die füllt sich, wenn Einheiten Erfahrung bekommen. Wenn da jetzt Feldherren bei rausspringen, ist was schief gelaufen. Da sollten die alten Generäle entstehen.

  3. #903
    Registrierter Benutzer Avatar von JohnDay
    Registriert seit
    26.12.12
    Beiträge
    4.915
    Hauptsache es wird dann später gut kommuniziert ! Meist geht so etwas ja unter und wird bei vielen anderen Spielen dann eben nicht vernünpftig an den Spieler heran gebracht, wenn solche wirklich wichtigen Änderungen gemacht werden. Dafür gibt es genügend Civ4 mods als Referenz. Ist ja auch kein Wunder, da der Modder genug anderes zu tun hat. So etwas geht eben schnell unter.
    Mein Schreiben soll ja auch nur darauf aufmerksam machen, dass das ein wichtiger Punkt ist, wie ich finde und dass das noch fehlt bisher. Wenn da noch etwas kommt, dann prima und gut! Ein Text der das erklärt, am besten einer der von allein einmal aufploppt im Spiel, der dürfte dann wohl die meisten erreichen.
    Man kann das auch in den Startbildschirm hinein schreiben, aber dann wird es wohl von vielen übersehen werden. In die Pedia werden dafür wohl am wenigsten schauen, ist aber natürlich auch eine Möglichkeit das zu kommunizieren. Ich finde, das wäre dann aber ein wenig wenig für so eine eklatante Änderung.
    Ich würde mir dafür einen aufploppenden Bildschirm wünschen, den werden auch viele wegdrücken, aber damit hätte man die größte Chance die Spieler auch wirklich darauf aufmerksam zu machen. Wie gesagt, der Mensch ist ein Gewohnheitstier und geht von seinen bisher gemachten Erfahrungen aus. Mit neuen Spieler hat man es da viel leichter.

    Wobei Beschweren, ich äußere ja nur Wünsche und Bitten. Ich versuche ein Feedback zu geben und wenn Pie sich entscheidet davon etwas anzunehmen, dann freue ich mich natürlich darüber. Entscheiden tut aber er und Forderungen stelle ich keine! Die würden wohl auch nur nach hinten losgehen. So ist das jedenfalls von mir nie gemeint, dass ich etwas fordere. Klar habe auch ich hier und da mal ein paar Wünsche, aber wenn ich Pie nicht überzeugen kann, dann ist das eben so. Einer muss entscheiden und das ist nun mal Pie. Zum Glück kann man ja auch mit ihm reden, Pie ist ja nicht beratungsresistent! Deshalb bringt es ja auch Spaß an PAE Teil zu haben !

    Zurück zum Thema Feldherrn:

    Habe eben mal F5 gedrückt und da steht Kampferfahrung 82 von 200 zum Großen General. Ich werde da jetzt sehr darauf achten, wann ich die 200 voll habe und ob es dann einen Großen General gibt, oder doch nur einen Feldherrn. Ich muss das bis dahin abwarten und werde einfach mal ein paar Kriege bis dahin im Spiel führen.

    Grüße John

  4. #904
    Registrierter Benutzer
    Registriert seit
    21.03.12
    Beiträge
    23.260
    Der erste GG kommt bei 50 Erfahrung, du hättest also schon 3 haben sollen. Ich guck mal rein.

    €:

    PHP-Code:
    int iRandOffset GC.getGameINLINE().getSorenRandNum(GC.getNumUnitInfos(), "Warlord Unit Generation");
                        for (
    int iI 0iI GC.getNumUnitInfos(); iI++)
                        {
                            
    UnitTypes eLoopUnit = (UnitTypes)((iI iRandOffset) % GC.getNumUnitInfos());
                            if (
    GC.getUnitInfo(eLoopUnit).getLeaderExperience() > || GC.getUnitInfo(eLoopUnit).getLeaderPromotion() != NO_PROMOTION)
                            {
                                
    pBestCity->createGreatPeople(eLoopUnitfalsetrue);
                                
    setCombatExperience(getCombatExperience() - iExperienceThreshold);
                                break;
                            }
                        } 


    Es werden nur Feldherren erstellt. Die erstellte GP ist eine zufällige, die Erfahrungspunkte und/oder eine Anführer-Promo vergibt. Das trifft halt beides nur auf den neuen Feldherren zu.
    Macht ja auch Sinn, dass das nicht an den Einheitennamen GREAT_GENERAL gebunden ist.
    Geändert von Flunky (11. Januar 2017 um 02:12 Uhr)

  5. #905
    Registrierter Benutzer Avatar von JohnDay
    Registriert seit
    26.12.12
    Beiträge
    4.915
    Das war auch genau mein Gefühl dabei, nur leider kann ich das nicht selber nachschauen, da ich zuwenig davon verstehe. Wird dann sicher noch geändert. Prima!

    Grüße John

  6. #906
    Registrierter Benutzer
    Registriert seit
    21.03.12
    Beiträge
    23.260
    Wird nicht so einfach das zu ändern, das da oben ist DLL-Code.

  7. #907
    Registrierter Benutzer Avatar von JohnDay
    Registriert seit
    26.12.12
    Beiträge
    4.915
    Da wird euch schon noch etwas bei einfallen. Ihr zaubert da für mich eh schon mit dem was bisher alles erreicht wurde .

    Hauptsache die schiere Anzahl der Feldherrn wird reduziert und es gibt im Spiel später auch wieder ein paar echte Große Generale.
    Gerade die Militärakademie würde ich zumindest in ein paar Städten wieder gründen können. Ich liebe den Sound des Video´s wenn man das macht .

    - Vielleicht Feldherrn aus Schiffen heraus zu lösen als Möglichkeit aus dem Spiel ganz heraus nehmen? Das reduziert dann die Anzahl schon, aber gerade über Schiffe entstehen im Moment viel zu viele davon. Vielleicht liegt das auch an meiner Spielweise, aber ich achte eben auf meine Schiffe.

    - Die Anzahl der verbleibenden Beförderungen reduzieren, die nachdem man einen Feldherrn aus einer Einheit heraus gelöst hat, die bei der Einheit verbleiben. Damit es auch wieder etwas länger dauert, bis man erneut aus der Einheit einen neuen Feldherrn heraus lösen kann, nachdem man das bereits getan hat.

    - Auch für einen früheren Verwendungszweck der Feldherrn durch Gebäude sollte noch gesorgt werden. Siegessäulen zum Beispiel kommen viel zu spät im Spiel, um die auch für etwas anderes zu verwenden zu können. Sie nur an Einheiten anschließen zu müssen am Anfang, das ist noch nicht das richtige im Moment. Da fehlt mir aber die richtige Idee. Ausbildungsstätten wäre vielleicht eine Möglichkeit? Ein früherer Verwendungszweck als Gebäude, oder als XP gebende Komponente, wenn man einen Feldherrn wie früher einen Großen Genral einer Stadt anschließt, das wäre schöner als es das im Augenblick ist.

    - Große Generale sollten in der Hauptstadt erscheinen, wenn man Kämpfe innerhalb der eigenen Kulturgrenzen gewinnt statt Feldherrn finde ich. Jedenfalls meine ich, wenn ich bei meinem Beispiel nun 200 Erfahrung brauche für den nächsten Großen General, dann sind drei Stück davon (wie Flunky schrieb) bisher zu wenig. Wie schon gesagt, gerade die Militärakademien möchte man ja auch in ein paar Städten bauen können und nicht nur in einer, oder zwei und man möchte ja vielleicht auch mal einen Großen General haben der Truppen anführt. Das würde die Anzahl der Feldherrn ja auch schon wieder kürzen.

    Wie immer nur meine Gedanken dazu.

    Grüße John
    Geändert von JohnDay (11. Januar 2017 um 02:58 Uhr)

  8. #908
    Registrierter Benutzer Avatar von Thorgal
    Registriert seit
    06.08.09
    Beiträge
    5.238
    -) Isis-Kult: Hat jetzt Edelsteine als Ressource, aber keinen Stein mehr. Dafür immer noch das veraltende Elektrum. --> Stein statt Elektrum

    -) Bei Normal sind die Techkosten von 100 auf 125 gestiegen, bei Episch ist nichts passiert. Damit ist Normal in den Techkosten fast gleich zu Episch. (Mystik dauert 9, bzw. 11 Runden). --> Episch mitanpassen.

    -) Das Wachstum (und vermutlich auch die Prodgeschwindkeit) sollte dabei auch angepasst werden. Auf Normal dauert's bis Mystik 9 Runden und die Städte wachsen in durchschnittlich 14 Runden auf Pop 2. Das passt mMn nicht. Dazu gibt's den Wert iGrowth in der GameSpeed oder was besser wäre in den GlobalDefines die Werte BASE_CITY_GROWTH_THRESHOLD und CITY_GROWTH_MULTIPLIER.
    Eine Formel dazu hab ich auch gefunden: BASE_CITY_GROWTH_THRESHOLD + (current city size * CITY_GROWTH_MULTIPLIER)

    Und dann noch die KI betreffend. Da haben sich mit 4.6 zwei Sachen entscheidend verändert:

    -) Der Palastbau: Die Aufforderung zum Bau in der Util (AI_chooseProduction) greift nicht immer und die KI zieht oft den Bau anderer Sachen vor. Das war in früheren Version auch schon, nur hat sich jetzt einiges verschoben, u.a. durch den Umbau des Techbaus hat sie jetzt deutlich mehr Auswahl. Sie baut Krieger, Bogenschützen, Schmelzofen, Sternwarte, kleines Orakel, Äxte, Scheibenräder… aber keinen Palast. Es gibt damit KIs, die immer noch nicht mit dem Palastbau angefangen haben, während andere schon nach Binnekolo sind. Das wirkliche Problem ist, dass die KI den Palast falsch oder eher gar nicht bewertet:

    Bild

    Leider finde ich zu diesem Value nichts bei den Fanatics. Aber was eingeschränkt hilft, sind Veränderungen in der Building-XML:
    <iPower> auf 3 / wie Stadtmauer
    iAIWeight auf 50
    bei den Flavors fehlt Growth und die Werte sollten alle deutlich nach oben:
    Achtung Spoiler:
    Code:
          <Flavors>
            <Flavor>
              <FlavorType>FLAVOR_MILITARY</FlavorType>
              <iFlavor>50</iFlavor>
            </Flavor>
            <Flavor>
              <FlavorType>FLAVOR_PRODUCTION</FlavorType>
              <iFlavor>50</iFlavor>
            </Flavor>
            <Flavor>
              <FlavorType>FLAVOR_GOLD</FlavorType>
              <iFlavor>50</iFlavor>
            </Flavor>
            <Flavor>
              <FlavorType>FLAVOR_GROWTH</FlavorType>
              <iFlavor>50</iFlavor>
            </Flavor>
            <Flavor>
              <FlavorType>FLAVOR_SCIENCE</FlavorType>
              <iFlavor>50</iFlavor>
            </Flavor>
            <Flavor>
              <FlavorType>FLAVOR_CULTURE</FlavorType>
              <iFlavor>50</iFlavor>
            </Flavor>
          </Flavors>


    -) Die KI baut seltsamerweise plötzlich (fast) keine Karweelen mehr. Damit findet auch keine Kolonisierung der Mittelmeerinseln statt. Kein Plan, woran das liegt. Vielleicht auch ein Value-Problem?

    -) Und dann gibt's noch ein Problem mit dem Fog of War und dem KI-Siedlungsverhalten. Das ist nicht neu und ich beobachte es schon länger, aber es wird Zeit das mal anzusprechen. .
    Die KI baut einen Siedler und fällt dann eine Entscheidung, wo sie siedeln wird. Diese Entscheidung trifft sie auf Basis des von ihr aufgedeckten Gebiets (also alle Plots, die nicht im Nebel liegen). Dann schickt sie ihren Siedler dorthin. Wenn dann der gewählte Plot vom zurückkehrenden Nebel verdeckt wird, wird diese Entscheidung aufgehoben und die KI muss neuwählen. Der Effekt ist, dass ihr dadurch viele Runden verloren gehen (unnötige Wege), dass sie gute Siedlungsorte "vergisst" und dann öfters sinnlos Städte hinklatscht.

    Mal zwei Beispiele: Der Lyder hat hier auf 4 von Sardes seinen Siedler und war schon auf den Weg in den Süden, dann ist aber der Nebel zurückgekehrt:

    Bild

    Dadurch ist er wieder zurückgezogen und gründet jetzt sinnlos:

    Bild

    Geb ich ihm aber wieder freie Sicht auf den Süden, gründet er hier:

    Bild

    Das gleiche gilt auch für die Inselbesiedlung: Die KI landet mit einem Siedler an, dann verdeckt der zurückkehrende Nebel aber die Verbindung zum eigenen Territorium oder auch Teile der Insel, so dass die KI die Ressourcen aus den Blick verliert und die Insel anscheinend nicht mehr als Insel bewertet. Der Effekt ist dann, dass der Siedler x Runden sinnlos rumsteht. Wie z.B. hier:

    Bild

    Geb ich dem Karthager freie Sicht auf ganz Sizilien gründet er sofort.

    Mein Lösungsvorschlag wäre, den zurückkehrenden Nebel für die KI erst später zu aktivieren. Es reicht doch auch, wenn der Nebel bei der KI erst im Midgame zurückkehrt und letztlich ist das sogar erst mit der Tech zum Kartentausch wichtig.
    Angehängte Grafiken Angehängte Grafiken
    Pie's Antikes Europa (PAE): Genieße CIV in der Antike.

    PAE - Mythos Antike: Die Geschichte der drei furchtlosesten Herrscher des PBEM 442.

    Kingdom of Africa: Auf Abwegen im PB 73

  9. #909
    Registrierter Benutzer
    Registriert seit
    21.03.12
    Beiträge
    23.260
    Zitat Zitat von Thorgal Beitrag anzeigen
    -) Bei Normal sind die Techkosten von 100 auf 125 gestiegen, bei Episch ist nichts passiert. Damit ist Normal in den Techkosten fast gleich zu Episch. (Mystik dauert 9, bzw. 11 Runden). --> Episch mitanpassen.
    Eher Normal zurück auf 100. Das ist jetzt noch lahmer als eh schon.

    Zitat Zitat von Thorgal Beitrag anzeigen
    -) Das Wachstum (und vermutlich auch die Prodgeschwindkeit) sollte dabei auch angepasst werden. Auf Normal dauert's bis Mystik 9 Runden und die Städte wachsen in durchschnittlich 14 Runden auf Pop 2. Das passt mMn nicht. Dazu gibt's den Wert iGrowth in der GameSpeed oder was besser wäre in den GlobalDefines die Werte BASE_CITY_GROWTH_THRESHOLD und CITY_GROWTH_MULTIPLIER.
    Eine Formel dazu hab ich auch gefunden: BASE_CITY_GROWTH_THRESHOLD + (current city size * CITY_GROWTH_MULTIPLIER)
    25/25 vielleicht*. Dazu aber iGrowthPercent wieder auf 100. Effektiv ist grad 20/20 auf Normal**; 25/25 auf Epic, 30/30 auf Marathon. Auf Marathon wächst man also im Verhältnis zum Techspeed schneller^^

    *Also 50, 75, 100... für die nächste Bevölkerungsstufe
    **40, 60, 80...

    Zitat Zitat von Thorgal Beitrag anzeigen
    Und dann noch die KI betreffend. Da haben sich mit 4.6 zwei Sachen entscheidend verändert:

    -) Der Palastbau: Die Aufforderung zum Bau in der Util (AI_chooseProduction) greift nicht immer und die KI zieht oft den Bau anderer Sachen vor. Das war in früheren Version auch schon, nur hat sich jetzt einiges verschoben, u.a. durch den Umbau des Techbaus hat sie jetzt deutlich mehr Auswahl. Sie baut Krieger, Bogenschützen, Schmelzofen, Sternwarte, kleines Orakel, Äxte, Scheibenräder… aber keinen Palast. Es gibt damit KIs, die immer noch nicht mit dem Palastbau angefangen haben, während andere schon nach Binnekolo sind. Das wirkliche Problem ist, dass die KI den Palast falsch oder eher gar nicht bewertet:

    Bild

    Leider finde ich zu diesem Value nichts bei den Fanatics. Aber was eingeschränkt hilft, sind Veränderungen in der Building-XML:
    <iPower> auf 3 / wie Stadtmauer
    iAIWeight auf 50
    bei den Flavors fehlt Growth und die Werte sollten alle deutlich nach oben:
    Achtung Spoiler:
    Code:
          <Flavors>
            <Flavor>
              <FlavorType>FLAVOR_MILITARY</FlavorType>
              <iFlavor>50</iFlavor>
            </Flavor>
            <Flavor>
              <FlavorType>FLAVOR_PRODUCTION</FlavorType>
              <iFlavor>50</iFlavor>
            </Flavor>
            <Flavor>
              <FlavorType>FLAVOR_GOLD</FlavorType>
              <iFlavor>50</iFlavor>
            </Flavor>
            <Flavor>
              <FlavorType>FLAVOR_GROWTH</FlavorType>
              <iFlavor>50</iFlavor>
            </Flavor>
            <Flavor>
              <FlavorType>FLAVOR_SCIENCE</FlavorType>
              <iFlavor>50</iFlavor>
            </Flavor>
            <Flavor>
              <FlavorType>FLAVOR_CULTURE</FlavorType>
              <iFlavor>50</iFlavor>
            </Flavor>
          </Flavors>
    Über diese Values sollten wir eh viel mehr machen Der Palast ist aber auch nicht mehr so wichtig, das Kleine Orakel erfüllt fast alle Eigenschaften davon.


    Zitat Zitat von Thorgal Beitrag anzeigen
    -) Und dann gibt's noch ein Problem mit dem Fog of War und dem KI-Siedlungsverhalten. Das ist nicht neu und ich beobachte es schon länger, aber es wird Zeit das mal anzusprechen. .
    Die KI baut einen Siedler und fällt dann eine Entscheidung, wo sie siedeln wird. Diese Entscheidung trifft sie auf Basis des von ihr aufgedeckten Gebiets (also alle Plots, die nicht im Nebel liegen). Dann schickt sie ihren Siedler dorthin. Wenn dann der gewählte Plot vom zurückkehrenden Nebel verdeckt wird, wird diese Entscheidung aufgehoben und die KI muss neuwählen. Der Effekt ist, dass ihr dadurch viele Runden verloren gehen (unnötige Wege), dass sie gute Siedlungsorte "vergisst" und dann öfters sinnlos Städte hinklatscht.

    Mal zwei Beispiele: Der Lyder hat hier auf 4 von Sardes seinen Siedler und war schon auf den Weg in den Süden, dann ist aber der Nebel zurückgekehrt:

    Bild

    Dadurch ist er wieder zurückgezogen und gründet jetzt sinnlos:

    Bild

    Geb ich ihm aber wieder freie Sicht auf den Süden, gründet er hier:

    Bild

    Das gleiche gilt auch für die Inselbesiedlung: Die KI landet mit einem Siedler an, dann verdeckt der zurückkehrende Nebel aber die Verbindung zum eigenen Territorium oder auch Teile der Insel, so dass die KI die Ressourcen aus den Blick verliert und die Insel anscheinend nicht mehr als Insel bewertet. Der Effekt ist dann, dass der Siedler x Runden sinnlos rumsteht. Wie z.B. hier:

    Bild

    Geb ich dem Karthager freie Sicht auf ganz Sizilien gründet er sofort.

    Mein Lösungsvorschlag wäre, den zurückkehrenden Nebel für die KI erst später zu aktivieren. Es reicht doch auch, wenn der Nebel bei der KI erst im Midgame zurückkehrt und letztlich ist das sogar erst mit der Tech zum Kartentausch wichtig.
    Einfach ganz rausnehmen für die KI. Menschen können sich noch halbwegs merken, was im wieder verdeckten Gebiet war. Die KI nicht. Den Kartentausch kann man doch sicherlich so modifizieren, dass alle Plots, die für HI wieder schwarz geworden wären auch auf der getauschten Karte schwarz sind. Nope, geht nicht. Da ist kein Python-Hook vorgesehen.
    Geändert von Flunky (11. Januar 2017 um 12:43 Uhr)

  10. #910
    Registrierter Benutzer
    Registriert seit
    21.03.12
    Beiträge
    23.260
    Über alle Plots iterieren kann man auch mit:
    PHP-Code:
    for iI in range(CyMap().numPlots()):
       
    pPlot CyMap().plotByIndex(iI
    Spart die doppelte for-Schleife.
    Geändert von Flunky (11. Januar 2017 um 15:14 Uhr)

  11. #911
    Registrierter Benutzer
    Registriert seit
    21.03.12
    Beiträge
    23.260
    Wie wärs hiermit als Bedingung für den Black Fog:
    PHP-Code:
    # +++++ MAP Reveal to black fog - Kriegsnebel - Fog of War (FoW) - Karte schwarz zurueckfaerben
    # AI auch, aber nur alle iPlayer-Runden
    # AI wird wieder reingenommen -> wenn nur alle x Runden wahrscheinlich weniger Einheitenbewegung! -> no MAFs
        
    if pPlayer:
          
    iTeam pPlayer.getTeam()
          
    pTeam gc.getTeam(iTeam)
          
    # Human oder KI alle x Runden, aber unterschiedliche Civs pro Runde fuer optimale Rundenzeiten
          
    if pPlayer.isHuman() or (iGameTurn == iPlayer and pTeam.isMapTrading()): 

  12. #912
    Registrierter Benutzer Avatar von Thorgal
    Registriert seit
    06.08.09
    Beiträge
    5.238
    Zitat Zitat von Flunky Beitrag anzeigen
    Über diese Values sollten wir eh viel mehr machen Der Palast ist aber auch nicht mehr so wichtig, das Kleine Orakel erfüllt fast alle Eigenschaften davon.
    Ich hab aber keinen Plan, wie man den AI Building Value beeinflusst. Die von mir vorgeschlagenen Änderungen in der XML (auch die Flavor-Werte) haben keine Einfluss darauf. Der Palast bleibt immer bei 0.

    Zitat Zitat von Flunky Beitrag anzeigen
    Einfach ganz rausnehmen für die KI. Menschen können sich noch halbwegs merken, was im wieder verdeckten Gebiet war. Die KI nicht. Den Kartentausch kann man doch sicherlich so modifizieren, dass alle Plots, die für HI wieder schwarz geworden wären auch auf der getauschten Karte schwarz sind. Nope, geht nicht. Da ist kein Python-Hook vorgesehen.
    Wenn der Nebel sich für die KI erst spät im Midgame wieder aktiviert, sollte das auch funzen.
    Pie's Antikes Europa (PAE): Genieße CIV in der Antike.

    PAE - Mythos Antike: Die Geschichte der drei furchtlosesten Herrscher des PBEM 442.

    Kingdom of Africa: Auf Abwegen im PB 73

  13. #913
    Registrierter Benutzer
    Registriert seit
    21.03.12
    Beiträge
    23.260
    @BuildingValue:
    Achtung Spoiler:

    PHP-Code:
    BuildingTypes CvCityAI::AI_bestBuilding(int iFocusFlagsint iMaxTurnsbool bAsyncAdvisorTypes eIgnoreAdvisor)
    {
        return 
    AI_bestBuildingThreshold(iFocusFlagsiMaxTurns/*iMinThreshold*/ 0bAsynceIgnoreAdvisor);
    }

    BuildingTypes CvCityAI::AI_bestBuildingThreshold(int iFocusFlagsint iMaxTurnsint iMinThresholdbool bAsyncAdvisorTypes eIgnoreAdvisor)
    {
        
    BuildingTypes eLoopBuilding;
        
    BuildingTypes eBestBuilding;
        
    bool bAreaAlone;
        
    int iProductionRank;
        
    int iTurnsLeft;
        
    int iValue;
        
    int iTempValue;
        
    int iBestValue;
        
    int iIiJ;

        
    bAreaAlone GET_PLAYER(getOwnerINLINE()).AI_isAreaAlone(area());

        
    iProductionRank findYieldRateRank(YIELD_PRODUCTION);

        
    iBestValue 0;
        
    eBestBuilding NO_BUILDING;


        if (
    iFocusFlags BUILDINGFOCUS_CAPITAL)
        {
            
    int iBestTurnsLeft iMaxTurns iMaxTurns MAX_INT;
            for (
    iI 0iI GC.getNumBuildingClassInfos(); iI++)
            {
                
    eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(getCivilizationType()).getCivilizationBuildings(iI)));

                if (
    NO_BUILDING != eLoopBuilding)
                {
                    
    CvBuildingInfokBuilding GC.getBuildingInfo(eLoopBuilding);

                    if (
    kBuilding.isCapital())
                    {
                        if (
    canConstruct(eLoopBuilding))
                        {
                            
    int iTurnsLeft getProductionTurnsLeft(eLoopBuilding0);

                            if (
    iTurnsLeft <= iBestTurnsLeft)
                            {
                                
    eBestBuilding eLoopBuilding;
                                
    iBestTurnsLeft iTurnsLeft;
                            }
                        }
                    }
                }
            }

            return 
    eBestBuilding;
        }

        for (
    iI 0iI GC.getNumBuildingClassInfos(); iI++)
        {
            if (!(
    GET_PLAYER(getOwnerINLINE()).isBuildingClassMaxedOut(((BuildingClassTypes)iI), GC.getBuildingClassInfo((BuildingClassTypes)iI).getExtraPlayerInstances())))
            {
                
    eLoopBuilding = ((BuildingTypes)(GC.getCivilizationInfo(getCivilizationType()).getCivilizationBuildings(iI)));

                if ((
    eLoopBuilding != NO_BUILDING) && (getNumBuilding(eLoopBuilding) < GC.getCITY_MAX_NUM_BUILDINGS())
                &&  (!
    isProductionAutomated() || !(isWorldWonderClass((BuildingClassTypes)iI) || isNationalWonderClass((BuildingClassTypes)iI))))
                {
                    
    //don't build wonders?
                    
    if (((iFocusFlags == 0) || (iFocusFlags BUILDINGFOCUS_WONDEROK) || (iFocusFlags BUILDINGFOCUS_WORLDWONDER)) || 
                        !(
    isWorldWonderClass((BuildingClassTypes)iI) || 
                         
    isTeamWonderClass((BuildingClassTypes)iI) || 
                          
    isNationalWonderClass((BuildingClassTypes)iI) ||
                           
    isLimitedWonderClass((BuildingClassTypes)iI)))
                    {
                        if ((
    eIgnoreAdvisor == NO_ADVISOR) || (GC.getBuildingInfo(eLoopBuilding).getAdvisorType() != eIgnoreAdvisor))
                        {
                            if (
    canConstruct(eLoopBuilding))
                            {
                                
    iValue AI_buildingValueThreshold(eLoopBuildingiFocusFlagsiMinThreshold);

                                if (
    GC.getBuildingInfo(eLoopBuilding).getFreeBuildingClass() != NO_BUILDINGCLASS)
                                {
                                    
    BuildingTypes eFreeBuilding = (BuildingTypes)GC.getCivilizationInfo(getCivilizationType()).getCivilizationBuildings(GC.getBuildingInfo(eLoopBuilding).getFreeBuildingClass());
                                    if (
    NO_BUILDING != eFreeBuilding)
                                    {
                                        
    iValue += (AI_buildingValue(eFreeBuildingiFocusFlags) * (GET_PLAYER(getOwnerINLINE()).getNumCities() - GET_PLAYER(getOwnerINLINE()).getBuildingClassCountPlusMaking((BuildingClassTypes)GC.getBuildingInfo(eLoopBuilding).getFreeBuildingClass())));
                                    }
                                }
                                if (
    isProductionAutomated())
                                {
                                    for (
    iJ 0iJ GC.getNumBuildingClassInfos(); iJ++)
                                    {
                                        if (
    GC.getBuildingInfo(eLoopBuilding).getPrereqNumOfBuildingClass(iJ) > 0)
                                        {
                                            
    iValue 0;
                                            break;
                                        }
                                    }
                                }


                                if (
    iValue 0)
                                {
                                    
    iTurnsLeft getProductionTurnsLeft(eLoopBuilding0);

                                    if (
    isWorldWonderClass((BuildingClassTypes)iI))
                                    {
                                        if (
    iProductionRank <= std::min(3, ((GET_PLAYER(getOwnerINLINE()).getNumCities() + 2) / 3)))
                                        {
                                            if (
    bAsync)
                                            {
                                                
    iTempValue GC.getASyncRand().get(GC.getLeaderHeadInfo(getPersonalityType()).getWonderConstructRand(), "Wonder Construction Rand ASYNC");
                                            }
                                            else
                                            {
                                                
    iTempValue GC.getGameINLINE().getSorenRandNum(GC.getLeaderHeadInfo(getPersonalityType()).getWonderConstructRand(), "Wonder Construction Rand");
                                            }
                                            
                                            if (
    bAreaAlone)
                                            {
                                                
    iTempValue *= 2;
                                            }
                                            
    iValue += iTempValue;
                                        }
                                    }

                                    if (
    bAsync)
                                    {
                                        
    iValue *= (GC.getASyncRand().get(25"AI Best Building ASYNC") + 100);
                                        
    iValue /= 100;
                                    }
                                    else
                                    {
                                        
    iValue *= (GC.getGameINLINE().getSorenRandNum(25"AI Best Building") + 100);
                                        
    iValue /= 100;
                                    }

                                    
    iValue += getBuildingProduction(eLoopBuilding);
                                    
                                    
                                    
    bool bValid = ((iMaxTurns <= 0) ? true false);
                                    if (!
    bValid)
                                    {
                                        
    bValid = (iTurnsLeft <= GC.getGameINLINE().AI_turnsPercent(iMaxTurnsGC.getGameSpeedInfo(GC.getGameINLINE().getGameSpeedType()).getConstructPercent()));
                                    }
                                    if (!
    bValid)
                                    {
                                        for (
    int iHurry 0iHurry GC.getNumHurryInfos(); ++iHurry)
                                        {
                                            if (
    canHurryBuilding((HurryTypes)iHurryeLoopBuildingtrue))
                                            {
                                                if (
    AI_getHappyFromHurry((HurryTypes)iHurryeLoopBuildingtrue) > 0)
                                                {
                                                    
    bValid true;
                                                    break;
                                                }
                                            }
                                        }
                                    }

                                    if (
    bValid)
                                    {
                                        
    FAssert((MAX_INT 1000) > iValue);
                                        
    iValue *= 1000;
                                        
    iValue /= std::max(1, (iTurnsLeft 3));

                                        
    iValue std::max(1iValue);

                                        if (
    iValue iBestValue)
                                        {
                                            
    iBestValue iValue;
                                            
    eBestBuilding eLoopBuilding;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return 
    eBestBuilding;
    }


    int CvCityAI::AI_buildingValue(BuildingTypes eBuildingint iFocusFlags)
    {
        return 
    AI_buildingValueThreshold(eBuildingiFocusFlags0);
    }

    // XXX should some of these count cities, buildings, etc. based on teams (because wonders are shared...)
    // XXX in general, this function needs to be more sensitive to what makes this city unique (more likely to build airports if there already is a harbor...)
    int CvCityAI::AI_buildingValueThreshold(BuildingTypes eBuildingint iFocusFlagsint iThreshold)
    {
        
    PROFILE_FUNC();

        
    int iTempValue;
        
    int iPass;
        
    int iIiJ;

        
    CvPlayerAIkOwner GET_PLAYER(getOwnerINLINE());
        
    CvBuildingInfokBuilding GC.getBuildingInfo(eBuilding);
        
    BuildingClassTypes eBuildingClass = (BuildingClassTypeskBuilding.getBuildingClassType();
        
    int iLimitedWonderLimit limitedWonderClassLimit(eBuildingClass);
        
    bool bIsLimitedWonder = (iLimitedWonderLimit >= 0);

        
    ReligionTypes eStateReligion kOwner.getStateReligion();

        
    bool bAreaAlone kOwner.AI_isAreaAlone(area());
        
    bool bProvidesPower = (kBuilding.isPower() || ((kBuilding.getPowerBonus() != NO_BONUS) && hasBonus((BonusTypes)(kBuilding.getPowerBonus()))));

        
    int iHasMetCount GET_TEAM(getTeam()).getHasMetCivCount(true);
        
    int iFoodDifference foodDifference(false);

        
    int iHappinessLevel happyLevel() - unhappyLevel(1);
        
    int iAngryPopulation range(-iHappinessLevel0, (getPopulation() + 1));
        
    int iHealthLevel goodHealth() - badHealth(/*bNoAngry*/ falsestd::max(0, (iHappinessLevel 1) / 2));
        
    int iBadHealth std::max(0, -iHealthLevel);

        
    int iHappyModifier = (iHappinessLevel >= iHealthLevel && iHappinessLevel <= 6) ? 3;
        
    int iHealthModifier = (iHealthLevel iHappinessLevel && iHealthLevel <= 4) ? 2;
        if (
    iHappinessLevel >= 10)
        {
            
    iHappyModifier 1;
        }
        if (
    iHealthModifier >= 8)
        {
            
    iHealthModifier 0;
        }
        
        
    int iTotalPopulation kOwner.getTotalPopulation();
        
    int iNumCities kOwner.getNumCities();
        
    int iNumCitiesInArea area()->getCitiesPerPlayer(getOwnerINLINE());
        
        
    int aiYieldRank[NUM_YIELD_TYPES];
        for (
    iI 0iI NUM_YIELD_TYPESiI++)
        {
            
    aiYieldRank[iI] = MAX_INT;
        }

        
    int aiCommerceRank[NUM_COMMERCE_TYPES];
        for (
    iI 0iI NUM_COMMERCE_TYPESiI++)
        {
            
    aiCommerceRank[iI] = MAX_INT;
        }

        
    aiYieldRank[YIELD_PRODUCTION] = findBaseYieldRateRank(YIELD_PRODUCTION);
        
    bool bIsHighProductionCity = (aiYieldRank[YIELD_PRODUCTION] <= std::max(3, (iNumCities 2)));
        
        
    int iCultureRank findCommerceRateRank(COMMERCE_CULTURE);
        
    int iCulturalVictoryNumCultureCities GC.getGameINLINE().culturalVictoryNumCultureCities();

        
    bool bFinancialTrouble GET_PLAYER(getOwnerINLINE()).AI_isFinancialTrouble();

        
    bool bCulturalVictory1 GET_PLAYER(getOwnerINLINE()).AI_isDoStrategy(AI_STRATEGY_CULTURE1);
        
    bool bCulturalVictory2 GET_PLAYER(getOwnerINLINE()).AI_isDoStrategy(AI_STRATEGY_CULTURE2);
        
    bool bCulturalVictory3 GET_PLAYER(getOwnerINLINE()).AI_isDoStrategy(AI_STRATEGY_CULTURE3);
        
        
    bool bCanPopRush GET_PLAYER(getOwnerINLINE()).canPopRush();

        
    bool bForeignTrade false;
        
    int iNumTradeRoutes getTradeRoutes();
        for (
    iI 0iI iNumTradeRoutes; ++iI)
        {
            
    CvCitypTradeCity getTradeCity(iI);
            if (
    NULL != pTradeCity)
            {
                if (
    GET_PLAYER(pTradeCity->getOwnerINLINE()).getTeam() != getTeam() || pTradeCity->area() != area())
                {
                    
    bForeignTrade true;
                    break;
                }
            }
        }

        if (
    kBuilding.isCapital())
        {
            return 
    0;
        }

        for (
    iI 0iI GC.getNumReligionInfos(); iI++)
        {
            if (
    kBuilding.getReligionChange(iI) > 0)
            {
                if (!(
    GET_TEAM(getTeam()).hasHolyCity((ReligionTypes)iI)))
                {
                    return 
    0;
                }
            }
        }

        
    int iValue 0;

        for (
    iPass 0iPass 2iPass++)
        {
            if ((
    iFocusFlags == 0) || (iValue 0) || (iPass == 0))
            {
                
                if ((
    iFocusFlags BUILDINGFOCUS_WORLDWONDER) || (iPass 0))
                {
                    if (
    isWorldWonderClass(eBuildingClass))
                    {
                        if (
    aiYieldRank[YIELD_PRODUCTION] <= 3)
                        {
                            
    iValue++;
                        }
                    }
                }
                
                if ((
    iFocusFlags BUILDINGFOCUS_DEFENSE) || (iPass 0))
                {
                    if (!
    bAreaAlone)
                    {
                        if ((
    GC.getGameINLINE().getBestLandUnit() == NO_UNIT) || !(GC.getUnitInfo(GC.getGameINLINE().getBestLandUnit()).isIgnoreBuildingDefense()))
                        {
                            
    iValue += (std::max(0std::min(((kBuilding.getDefenseModifier() + getBuildingDefense()) - getNaturalDefense() - 10), kBuilding.getDefenseModifier())) / 4);
                        }
                    }

                    
    iValue += kBuilding.getBombardDefenseModifier() / 8;
                    
                    
    iValue += -kBuilding.getAirModifier() / 4;
                    
    iValue += -kBuilding.getNukeModifier() / 4;
                    
                    
    iValue += ((kBuilding.getAllCityDefenseModifier() * iNumCities) / 5);
                    
                    
    iValue += kBuilding.getAirlift() * 25;
                }

                if ((
    iFocusFlags BUILDINGFOCUS_ESPIONAGE) || (iPass 0))
                {
                    
    iValue += kBuilding.getEspionageDefenseModifier() / 8;
                }

                if (((
    iFocusFlags BUILDINGFOCUS_HAPPY) || (iPass 0)) && !isNoUnhappiness())
                {
                    
    int iBestHappy 0;
                    for (
    iI 0iI GC.getNumHurryInfos(); iI++)
                    {
                        if (
    canHurryBuilding((HurryTypes)iIeBuildingtrue))
                        {
                            
    int iHappyFromHurry AI_getHappyFromHurry((HurryTypes)iIeBuildingtrue);
                            if (
    iHappyFromHurry iBestHappy)
                            {
                                
    iBestHappy iHappyFromHurry;
                            }
                        }
                    }
                    
    iValue += iBestHappy 10;

                    if (
    kBuilding.isNoUnhappiness())
                    {
                        
    iValue += ((iAngryPopulation 10) + getPopulation());
                    }
                    
                    
    int iBuildingHappiness kBuilding.getHappiness();
                    if (
    iBuildingHappiness != 0)
                    {
                        
    iValue += (std::min(iBuildingHappinessiAngryPopulation) * 10
                            + (
    std::max(0iBuildingHappiness iAngryPopulation) * iHappyModifier);
                    }

                    
    iValue += (kBuilding.getAreaHappiness() * iNumCitiesInArea 8);
                    
    iValue += (kBuilding.getGlobalHappiness() * iNumCities 8);

                    
    int iWarWearinessPercentAnger kOwner.getWarWearinessPercentAnger();
                    
    int iWarWearinessModifer kBuilding.getWarWearinessModifier();
                    if (
    iWarWearinessModifer 0)
                    {
                        
    iValue += (std::min(-(((iWarWearinessModifer iWarWearinessPercentAnger) / 100) / GC.getPERCENT_ANGER_DIVISOR()), iAngryPopulation) * 8);
                        
    iValue += (-iWarWearinessModifer iHappyModifier) / 16;
                    }
                    
                    
    int iGlobalWarWearinessModifer kBuilding.getGlobalWarWearinessModifier();
                    if (
    iGlobalWarWearinessModifer 0)
                    {
                        
    iValue += (-(((iGlobalWarWearinessModifer iWarWearinessPercentAnger 100) / GC.getPERCENT_ANGER_DIVISOR())) * iNumCities);
                        
    iValue += (-iGlobalWarWearinessModifer iHappyModifier) / 16;
                    }

                    
    iValue += (-kBuilding.getHurryAngerModifier() * getHurryPercentAnger()) / 100;

                    
    int iStateReligionHappiness kBuilding.getStateReligionHappiness();
                    if (
    kBuilding.getReligionType() == eStateReligion && iStateReligionHappiness != 0)
                    {
                        
    iValue += (std::min(iStateReligionHappinessiAngryPopulation) * 8)
                            + (
    std::max(0iStateReligionHappiness iAngryPopulation) * iHappyModifier);
                    }

                    for (
    iI 0iI NUM_COMMERCE_TYPESiI++)
                    {
                        
    iValue += (std::min(((kBuilding.getCommerceHappiness(iI) * kOwner.getCommercePercent((CommerceTypes)iI)) / 100), iAngryPopulation) * 8);
                        
    iValue += (kBuilding.getCommerceHappiness(iI) * iHappyModifier) / 4;
                    }

                    for (
    iI 0iI GC.getNumBonusInfos(); iI++)
                    {
                        if (
    hasBonus((BonusTypes)iI))
                        {
                            
    int iBonusHappinessChange kBuilding.getBonusHappinessChanges(iI);
                            
    iValue += (std::min(iBonusHappinessChangeiAngryPopulation) * 8)
                                + (
    std::max(0iBonusHappinessChange iAngryPopulation) * iHappyModifier);
                        }
                    }

                    for (
    iI 0iI GC.getNumBuildingClassInfos(); iI++)
                    {
                        if (
    kBuilding.getBuildingHappinessChanges(iI) != 0)
                        {
                            
    iValue += (kBuilding.getBuildingHappinessChanges(iI) * kOwner.getBuildingClassCount((BuildingClassTypes)iI) * 8);
                        }
                    }
                }

                if (((
    iFocusFlags BUILDINGFOCUS_HEALTHY) || (iPass 0)) && !isNoUnhealthyPopulation())
                {
                    if (
    bProvidesPower)
                    {
                        if (
    isDirtyPower() && !(kBuilding.isDirtyPower()))
                        {
                            
    iValue += (std::min(-(GC.getDefineINT("DIRTY_POWER_HEALTH_CHANGE")), iBadHealth) * 8);
                        }
                    }

                    if (
    kBuilding.isNoUnhealthyPopulation())
                    {
                        
    int iUnhealthyPopulation unhealthyPopulation();
                        
    iValue += (std::min(iUnhealthyPopulationiBadHealth) * 12)
                            + (
    std::max(0iUnhealthyPopulation iBadHealth) * iHealthModifier);
                    }

                    if (
    kBuilding.isBuildingOnlyHealthy())
                    {
                        
    int iBuildingBadHealth = -getBuildingBadHealth();
                        
    iValue += (std::min(iBuildingBadHealthiBadHealth) * 12)
                            + ((
    std::max(0iBuildingBadHealth iBadHealth) + 1) * iHealthModifier);
                    }

                    
    int iBuildingHealth kBuilding.getHealth();
                    if (
    iBuildingHealth != 0)
                    {
                        
    iValue += (std::min(iBuildingHealthiBadHealth) * 12)
                            + (
    std::max(0iBuildingHealth iBadHealth) * iHealthModifier);
                    }

                    
    iValue += (kBuilding.getAreaHealth() * iNumCitiesInArea 4);
                    
    iValue += (kBuilding.getGlobalHealth() * iNumCities 4);

                    for (
    iI 0iI GC.getNumBonusInfos(); iI++)
                    {
                        if (
    hasBonus((BonusTypes)iI))
                        {
                            
    int iBonusHealthChange kBuilding.getBonusHealthChanges(iI);
                            
    iValue += (std::min(iBonusHealthChangeiBadHealth) * 12)
                                + (
    std::max(0iBonusHealthChange iBadHealth) * iHealthModifier);
                        }
                    }
                }

                if ((
    iFocusFlags BUILDINGFOCUS_EXPERIENCE) || (iPass 0))
                {
                    
    iValue += (kBuilding.getFreeExperience() * ((iHasMetCount 0) ? 12 6));

                    for (
    iI 0iI GC.getNumUnitCombatInfos(); iI++)
                    {
                        if (
    canTrain((UnitCombatTypes)iI))
                        {
                            
    iValue += (kBuilding.getUnitCombatFreeExperience(iI) * ((iHasMetCount 0) ? 3));
                        }
                    }

                    for (
    iI 0iI NUM_DOMAIN_TYPESiI++)
                    {
                        
    int iDomainExpValue 0;
                        if (
    iI == DOMAIN_SEA)
                        {
                            
    iDomainExpValue 7;
                        } 
                        else if (
    iI == DOMAIN_LAND)
                        {
                            
    iDomainExpValue 12;
                        }
                        else
                        {
                            
    iDomainExpValue 6;
                        }
                        
    iValue += (kBuilding.getDomainFreeExperience(iI) * ((iHasMetCount 0) ? iDomainExpValue iDomainExpValue 2));
                    }
                }
                
                
    // since this duplicates BUILDINGFOCUS_EXPERIENCE checks, do not repeat on pass 1
                
    if ((iFocusFlags BUILDINGFOCUS_DOMAINSEA))
                {
                    
    iValue += (kBuilding.getFreeExperience() * ((iHasMetCount 0) ? 16 8));

                    for (
    int iUnitIndex 0iUnitIndex GC.getNumUnitClassInfos(); iUnitIndex++)
                    {
                        
    UnitTypes eUnit = (UnitTypes)GC.getCivilizationInfo(getCivilizationType()).getCivilizationUnits(iUnitIndex);

                        if (
    NO_UNIT != eUnit)
                        {
                            
    CvUnitInfokUnitInfo GC.getUnitInfo(eUnit);
                        
    int iCombatType kUnitInfo.getUnitCombatType();
                            if (
    kUnitInfo.getDomainType() == DOMAIN_SEA && canTrain(eUnit) && iCombatType != NO_UNITCOMBAT)
                        {
                            
    iValue += (kBuilding.getUnitCombatFreeExperience(iCombatType) * ((iHasMetCount 0) ? 3));
                        }
                    }
                    }

                    
    iValue += (kBuilding.getDomainFreeExperience(DOMAIN_SEA) * ((iHasMetCount 0) ? 16 8));

                    
    iValue += (kBuilding.getDomainProductionModifier(DOMAIN_SEA) / 4);
                }

                if ((
    iFocusFlags BUILDINGFOCUS_MAINTENANCE) || (iFocusFlags BUILDINGFOCUS_GOLD) || (iPass 0))
                {

                    
    int iBaseMaintenance getMaintenanceTimes100();
                    
    int iExistingUpkeep = (iBaseMaintenance std::max(0100 getMaintenanceModifier())) / 100;
                    
    int iNewUpkeep = (iBaseMaintenance std::max(0100 getMaintenanceModifier() + kBuilding.getMaintenanceModifier())) / 100;
                    
                    
    iTempValue = (iExistingUpkeep iNewUpkeep) / 16;
                    
                    if (
    bFinancialTrouble)
                    {
                        
    iTempValue *= 2;
                    }

                    
    iValue += iTempValue;
                }

                if ((
    iFocusFlags BUILDINGFOCUS_SPECIALIST) || (iPass 0))
                {
                    
    int iSpecialistsValue 0;
                    
    int iCurrentSpecialistsRunnable 0;
                    for (
    iI 0iI GC.getNumSpecialistInfos(); iI++)
                    {
                        if (
    iI != GC.getDefineINT("DEFAULT_SPECIALIST"))
                        {
                            
    bool bUnlimited = (GET_PLAYER(getOwnerINLINE()).isSpecialistValid((SpecialistTypes)iI));
                            
    int iRunnable = (getMaxSpecialistCount((SpecialistTypes)iI) > 0);
                            
                            if (
    bUnlimited || (iRunnable 0))
                            {
                                if (
    bUnlimited)
                                {
                                    
    iCurrentSpecialistsRunnable += 5;
                                }
                                else
                                {
                                    
    iCurrentSpecialistsRunnable += iRunnable;
                                }
                            }
                            
                            
                            if (
    kBuilding.getSpecialistCount(iI) > 0)
                            {
                                if ((!
    bUnlimited) && (iRunnable 5))
                                {
                                    
    iTempValue AI_specialistValue(((SpecialistTypes)iI), falsefalse);

                                    
    iTempValue *= (20 + (40 kBuilding.getSpecialistCount(iI)));
                                    
    iTempValue /= 100;
                                    
                                    if (
    iFoodDifference 2)
                                    {
                                        
    iValue /= 4;
                                    }
                                    if (
    iRunnable 0)
                                    {
                                        
    iValue /= iRunnable;
                                    }

                                    
    iSpecialistsValue += std::max(12, (iTempValue 100));
                                }
                            }
                        }
                    }
                    
                    if (
    iSpecialistsValue 0)
                    {
                        
    iValue += iSpecialistsValue std::max(2iCurrentSpecialistsRunnable);
                    }
                }
                
                if ((
    iFocusFlags & (BUILDINGFOCUS_GOLD BUILDINGFOCUS_RESEARCH)) || iPass 0)
                {
                    
    // trade routes
                    
    iTempValue = ((kBuilding.getTradeRoutes() * ((std::max(0, (totalTradeModifier() + 100))) / 100))
                                    * (
    getPopulation() / 1));
                    
    int iGlobalTradeValue = (((iTotalPopulation) / 5) / iNumCities);
                    
    iTempValue += (kBuilding.getCoastalTradeRoutes() * kOwner.countNumCoastalCities() * iGlobalTradeValue);
                    
    iTempValue += (kBuilding.getGlobalTradeRoutes() * iNumCities iGlobalTradeValue);
                    
                    
    iTempValue += ((kBuilding.getTradeRouteModifier() * getTradeYield(YIELD_COMMERCE)) / (bForeignTrade 12 25));
                    if (
    bForeignTrade)
                    {
                        
    iTempValue += ((kBuilding.getForeignTradeRouteModifier() * getTradeYield(YIELD_COMMERCE)) / 12);
                    }
                        
                    if (
    bFinancialTrouble)
                    {
                        
    iTempValue *= 2;
                    }
                        
                    if (
    kOwner.isNoForeignTrade())
                    {
                        
    iTempValue /= 3;
                    }
                    

                    
    iValue += iTempValue;
                }

                if (
    iPass 0)
                {
                    if (
    kBuilding.isAreaCleanPower())
                    {
                        
    iValue += (iNumCitiesInArea 10); // XXX count cities without clean power???
                    
    }

                    if (
    kBuilding.getDomesticGreatGeneralRateModifier() != 0)
                    {
                        
    iValue += (kBuilding.getDomesticGreatGeneralRateModifier() / 10);
                    }

                    if (
    kBuilding.isAreaBorderObstacle())
                    {
                        
    iValue += (iNumCitiesInArea);
                    }

                    if (
    kBuilding.isGovernmentCenter())
                    {
                        
    FAssert(!(kBuilding.isCapital()));
                        
    iValue += ((calculateDistanceMaintenance() - 3) * iNumCitiesInArea);
                    }

                    if (
    kBuilding.isMapCentering())
                    {
                        
    iValue++;
                    }

                    if (
    kBuilding.getFreeBonus() != NO_BONUS)
                    {
                        
    iValue += (kOwner.AI_bonusVal((BonusTypes)(kBuilding.getFreeBonus()), 1) *
                                     ((
    kOwner.getNumTradeableBonuses((BonusTypes)(kBuilding.getFreeBonus())) == 0) ? 1) *
                                     (
    iNumCities kBuilding.getNumFreeBonuses()));
                    }

                    if (
    kBuilding.getNoBonus() != NO_BONUS)
                    {
                        
    iValue -= kOwner.AI_bonusVal((BonusTypes)kBuilding.getNoBonus());
                    }

                    if (
    kBuilding.getFreePromotion() != NO_PROMOTION)
                    {
                        
    iValue += ((iHasMetCount 0) ? 100 40); // XXX some sort of promotion value???
                    
    }

                    if (
    kBuilding.getCivicOption() != NO_CIVICOPTION)
                    {
                        for (
    iI 0iI GC.getNumCivicInfos(); iI++)
                        {
                            if (
    GC.getCivicInfo((CivicTypes)iI).getCivicOptionType() == kBuilding.getCivicOption())
                            {
                                if (!(
    kOwner.canDoCivics((CivicTypes)iI)))
                                {
                                    
    iValue += (kOwner.AI_civicValue((CivicTypes)iI) / 10);
                                }
                            }
                        }
                    }
                    
                    
    int iGreatPeopleRateModifier kBuilding.getGreatPeopleRateModifier();
                    if (
    iGreatPeopleRateModifier 0)
                    {
                        
    int iGreatPeopleRate getBaseGreatPeopleRate();
                        const 
    int kTargetGPRate 10;

                        
    // either not a wonder, or a wonder and our GP rate is at least the target rate
                        
    if (!bIsLimitedWonder || iGreatPeopleRate >= kTargetGPRate)
                        {
                            
    iValue += ((iGreatPeopleRateModifier iGreatPeopleRate) / 16);
                        }
                        
    // otherwise, this is a limited wonder (aka National Epic), we _really_ do not want to build this here
                        // subtract from the value (if this wonder has a lot of other stuff, we still might build it)
                        
    else
                        {
                            
    iValue -= ((iGreatPeopleRateModifier * (kTargetGPRate iGreatPeopleRate)) / 12);
                        }
                    }

                    
    iValue += ((kBuilding.getGlobalGreatPeopleRateModifier() * iNumCities) / 8);

                    
    iValue += (-(kBuilding.getAnarchyModifier()) / 4);

                    
    iValue += (-(kBuilding.getGlobalHurryModifier()) * 2);

                    
    iValue += (kBuilding.getGlobalFreeExperience() * iNumCities * ((iHasMetCount 0) ? 3));

                    if (
    bCanPopRush)
                    {
                        
    iValue += kBuilding.getFoodKept() / 2;
                    }

                    
    iValue += kBuilding.getAirlift() * (getPopulation() * 10);
                    
                    
    int iAirDefense = -kBuilding.getAirModifier();
                    if (
    iAirDefense 0)
                    {
                        if (((
    kOwner.AI_totalUnitAIs(UNITAI_DEFENSE_AIR) > 0) && (kOwner.AI_totalUnitAIs(UNITAI_ATTACK_AIR) > 0)) || (kOwner.AI_totalUnitAIs(UNITAI_MISSILE_AIR) > 0))
                        {
                            
    iValue += iAirDefense / ((iHasMetCount 0) ? 4);
                        }
                    }

                    
    iValue += kBuilding.getAirUnitCapacity() * (getPopulation() * 10);

                    
    iValue += (-(kBuilding.getNukeModifier()) / ((iHasMetCount 0) ? 10 20));

                    
    iValue += (kBuilding.getFreeSpecialist() * 16);
                    
    iValue += (kBuilding.getAreaFreeSpecialist() * iNumCitiesInArea 12);
                    
    iValue += (kBuilding.getGlobalFreeSpecialist() * iNumCities 12);

                    
    iValue += ((kBuilding.getWorkerSpeedModifier() * kOwner.AI_getNumAIUnits(UNITAI_WORKER)) / 10);

                    
    int iMilitaryProductionModifier kBuilding.getMilitaryProductionModifier();
                    if (
    iHasMetCount && iMilitaryProductionModifier 0)
                    {
                        
    // either not a wonder, or a wonder and we are a high production city
                        
    if (!bIsLimitedWonder || bIsHighProductionCity)
                        {
                            
    iValue += (iMilitaryProductionModifier 4);

                            
    // if a wonder, then pick one of the best cities
                            
    if (bIsLimitedWonder)
                            {
                                
    // if one of the top 3 production cities, give a big boost
                                
    if (aiYieldRank[YIELD_PRODUCTION] <= (iLimitedWonderLimit))
                                {
                                    
    iValue += (iMilitaryProductionModifier) / (aiYieldRank[YIELD_PRODUCTION]);
                                }
                            }
                            
    // otherwise, any of the top half of cities will do
                            
    else if (bIsHighProductionCity)
                            {
                                
    iValue += iMilitaryProductionModifier 4;
                            }
                            
    iValue += ((iMilitaryProductionModifier * (getFreeExperience() + getSpecialistFreeExperience())) / 10);
                        }
                        
    // otherwise, this is a limited wonder (aka Heroic Epic), we _really_ do not want to build this here
                        // subtract from the value (if this wonder has a lot of other stuff, we still might build it)
                        
    else
                        {
                            
    iValue -= (iMilitaryProductionModifier aiYieldRank[YIELD_PRODUCTION]) / 5;
                        }
                    }

                    
    iValue += (kBuilding.getSpaceProductionModifier() / 5);
                    
    iValue += ((kBuilding.getGlobalSpaceProductionModifier() * iNumCities) / 20);
                    

                    if (
    kBuilding.getGreatPeopleUnitClass() != NO_UNITCLASS)
                    {
                        
    iValue++; // XXX improve this for diversity...
                    
    }
                    
                    
    // prefer to build great people buildings in places that already have some GP points
                    
    iValue += (kBuilding.getGreatPeopleRateChange() * 10) * (+ (getBaseGreatPeopleRate() / 2));

                    if (!
    bAreaAlone)
                    {
                        
    iValue += (kBuilding.getHealRateChange() / 2);
                    }

                    
    iValue += (kBuilding.getGlobalPopulationChange() * iNumCities 4);

                    
    iValue += (kBuilding.getFreeTechs() * 80);

                    
    iValue += kBuilding.getEnemyWarWearinessModifier() / 2;

                    for (
    iI 0iI GC.getNumSpecialistInfos(); iI++)
                    {
                        if (
    kBuilding.getFreeSpecialistCount(iI) > 0)
                        {
                            
    iValue += ((AI_specialistValue(((SpecialistTypes)iI), falsefalse) * kBuilding.getFreeSpecialistCount(iI)) / 50);
                        }
                    }

                    for (
    iI 0iI GC.getNumImprovementInfos(); iI++)
                    {
                        if (
    kBuilding.getImprovementFreeSpecialist(iI) > 0)
                        {
                            
    iValue += kBuilding.getImprovementFreeSpecialist(iI) * countNumImprovedPlots((ImprovementTypes)iItrue) * 50;
                        }
                    }

                    for (
    iI 0iI NUM_DOMAIN_TYPESiI++)
                    {
                        
    iValue += (kBuilding.getDomainProductionModifier(iI) / 5);
                        
                        if (
    bIsHighProductionCity)
                        {
                            
    iValue += (kBuilding.getDomainProductionModifier(iI) / 5);
                        }
                    }

                    for (
    iI 0iI GC.getNumUnitInfos(); iI++)
                    {
                        if (
    GC.getUnitInfo((UnitTypes)iI).getPrereqBuilding() == eBuilding)
                        {
                            if (
    kOwner.AI_totalAreaUnitAIs(area(), ((UnitAITypes)(GC.getUnitInfo((UnitTypes)iI).getDefaultUnitAIType()))) == 0)
                            {
                                
    iValue += iNumCitiesInArea;
                            }

                            
    iValue++;

                            
    ReligionTypes eReligion = (ReligionTypes)(GC.getUnitInfo((UnitTypes)iI).getPrereqReligion());
                            if (
    eReligion != NO_RELIGION)
                            {
                                
    //encouragement to get some minimal ability to train special units
                                
    if (bCulturalVictory1 || isHolyCity(eReligion) || isCapital())
                                {
                                    
    iValue += (iNumCitiesInArea);
                                }
                                
                                if (
    bCulturalVictory2 && GC.getUnitInfo((UnitTypes)iI).getReligionSpreads(eReligion))
                                {
                                    
    //this gives a very large extra value if the religion is (nearly) unique
                                    //to no extra value for a fully spread religion.
                                    //I'm torn between huge boost and enough to bias towards the best monastery type.
                                    
    int iReligionCount GET_PLAYER(getOwnerINLINE()).getHasReligionCount(eReligion);
                                    
    iValue += (100 * (iNumCities iReligionCount)) / (iNumCities * (iReligionCount 1));
                                }
                            }
                        }
                    }
                    
                    
    // is this building needed to build other buildings?
                    
    for (iI 0iI GC.getNumBuildingInfos(); iI++)
                    {
                        
    int iPrereqBuildings kOwner.getBuildingClassPrereqBuilding(((BuildingTypesiI), eBuildingClass);

                        
    // if we need some of us to build iI building, and we dont need more than we have cities
                        
    if (iPrereqBuildings && iPrereqBuildings <= iNumCities)
                        {
                            
    // do we need more than what we are currently building?
                            
    if (iPrereqBuildings kOwner.getBuildingClassCountPlusMaking(eBuildingClass))
                            {
                                
    iValue += (iNumCities 3);

                                if (
    bCulturalVictory1)
                                {
                                    
    BuildingTypes eLoopBuilding = (BuildingTypesiI;
                                    
    CvBuildingInfokLoopBuilding GC.getBuildingInfo(eLoopBuilding);
                                    
    int iLoopBuildingCultureModifier kLoopBuilding.getCommerceModifier(COMMERCE_CULTURE);
                                    if (
    iLoopBuildingCultureModifier 0)
                                    {
                                        
    int iLoopBuildingsBuilt kOwner.getBuildingClassCount((BuildingClassTypeskLoopBuilding.getBuildingClassType());
                                        
                                        
    // if we have less than the number needed in culture cities
                                        //        OR we are one of the top cities and we do not have the building
                                        
    if (iLoopBuildingsBuilt iCulturalVictoryNumCultureCities || 
                                            (
    iCultureRank <= iCulturalVictoryNumCultureCities && == getNumBuilding(eLoopBuilding)))
                                        {
                                            
    iValue += iLoopBuildingCultureModifier;

                                            if (
    bCulturalVictory3)
                                            {
                                                
    iValue += iLoopBuildingCultureModifier 2;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    
                    for (
    int iI 0iI GC.getNumVoteSourceInfos(); ++iI)
                    {
                        if (
    kBuilding.getVoteSourceType() == iI)
                        {
                            if (
    kBuilding.isStateReligion())
                            {
                                
    int iShareReligionCount 0;
                                
    int iPlayerCount 0;
                                for (
    int iPlayer 0iPlayer MAX_PLAYERSiPlayer++)
                                {
                                    
    CvPlayerAIkLoopPlayer GET_PLAYER((PlayerTypes)iPlayer);
                                    if ((
    iPlayer != getOwner()) && kLoopPlayer.isAlive())
                                    {
                                        
    iPlayerCount++;
                                        if (
    GET_PLAYER(getOwnerINLINE()).getStateReligion() == kLoopPlayer.getStateReligion())
                                        {
                                            
    iShareReligionCount++;                                        
                                        }
                                    }
                                }
                                
    iValue += (200 * (iShareReligionCount)) / (iPlayerCount);
                            }
                            else
                            {
                                
    iValue += 100;
                            }
                        }
                    }

                }

                if (
    iPass 0)
                {
                    for (
    iI 0iI NUM_YIELD_TYPESiI++)
                    {
                        
    iTempValue 0;

                        
    iValue += ((kBuilding.getTradeRouteModifier() * getTradeYield((YieldTypes)iI)) / 12);
                        if (
    bForeignTrade)
                        {
                            
    iValue += ((kBuilding.getForeignTradeRouteModifier() * getTradeYield((YieldTypes)iI)) / 12);
                        }

                        if (
    iFoodDifference 0)
                        {
                            
    iValue += kBuilding.getFoodKept() / 2;
                        }

                        if (
    kBuilding.getSeaPlotYieldChange(iI) > 0)
                        {
                            
    iTempValue += kBuilding.getSeaPlotYieldChange(iI) * AI_buildingSpecialYieldChangeValue(eBuilding, (YieldTypes)iI);
                        }
                        if (
    kBuilding.getRiverPlotYieldChange(iI) > 0)
                        {
                            
    iTempValue += (kBuilding.getRiverPlotYieldChange(iI) * countNumRiverPlots() * 4);
                        }
                        
    iTempValue += (kBuilding.getGlobalSeaPlotYieldChange(iI) * kOwner.countNumCoastalCities() * 8);
                        
    iTempValue += (kBuilding.getYieldChange(iI) * 6);
                        
    iTempValue += ((kBuilding.getYieldModifier(iI) * getBaseYieldRate((YieldTypes)iI)) / 10);
                        
    iTempValue += ((kBuilding.getPowerYieldModifier(iI) * getBaseYieldRate((YieldTypes)iI)) / ((bProvidesPower || isPower()) ? 12 15));
                        
    iTempValue += ((kBuilding.getAreaYieldModifier(iI) * iNumCitiesInArea) / 3);
                        
    iTempValue += ((kBuilding.getGlobalYieldModifier(iI) * iNumCities) / 3);

                        if (
    bProvidesPower && !isPower())
                        {
                            
    iTempValue += ((getPowerYieldRateModifier((YieldTypes)iI) * getBaseYieldRate((YieldTypes)iI)) / 12);
                        }

                        for (
    iJ 0iJ GC.getNumSpecialistInfos(); iJ++)
                        {
                            
    iTempValue += ((kBuilding.getSpecialistYieldChange(iJiI) * kOwner.getTotalPopulation()) / 5);
                        }

                        for (
    iJ 0iJ GC.getNumBonusInfos(); iJ++)
                        {
                            if (
    hasBonus((BonusTypes)iJ))
                            {
                                
    iTempValue += ((kBuilding.getBonusYieldModifier(iJiI) * getBaseYieldRate((YieldTypes)iI)) / 12);
                            }
                        }
                        
                        if (
    iTempValue != 0)
                        {
                            if (
    bFinancialTrouble && iI == YIELD_COMMERCE)
                            {
                                
    iTempValue *= 2;
                            }

                            
    iTempValue *= kOwner.AI_yieldWeight((YieldTypes)iI);
                            
    iTempValue /= 100;
                            
                            if (
    aiYieldRank[iI] == MAX_INT)
                            {
                                
    aiYieldRank[iI] = findBaseYieldRateRank((YieldTypesiI);
                            }

                            
    // if this is a limited wonder, and we are not one of the top 4 in this category, subtract the value
                            // we do _not_ want to build this here (unless the value was small anyway)
                            
    if (bIsLimitedWonder && (aiYieldRank[iI] > (iLimitedWonderLimit)))
                            {
                                
    iTempValue *= -1;
                            }

                            
    iValue += iTempValue;
                        }
                    }
                }
                else
                {
                    if (
    iFocusFlags BUILDINGFOCUS_FOOD)
                    {

                        
    iValue += kBuilding.getFoodKept();

                        if (
    kBuilding.getSeaPlotYieldChange(YIELD_FOOD) > 0)
                        {
                            
                            
    iTempValue kBuilding.getSeaPlotYieldChange(YIELD_FOOD) * AI_buildingSpecialYieldChangeValue(eBuildingYIELD_FOOD);
                            if ((
    iTempValue 8) && (getPopulation() > 3))
                            {
                                
    // don't bother
                            
    }
                            else
                            {
                                
    iValue += ((iTempValue 4) / std::max(2iFoodDifference));
                            }
                        }

                        if (
    kBuilding.getRiverPlotYieldChange(YIELD_FOOD) > 0)
                        {
                            
    iValue += (kBuilding.getRiverPlotYieldChange(YIELD_FOOD) * countNumRiverPlots() * 4);
                        }
                    }

                    if (
    iFocusFlags BUILDINGFOCUS_PRODUCTION)
                    {
                        
    iTempValue = ((kBuilding.getYieldModifier(YIELD_PRODUCTION) * getBaseYieldRate(YIELD_PRODUCTION)) / 20);
                        
    iTempValue += ((kBuilding.getPowerYieldModifier(YIELD_PRODUCTION) * getBaseYieldRate(YIELD_PRODUCTION)) / ((bProvidesPower || isPower()) ? 24 30));
                        if (
    kBuilding.getSeaPlotYieldChange(YIELD_PRODUCTION) > 0)
                        {
                            
    int iNumWaterPlots countNumWaterPlots();
                            if (!
    bIsLimitedWonder || (iNumWaterPlots NUM_CITY_PLOTS 2))
                            {
                                
    iTempValue += kBuilding.getSeaPlotYieldChange(YIELD_PRODUCTION) * iNumWaterPlots;
                            }
                        }
                        if (
    kBuilding.getRiverPlotYieldChange(YIELD_PRODUCTION) > 0)
                        {
                            
    iTempValue += (kBuilding.getRiverPlotYieldChange(YIELD_PRODUCTION) * countNumRiverPlots() * 4);
                        }
                        if (
    bProvidesPower && !isPower())
                        {
                            
    iTempValue += ((getPowerYieldRateModifier(YIELD_PRODUCTION) * getBaseYieldRate(YIELD_PRODUCTION)) / 12);
                        }
                        
                        
    // if this is a limited wonder, and we are not one of the top 4 in this category, subtract the value
                        // we do _not_ want to build this here (unless the value was small anyway)
                        
    if (bIsLimitedWonder && (aiYieldRank[YIELD_PRODUCTION] > (iLimitedWonderLimit)))
                        {
                            
    iTempValue *= -1;
                        }

                        
    iValue += iTempValue;
                    }

                    if (
    iFocusFlags BUILDINGFOCUS_GOLD)
                    {
                        
    iTempValue = ((kBuilding.getYieldModifier(YIELD_COMMERCE) * getBaseYieldRate(YIELD_COMMERCE)));
                        
    iTempValue *= kOwner.getCommercePercent(COMMERCE_GOLD);
                        
                        if (
    bFinancialTrouble)
                        {
                            
    iTempValue *= 2;
                        }
                        
                        
    iTempValue /= 3000;
                        
                        if (
    MAX_INT == aiCommerceRank[COMMERCE_GOLD])
                        {
                            
    aiCommerceRank[COMMERCE_GOLD] = findCommerceRateRank(COMMERCE_GOLD);
                        }

                        
    // if this is a limited wonder, and we are not one of the top 4 in this category, subtract the value
                        // we do _not_ want to build this here (unless the value was small anyway)
                        
    if (bIsLimitedWonder && (aiCommerceRank[COMMERCE_GOLD] > (iLimitedWonderLimit)))
                        {
                            
    iTempValue *= -1;
                        }

                        
    iValue += iTempValue;
                    }
                }

                if (
    iPass 0)
                {
                    for (
    iI 0iI NUM_COMMERCE_TYPESiI++)
                    {
                        
    iTempValue 0;

                        
    iTempValue += (kBuilding.getCommerceChange(iI) * 4);
                        
    iTempValue += (kBuilding.getObsoleteSafeCommerceChange(iI) * 4);
                        
    iTempValue *= 100 kBuilding.getCommerceModifier(iI);
                        
    iTempValue /= 100;
                        
                        if ((
    CommerceTypes)iI == COMMERCE_CULTURE)
                        {
                            if (
    bCulturalVictory1)
                            {
                                
    iTempValue *= 2;                            
                            }
                        }

                        if (
    kBuilding.getCommerceChangeDoubleTime(iI) > 0)
                        {
                            if ((
    kBuilding.getCommerceChange(iI) > 0) || (kBuilding.getObsoleteSafeCommerceChange(iI) > 0))
                            {
                                
    iTempValue += (1000 kBuilding.getCommerceChangeDoubleTime(iI));
                            }
                        }
                        
                        
    // add value for a commerce modifier
                        
    int iCommerceModifier kBuilding.getCommerceModifier(iI);
                        
    int iBaseCommerceRate getBaseCommerceRate((CommerceTypesiI);
                        
    int iCommerceMultiplierValue iCommerceModifier iBaseCommerceRate;
                        if (((
    CommerceTypesiI) == COMMERCE_CULTURE && iCommerceModifier != 0)
                        {
                            if (
    bCulturalVictory1)
                            {                            
                                
    // if this is one of our top culture cities, then we want to build this here first!
                                
    if (iCultureRank <= iCulturalVictoryNumCultureCities)
                                {                            
                                    
    iCommerceMultiplierValue /= 8;                            
                                    
                                    
    // if we at culture level 3, then these need to get built asap
                                    
    if (bCulturalVictory3)
                                    {
                                        
    // its most important to build in the lowest rate city, but important everywhere
                                        
    iCommerceMultiplierValue += std::max(100500 iBaseCommerceRate) * iCommerceModifier;                            
                                    }
                                }
                                else
                                {
                                    
    int iCountBuilt kOwner.getBuildingClassCountPlusMaking(eBuildingClass);

                                    
    // do we have enough buildings to build extras?
                                    
    bool bHaveEnough true;

                                    
    // if its limited and the limit is less than the number we need in culture cities, do not build here
                                    
    if (bIsLimitedWonder && (iLimitedWonderLimit <= iCulturalVictoryNumCultureCities))
                                    {
                                        
    bHaveEnough false;
                                    }

                                    for (
    iJ 0bHaveEnough && iJ GC.getNumBuildingClassInfos(); iJ++)
                                    {
                                        
    // count excess the number of prereq buildings which do not have this building built for yet
                                        
    int iPrereqBuildings kOwner.getBuildingClassPrereqBuilding(eBuilding, (BuildingClassTypesiJ, -iCountBuilt);
                                        
                                        
    // do we not have enough built (do not count ones in progress)
                                        
    if (iPrereqBuildings && kOwner.getBuildingClassCount((BuildingClassTypesiJ) <  iPrereqBuildings)
                                        {
                                            
    bHaveEnough false;
                                        }
                                    }

                                    
    // if we have enough and our rank is close to the top, then possibly build here too
                                    
    if (bHaveEnough && (iCultureRank iCulturalVictoryNumCultureCities) <= 3)
                                    {
                                        
    iCommerceMultiplierValue /= 12;
                                    }
                                    
    // otherwise, we really do not want to build this here
                                    
    else
                                    {
                                        
    iCommerceMultiplierValue /= 30;
                                    }
                                }
                            }
                            else
                            {
                                
    iCommerceMultiplierValue /= 15;

                                
    // increase priority if we need culture oppressed city
                                
    iCommerceMultiplierValue *= (100 calculateCulturePercent(getOwnerINLINE()));
                            }
                        }
                        else
                        {
                             
    iCommerceMultiplierValue /= 15;
                        }
                        
    iTempValue += iCommerceMultiplierValue;

                        
    iTempValue += ((kBuilding.getGlobalCommerceModifier(iI) * iNumCities) / 4);
                        
    iTempValue += ((kBuilding.getSpecialistExtraCommerce(iI) * kOwner.getTotalPopulation()) / 3);

                        if (
    eStateReligion != NO_RELIGION)
                        {
                            
    iTempValue += (kBuilding.getStateReligionCommerce(iI) * kOwner.getHasReligionCount(eStateReligion) * 3);
                        }

                        if (
    kBuilding.getGlobalReligionCommerce() != NO_RELIGION)
                        {
                            
    iTempValue += (GC.getReligionInfo((ReligionTypes)(kBuilding.getGlobalReligionCommerce())).getGlobalReligionCommerce(iI) * GC.getGameINLINE().countReligionLevels((ReligionTypes)(kBuilding.getGlobalReligionCommerce())) * 2);
                            if (
    eStateReligion == (ReligionTypes)(kBuilding.getGlobalReligionCommerce()))
                            {
                                
    iTempValue += 10;
                            }
                        }

                        
    CorporationTypes eCorporation = (CorporationTypes)kBuilding.getFoundsCorporation();
                        
    int iCorpValue 0;
                        if (
    NO_CORPORATION != eCorporation)
                        {
                            
    iCorpValue kOwner.AI_corporationValue(eCorporationthis);
                            
                            for (
    int iCorp 0iCorp GC.getNumCorporationInfos(); iCorp++)
                            {
                                if (
    iCorp != eCorporation)
                                {
                                    if (
    kOwner.hasHeadquarters((CorporationTypes)iCorp))
                                    {
                                        if (
    GC.getGame().isCompetingCorporation(eCorporation, (CorporationTypes)iCorp))
                                        {
                                            if (
    kOwner.AI_corporationValue((CorporationTypes)iCorpthis) > iCorpValue)
                                            {
                                                
    iCorpValue = -1;
                                                break;                                            
                                            }
                                            else
                                            {
                                                if (!
    isHasCorporation((CorporationTypes)iCorp))
                                                {
                                                    
    iCorpValue = -1;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            
                            
    iTempValue += iCorpValue 100;
                        }
                        
                        if (
    iCorpValue >= 0)//Don't build if it'll hurt us.
                        
    {
                            if (
    kBuilding.getGlobalCorporationCommerce() != NO_CORPORATION)
                            {
                                
    int iGoldValue = (GC.getCorporationInfo((CorporationTypes)(kBuilding.getGlobalCorporationCommerce())).getHeadquarterCommerce(iI) * GC.getGameINLINE().countCorporationLevels((CorporationTypes)(kBuilding.getGlobalCorporationCommerce())) * 2);
                                
                                
    iGoldValue += GC.getCorporationInfo((CorporationTypes)(kBuilding.getGlobalCorporationCommerce())).getHeadquarterCommerce(iI);
                                if (
    iGoldValue 0)
                                {
                                    
    iGoldValue += + (iNumCities 4); 
                                    
    iGoldValue += std::min(iGoldValuegetBuildingCommerce(COMMERCE_GOLD) / 2) / 2;                            
                                }
                                
    iGoldValue *= 2;
                                
    iGoldValue *= getTotalCommerceRateModifier(COMMERCE_GOLD);
                                
    iGoldValue *= std::max(50getTotalCommerceRateModifier(COMMERCE_GOLD) - 150);
                                
    iGoldValue /= 5000;
                                
    iCorpValue += iGoldValue;
                            }
                        }
                        
                        if (
    iCorpValue 0)
                        {
                            if (
    kOwner.isNoCorporations())
                            {
                                
    iCorpValue /= 2;
                            }
                            
    iValue += iCorpValue;
                        }

                        if (
    kBuilding.isCommerceFlexible(iI))
                        {
                            if (!(
    kOwner.isCommerceFlexible((CommerceTypes)iI)))
                            {
                                
    iTempValue += 40;
                            }
                        }

                        if (
    kBuilding.isCommerceChangeOriginalOwner(iI))
                        {
                            if ((
    kBuilding.getCommerceChange(iI) > 0) || (kBuilding.getObsoleteSafeCommerceChange(iI) > 0))
                            {
                                
    iTempValue++;
                            }
                        }
                        
                        if (
    iTempValue != 0)
                        {
                            if (
    bFinancialTrouble && iI == COMMERCE_GOLD)
                            {
                                
    iTempValue *= 2;
                            }

                            
    iTempValue *= kOwner.AI_commerceWeight(((CommerceTypes)iI), this);
                            
    iTempValue = (iTempValue 99) / 100;

                            
    // if this is a limited wonder, and we are not one of the top 4 in this category, subtract the value
                            // we do _not_ want to build this here (unless the value was small anyway)
                            
    if (MAX_INT == aiCommerceRank[iI])
                            {
                                
    aiCommerceRank[iI] = findCommerceRateRank((CommerceTypesiI);
                            }
                            if (
    bIsLimitedWonder && ((aiCommerceRank[iI] > (iLimitedWonderLimit)))
                                || (
    bCulturalVictory1 && (iI == COMMERCE_CULTURE) && (aiCommerceRank[iI] == 1)))
                            {
                                
    iTempValue *= -1;

                                
    // for culture, just set it to zero, not negative, just about every wonder gives culture
                                
    if (iI == COMMERCE_CULTURE)
                                {
                                    
    iTempValue 0;
                                }
                            }
                            
    iValue += iTempValue;
                        }
                    }

                    for (
    iI 0iI GC.getNumReligionInfos(); iI++)
                    {
                        if (
    kBuilding.getReligionChange(iI) > 0)
                        {
                            if (
    GET_TEAM(getTeam()).hasHolyCity((ReligionTypes)iI))
                            {
                                
    iValue += (kBuilding.getReligionChange(iI) * ((eStateReligion == iI) ? 10 1));
                            }
                        }
                    }

                    if (
    NO_VOTESOURCE != kBuilding.getVoteSourceType())
                    {
                        
    iValue += 100;
                    }
                }
                else
                {
                    if (
    iFocusFlags BUILDINGFOCUS_GOLD)
                    {
                        
    iTempValue = ((kBuilding.getCommerceModifier(COMMERCE_GOLD) * getBaseCommerceRate(COMMERCE_GOLD)) / 40);
                        
                        if (
    iTempValue != 0)
                        {
                            if (
    bFinancialTrouble)
                            {
                                
    iTempValue *= 2;
                            }
                            
                            if (
    MAX_INT == aiCommerceRank[COMMERCE_GOLD])
                            {
                                
    aiCommerceRank[COMMERCE_GOLD] = findCommerceRateRank(COMMERCE_GOLD);
                            }

                            
    // if this is a limited wonder, and we are not one of the top 4 in this category, subtract the value
                            // we do _not_ want to build this here (unless the value was small anyway)
                            
    if (bIsLimitedWonder && (aiCommerceRank[COMMERCE_GOLD] > (iLimitedWonderLimit)))
                            {
                                
    iTempValue *= -1;
                            }
                            
    iValue += iTempValue;
                        }
                        
                        
    iValue += (kBuilding.getCommerceChange(COMMERCE_GOLD) * 4);
                        
    iValue += (kBuilding.getObsoleteSafeCommerceChange(COMMERCE_GOLD) * 4);
                    }

                    if (
    iFocusFlags BUILDINGFOCUS_RESEARCH)
                    {
                        
    iTempValue = ((kBuilding.getCommerceModifier(COMMERCE_RESEARCH) * getBaseCommerceRate(COMMERCE_RESEARCH)) / 40);
                        
                        if (
    iTempValue != 0)
                        {
                            if (
    MAX_INT == aiCommerceRank[COMMERCE_RESEARCH])
                            {
                                
    aiCommerceRank[COMMERCE_RESEARCH] = findCommerceRateRank(COMMERCE_RESEARCH);
                            }

                            
    // if this is a limited wonder, and we are not one of the top 4 in this category, subtract the value
                            // we do _not_ want to build this here (unless the value was small anyway)
                            
    if (bIsLimitedWonder && (aiCommerceRank[COMMERCE_RESEARCH] > (iLimitedWonderLimit)))
                            {
                                
    iTempValue *= -1;
                            }

                            
    iValue += iTempValue;
                        }
                        
    iValue += (kBuilding.getCommerceChange(COMMERCE_RESEARCH) * 4);
                        
    iValue += (kBuilding.getObsoleteSafeCommerceChange(COMMERCE_RESEARCH) * 4);
                    }

                    if (
    iFocusFlags BUILDINGFOCUS_CULTURE)
                    {
                        
    iTempValue = (kBuilding.getCommerceChange(COMMERCE_CULTURE) * 3);
                        
    iTempValue += (kBuilding.getObsoleteSafeCommerceChange(COMMERCE_CULTURE) * 3);
                        if (
    GC.getGameINLINE().isOption(GAMEOPTION_NO_ESPIONAGE))
                        {
                            
    iTempValue += (kBuilding.getCommerceChange(COMMERCE_ESPIONAGE) * 3);
                            
    iTempValue += (kBuilding.getObsoleteSafeCommerceChange(COMMERCE_ESPIONAGE) * 3);
                        }

                        if ((
    getCommerceRate(COMMERCE_CULTURE) == 0) && (AI_calculateTargetCulturePerTurn() == 1))
                        {
                            if (
    iTempValue >= 3)
                            {
                                
    iTempValue += 7;
                            }                        
                        }
                        
                        if (
    iTempValue != 0)
                        {
                            if (
    MAX_INT == aiCommerceRank[COMMERCE_CULTURE])
                            {
                                
    aiCommerceRank[COMMERCE_CULTURE] = findCommerceRateRank(COMMERCE_CULTURE);
                            }

                            
    // if this is a limited wonder, and we are not one of the top 4 in this category, 
                            // do not count the culture value
                            // we probably do not want to build this here (but we might)
                            
    if (bIsLimitedWonder && (aiCommerceRank[COMMERCE_CULTURE] > (iLimitedWonderLimit)))
                            {
                                
    iTempValue  0;
                            }
                            
    iValue += iTempValue;
                        }
                        
                        
    iValue += ((kBuilding.getCommerceModifier(COMMERCE_CULTURE) * getBaseCommerceRate(COMMERCE_CULTURE)) / 15);
                        if (
    GC.getGameINLINE().isOption(GAMEOPTION_NO_ESPIONAGE))
                        {
                            
    iValue += ((kBuilding.getCommerceModifier(COMMERCE_ESPIONAGE) * getBaseCommerceRate(COMMERCE_ESPIONAGE)) / 15);
                        }
                    }
                    
                    if (
    iFocusFlags BUILDINGFOCUS_BIGCULTURE)
                    {
                        
    iTempValue = (kBuilding.getCommerceModifier(COMMERCE_CULTURE) / 5);
                        if (
    iTempValue != 0)
                        {
                            if (
    MAX_INT == aiCommerceRank[COMMERCE_CULTURE])
                            {
                                
    aiCommerceRank[COMMERCE_CULTURE] = findCommerceRateRank(COMMERCE_CULTURE);
                            }

                            
    // if this is a limited wonder, and we are not one of the top 4 in this category, 
                            // do not count the culture value
                            // we probably do not want to build this here (but we might)
                            
    if (bIsLimitedWonder && (aiCommerceRank[COMMERCE_CULTURE] > (iLimitedWonderLimit)))
                            {
                                
    iTempValue  0;
                            }

                            
    iValue += iTempValue;
                        }
                    }
                    
                    if (
    iFocusFlags BUILDINGFOCUS_ESPIONAGE || (GC.getGameINLINE().isOption(GAMEOPTION_NO_ESPIONAGE) && (iFocusFlags BUILDINGFOCUS_CULTURE)))
                    {
                        
    iTempValue = ((kBuilding.getCommerceModifier(COMMERCE_ESPIONAGE) * getBaseCommerceRate(COMMERCE_ESPIONAGE)) / 60);
                        
                        if (
    iTempValue != 0)
                        {
                            if (
    MAX_INT == aiCommerceRank[COMMERCE_ESPIONAGE])
                            {
                                
    aiCommerceRank[COMMERCE_ESPIONAGE] = findCommerceRateRank(COMMERCE_ESPIONAGE);
                            }

                            
    // if this is a limited wonder, and we are not one of the top 4 in this category, subtract the value
                            // we do _not_ want to build this here (unless the value was small anyway)
                            
    if (bIsLimitedWonder && (aiCommerceRank[COMMERCE_ESPIONAGE] > (iLimitedWonderLimit)))
                            {
                                
    iTempValue *= -1;
                            }

                            
    iValue += iTempValue;
                        }
                        
    iTempValue = (kBuilding.getCommerceChange(COMMERCE_ESPIONAGE) * 3);
                        
    iTempValue += (kBuilding.getObsoleteSafeCommerceChange(COMMERCE_ESPIONAGE) * 3);
                        
    iTempValue *= 100 kBuilding.getCommerceModifier(COMMERCE_ESPIONAGE);
                        
    iValue += iTempValue 100;
                    }
                }
                
                if ((
    iThreshold 0) && (iPass == 0))
                {
                    if (
    iValue iThreshold)
                    {
                        
    iValue 0;
                    }
                }

                if (
    iPass && !isHuman())
                {
                    
    iValue += kBuilding.getAIWeight();
                    if (
    iValue 0)
                    {
                        for (
    iI 0iI GC.getNumFlavorTypes(); iI++)
                        {
                            
    iValue += (kOwner.AI_getFlavorValue((FlavorTypes)iI) * kBuilding.getFlavorValue(iI));
                        }
                    }
                }
            }
        } 

  14. #914
    Registrierter Benutzer Avatar von Thorgal
    Registriert seit
    06.08.09
    Beiträge
    5.238
    Ich hab mal einen Blick in die Util von FFH geworfen. Da wird bei AI_chooseProduction mit Values gearbeitet. Allerdings versteh ich davon so gut wie nichts und hab auch keinen Plan, ob das dann nur für die FFH-dll gilt.

    Achtung Spoiler:
    PHP-Code:
            def AI_chooseProduction(self,argsList):
                    
    pCity argsList[0]
                    
    ePlayer pCity.getOwner()
                    
    pPlayer gc.getPlayer(ePlayer)
                    
    player PyPlayer(ePlayer)
                    
    civtype pPlayer.getCivilizationType()
                    
    infoCiv gc.getCivilizationInfo(civtype)
                    
    eTeam gc.getTeam(pPlayer.getTeam())
                    
    pPlot pCity.plot()

    #Barbarian Cities have their own Function
                    
    if pCity.isBarbarian():
                            if (
    cf.BarbCityProduction(pCity)==0):
                                    return 
    False
                            
    else:
                                    return 
    True

    #Automated Cities use another Function
                    
    if pPlayer.isHuman():
                            return 
    False

    #Choose Nothing in Disorder (can lead to weird results)
                    
    if pCity.isDisorder():
                            return 
    False

    #Var initialization
                    #Used for City Specialization
                    
    iPatrolSpec=0
                    iDefenseSpec
    =0

                    
    #Used to decide if the Best Item is good enough
                    
    diffmod 0.8
                    iBuildingthres
    =0
                    iBuildingthres
    +=1000
                    iBuildingthres
    +=-13*pCity.getCurrentProductionDifference(False,False)
                    
    iBuildingthres=(iBuildingthres)*diffmod
                    iBuildingthres
    =-pPlayer.countGroupFlagUnits(7)*50

    #make sure no item is listed twice!
    #Use BuildingClass if Possible
                    
    sProd = ['PROJECT_BLOOD_OF_THE_PHOENIX','PROJECT_GENESIS','PROJECT_RITES_OF_OGHMA','PROJECT_NATURES_REVOLT']
                    
    iProdType=[3,3,3,3]
                    
    sProd sProd +['PROJECT_ELEGY_OF_THE_SHEAIM','PROJECT_HALLOWING_OF_THE_ELOHIM','PROJECT_BIRTHRIGHT_REGAINED','PROJECT_PURGE_THE_UNFAITHFUL']
                    
    iProdType=iProdType+[3,3,3,3]
                    
    sProd sProd +['PROJECT_SAMHAIN','PROJECT_THE_WHITE_HAND','PROJECT_THE_DEEPENING','PROJECT_STIR_FROM_SLUMBER']
                    
    iProdType=iProdType+[3,3,3,3]
                    
    sProd sProd +['PROJECT_THE_DRAW','PROJECT_ASCENSION','PROJECT_PACT_OF_THE_NILHORN']
                    
    iProdType=iProdType+[3,3,3]

                    
    sProd sProd +['UNITCLASS_SETTLER','UNITCLASS_WORKER','UNITCLASS_WARRIOR','UNITCLASS_WORKBOAT','UNITCLASS_SCOUT']
                    
    iProdType=iProdType+[2,2,2,2,2]
                    
    sProd sProd + ['UNITCLASS_ADEPT','UNITCLASS_AXEMAN','UNITCLASS_HUNTER','UNITCLASS_ARCHER','UNITCLASS_HORSEMAN','UNITCLASS_HORSE_ARCHER']
                    
    iProdType=iProdType+[2,2,2,2,2,2]
                    
    sProd sProd + ['UNITCLASS_FREAK','UNITCLASS_CATAPULT','UNITCLASS_CANNON','UNITCLASS_MONK','UNITCLASS_GRIGORI_MEDIC']
                    
    iProdType=iProdType+[2,2,2,2,2]
                    
    sProd sProd + ['UNITCLASS_PRIEST_OF_THE_VEIL','UNITCLASS_PRIEST_OF_THE_ORDER','UNITCLASS_PRIEST_OF_KILMORPH','UNITCLASS_PRIEST_OF_LEAVES','UNITCLASS_PRIEST_OF_THE_EMPYREAN','UNITCLASS_PRIEST_OF_THE_OVERLORDS']
                    
    iProdType=iProdType+[2,2,2,2,2,2]
                    
    sProd sProd + ['UNITCLASS_DISCIPLE_THE_ASHEN_VEIL','UNITCLASS_DISCIPLE_THE_ORDER','UNITCLASS_DISCIPLE_RUNES_OF_KILMORPH','UNITCLASS_DISCIPLE_FELLOWSHIP_OF_LEAVES','UNITCLASS_DISCIPLE_EMPYREAN','UNITCLASS_DISCIPLE_OCTOPUS_OVERLORDS']
                    
    iProdType=iProdType+[2,2,2,2,2,2]
                    
    sProd sProd + ['UNITCLASS_CHAMPION','UNITCLASS_CHARIOT','UNITCLASS_RANGER','UNITCLASS_LONGBOWMAN','UNITCLASS_ASSASSIN']
                    
    iProdType=iProdType+[2,2,2,2,2]
                    
    sProd sProd + ['UNITCLASS_GOVANNON','UNITCLASS_LOKI','UNITCLASS_DONAL','UNITCLASS_RANTINE','UNITCLASS_LOSHA']
                    
    iProdType=iProdType+[2,2,2,2,2]
                    
    sProd sProd + ['UNITCLASS_GALLEY','UNITCLASS_CARAVEL','UNITCLASS_EXPLORER','UNITCLASS_QUEEN_OF_THE_LINE']
                    
    iProdType=iProdType+[2,2,2,2]
                    
    sProd sProd + ['UNITCLASS_TRIREME','UNITCLASS_FRIGATE','UNITCLASS_MAN_O_WAR']
                    
    iProdType=iProdType+[2,2,2]

                    
    sProd sProd + ['BUILDINGCLASS_ALCHEMY_LAB','BUILDINGCLASS_AQUEDUCT','BUILDINGCLASS_TRAINING_YARD','BUILDINGCLASS_BASILICA','BUILDINGCLASS_BREWERY']
                    
    iProdType=iProdType+[1,1,1,1,1]
                    
    sProd sProd + ['BUILDINGCLASS_CARNIVAL','BUILDINGCLASS_COURTHOUSE','BUILDINGCLASS_DUNGEON','BUILDINGCLASS_ELDER_COUNCIL','BUILDINGCLASS_ARCHERY_RANGE','BUILDINGCLASS_FORGE','BUILDINGCLASS_GAMBLING_HOUSE','BUILDINGCLASS_GRANARY']
                    
    iProdType=iProdType+[1,1,1,1,1,1,1,1]
                    
    sProd sProd + ['BUILDINGCLASS_GROVE','BUILDINGCLASS_HARBOR','BUILDINGCLASS_HERBALIST','BUILDINGCLASS_HUNTING_LODGE','BUILDINGCLASS_INFIRMARY','BUILDINGCLASS_INN','BUILDINGCLASS_LIBRARY','BUILDINGCLASS_LIGHTHOUSE','BUILDINGCLASS_MACHINISTS_SHOP']
                    
    iProdType=iProdType+[1,1,1,1,1,1,1,1,1]
                    
    sProd sProd + ['BUILDINGCLASS_MAGE_GUILD','BUILDINGCLASS_MARKET','BUILDINGCLASS_MONEYCHANGER','BUILDINGCLASS_MONUMENT','BUILDINGCLASS_PAGAN_TEMPLE','BUILDINGCLASS_PALISADE']
                    
    iProdType=iProdType+[1,1,1,1,1,1]
                    
    sProd sProd + ['BUILDINGCLASS_PUBLIC_BATHS','BUILDINGCLASS_SIEGE_WORKSHOP','BUILDINGCLASS_SMOKEHOUSE','BUILDINGCLASS_STABLE','BUILDINGCLASS_TAX_OFFICE','BUILDINGCLASS_TAVERN']
                    
    iProdType=iProdType+[1,1,1,1,1,1]
                    
    sProd sProd + ['BUILDINGCLASS_TEMPLE_OF_KILMORPH','BUILDINGCLASS_TEMPLE_OF_LEAVES','BUILDINGCLASS_TEMPLE_OF_THE_EMPYREAN','BUILDINGCLASS_TEMPLE_OF_THE_OVERLORDS','BUILDINGCLASS_TEMPLE_OF_THE_VEIL','BUILDINGCLASS_TEMPLE_OF_THE_ORDER']
                    
    iProdType=iProdType+[1,1,1,1,1,1]
                    
    sProd sProd + ['BUILDINGCLASS_THEATRE','BUILDINGCLASS_WALLS']
                    
    iProdType=iProdType+[1,1]

                    
    sProd sProd + ['BUILDINGCLASS_TOWER_OF_ALTERATION','BUILDINGCLASS_TOWER_OF_DIVINATION','BUILDINGCLASS_TOWER_OF_NECROMANCY','BUILDINGCLASS_TOWER_OF_THE_ELEMENTS','BUILDINGCLASS_TOWER_OF_MASTERY','BUILDINGCLASS_ALTAR_OF_THE_LUONNOTAR_FINAL']
                    
    iProdType=iProdType+[1,1,1,1,1,1]

                    
    sProd sProd + ['BUILDINGCLASS_GUILD_OF_THE_NINE','BUILDINGCLASS_HERON_THRONE','BUILDINGCLASS_CITY_OF_A_THOUSAND_SLUMS','BUILDINGCLASS_THEATRE_OF_DREAMS','BUILDINGCLASS_PILLAR_OF_CHAINS']
                    
    iProdType=iProdType+[1,1,1,1,1]
                    
    sProd sProd + ['BUILDINGCLASS_GUILD_OF_HAMMERS','BUILDINGCLASS_GRAND_MENAGERIE','BUILDINGCLASS_MERCURIAN_GATE','BUILDINGCLASS_CELESTIAL_COMPASS','BUILDINGCLASS_RIDE_OF_THE_NINE_KINGS']
                    
    iProdType=iProdType+[1,1,1,1,1]
                    
    sProd sProd + ['BUILDINGCLASS_MOKKAS_CAULDRON','BUILDINGCLASS_SHRINE_OF_SIRONA','BUILDINGCLASS_EYES_AND_EARS_NETWORK','BUILDINGCLASS_SHRINE_OF_THE_CHAMPION','BUILDINGCLASS_AQUAE_SUCELLUS']
                    
    iProdType=iProdType+[1,1,1,1,1]
                    
    sProd sProd + ['BUILDINGCLASS_HALL_OF_KINGS','BUILDINGCLASS_GREAT_LIBRARY','BUILDINGCLASS_GREAT_LIGHTHOUSE','BUILDINGCLASS_PROPHECY_OF_RAGNAROK','BUILDINGCLASS_TEMPLE_OF_TEMPORENCE']
                    
    iProdType=iProdType+[1,1,1,1,1]
                    
    sProd sProd + ['BUILDINGCLASS_HEROIC_EPIC','BUILDINGCLASS_NATIONAL_EPIC','BUILDINGCLASS_TOWER_OF_COMPLACENCY','BUILDINGCLASS_TOWER_OF_EYES','BUILDINGCLASS_SYLIVENS_PERFECT_LYRE']
                    
    iProdType=iProdType+[1,1,1,1,1]
                    
    sProd sProd + ['BUILDINGCLASS_CROWN_OF_AKHARIEN','BUILDINGCLASS_FORBIDDEN_PALACE','BUILDINGCLASS_CATACOMB_LIBRALUS','BUILDINGCLASS_FORM_OF_THE_TITAN','BUILDINGCLASS_MINES_OF_GALDUR']
                    
    iProdType=iProdType+[1,1,1,1,1]
                    
    sProd sProd + ['BUILDINGCLASS_BAZAAR_OF_MAMMON']
                    
    iProdType=iProdType+[1]

                    
    sProd sProd + ['BUILDING_ADULARIA_CHAMBER','BUILDING_ADVENTURERS_GUILD','BUILDING_BLASTING_WORKSHOP','BUILDING_BREEDING_PIT','BUILDING_CAVE_OF_ANCESTORS','BUILDING_CHANCEL_OF_GUARDIANS','BUILDING_CITADEL_OF_LIGHT','BUILDING_COMMAND_POST']
                    
    iProdType=iProdType+[0,0,0,0,0,0,0,0]
                    
    sProd sProd + ['BUILDING_HALL_OF_MIRRORS']
                    
    iProdType=iProdType+[0]
                    
    sProd sProd + ['BUILDING_JEWELER','BUILDING_PALLENS_ENGINE','BUILDING_PLANAR_GATE','BUILDING_RELIQUARY']
                    
    iProdType=iProdType+[0,0,0,0]
                    
    sProd sProd + ['BUILDING_SMUGGLERS_PORT','BUILDING_TAILOR','BUILDING_WARRENS','BUILDING_MONUMENT']
                    
    iProdType=iProdType+[0,0,0,0]

                    
    iValue=[0]
                    for 
    i in range (len(sProd)):
                            
    iValue+=[0]

    #City needs more Protection? (values 19001-20000)
                    
    if (pCity.AI_neededPermDefense(0)>0):

                            
    iValue[sProd.index('UNITCLASS_AXEMAN')]=19500
                            iValue
    [sProd.index('UNITCLASS_ARCHER')]=20000
                            iValue
    [sProd.index('UNITCLASS_HUNTER')]=19500
                            iValue
    [sProd.index('UNITCLASS_WARRIOR')]=19002

                    
    if (pCity.AI_neededPermDefense(1)>0):

                            
    iValue[sProd.index('UNITCLASS_AXEMAN')]=20000
                            iValue
    [sProd.index('UNITCLASS_ARCHER')]=19500
                            iValue
    [sProd.index('UNITCLASS_HUNTER')]=20000
                            iValue
    [sProd.index('UNITCLASS_WARRIOR')]=19003
                            
    if pPlayer.getCivilizationType() == gc.getInfoTypeForString('CIVILIZATION_SHEAIM'):
                                    
    iValue[sProd.index('UNITCLASS_AXEMAN')]=-20000 
    usw. ewig viel für Einheiten, Gebäude, Traits, zivspezifische Sachen...
    und zum Schluß:

    PHP-Code:
                    infoCiv gc.getCivilizationInfo(civtype)
                    
    iBestBuilding=-1
                    iBestBuildingValue
    =0
                    
    for i in range(len(sProd)):
                            if 
    iValue[i]>iBestBuildingValue:
                                    if 
    iValue[i]>iBuildingthres:
                                            if 
    iProdType[i]==0:
                                                    if 
    pCity.canConstruct(gc.getInfoTypeForString(sProd[i]),True,False,False):
                                                            
    iBestBuildingValue=iValue[i]
                                                            
    iBestBuilding=i
                                            elif iProdType
    [i]==1:
                                                    
    iBuilding infoCiv.getCivilizationBuildings(gc.getInfoTypeForString(sProd[i]))
                                                    if 
    iBuilding != -1:
                                                            if 
    pCity.canConstruct(iBuilding,True,False,False):
                                                                    
    iBestBuildingValue=iValue[i]
                                                                    
    iBestBuilding=i
                                            elif iProdType
    [i]==2:
                                                    
    iUnit infoCiv.getCivilizationUnits(gc.getInfoTypeForString(sProd[i]))
                                                    if 
    iUnit != -1:
                                                            if 
    pCity.canTrain(iUnit,True,False):
                                                                    
    iBestBuildingValue=iValue[i]
                                                                    
    iBestBuilding=i
                                            elif iProdType
    [i]==3:
                                                    if 
    pCity.canCreate(gc.getInfoTypeForString(sProd[i]),True,False):
                                                            
    iBestBuildingValue=iValue[i]
                                                            
    iBestBuilding=i


    #                if ePlayer==0:
    #                CyInterface().addMessage(0,true,25,"This is City %s: Our best Building is (%s), Value (%s). Threshold is (%s)!" %(pCity.getName(),sProd[iBestBuilding],iValue[iBestBuilding],iBuildingthres),'',0,'',ColorTypes(11), pPlot.getX(), pPlot.getY(), True,True)


    #                if        pPlayer.isConquestMode():
    #                        CyInterface().addMessage(0,true,25,"This is City %s: Our best Building is (%s), Value (%s). Threshold is (%s)!" %(pCity.getName(),sProd[iBestBuilding],iValue[iBestBuilding],iBuildingthres),'',0,'',ColorTypes(11), pPlot.getX(), pPlot.getY(), True,True)
    #                if civtype == gc.getInfoTypeForString('CIVILIZATION_AMURITES'):
    #                        CyInterface().addMessage(0,true,25,"This is City %s: Our best Building is (%s), Value (%s). Threshold is (%s)!" %(pCity.getName(),sProd[iBestBuilding],iValue[iBestBuilding],iBuildingthres),'',0,'',ColorTypes(11), pPlot.getX(), pPlot.getY(), True,True)
    #                if ePlayer==0:
    #                        CyInterface().addMessage(0,true,25,"We need this many Mages: %s !" %(cf.calculateMagesNeeded(ePlayer)),'',0,'',ColorTypes(11), pPlot.getX(), pPlot.getY(), True,True)

                    
    if iBestBuilding!=-1:
                            if 
    iProdType[iBestBuilding]==0:
                                    
    pCity.pushOrder(OrderTypes.ORDER_CONSTRUCT,gc.getInfoTypeForString(sProd[iBestBuilding]),-1FalseFalseFalseFalse)
                                    return 
    1
                            elif iProdType
    [iBestBuilding]==1:
                                    
    iBuilding infoCiv.getCivilizationBuildings(gc.getInfoTypeForString(sProd[iBestBuilding]))
                                    
    pCity.pushOrder(OrderTypes.ORDER_CONSTRUCT,iBuilding,-1FalseFalseFalseFalse)
                                    return 
    1
                            elif iProdType
    [iBestBuilding]==2:
                                    
    iUnit infoCiv.getCivilizationUnits(gc.getInfoTypeForString(sProd[iBestBuilding]))
                                    
    pCity.pushOrder(OrderTypes.ORDER_TRAIN,iUnit,-1FalseFalseFalseFalse)
                                    return 
    1
                            elif iProdType
    [iBestBuilding]==3:
                                    
    pCity.pushOrder(OrderTypes.ORDER_CREATE,gc.getInfoTypeForString(sProd[iBestBuilding]),-1FalseFalseFalseFalse)
                                    return 
    1

                    
    return False 
    Pie's Antikes Europa (PAE): Genieße CIV in der Antike.

    PAE - Mythos Antike: Die Geschichte der drei furchtlosesten Herrscher des PBEM 442.

    Kingdom of Africa: Auf Abwegen im PB 73

  15. #915
    Registrierter Benutzer Avatar von Thorgal
    Registriert seit
    06.08.09
    Beiträge
    5.238
    Zitat Zitat von Flunky Beitrag anzeigen
    @BuildingValue:
    Ist das viel.

    Was mir aber auffällt, da wird oft mit Capital gearbeitet. Vielleicht erklärt das auch, warum der Palast bei uns kein Value bekommt, da der ja im Gegensatz zu BtS nicht sofort gesetzt wird.
    Pie's Antikes Europa (PAE): Genieße CIV in der Antike.

    PAE - Mythos Antike: Die Geschichte der drei furchtlosesten Herrscher des PBEM 442.

    Kingdom of Africa: Auf Abwegen im PB 73

Seite 61 von 219 ErsteErste ... 115157585960616263646571111161 ... LetzteLetzte

Berechtigungen

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