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

  1. -- Simon Says
  2. -- A level for Enigma
  3. --
  4. -- Copyright (c) 2003 Nat Pryce
  5. -- Licensed under the GPL version 2.
  6.  
  7.  
  8. function send_message( obj_name, message, arg )
  9.     obj = enigma.GetNamedObject( obj_name )
  10.     if obj == nil then
  11.         error( "trying to send message " .. message .. 
  12.                " to nonexistant object named " .. obj_name )
  13.     else
  14.         enigma.SendMessage( obj, message, arg )
  15.     end
  16. end
  17.  
  18. function name( prefix, index )
  19.     return prefix .. tostring(index)
  20. end
  21.  
  22. function draw_room( x, y, width, height, floor )
  23.     fill_floor( floor, x, y, width, height )
  24.     draw_border( "st-rock6", x, y, width, height )
  25. end
  26.  
  27.  
  28.  
  29. ---------------------------------------------------------------
  30. -- Functions to create and control items in the level
  31.  
  32. DOOR_COUNT = 16
  33. LIGHT_COUNT = 8
  34. BLOCKAGE_COUNT = 8
  35.  
  36. function door( i )
  37.     return name("door",i)
  38. end
  39.  
  40. function light( i )
  41.     return name("light",i)
  42. end
  43.  
  44. function open_doors()
  45.     for i = 1,DOOR_COUNT do
  46.         send_message( door(i), "open" )
  47.     end
  48. end
  49.  
  50. function close_doors()
  51.     for i = 1,DOOR_COUNT do
  52.         send_message( door(i), "close" )
  53.     end
  54. end
  55.  
  56. function open_blockage( i )
  57.     send_message( name("blocka",i), "open" )
  58.     send_message( name("blockb",i), "open" )
  59. end
  60.  
  61. function close_all_blockages()
  62.     for i = 1,BLOCKAGE_COUNT do
  63.         send_message( name("blocka",i), "close" )
  64.         send_message( name("blockb",i), "close" )
  65.     end
  66. end
  67.  
  68. function flash_light( i )
  69.     send_message( light(i), "trigger" )
  70. end
  71.  
  72. function start_timer()
  73.     send_message( "timer", "on" )
  74. end
  75.  
  76. function stop_timer()
  77.     send_message( "timer", "off" )
  78. end
  79.  
  80.  
  81. ---------------------------------------------------------------
  82. -- Functions to manage the sequence
  83.  
  84. SEQUENCE_START_SIZE = 1
  85. SEQUENCE_SIZE_STEP = 1
  86.  
  87. STATE_WAITING = 1
  88. STATE_SHOW = 2
  89. STATE_MATCH = 3
  90.  
  91. state = STATE_WAITING
  92. sequence = {}   -- The sequence the player is trying to match
  93. current = 1     -- The current item being matched or shown
  94. sequence_id = 1 -- The current index of the sequence
  95.  
  96. function sequence_index()
  97.     return sequence_id
  98. end
  99.  
  100. function all_sequences_complete()
  101.     return sequence_index() == LASER_COUNT
  102. end
  103.  
  104. function sequence_size()
  105.     return getn(sequence)
  106. end
  107.  
  108. function sequence_is_complete()
  109.     return current > sequence_size()
  110. end
  111.  
  112. function current_sequence_item()
  113.     return sequence[current]
  114. end
  115.  
  116. function step_to_next_sequence_item()
  117.     assert( not sequence_is_complete() )
  118.     current = current + 1
  119. end
  120.  
  121. function create_first_sequence()
  122.     create_sequence( SEQUENCE_START_SIZE )
  123.     sequence_id = 1
  124. end
  125.  
  126. function create_next_sequence()
  127.     create_sequence( sequence_size() + SEQUENCE_SIZE_STEP )
  128.     sequence_id = sequence_id + 1
  129. end
  130.  
  131. function create_sequence( size )
  132.     sequence = {}
  133.     
  134.     for n = 1,size do
  135.         next_element = random( 1, LIGHT_COUNT )
  136.         
  137.         while getn(sequence) > 0 and 
  138.               next_element == sequence[getn(sequence)] 
  139.         do
  140.             next_element = random( 1, LIGHT_COUNT )
  141.         end
  142.         
  143.         tinsert( sequence, next_element )
  144.     end
  145.     
  146.     current = size + 1
  147. end
  148.  
  149. function rewind_to_start_of_sequence()
  150.     current = 1
  151. end
  152.  
  153. ---------------------------------------------------------------
  154. -- Sequence playback
  155.  
  156. function show_sequence( trigger )
  157.     if sequence_is_complete() and trigger == 1 then
  158.         close_doors()
  159.         start_sequence_playback()
  160.     end
  161. end
  162.  
  163. function timer_callback()
  164.     if sequence_is_complete() then
  165.         open_doors()
  166.         stop_timer()
  167.         rewind_to_start_of_sequence()
  168.     else
  169.         flash_current_light()
  170.         step_to_next_sequence_item()
  171.     end
  172. end
  173.  
  174. function start_sequence_playback()
  175.     rewind_to_start_of_sequence()
  176.     start_timer()
  177. end
  178.  
  179. function flash_current_light()
  180.     flash_light( current_sequence_item() )
  181. end
  182.  
  183. ---------------------------------------------------------------
  184.  
  185. function switch1() switch(1) end
  186. function switch2() switch(2) end
  187. function switch3() switch(3) end
  188. function switch4() switch(4) end
  189. function switch5() switch(5) end
  190. function switch6() switch(6) end
  191. function switch7() switch(7) end
  192. function switch8() switch(8) end
  193.  
  194. function switch( i )
  195.     if not sequence_is_complete() then
  196.         if i == current_sequence_item() then
  197.             flash_light( i )
  198.             step_to_next_sequence_item()
  199.             if sequence_is_complete() then
  200.                 finish_sequence()
  201.             end
  202.         else
  203.             start_level()
  204.         end
  205.     end
  206. end
  207.  
  208. function finish_sequence()
  209.     open_blockage( sequence_index() )
  210.     create_next_sequence()
  211.     open_doors()
  212. end
  213.  
  214. ---------------------------------------------------------------
  215.  
  216.  
  217. function start_level()
  218.     stop_timer()
  219.     close_all_blockages()
  220.     oxyd_closeall()
  221.     create_first_sequence()
  222.     open_doors()
  223. end
  224.  
  225.  
  226.  
  227. ---------------------------------------------------------------
  228. -- Create the world
  229.  
  230. randomseed( enigma.GetTicks() )
  231.  
  232. create_world( 20, 13 )
  233.  
  234. fill_floor( "fl-leaves", 0, 0, level_width, level_height )
  235. draw_room( 1, 1, 11, 11, "fl-samba" )
  236.  
  237. set_stone( "st-door_a", 4, 4, {name=door(1)} )
  238. set_stone( "st-door_a", 5, 4, {name=door(2)} )
  239. set_stone( "st-door_a", 6, 4, {name=door(3)} )
  240. set_stone( "st-door_a", 7, 4, {name=door(4)} )
  241. set_stone( "st-door_a", 8, 4, {name=door(5)} )
  242. set_stone( "st-door_a", 4, 5, {name=door(6)} )
  243. set_stone( "st-door_a", 8, 5, {name=door(7)} )
  244. set_stone( "st-door_a", 4, 6, {name=door(8)} )
  245. set_stone( "st-door_a", 8, 6, {name=door(9)} )
  246. set_stone( "st-door_a", 4, 7, {name=door(10)} )
  247. set_stone( "st-door_a", 8, 7, {name=door(11)} )
  248. set_stone( "st-door_a", 4, 8, {name=door(12)} )
  249. set_stone( "st-door_a", 5, 8, {name=door(13)} )
  250. set_stone( "st-door_a", 6, 8, {name=door(14)} )
  251. set_stone( "st-door_a", 7, 8, {name=door(15)} )
  252. set_stone( "st-door_a", 8, 8, {name=door(16)} )
  253.  
  254. set_item( "it-trigger", 6, 6, 
  255.           {action="callback", target="show_sequence"} )
  256.  
  257. set_stone( "st-fart", 1,  1,  {name=light(1)} )
  258. set_stone( "st-fart", 6,  1,  {name=light(2)} )
  259. set_stone( "st-fart", 11, 1,  {name=light(3)} )
  260. set_stone( "st-fart", 1,  6,  {name=light(4)} )
  261. set_stone( "st-fart", 11, 6,  {name=light(5)} )
  262. set_stone( "st-fart", 1,  11, {name=light(6)} )
  263. set_stone( "st-fart", 6,  11, {name=light(7)} )
  264. set_stone( "st-fart", 11, 11, {name=light(8)} )
  265.  
  266. set_stone( "st-switch", 2, 2, 
  267.            {action="callback", target="switch1"} )
  268. set_stone( "st-switch", 6, 2, 
  269.            {action="callback", target="switch2"} )
  270. set_stone( "st-switch", 10, 2, 
  271.            {action="callback", target="switch3"} )
  272. set_stone( "st-switch", 2, 6, 
  273.            {action="callback", target="switch4"} )
  274. set_stone( "st-switch", 10, 6, 
  275.            {action="callback", target="switch5"} )
  276. set_stone( "st-switch", 2, 10, 
  277.            {action="callback", target="switch6"} )
  278. set_stone( "st-switch", 6, 10, 
  279.            {action="callback", target="switch7"} )
  280. set_stone( "st-switch", 10, 10, 
  281.            {action="callback", target="switch8"} )
  282.  
  283. set_stone( "st-timer", 18, 6, { name="timer", 
  284.                                 action="callback", 
  285.                                 target="timer_callback", 
  286.                                 interval=1 } )
  287.  
  288.  
  289. oxyd( 18, 1 )
  290. oxyd( 18, 11 )
  291.  
  292. set_stone( "st-laser", 16, 6, {on=TRUE, dir=WEST } )
  293.  
  294. mirror3( 13, 6, FALSE, FALSE, 4 )
  295.  
  296. mirrorp( 13,  1, FALSE, FALSE, 4 )
  297. mirrorp( 13, 11, FALSE, FALSE, 2 )
  298.  
  299.  
  300. for id = 1,4 do
  301.     ya = 6 + id
  302.     yb = 6 - id
  303.     
  304.     set_stone( "st-door_b", 13, ya, {name=name("blocka",id)} )
  305.     set_stone( "st-door_b", 13, yb, {name=name("blockb",id)} )
  306. end
  307.  
  308. for i=1,4 do
  309.     id = 4+i
  310.     x = 13+i
  311.  
  312.     set_stone( "st-door_b", x, 1,  {name=name("blocka",id)} )
  313.     set_stone( "st-door_b", x, 11, {name=name("blockb",id)} )
  314. end
  315.  
  316.  
  317. set_actor( "ac-blackball", 3.5, 6.5, {player=0} )
  318.  
  319. start_level()