Ich habe mal meine Commits durchsucht und ein Beispiel für das Einfügen von Buttons zusammengestellt
Achtung, in diesem Beispiel ruft der Button erst noch ein Menü auf, in dem man zwischen verschiedenen Dingen auswählen kann. Wenn man das nicht benötigt kann der erste Schritt weggelassen werden und die neue Aktion gleich in dem Code-Teil von Schritt 3 eingefügt werden.
Achtung2, der Code stammt aus Colonization. Es kann sein, dass bei Civ4 die Position des Buttons (Xcord, Ycord) anders berechnet wird. Das kann man aber einfach von einem anderen Button dort kopieren.
--------------- Assets/Python/EntryPoints/CvScreensInterface.py ---------------
1. Erstelle eine neue Funktion in dieser Datei für die Aktion der Einheit
Code:
def meineAktion(argsList):
iButtonId = argsList[0]
iData1 = argsList[1]
iData2 = argsList[2]
iData3 = argsList[3]
iData4 = argsList[4] # Flags
szText = argsList[5]
bOption1 = argsList[6]
bOption2 = argsList[7]
# Abort if User deny change
if iButtonId < 1:
return
pPlayer = gc.getPlayer( iData2 )
pUnit = gc.getPlayer(iData2).getUnit(iData1)
#Hier Einheiten-Aktion einfügen
pUnit.changeMoves(30)
#Aktualisiere Leiste mit den Einheitenbuttons
mainInterface.updateSelectionButtons()
------------------- Assets/Python/Screens/CvMainInterface.py -------------------
2. Suche in dieser Datei nach den Zeilen
Code:
ActionButtonList.append("DeleteGroupButton")
iCount += 1
und erweitere danach um folgendes:
Code:
if not pUnit.hasMoved():
Xcord = ACTION_BUTTON_X_BEGIN - iCount * ACTION_BUTTON_X_STEP - LARGE_BUTTON_SIZE
Ycord = yResolution - SADDLE_HEIGHT / 8
screen.setImageButton("MeineAktionButton", ArtFileMgr.getInterfaceArtInfo("INTERFACE_BUTTONS_CANCEL").getPath(), int(Xcord) - LARGE_BUTTON_SIZE, int(Ycord) - LARGE_BUTTON_SIZE, LARGE_BUTTON_SIZE * 2, LARGE_BUTTON_SIZE * 2, WidgetTypes.WIDGET_GENERAL, 777, 0)
screen.setImageShape("MeineAktionButton", ImageShapes.IMAGE_SHAPE_ELLIPSE, -1)
screen.setHitMargins("MeineAktionButton", 18, 18)
ActionButtonList.append("MeineAktionButton")
iCount += 1
• INTERFACE_BUTTONS_CANCEL kann nat. durch andere Grafiken ersetzt werden.
• Die if-Bedinung muss sicher ebenfalls angepasst werden, damit der Button in der richtigen Situation angezeigt wird. Hier ist er für alle Einheiten sichtbar, die noch nicht bewegt wurden.
• Die Zahl 777 ist die Id dieser Aktion und sollte einmalig vorkommen. Dafür kann man nat. auch irgendwo eine Konstante definieren. Der zweite Wert kann für weitere Verfeinerungen genutzt werden.
Auf diese Werte kann im dritten Schritt über getData1() und getData2() zugegriffen werden.
3. In der Methode handleInput die Zeile
Code:
if (inputClass.getNotifyCode() == NotifyCode.NOTIFY_CLICKED):
suchen und dort den If-Zweig um einen neuen Eintrag erweitern
Code:
elif ( inputClass.getData1() == 777 ):
#MeineAktion
pUnit = g_pSelectedUnit
#Erstelle Popup für Nachfrage.
popupInfo = CyPopupInfo()
popupInfo.setButtonPopupType(ButtonPopupTypes.BUTTONPOPUP_PYTHON)
popupInfo.setText(CyTranslator().getText("TXT_KEY_POPUP_IRGENDWAS",()))
popupInfo.setData1( pUnit.getID() )
popupInfo.setData2( gc.getActivePlayer().getID() )
popupInfo.setOnClickedPythonCallback("meineAktion")
popupInfo.addPythonButton(CyTranslator().getText("TXT_KEY_POPUP_MEINE_AKTION_DENY", ()), "" )
popupInfo.addPythonButton(CyTranslator().getText("TXT_KEY_POPUP_MEINE_AKTION_OPTION1", ()), "" )
popupInfo.addPythonButton(CyTranslator().getText("TXT_KEY_POPUP_MEINE_AKTION_OPTION2", ()), "" )
popupInfo.addPopup( gc.getActivePlayer().getID() )
4.In der Methode getWidgetHelp
unter
Code:
if eWidgetType == WidgetTypes.WIDGET_GENERAL:
um einen neuen Eintrag ergänzen:
Code:
elif iData1 == 777:
return localText.getText("TXT_KEY_INTERFACE_CHANGE_SIGHT_DIRECTION", ());