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.
Mit CreateEntity(_PlayerId, _EntityType, _Position, _Name)
kann eine einzelne Entity erstellt werden. Die Parameter sind folgende:
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 ( link einfügen){X = x, Y = y}
. Die Funktion GetPosition
( link einfügen) ermittelt die Position einer bestehenden Entity in diesem FormatDie 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 ( link einfügen), wie das verhindert werden kann.
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.
Mit CreateMilitaryGroup(_PlayerId, _LeaderType, _Soldiers, _Position, _Name, _LookAt)
kann eine komplette Soldatentruppe erstellt werden. Die Parameter sind folgende:
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 ( link einfügen). Der Name des Entity-Typs muss das Wort „Leader“ enthalten{X = x, Y = y}
. Die Funktion GetPosition
( link einfügen) ermittelt die Position einer bestehenden Entity in diesem FormatDie Funktion gibt nicht die Entity-Id des erstellten Hauptmanns zurück. Wenn du der Truppe also beispielsweise einen Laufbefehl (Move bzw. AttackMove link einfügen) geben willst, musst du einen Skriptnamen angeben.
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.
Mit ChangePlayer(_Entity, _PlayerId)
kann der Spieler, dem eine Entity _Entity
gehört, verändert werden. Die Parameter sind folgende:
Wichtig: Beim Spielerwechsel ändert sich die Entity-Id der angegebenen Entity, aber nicht der Skriptname! Die Funktion gibt die neue Entity-Id zurück.
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)
Mit Destroy(_Entity)
kann eine Entity zerstört werden (also von der Map entfernt).Der Parameter ist folgender:
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
Mit ReplaceEntity(_Entity, _EntityType)
kann der Typ einer Entity _Entity
verändert werden. Die Parameter sind folgende:
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 ( 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.
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 ( link einfügen), wie das verhindert werden kann.
Mit SetHealth(_Entity, _Health)
kann die Menge der Lebenspunkte (in Prozent) für die Entity _Entity
gesetzt werden. Die Parameter sind folgende:
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