gc.getBuildingInfo <- da fehlen die Klammern dahinter ()
gc.getBuildingInfo <- da fehlen die Klammern dahinter ()
Pucc's Lets Plays BASE 6.0: #1 #2 #3 #4 #5
Download von BASE 6.4 [D]: HIER (klick mich!) (Stand: 08.07.2022)
Hab ich mal testweise 4x gesetzt ändert nix am Problem
load_module CvEventManagerCode:#TEST elif iBuildingType == CvUtil.findInfoTypeNum(gc.getBuildingInfo(), gc.getNumBuildingInfos(), "BUILDING_XXX"): (loopCity, iter) = (pPlayer.firstCity(True)) while(loopCity): loopCity.setNumRealBuilding(CvUtil.findInfoTypeNum(gc.getBuildingInfo(), gc.getNumBuildingInfos(), "BUILDING_ZZZ"), False) (loopCity, iter) = (pPlayer.nextCity(iter, true)) elif iBuildingType == CvUtil.findInfoTypeNum(gc.getBuildingInfo(), gc.getNumBuildingInfos(), "BUILDING_ZZZ"): (loopCity, iter) = (pPlayer.firstCity(True)) while(loopCity): pCity.setNumRealBuilding(CvUtil.findInfoTypeNum(gc.getBuildingInfo(), gc.getNumBuildingInfos(), "BUILDING_XXX"), False) (loopCity, iter) = (pPlayer.nextCity(iter, true)) #TEST END
Traceback (most recent call last):
File "<string>", line 1, in ?
File "<string>", line 52, in load_module
File "CvEventInterface", line 17, in ?
File "<string>", line 52, in load_module
File "BugEventManager", line 102, in ?
File "<string>", line 35, in load_module
File "<string>", line 13, in _get_code
File "CvEventManager", line 567
elif iBuildingType == CvUtil.findInfoTypeNum(gc.getBuildingInfo(), gc.getNumBuildingInfos(), "BUILDING_XXX"):
^
SyntaxError: invalid syntax
load_module CvAppInterface
load_module os
load_module CvUtil
load_module traceback
Woher haste eigentlich dein CvUtil.findInfoTypeNum(gc.getBuildingInfo(), gc.getNumBuildingInfos(), "BUILDING_XXX") ?
Funktioniert das an anderer Stelle? Ich benutze nämlich einfach nur iBuildingType == gc.getInfoTypeForString( 'BUILDING_XX' )
Dein Fehler ist auf jeden Fall in Zeile 567, wie angegeben. Poste die am besten mal komplett.
Pucc's Lets Plays BASE 6.0: #1 #2 #3 #4 #5
Download von BASE 6.4 [D]: HIER (klick mich!) (Stand: 08.07.2022)
Code ist von Kathy und auf der letzten Seite auch komplett drauf. Wie das log so schön schreibt die syntax ist schon mal falsch....
LINK
Das hier:
CvUtil.findInfoTypeNum(gc.getBuildingInfo(), gc.getNumBuildingInfos(), "BUILDING_XXX")
habe ich aber von deinem Code kopiert und daher nicht weiter überprüft. Generell stimme ich Cybah zu: gc.getInfoTypeForString( 'BUILDING_XX' ) ist besser - denn die andere Funktion ruft genau das auf und ignoriert die übergebenen Parameter (außer dem Text) komplett.
Einen Syntax-Fehler sehe ich allerdings in der betreffenden Zeile nicht.
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys
Der Code
kommt von BTS und funktioniert genau wie er soll bezogen auf eine City !Code:if iBuildingType == CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), "BUILDING_ARCOLOGY_SHIELDING"): pCity.setNumRealBuilding(CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), "BUILDING_ARCOLOGY"), False) elif iBuildingType == CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), "BUILDING_DEFLECTOR_SHIELDING"): pCity.setNumRealBuilding(CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), "BUILDING_ARCOLOGY_SHIELDING"), False)
Die Herausforderung war die Abfrage über alle Citys vom Player zu machen.
Und jetzt bitte nochmal für Klarheit, wo soll wie "gc.getInfoTypeForString( 'BUILDING_XX' )" eingebunden werden
Statt
(CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), "BUILDING_ARCOLOGY_SHIELDING")
muss
(gc.getInfoTypeForString("BUILDING_ARCOLOGY_SHIELDING"))
stehen.
That's why I am here: Mein Mod
Mehr Technologien, mehr Einheiten, mehr Zivilisationen, mehr Gebäude
Die aktuelle Story zum Mod:
Die Vereinigten Staaten von Amerika
Alte Stories zu alten Versionen:
Alte Storys
Ich hab es ja echt versucht aber DAS:
funktioniert einfach nicht oder mache ich was falschCode:#TEST elif iBuildingType == gc.getInfoTypeForString("BUILDING_XXX"): (loopCity, iter) = (pPlayer.firstCity(True)) while(loopCity): loopCity.setNumRealBuilding(gc.getInfoTypeForString("BUILDING_ZZZ"), False) (loopCity, iter) = (pPlayer.nextCity(iter, true)) elif iBuildingType == gc.getInfoTypeForString("BUILDING_ZZZ"): (loopCity, iter) = (pPlayer.firstCity(True)) while(loopCity): pCity.setNumRealBuilding(gc.getInfoTypeForString("BUILDING_XXX"), False) (loopCity, iter) = (pPlayer.nextCity(iter, true)) #TEST END
Mir fliegt das ganze HUD weg...
Traceback (most recent call last):
File "<string>", line 1, in ?
File "<string>", line 52, in load_module
File "CvEventInterface", line 17, in ?
File "<string>", line 52, in load_module
File "BugEventManager", line 102, in ?
File "<string>", line 35, in load_module
File "<string>", line 13, in _get_code
File "CvEventManager", line 567
elif iBuildingType == gc.getInfoTypeForString("BUILDING_XXX"):
^
SyntaxError: invalid syntax
load_module CvAppInterface
load_module os
load_module CvUtil
load_module traceback
Es ist ein Syntaxfehler und der Cursor ist ganz vorne auf dem Zeilenanfang
Ohne die Zeilen darüber können wir nur raten. Es ist garantiert ein extrem simpler Fehler.
Poste doch einfach kurz den kompletten Code evtl. mit Zeilennummern, dann können wir die weiterhelfen
Tick tock goes the clock...
Oh man, dass mit dem HUB ist gelöst, genau wie du sagtest ganz einfach.
Erste Zeile vor "elif" mussen 2 Tabs hin. Das war aber nur ein Tab und das andere leerzeichen
Jetzt läuft das HUD und im log ist die syntax Fehlermeldung weg
Genau das meinte antriot wohl , hab ich jetzt kapiert !!! Danke.
Jetzt zur eigentlichen Funktion. Die will leider noch nicht und bezieht sich weiterhin nur auf eine City.
Ich kann z.b. in City A das Building XXX bauen und in City D das Building ZZZ. Das Building XXX bleibt in City A bestehen und somit existieren wieder Beide
Da muss noch was fehlenCode:def onBuildingBuilt(self, argsList): 'Building Completed' pCity, iBuildingType = argsList pPlayer = gc.getPlayer(pCity.getOwner()) game = gc.getGame() #enable movie popup for national and global wonders if pCity.getOwner() == gc.getGame().getActivePlayer() and gc.getBuildingInfo(iBuildingType).getMovieDefineTag() != "NONE": # If this is a wonder... popupInfo = CyPopupInfo() popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON_SCREEN) popupInfo.setData1(iBuildingType) popupInfo.setData2(pCity.getID()) popupInfo.setData3(0) popupInfo.setText(u"showWonderMovie") popupInfo.addPopup(pCity.getOwner()) CvAdvisorUtils.buildingBuiltFeats(pCity, iBuildingType) #replace arcology with higher version if iBuildingType == CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), "BUILDING_ARCOLOGY_SHIELDING"): pCity.setNumRealBuilding(CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), "BUILDING_ARCOLOGY"), False) elif iBuildingType == CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), "BUILDING_DEFLECTOR_SHIELDING"): pCity.setNumRealBuilding(CvUtil.findInfoTypeNum(gc.getBuildingInfo, gc.getNumBuildingInfos(), "BUILDING_ARCOLOGY_SHIELDING"), False) #replace arcology with higher version END #TEST elif iBuildingType == gc.getInfoTypeForString("BUILDING_XXX"): (loopCity, iter) = (pPlayer.firstCity(True)) while(loopCity): loopCity.setNumRealBuilding(gc.getInfoTypeForString("BUILDING_ZZZ"), False) (loopCity, iter) = (pPlayer.nextCity(iter, true)) elif iBuildingType == gc.getInfoTypeForString("BUILDING_ZZZ"): (loopCity, iter) = (pPlayer.firstCity(True)) while(loopCity): pCity.setNumRealBuilding(gc.getInfoTypeForString("BUILDING_XXX"), False) (loopCity, iter) = (pPlayer.nextCity(iter, true)) #TEST END
pCity.setNumRealBuilding unten musst du auch zu loopCity.setNumRealBuilding ändern. Habs auch erst nach paar Minuten genauem Hinsehen bemerkt.
Pucc's Lets Plays BASE 6.0: #1 #2 #3 #4 #5
Download von BASE 6.4 [D]: HIER (klick mich!) (Stand: 08.07.2022)
Ach du meine Güte..... ja genau
ich dachte echt das wird schon nix mehr
Habe die Funktion nun drin und die ersten Tests laufen gut.
Wenn ich in City A das Building XXX habe und baue in einer anderen Stadt das Building ZZZ dann wird
Building XXX aus City A entfernt, geil !
Vielen Lieben Dank für die Codezeilen und Hilfestellung bei diesem Thema
Eine Frage noch, funktioniert das auch ganz normal für die KI ?
Was ich heute echt wieder gelernt habe ist das Einrücken des Codes. Mir war erst garnicht bewusst das ein
einziger Tab zuviel die ganze Funktion aushebeln kann. Hab sogleich auch ein paar andere Codeblöcke ausgeräuft wo am Zeilenanfang statt Tabs mit Leerzeichen gearbeitet wurde. Hab ich nun alles mit Tabs gemacht das mir sowas nicht wieder passiert. Der Notepad++ zeigt ja sogar die Funktionszeilen an die in Abhänigkeit stehen
Ach wenn ich nur einfach mehr davon verstehen würde, ich arbeite mich aber rein. Mit jedem Problem lerne ich wieder was. Nochmals vielen DANK
Gut, Cybah Ich hatte es nicht gefunden.
Ja, auch wenn diese Gebäude fertigstellen wird die Methode aufgerufen. Der KI ist nur vorher nicht "bewusst" dass beim Bau von Gebäude X das andere gelöscht wird. Das spielt in den meisten denkbaren Fällen aber keine Rolle.
P.S. Ich bin auch ein Fan von Tabs, aber empfehle dir trotzdem statt Tabs auf Leerzeichen zu setzen. Da die Mehrheit auf 4 Leerzeichen setzt bekommst du sonst beim Austausch mit anderen graue Haare (und die anderen auch).
Die Durchmischung wie im Civ4-Code ist übriges nicht „normal“. Das sollte man sich nicht als Vorbild nehmen.