scripting:tutorials:level2:tribute
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Beide Seiten, vorherige ÜberarbeitungVorherige ÜberarbeitungNächste Überarbeitung | Vorherige Überarbeitung | ||
| scripting:tutorials:level2:tribute [2023/11/09 16:42] – fritz_98 | scripting: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) == " | + | assert(type(_Tribute) == " |
| - | assert(type(_tribute.text) == " | + | assert(type(_Tribute.Text) == " |
| - | assert(type(_tribute.cost) == " | + | assert(type(_Tribute.Cost) == " |
| - | assert(type(_tribute.playerId) == " | + | assert(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 | ||
| - | | + | |
| - | | + | |
| - | | + | |
| - | local tResCost | + | local CostTable |
| - | for k, v in pairs(_tribute.cost) do | + | for ResourceName, ResourceAmount |
| - | assert(ResourceType[k]); | + | assert(ResourceType[ResourceName], ResourceName .. " is not a valid resource" |
| - | assert(type(v) == " | + | assert((type(ResourceAmount) == " |
| - | table.insert(tResCost, ResourceType[k]); | + | table.insert(CostTable, ResourceType[ResourceName]) |
| - | table.insert(tResCost, v); | + | table.insert(CostTable, ResourceAmount) |
| 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 | + | return |
| end | end | ||
| </ | </ | ||
| Die Tribut-Handhabung wird dadurch deutlich erleichtert. | Die Tribut-Handhabung wird dadurch deutlich erleichtert. | ||
| + | |||
| + | **Hinweis**: | ||
| ---- | ---- | ||
| Zeile 38: | Zeile 39: | ||
| ====Einfache Tribute erstellen==== | ====Einfache Tribute erstellen==== | ||
| - | Die oben gezeigte Funktion '' | + | Die oben gezeigte Funktion '' |
| ^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, | + | |**Text**|String|Text, |
| - | |**cost**|Table|Die Kosten des Tributs in einem [[ scripting: | + | |**Cost**|Table|Die Kosten des Tributs in einem [[ scripting: |
| |**Callback**|Funktion|Funktion, | |**Callback**|Funktion|Funktion, | ||
| - | **Wichtig**: | ||
| 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 ''" | 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 ''" | ||
| Zeile 52: | Zeile 52: | ||
| function CreateTributeBuyIronMine() | function CreateTributeBuyIronMine() | ||
| local Tribute = { | local Tribute = { | ||
| - | | + | |
| - | | + | |
| - | | + | |
| -- 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 = { | ||
| - | | + | |
| - | | + | |
| - | | + | |
| Wood = 500 | Wood = 500 | ||
| }, | }, | ||
| Zeile 126: | Zeile 126: | ||
| function CreateTributeBuySabotage() | function CreateTributeBuySabotage() | ||
| local Tribute = { | local Tribute = { | ||
| - | | + | |
| - | | + | |
| - | | + | |
| Gold = 700, | Gold = 700, | ||
| Sulfur = 400 | Sulfur = 400 | ||
| Zeile 146: | Zeile 146: | ||
| function CreateTributeBuyIronMine() | function CreateTributeBuyIronMine() | ||
| local Tribute = { | local Tribute = { | ||
| - | | + | |
| - | | + | |
| - | | + | |
| Gold = 500, | Gold = 500, | ||
| Wood = 300 | Wood = 300 | ||
| Zeile 166: | Zeile 166: | ||
| function CreateTributeBuySerfs() | function CreateTributeBuySerfs() | ||
| local Tribute = { | local Tribute = { | ||
| - | | + | |
| - | | + | |
| - | | + | |
| Gold = 200, | Gold = 200, | ||
| }, | }, | ||
| Zeile 188: | Zeile 188: | ||
| function CreateTributeBuyTroops() | function CreateTributeBuyTroops() | ||
| local Tribute = { | local Tribute = { | ||
| - | | + | |
| - | | + | |
| - | | + | |
| Gold = 800, | Gold = 800, | ||
| Wood = 400, | Wood = 400, | ||
| Zeile 221: | Zeile 221: | ||
| function CreateTributeBuyIronMine() | function CreateTributeBuyIronMine() | ||
| local Tribute = { | local Tribute = { | ||
| - | | + | |
| - | | + | |
| - | | + | |
| - | -- 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 | ||
| </ | </ | ||
| Zeile 250: | Zeile 249: | ||
| ====Zusätzliche Parameter==== | ====Zusätzliche Parameter==== | ||
| + | |||
| + | Du kannst dem '' | ||
| + | |||
| + | 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] = " | ||
| + | [DifficultyModes.Normal] = " | ||
| + | [DifficultyModes.Hard] = " | ||
| + | [DifficultyModes.VeryHard] = "Sehr Schwer" | ||
| + | } | ||
| + | | ||
| + | -- Eine globale Variable soll später den gewählten Schwierigkeitsgrad ausdrücken, | ||
| + | -- 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, | ||
| + | -- ...also brauchen wir die Zahl, die ihn ausdrückt und seinen Namen, den wir im lokalen | ||
| + | -- Table festgehalten haben | ||
| + | local TributeId = CreateTributeDifficultyChoice(DifficultyMode, | ||
| + | -- Die Funktion CreateTributeDifficultyChoice gibt die Tribut-Id zurück, die wir im globalen | ||
| + | -- Table DifficultyTributeIds speichern | ||
| + | table.insert(DifficultyTributeIds, | ||
| + | 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, | ||
| + | local Tribute = { | ||
| + | PlayerId = 1, | ||
| + | -- Der Text benutzt einen der Parameter | ||
| + | Text = " | ||
| + | -- 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, | ||
| + | -- 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, | ||
| + | if TributeId ~= _Tribute.Tribute then | ||
| + | -- Alle Tribute waren für Spieler 1 | ||
| + | Logic.RemoveTribute(_Tribute.PlayerId, | ||
| + | end | ||
| + | end | ||
| + | | ||
| + | -- Hiernach sollte dann der Questablauf starten | ||
| + | end | ||
| + | </ | ||
| + | |||
| + | Später kann dann anhand der globalen Variable '' | ||
| + | |||
| + | <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, | ||
| + | end | ||
| + | end | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | Im nächsten Kapitel wird gezeigt, wie sich das Auftragsmenü füllen und verwalten lässt. | ||
| + | |||
| + | [[ scripting: | ||
| + | [[ scripting: | ||
| + | [[ scripting: | ||
scripting/tutorials/level2/tribute.1699548155.txt.gz · Zuletzt geändert: 2023/11/09 16:42 von fritz_98
