home *** CD-ROM | disk | FTP | other *** search
/ GameStar Special 2004 August / GSSH0804.iso / Geschicklichkeit / Enigma / Enigma-081.exe / data / levels / ant05.lua < prev    next >
Text File  |  2003-08-18  |  7KB  |  242 lines

  1. -- The Turtle -- the Enigma Level
  2. -- (c) 2002 Petr Machata/ant_39
  3. -- Licensed under GPL v2.0 or above
  4. -- 2003-02-10 -- keeping up to date with latest additions to ant.lua
  5.  
  6. dofile(enigma.FindDataFile("levels/ant.lua"))
  7.  
  8. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  9. --turtle state
  10. ingame = nil
  11.  
  12. --command constants
  13. command_clean = -1
  14. command_north = enigma.NORTH
  15. command_south = enigma.SOUTH
  16. command_west  = enigma.WEST
  17. command_east  = enigma.EAST
  18.  
  19. --work
  20. command=command_clean
  21.  
  22. --pad center
  23. cent = {}; function set_pad_center(x, y)  cent.x, cent.y = x, y end
  24.  
  25. --magic stone position
  26. mags = {}; function set_magic_stone(x, y) mags.x, mags.y = x, y end
  27.  
  28. --table to translate current command to stone properties
  29. --x, y is current direction indicator position - floor
  30. --face is face of stone in buffer
  31. --params is the direction of the bolder (ignored otherwise)
  32. function new_command(flx0, fly0, face0, params0)
  33.    ret = {}
  34.    ret.face = face0
  35.    ret.par = params0
  36.    ret.x = flx0
  37.    ret.y = fly0
  38.    return ret
  39. end
  40.  
  41. buftable = {}
  42.  
  43. --command selection via the trigger "gamepad"
  44. function setcommand(newcmd)
  45.    local flx0, fly0 = buftable[newcmd].x, buftable[newcmd].y
  46.    local clx0, cly0 = buftable[command].x, buftable[command].y
  47.  
  48.    if (not(ingame)) then
  49.       if ((clx0 or cly0) ~= nil) then set_floor("fl-sand",   clx0, cly0); end
  50.       if ((flx0 or fly0) ~= nil) then set_floor("fl-normal", flx0, fly0); end
  51.       command = newcmd
  52.    end
  53. end
  54.  
  55. function commandnorth() setcommand(command_north); end
  56. function commandsouth() setcommand(command_south); end
  57. function commandeast()  setcommand(command_east);  end
  58. function commandwest()  setcommand(command_west);  end
  59. function commandclean() setcommand(command_clean); end
  60.  
  61. --magic stones eyecandy
  62. function magic_stone(face)
  63.    enigma.KillStone(mags.x, mags.y)
  64.    set_stone(face, mags.x, mags.y)
  65. end
  66.  
  67. function draw_magic()    magic_stone("st-magic") end
  68. function erase_magic()   magic_stone("st-rock1") end
  69. function invalid_magic() magic_stone("st-death") end
  70.  
  71. --bufferworks
  72. first_free_element = function (buf,i) return buf[i].command ~= command_clean end
  73. first_command = function (buf,i) return buf[i].command == command_clean end
  74.  
  75. function buffer_create(buf)
  76.    local ret = {}
  77.    ret.n = 0
  78.    return ret
  79. end
  80.  
  81. function buffer_add_item(buf, x,y)
  82.    buf.n = buf.n+1
  83.    buf[buf.n] = {}
  84.    buf[buf.n].x = x
  85.    buf[buf.n].y = y
  86.    buf[buf.n].command = command_clean
  87. end
  88.  
  89. function draw_buffer(buf, tab)
  90.    for i=1,buffer_items.n do
  91.       local x, y, cmd = buf[i].x, buf[i].y, buf[i].command
  92.       local tab = tab[cmd]
  93.  
  94.       enigma.KillStone(x, y)
  95.       set_stone(tab.face, x, y, {direction=tab.par})
  96.    end
  97. end
  98.  
  99. function buffer_generic_test(buf,test)
  100.    local i=1
  101.    while test(buf,i) do
  102.       i=i+1
  103.       if (not(buf[i])) then
  104.      return nil
  105.       end
  106.    end
  107.    return i
  108. end
  109.  
  110. function buffer_push_command(buf)
  111.    local i = buffer_generic_test(buf, first_free_element)
  112.  
  113.    if (i) then
  114.       buf[i].command = command
  115.    end
  116. end
  117.  
  118. function buffer_pop_command(buf)
  119.    local i = buffer_generic_test(buf, first_command)
  120.  
  121.    if (i) then
  122.       local ret = buf[i].command
  123.       buf[i].command = command_clean
  124.       return ret
  125.    else
  126.       return nil
  127.    end
  128. end
  129.  
  130. function buffer_clear_commands(buf)
  131.    for i=1,buf.n do
  132.       buf[i].command = command_clean
  133.    end
  134. end
  135.  
  136. -- wrappers to be called by enigma and map drawing function
  137. function additem(x,y)
  138.    buffer_add_item(buffer_items, x, y)
  139. end
  140.  
  141. buffer_items = buffer_create()
  142.  
  143. function addcommand()
  144.    if (not(ingame)) then
  145.       buffer_push_command(buffer_items)
  146.       draw_buffer(buffer_items, buftable)
  147.       commandclean()
  148.    end
  149. end
  150.  
  151. function clearbuffer()
  152.    ingame = nil
  153.    buffer_clear_commands(buffer_items)
  154.    draw_buffer(buffer_items, buftable)
  155.    erase_magic()
  156. end
  157.  
  158. counter = 0
  159. function boldercommand(startcommand)
  160.    if (startcommand==1) then
  161.       counter = 0
  162.    end
  163.  
  164.    if (mod(counter,2) == 0) then --trigger works twice: upon enter and upon leave
  165.       local cmd = buffer_pop_command(buffer_items)
  166.  
  167.       if (cmd) then
  168.          enigma.SendMessage(enigma.GetNamedObject("bolder1"), "direction", buftable[cmd].par)
  169.          draw_buffer(buffer_items, buftable)
  170.          draw_magic()
  171.       else
  172.          invalid_magic()
  173.       end
  174.    end
  175.  
  176.    counter = counter + 1
  177. end
  178.  
  179. function startbolder()
  180.    if (not(ingame)) then
  181.       ingame = 1
  182.       boldercommand(1)
  183.    end
  184. end
  185.  
  186. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  187. -- and finally, the map itself
  188. cells={}
  189. cells[" "]=cell{floor={face="fl-sand"}}
  190. cells["#"]=cell{stone="st-rock1"}
  191. cells["x"]=cell{stone="st-grate1"}
  192. cells["!"]=cell{{cells["x"], additem}}
  193. cells["a"]=cell{stone={"st-switch", {action="callback", target="addcommand" }}}
  194. cells["b"]=cell{stone={"st-switch", {action="callback", target="startbolder"}}}
  195. cells["c"]=cell{stone={"st-switch", {action="callback", target="clearbuffer"}}}
  196. cells["d"]=cell{item= {"it-trigger",{action="callback", target="commandwest"}}}
  197. cells["e"]=cell{item= {"it-trigger",{action="callback", target="commandnorth"}}}
  198. cells["f"]=cell{item= {"it-trigger",{action="callback", target="commandeast"}}}
  199. cells["g"]=cell{item= {"it-trigger",{action="callback", target="commandsouth"}}}
  200. cells["+"]=cell{{{document, "Welcome to the control room. Use the triggers and switches to plan the movement of the turtle. The switches are, clockwise: Add, Run and Restart."}}}
  201. cells["*"]=cell{parent=set_pad_center, actor={"ac-blackball", {player=0}}}
  202. cells["~"]=cell{parent={cells["#"], set_magic_stone}}
  203. cells["<"]=cell{stone={"st-bolder",  {name="bolder1", direction=enigma.WEST}}}
  204. cells["t"]=cell{item= {"it-trigger", {action="callback", target="boldercommand"}}}
  205. cells["0"]=oxyd
  206.  
  207. level = {
  208.    "########0########0##",
  209.    "#!!!!!#t      t   t#",
  210.    "#!!!!!# t      t tt#",
  211.    "#####a#t  t  t  #  #",
  212.    "#    +# t  t    #  #",
  213.    "#  e  ###t    t #  #",
  214.    "# d*f   b<   t    t#",
  215.    "#  g  ###t  t   #  #",
  216.    "#     #t   t    #  #",
  217.    "#####c# t    t  #  #",
  218.    "#!!!!!#t       t tt#",
  219.    "#!!!!!#t      t   t#",
  220.    "######~#0########0##",
  221. }
  222.  
  223.  
  224. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  225. -- init
  226.  
  227. oxyd_default_flavor = "a"
  228. set_default_parent(cells[" "])
  229. create_world_by_map(level)
  230.  
  231. buftable [command_clean] = new_command(nil,  nil,  "st-grate1", NODIR)
  232. buftable [command_north] = new_command(cent.x, cent.y-2, "st-bolder", NORTH)
  233. buftable [command_south] = new_command(cent.x, cent.y+2, "st-bolder", SOUTH)
  234. buftable [command_east]  = new_command(cent.x+2, cent.y, "st-bolder", EAST )
  235. buftable [command_west]  = new_command(cent.x-2, cent.y, "st-bolder", WEST )
  236.  
  237. clearbuffer()
  238. oxyd_shuffle()
  239.  
  240. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  241. -- enough :)
  242.