Dieser Thread soll mir dienen, schamhaft meine Wissenslücken zu offenbaren, Fragen zu äußern und - hoffentlich - die eine oder andere Antwort zu erhalten.
Dieser Thread soll mir dienen, schamhaft meine Wissenslücken zu offenbaren, Fragen zu äußern und - hoffentlich - die eine oder andere Antwort zu erhalten.
Mein erstes (aber wahrlich nicht mein einziges) Problem ist ab hier beschrieben.
Ich möchte Berge (für alle Einheitentypen/Berufe bis auf den Kühnen Pionier im Beruf Pionier) unpassierbar machen.
Koma13 hat in einer ersten Nothilfe-Aktion Pythonroutinen zur Verfügung gestellt, die den erwünschten Effekt erzielen, allerdings (weil es eine Methode "auf die Schnelle" war) ist diese Lösung noch sehr "unperformant", um es vorsichtig auszudrücken.
Das stellt keine Kritik an Koma13 dar, dem ich für seine Unterstützung sehr dankbar bin , sondern dient lediglich der Problembeschreibung!
Nach der kurzen Schilderung des Performance-Problems hat Koma13 hier weitere Lösungsansätze skizziert, auf die ich mich im folgenden beziehen möchte.
Da sind wir auf einer Linie
Natürlich wäre es schneller und bequemer für mich, wenn mir irgendeine "gute Fee" die Dinge mundgerecht servierte, aber das hilft mir dann beim nächsten Problem nicht weiter.
Allerdings frage ich mich gerade, warum ich den Event-Manager verwenden sollte, wenn ich doch gleich die Kartenskripte anpassen kann?
Ich sehe da z.B. im FaireWeather-Skript die Funktion "addFeatures()".
Wenn ich die richtig interpretiere, dann tut sie genau das, was der Name verrät, fügt nämlich die Features (in TAC: Dschungel, Wald, Buschland), Eis, Vulkan) hinzu.
Mein Ansatz wäre nun folgender:
Da das Kartenskript ja ohnehin aufgerufen und durchlaufen werden muss, lasse ich das (noch von mir zu erstellende) FEATURE_IMPASSABLE an dieser Stelle in die Karte einfügen.
Der Weg über den Event-Manager im ersten Spielzug würde m.E. einen unnötigen Rechenaufwand beinhalten und damit den Spielstart verzögern.
Ich würde die Funktion "addFeatures()" also folgendermaßen verändern:
Bin ich da auf einem richtigen Wege oder bin ich völlg vom Wege ab?Code:def addFeatures(): NiTextOut("Generating Features ...") print "Adding Features" gc = CyGlobalContext() mmap = gc.getMap() featureIce = gc.getInfoTypeForString("FEATURE_ICE") featureJungle = gc.getInfoTypeForString("FEATURE_JUNGLE") featureForest = gc.getInfoTypeForString("FEATURE_FOREST") featureLightForest = gc.getInfoTypeForString("FEATURE_LIGHT_FOREST") ## CB: neue Feature-Art IMPASSABLE einfügen featureImpassable = gc.getInfoTypeForString("FEATURE_IMPASSABLE") ## CB: Ende # neue Terrain start featureVulcano = gc.getInfoTypeForString("FEATURE_VOLCANO") # neue Terrain ende FORESTLEAFY = 0 FORESTEVERGREEN = 1 FORESTSNOWY = 2 #Ice must be created later because it is overwritten by the addEurope #function that is not exposed to python. ## CB: Auskommentierte Funktionen wg. Leserlichkeit gelöscht ## for y in range(mc.height): for x in range(mc.width): i = GetIndex(x,y) plot = mmap.plot(x,y) # CB start: FEATURE_IMPASSABLE if plot.isPeak() == TRUE plot.setFeatureType(featureImpassable,0) # CB end #forest and jungle if plot.isWater() == False and sm.terrainMap[i] != mc.DESERT and\ plot.isPeak() == False: if sm.rainFallMap[i] > sm.plainsThreshold*1.5:#jungle if sm.averageTempMap[i] > mc.JungleTemp: if sm.terrainMap[i] == mc.PLAINS: plot.setFeatureType(featureForest,FORESTLEAFY) else: plot.setFeatureType(featureJungle,0) elif sm.averageTempMap[i] > mc.ForestTemp: plot.setFeatureType(featureForest,FORESTLEAFY) elif sm.averageTempMap[i] > mc.TundraTemp: plot.setFeatureType(featureForest,FORESTEVERGREEN) elif sm.averageTempMap[i] > mc.SnowTemp: plot.setFeatureType(featureForest,FORESTSNOWY) elif sm.rainFallMap[i] > sm.desertThreshold:#forest if sm.rainFallMap[i] > PRand.random() * sm.plainsThreshold * 1.5: if sm.averageTempMap[i] > mc.ForestTemp: plot.setFeatureType(featureForest,FORESTLEAFY) elif sm.averageTempMap[i] > mc.TundraTemp: plot.setFeatureType(featureForest,FORESTEVERGREEN) elif sm.averageTempMap[i] > mc.SnowTemp * 0.8: plot.setFeatureType(featureForest,FORESTSNOWY) if plot.isPeak() == False and plot.isWater() == False: if sm.terrainMap[i] == mc.PLAINS and PRand.random() < mc.chanceForLightForest: plot.setFeatureType(featureLightForest,0) if sm.terrainMap[i] == mc.MARSH and PRand.random() < mc.chanceForTreelessMarsh: plot.setFeatureType(FeatureTypes.NO_FEATURE,0) # neue Terrain start else: if PRand.random() == 1: plot.setFeatureType(featureVulcano,0) # neue Terrain ende return
Weil du so nur eine Lösung für das FaireWeather-Skript hast, die sobald ein anderes Kartenskript oder eine Szenariokarte verwendet wird, nicht mehr funktioniert.Allerdings frage ich mich gerade, warum ich den Event-Manager verwenden sollte, wenn ich doch gleich die Kartenskripte anpassen kann?
Ich sehe da z.B. im FaireWeather-Skript die Funktion "addFeatures()".
Da fehlt ein Doppelpunkt hinter der Bedingung.Code:# CB start: FEATURE_IMPASSABLE if plot.isPeak() == TRUE plot.setFeatureType(featureImpassable,0) # CB end
Ja, das ist wahr. Ich müsste natürlich die Kartenskripte anpassen.
Danke für den Hinweis.
In einem ersten "quick and dirty"-Versuch hat es schon mal insoweit geklappt, als dass Berge nun (wenn sie denn an der Küste liegen) mit Eis bedeckt werden.
Jetzt muss ich nur noch das Feature_IMPASSABLE stricken.
Ich habe das Feature bereits in "Werewolves" hineingebastelt.
CIV4FeatureInfos:Beliebige Datei im Unterordner Text:Achtung Spoiler:CIV4ArtDefines_Feature:Achtung Spoiler:Das leere nif-Modell hatte melcher ja schon zur Verfügung gestellt. Die Buttons hänge ich dir an.Achtung Spoiler:
Erst einmal vielen Dank für deine Unterstützung!
Und dann... *seufz* ... wie soll ich sagen...
Ich habe natürlich schon wieder Probleme
Und zwar modifiziere ich (nach Einfügen aller obigen xml-Definitionen, der Buttons, der Atlas-Datei usw.) das FaireWeather-Skript.
Das habe ich ja auch vorher schon getan, um die Wirkungsweise meiner Vorstellung mit Hilfe des Features ICE grob zu überprüfen.
Dabei gab es keine Probleme.
Nun jedoch wird beim Einfügen neuer Codezeilen immer eine Verschachtelung erzeugt (als solche in Notepad++ angezeigt), die dann zu einem Syntaxfehler im Python-Interpreter führt.
Das Ende vom Lied ist, dass der Fehler vom Interpreter 5mal angezeigt wird, das "Python-module CB_Mod06b_FaireWeather.py" als nicht zu laden erklärt wird und Col nicht startet.
Entsprechende Screenshots sind unten angefügt.
Die Differenz zwischen den Zeilenangaben in der Fehlermeldung und in der Darstellung liegt darin, dass ich versucht habe, durch Einfügen/Löschen von Kommentarzeilen, weiteres Einrücken "meiner" Zeile, geringeres Einrücken, Änderung der Kommentarzeile und sonstigen Verlegenheitsversuchen, die Verschachtelung aufzuheben. Was mir nicht gelungen ist.
Hat jemand eine Idee?
Ich habe probehalber auch mal die Codierung von Notepad++ geändert (s. Screenshot), aber ohne Resultat.
asfs
Nachtrag:
Das Problem der entstehenden Verschachtelung besteht auch schon beim Original der von mir benutzten FaireWeather-Variante.
Ich kann eine neue Zeile hinter featureLightForest = gc.getInfoTypeForString("FEATURE_LIGHT_FOREST") einfügen, aber sobald die erste Tastatureingabe erfolgt, wird die Verschachtelung angelegt.
Eine weitere Einrückung nach rechts ändert daran nichts, wenn ich nach links "entrücke", dann wird in Notepad++ nur angezeigt, dass die defAddFeatures(): beendet ist.
Ich bin ratlos.
Weiterer Nachtrag:
Ich habe das "MOD" aus dem Dateinamen entfernt, was dazu führte, dass Col gestartet wird. Allerdings tauchen die Python-Fehler nun im Spielmenü auf.
Weiterhin habe ich das Skript mit Hilfe von Notepad (also nicht Notepad++) geändet - gleiches Ergebnis, d.h. Fehlermeldung im Spiel.
Ruft man diese Datei dann in Notepad++ auf, wird wieder die Verschachtelung angezeigt
Geändert von Commander Bello (18. November 2011 um 08:51 Uhr) Grund: Ergänzung
Hast du ein Python-Plugin für Notepad++ installiert ?
Schick mal einen Screenshot, wie ein Python-File bei dir in Notepad++ aussieht.
(Daran sollte man es sofort erkennen. In den neueren Notepad++ Versionen kommt das glaub ich auch mit.)
Falls das bei dir noch nicht drin ist:
Ich glaube das hier ist ganz gut.
Wenn es nicht daran liegt, hast du wahrscheinlich eher einen Fehler im Skript selber.
(Doppelpunkt vergessen oder wie du schon selber sagst eine falsche Verschachtelung oder irgendwas in der Art.)
Ohne den entsprechenden Auszug aus deinem Skript wird man dir da nur schwer helfen können.
(Was du da geschickt hast ist bei weitem nicht genug um irgendwas am Skript zu erkennen ...)
Geändert von raystuttgart (18. November 2011 um 11:57 Uhr)
Teammitgleid dieses Projekt für Colonization:
[Mod] We The People
(Nachfolgerprojekt von Religion and Revolution)
Davor Teammitgleid dieses Projekt für Colonization:
[Mod] Religion and Revolution
Vor-Vorheriges Projekt für Colonization:
[ModMod] ray's Wunschliste
Und wiederum davor Teammitglied von:
[Mod] The Authentic Colonization (TAC)
Wie gesagt, in neuen Versionen von Notepad++ kommt ein Python Plugin glaub ich auch mit.
Das ist dann normalerweise auch aktiviert.
Kann man übrigens auch über den Plugin-Manager von Notepad++ erkennen ob eines da ist und gegebenenfalls auch nachinstallieren ...
Edit:
Kann sein, dass es zum normalen Editieren gar keine Vorteile bringt.
Ich hab mir das damals direkt installiert und bin mir nicht sicher, was Notepad++ bereits ohne das Plugin bezüglich Highlighting, Kommentierung, Einrückung, ... kann.
Einfach mal ausprobieren.
Geändert von raystuttgart (18. November 2011 um 11:57 Uhr)
Teammitgleid dieses Projekt für Colonization:
[Mod] We The People
(Nachfolgerprojekt von Religion and Revolution)
Davor Teammitgleid dieses Projekt für Colonization:
[Mod] Religion and Revolution
Vor-Vorheriges Projekt für Colonization:
[ModMod] ray's Wunschliste
Und wiederum davor Teammitglied von:
[Mod] The Authentic Colonization (TAC)
Faireweather nutzt als Whitespaces keine Tabs sondern Leerzeichen. Geh in Notepad++ mal auf: Ansicht->nichtdruckbare Zeichen->Leerzeichen und Tabulatoren anzeigen. Da siehst du dann das Elend.Nun jedoch wird beim Einfügen neuer Codezeilen immer eine Verschachtelung erzeugt (als solche in Notepad++ angezeigt), die dann zu einem Syntaxfehler im Python-Interpreter führt.
Das Ende vom Lied ist, dass der Fehler vom Interpreter 5mal angezeigt wird, das "Python-module CB_Mod06b_FaireWeather.py" als nicht zu laden erklärt wird und Col nicht startet.
Das war es!
Abermals (wie oft eigentlich schon ) vielen, vielen Dank!
Es funktioniiiihiert!
Jetzt muss ich gleich mal ein Testspielchen ansetzen....
Nachtrag:
Geschieht das mit den Tabulatoren und Leerzeichen nur bei FaireWeather, und wenn ja, wo stellt man das ein?
Ich wäre da vermutlich so schnell nicht drauf gekommen...
Zweiter Nachtrag:
Dank natürlich auch an Ray und W.B.!
Dritter Nachtrag:
Der Witz ist, und darum bin ich auch gar nicht auf den Gedanken gekommen, dass meine bisherigen Modifikationen mit Verwendung des Tabs funktionierten (allerdings gibt es auch Dinge, die ich in eine Zeile quetschen musste, weil es plötzlich nicht mehr anders ging - nun weiß ich wohl, woran das lag).
Schon komisch: manchmal akzeptiert das Skript es, manchmal nicht....
Geändert von Commander Bello (18. November 2011 um 13:24 Uhr)
Aber klar doch!
Aufpassen: es ist noch nicht "bereinigt", d.h. die Einstellung "riesig" erzeugt die von mir bevorzugten "über-riesigen" Karten.
Auch die Komposition der "tektonische Platten" hatte ich mal verändert und die Änderung bislang nie herausgenommen... Funktioniert aber mit ansprechenden Ergebnissen, wie ich finde.
Um meine Änderungen zu finden: nach dem Begriff "CB" suchen. Ich habe alles dokumentiert (hoffe ich).
Solltest du (oder andere) bei geringerer Kartengröße Unannehmlichkeiten erleben, bin ich natürlich über jede Rückmeldung dankbar.
19.11.:
Ich hatte versehentlich eine falsche Version angehängt. Die korrigierte Version findet sich hier.
Geändert von Commander Bello (19. November 2011 um 01:10 Uhr) Grund: Fehlerhafte Version entfernt u. Link zur neuen Version
@W.B.:
Was ich übrigens bei dem Python Plugin, dass über Plugin Manager angeboten wird, auch ganz nett finde ist,
dass es in seiner Doku auch ein paar Grundlagen und Zusammenhänge erklärt.
(Beispielsweise hab ich dort ein wenig über "Boost" erfahren.)
Ausserdem verlinkt es auch auf gute Tutorials.
Achtung Spoiler:
Teammitgleid dieses Projekt für Colonization:
[Mod] We The People
(Nachfolgerprojekt von Religion and Revolution)
Davor Teammitgleid dieses Projekt für Colonization:
[Mod] Religion and Revolution
Vor-Vorheriges Projekt für Colonization:
[ModMod] ray's Wunschliste
Und wiederum davor Teammitglied von:
[Mod] The Authentic Colonization (TAC)
Das wird nicht eingestellt, sondern hängt immer davon ab, was der Author verwendet hat. Üblich bei Python sind wohl Leerzeichen, Firaxis verwendet Tabulatoren.Nachtrag:
Geschieht das mit den Tabulatoren und Leerzeichen nur bei FaireWeather, und wenn ja, wo stellt man das ein?
Ich wäre da vermutlich so schnell nicht drauf gekommen...