Schatzkisten sind im Game sehr beliebt. Es ist auch sinnvoll, wenn der Spieler praktisch bei Null anfangen muss, sein Dorf aufzubauen. Es ist dann eine nette Geste, wenn man dem Spieler ein paar zusätzliche Dinge zukommen lässt.
CreateRandomGoldChest(GetPosition("chestOne"))
Dieser Code muss in die FirstMapAction eingefügt werden. Und eine „ScriptEntity“ mit Namen „chestOne“ muss erstellt werden. Wenn es erwünscht ist, das die Kisten nicht sofort erstellt werden sollen, sondern z.B. als Belohnung, dann kann der Code auch in eine Function oder in das jeweilige BriefingFinished eingefügt werden. Wenn man nur Schatzkisten mit Gold hinstellen will, kann man beliebig viele ScriptEntities hinsetzen. Diese dann vernünftig durchnummerieren mit „GoldChest1, GoldChest2, GoldChest3 … etc“. Der Vorteil ist das der Code:
CreateRandomGoldChests()
nur einmal in die FirstMapAction gesetzt wird und fertig.
Aber es entsteht nun das Problem, das man in die Schatzkisten einiges anderes hineintun möchte, z.B. Holz, Eisen oder Schlüssel oder Papiere. Eigentlich kann man dann alles hineintun, auch Hasen! Sollen Rohstoffe darin sein, folgenden Code verwenden:
-- in die FirstMapAction CreateChest(GetPosition("chest1"), chestCallbackWood) CreateChest(GetPosition("chest2"), chestCallbackClay) CreateChest(GetPosition("chest3"), chestCallbackIron) CreateChest(GetPosition("chest4"), chestCallbackSulfur) CreateChest(GetPosition("chest5"), chestCallbackStone) CreateChest(GetPosition("chest6"), chestCallbackGold) CreateChestOpener("dario") StartChestQuest() --diesen Code als normale Functionen einfach ins Script function chestCallbackWood() Message("Ihr habt einen Schatz mit 500 Holz gefunden") AddWood(500) end function chestCallbackClay() Message("Ihr habt einen Schatz mit 500 Lehm gefunden") AddClay(500) end function chestCallbackIron() Message("Ihr habt einen Schatz mit 500 Eisen gefunden") AddIron(500) end function chestCallbackSulfur() Message("Ihr habt einen Schatz mit 500 Schwefel gefunden") AddSulfur(500) end function chestCallbackStone() Message("Ihr habt einen Schatz mit 500 Steinen gefunden") AddStone(500) end function chestCallbackGold() Message("Ihr habt einen Schatz mit 500 Talern gefunden") AddGold(500) end
So, jetzt gibt es auch noch die Möglichkeit, den Text farbig zu machen, zumindest den Inhalt der Kisten extra darzustellen. Ich habe die Farbe: Gelb genommen.
function chestCallbackWood() Message("Ihr habt einen Schatz mit @color:255,232,0 500 Holz @color:255,255,255 gefunden") AddWood(500) end function chestCallbackClay() Message("Ihr habt einen Schatz mit @color:255,232,0 500 Lehm @color:255,255,255 gefunden") AddClay(500) end function chestCallbackIron() Message("Ihr habt einen Schatz mit @color:255,232,0 500 Eisen @color:255,255,255 gefunden") AddIron(500) end function chestCallbackSulfur() Message("Ihr habt einen Schatz mit @color:255,232,0 500 Schwefel @color:255,255,255 gefunden") AddSulfur(500) end function chestCallbackStone() Message("Ihr habt einen Schatz mit @color:255,232,0 500 Steinen @color:255,255,255 gefunden") AddStone(500) end function chestCallbackGold() Message("Ihr habt einen Schatz mit @color:255,232,0 500 @color:255,255,255 Talern gefunden") AddGold(500) end
Hier gibt es mehr zu den Textfarben: textfarben
Möchte man nun etwas anderes, z.B. Schlüssel oder Papiere hineintun, dann ändert man einfach den Inhalt.
-- in die FirstMapAction CreateChest(GetPosition("chest1"), chestCallbackSchluessel)
oder
--diesen Code als normale Functionen einfach ins Script function chestCallbackSchluessel() Message("Ihr habt einen Schatz mit dem Schluessel gefunden") end
oder halt farbig
--diesen Code als normale Functionen einfach ins Script function chestCallbackSchluessel() Message("Ihr habt einen Schatz mit dem @color:255,232,0 Schluessel @color:255,255,255 gefunden") end
Also bleibt dann das „Add..“ einfach weg. Dann setzt man voraus, das der Spieler die Kiste gefunden hat, wenn man dies z.B. als Quest in einem Briefing festgesetzt hat.
Soll der Spieler die Kiste nicht direkt finden, sondern z.B. „nebenher“ und dann einen Schlüssel finden, um zum Beispiel ein Tor zu öffnen, muss man eine Variable setzen. Zwischen – Include … und function InitDiplomacy() als Global deklarieren
-- Include main function Script.Load( Folders.MapTools.."Main.lua" ) IncludeGlobals("MapEditorTools") Schluessel=0 function InitDiplomacy() SetNeutral( 1, 2 ) end
Danach kann diese Variable im Code für die Schatzkiste wie folgt gesetzt werden:
function chestCallbackSchluessel() Message("Ihr habt einen Schatz mit dem Schluessel gefunden") Schluessel=1 end
Über einen Aufruf mit StartSimpleJob( „Tor1“ ) wird dann mit Hilfe der nachfolgenden Funktion z.B. ein Tor geöffnet:
function Tor1() if IsNear("dario","tor1",500) and Schluessel == 1 then ReplaceEntity("tor1",Entities.XD_DarkWallStraightGate) return true else Message("Ihr braucht einen Schluessel fuer das Tor!") end end
Jetzt tauchte irgendwann mal die Frage auf, wie man die offenen Schatzkisten „verschwinden“ lassen kann, damit die nicht so dumm in der Landschaft rumstehen. Das geht so einfach nicht. Dazu müssen eigene Schatzkisten erstellt werden und nicht die aus der „Comfort-Function“. Das heisst, man muss eine geschlossene Kiste (XD_ChestClose) hinsetzen, und diese dann in einer Function in eine offene verwandeln und danach zerstören. Hier ein Beispiel:
function Kiste1() if IsNear("dario","kiste1",500) then ReplaceEntity("kiste1",Entities.XD_ChestOpen) Sound.PlayGUISound(Sounds.fanfare, 0) Sound.PlayGUISound(Sounds.VoicesMentor_CHEST_FoundTreasureChest_rnd_02, 0) Message("Congrat! Ihr habt einen Schluessel gefunden!") DestroyEntity("kiste1") return true end end
Und als Schmankerl noch dies : erweiterte Möglichkeiten für Schatzkisten