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.
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
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...
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.
Das werde ich mal ausprobieren. Danke.
Tick tock goes the clock...
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?
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
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)
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.Code:screen.setButtonGFC( "Hurry1", "", "", iBtnX, iBtnY, iBtnW, iBtnH, WidgetTypes.WIDGET_HURRY, 1, -1, ButtonStyles.BUTTON_STYLE_STANDARD )
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
Danach in CvMainInterface nach handleInput suchen und dort dann den Eventcode einfügen:Code:screen.setButtonGFC( "Hurry1", "", "", iBtnX, iBtnY, iBtnW, iBtnH, WidgetTypes.WIDGET_GENERAL, 12345, -1, ButtonStyles.BUTTON_STYLE_LABEL )
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): …
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
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
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.
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
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.
Irgendwie will das Programm mich ärgern. Wenn ich die Funktion ändere:
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?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; }
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
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
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
Variante mit WIDGET_GENERAL: Trage deine Widget-Id in CvGameUtils.py ein.
Beispiel:
Variante mit WIDGET_HURRY: Im SDK gibt es in CvDLLWidgetData.cppCode:def getWidgetHelp(self, argsList): eWidgetType, iData1, iData2, bOption = argsList if (iData1 == 302016): return localText.getText("TXT_KEY_MOD_UNPAUSE_DESC", ()) return u""
Damit müsstest du die richtige Stelle finden könnenCode:91 case WIDGET_HURRY: 92 parseHurryHelp(widgetDataStruct, szBuffer); 93 break;