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