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

  1. -- Everhungry -- the Enigma Level
  2. -- (c) 2003 Petr Machata/ant_39
  3. -- Licensed under GPL v2.0 or above
  4. -- 2003-02-12
  5.  
  6. dofile(enigma.FindDataFile("levels/ant.lua"))
  7.  
  8. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  9.  
  10. local shatter_map = {count=0, effct=1}
  11. local intact_fields = {}
  12.  
  13. -- shatter given piece of floor
  14. function bombit(x0, y0)
  15.    bomb = set_item("it-blackbomb", x0, y0)
  16.    enigma.SendMessage(bomb, "explode", nil)
  17.    %shatter_map[getkey(x0,y0)] = {x=x0, y=y0}
  18.    %shatter_map.count = %shatter_map.count+1
  19.    %shatter_map[%shatter_map.count] = %shatter_map[getkey(x0,y0)]
  20. end
  21.  
  22. -- add given field to list of intact fields
  23. function add_intact(x0, y0)
  24.    %intact_fields[getkey(x0,y0)] = 1
  25. end
  26.  
  27. -- move the eater
  28. function tick()
  29.    if ((%shatter_map.count or 0)==0) then bombit(10,7) return end
  30.    if (%shatter_map.effct > %shatter_map.count) then return end
  31.  
  32.    local minx, maxx = 1, level_width-2
  33.    local miny, maxy = 1, level_height-2 
  34.  
  35.    local count = 0,0
  36.    local found = -1
  37.    local x0,y0, x1,y1 = 0,0, 0,0
  38.  
  39.    repeat
  40.       -- once the array is empty, there are no shatters left to satisfy conditions
  41.       if (%shatter_map.effct > %shatter_map.count) then return end
  42.       -- pick a field from shatter array and movement direction
  43.       local m = %shatter_map.count
  44.       local d = random(1,4)
  45.       -- setup coordinates
  46.       x0, y0 = %shatter_map[m].x, %shatter_map[m].y
  47.       x1, y1 = x0, y0
  48.       -- setup flags
  49.       found = 1
  50.       count= 0
  51.  
  52.       repeat
  53.      if     (d == 1) then x1=x0+0 y1=y0-1
  54.      elseif (d == 2) then x1=x0+1 y1=y0+0
  55.      elseif (d == 3) then x1=x0+0 y1=y0+1
  56.      elseif (d == 4) then x1=x0-1 y1=y0+0
  57.      end
  58.  
  59.      d = d+1
  60.      if (d>4) then d=d-4 end
  61.  
  62.      count=count+1
  63.      if (count>4) then found=0 break end
  64.  
  65.      cond = (not(%shatter_map[getkey(x1,y1)] or %intact_fields[getkey(x1,y1)]))
  66.       until cond
  67.  
  68.       --if not found, this square is inner void
  69.       if (found == 0) then
  70.      -- swap
  71.      local rem = %shatter_map[%shatter_map.effct]
  72.      %shatter_map[%shatter_map.effct] = %shatter_map[m]
  73.      %shatter_map[m] = rem
  74.      -- move effective counter of shatter array
  75.      %shatter_map.effct = %shatter_map.effct+1
  76.       end
  77.    until (found==1)
  78.  
  79.    bombit(x1,y1)
  80. end
  81.  
  82. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  83. floor = cell{floor="fl-tigris"}
  84. stone = cell{stone="st-rock5"}
  85. spring= cell{item= "it-spring1"}
  86. actor = cell{actor={"ac-blackball", {player=0}}, parent=spring}
  87. timer = cell{stone={"st-timer", {action="callback", target="tick", interval=0.2}}}
  88. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  89.  
  90. create_world(20, 13)
  91. fill_world_func(floor)
  92. draw_border_func({stone,add_intact})
  93.  
  94. timer(0,0)
  95. set_funcs(oxyd, {{0,1},{0,6},{0,11},{19,1},{19,6},{19,11}})
  96. set_funcs(add_intact, {{1,1},{1,6},{1,11},{18,1},{18,6},{18,11}})
  97. oxyd_shuffle()
  98.  
  99. actor(1,1)
  100.