Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 31 bis 45 von 68

Thema: Für Modder: HOW-TO feature...

  1. #31
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    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", ());
    Geändert von Ramkhamhaeng (13. November 2013 um 11:09 Uhr)

  2. #32
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.015
    Nicht schlecht. Zur Sicherheit sollte Cybah eine Id größer 2000 in Base wählen. Ich habe im SDK schon mal neue Buttonfunktionen erweitert.

    Code:
    int iNumActionInfos = GC.getNumActionInfos() +
    		NUM_INTERFACEMODE_TYPES +
    		GC.getNumBuildInfos() +
    		GC.getNumPromotionInfos() +
    		GC.getNumReligionInfos() +
    		GC.getNumCorporationInfos() +
    		GC.getNumUnitInfos() +
    		GC.getNumSpecialistInfos() +
    		GC.getNumBuildingInfos() +
    		NUM_CONTROL_TYPES +
    		NUM_COMMAND_TYPES +
    		GC.getNumAutomateInfos() +
    		NUM_MISSION_TYPES;
    Die Id der Aktion sollten allgemein bei BTS-Grundlage größer der Summe oben sein.

    In Base kommt noch folgende Betrag hinzu.

    Code:
    iNumActionInfos += GC.getNumSwitchPromotionInfos();
    Geändert von rucivfan (13. November 2013 um 11:51 Uhr)

  3. #33
    PAE.Macht.Antike! Avatar von Pie
    Registriert seit
    25.01.08
    Ort
    Noricum
    Beiträge
    16.342
    Ram, das ist aber nicht MP-fähig, wenns sich alles nur in der ScreenInterface abspielt!
    Pie's Ancient Europe (PAE)
    Erlebe mit dieser CIV IV Mod(ifikation) hautnah das Zeitalter der Antike bis ins letzte Detail!
    Mit bahnbrechenden Erweiterungen und vielen ein- und erstmaligen Features.


    ... im Übrigen bin ich der Meinung, dass Karthago wieder aufgebaut werden muss!

  4. #34
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Zitat Zitat von Pie Beitrag anzeigen
    Ram, das ist aber nicht MP-fähig, wenns sich alles nur in der ScreenInterface abspielt!
    Oh, darüber hatte ich mir keinerlei Gedanken gemacht. Ich nehme mal an, dass man dann die Zeilen, im Interface-Code ein Event erzeugen muss, welches die Befehle dann auf allen Rechnern ausführt.

  5. #35
    PAE.Macht.Antike! Avatar von Pie
    Registriert seit
    25.01.08
    Ort
    Noricum
    Beiträge
    16.342
    Genau, dafür gibts das onNetMessage im EventManager. Cybah, wenn dus dringend brauchst, dann schau dir das bei PAE mal ab. Such einfach nach zB 700 im Screens/MainInterface, EventManager und der GameUtils.

    Die EntryPoints/ScreenInterface-Datei brauchst du auch erst dann, wenn es sich um ein PopUp handelt.
    Pie's Ancient Europe (PAE)
    Erlebe mit dieser CIV IV Mod(ifikation) hautnah das Zeitalter der Antike bis ins letzte Detail!
    Mit bahnbrechenden Erweiterungen und vielen ein- und erstmaligen Features.


    ... im Übrigen bin ich der Meinung, dass Karthago wieder aufgebaut werden muss!

  6. #36
    Waddehaddedudeda Avatar von Cybah
    Registriert seit
    01.09.06
    Beiträge
    30.450
    Und wie machste das mit der KI?
    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)

  7. #37
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.015
    Die KI interessieren Schalter nicht.

  8. #38
    PAE.Macht.Antike! Avatar von Pie
    Registriert seit
    25.01.08
    Ort
    Noricum
    Beiträge
    16.342
    Genau. Die KI is in der GameUtils zu proggen. Denen sagst dus einfach, wenn Bedarf ist. Die brauchen dafür keine Buttons.
    Pie's Ancient Europe (PAE)
    Erlebe mit dieser CIV IV Mod(ifikation) hautnah das Zeitalter der Antike bis ins letzte Detail!
    Mit bahnbrechenden Erweiterungen und vielen ein- und erstmaligen Features.


    ... im Übrigen bin ich der Meinung, dass Karthago wieder aufgebaut werden muss!

  9. #39
    Waddehaddedudeda Avatar von Cybah
    Registriert seit
    01.09.06
    Beiträge
    30.450
    Du meinst AI_unitUpdate oder? Wie verhindere ich damit, dass sie z.B. zwei gleiche Einheitentypen gleichzeitig für dasselbe verwendet?
    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)

  10. #40
    Registrierter Benutzer
    Registriert seit
    21.03.12
    Beiträge
    22.397
    Was willst du denn genau tun? Gleichzeitig passiert in Civ4 eh nichts, kann ja nur einen CPU-Kern.

  11. #41
    Waddehaddedudeda Avatar von Cybah
    Registriert seit
    01.09.06
    Beiträge
    30.450
    PHP-Code:
      def AI_unitUpdate(self,argsList):
        
    pUnit argsList[0]
        
    iOwner pUnit.getOwner()

        if 
    not gc.getPlayer(iOwner).isHuman():
          
    pUnitOwner gc.getPlayer(pUnit.getOwner())
          
    iUnitType pUnit.getUnitType()

          
    # Inquisitor
          
    if iUnitType == CvUtil.findInfoTypeNum(gc.getUnitInfogc.getNumUnitInfos(), "UNIT_INQUISITOR"):
            
    self.doInquisitorCore_AI(pUnit)
            return 
    True 
    Wird dann nicht jeder Inquisitor jede Runde überprüft und für jeden self.doInquisitorCore_AI(pUnit) ausgeführt? Wenn ich jetzt Einheiten hab, die Frieden erzwingen können und zwar von egal wo, soll ja nur eine Einheit davon verwendet werden.
    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)

  12. #42
    PAE.Macht.Antike! Avatar von Pie
    Registriert seit
    25.01.08
    Ort
    Noricum
    Beiträge
    16.342
    Ja richtig, jede Einheit durchläuft dieses Schema. Aber du überprüfst ja vor der Aktion, ob sie überhaut die Aktion ausführen soll. D.h. wenn du jetzt Frieden erzwingen möchtest, dann überprüfst du ja vorher, ob Krieg ist. Wenn ja -> erzwinge Frieden. Wenn nein -> return und die Einheit macht, was der Computer ihr sagt (meist nix, also Reserve).

    Und damit solche Einheiten nicht Überhand nehmen, gibt es auch für die AI eine AI_chooseProduction in der GameUtils, wo du sagen kannst, wenn schon eine solche Einheit existiert, soll keine weitere erstellt werden.
    Pie's Ancient Europe (PAE)
    Erlebe mit dieser CIV IV Mod(ifikation) hautnah das Zeitalter der Antike bis ins letzte Detail!
    Mit bahnbrechenden Erweiterungen und vielen ein- und erstmaligen Features.


    ... im Übrigen bin ich der Meinung, dass Karthago wieder aufgebaut werden muss!

  13. #43
    Waddehaddedudeda Avatar von Cybah
    Registriert seit
    01.09.06
    Beiträge
    30.450
    Gut, Krieg war jetzt ein blödes Beispiel. Was ist mit ner geskripteten Handelsmission?
    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)

  14. #44
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    19.015
    Zitat Zitat von Flunky Beitrag anzeigen
    Was willst du denn genau tun? Gleichzeitig passiert in Civ4 eh nichts, kann ja nur einen CPU-Kern.
    Dank Grafikkartentreiber stimmt das nicht. Bei mir werden 1,5 Kerne von Civ 4 genutzt. (Auslastung Kern 1: 100% Kern 2: 50%)

    Zitat Zitat von Cybah Beitrag anzeigen
    Gut, Krieg war jetzt ein blödes Beispiel. Was ist mit ner geskripteten Handelsmission?
    Du müsstest der Einheit erstmal sagen, wo sie hin müsste. Und nur dann die Handelsmission auslösen. Das ist dann aber nicht so einfach. Du müsstest die "beste" Stadt suchen jede Runde und die Einheit in die Richtung bewegen. Bei Erreichen löst du dann aus. Probleamtisch wird es, wenn die "beste" Stadt nicht gleich bleibt. Dann bewegt sich die Einheit hin und her.

  15. #45
    PAE.Macht.Antike! Avatar von Pie
    Registriert seit
    25.01.08
    Ort
    Noricum
    Beiträge
    16.342
    Genau. Deshalb hab ich da auch eine Vorüberprüfung eingebaut (auch in die BTS Inquisitorfunktion), die prüft, ob die Einheit bereits einer Mission zugeteilt wurde.
    Pie's Ancient Europe (PAE)
    Erlebe mit dieser CIV IV Mod(ifikation) hautnah das Zeitalter der Antike bis ins letzte Detail!
    Mit bahnbrechenden Erweiterungen und vielen ein- und erstmaligen Features.


    ... im Übrigen bin ich der Meinung, dass Karthago wieder aufgebaut werden muss!

Seite 3 von 5 ErsteErste 12345 LetzteLetzte

Berechtigungen

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