Benutzer-Werkzeuge

Webseiten-Werkzeuge


tutorials:tribute

Tribute

Es kann einem Spieler ermöglicht werden ein Tribut, in Form einer Anzahl bestimmter Ressourcen, zu leisten, um bestimmte Dinge im Spielgeschehen zu beeinflussen. Die Tribute sind eigentlich für den Einzelspielermodus ausgelegt und deswegen im Mehrspielermodus deaktiviert. Es ist aber auch möglich, sie in Mehrspielerkarten einzubauen, dazu müssen sie dort wieder aktiviert werden.

Tribute werden normalerweise benutzt, um sich einen Verbündeten zu kaufen, also der Wechsel einer kleinen KI gesteuerten Stadt von „Neutral“ zu „Verbündet“. Dies kann natürlich auch über einen NPC (Bürgermeister der Stadt) erledigt werden. Über Tribute kann auch Verstärkung herbeigeholt, oder eine beliebige andere Aktion ausgeführt werden.

Normalerweise wird ein Tribut in der „finished“ Funktion eines Briefings erstellt. So wird dem Spieler mitgeteilt, daß es einen Tribut gibt den er entrichten kann. Manchmal macht es auch Sinn, ein weiteres Briefing zu starten nachdem der Tribut gezahlt wurde, um dem Spieler so die Auswirkungen zu verdeutlichen.

Verwendung

Im folgenden Beispiel wird ein einfacher Tribut erstellt. Nachdem der Spieler ihn bezahlt halt, wird eine Nachricht ausgegeben:

-- Callback Funktion für den Tribut. Der Name ist beliebig
function OnTestTributePaid()
	Message( "Bezahlt!" );
end
 
-- Tribut table erstellen
local tribute =  {};
 
-- Spieler 1 kann den Tribut bezahlen
tribute.playerId = 1;
 
-- Text der in der Tributliste angezeigt wird. Dieser sollte u.a. eine textuelle Beschreibung der Kosten enthalten
tribute.text = "Zahle 100 Gold und 200 Stein zu Testzwecken.";
 
-- Dieser Tribut besteht aus 100 Gold und 200 Stein. Weitere mögliche Ressourcen sind Iron, Clay, Sulfur und Wood
tribute.cost = { Gold = 100, Stone = 200 };
 
-- Diese Funktion wird aufgerufen, sobald der Spieler bezahlt hat.
tribute.Callback = OnTestTributePaid;
 
-- Tribut erstellen
AddTribute( tribute );


Möchte man einen Tribut wieder entfernen, wenn Beispielsweise die Stadt der der Tribut gezahlt werden soll zerstört wurde, muss man sich die TributID merken. Die letzte Zeile des vorherigen Beispiels wird dann so aussehen:

playerTestId = tribute.playerId;
tributeTestId =  AddTribute( tribute );

Nun kann man den Tribut, möglichst begleitet durch ein Briefing, später wieder so entfernen:

Logic.RemoveTribute( playerTestId, tributeTestId );

Hier eine Beispiel Karte dazu: Klick Hier

Aus der oben angegebenen Callback Funktion heraus können beliebige Aktionen als Reaktion auf die Zahlung ausgeführt werden. Es ist aber auch möglich, diverse Aktionen, die auf einen bezahlten Tribut folgen, etwas bequemer auszuführen. In diesem Fall braucht kein „Callback“ gesetzt werden, da die Aktion ja anders spezifiziert wird. Mehr dazu in den folgenden Beispielen

Weitere Beispiele

Dies sind nur die Abschnitte mit den relevanten Änderungen. Damit sie funktionieren, wird noch der Code aus dem obigen Beispiel benötigt. Die Callback Funtkion kann dabei weggelassen werden, da die Aktion hier ja anders festgelegt wird.

-- Spieler erhält nach Bezahlung die Möglichkeit auf dem Markt Eisen zu tauschen (Es wird durch den Tribut eine Handelsroute gesichert/ermöglicht)
tribute.Technologies = { Technologies.T_MarketIron };
-- Spieler erhält nach Bezahlung zwei Universitätstechnologien (von einer neutralen Stadt Technologien kaufen)
tribute.Technologies = { Technologies.GT_Alchemy, Technologies.GT_Tactics };
-- Spieler erhält 1000 Schwefel. Weitere mögliche Ressourcen sind gold, iron, clay, stone und wood
-- Dies kann zum Beispiel ein einmaliges Tauschangebot sein
tribute.Resources = { sulfur = 1000 };
-- Der Spieler erhält Kontrolle über einen Scout dessen Scriptname "Scout1" ist.
tribute.Entity = "Scout1";
-- Der Spieler erhält Kontrolle über die Einheiten "Scout1", "Scout2" und "Drake". Diese bewegen sich danach automatisch zur Position "Sammelpunkt"
tribute.Entity1 = "Scout1";
tribute.Entity2 = "Scout2";
tribute.Entity3 = "Drake";
tribute.Ralleypoint = "Sammelpunkt";
-- Für Spieler 2 wird eine Truppe mit Anführer und 3 einfachen Schwertkämpfern bei "Spawnpunkt" erstellt, die anschliessend zu "Sammelpunkt" läuft
tribute.SpawnPlayer = 2;
tribute.Spawn = {
	{ Pos = "Spawnpunkt", LeaderType = Entities.PU_LeaderSword1, Soldiers = 3 }
};
tribute.Ralleypoint = "Sammelpunkt";
-- Für Spieler 3 werden zwei Truppen mit starken 4 Schwertkämpfern und 8 schwachen Bogenschützen bei "Spawnpunkt" erstellt,
-- die anschliessend zu "Angriffspunkt" laufen, und alle Gegner auf ihrem Weg angreifen
tribute.SpawnPlayer = 3;
tribute.Spawn = {
	{ Pos = "Spawnpunkt", LeaderType = Entities.PU_LeaderSword4, Soldiers = 4 },
	{ Pos = "Spawnpunkt", LeaderType = Entities.PU_LeaderBow1, Soldiers = 8 }
};
tribute.AttackRalleypoint = "Angriffspunkt";
-- Für Spieler 4 werden 4 Truppen erstellt. Die ersten beiden Schwertkämpfer laufen zu "Sammelpunkt". Die Bogenschützen laufen zu "Alternativpunkt",
-- und die Gewehrschützen werden alle Gegner auf dem Weg zu "Angriffspunkt" angreifen
tribute.SpawnPlayer = 4;
tribute.Spawn = {
	{ Pos = "Spawnpunkt", LeaderType = Entities.PU_LeaderSword2, Soldiers = 6 },
	{ Pos = "Spawnpunkt", LeaderType = Entities.PU_LeaderSword4, Soldiers = 2 },
	{ Pos = "Spawnpunkt", LeaderType = Entities.PU_LeaderBow1, Soldiers = 8, RalleyPoint = "Alternativpunkt" },
    { Pos = "Spawnpunkt", LeaderType = Entities.PU_LeaderRifle1, Soldiers = 3, AttackRalleyPoint = "Angriffspunkt" }
};
tribute.Ralleypoint = "Sammelpunkt";

Benötigter Code

Da es bisher keine Comfort Funktion für Tribute gibt, habe ich eine erstellt. Dieser Code muss unverändert in das eigene Script kopiert werden, damit die Funktion nutzbar ist. Aufgrund des unpack Bugs funktioniert dieser Code erst ab Spielversion 1.05.

-- Comfort function for adding Tributes
function AddTribute( _tribute )
	assert( type( _tribute ) == "table", "Tribut muß ein Table sein" );
    assert( type( _tribute.text ) == "string", "Tribut.text muß ein String sein" );
    assert( type( _tribute.cost ) == "table", "Tribut.cost muß ein Table sein" );
	assert( type( _tribute.playerId ) == "number", "Tribut.playerId muß eine Nummer sein" );
	assert( not _tribute.Tribute , "Tribut.Tribute darf nicht vorbelegt sein");
 
	uniqueTributeCounter = uniqueTributeCounter or 1;
	_tribute.Tribute = uniqueTributeCounter;
	uniqueTributeCounter = uniqueTributeCounter + 1;
 
	local tResCost = {};
	for k, v in pairs( _tribute.cost ) do
		assert( ResourceType[k] );
		assert( type( v ) == "number" );
		table.insert( tResCost, ResourceType[k] );
		table.insert( tResCost, v );
	end
 
	Logic.AddTribute( _tribute.playerId, _tribute.Tribute, 0, 0, _tribute.text, unpack( tResCost ) );
	SetupTributePaid( _tribute );
 
	return _tribute.Tribute;
end

Multiplayer

Für den Multiplayer ist das bezahlen von Tributen eigentlich deaktivert. Man muß es also erst wieder aktiveren. Hierzu braucht einfach nur diese Funktion in das eigene Script kopiert werden:

function GameCallback_FulfillTribute()
    return 1
end

Die Funktion braucht nicht aufgerufen zu werden.

Zur Tutorial-Übersicht

tutorials/tribute.txt · Zuletzt geändert: 2021/09/18 19:16 (Externe Bearbeitung)