Inhaltsverzeichnis

Spielerfarben ändern

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

Liste der Farben

Nummer 1 2
Bezeichner PLAYER_COLOR NEPHILIM_COLOR
RGB 15,64,255 226,0,0
Screenshot


Nummer 3 4
Bezeichner FRIENDLY_COLOR2 ENEMY_COLOR2
RGB 235,255,53 0,235,209
Screenshot


Nummer 5 6
Bezeichner FRIENDLY_COLOR1 ENEMY_COLOR1
RGB 252,164,39 178,2,255
Screenshot


Nummer 7 8
Bezeichner
RGB 255,79,200 115,209,65
Screenshot


Nummer 9 10
Bezeichner EVIL_GOVERNOR_COLOR
RGB 0,140,2 184,184,184
Screenshot


Nummer 11 12
Bezeichner NPC_COLOR KERBEROS_COLOR
RGB 184,182,90 136,136,136
Screenshot


Nummer 13 14
Bezeichner FRIENDLY_COLOR3 ROBBERS_COLOR
RGB 230,230,230 57,57,57
Screenshot


Nummer 15 16
Bezeichner
RGB 139,232,255 255,150,214
Screenshot

Spielerfarben Table

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"}

Nicht zu bunt...

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.

Bug beim Laden eines Spielstandes

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.

Workaround für den Bug

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