Benutzer-Werkzeuge

Webseiten-Werkzeuge


scripting:tutorials:level2:rewards

Belohnungen

FIXME dieser Artikel gehört zwischen SetupQuest und GetEntities

In vorigen Kapiteln wurde vorgestellt, wie man NPCs erstellt und Questbedingungen prüft. Verknüpft an die Erfüllung von Quests sind häufig Belohnungen - seien sie direkt greifbar, wie beispielsweise Ressourcen oder Progress-Belohnungen, wie ein sich öffnendes Tor.

Natürlich eignen sich die Funktionen, die die Spielvoraussetzungen definieren bereits, den Spieler zu belohnen. In diesem Artikel beleuchten wir einige weitere Funktionen, die auf erfüllte Quests folgen können.


CreateEntity

Mit CreateEntity(_PlayerId, _EntityType, _Position, _Name) kann eine einzelne Entity erstellt werden. Die Parameter sind folgende:

  1. _PlayerId - Die Spieler-Id der Entity, also eine ganze Zahl zwischen 0 und 8. Für Doodads, also Bäume, Steine, etc. sollte immer 0 verwendet werden, sonst eine Spieler-Id zwischen 1 und 8
  2. _EntityType - Der Entity-Typ der Entity, also ein Eintrag im Entities-Table. Technisch gesehen ist der Entity-Typ eine Zahl, der durch das interne Entities-Table besser lesbar gemacht wird. Eine Übersicht findest du hier (FIXME link einfügen)
  3. _Position - Die Position, an der das Entity erstellt werden soll, als Table im Format {X = x, Y = y}. Die Funktion GetPosition (FIXME link einfügen) ermittelt die Position einer bestehenden Entity in diesem Format
  4. _Name - Der Skriptname der zu erstellenden Entity als String. Dieser Parameter ist optional

Die Funktion gibt die Entity-Id der erstellten Entity zurück. Der Rotationswinkel der erstellten Entity ist zufällig.

Hinweis: CreateEntity eignet sich nicht, um komplette Truppen zu spawnen. Siehe dazu CreateMilitaryGroup weiter unten.

Hinweis: Wenn du mit CreateEntity beispielsweise neue Dorfzentren mit Spieler 0 auf die Karte setzen willst, wird das einen Fehler auslösen. Siehe Häufige Fehler (FIXME link einfügen), wie das verhindert werden kann.

Beispiel

Wenn der Spieler nach einer erfüllten Quest einen neuen Kundschafter erhalten soll, kann das so aussehen:

CreateEntity(1, Entities.PU_Scout, GetPosition("ScoutSpawn"))

Damit das funktioniert, muss auf der Karte eine ScriptEntity mit dem Namen „ScoutSpawn“ existieren.

Achtung: Wenn du auf diese Weise neue Einheiten kreierst, stelle sicher, dass der Bereich um den Spawnpunkt nicht blockiert ist (zum Beispiel von vom Spieler errichteten Gebäuden). Es bietet sich an, solche Spawnpunkte in unbebaubare Gebiete zu setzen, bzw. in den vom Grid im Editor grün dargestellten Randbereich von bereits existieren Gebäuden.


CreateMilitaryGroup

Mit CreateMilitaryGroup(_PlayerId, _LeaderType, _Soldiers, _Position, _Name, _LookAt) kann eine komplette Soldatentruppe erstellt werden. Die Parameter sind folgende:

  1. _PlayerId - Die Spieler-Id der Truppe, also eine ganze Zahl zwischen 1 und 8
  2. _LeaderType - Der Entity-Typ des Hauptmanns, also ein Eintrag im Entities-Table. Technisch gesehen ist der Entity-Typ eine Zahl, der durch das interne Entities-Table besser lesbar gemacht wird. Eine Übersicht findest du hier (FIXME link einfügen). Der Name des Entity-Typs muss das Wort „Leader“ enthalten
  3. _Soldiers - Die Anzahl der Soldaten, die die Truppe erhalten soll (durch den Leader-Typ nach oben begrenzt)
  4. _Position - Die Position, an der die Truppe erstellt werden soll, als Table im Format {X = x, Y = y}. Die Funktion GetPosition (FIXME link einfügen) ermittelt die Position einer bestehenden Entity in diesem Format
  5. _Name - Der Skriptname des zu erstellenden Hauptmanns als String. Dieser Parameter ist optional
  6. _LookAt - Skriptname der Entity, auf die die neu erstellte Truppe ausgerichtet sein soll. Dieser Parameter ist optional

Die Funktion gibt nicht die Entity-Id des erstellten Hauptmanns zurück. Wenn du der Truppe also beispielsweise einen Laufbefehl (Move bzw. AttackMove FIXME link einfügen) geben willst, musst du einen Skriptnamen angeben.

Beispiel

Eine Arena hat zwei Spawnpunkte „ArenaSpawnLeft“ und „ArenaSpawnRight“, wo ein Schaukampf zwischen Spieler 1 und 2 stattfinden soll (Spieler 1 und 2 müssen untereinander verfeindet sein):

CreateMilitaryGroup(1, Entities.LeaderSword2, 4, GetPosition("ArenaSpawnLeft"), nil, "ArenaSpawnRight")
CreateMilitaryGroup(2, Entities.LeaderSword2, 4, GetPosition("ArenaSpawnRight"), nil, "ArenaSpawnLeft")

Achtung: Wenn du auf diese Weise neue Einheiten kreierst, stelle sicher, dass der Bereich um den Spawnpunkt nicht blockiert ist (zum Beispiel von vom Spieler errichteten Gebäuden). Es bietet sich an, solche Spawnpunkte in unbebaubare Gebiete zu setzen, bzw. in den vom Grid im Editor grün dargestellten Randbereich von bereits existieren Gebäuden.


ChangePlayer

Mit ChangePlayer(_Entity, _PlayerId) kann der Spieler, dem eine Entity _Entity gehört, verändert werden. Die Parameter sind folgende:

  1. _Entity - Skriptname oder Entity-Id der Entity, deren Spieler geändert werden soll
  2. _PlayerId - Neue Spieler-Id der Entity, also eine ganze Zahl zwischen 1 und 8

Wichtig: Beim Spielerwechsel ändert sich die Entity-Id der angegebenen Entity, aber nicht der Skriptname! Die Funktion gibt die neue Entity-Id zurück.

Beispiel

Nach Erfüllung einer Quest oder Bezahlung eines Tributs soll der Spieler ein bereits bestehendes Dorfzentrum eines anderen Spielers erhalten. Das Dorfzentrum hat den Skriptnamen „VillageCenter“.

ChangePlayer("VillageCenter", 1)

DestroyEntity

Mit Destroy(_Entity) kann eine Entity zerstört werden (also von der Map entfernt).Der Parameter ist folgender:

  1. _Entity - Skriptname oder Entity-Id der Entity, die zerstört werden soll

Beispiel

Nach der Erfüllung einer Quest räumt ein Arbeiter für den Spieler den Weg frei, der von einigen Steinen blockiert wird. Sind auf der Karte vier Steine mit durchnummerierten Skriptnamen „Rock1“..„Rock4“ platziert, lassen sie sich so in einer Schleife entfernen:

for i = 1, 4 do
    -- da die Steine alle nach dem gleichen Schema benannt sind, können wir eine Schleife zu
    -- deren Zerstörung benutzen
    DestroyEntity("Rock"..i)
end

ReplaceEntity

Mit ReplaceEntity(_Entity, _EntityType) kann der Typ einer Entity _Entity verändert werden. Die Parameter sind folgende:

  1. _Entity - Skriptname oder Entity-Id der Entity, deren Spieler geändert werden soll
  2. _EntityType - Der neue Entity-Typ der Entity, also ein Eintrag im Entities-Table. Technisch gesehen ist der Entity-Typ eine Zahl, der durch das interne Entities-Table besser lesbar gemacht wird. Eine Übersicht findest du hier (FIXME link einfügen)

Wichtig: Beim Ersetzen des Entity-Typs ändert sich die Entity-Id der angegebenen Entity, aber nicht der Skriptname! Die Funktion gibt die neue Entity-Id zurück.

Beispiel

Die wohl häufigste Anwendung findet diese Funktion beim Öffnen und Schließen von Toren. Auch das Heben und Senken von Zugbrücken lässt sich damit realisieren.

Wir gehen in den folgenden Beispielen davon aus, dass auf der Karte ein XD_WallStraightGate mit dem Namen „StoneGate“, ein XD_PalisadeGate1 mit dem Namen „PalisadeGate“ und eine XD_DrawBridgeOpen1 mit dem Namen „DrawBridge“ existieren.

Die Kommentare im Codebeispiel beschreiben, was der jeweilige ReplaceEntity-Aufruf bewirkt.

-- Schließe das Steintor
ReplaceEntity("StoneGate", Entities.XD_WallStraightGate_Closed)
 
-- Öffne das Steintor
ReplaceEntity("StoneGate", Entities.XD_WallStraightGate)
 
-- Öffne das Palisadentor
ReplaceEntity("PalisadeGate", Entities.XD_PalisadeGate2)
 
-- Schließe das Palisadentor
ReplaceEntity("PalisadeGate", Entities.XD_PalisadeGate1)
 
-- Schließe die Zugbrücke
ReplaceEntity("DrawBridge", Entities.PB_DrawBridgeClosed1)
 
-- Öffne die Zugbrücke
ReplaceEntity("DrawBridge", Entities.XD_DrawBridgeOpen1)

Hinweis: Wenn du mit ReplaceEntity beispielsweise die Zugrücke schließt, wird das einen Fehler auslösen. Der Grund ist der gleiche wie beim Erstellen von Gebäuden mit Spieler 0 mittels CreateEntity. Siehe Häufige Fehler (FIXME link einfügen), wie das verhindert werden kann.


SetHealth

Mit SetHealth(_Entity, _Health) kann die Menge der Lebenspunkte (in Prozent) für die Entity _Entity gesetzt werden. Die Parameter sind folgende:

  1. _Entity - Skriptname oder Entity-Id der Entity, deren Lebenspunkt geändert werden sollen
  2. _Health - Menge der Lebenspunkte in Prozent. 100 bedeutet vollständig gesund, 0 bedeutet tot

Beispiel

Nach der Erfüllung einer Quest bietet ein Heiler an, Dario (Skriptname „Dario“) vollständig zu heilen:

SetHealth("Dario", 100)

Ein Saboteur kann gegen einen Gefallen das feindliche Haupthaus (Skriptname „Player2“) empfindlich schwächen:

SetHealth("Player2", 40)

Im nächsten Kapitel verlassen wir kurzzeitig den Comfort-Layer und betrachten einige Logic.-Funktionen, um die Karte nach bestimmten Entities absuchen zu können.

Voriges Kapitel: Orte erreichen, Gebäude bauen, Gegner besiegen
Nächstes Kapitel: Spieler-Einheiten und -Gebäude finden
Zurück nach oben

scripting/tutorials/level2/rewards.txt · Zuletzt geändert: 2023/11/11 12:02 von fritz_98