home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GameStar Special 2004 August
/
GSSH0804.iso
/
Geschicklichkeit
/
Enigma
/
Enigma-081.exe
/
data
/
levels
/
nat8.lua
< prev
next >
Wrap
Text File
|
2003-10-04
|
8KB
|
298 lines
-- Flood Gates
-- A level for Enigma
-- Copyright (c) 2002 Nat Pryce
-- License: GPL v2.0 or above
enigma.ConserveLevel=FALSE -- \dh\
level = {
"##########################~############$",
"#::::::::::::::::::::::::A~#::::::::::# ",
"#:#########################b::::::::::# ",
"#::::::::::::::::::::::::::B::::::*:::# ",
"###:#######################a::::::::::# ",
"# : ~~~~~~~~~~~~~~~~~~~~~#::::::::::# ",
"# : ====~~~=====~~~== c########### ",
"###:####~=~~~=~~~=~~~=~# ###::::::::::# ",
"#::::::#~=====~~~=====~# #:=========2:# ",
"#::::::#~~~~~~~~~~~~~~~# #:=::::::::::# ",
"#::::::################# #:====:=====:# ",
"#::::::C:::::::::::::::# #::::=:=:::=:# ",
"#D####################:# #:====:=:===:# ",
"#:#::::::::::::::::::#:# #:=::::=:=:::# ",
"#:#:fff::::::::::::::#-# #:======:===:# ",
"#:#:f2f::::::::::::::&%& #::::::::::=:# ",
"#:#:fff::::::::::::::#-#+###########&-# ",
"#:#::::::::::::::::::#:::::::::::::-%-# ",
"#:####F############# ### ############ ",
"#:d1#~~~== #3# # ",
"#:###~~~=~############g#############+## ",
"#:#~~~~~=~# :::::::::::#ih :::::::::::# ",
"#:#~===~=~# : :### : :# ",
"#:#~=~=~=~# : :::::::::# : ::::: :# ",
"#:#~=~=~=~# : : ####### :###I###: :# ",
"e:e~=~=~=~# : : :: + :::: :#4:::5#: :# ",
"e:e~=~=~=~# : : :# # # : :#:::::#: :# ",
"e:e~=~=~=~# : : :# # # : :#::3::#: :# ",
"e:e~=~=~=~# : :::# # # : :#:::::#: :# ",
"e:e~=~=~=~# : #+#+# : :#5:::4#: :# ",
"e:e~=~===~# :::::^:+:^::: :#######: :# ",
"e:E~=~~~~~# #:::# ::::::::: :# ",
"#:## ##############G#################H# ",
"#: #1:::::::::::::::::::::::::::::::@ ",
"#:###################################:# ",
"#:::::::::::::::::::::::::::::::::::::@ ",
"####################################### ",
}
channels = {} -- cells along which water can flow
flows = {} -- cells onto which water will flow next tick
doors = {} -- mapping from door names to cell identifiers
-- what can be on a channel cell
WATER = 0
CHANNEL = 1
BRIDGE = 2
GATE = 3
function set_channel( x, y, type )
set_channel_cell( cell(x,y), type )
end
function set_channel_cell( cell, type )
channels[cell] = type
end
function canal( x, y )
set_floor( "fl-rough", x, y )
set_channel( x, y, CHANNEL )
end
function water( x, y )
set_floor( "fl-water", x, y )
set_channel( x, y, WATER )
end
function gate_v( x, y, name )
canal( x, y )
doorv( x, y, {name=name} )
cell_id = cell(x,y)
doors[name] = cell_id
set_channel( x, y, GATE )
end
function gate_h( x, y, name )
canal( x, y )
doorh( x, y, {name=name} )
cell_id = cell(x,y)
doors[name] = cell_id
set_channel( x, y, GATE )
end
function open_lockgate( name )
send_message( name, "open" )
set_channel_cell( doors[name], CHANNEL )
if is_next_to_water( doors[name] ) then
tinsert( flows, doors[name] )
end
end
function lockgate_type( name, factory_func )
local gate_type = strupper(name)
local switch_type = strlower(name)
local callback_name = "open_gate_" .. gate_type
local callback = function()
open_lockgate( %gate_type )
end
setglobal( callback_name, callback )
types[gate_type] = function( x, y )
%factory_func( x, y, %gate_type )
end
end
function switch_type( name )
local gate_type = strupper(name)
local switch_type = strlower(name)
local callback_name = "open_gate_" .. gate_type
types[switch_type] = function( x, y )
set_stone( "st-switch", x, y,
{action="callback", target=%callback_name} )
end
end
function trigger_type( name )
local gate_type = strupper(name)
local switch_type = strlower(name)
local callback_name = "open_gate_" .. gate_type
types[switch_type] = function( x, y )
set_item( "it-trigger", x, y,
{action="callback", target=%callback_name} )
end
end
function tick()
local new_flows = {}
for i,flow in flows do
channel_type = channels[flow]
if can_flow( flow ) then
if channels[flow] == CHANNEL then
set_floor( "fl-water", cell_x(flow), cell_y(flow) )
end
tinsert( new_flows, north(flow) )
tinsert( new_flows, south(flow) )
tinsert( new_flows, east(flow) )
tinsert( new_flows, west(flow) )
channels[flow] = WATER
end
end
flows = new_flows
end
function can_flow( flow )
return channels[flow] == CHANNEL or channels[flow] == BRIDGE
end
function is_next_to_water( cell )
return channels[north(cell)] == WATER
or channels[south(cell)] == WATER
or channels[west(cell)] == WATER
or channels[east(cell)] == WATER
end
function cell( x, y )
return y * level_width + x
end
function cell_x( id )
return mod( id, level_width )
end
function cell_y( id )
return (id - cell_x(id)) / level_width
end
function cell_str( id )
return "" .. id
end
function north( id )
return id - level_width
end
function south( id )
return id + level_width
end
function west( id )
return id - 1
end
function east( id )
return id + 1
end
function send_message( obj_name, message )
--print( "sending message " .. message .. " to " .. obj_name )
obj = enigma.GetNamedObject( obj_name )
enigma.SendMessage( obj, message, nil )
end
-------------------------------------------------------------------------------
types = {}
types[" "] = function( x, y )
-- just the default floor
end
types["-"] = function( x, y )
canal(x,y)
set_stone( "st-invisible", x, y )
end
types[":"] = function( x, y )
canal( x, y )
end
types["~"] = function( x, y )
water( x, y )
end
types["@"] = function( x, y )
set_floor( "fl-abyss", x, y )
set_stone( "st-grate1", x, y )
end
types["#"] = function( x, y )
set_stone( "st-greenbrown", x, y )
end
types["="] = function( x, y )
set_floor( "fl-normal", x, y )
set_channel( x, y, BRIDGE )
end
types["^"] = function( x, y )
canal( x, y )
set_stone( "st-grate1", x, y )
end
types["&"] = function( x, y )
set_floor( "fl-normal", x, y )
set_stone( "st-grate1", x, y )
end
types["%"] = function( x, y )
set_floor( "fl-normal", x, y )
set_stone( "st-grate1", x, y )
set_channel( x, y, BRIDGE )
end
types["*"] = function( x, y )
set_floor( "fl-normal", x, y )
set_actor( "ac-blackball", x+0.5, y+0.5, {player=0} )
end
types["+"] = function( x, y )
set_stone( "st-wood", x, y )
end
types["x"] = function( x, y )
canal( x, y )
set_stone( "st-wood", x, y )
end
types["$"] = function( x, y )
set_stone( "st-timer", x, y,
{interval=0.1, action="callback", target="tick"} )
end
lockgate_type( "A", gate_v )
switch_type( "a" )
lockgate_type( "B", gate_v )
switch_type( "b" )
lockgate_type( "C", gate_v )
switch_type( "c" )
lockgate_type( "D", gate_h )
trigger_type( "d" )
lockgate_type( "E", gate_v )
switch_type( "e" )
lockgate_type( "F", gate_h )
trigger_type( "f" )
lockgate_type( "G", gate_h )
trigger_type( "g" )
lockgate_type( "H", gate_h )
trigger_type( "h" )
lockgate_type( "I", gate_h )
switch_type( "i" )
for color=0,9 do
types[""..color] = function( x, y )
set_stone( "st-oxyd", x, y, {flavor="a", color=""..%color} )
end
end
-------------------------------------------------------------------------------
create_world( strlen(level[1]), getn(level) )
fill_floor( "fl-leaves", 0, 0, level_width, level_height )
for y,line in level do
for x = 1,strlen(line) do
local type = strchar(strbyte(line,x))
types[type]( x-1, y-1 )
end
end