De- und Aktivieren von Spielerzug-Meldungen via STRG-P
Dafür ist die Bearbeitung von nur einer Datei notwendig: CvEventManager.py im Assets/Python-Ordner
(Hinweis: Das ist eine Python-Datei, also Vorsicht bei der Einrückung!)
Schritt 1: Definieren einer Variable, um festzustellen, ob die Spielermeldung aktiv ist oder nicht
In der Funktion def __init__(self): müssen diese Variablen definiert (initialisiert) werden:
Code:
self.bPAE_ShowMessagePlayerTurn = False
und damit der Spieler auch einen Hinweis bekommt, obs de/aktiviert ist (da die Spieler-ID wegen Szenarien abweichen kann, zu Beginn setzen wir die Variable auf 0, damit definieren wir sie als Zahl)
Code:
self.iPAE_ShowMessagePlayerHumanID = 0
Zusammen sieht diese Funktion so aus:
PHP-Code:
class CvEventManager:
def __init__(self):
#################### ON EVENT MAP ######################
# print "EVENTMANAGER INIT"
# In CvEventManager.__init__:
if CIV4_SHELL:
self.glob = globals()
self.loc = locals()
civ4Console.init()
# Show message which player is on turn
self.bPAE_ShowMessagePlayerTurn = False
self.iPAE_ShowMessagePlayerHumanID = 0
#[usw...]
Schritt 2: Definieren des Tastenkürzels STRG + P (das kann mit anderen Buchstaben auch gemacht werden)
Das muss in folgender Funktion gemacht werden:
Code:
def onKbdEvent(self, argsList):
Darin wird gecheckt, ob überhaupt eine Taste gedrückt wird:
Code:
if eventType == self.EventKeyDown:
theKey = int(key)
Dort vergleichen wir nun zuerst ob P und dann ob die STRG Taste gedrückt wird (das kann man auch umgekehrt prüfen)
Code:
if theKey == int(InputTypes.KB_P):
if self.bCtrl:
Und nun unsere Meldung:
Code:
if self.bPAE_ShowMessagePlayerTurn:
self.bPAE_ShowMessagePlayerTurn = False
CyInterface().addMessage(gc.getGame().getActivePlayer(), True, 5, CyTranslator().getText("TXT_KEY_MESSAGE_PAE_CIV_TURN_DEACTIVATED", ("",)), None, 2, None, ColorTypes(14), 0, 0, False, False)
else:
self.bPAE_ShowMessagePlayerTurn = True
self.iPAE_ShowMessagePlayerHumanID = gc.getGame().getActivePlayer()
CyInterface().addMessage(gc.getGame().getActivePlayer(), True, 5, CyTranslator().getText("TXT_KEY_MESSAGE_PAE_CIV_TURN_ACTIVATED", ("",)), None, 2, None, ColorTypes(14), 0, 0, False, False)
return 1
TXT_KEY_MESSAGE_PAE_CIV_TURN_DEACTIVATED und TXT_KEY_MESSAGE_PAE_CIV_TURN_ACTIVATED:
dieses CyTranslator().getText("TXT_KEY_MESSAGE_PAE_CIV_TURN_DEACTIVATED", ("",) könnt ihr auch ersetzen mit "Meldung deaktiviert" falls ihr es nicht in alle Sprachen übersetzt haben wollt und ihr diesen TXT_KEY in eine der XML-Textdateien schreiben möchtet.
Das würde dann einfacherweise so aussehen:
CyInterface().addMessage(gc.getGame().getActivePlayer(), True, 5, "Meldung deaktiviert"), None, 2, None, ColorTypes(14), 0, 0, False, False)
Das müsstet ihr dann mit TXT_KEY_MESSAGE_PAE_CIV_TURN_ACTIVATED dann auch so machen:
CyInterface().addMessage(gc.getGame().getActivePlayer(), True, 5, "Meldung aktiviert"), None, 2, None, ColorTypes(14), 0, 0, False, False)
Mit ColorTypes(14) könnt ihr die Farbe der Meldung ändern. Einfach den Zahlenwert verändern.
zB ColorTypes(2) ist weiß, ColorTypes(7) ist rot, hier die möglichen Farbwerte bei diesen Ingame-Meldungen:
# ColorTypes()
# 1,3 = schwarz
# 2 = weiss
# 4 = dunkelgrau
# 5,6 = grau
# 7 = rot
# 8 = gruen
# 9 = blau
# 10 = tuerkis
# 11 = gelb
# 12 = lila
# 13 = orange
# 14 = graublau
Mit return 1 verlässt ihr diese Funktion dann sofort wieder. (is ja klar, damit braucht man nicht mehr weiterprüfen, was gedrückt wird)
Gemeinsam sieht das so aus, wenn sonst nichts anderes drin steht:
PHP-Code:
#################### ON EVENTS ######################
def onKbdEvent(self, argsList):
'keypress handler - return 1 if the event was consumed'
eventType, key, mx, my, px, py = argsList
# game = gc.getGame()
if eventType == self.EventKeyDown:
theKey = int(key)
if theKey == int(InputTypes.KB_P):
if self.bCtrl:
if self.bPAE_ShowMessagePlayerTurn:
self.bPAE_ShowMessagePlayerTurn = False
CyInterface().addMessage(gc.getGame().getActivePlayer(), True, 5, CyTranslator().getText("TXT_KEY_MESSAGE_PAE_CIV_TURN_DEACTIVATED", ("",)), None, 2, None, ColorTypes(14), 0, 0, False, False)
else:
self.bPAE_ShowMessagePlayerTurn = True
self.iPAE_ShowMessagePlayerHumanID = gc.getGame().getActivePlayer()
CyInterface().addMessage(gc.getGame().getActivePlayer(), True, 5, CyTranslator().getText("TXT_KEY_MESSAGE_PAE_CIV_TURN_ACTIVATED", ("",)), None, 2, None, ColorTypes(14), 0, 0, False, False)
return 1
Eins ist dazu noch zu sagen:
Mit self.iPAE_ShowMessagePlayerHumanID = gc.getGame().getActivePlayer() schreibe ich in die self.iPAE_ShowMessagePlayerHumanID Variable (die ich zuvor in den __inits__ definiert habe) die aktuelle ID des Spielers.
Das wird dazu benötigt, dass auch nur der menschliche Spieler diese Meldungen angezeigt bekommen soll. Der KI bringts ja nix. Und wer schlampig programmiert, der könnte diese Variable auch weglassen und diese Meldungen immer dem gc.getGame().getActivePlayer() anzeigen lassen, dann ists aber wieder nicht für Multi-Player-Spiele geeignet!
Schritt 3: Das Anzeigen der Spieler während der Wartephase
Dazu müssen wir in die Funktion def onEndPlayerTurn, die so beginnt:
Code:
def onEndPlayerTurn(self, argsList):
'Called at the end of a players turn'
iGameTurn, iPlayer = argsList
pPlayer = gc.getPlayer(iPlayer)
Dort checken wir, ob die Meldung aktiv ist oder nicht:
Code:
if self.bPAE_ShowMessagePlayerTurn:
Da der aktuelle Spieler, der grad an der Reihe war, mit iPlayer in dieser Funktion verfügbar ist, definieren wir den nächsten Spieler mit:
Code:
showPlayer = iPlayer + 1
Nun wirds spannend. Zuerst überprüfe ich, ob der showPlayer-Wert den letzten Spieler (nach ID) überschritten hat und setze showPlayer auf 0, um den korrekten Spieler zu bekommen.
Beispiel: kann ja sein, dass ich von 18 Spielern die Spieler-ID 16 habe und bei Spieler 18 muss dann Spieler 0, nach Spieler 0 dann Spieler 1 usw. genannt werden.
Code:
if showPlayer >= gc.getMAX_PLAYERS():
showPlayer = 0
Desweiteren überprüfe ich, ob der Spieler noch am Spiel beteiligt ist. Mich interessiert ja nicht, einen bereits besiegten Spieler angezeigt zu bekommen:
(auch hier muss ich mit Spieler 0 fortsetzen, wenn ich die ID des höchsten Spielers erreicht habe)
Code:
while not gc.getPlayer(showPlayer).isAlive():
showPlayer += 1
if showPlayer >= gc.getMAX_PLAYERS():
showPlayer = 0
Und jetzt kümmern wir uns um die Meldung. Dazu brauche ich dessen Bezeichnung:
Code:
thisPlayer = gc.getPlayer(showPlayer).getCivilizationDescription(0)
Die Meldung hab ich in zwei Teile geteilt:
1. Hab ich den Cheat-Modus eingeschaltet (zB zum Testen), dann möcht ich alle Spieler aufgelistet bekommen, auch die, die meine CIV noch nicht getroffen hat
Code:
if self.bAllowCheats:
CyInterface().addMessage(self.iPAE_ShowMessagePlayerHumanID, True, 3, CyTranslator().getText("TXT_KEY_MESSAGE_PAE_CIV_TURN", (thisPlayer, "")), None, 2, None, ColorTypes(14), 0, 0, False, False)
2. Wenn ich normal spiele, dann möcht ich unterscheiden zwischen bekannten und unbekannten CIVs:
Code:
else:
iThisTeam = gc.getPlayer(showPlayer).getTeam()
if gc.getTeam(iThisTeam).isHasMet(pPlayer.getTeam()):
CyInterface().addMessage(self.iPAE_ShowMessagePlayerHumanID, True, 3, CyTranslator().getText("TXT_KEY_MESSAGE_PAE_CIV_TURN", (thisPlayer, "")), None, 2, None, ColorTypes(14), 0, 0, False, False)
else:
CyInterface().addMessage(self.iPAE_ShowMessagePlayerHumanID, True, 3, CyTranslator().getText("TXT_KEY_MESSAGE_PAE_CIV_TURN2", ("",)), None, 2, None, ColorTypes(14), 0, 0, False, False)
Dafür verwende ich 2 Texte:
TXT_KEY_MESSAGE_PAE_CIV_TURN = Spieler X sind am Zug. (zB Römer sind am Zug)
TXT_KEY_MESSAGE_PAE_CIV_TURN2 = Ein noch unbekannter Spieler ist am Zug.
Auch hier muss man die Texte nur dann als TXT_KEY einbauen, wenn man sie mehrsprachig anbieten möchte.
Alternativ siehts so aus:
CyInterface().addMessage(self.iPAE_ShowMessagePlayerHumanID, True, 3, u"%s sind am Zug." % thisPlayer), None, 2, None, ColorTypes(14), 0, 0, False, False)
und so:
CyInterface().addMessage(self.iPAE_ShowMessagePlayerHumanID, True, 3, "Ein unbekannter Spieler ist am Zug."), None, 2, None, ColorTypes(14), 0, 0, False, False)
Auch hier kann die Farbe mit einer anderen Zahl von 1 bis 14 angepasst werden.
Das ganze sieht dann so aus (falls nichts anderes drin steht):
PHP-Code:
def onEndPlayerTurn(self, argsList):
'Called at the end of a players turn'
iGameTurn, iPlayer = argsList
pPlayer = gc.getPlayer(iPlayer)
# ----- CHECK CIV on Turn
if self.bPAE_ShowMessagePlayerTurn:
showPlayer = iPlayer + 1
if showPlayer >= gc.getMAX_PLAYERS():
showPlayer = 0
while not gc.getPlayer(showPlayer).isAlive():
showPlayer += 1
if showPlayer >= gc.getMAX_PLAYERS():
showPlayer = 0
pShowPlayer = gc.getPlayer(showPlayer)
thisPlayer = pShowPlayer.getCivilizationDescription(0)
if self.bAllowCheats:
CyInterface().addMessage(self.iPAE_ShowMessagePlayerHumanID, True, 3, CyTranslator().getText("TXT_KEY_MESSAGE_PAE_CIV_TURN", (thisPlayer, "")), None, 2, None, ColorTypes(14), 0, 0, False, False)
else:
iThisTeam = gc.getPlayer(showPlayer).getTeam()
if gc.getTeam(iThisTeam).isHasMet(pPlayer.getTeam()):
CyInterface().addMessage(self.iPAE_ShowMessagePlayerHumanID, True, 3, CyTranslator().getText("TXT_KEY_MESSAGE_PAE_CIV_TURN", (thisPlayer, "")), None, 2, None, ColorTypes(14), 0, 0, False, False)
else:
CyInterface().addMessage(self.iPAE_ShowMessagePlayerHumanID, True, 3, CyTranslator().getText("TXT_KEY_MESSAGE_PAE_CIV_TURN2", ("",)), None, 2, None, ColorTypes(14), 0, 0, False, False)