Random Trigger Targets
Aus EnigmaWiki
Verfügbare Sprachen: Deutsch, English, Русский
Inhaltsverzeichnis |
Zufällige Ziele für Schalter
Problem
Es ist eine gewisse Anzahl Schalter und die gleiche Anzahl Ziele vorhanden. Es soll bei Levelstart ein zufällige Zuordnung zwischen je einem Schalter und einem Ziel geben.
Lösungsansatz
Wir speichern die Namen der Ziele in einem Array. Den Schaltern wird dann je ein zufällig ausgewählter Name aus diesem Array als target zugewiesen.
Lösungsbeispiel
-- Array aus Koordinaten, an denen Schalter gesetzt werden sollen pos_trigger = {{2,2},{5,5},{3,7},{2,8}} -- Array aus Koordinaten, an denen die Target-Steine (z.B. Brücken) gesetzt werden sollen pos_targets = {{5,2},{2,4},{5,6},{6,8}} -- Erzeugt ein Array aus Steinnamen im Stil von {"stein1","stein2","stein3",...} -- und setzt auch gleich die so benannten Steine an die in pos_targets angegebenen -- Positionen. steinname = {} for i=1 , # pos_targets do steinname[i] = "stein"..i set_stone("st-door_a" , pos_targets[i][1] , pos_targets[i][2] , {name = steinname[i]}) end -- Setzt die Schalter an die gewünschten Positionen und weist ihnen einen -- zufälligen Stein zu. for i=1 , # pos_targets do zufall = random(1 , # steinname) set_item("it-trigger" , pos_trigger[i][1] , pos_trigger[i][2] , {action = "openclose", target = steinname[zufall]}) table.remove(steinname,zufall) end
Analyse
Zuerst werden, wie in den Lua-Kommentaren erklärt, die Positionen für Schalter und Zielsteine angegeben:
pos_trigger = {{x1,y1}, {x2,y2}, ... } -- Schalterkoordinaten pos_targets = {{x1,y1}, {x2,y2}, ... } -- Zielsteinkoordinaten
Im nächsten Schritt werden die Zielobjekte (in diesem Beispiel handelt es sich um st-door_a) gesetzt. Gleichzeitig wird jedem Stein ein Name zugewiesen, über den er später ansprechbar ist. In diesem Code werden die Steine "stein1", "stein2" usw. genannt. Die Namen werden im Array steinname gespeichert.
for i=1 , #pos_targets do steinname[i] = "stein"..i set_stone("st-door_a" , pos_targets[i][1] , pos_targets[i][2] , {name = steinname[i]}) end
In einer zweiten Schleife werden schliesslich die Schalter (Hier it-trigger) gesetzt. Dem Attribut target wird ein zufälliger Eintrag aus dem Array steinname zugewiesen. Damit kein zweiter Schalter denselben Zielstein anspricht, wird der besagte Eintrag anschliessend gelöscht.
for i=1 , #pos_targets do zufall = random(1 , # steinname) set_item("it-trigger" , pos_trigger[i][1] , pos_trigger[i][2] , {action = "openclose", target = steinname[zufall]}) table.remove(steinname,zufall) end

