St-black/whiteballs

Aus EnigmaWiki

Wechseln zu: Navigation, Suche
Verfügbare Sprachen: Deutsch, English, Русский

st-blackballs und st-whiteballs

Die beiden Steine st-blackballs und st-whiteballs können viel mehr, als man ihnen auf den ersten Blick ansieht. Sie können ein zu ihnen geschicktes Signal auf bestimmte Weise verarbeiten und dann weiterschicken.

Es gibt eine Anwendungsart, die man einige Male antrifft. Ein Raster von Türen wird angelegt, die sich nach gewissen Regeln beim Berühren öffnen und schliessen. Dazu werden in die "Ecken", wo 4 Türen um ein Feld zusammenkommen, jeweils ein st-blackballs (oder ein st-whiteballs) gesetzt. Dann öffnet sich die berührte Türe und die benachbarten, orthogonalen schliessen sich.

Das folgende Codestück generiert solche Raster:

--- GRIDCODE -------------------------------------------------------------------
function set_ballstones(x0,y0,w,h,black)
    if black == 1 then
        stone = "st-blackballs"
    else
        stone = "st-whiteballs"
    end
    for i=0, h do
        for j=0, w do
            set_stone(stone,x0+2*j,y0+2*i)
        end
    end
end 
 
function set_sensors(x0,y0,w,h,type)
    if type == 1 then
        sensor = "it-sensor"
    else
        sensor = "it-inversesensor"
    end
    local i,j
    local c = 0
    for i=0, h do
        for j=0, w-1 do
            set_stone("st-door-h",x0+1+2*j,y0+2*i)
            set_item(sensor,x0+1+2*j,y0+2*i)
            dostring("Signal(\"it("..tostring(x0+1+2*j).." "..tostring(y0+2*i)..")\",\"st("..tostring(x0+2*j).." "..tostring(y0+2*i)..")\")")
            dostring("Signal(\"it("..tostring(x0+1+2*j).." "..tostring(y0+2*i)..")\",\"st("..tostring(x0+2+2*j).." "..tostring(y0+2*i)..")\")")
            c = c+1
        end
    end
 
    for i=0, h-1 do
        for j=0, w do
            set_stone("st-door-v",x0+2*j,y0+1+2*i)
            set_item(sensor,x0+2*j,y0+1+2*i)
            dostring("Signal(\"it("..tostring(x0+2*j).." "..tostring(y0+1+2*i)..")\",\"st("..tostring(x0+2*j).." "..tostring(y0+2*i)..")\")")
            dostring("Signal(\"it("..tostring(x0+2*j).." "..tostring(y0+1+2*i)..")\",\"st("..tostring(x0+2*j).." "..tostring(y0+2+2*i)..")\")")
            c = c+1
        end
    end
end
 
-- Wrapper:
function set_grid(x0,y0,w,h,black,type)
    set_ballstones(x0,y0,w,h,black)
    set_sensors(x0,y0,w,h,type)  
end
--- END GRIDCODE ---------------------------------------------------------------

Analyse

Der Raster besteht aus einem Gitter von st-blackballs (oder st-whiteballs) und zwischen 2 solchen Steinen jeweils eine horizontale oder vertikale Tür (st-door). Auf dem selben Feld wie die Tür hat es auch noch ein Sensoritem (it-sensor).

Wird nun die Tür berührt, führt das Item auf dem selben Feld sein Action/Target Paar aus. (Das ist eine spezielle Eigenschaft von Türen!)

Das Sensoritem schickt nun ein Signal an die beiden Steine, die die Türpfosten Bilden. Diese verteilen das Signal (falls es von der Kugelfarbe kommt, der sie auch angehören) an die 4 angrenzenden Türen. Diese Türen werden dann entsprechend geöffnet oder geschlossen.

Ein Level, das von obigen Stück Code gebrauch macht, könnte etwa so aussehen:
Bild:st-black_whiteballs_level.png

Es ist anzumerken, dass weder Schwarz noch Weiss auf die andere Seite gelangen kann, wenn nicht der jeweilige Actor die Türen "von innen" öffnet.

Persönliche Werkzeuge