Noigi
Jedes Basis-Skript enthält ja die
function InitPlayerColorMapping() end
In der können den einzelnen Spielern Farben zugewiesen werden.
Wenn nun der menschliche Spieler ausnahmsweise nicht mit Blau, sondern mit Rot spielen soll; Spieler 2 soll Schwarz haben und Spieler 3 Dunkelgrün, dann sähe die Funktion so aus:
function InitPlayerColorMapping() Display.SetPlayerColorMapping(1,NEPHILIM_COLOR) Display.SetPlayerColorMapping(2,ROBBERS_COLOR) Display.SetPlayerColorMapping(3,EVIL_GOVERNOR_COLOR) end
Das ganze geht auch mit einem numerischem Wert von 1-16
function InitPlayerColorMapping() Display.SetPlayerColorMapping(1,5) Display.SetPlayerColorMapping(2,8) Display.SetPlayerColorMapping(3,16) end
Der folgende Hilfstable ist nach SpielerfarbenID indiziert.
Man kann die Farben aber auch per Farbenbezeichnung abrufen
gv_playercolortable = { "@color:15,64,255", "@color:226,0,0", "@color:235,255,53", "@color:0,235,209", "@color:252,164,39", "@color:178,2,255", "@color:255,79,200", "@color:115,209,65", "@color:0,140,2", "@color:184,184,184", "@color:184,182,90", "@color:136,136,136", "@color:230,230,230", "@color:57,57,57", "@color:139,232,255", "@color:255,150,214", Blau = "@color:15,64,255", Rot = "@color:226,0,0", Gelb = "@color:235,255,53", Tuerkis = "@color:0,235,209", Orange = "@color:252,164,39", Lila = "@color:178,2,255", Pink = "@color:255,79,200", Hellgruen = "@color:115,209,65", Dunkelgruen = "@color:0,140,2", Hellgrau = "@color:184,184,184", Beige = "@color:184,182,90", Dunkelgrau = "@color:136,136,136", Weiss = "@color:230,230,230", Schwarz = "@color:57,57,57", Himmelblau = "@color:139,232,255", Hellrosa = "@color:255,150,214"}
Es könnte die Spieler verwirren, in jeder neuen Map eine andere Farbe zu haben. Man sollte also zumindest das Verändern der Farbe des menschlichen Spielers nur in Maßen vornehmen.
Theoretisch kann man die Spielerfarben auch außerhalb der
function InitPlayerColorMapping() end
verändern. Beim Laden eines Spielstandes werden die Farben aber wieder auf die in der „function InitPlayerColorMapping()“ angegebenen Farben oder die Grundwerte der jeweiligen SpielerID zurückgesetzt.
Man sollte die Spielerfarben also generell nicht in anderen Funktionen verändern.
Ich habe einen kleinen Workaround geschrieben, mit dem man die Farben auch außerhald von
'InitPlayerColorMapping'
verändern kann. Dazu muss man unten stehenden Code irgendwo in das Script (nicht in eine Funktion!) einfügen und die Farbe mit „ChangePlayerColor“ ändern. Die Parameter sind die selben wie bei „Display.SetPlayerColorMapping“.
Beispiel:
ChangePlayerColor(1, NEPHILIM_COLOR)
Der Code:
Mit Kommentaren…
--Die originale Funktion 'Mission_OnSaveGameLoaded', die aufgerufen wird, wenn ein Spielstand geladen wurde, sichern OrigMission_OnSaveGameLoaded = Mission_OnSaveGameLoaded --Die Funktion 'Mission_OnSaveGameLoaded' überschreiben um eigene Funktionen direkt nach dem Laden eines Spielstands ausführen zu können function Mission_OnSaveGameLoaded() --Die originale Funktion aufrufen OrigMission_OnSaveGameLoaded() --Spielerfarben updaten UpdatePlayerColors() end --Diese Funktion prüft das Table 'ChangedPlayerColors' auf Einträge function UpdatePlayerColors() --wenn das Table existiert if type(ChangedPlayerColors) ~= "nil" then --für jede SpielerId ausprobieren for i=1, 8 do --ob es eine Änderung gab if ChangedPlayerColors[i] ~= nil then --falls ja, die Spielerfarbe entsprechend ändern Display.SetPlayerColorMapping(i,ChangedPlayerColors[i]) end end end end function ChangePlayerColor(_playerId, _color) --falls noch nicht passiert, globales Table mit den geänderten Farben erstellen if type(ChangedPlayerColors) == "nil" then ChangedPlayerColors = {} end --Farbe ändern Display.SetPlayerColorMapping(_playerId,_color) --geänderte Farbe speichern, um sie nach dem Laden eines Spielstands wiederherstellen zu können ChangedPlayerColors[_playerId] = _color end
… und ohne Kommentare
OrigMission_OnSaveGameLoaded = Mission_OnSaveGameLoaded function Mission_OnSaveGameLoaded() OrigMission_OnSaveGameLoaded() UpdatePlayerColors() end function UpdatePlayerColors() if type(ChangedPlayerColors) ~= "nil" then for i=1, 8 do if ChangedPlayerColors[i] ~= nil then Display.SetPlayerColorMapping(i,ChangedPlayerColors[i]) end end end end function ChangePlayerColor(_playerId, _color) if type(ChangedPlayerColors) == "nil" then ChangedPlayerColors = {} end Display.SetPlayerColorMapping(_playerId,_color) ChangedPlayerColors[_playerId] = _color end
Workaround by Katmai300
Zur Tutorial-Übersicht