Random Trigger Targets

Aus EnigmaWiki

Wechseln zu: Navigation, Suche
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
Persönliche Werkzeuge