Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level2:tribute

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige ÜberarbeitungVorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
scripting:tutorials:level2:tribute [2023/11/09 16:42] fritz_98scripting:tutorials:level2:tribute [2023/11/30 09:28] (aktuell) fritz_98
Zeile 6: Zeile 6:
 <code lua> <code lua>
 -- Komfortfunktion für das Bereitstellen von Tributen -- Komfortfunktion für das Bereitstellen von Tributen
-function AddTribute(_tribute+function AddTribute(_Tribute
-    assert(type(_tribute) == "table", "Tribut muß ein Table sein"); +    assert(type(_Tribute) == "table", "Tribut must be a table, got .. type(_Tribute)
-    assert(type(_tribute.text) == "string", "Tribut.text muß ein String sein"); +    assert(type(_Tribute.Text) == "string", "Text must be a string, got .. type(_Tribute.Text)
-    assert(type(_tribute.cost) == "table", "Tribut.cost muß ein Table sein"); +    assert(type(_Tribute.Cost) == "table", "Cost must be a table, got .. type(_Tribute.Cost)
-    assert(type(_tribute.playerId) == "number", "Tribut.playerId muß eine Nummer sein"); +    assert(type(_Tribute.PlayerId) == "number", "PlayerId must be a numbergot " .. type(_Tribute.PlayerId))
-    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     -- Hier wird eine globale Variable gesetzt, die außerhalb dieser Funktion nicht manipuliert werden sollte
-    uniqueTributeCounter uniqueTributeCounter or 1; +    TributeIdCounter TributeIdCounter or 1 
-    _tribute.Tribute = uniqueTributeCounter; +    _Tribute.Tribute = TributeIdCounter 
-    uniqueTributeCounter uniqueTributeCounter + 1;+    TributeIdCounter TributeIdCounter + 1
  
-    local tResCost = {}; +    local CostTable = {} 
-    for kin pairs(_tribute.cost) do +    for ResourceNameResourceAmount in pairs(_Tribute.Cost) do 
-        assert(ResourceType[k]); +        assert(ResourceType[ResourceName], ResourceName .. " is not a valid resource"
-        assert(type(v) == "number"); +        assert((type(ResourceAmount) == "number"and (ResourceAmount >= 0), "Resource costs must be a positive number, got " .. ResourceName .. " = " .. type(ResourceAmount)) 
-        table.insert(tResCost, ResourceType[k]); +        table.insert(CostTable, ResourceType[ResourceName]) 
-        table.insert(tResCostv);+        table.insert(CostTableResourceAmount)
     end     end
  
-    Logic.AddTribute(_tribute.playerId_tribute.Tribute, 0, 0, _tribute.text, unpack(tResCost)); +    Logic.AddTribute(_Tribute.PlayerId_Tribute.Tribute, 0, 0, _Tribute.Text, unpack(CostTable)) 
-    SetupTributePaid(_tribute);+    SetupTributePaid(_Tribute)
  
-    return _tribute.Tribute;+    return _Tribute.Tribute
 end end
 </code> </code>
 Die Tribut-Handhabung wird dadurch deutlich erleichtert. Die Tribut-Handhabung wird dadurch deutlich erleichtert.
 +
 +**Hinweis**: Die Groß- und Kleinschreibung der Keys wurden in dieser Version der Komfortfunktion der der anderen Keys angepasst.
  
 ---- ----
Zeile 38: Zeile 39:
 ====Einfache Tribute erstellen==== ====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:+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:
  
 ^Key^Value-Typ^Bedeutung^ ^Key^Value-Typ^Bedeutung^
-|**playerId**|Player Id (Ganze Zahl 1-8)|Spieler-Id des Spielers, der den Tribut bezahlen kann| +|**PlayerId**|Player Id (Ganze Zahl 1-8)|Spieler-Id des Spielers, der den Tribut bezahlen kann| 
-|**text**|String|Text, der im Tributmenü angezeigt wird. Er sollte die Kosten des Tributs und dessen Wirkung beschreiben| +|**Text**|String|Text, der im Tributmenü angezeigt wird. Er sollte die Kosten des Tributs und dessen Wirkung beschreiben| 
-|**cost**|Table|Die Kosten des Tributs in einem [[ scripting:tutorials:level1:tables#tables_als_woerterbuecher|assoziativen Table]], bei dem der Ressourcentyp Key und die geforderte Menge Value ist (siehe auch die folgenden Beispiele)|+|**Cost**|Table|Die Kosten des Tributs in einem [[ scripting:tutorials:level1:tables#tables_als_woerterbuecher|assoziativen Table]], bei dem der Ressourcentyp Key und die geforderte Menge Value ist (siehe auch die folgenden Beispiele)|
 |**Callback**|Funktion|Funktion, die aufgerufen wird, sobald der Tribut bezahlt wurde| |**Callback**|Funktion|Funktion, 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"''. 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"''.
Zeile 52: Zeile 52:
 function CreateTributeBuyIronMine() function CreateTributeBuyIronMine()
     local Tribute = {     local Tribute = {
-        playerId = 1, +        PlayerId = 1, 
-        text = "Für 500 Taler und 300 Holz erhaltet Ihr die Eisenmine Eures Verbündeten", +        Text = "Für 500 Taler und 300 Holz erhaltet Ihr die Eisenmine Eures Verbündeten", 
-        cost = {+        Cost = {
             -- Die Namen der Ressourcen werden groß geschrieben             -- Die Namen der Ressourcen werden groß geschrieben
             Gold = 500,             Gold = 500,
Zeile 105: Zeile 105:
 function CreateTributeBuyIron() function CreateTributeBuyIron()
     local Tribute = {     local Tribute = {
-        playerId = 1, +        PlayerId = 1, 
-        text = "Für 500 Holz erhaltet Ihr 300 Eisen", +        Text = "Für 500 Holz erhaltet Ihr 300 Eisen", 
-        cost = {+        Cost = {
             Wood = 500             Wood = 500
         },         },
Zeile 126: Zeile 126:
 function CreateTributeBuySabotage() function CreateTributeBuySabotage()
     local Tribute = {     local Tribute = {
-        playerId = 1, +        PlayerId = 1, 
-        text = "Für 700 Taler und 400 Schwefel erhaltet Ihr die Technologie 'Sabotage'", +        Text = "Für 700 Taler und 400 Schwefel erhaltet Ihr die Technologie 'Sabotage'", 
-        cost = {+        Cost = {
             Gold = 700,             Gold = 700,
             Sulfur = 400             Sulfur = 400
Zeile 146: Zeile 146:
 function CreateTributeBuyIronMine() function CreateTributeBuyIronMine()
     local Tribute = {     local Tribute = {
-        playerId = 1, +        PlayerId = 1, 
-        text = "Für 500 Taler und 300 Holz erhaltet Ihr die Eisenmine Eures Verbündeten", +        Text = "Für 500 Taler und 300 Holz erhaltet Ihr die Eisenmine Eures Verbündeten", 
-        cost = {+        Cost = {
             Gold = 500,             Gold = 500,
             Wood = 300             Wood = 300
Zeile 166: Zeile 166:
 function CreateTributeBuySerfs() function CreateTributeBuySerfs()
     local Tribute = {     local Tribute = {
-        playerId = 1, +        PlayerId = 1, 
-        text = "Für 200 Taler erhaltet Ihr einige Leibeigene", +        Text = "Für 200 Taler erhaltet Ihr einige Leibeigene", 
-        cost = {+        Cost = {
             Gold = 200,             Gold = 200,
         },         },
Zeile 188: Zeile 188:
 function CreateTributeBuyTroops() function CreateTributeBuyTroops()
     local Tribute = {     local Tribute = {
-        playerId = 1, +        PlayerId = 1, 
-        text = "Für 800 Taler, 400 Holz und 200 Eisen erhaltet Ihr vom Nachbardorf einige Truppen zur Unterstützung", +        Text = "Für 800 Taler, 400 Holz und 200 Eisen erhaltet Ihr vom Nachbardorf einige Truppen zur Unterstützung", 
-        cost = {+        Cost = {
             Gold = 800,             Gold = 800,
             Wood = 400,             Wood = 400,
Zeile 221: Zeile 221:
 function CreateTributeBuyIronMine() function CreateTributeBuyIronMine()
     local Tribute = {     local Tribute = {
-        playerId = 1, +        PlayerId = 1, 
-        text = "Für 500 Taler und 300 Holz erhaltet Ihr die Eisenmine Eures Verbündeten", +        Text = "Für 500 Taler und 300 Holz erhaltet Ihr die Eisenmine Eures Verbündeten", 
-        cost = { +        Cost = {
-            -- Die Namen der Ressourcen werden groß geschrieben+
             Gold = 500,             Gold = 500,
             Wood = 300             Wood = 300
Zeile 231: Zeile 230:
     }     }
          
-    return Tribute.playerId, AddTribute(Tribute)+    return Tribute.PlayerId, AddTribute(Tribute)
 end end
 </code> </code>
Zeile 250: Zeile 249:
  
 ====Zusätzliche Parameter==== ====Zusätzliche Parameter====
 +
 +Du kannst dem ''_Tribute''-Table auch noch weitere Key-Value-Paare hinzufügen. Diese haben zwar keine automatische Auswirkung, können aber im Callback benutzt werden, da das gesamte ''_Tribute''-Table der Callback-Funktion als Parameter übergeben wird. Das ist in der Regel vor allem nützlich, wenn mehrere Tribute die gleiche Callback-Funktion nutzen.
 +
 +Auf diese Weise lässt sich zum Beispiel eine Schwierigkeitswahl definieren:
 +<code lua>
 +function InitDifficultyChoice()
 +    -- Wir geben den Schwierigkeitsgraden Namen, um sie später im Skript leichter identifizieren zu können
 +    DifficultyModes = {
 +        Easy = 1,
 +        Normal = 2,
 +        Hard = 3,
 +        VeryHard = 4
 +    }
 +    
 +    -- Jeder Schwierigkeitsgrad soll im Tribut als Name angezeigt werden können. Da diese Namen nur für die
 +    -- Tribute gebraucht werden und nicht global identifizierbar sein müssen, genügt es, dieses Table lokal
 +    -- zu definieren
 +    local DifficultyModeNames = {
 +        [DifficultyModes.Easy] = "Leicht",
 +        [DifficultyModes.Normal] = "Normal",
 +        [DifficultyModes.Hard] = "Schwer",
 +        [DifficultyModes.VeryHard] = "Sehr Schwer"
 +    }
 +    
 +    -- Eine globale Variable soll später den gewählten Schwierigkeitsgrad ausdrücken, deshalb setzen wir sie
 +    -- hier zurück
 +    -- 0 ist laut unserem DifficultyModes-Table noch kein gültiger Schwierigkeitsgrad
 +    Difficulty = 0
 +    
 +    -- Es soll nur einer der angebotenen Schwierigkeitsgrade ausgewählt werden können
 +    -- Wir speichern deshalb alle Tribute-Ids in einem Table zwischen
 +    -- Später werden alle Tribute außer der gewählte wieder entfernt
 +    DifficultyTributeIds = {}
 +    -- Für jeden Schwierigkeitsgrad soll ein Tribut angelegt werden...
 +    for DifficultyMode, DifficultyModeName in ipairs(DifficultyModeNames) do
 +        -- ...also brauchen wir die Zahl, die ihn ausdrückt und seinen Namen, den wir im lokalen
 +        -- Table festgehalten haben
 +        local TributeId = CreateTributeDifficultyChoice(DifficultyMode, DifficultyModeName)
 +        -- Die Funktion CreateTributeDifficultyChoice gibt die Tribut-Id zurück, die wir im globalen
 +        -- Table DifficultyTributeIds speichern
 +        table.insert(DifficultyTributeIds, TributeId)
 +    end
 +end
 +
 +-- Es reicht eine Funktion für alle Schwierigkeitsgrade
 +-- Für jeden Schwierigkeitsgrad muss nur der Zahlenwert und der Name angegeben werden
 +function CreateTributeDifficultyChoice(_DifficultyMode, _DifficultyName)
 +    local Tribute = {
 +        PlayerId = 1,
 +        -- Der Text benutzt einen der Parameter
 +        Text = "Wählt den Schwierigkeitsgrad " .. _DifficultyName,
 +        -- Die Wahl eines Schwierigkeitsgrades darf nichts kosten, deshalb setzen wir die Kosten
 +        -- einer beliebigen Ressource auf 0
 +        Cost = {
 +            Gold = 0
 +        },
 +        -- Hier speichern wir den Schwierigkeitsgrad, der zu dem Tribut gehört, mit in dem Tribut ab
 +        -- Im Callback können wir auf ihn zugreifen
 +        DifficultyMode = _DifficultyMode,
 +        Callback = CallbackTributeDifficultyChoice
 +    }
 + 
 +    -- Die Tribut-Id muss zurückgegeben werden, damit später alle Schwierigkeitsgradtribute wieder
 +    -- entfernt werden können, sobald einer davon ausgewählt wurde
 +    return AddTribute(Tribute)
 +end
 +
 +function CallbackTributeDifficultyChoice(_Tribute)
 +    -- Innerhalb dieser Funktion haben wir Zugriff auf das Table _Tribute, in dem alle Informationen, 
 +    -- die wir zur Definition des Tributs definiert haben, gespeichert sind
 +    -- _Tribute.DifficultyMode enthält deshalb den gewählten Schwierigkeitsgrad:
 +    Difficulty = _Tribute.DifficultyMode
 +    
 +    -- _Tribute.Tribute enhält außerdem die Tribut-Id des Tributs. Damit und dem DifficultyTributeIds-Table
 +    -- können wir die anderen Schwierigkeitstribute wieder entfernen
 +    for _, TributeId in ipairs(DifficultyTributeIds) do
 +        -- Lösche alle Tribute in DifficultyTributeIds, deren Id von der eigenen unterschiedlich ist
 +        if TributeId ~= _Tribute.Tribute then
 +            -- Alle Tribute waren für Spieler 1
 +            Logic.RemoveTribute(_Tribute.PlayerId, TributeId)
 +        end
 +    end
 +    
 +    -- Hiernach sollte dann der Questablauf starten
 +end
 +</code>
 +
 +Später kann dann anhand der globalen Variable ''Difficulty'' beispielsweise die Menge an Truppen für einen Computergegner gewählt werden:
 +
 +<code lua>
 +function SpawnEnemyHorsemen()
 +    local NumberOfTroops = 0
 +    if Difficulty == DifficultyModes.Easy then
 +        NumberOfTroops = 3
 +    elseif Difficulty == DifficultyModes.Normal then
 +        NumberOfTroops = 5
 +    elseif Difficulty == DifficultyModes.Hard then
 +        NumberOfTroops = 6
 +    elseif Difficulty == DifficultyModes.VeryHard then
 +        NumberOfTroops = 8
 +    end
 +    
 +    for i = 1, NumberOfTroops do
 +        CreateMilitaryGroup(2, Entities.PU_LeaderHeavyCavalry1, 3, GetPosition("EnemyHorsemenSpawn"))
 +    end
 +end
 +</code>
 +
 +----
 +
 +Im nächsten Kapitel wird gezeigt, wie sich das Auftragsmenü füllen und verwalten lässt.
 +
 +[[ scripting:tutorials:level2:find_entities | Voriges Kapitel: Spieler-Einheiten und -Gebäude finden ]] \\
 +[[ scripting:tutorials:level2:quest_menu | Nächstes Kapitel: Das Auftragsmenü ]] \\
 +[[ scripting:tutorials:level2:tribute | Zurück nach oben ]]
scripting/tutorials/level2/tribute.1699548155.txt.gz · Zuletzt geändert: 2023/11/09 16:42 von fritz_98