Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level2:tribute

Dies ist eine alte Version des Dokuments!


Tribute

In diesem Artikel wird beschrieben, wie einem Spieler ein Tribut zur Verfügung gestellt werden kann, den er im F3-Menü unter einem einstellbaren Ressourceneinsatz bezahlen kann. Oft werden Ressourcen direkt eingetauscht, Truppen gekauft, Diplomatie verändert oder Tore geöffnet, sobald ein Tribut bezahlt wurde.

Damit die im Folgenden beschriebenen Codebeispiele funktionieren, muss sich folgende Komfortfunktion ebenfalls in deinem Skript befinden:

-- Komfortfunktion für das Bereitstellen von Tributen
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");
 
    -- Hier wird eine globale Variable gesetzt, die außerhalb dieser Funktion nicht manipuliert werden sollte
    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

Die Tribut-Handhabung wird dadurch deutlich erleichtert.


Einfache Tribute erstellen

Die oben gezeigte Funktion AddTribute(_tribute) hat nur einen Parameter _tribute. _tribute muss ein Table sein, das den zu erstellenden Tribut beschreibt. Ein Standard-Tribut hat nur wenige notwendige Parameter:

KeyValue-TypBedeutung
playerIdPlayer Id (Ganze Zahl 1-8)Spieler-Id des Spielers, der den Tribut bezahlen kann
textStringText, der im Tributmenü angezeigt wird. Er sollte die Kosten des Tributs und dessen Wirkung beschreiben
costTableDie Kosten des Tributs in einem assoziativen Table, bei dem der Ressourcentyp Key und die geforderte Menge Value ist (siehe auch die folgenden Beispiele)
CallbackFunktionFunktion, die aufgerufen wird, sobald der Tribut bezahlt wurde

Wichtig: Beachte bei den Keys des _tribute-Tables sowie des cost-Tables darin auf die korrekte Groß- und Kleinschreibung! Die ist leider nicht über alle Parameter hinweg konsistent.

In einem einfachen Tribut-Beispiel soll Spieler 1 die Eisengrube eines Verbündeten für 500 Gold und 300 Holz erstehen können. Die Eisengrube existiert auf der Karte und hat den Skriptnamen „IronMine“.

function CreateTributeBuyIronMine()
    local Tribute = {
        playerId = 1,
        text = "Für 500 Taler und 300 Holz erhaltet Ihr die Eisenmine Eures Verbündeten",
        cost = {
            -- Die Namen der Ressourcen werden groß geschrieben
            Gold = 500,
            Wood = 300
        },
        Callback = CallbackTributeBuyIronMine
    }
 
    AddTribute(Tribute)
end
 
function CallbackTributeBuyIronMine()
    -- ChangePlayer ändert den Spieler, dem diese Entity gehört
    -- Mehr dazu findest du in der Comfort-Referenz oder im Artikel zu "Belohnungen" auf Ebene 2
    ChangePlayer("IronMine", 1)
end

Wichtig: Es können maximal 6 Tribute gleichzeitig im F3-Menü angezeigt werden! Wenn du weitere Tribute hinzufügst, hat der Spieler keinen Zugriff mehr darauf.


Optionale Parameter

Die Verwendung einer Callback-Funktion erlaubt es dir, maximal flexibel auf die Entrichtung eines Tributs zu reagieren. Für einige Standardfälle gibt es allerdings vorgefertigte, optionale Parameter, die ein Standard-Callback automatisch generieren und ausführen.

Achtung: Diese optionalen Parameter sollten nur im Singleplayer benutzt werden!

KeyValue-TypBedeutung
Resources Table (assoziativ) Assoziatives Table, bei dem der Ressourcentyp Key und die geforderte Menge Value ist (Achtung: Keys hier kleingeschrieben!). Der Spieler erhält die angegebene Menge an Ressourcen
Technologies Table (Liste) Liste der Technologien, die beim Bezahlen des Tributs für den Spieler automatisch erforscht werden
Entity String oder Zahl Skriptname oder Entity-Id der Entity, die nach Bezahlung zum Spieler wechselt
Entities String Präfix eines Skriptnames, der durchnummeriert Entities bezeichnet, die nach Bezahlung zum Spieler wechseln (also zum Beispiel „Serf“ für „Serf1“, „Serf2“, usw.)
Ralleypoint String oder Zahl Skriptname oder Entity-Id der Entity, zu der die nach Bezahlung zum Spieler gewechselten Entities automatisch gehen (falls Siedler)
Spawn Table (Liste) Liste an Truppenbeschreibungen für Truppen, die nach der Bezahlung erscheinen sollen (siehe Einträge unterhalb)
Spawn[i].Pos String oder Zahl Für Truppenspawn: Skriptname oder Entity-Id der Entity, an deren Position Truppen spawnen sollen (pro Trupp)
Spawn[i].LeaderType Zahl (Leader Entity Type) Für Truppenspawn: Entity-Typ (Entities.) des zu spawnenden Hauptmanns (pro Trupp)
Spawn[i].Soldiers Ganze Zahl Für Truppenspawn: Anzahl der Soldaten für den Hauptmann
Spawn[i].Ralleypoint String oder Zahl Für Truppenspawn: Skriptname oder Entity-Id der Entity, zu der der gespawnte Trupp gehen soll (pro Trupp)
Spawn[i].AttackRalleypoint String oder Zahl Für Truppenspawn: Skriptname oder Entity-Id der Entity, deren Position der gespawnte Trupp angreifen soll (pro Trupp)

Hinweis: Für die Spawn-Option müssen pro Trupp alle Parameter angegeben werden, wobei die Ralleypoint und AttackRalleypoint-Optionen sich gegenseitig ausschließen.

Für jeden dieser optionalen Parameter wollen wir ein kleines Beispiel und dessen Voraussetzungen geben.

Ressourcentausch

Ein Händler bietet einen Tribut zum Tausch einer Ressource gegen eine andere an:

function CreateTributeBuyIron()
    local Tribute = {
        playerId = 1,
        text = "Für 500 Holz erhaltet Ihr 300 Eisen",
        cost = {
            Wood = 500
        },
        Resources = {
            -- Achtung! Die Keys der erhaltenen Ressourcen werden klein geschrieben!
            iron = 300
        }
    }
 
    AddTribute(Tribute)
end

Technologien per Tribut

Ein Dieb bietet an, die Technologie „Sabotieren“ zu verkaufen:

function CreateTributeBuySabotage()
    local Tribute = {
        playerId = 1,
        text = "Für 700 Taler und 400 Schwefel erhaltet Ihr die Technologie 'Sabotage'",
        cost = {
            Gold = 700,
            Sulfur = 400
        },
        Technologies = { Technologies.T_ThiefSabotage }
    }
 
    AddTribute(Tribute)
end

Einzelne Entities kaufen

Wie das Beispiel von ganz oben: Der Spieler kann eine Eisengrube erstehen. Sie hat den Skriptnamen „IronMine“ auf der Karte:

function CreateTributeBuyIronMine()
    local Tribute = {
        playerId = 1,
        text = "Für 500 Taler und 300 Holz erhaltet Ihr die Eisenmine Eures Verbündeten",
        cost = {
            Gold = 500,
            Wood = 300
        },
        Entity = "IronMine"
    }
 
    AddTribute(Tribute)
end

Mehrere Entities kaufen

Dario kauft sich zu Beginn einer Partie einige Leibeigene. Für das folgende Beispiel müssen auf der Karte eine Entity mit dem Skriptnamen „Dario“ existieren, sowie einige Leibeigene, die nach dem Schema „Serf1“, „Serf2“, usw. benannt sind.

function CreateTributeBuySerfs()
    local Tribute = {
        playerId = 1,
        text = "Für 200 Taler erhaltet Ihr einige Leibeigene",
        cost = {
            Gold = 200,
        },
        -- Alle Entities mit dem Namen "Serf"..i werden dem Spieler übergeben...
        Entities = "Serf",
        -- ...und laufen nach dem Kauf zu Dario
        Ralleypoint = "Dario"
    }
 
    AddTribute(Tribute)
end

Truppen kaufen

Dario holt sich bei einem befreundeten Dorf Verstärkung. Damit die Truppen eine Position zum Spawnen haben, sollte eine ScriptEntity angelegt werden, die wir hier „TroopSpawn“ nennen. Auch muss wieder ein „Dario“ auf der Karte sein, zu dem die Truppen laufen können.

function CreateTributeBuyTroops()
    local Tribute = {
        playerId = 1,
        text = "Für 800 Taler, 400 Holz und 200 Eisen erhaltet Ihr vom Nachbardorf einige Truppen zur Unterstützung",
        cost = {
            Gold = 800,
            Wood = 400,
            Iron = 200
        },
        -- Das Table Spawn ist eine Liste, in der die zu spawnenden Truppen nacheinander beschrieben sind
        Spawn = {
            -- Gespawnt werden:
            -- 1 Trupp Kurzschwertkämpfer
            { Pos = "TroopSpawn", LeaderType = Entities.PU_LeaderSword1, Soldiers = 4, Ralleypoint = "Dario" },
            -- 2 Truppen Kurzbogenschützen
            { Pos = "TroopSpawn", LeaderType = Entities.PU_LeaderBow1, Soldiers = 4, Ralleypoint = "Dario" },
            { Pos = "TroopSpawn", LeaderType = Entities.PU_LeaderBow1, Soldiers = 4, Ralleypoint = "Dario" },
            -- und 1 Trupp schwerer Reiter
            { Pos = "TroopSpawn", LeaderType = Entities.PU_LeaderHeavyCavalry1, Soldiers = 3, Ralleypoint = "Dario" }
        }
    }
 
    AddTribute(Tribute)
end

Tribute entfernen

Um Tribute wieder zu entfernen, wird die Funktion Logic.RemoveTribute(_PlayerId, _TributeId) verwendet.

Zusätzliche Parameter

scripting/tutorials/level2/tribute.1699547830.txt.gz · Zuletzt geändert: 2023/11/09 16:37 von fritz_98