Seite 268 von 271 ErsteErste ... 168218258264265266267268269270271 LetzteLetzte
Ergebnis 4.006 bis 4.020 von 4063

Thema: Der Pythonthread

  1. #4006
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.918
    Könnte sein, dass das gemacht wird, damit die Civ nicht sofort stirbt. Civs ohne Stadt gelten ja als besiegt, wenn man nicht mit "Komplette Vernichtung fordern" spielt.
    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

  2. #4007
    Whovian Avatar von antriot
    Registriert seit
    30.09.12
    Ort
    TARDIS Type 40
    Beiträge
    2.641
    Ich habe einen plot und möchte die nächstliegende eigene Stadt herausfinden. Gibt es dafür eine direkte Funktion oder muss ich mir sowas selbst schreiben?
    Tick tock goes the clock...

  3. #4008
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    In CyMap gibt es die Funktion findCity
    Code:
    CyCity findCity (INT iX, INT iY, PlayerType eOwner, TeamType eTeam, BOOL bSameArea, BOOL bCoastalOnly, TeamType eTeamAtWarWith, DirectionType eDirection, CyCity pSkipCity)
    .

    Damit müsste es gehen.

  4. #4009
    Whovian Avatar von antriot
    Registriert seit
    30.09.12
    Ort
    TARDIS Type 40
    Beiträge
    2.641
    Das werde ich mal ausprobieren. Danke.
    Tick tock goes the clock...

  5. #4010
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.918
    Ich habe eine Frage, wobei ich nicht weiß, ob es hier jemanden gibt, der so etwas schon einmal gemacht hat.
    Gesetzt den Fall, ich würde in SDK eine Funktion programmiert haben, die einen bestimmte Namen hat ( pCity.Hire() ) - das wäre für mich nicht das Problem - und ich möchte in der Stadtansicht einen Button machen, der auswählbar ist wie jetzt der Rekrutierungsbutton - weiß jemand, wie das geht? Ich müsste ja irgendwie die Schaltfläche des bisherigen Buttons halbieren oder eine neue Schaltfläche darüber setzen, und damit optimalerweise auch eine aussagefähige Buttongrafik verknüpfen. Hat schon einmal jemand etwas in der Art gemacht?
    Angehängte Grafiken Angehängte Grafiken
    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

  6. #4011
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Dazu musst du drei weitere Sachen programmieren:

    1. Deine SDK-Funktion muss auch per Python erreichbar sein. Da du dich damit wahrscheinlich auskennst, will ich das nicht weiter erklären

    2. Eine Buttongrafik (DDS) muss erstellt werden (Einzelne Datei oder in eine dieser Sammel-DDS-Dateien) und sie in den XML-Art-Dateien eingetragen werden. (Details müsste ich selber recherchieren…)

    3. Die Buttongrafik muss in Screens/CvMainInterface.py eingefügt werden. Diese Datei enthält, anders als es der Name vermuten lässt, auch den Stadtbildschirm. Dazu am besten den Text nach dem Rekrutierungsbutton durchsuchen (Hurry1)

    Code:
    screen.setButtonGFC( "Hurry1", "", "", iBtnX, iBtnY, iBtnW, iBtnH, 
    WidgetTypes.WIDGET_HURRY, 1, -1, ButtonStyles.BUTTON_STYLE_STANDARD )
    Die Events beim Klicken können entweder im SDK abgeabeitet werden oder im Pythoncode. Da weiß ich jetzt nicht, was für dich geeigneter ist.

    WIDGET_HURRY ist ein Beispiel für Variante A. Wann du danach im Code suchst, wirst du sehen, dass das zweite Argument (-1) nie benutzt wird. Da könntest du z.B. eine Weiche für deinen Code einbauen. (Dann musst du kein eigenes Widget definieren.)

    Willst du den Event in Python bearbeiten empfiehlt sich WIDGET_GENERAL
    Code:
     screen.setButtonGFC( "Hurry1", "", "", iBtnX, iBtnY, iBtnW, iBtnH, 
    WidgetTypes.WIDGET_GENERAL, 12345, -1, ButtonStyles.BUTTON_STYLE_LABEL )
    Danach in CvMainInterface nach handleInput suchen und dort dann den Eventcode einfügen:

    Code:
    	# Will handle the input for this screen...
    	def handleInput (self, inputClass):
    ## Score Board ##
    		if inputClass.getNotifyCode() == NotifyCode.NOTIFY_CLICKED:
    			if inputClass.getFunctionName() == "ScoreRowPlus":
    				self.iScoreRows += 5
    				self.updateScoreStrings()
                             …
    			elif (inputClass.getData1() == 12345):
                                …

  7. #4012
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.918
    Danke schon einmal für deine Antwort. Da das Thema komplex ist, wie zu erwarten war, werde ich frühstens am Wochenende einen Versuch starten, das auch umzusetzen. Fragen geht schnell, aber die Antwort zu bearbeiten 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

  8. #4013
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.918
    Leider scheitere ich an etwas anderem. Die Erstellung der eigentlichen Funktion in SDK ist doch nicht so einfach, wie ich gehofft habe. Erst wollte ich es so ähnlich machen wie bei "Conscript", aber da waren mir viel zu viele Funktionen berührt.
    Also habe ich versucht, einen neuen Hurry-Type zu definieren, stehe aber vor dem Problem, dass dieser nur eine angefangene Produktion beschleunigt und nicht, wie ich es wollte, eine neue Einheit unabhängig von der aktuellen Produktion erzeugt. Ich denke zwar immer noch, dass das der einfachere Weg ist, aber ich habe gerade keinen Plan, wie ich das vernünftig machen soll. Ich muss vermutlich nur eine weitere Variable definieren, aber ich habe gerade einen Knoten im Gehirn.
    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

  9. #4014
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Kannst du in dem Fall, Einheit unabhängig von der Produktion, nicht einfach die Standard-Methode mit initUnit(...) benutzen?

    Wenn du dann noch eine Art Timer brauchst, damit die Aktion nicht sofort wieder ausgeführt werden kann: Da müsstest du Beispiele in CvCity::doTurn finden. Da gibt es schon viele Counter, die jede Runde um eins gesenkt werden.

  10. #4015
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.918
    Das Problem ist, dass ich ja dem Programm sagen muss, wann es das InitUnit aufrufen soll.
    initUnit() wird irgendwann kommen, aber ich muss ja irgendeine Funktion schreiben, die bestimmt, was für eine Unit es wird, die Kosten berechnet,..., und die sich dann mit dem Widget verknüpfen lässt. Mein erster Versuch sollte ein stupides kopieren und anpassen der-Conscript Funktion sein, aber was da alles dranhängt, das war mir zu viel Arbeit.

    Wenn ich mit einer Variante von Hurry arbeite, und das ist immer noch mein Ziel, muss ich ihm irgendwo sagen:
    Vergiss die aktuelle Produktion, nimm einfach Unitclass X (in Abhängigkeit vom Tech-Level), berechne die Kosten, zieh sie ab und dann initUnit(). An dieser Stelle bin ich noch am tüfteln, wie ich sie ohne viele neue Unterfunktionen einbaue. Ich fange bei CvCity::canHurry(...) an uns muss irgendwo meine Abweichung einbauen. Ich denke, das schaffe ich, aber ich muss meine Gedanken noch einmal aufräumen.
    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

  11. #4016
    Registrierter Benutzer
    Registriert seit
    21.03.12
    Beiträge
    22.397
    Schreib doch mal die Regeln hier rein, die du gern umgesetzt hättest. Bisher klingt es schon ziemlich nach conscript und damit wär es am einfachsten, der Implementierung da zu folgen.

  12. #4017
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.918
    Irgendwie will das Programm mich ärgern. Wenn ich die Funktion ändere:
    Code:
    bool CvCity::canHurry(HurryTypes eHurry, bool bTestVisible) const
    {
    	if (!(GET_PLAYER(getOwnerINLINE()).canHurry(eHurry)))
    	{
    		return false;
    	}
    
    	if (isDisorder())
    	{
    		return false;
    	}
    
    	if (getProduction() >= getProductionNeeded())
    	{
    		//Kathy: Nicht für Hiring, da hier eine separate Unit erschaffen wird
    		if ( !GC.getHurryInfo(eHurry).isInstantNewUnit() )
    		{
    			return false;
    		}
    		//Kathy: Nicht für Hiring, da hier eine separate Unit erschaffen wird
    //		return false; Original Code
    	}
    
    	if (!bTestVisible)
    	{
    		if (!isProductionUnit() && !isProductionBuilding())
    		{
    			return false;
    		}
    
    		if (GET_PLAYER(getOwnerINLINE()).getGold() < hurryGold(eHurry))
    		{
    			return false;
    		}
    
    		if (maxHurryPopulation() < hurryPopulation(eHurry))
    		{
    			return false;
    		}
    	}
    
    	return true;
    	
    }
    wird immer die letzte } (und bei allen nachfolgenden auch, aber nicht davor) unterkringelt, und C++ sagt "Es wurde eine Deklaration erwartet". Das bleibt auch so, wenn ich meinen Teil mit /* ... */ auskommentiere. Dadurch wird aber bei späteren Funktionen nicht mehr korrekt geprüft. Ist da irgendwo ein offensichtlicher Fehler, den ich nicht sehe?

    Edit: jetzt ist es weg, verstehe das wer will.
    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

  13. #4018
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.918
    Den SDK-Teil habe ich jetzt scheinbar fertig, war ein wenig weniger Arbeit, als die ganze Funktionen von Conscript zu kopieren. Ob das sauber läuft, muss ich noch sehen - und ob ich eventuell Einschränkungen einbaue (derzeit ist das Feature so oft nutzbar, wie man Gold hat).
    Getestet ist natürlich noch nichts, da ich jetzt erst mit dem Anfange, was Ramkhamhaeng oben geschrieben hat.
    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

  14. #4019
    Moderator Avatar von Kathy
    Registriert seit
    11.10.07
    Beiträge
    16.918
    Soweit hat es geklappt. Der Button macht, was er soll. Was ich allerdings noch anpassen muss, ist der Text und der Button. Zwar wird der korrekte Goldbetrag genannt, aber noch steht da "Palisade beschleunigen" (der Text der normalen Gold-Beschleunigung) statt "... Rekrutieren". Ist ja auch irgendwie klar, nur ist es nicht korrekt.
    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

  15. #4020
    ε•ω=1 Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    9.896
    Variante mit WIDGET_GENERAL: Trage deine Widget-Id in CvGameUtils.py ein.
    Beispiel:
    Code:
    	def getWidgetHelp(self, argsList):
    		eWidgetType, iData1, iData2, bOption = argsList
    		if (iData1 == 302016):
    			return localText.getText("TXT_KEY_MOD_UNPAUSE_DESC", ())
    		return u""
    Variante mit WIDGET_HURRY: Im SDK gibt es in CvDLLWidgetData.cpp
    Code:
      91   case WIDGET_HURRY:
      92     parseHurryHelp(widgetDataStruct, szBuffer);
      93     break;
    Damit müsstest du die richtige Stelle finden können

Seite 268 von 271 ErsteErste ... 168218258264265266267268269270271 LetzteLetzte

Berechtigungen

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