enigma-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Enigma-devel] Re: Arguments for trigger callback


From: Ronald Lamprecht
Subject: [Enigma-devel] Re: Arguments for trigger callback
Date: Fri, 06 Apr 2007 12:39:00 +0200
User-agent: Mozilla Thunderbird 1.0.7 (Windows/20050923)

Hi,

Thanks for your level and the valuable feedback. Let me answer your mail in seperate mails related to the single subjects.

Hubai Tamas wrote:
[Feature request: Arguments for trigger callback]
When I have multiple triggers with similar functionality, something like
action="callback", target="trigfn(27)" would be nice.

I added this feature last summer when noticing that it just required a simple reengineering without disturbing existing levels. But like many other features it is not yet documented:

Add your arguments (as many as you have) as attributes to the sender object.

{action="callback", target="trigfn", _myattribute1=27, _myattribute2="mysecret"}

Please stick to the convention naming all private (level or lua library) attributes with a leading underscore to avoid any conflicts with future engine attribute additions.

The callback function has always 2 arguments: the trigger value and the sender object:

function trigfn(value, sender)
    _myattribute1 = enigma.GetAttrib(sender, "_myattribute1")
    _myattribute2 = enigma.GetAttrib(sender, "_myattribute2")
end

Hope this covers your demands.

Note that this approach has another useful benefit. Sometimes you have many triggers that can be processed by a single callback function. You just have to know which trigger got active. By evaluating the sender in the callback function you may be able to avoid writing numerous seperate callback functions. I attach a level that makes use of this aspect.

Ronald
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<el:level xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://enigma-game.org/schema/level/1 level.xsd" 
xmlns:el="http://enigma-game.org/schema/level/1";>
  <el:protected >
    <el:info el:type="level">
      <el:identity el:title="Revolver" el:subtitle="Charging live ammunition" 
el:id="20070214ral703"/>
      <el:version el:score="1" el:release="1" el:revision="$Revision: 59 $" 
el:status="released"/>
      <el:author  el:name="Ronald Lamprecht" el:email="address@hidden"/>
      <el:copyright>Copyright © 2006 Ronald Lamprecht</el:copyright>
      <el:license el:type="GPL v2.0 or above" el:open="true"/>
      <el:compatibility el:enigma="1.00">
      </el:compatibility>
      <el:modes el:easy="true" el:single="true" el:network="false"/>
      <el:comments>
        <el:code></el:code>
      </el:comments>
      <el:score el:easy="3:02" el:difficult="3:07"/>
    </el:info>
    <el:luamain><![CDATA[
set_oxyd = oxyd
math_floor = floor

function oxyd( x, y, tiles )
    return set_oxyd( x, y, "d")
end

function nothing(x, y, tiles)
    -- create nothing
end

function floor( floor_type, attribs )
    return function( x, y, tiles )
        return set_floor( floor_type, x, y, attribs or {} )
    end
end

function stone( stone_type, attribs )
    return function( x, y, tiles )
        return set_stone( stone_type, x, y, attribs or {} )
    end
end

function item( item_type, attribs )
    return function( x, y, tiles )
        return set_item( item_type, x, y, attribs or {} )
    end
end

function actor( actor_type, attribs )
    return function( x, y, tiles )
        return set_actor( actor_type, x+0.5, y+0.5, attribs or {} )
    end
end

function inherit(tile_type)
    return function( x, y, tiles )
        return create_tile( tiles, x, y, tile_type )
    end
end

function create_world_from_map( tiles, map )
    create_world( strlen(map[1]), getn(map) )
    
    for y = 1,getn(map) do
        local line = map[y]
        for x = 1,strlen(line) do
            local tile = strchar(strbyte(line,x))
            create_tile( tiles, x-1, y-1, tile )
        end
    end
end

function create_tile( tiles, x, y, tile_type )
    local constructors = tiles[tile_type]

    if constructors then
        for i = 1,getn(constructors) do
            constructors[i](x,y,tiles)
        end
    else
        error("invalid tile identifier " .. tile_type )
    end
end

oxyd_default_flavor = "a"

tiles = {}
tiles[" "] = {floor("fl-bluegreen")}
tiles["ab"] = {floor("fl-abyss")}
tiles["-"] = {floor("fl-concrete")}
tiles["b"] = {floor("fl-bridge-open", {type="x", name="bridge-left"})}
tiles["B"] = {floor("fl-bridge-open", {type="x", name="bridge-right"})}
tiles["br"] = {floor("fl-bridge-open", {type="x"})}
tiles["."] = {floor("fl-concrete",{eternal=TRUE, initfire=TRUE})}
tiles["x"] = {inherit(" "), oxyd}
tiles["d"] = {inherit("ab"), stone("st-door-v")}
tiles["t"] = {inherit(" "), item("it-trigger", {action="callback", 
target="trigger"})}
tiles["s"] = {inherit(" "), item("it-trigger", {action="callback", 
target="count"})}
tiles["#"] = {inherit(" "), stone("st-stone2")}
tiles["g"] = {inherit("."), stone("st-black3")}
tiles["G"] = {inherit("-"), stone("st-black3")}
tiles["X"] = {inherit(" "), stone("st-black3")}
tiles["N"] = {inherit(" "), stone("st-turnstile-n")}
tiles["S"] = {inherit(" "), stone("st-turnstile-s")}
tiles["W"] = {inherit(" "), stone("st-turnstile-w")}
tiles["E"] = {inherit(" "), stone("st-turnstile-e")}
tiles["T"] = {inherit(" "), stone("st-turnstile-green")}

tiles["1"] = {inherit(" "), actor("ac-blackball", {player=0, name="acBlack"})}
tiles["h"] = {inherit("s"), actor("ac-horse")}
if difficult then
  tiles["r"] = {inherit("br"), actor("ac-rotor", {gohome=FALSE, range=20, 
force=30})}
else
  tiles["r"] = {inherit("br"), actor("ac-rotor", {gohome=FALSE, range=20, 
force=15})}
end

function trigger(value, sender)
    x,y = enigma.GetPos(sender)
    if (x<9) then
        fl = enigma.GetFloor(x-2, y)
        door = enigma.GetStone(x-1, y-1)
        bridge = enigma.GetFloor(x+15, y+1)
    else
        fl = enigma.GetFloor(x+2, y)
        door = enigma.GetStone(x+1, y+1)
        bridge = enigma.GetFloor(x-15, y-1)
    end
    if (value == 1) then
        SendMessage(fl, "stopfire")
        SendMessage(door, "open")
        SendMessage(bridge, "close")
    else
        SendMessage(fl, "forcefire")
        SendMessage(door, "close")
        SendMessage(bridge, "open")
    end
end

counter = 0

function count(value)
    bridge_left = enigma.GetNamedObject("bridge-left")
    bridge_right = enigma.GetNamedObject("bridge-right")
    if (value == 1) then
        counter = counter + 1
        if (counter == 8) then
            SendMessage(bridge_left, "close")
            SendMessage(bridge_right, "close")
        end
    else
        counter = counter - 1
        if (counter == 7) then
            SendMessage(bridge_left, "open")
            SendMessage(bridge_right, "open")
        end
    end
end


create_world_from_map( tiles, {
"#x################x#",
"#G#              #G#",
"#rd              B-#",
"#g#t   N    N   t#g#",
"#rd  #WTE##WTE#  dr#",
"#g#t #hSh##hSh# t#g#",
"#rd  ###XxxX###  dr#",
"#g#t #hNh##hNh# t#g#",
"#rd  #WTE##WTE#  dr#",
"#g#t   S    S   t#g#",
"#-b              dr#",
"#G#       1      #G#",
"#x################x#"
})


oxyd_shuffle()
    ]]></el:luamain>
    <el:i18n>
      <el:string el:key="title">
        <el:english el:translate="false"/>
      </el:string>
      <el:string el:key="subtitle">
        <el:english el:translate="true"/>
        <el:translation el:lang="de">Laden scharfer Munition</el:translation>
      </el:string>
    </el:i18n>
  </el:protected>
</el:level>

reply via email to

[Prev in Thread] Current Thread [Next in Thread]