home *** CD-ROM | disk | FTP | other *** search
/ GameStar Special 2004 August / GSSH0804.iso / Geschicklichkeit / Enigma / Enigma-081.exe / data / levels / nat8.lua < prev    next >
Text File  |  2003-10-04  |  8KB  |  298 lines

  1. -- Flood Gates
  2. -- A level for Enigma
  3. -- Copyright (c) 2002 Nat Pryce
  4. -- License: GPL v2.0 or above
  5. enigma.ConserveLevel=FALSE                  -- \dh\
  6.  
  7.  
  8. level = {
  9. "##########################~############$",
  10. "#::::::::::::::::::::::::A~#::::::::::# ",
  11. "#:#########################b::::::::::# ",
  12. "#::::::::::::::::::::::::::B::::::*:::# ",
  13. "###:#######################a::::::::::# ",
  14. "#  :  ~~~~~~~~~~~~~~~~~~~~~#::::::::::# ",
  15. "#  :  ====~~~=====~~~==    c########### ",
  16. "###:####~=~~~=~~~=~~~=~# ###::::::::::# ",
  17. "#::::::#~=====~~~=====~# #:=========2:# ",
  18. "#::::::#~~~~~~~~~~~~~~~# #:=::::::::::# ",
  19. "#::::::################# #:====:=====:# ",
  20. "#::::::C:::::::::::::::# #::::=:=:::=:# ",
  21. "#D####################:# #:====:=:===:# ",
  22. "#:#::::::::::::::::::#:# #:=::::=:=:::# ",
  23. "#:#:fff::::::::::::::#-# #:======:===:# ",
  24. "#:#:f2f::::::::::::::&%& #::::::::::=:# ",
  25. "#:#:fff::::::::::::::#-#+###########&-# ",
  26. "#:#::::::::::::::::::#:::::::::::::-%-# ",
  27. "#:####F############# ### ###########&## ",
  28. "#:d1#~~~==           #3#              # ",
  29. "#:###~~~=~############g#############+## ",
  30. "#:#~~~~~=~# :::::::::::#ih :::::::::::# ",
  31. "#:#~===~=~# :         :### :         :# ",
  32. "#:#~=~=~=~# : :::::::::#   :   ::::: :# ",
  33. "#:#~=~=~=~# : :  #######   :###I###: :# ",
  34. "e:e~=~=~=~# : : :: + ::::  :#4:::5#: :# ",
  35. "e:e~=~=~=~# : : :# # #  :  :#:::::#: :# ",
  36. "e:e~=~=~=~# : : :# # #  :  :#::3::#: :# ",
  37. "e:e~=~=~=~# : :::# # #  :  :#:::::#: :# ",
  38. "e:e~=~=~=~# :    #+#+#  :  :#5:::4#: :# ",
  39. "e:e~=~===~# :::::^:+:^:::  :#######: :# ",
  40. "e:E~=~~~~~#      #:::#     ::::::::: :# ",
  41. "#:## ##############G#################H# ",
  42. "#:   #1:::::::::::::::::::::::::::::::@ ",
  43. "#:###################################:# ",
  44. "#:::::::::::::::::::::::::::::::::::::@ ",
  45. "####################################### ",
  46. }
  47.  
  48. channels = {} -- cells along which water can flow
  49. flows = {}    -- cells onto which water will flow next tick
  50. doors = {}    -- mapping from door names to cell identifiers
  51.  
  52. -- what can be on a channel cell
  53. WATER = 0
  54. CHANNEL = 1
  55. BRIDGE = 2
  56. GATE = 3
  57.  
  58.  
  59. function set_channel( x, y, type )
  60.     set_channel_cell( cell(x,y), type )
  61. end
  62.  
  63. function set_channel_cell( cell, type )
  64.     channels[cell] = type
  65. end
  66.  
  67. function canal( x, y )
  68.     set_floor( "fl-rough", x, y )
  69.     set_channel( x, y, CHANNEL )
  70. end
  71.  
  72. function water( x, y )
  73.     set_floor( "fl-water", x, y )
  74.     set_channel( x, y, WATER )
  75. end
  76.  
  77. function gate_v( x, y, name )
  78.     canal( x, y )
  79.     doorv( x, y, {name=name} )
  80.     
  81.     cell_id = cell(x,y)
  82.     doors[name] = cell_id
  83.     set_channel( x, y, GATE )
  84. end
  85.  
  86. function gate_h( x, y, name )
  87.     canal( x, y )
  88.     doorh( x, y, {name=name} )
  89.     
  90.     cell_id = cell(x,y)
  91.     doors[name] = cell_id
  92.     set_channel( x, y, GATE )
  93. end
  94.  
  95. function open_lockgate( name )
  96.     send_message( name, "open" )
  97.     set_channel_cell( doors[name], CHANNEL )
  98.     if is_next_to_water( doors[name] ) then
  99.         tinsert( flows, doors[name] )
  100.     end
  101. end
  102.  
  103. function lockgate_type( name, factory_func )
  104.     local gate_type = strupper(name)
  105.     local switch_type = strlower(name)
  106.     local callback_name = "open_gate_" .. gate_type
  107.     local callback = function()
  108.         open_lockgate( %gate_type )
  109.     end
  110.     
  111.     setglobal( callback_name, callback )
  112.     types[gate_type] = function( x, y )
  113.         %factory_func( x, y, %gate_type )
  114.     end
  115. end
  116.  
  117. function switch_type( name )
  118.     local gate_type = strupper(name)
  119.     local switch_type = strlower(name)
  120.     local callback_name = "open_gate_" .. gate_type
  121.     
  122.     types[switch_type] = function( x, y )
  123.         set_stone( "st-switch", x, y,
  124.                   {action="callback", target=%callback_name} )
  125.     end
  126. end
  127.  
  128. function trigger_type( name )
  129.     local gate_type = strupper(name)
  130.     local switch_type = strlower(name)
  131.     local callback_name = "open_gate_" .. gate_type
  132.     
  133.     types[switch_type] = function( x, y )
  134.         set_item( "it-trigger", x, y,
  135.                   {action="callback", target=%callback_name} )
  136.     end
  137. end
  138.  
  139. function tick()
  140.     local new_flows = {}
  141.     
  142.     for i,flow in flows do
  143.         channel_type = channels[flow]
  144.         if can_flow( flow ) then
  145.             if channels[flow] == CHANNEL then
  146.                set_floor( "fl-water", cell_x(flow), cell_y(flow) )
  147.             end
  148.             tinsert( new_flows, north(flow) )
  149.             tinsert( new_flows, south(flow) )
  150.             tinsert( new_flows, east(flow) )
  151.             tinsert( new_flows, west(flow) )
  152.             channels[flow] = WATER
  153.         end
  154.      end
  155.      
  156.      flows = new_flows
  157. end
  158.  
  159. function can_flow( flow )
  160.     return channels[flow] == CHANNEL or channels[flow] == BRIDGE
  161. end
  162.  
  163. function is_next_to_water( cell )
  164.     return channels[north(cell)] == WATER
  165.         or channels[south(cell)] == WATER
  166.         or channels[west(cell)] == WATER
  167.         or channels[east(cell)] == WATER
  168. end
  169.  
  170. function cell( x, y )
  171.     return y * level_width + x
  172. end
  173.  
  174. function cell_x( id )
  175.     return mod( id, level_width )
  176. end
  177. function cell_y( id )
  178.     return (id - cell_x(id)) / level_width
  179. end
  180.  
  181. function cell_str( id )
  182.     return "" .. id
  183. end
  184.  
  185. function north( id )
  186.     return id - level_width
  187. end
  188.  
  189. function south( id )
  190.     return id + level_width
  191. end
  192.  
  193. function west( id )
  194.     return id - 1
  195. end
  196.  
  197. function east( id )
  198.     return id + 1
  199. end
  200.  
  201. function send_message( obj_name, message )
  202.     --print( "sending message " .. message .. " to " .. obj_name )
  203.     obj = enigma.GetNamedObject( obj_name )
  204.     enigma.SendMessage( obj, message, nil )
  205. end
  206.  
  207. -------------------------------------------------------------------------------
  208.  
  209. types = {}
  210. types[" "] = function( x, y )
  211.    -- just the default floor
  212. end
  213. types["-"] = function( x, y )
  214.     canal(x,y)
  215.     set_stone( "st-invisible", x, y )
  216. end
  217. types[":"] = function( x, y )
  218.     canal( x, y )
  219. end
  220. types["~"] = function( x, y )
  221.     water( x, y )
  222. end
  223. types["@"] = function( x, y )
  224.     set_floor( "fl-abyss",  x, y )
  225.     set_stone( "st-grate1", x, y )
  226. end
  227. types["#"] = function( x, y )
  228.     set_stone( "st-greenbrown", x, y )
  229. end
  230. types["="] = function( x, y )
  231.     set_floor( "fl-normal", x, y )
  232.     set_channel( x, y, BRIDGE )
  233. end
  234. types["^"] = function( x, y )
  235.     canal( x, y )
  236.     set_stone( "st-grate1", x, y )
  237. end
  238. types["&"] = function( x, y )
  239.     set_floor( "fl-normal", x, y )
  240.     set_stone( "st-grate1", x, y )
  241. end
  242. types["%"] = function( x, y )
  243.     set_floor( "fl-normal", x, y )
  244.     set_stone( "st-grate1", x, y )
  245.     set_channel( x, y, BRIDGE )
  246. end
  247. types["*"] = function( x, y )
  248.     set_floor( "fl-normal", x, y )
  249.     set_actor( "ac-blackball", x+0.5, y+0.5, {player=0} )
  250. end
  251. types["+"] = function( x, y )
  252.     set_stone( "st-wood", x, y )
  253. end
  254. types["x"] = function( x, y )
  255.     canal( x, y )
  256.     set_stone( "st-wood", x, y )
  257. end
  258. types["$"] = function( x, y )
  259.     set_stone( "st-timer", x, y,
  260.                {interval=0.1, action="callback", target="tick"} )
  261. end
  262. lockgate_type( "A", gate_v )
  263. switch_type( "a" )
  264. lockgate_type( "B", gate_v )
  265. switch_type( "b" )
  266. lockgate_type( "C", gate_v )
  267. switch_type( "c" )
  268. lockgate_type( "D", gate_h )
  269. trigger_type( "d" )
  270. lockgate_type(  "E", gate_v )
  271. switch_type( "e" )
  272. lockgate_type( "F", gate_h )
  273. trigger_type( "f" )
  274. lockgate_type( "G", gate_h )
  275. trigger_type( "g" )
  276. lockgate_type( "H", gate_h )
  277. trigger_type( "h" )
  278. lockgate_type( "I", gate_h )
  279. switch_type( "i" )
  280.  
  281. for color=0,9 do
  282.     types[""..color] = function( x, y )
  283.         set_stone( "st-oxyd", x, y, {flavor="a", color=""..%color} )
  284.     end
  285. end
  286.  
  287.  
  288. -------------------------------------------------------------------------------
  289.  
  290. create_world( strlen(level[1]), getn(level) )
  291. fill_floor( "fl-leaves", 0, 0, level_width, level_height )
  292. for y,line in level do
  293.     for x = 1,strlen(line) do
  294.         local type = strchar(strbyte(line,x))
  295.         types[type]( x-1, y-1 )
  296.     end
  297. end
  298.