Libflood
Aus EnigmaWiki
Verfügbare Sprachen: Deutsch, English, Русский
Fliessendes Wasser - nicht im Sinn von animierter Wassergraphik - ist etwas, was die Enigmaengine nicht von selbst zur Verfügung stellt. Man muss zu gewissen Lua-Tricks greifen, um schöne Effekte wie etwa in "Emergency Exit" (Enigma III # 63) oder "Flood Gates" (IV # 17) zu bekommen. Damit nicht jeder Levelautor sich erneut den Kopf über den besten Trick zerbrechen muss, existiert ein Library, die diese Tricks anbieten und noch dazu einfach zu benutzen ist.
Inhaltsverzeichnis |
Ein erstes Beispiel
Ein Beispiel ist das Level "Flood Demo" im "Experimental" Pack. Es ist hier nochmals in voller Länge abgedruckt.
-- GENERAL -- levelh = 13 levelw = 20 create_world(levelw, levelh) function renderLine( line, pattern) for i=1, strlen(pattern) do local c = strsub( pattern, i, i) if c=="x" then oxyd(i-1,line) elseif c=="#" then set_stone("st-glass",i-1,line) set_floor("fl-black",i-1,line) elseif c==" " then set_floor("fl-rough",i-1,line) elseif c=="-" then set_floor("fl-black",i-1,line) end end end renderLine(00 , "####################") renderLine(01 , "#------------------#") renderLine(02 , "#------------------#") renderLine(03 , "#---------------- -#") renderLine(04 , "#-- - #") renderLine(05 , "#- - ---- -#") renderLine(06 , "#- - ----#") renderLine(07 , "#- ------ - - -#") renderLine(08 , "#- --- - -- -#") renderLine(09 , "# - - - -#") renderLine(10 , "#- ----------------#") renderLine(11 , "#------------------#") renderLine(12 , "####################") oxyd_shuffle() set_actor("ac-blackball", 1.5,1.5, {player=0}) -- PART FOR THE LIBFLOOD: init_flood({"################ #", "## # ~ ", "# ~ # #### #", "# # ####", "# ###### # # #", "# ###~ # ## ~#", " # # # ~#", "# ################"},{1,3},1) set_stone("st-switch_black",2,2,{action="callback", target="do_flood"})
Referenz
Um die libflood korrekt zu verwenden sind 2 Schritte nötig.
- Initialisieren der Umgebung. Welcher Boden ist flutbar, welcher nicht, etc.
- Fluten. Das läuft in beliebig vielen, immer gleichen, Schritten ab.
Initialisieren einer Flut
Um eine Flut zu erzeugen, ruft man folgende Funktion auf:
init_flood(map, ecke, methode)
Parameter
-
map: Ein Array aus gleichlangen Strings. Diese wiederum können aus folgenden Zeichen bestehen:-
(Whitespace): Boden, der geflutet werden kann, es aber zum jetzigen Zeitpunkt noch nicht ist. -
~: Boden der bereits unter Wasser steht. Mindestens 1 Feld muss anfangs bereits Wasser sein. -
#: Boden, der nicht flutbar ist.
-
-
ecke: Ein Array aus den beiden realen Levelkoordinaten der oberen linken Ecke der Map.
-
methode: Methode, mit der geflutet wird. Bisher sind folgende Methoden vorhanden:-
1: Bei einem Schritt (siehe unten) werden jeweils die 4 angrenzenden Felder geprüft. -
2: Es werden zusätzlich zu den 4 angrenzenden die 4 diagonal angrenzenden geprüft.
-
Beispiel einer Initialisierung
init_flood({"################ #", "## # ~ ", "# ~ # #### #", "# # ####", "# ###### # # #", "# ###~ # ## ~#", " # # # ~#", "# ################"},{1,3},1)
Schrittweise fluten
Nun haben wir definiert, wie sich die Umwelt auf steigendes Wasser verhält. Jetzt ist es an der Zeit, das Wasser steigen zu lassen. Die geschieht in sog. Schritten. Bei jedem Schritt wird für jedes Stück Wasser, das in der Map gesetzt wurde, geprüft, ob Nachbaren flutbar sind und wenn ja, werden diese geflutet.
Um einen solchen Schritt auszuführen, muss die Funktion do_flood() ausgeführt werden. Dies kann jedes beliebige Objekt tun, dass ein Action/Target Paar besitzt, siehe Action_und_Target.
Die Funktion hat folgende Syntax:
do_flood()

