Seite 257 von 271 ErsteErste ... 157207247253254255256257258259260261267 ... LetzteLetzte
Ergebnis 3.841 bis 3.855 von 4063

Thema: Der Pythonthread

  1. #3841
    Registrierter Benutzer Avatar von Monaldinio
    Registriert seit
    10.11.09
    Ort
    HRO
    Beiträge
    7.650
    Wäre das mit meiner Sonnenaktivität auch möglich?
    Im Moment wird der ist Zustand nicht richtig gespeichert....;(
    Also der Ertrag der improvements bei hoher/niedriger Sonnenaktivität .
    Conflict on Chiron - Sid Meier's Alpha Centauri vs. Call to Power!

    Neu Version Conflict on Chiron v3.4 BETA - 16.01.16

    Patch1 - 07.04.16

    Die deutschen Sounds und Wunderfilme sind bereits in der MainFile integriert!
    Ihr könnt sofort loslegen.

    Über Feedback würde ich mich freuen...

  2. #3842
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Ans Speichern+Laden zu denken vergesse ich auch gerne

    Es ginge auch in Python relativ einfach indem du die setScriptData-Felder von den Plots verwendest, um die Information zu speichern. Es gibt auch schon Vorlagen/Modding-Libs, welche die Verwendung vereinfachen sollen. Habe ich aber nicht ausprobiert und stattdessen bei PAE (im Thread zu den Flüssen) ein eigene Erweiterung vom ScriptData-Feld geschrieben.

    SDK ist theoretisch einfacher, aber ich weiß nicht ob du Thorgal damit weiter hilft. Und es wird schwieriger mit der Savekompatibilität.

  3. #3843
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Zitat Zitat von Monaldinio Beitrag anzeigen
    Wäre das mit meiner Sonnenaktivität auch möglich?
    Im Moment wird der ist Zustand nicht richtig gespeichert....;(
    Also der Ertrag der improvements bei hoher/niedriger Sonnenaktivität .
    Jein. Es wird ja auch bei dir was gespeichert. Da habe ich einen (lustigen) anderen Ansatz genommen und den Integer-Wert in den Beziehungen des Barbaren gespeichert. Die Werte werden nirgends benötigt und können daher für solche Sachen missbraucht werden (Zumindest hoffe ich das)
    Leider stimmt was mit der Erkennung der aktuellen Season nicht und ich weiß immer noch nicht wieso.

  4. #3844
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Kann man beim Speichern und Laden über Python herausbekommen, wie der Dateiname des Spielstandes ist?

  5. #3845
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Ich glaube das geht nicht mal im Sdk. Die Methoden kriegen ja alle nur den Steam gereicht, aber die Erzeugung des Steams liegt außerhalb.

  6. #3846
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Man könnte höchsten mal gucken ob der Save-Name in der Struktur landet, die mit CyVariableSystem ausgelesen werden. Ist aber eher für die INI-Werte gedacht, glaube ich. Beispiel-Implementation ist in CvDefineEditor.py zu finden

  7. #3847
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Ich habe das jetzt mit pickle und GyGame::setScriptData bzw. getScriptData gelöst:

    seasons.py:
    Achtung Spoiler:
    Code:
    import pickle
    
    import CvUtil
    from CvPythonExtensions import *
    
    gc = CyGlobalContext()
    
    class Seasons(object):
        def __init__(self):
            self._fields = []
    
        def init(self):
            self._fields = [i for i in xrange(CyMap().numPlots())
                            if CyMap().plotByIndex(i).getTerrainType() == gc.getInfoTypeForString("TERRAIN_GRASS")]
            
    
        def doTurn(self, gameTurn):
            if (gameTurn % 20) == 0:
                self._toGrass()
            elif (gameTurn % 20) == 10:
                self._toSnow()
    
        def _toTerrainType(self, terrainType):
            for plotIndex in self._fields:
                plot = CyMap().plotByIndex(plotIndex)
                plot.setTerrainType(terrainType, False, True)
    
        def _toGrass(self):
            self._toTerrainType(gc.getInfoTypeForString("TERRAIN_GRASS"))
    
        def _toSnow(self):
            self._toTerrainType(gc.getInfoTypeForString("TERRAIN_SNOW"))
    
        def save(self):
            data = pickle.dumps(self._fields)
            CyGame().setScriptData(data)
            
        def load(self):
            data = CyGame().getScriptData()
            self._fields = pickle.loads(data)


    seasonsEventManager.py:
    Achtung Spoiler:
    Code:
    from CvEventManager import CvEventManager
    
    from CvPythonExtensions import *
    
    from seasons import Seasons
    
    gc = CyGlobalContext()
    
    
    class SeasonsEventManager(CvEventManager):
        def __init__(self):
            CvEventManager.__init__(self)
            
            self.seasons = Seasons()
        
        def onLoadGame(self, argsList):
            ret = CvEventManager.onLoadGame(self, argsList)
    
            self.seasons.load()
            
            return ret
    
        def onSaveGame(self, argsList):
            savename = CvEventManager.onSaveGame(self, argsList)
            
            self.seasons.save()
            
            return savename
    
        def onGameStart(self, argsList):
            CvEventManager.onGameStart(self, argsList)
    
            self.seasons.init()
        
        def onBeginGameTurn(self, argsList):
            CvEventManager.onBeginGameTurn(self, argsList)
    
            gameTurn = argsList[0]
            self.seasons.doTurn(gameTurn)

  8. #3848
    Registrierter Benutzer Avatar von JohnStockton
    Registriert seit
    14.12.11
    Beiträge
    404
    Also ich hab jetzt die beiden py-Dateien (seasons, seasonseventmanager) nach deiner Vorlage erstellt und in den Python-Ordner gelegt, muss ich dann noch etwas im Event-Manager ändern? Weil nur mit den beiden Dateien funktioniert es bei mir noch nicht.

  9. #3849
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.757
    Das fehlt noch:

    EntryPoints/CvEventManager.py:
    Achtung Spoiler:
    Code:
    # Sid Meier's Civilization 4
    # Copyright Firaxis Games 2005
    #
    # CvEventInterface.py
    #
    # These functions are App Entry Points from C++
    # WARNING: These function names should not be changed
    # WARNING: These functions can not be placed into a class
    #
    # No other modules should import this
    #
    import CvUtil
    from seasonsEventManager import SeasonsEventManager
    from CvPythonExtensions import *
    
    normalEventManager = SeasonsEventManager()
    
    def getEventManager():
    	return normalEventManager
    
    def onEvent(argsList):
    	'Called when a game event happens - return 1 if the event was consumed'
    	return getEventManager().handleEvent(argsList)
    
    def applyEvent(argsList):
    	context, playerID, netUserData, popupReturn = argsList
    	return getEventManager().applyEvent(argsList)
    
    def beginEvent(context, argsList=-1):
    	return getEventManager().beginEvent(context, argsList)


    Habe ich nur nicht nochmal geschrieben, weil sich hier nichts geändert hatte.

  10. #3850
    Registrierter Benutzer Avatar von JohnStockton
    Registriert seit
    14.12.11
    Beiträge
    404
    Super, danke dir und allen anderen!

  11. #3851
    Antiker Benutzer Avatar von BoggyB
    Registriert seit
    21.08.11
    Beiträge
    7.043
    Zitat Zitat von civ4bug.sourceforge.net/PythonAPI/
    VOID sendModNetMessage (INT iData1, INT iData2, INT iData3, INT iData4, INT iData5)
    void (int iData1, int iData2, int iData3, int iData4, int iData5) - This is a NetMessage designed specifically for modders to use to make their mods Multiplayer friendly, eliminating Out-of-Sync errors. Check out 'onModNetMessage()' in CvEventManager for the callback
    Weiß jemand, was genau ich hierunter zu verstehen habe? Was sollte ich vermeiden zu tun, und lieber auf onModNetMessage zurückgreifen?
    Bisschen konkreter (geht um PAE):
    In MainInterface platziere ich einen neuen Button für eine Einheit, bei Klicken des Knopfes wird handleInput() (in MainInterface) aufgerufen. An dieser Stelle wird dann normalerweise (also bei den sonstigen Funktionalitäten von PAE) immer, je nach gedrücktem Button, onModNetMessage mit einer den Button identifizierenden ID aufgerufen und dort dann der übrige Kram erledigt. Statt onModNetMessage könnte ich ja aber auch eine beliebige andere Methode aufrufen, die dann die gewünschte Funktionalität ausführt, kann das zu Problemen führen und sollte ich lieber onModNetMessage verwenden? Im Wesentlichen wird in der Methode dann nur noch ein Popup generiert (das dann auch noch eine Methode in ScreensInterface aufruft), Zufallselemente kommen keine vor. Wüsste nicht, was da zu OOS führen sollte, aber ich dachte, ich frag besser nochmal.
    "Only Germans, perhaps, could make a game about economics - a stylish, intelligent and captivating one at that." - The New York Times

  12. #3852
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Es wird genau dann kritisch wenn du den Zustand des Spiels änderst. Beispielweise das Ändern eines Feldes oder das ScriptData-Feld. Passiert dies alles innerhalb von onModNetMessage so ist sichergestellt, dass es bei allen Teilnehmern des Spiels stattfinden. Anderenfalls wird es nur beim aktiven Spieler ausgeführt.

  13. #3853
    Antiker Benutzer Avatar von BoggyB
    Registriert seit
    21.08.11
    Beiträge
    7.043
    Zitat Zitat von Ramkhamhaeng Beitrag anzeigen
    Es wird genau dann kritisch wenn du den Zustand des Spiels änderst. Beispielweise das Ändern eines Feldes oder das ScriptData-Feld. Passiert dies alles innerhalb von onModNetMessage so ist sichergestellt, dass es bei allen Teilnehmern des Spiels stattfinden. Anderenfalls wird es nur beim aktiven Spieler ausgeführt.
    Interessant Gilt das für den ganzen EventManager, dass Änderungen des Spielzustands bei allen Spielern ankommen? Denn es kann ja nicht sein, dass das nur innerhalb von onModNetMessage so ist Ich bin jetzt ein wenig verwirrt

    Und wenn ich innerhalb von onModNetMessage einen Methodenaufruf habe, hab ich in diesem dann auch garantierte Synchronizität?
    "Only Germans, perhaps, could make a game about economics - a stylish, intelligent and captivating one at that." - The New York Times

  14. #3854
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Jein, es gilt auch für andere Abschnitte des EventManagers, aber nicht für alle ( mouseEvent z.B. erwartbarerweise nicht ). Aber spielt letztlich auch keine Rolle für dich welche Abschnitte sonst noch aufgerufen werden. onModNetMessage wäre der Platz an dem es am besten passt.

    Zur zweiten Frage: Ja. Beim „aktiven Spieler“ wird sendModNetMessage aufgerufen und damit bei allen das Event ausgelöst.

  15. #3855
    Antiker Benutzer Avatar von BoggyB
    Registriert seit
    21.08.11
    Beiträge
    7.043
    Alles klar (hoff ich ), danke
    "Only Germans, perhaps, could make a game about economics - a stylish, intelligent and captivating one at that." - The New York Times

Seite 257 von 271 ErsteErste ... 157207247253254255256257258259260261267 ... LetzteLetzte

Berechtigungen

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