Libflood

Aus EnigmaWiki

Wechseln zu: Navigation, Suche
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.

  1. Initialisieren der Umgebung. Welcher Boden ist flutbar, welcher nicht, etc.
  2. 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()
Persönliche Werkzeuge