home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / Enigma / Enigma-1.01-w7.exe / data / levels / ant.lua next >
Text File  |  2009-12-13  |  47KB  |  1,527 lines

  1. ------------------------------------------------------------------------
  2. -- Copyright (C) 2002-2003 Petr Machata
  3. --
  4. -- This program is free software; you can redistribute it and/or
  5. -- modify it under the terms of the GNU General Public License
  6. -- as published by the Free Software Foundation; either version 2
  7. -- of the License, or (at your option) any later version.
  8. --
  9. -- This program is distributed in the hope that it will be useful,
  10. -- but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. -- GNU General Public License for more details.
  13. --
  14. -- You should have received a copy of the GNU General Public License along
  15. -- with this program; if not, write to the Free Software Foundation, Inc.,
  16. -- 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
  17. --
  18. -- $Id: ant.lua,v 1.20 2004/02/10 21:47:44 ant_39 Exp $
  19. ------------------------------------------------------------------------
  20. --
  21. -- This module contains All Neccessary Tools for designing enigma maps.
  22. -- There is a documentation available, please read it if you want
  23. -- to find out how to use this (see <enigma-dir>/doc/ant_lua.txt),
  24. -- or look at how miscelaneous ant??.lua maps are done.
  25. -- Any questions, bug reports or anything related to this module please send to:
  26. --   my e-mail:              ant_39 at centrum.cz
  27. --   enigma-devel ML:  enigma-devel at nongnu.org
  28. --
  29. -- revision history:
  30. -- 2003-01-07 -- special floor types and train support
  31. -- 2003-01-11 -- multiples support (groups of doors, bolders etc.)
  32. -- 2003-01-14 -- bugfixes and error reporting, some new map-creating funcs
  33. -- 2003-02-09 --
  34. --   many changes. Fixes of rubberband functions, fixes in multiples support, some interfaces changed
  35. --   These changes require also fixes in several levels, but it's more logic this way. Besides this, it's
  36. --   finally possible to call functions from init.lua or any functions declared like func(x, y, args),
  37. --   for example oxyd(), fakeoxyd(), laser(), ...  and others.
  38. --   While I was rewriting, I finally implemented multichar maps, which I planned since the beginning...
  39. -- 2003-02-11 -- fixes in filling functions
  40. -- 2003-02-12 -- cell() now returns last created object; functional-drawing functions accept table; and fixes
  41. -- 2003-02-20 --
  42. --   major rewrite of cell() function. This require also changes in *all* (~30) levels so far
  43. --   I'll do it now, until there is just a few things to change... Later it could be too late
  44. --   and these changes are really necessary
  45. --   These changes include rewrites in parent function handling, so that it now supports a kind
  46. --   of curried functions from haskell. Also you can use the coordlists instead of simple coords and
  47. --   place several elements at once. And so on...
  48. --   Big changes in interfacing many parent functions, completely rewritten trains and puzzle generators,
  49. --   changes in multiples (there are more kinds, and interfacing changed).
  50. --   A bug in multichar cell key fixed
  51. -- 2003-02-25 --
  52. --   add_multi* now uses tinsert/tremove, functions that work with multiples adapted where necessary
  53. --   some comments fixed, few minor fixes across the source. warning().
  54. -- 2003-03-08 --
  55. --   support for parents that do not accept coordinates, default cell key meanings, updates in default
  56. --   parent handling, debug mode
  57. -- 2003-03-13 -- several cosmetic changes plus add_multitag, spread_tag, wormholes generator and slope generator
  58. -- 2003-03-21 -- warning may raise error if warning_raises_error is set to 1 (ralf)
  59. -- 2003-03-30 --
  60. --   some comments fixed, be_pedantic() added, add_multitag fix, draw_map and get_map_size
  61. --   were broken up to several parts so that particular tasks may be solved as designer wishes.
  62. --   cell0.tag removed - I'm not sure if it was ever used at all...
  63. --   some improvements in handling default cell key meanings at multichar maps
  64. -- 2003-04-12 -- interface of add_multiobject changed to match interface of other multiples
  65. -- 2003-04-25 -- boolean tables
  66. -- 2003-06-19 -- render_puzzles accepts a 'kind' argument. Thanks to ralf!
  67. -- 2003-10-09 -- oxyd_custom, oxyd_col and oxyd_fla added.
  68. -- 2004-02-09 -- add_multitag removed, many cosmetic changes across the code
  69.  
  70.  
  71. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  72. -- MISCELANEOUS - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  73. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  74. -- for warning messages
  75. function warning(text)
  76.    if (warning_raises_error) then
  77.       error(" [ant.lua]: "..text)
  78.    else
  79.       print("warning: [ant.lua]: "..text)
  80.    end
  81. end
  82.  
  83. -- turn warning messages to errors
  84. -- usage: be_pedantic() -> turn on raising errors instead of warnings
  85. function be_pedantic(mode)
  86.    warning_raises_error = ((mode==nil)or(mode~=0))
  87. end
  88.  
  89. -- for debug messages
  90. function debug(text)
  91.    if (DEBUG_MODE) then
  92.       print("debug: [ant.lua]: "..text)
  93.    end
  94. end
  95.  
  96. -- debug mode
  97. -- in debug mode, ant.lua produces messages that inform you about the execution
  98. DEBUG_MODE = nil
  99. function debug_mode()
  100.    DEBUG_MODE = 1
  101.    debug("debug_mode: debug mode turned on")
  102. end
  103.  
  104. -- turn off debug mode
  105. function debug_mode_off()
  106.    debug("debug_mode_off: turning debug mode off")
  107.    DEBUG_MODE = nil
  108. end
  109.  
  110. -- x,y should be numbers, although chars and strings are generally also the right choice
  111. function getkey(...)
  112.    local key=""
  113.    for i = 1,getn(arg) do
  114.       if (i > 1) then key = key.."\0" end
  115.       key = key..arg[i]
  116.    end
  117.    return key
  118. end
  119.  
  120. -- todo: deep clone - clone also nested tables
  121. function clone_table(tab)
  122.    local ntab = {}
  123.  
  124.    for key,val in pairs(tab) do
  125.       ntab[key] = val
  126.    end
  127.  
  128.    return ntab;
  129. end
  130.  
  131. -- each ant.lua function, that accepts coordinates, may be
  132. -- called with negative coordinates as well. That in fact
  133. -- means to place the object relatively to lower right
  134. -- corner.
  135. --  location [-1,-1] means [levelw, levelh]
  136. --  size [0,0] means [levelw, levelh]
  137. function transform_coords(x,y,w,h)
  138.    local x, y = (x or 0), (y or 0)
  139.    local w, h = (w or 0), (h or 0)
  140.    if (x <  0) then x = level_width  + x - 1 end
  141.    if (y <  0) then y = level_height + y - 1 end
  142.    if (w <= 0) then w = level_width  + w end
  143.    if (h <= 0) then h = level_height + h end
  144.    return x,y,w,h
  145. end
  146.  
  147. -- this couple of functions takes care of converting common tile coordinates to real coordinates of placed
  148. -- actor. It depends on the given actor_mode, which is being declared like this:
  149. -- cells["O"]=cell{parent=cells["+"], actor={face="ac-blackball", attr={player=0}, mode=ACTOR_MODE}}
  150. --
  151. -- the meaning of actor mode is as follows:
  152. -- value || x | y || meaning
  153. -- ------++---+---++--------
  154. --  0    || 0 | 0 || actor is placed to left top corner of tile
  155. --  1    || 1 | 0 || actor is centered horizontally on tile
  156. --  2    || 0 | 1 || actor is centered vertically on tile
  157. --  3    || 1 | 1 || actor is centered in tile
  158. --
  159. function get_actor_x(x, actor_mode)
  160.    if ((actor_mode == 0) or (actor_mode == 2)) then
  161.       return x
  162.    else
  163.       return x + 0.5
  164.    end
  165. end
  166.  
  167. function get_actor_y(y, actor_mode)
  168.    if ((actor_mode == 0) or (actor_mode == 1)) then
  169.       return y
  170.    else
  171.       return y + 0.5
  172.    end
  173. end
  174.  
  175.  
  176.  
  177.  
  178. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  179. -- VISUAL MAP CREATION  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  180. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  181.  
  182. -- width of key in map definition
  183. -- CELL_KEY_WIDTH means how many characters occupy single map cell. In several maps I strongly
  184. -- wanted this functions (cannonball for example), and after all here it is. Usable in maps with
  185. -- wide variety of different surfaces.
  186. CELL_KEY_WIDTH = 1
  187. function set_cell_key_width(w)
  188.    if ( (type(w) == "number") and (w>0) and (floor(w) == w) ) then
  189.       CELL_KEY_WIDTH = w
  190.       debug("set_cell_key_width: CELL_KEY_WIDTH is: "..w)
  191.       return w
  192.    else
  193.       warning("set_cell_key_width: CELL_KEY_WIDTH has to be positive whole number")
  194.       return -1
  195.    end
  196. end
  197.  
  198. -- get a table with cell functions
  199. -- with no argument given, global cells is looked for.
  200. -- if none is present, warning occurs.
  201. function get_cellfuncs(cellfuncs)
  202.    local funcs = cellfuncs or cells;  -- hope for a global cells
  203.  
  204.    if (not(funcs)) then
  205.       warning("get_cellfuncs: no cellfuncs declared and global variable 'cells' is absent.")
  206.       funcs = {};
  207.    else
  208.       debug("get_cellfuncs: ok, found cellfuncs table.")
  209.    end
  210.  
  211.    return funcs;
  212. end
  213.  
  214. -- this function tries to guess the width of key.
  215. -- It does so by looking for the most common width of keys in cells[key]
  216. function guess_cell_key_width(cellfuncs)
  217.    local funcs = get_cellfuncs(cellfuncs)
  218.    local freq_table = {}
  219.  
  220.    for key,_ in pairs(funcs) do
  221.       local ktype = type(key)
  222.       if (ktype == "string") then
  223.      local n = strlen(key)
  224.      freq_table[n] = (freq_table[n] or 0)+1
  225.       end
  226.    end
  227.  
  228.    local maxw,maxfreq = 0,0
  229.    for w,freq in pairs(freq_table) do
  230.       if (freq > maxfreq) then
  231.      maxw = w
  232.      maxfreq = freq
  233.       end
  234.    end
  235.  
  236.    debug("guess_cell_key_width: CELL_KEY_WIDTH guessed "..maxw)
  237.    return set_cell_key_width(maxw)
  238. end
  239.  
  240. -- default cell parent is called before any of common cell parents
  241. -- default parent is a table, where each element may be
  242. --  + a function
  243. --  + a string, in which case this is a key in cellfunc table
  244. -- also set_default_parent can be called with a single function
  245. -- or string argument. The table will be built from this.
  246. DEFAULT_CELL_PARENT = nil
  247. function set_default_parent(func)
  248.    if (not(func)) then
  249.       debug("set_default_parent: default parent turned off")
  250.       DEFAULT_CELL_PARENT = nil
  251.       return
  252.    end
  253.  
  254.    if ((type(func) == "function") or (type(func) == "string")) then
  255.       func = {func}
  256.    end
  257.  
  258.    if (type(func) == "table") then
  259.       for key,f in pairs(func) do
  260.      local ftype = type(f)
  261.      if ((ftype ~= "function") and (ftype ~= "string")) then
  262.         warning("set_default_parent: element "..key.." of DEFAULT_CELL_PARENT\n"..
  263.             "has to be function or string, not "..ftype.."!")
  264.         return
  265.      end
  266.       end
  267.       DEFAULT_CELL_PARENT = func
  268.    else
  269.       warning("set_default_parent: default parent has to be\n"..
  270.           "a function, table of functions or string key")
  271.    end
  272. end
  273.  
  274. -- each item:
  275. --  + face - name of stone/floor/item object
  276. --  + attr - set of attributes of given object
  277. function cell_item(it)
  278.    local tit = type(it)
  279.    if (tit == "string") then
  280.       it = {it}
  281.    elseif (tit == "table") then
  282.       -- this is O.K.
  283.    else
  284.       warning("cell_item: cell item may be string or table, not "..tit.."!")
  285.    end
  286.  
  287.    local n_it = {}
  288.    n_it.face = (it.face or it[1] or "")
  289.    n_it.attr = (it.attr or it[2] or {})
  290.    n_it.mode = (it.mode or it[3] or 3)
  291.  
  292.    return n_it
  293. end
  294.  
  295. -- each cell
  296. --  + stone - if present, the stone shall be added to defined position
  297. --  + floor - the same, but for floor
  298. --  + item  - the same, but for item
  299. --  + actor - the same, but for actor
  300. --    ++ mode - see get_actor_x() and _y() functions
  301. --  + mode - parent arglist handling mode. Defaults to 0 and it tells us where to put (x,y) couple in arglist
  302. --    ++ mode = -1 => do not place the (x,y) couple to arglist
  303. --    ++ mode = +0 => place it before parent arguments
  304.  
  305. --  ATTENTION: there *has* to be a coordlist even in case of pmode=-1, or NO arguments may be passed:
  306. --    -> func()
  307. --    -> func(x,y)
  308. --    -> func(x,y, arg1, arg2, ...)
  309. --    -> func(arg1, arg2) --> INCORRECT!!
  310.  
  311. function cell(structure)
  312.    local cell0 = {}
  313.  
  314.    cell0.floor = cell_item(structure.floor or {})
  315.    cell0.stone = cell_item(structure.stone or {})
  316.    cell0.item =  cell_item(structure.item or {})
  317.    cell0.actor = cell_item(structure.actor or {})
  318.  
  319.    -- get parent
  320.    -- parent is declared in this form: parent={{func1, arg1, arg2,...},...}
  321.    -- if it's not, convert to this form
  322.    local parent = (structure.parent or structure[1] or {})
  323.  
  324.    if (type(parent) == "function") then
  325.       parent = {parent}
  326.    elseif (type(parent) == "table") then
  327.       -- this is O.K.
  328.    else
  329.       warning("cell{}: parent has to be a function, a table of functions\n"..
  330.           "or a table of curry-functions, not "..type(parent))
  331.       parent = {}
  332.    end
  333.  
  334.    for a = 1,getn(parent) do
  335.       if (type(parent[a]) == "function") then
  336.      parent[a] = {parent[a]}
  337.       elseif (type(parent[a]) == "table") then
  338.      if (type(parent[a][1]) == "function") then
  339.         -- this is O.K. => a curry function call {func, arg1, arg2, ...}
  340.      else
  341.         warning("cell{}: parent element number "..a.." looks like a curry-function\n"..
  342.             "construction, but its first element isn't a function, it's "..type(parent[a])..".\n"..
  343.             "Using empty function instead.")
  344.         parent[a] = {function() end}
  345.      end
  346.       else
  347.      warning("cell{}: parent element number "..a.." should be a function\n"..
  348.          "or a curry-function construction, not "..type(parent[a])..".\n"..
  349.          "Using empty function instead.")
  350.      parent[a] = {function() end}
  351.       end
  352.    end
  353.  
  354.    --+ this functions manages calling various parent functions. Most functions are just func(x,y) or (x,y,something)
  355.    --  but it's also possible to call ({{x1,y1},{x2,y2}}, something1, something2)
  356.    --  This enables compatibility with and wrapping of functions form init.lua.
  357.    --+ At the same moment, it's possible to declare some parametters in cell functions, like this:
  358.    --     cell1 = cell{parent={{func, par1}}}
  359.    --  and then call  --cell1(par2)--  instead of  --func(par1, par2)--
  360.    --  It may be used as a sort of curried functions from haskell, as far as my poor haskell knowledge says...
  361.    return function(...)
  362.          local xylist = tremove(arg, 1) or {}
  363.          local ret = nil
  364.  
  365.          -- first, get rid of cell(x,y) notation and convert it to cell({{x0,y0}}) notation
  366.          local xtp = type(xylist);
  367.          if (xtp == "number") then
  368.         xylist = {{xylist, tremove(arg, 1)}}
  369.          elseif ((xtp == "table") and (type(xylist[1]) == "number")) then
  370.         xylist = {xylist}
  371.          end
  372.  
  373.          for idx = 1,getn(parent) do
  374.         local tab0 = parent[idx]
  375.         --+ tab0 is table. first item is function, the rest are the the function arguments
  376.         --+ first extract function from tab0, then include arguments from function call to the
  377.         --  tab, add a place for x,y coordinates and call it. Eventually tab will look like this:
  378.         --    {x, y, pfpar1, pfpar2, ..., arg1, arg2, ...}
  379.         local func = tab0[1]
  380.         local pmode = tab0.mode or parent.mode or 0
  381.  
  382.         local tab;
  383.         if (pmode == 0) then
  384.            tab = {0,0}
  385.         else
  386.            tab = {}
  387.         end
  388.  
  389.         for a = 2,getn(tab0) do
  390.            tinsert(tab, tab0[a])
  391.         end
  392.  
  393.         for a = 1,getn(arg) do
  394.            tinsert(tab, arg[a])
  395.         end
  396.  
  397.         -- and call a function
  398.         if (pmode == 0) then
  399.            for i = 1,getn(xylist) do
  400.               tab[1],tab[2] = transform_coords(xylist[i][1], xylist[i][2])
  401.               ret = func(unpack(tab))
  402.            end
  403.         else
  404.            ret = func(unpack(tab))
  405.         end
  406.          end
  407.  
  408.          --process common map elements
  409.          for i = 1,getn(xylist) do
  410.         local x,y = transform_coords(xylist[i][1], xylist[i][2])
  411.         if (structure.stone) then ret = set_stone(cell0.stone.face, x, y, cell0.stone.attr) end
  412.         if (structure.floor) then ret = set_floor(cell0.floor.face, x, y, cell0.floor.attr) end
  413.         if (structure.item ) then ret = set_item (cell0.item.face , x, y, cell0.item.attr ) end
  414.         if (structure.actor) then
  415.            local ax, ay = get_actor_x(x, cell0.actor.mode), get_actor_y(y, cell0.actor.mode)
  416.            ret = set_actor(cell0.actor.face, ax, ay, cell0.actor.attr)
  417.         end
  418.          end
  419.          return ret
  420.       end
  421. end
  422.  
  423. -- height is just number of lines
  424. function get_map_height(map)
  425.    return getn(map)
  426. end
  427.  
  428. -- width of particular map row
  429. function map_row_length(y, map)
  430.    return floor( strlen( map[y]) / CELL_KEY_WIDTH);
  431. end
  432.  
  433. -- width - this is width of the widest row of map
  434. function get_map_width(map)
  435.    local mapw = 0
  436.  
  437.    for y = 1,get_map_height(map) do
  438.       local w = map_row_length(y, map)
  439.       if w > mapw then
  440.      mapw = w
  441.       end
  442.    end
  443.  
  444.    return mapw
  445. end
  446.  
  447. -- and size combined
  448. function get_map_size(map)
  449.    return get_map_width(map), get_map_height(map)
  450. end
  451.  
  452. -- common map
  453. -- if a key has no meaning declared in given 'cellfuncs', we'll look here
  454. -- whether there is a 'default' meaning
  455. -- look at the bottom of ant.lua to see the map
  456. DEFAULT_KEY_MEANING = {}
  457. function map_cell_meaning(key, func)
  458.    DEFAULT_KEY_MEANING[key] = func
  459. end
  460.  
  461. -- use cells from default library in cellfuncs table
  462. -- this function accepts a table of cellfuncs and arbitrary number of string keys as arguments
  463. -- it loads the default keys to given cellfuncs table
  464. function use_cells(funcs, ...)
  465.    for a = 1,getn(arg) do
  466.       funcs[arg[a]] = DEFAULT_KEY_MEANING[arg[a]]
  467.    end
  468. end
  469.  
  470. -- function picks a function from table of default cell keys
  471. -- and results it
  472. function default_cell(key)
  473.    return DEFAULT_KEY_MEANING[key]
  474. end
  475.  
  476. -- this function accepts a cell key and cellfuncs table
  477. -- it looks into that table and if there is no func with given key, it returns default
  478. -- value instead and inserts the value to given cellfuncs table
  479. function get_cell_func(key, cellfuncs)
  480.    if (cellfuncs[key]) then
  481.       return cellfuncs[key]
  482.    elseif (DEFAULT_KEY_MEANING[key]) then
  483.       debug("get_cell_func: using DEFAULT_KEY_MEANING of '"..key.."'")
  484.       cellfuncs[key] = DEFAULT_KEY_MEANING[key]
  485.       return DEFAULT_KEY_MEANING[key]
  486.    else
  487.       -- for multichar maps, try by the first char
  488.       if (strlen(key)>1) then
  489.      local ret = get_cell_func(strsub(key, 1, 1), cellfuncs)
  490.      if (ret) then
  491.         debug("get_cell_func: as a meaning of the key '"..key.."'")
  492.         cellfuncs[key] = ret;
  493.         return ret
  494.      end
  495.       end
  496.  
  497.       warning("get_cell_func: no function declared for map key '"..key.."'")
  498.       return nil
  499.    end
  500.  
  501.    --notreached
  502.    return nil
  503. end
  504.  
  505.  
  506.  
  507.  
  508. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  509. -- MAP RENDERING FUNCTIONS -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  510. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  511.  
  512. -- render a map square by key
  513. -- rx,ry are x,y coordinates of given cell on map
  514. -- key is a cell descriptor
  515. -- func is a table of cellfuncs
  516. function render_key(rx, ry, key, cellfuncs)
  517.    local cellfuncs = cellfuncs or get_cellfuncs(cellfuncs);
  518.  
  519.    -- call default parents
  520.    if (DEFAULT_CELL_PARENT) then
  521.       for _,val in pairs(DEFAULT_CELL_PARENT) do
  522.      local dpfunc = 0
  523.      if (type(val) == "string") then
  524.         dpfunc = get_cell_func(val, cellfuncs)
  525.      else
  526.         dpfunc = val
  527.      end
  528.  
  529.      if (type(dpfunc) == "function") then
  530.         dpfunc(rx, ry)
  531.      else
  532.         warning("render_key: unknown default parent type for the key: '"..val.."'")
  533.      end
  534.       end
  535.    end
  536.  
  537.    -- call common cell function
  538.    local func = get_cell_func(key, cellfuncs)
  539.    local ftype = type(func)
  540.    if (ftype == "function") then
  541.       func(rx, ry)
  542.    elseif (ftype == "nil") then
  543.       warning("render_key: function doesn't exist for map element '"..key.."'.")
  544.    else
  545.       warning("render_key: cell element '"..key.."' is not a function, it's "..ftype..".")
  546.    end
  547. end
  548.  
  549. -- this function returns a cell key by its x,y coordinates
  550. function get_cell_by_xy(mx, my, map)
  551.    return strsub(map[my], (mx - 1) * CELL_KEY_WIDTH + 1, mx * CELL_KEY_WIDTH)
  552. end
  553.  
  554. -- function renders a given cell of map
  555. -- rx0, ry0 are coordinates of left top square of map
  556. -- mx, my are coordinates of map square to be rendered
  557. function render_map_cell(rx0, ry0, mx, my, map, cellfuncs)
  558.    if (not(map)) then
  559.       warning("render_map_cell: no map given!")
  560.       return
  561.    end
  562.    local cellfuncs = cellfuncs or get_cellfuncs(cellfuncs)
  563.  
  564.    local rx = mx + rx0 - 1
  565.    local ry = my + ry0 - 1
  566.    local key = get_cell_by_xy(mx, my, map)
  567.    render_key(rx, ry, key, cellfuncs)
  568. end
  569.  
  570. -- this draws the map to the position [rx0,ry0]
  571. -- map is array of strings. Each string is one line of result map, each char is one map square.
  572. -- you may omit cellfuncs, default global 'cells' is used instead
  573. function draw_map_portion(rx0, ry0, mxy0, mxy1, map, cellfuncs)
  574.    if (not(map)) then
  575.       warning("draw_map: no map given!")
  576.       return
  577.    end
  578.    local cellfuncs = cellfuncs or get_cellfuncs(cellfuncs);
  579.  
  580.    for my = mxy0[2],mxy1[2] do
  581.       for mx = mxy0[1],mxy1[1] do
  582.      render_map_cell(rx0, ry0, mx, my, map, cellfuncs);
  583.       end
  584.    end
  585. end
  586.  
  587. -- this will draw whole map
  588. -- rx0, ry0 are coordinates of left top map corner
  589. function draw_map(rx0, ry0, map, cellfuncs)
  590.    local mapw, maph = get_map_size(map)
  591.    draw_map_portion(rx0, ry0, {1,1}, {mapw, maph}, map, cellfuncs)
  592. end
  593.  
  594. -- this just prepares the world, but no map is created
  595. function prepare_world_by_map(map)
  596.    local mapw, maph = get_map_size(map)
  597.    local flavor = oxyd_default_flavor
  598.  
  599.    debug("creating world ["..mapw.."x"..maph.."]")
  600.    create_world(mapw, maph)
  601.    oxyd_default_flavor = flavor or oxyd_default_flavor or "b"
  602. end
  603.  
  604. -- this prepares enigma world and draws given map
  605. -- you may omit cellfuncs, default global 'cells' is used instead
  606. function create_world_by_map(map, cellfuncs)
  607.    prepare_world_by_map(map)
  608.    draw_map(0, 0, map, cellfuncs)
  609. end
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  618. -- FUNCTIOAL MAP DRAWING - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  619. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  620. -- functions in this section are much like those defined in init.lua. Major difference
  621. -- is that these functions accept a function as an argument. So, it's possible to call
  622. -- given function with several coordinates at once. Just one single prerequisity -
  623. -- the function must require at most two arguments, and they have to be coordinates
  624. --   func(x,y, non_required_arguments)
  625.  
  626. -- fill each square of map with given function
  627. function fill_world_func(fillfunc, x0, y0, w, h)
  628.    if (type(fillfunc) ~= "table") then
  629.       fillfunc = {fillfunc}
  630.    end
  631.    local x0,y0,w,h = transform_coords(x0, y0, w, h)
  632.  
  633.    for _,func in pairs(fillfunc) do
  634.       for x=x0, x0+w-1 do
  635.      for y=y0, y0+h-1 do
  636.         func(x, y)
  637.      end
  638.       end
  639.    end
  640. end
  641.  
  642. -- to draw border of map by given function
  643. function draw_border_func(fillfunc, x0, y0, w, h)
  644.    if (type(fillfunc) ~= "table") then
  645.       fillfunc = {fillfunc}
  646.    end
  647.    local x0,y0,w,h = transform_coords(x0, y0, w, h)
  648.  
  649.    for _,func in pairs(fillfunc) do
  650.       for x=x0,x0+w-1 do
  651.      func(x, y0)
  652.      func(x, y0+h-1)
  653.       end
  654.  
  655.       for y=y0,y0+h-1 do
  656.      func(x0, y)
  657.      func(x0+w-1, y)
  658.       end
  659.    end
  660. end
  661.  
  662. -- draws into corners of given boundary
  663. function draw_func_corners(fillfunc, x0, y0, w, h)
  664.    if (type(fillfunc) ~= "table") then
  665.       fillfunc = {fillfunc}
  666.    end
  667.    local x0,y0,w,h = transform_coords(x0, y0, w, h)
  668.  
  669.    for _,func in pairs(fillfunc) do
  670.       func(x0,y0)
  671.       func(x0,y0+h-1)
  672.       func(x0+w-1,y0)
  673.       func(x0+w-1,y0+h-1)
  674.    end
  675. end
  676.  
  677. -- like set_stones, but calling a function
  678. -- like: set_funcs(oxyd, {{1,2},{3,4},...})
  679. function set_funcs(fillfunc, poslist)
  680.    if (type(fillfunc) ~= "table") then
  681.       fillfunc = {fillfunc}
  682.    end
  683.  
  684.    for _,func in pairs(fillfunc) do
  685.       for i = 1,getn(poslist) do
  686.           local x,y,w,h = transform_coords(poslist[i][1], poslist[i][2])
  687.           func(x, y)
  688.       end
  689.    end
  690. end
  691.  
  692.  
  693. -- draw functions into a row -- like draw_stones, draw_floor and others, but calls a func
  694. -- generator of coordinates
  695. function get_draw_coords(xylist, dxdylist, steps)
  696.    if (type(xylist[1]) ~= "table") then
  697.       xylist = {xylist}
  698.    end
  699.    if (type(dxdylist[1]) ~= "table") then
  700.       dxdylist = {dxdylist}
  701.    end
  702.    local ret = {}
  703.  
  704.    -- convert
  705.    for i = 1,getn(xylist) do
  706.       local x0,y0 = transform_coords(xylist[i][1], xylist[i][2])
  707.  
  708.       tinsert(ret, {x0,y0})
  709.  
  710.       for j = 1,getn(dxdylist) do
  711.      local x,y   = x0,y0
  712.      local dx,dy = dxdylist[j][1], dxdylist[j][2]
  713.  
  714.      for i = 2,steps do
  715.         x = x+dx
  716.         y = y+dy
  717.         tinsert(ret, {x,y})
  718.      end
  719.       end
  720.    end
  721.    --
  722.    return ret
  723. end
  724.  
  725. -- drawing function
  726. function draw_func(fillfunc, ...)
  727.    if (type(fillfunc) ~= "table") then
  728.       fillfunc = {fillfunc}
  729.    end
  730.  
  731.    local xylist = get_draw_coords(unpack(arg))
  732.  
  733.    for _,func in pairs(fillfunc) do
  734.       for i = 1,getn(xylist) do
  735.      local x,y = transform_coords(xylist[i][1], xylist[i][2])
  736.      func(x,y)
  737.       end
  738.    end
  739. end
  740.  
  741.  
  742. -- draw a function into a regular n-gon. Particularly usable for
  743. -- setting up arrangements of actors, as they accept real values,
  744. -- but if proper roundfunc is given, also stones etc. may be
  745. -- placed with this function.
  746.  
  747. -- generator of coordinates
  748. function get_ngon_coords(xylist, radiuslist, count, alpha0, roundfunc)
  749.    if (type(xylist[1]) ~= "table") then
  750.       xylist = {xylist}
  751.    end
  752.    if (type(radiuslist) ~= "table") then
  753.       radiuslist = {radiuslist}
  754.    end
  755.  
  756.    local astep = 360 / count
  757.    local roundfunc = roundfunc or (function(x) return x end)
  758.  
  759.    local ret = {}
  760.  
  761.    for i = 1,getn(xylist) do
  762.       local x0, y0 = transform_coords(xylist[i][1], xylist[i][2])
  763.  
  764.       for j = 1,getn(radiuslist) do
  765.      local radius = radiuslist[j]
  766.      local alpha  = alpha0 or 0
  767.  
  768.      for _ = 1,count do
  769.         local x00 = roundfunc(x0 + radius * sin(alpha))
  770.         local y00 = roundfunc(y0 + radius * cos(alpha))
  771.         tinsert(ret, {x00,y00})
  772.         alpha = alpha + astep
  773.      end
  774.       end
  775.    end
  776.  
  777.    return ret
  778. end
  779.  
  780. -- drawing function
  781. function ngon_funcs(fillfunc, ...)
  782.    if (type(fillfunc) == "function") then
  783.       fillfunc = {fillfunc}
  784.    end
  785.  
  786.    local xylist = get_ngon_coords(unpack(arg))
  787.  
  788.    for _,func in pairs(fillfunc) do
  789.       for i = 1,getn(xylist) do
  790.      local x,y = transform_coords(xylist[i][1], xylist[i][2])
  791.      func(x,y)
  792.       end
  793.    end
  794. end
  795.  
  796.  
  797.  
  798.  
  799.  
  800.  
  801. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  802. -- SPECIAL FLOOR TYPES  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  803. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  804. -- see ant.lua documentation for extensive howto
  805. -- (this is yet to be done)
  806.  
  807. -- draws checker floor
  808. -- sidex: horizontal size of checker square
  809. -- sidey: vertical size of checker square
  810. -- count: number of checker textures
  811. -- items: table of checker textures {1,2,3,...}
  812. -- x,y:   coordinates of checker field
  813. function mcheckerfloor(x, y, sidex, sidey, offsetx, offsety, count, items)
  814.    local x0 = floor( (x - offsetx + sidex) / sidex)
  815.    local y0 = floor( (y - offsety + sidey) / sidey)
  816.    local remainder = mod(x0+y0, count)
  817.    items[remainder + 1](x,y)
  818. end
  819.  
  820. -- the checkerfloor parent
  821. -- items: checkerfloor textures. Functions generated by cell({structure})
  822. -- eg:
  823. --   cells["."]=cell{floor={face="fl-metal"}}
  824. --   cells[","]=cell{floor={face="fl-normal"}}
  825. --   cells[" "]=cell{parent={{checkerfloor,{cells[","], cells["."]}}}}
  826. -- optionally, at the end of table there may be additional checkerboard generating variables:
  827. --   side - set size of checkerboard square
  828. --   sidex - only set horizontal size (defaults to 1)
  829. --   sidey - only set vertical size (defaults to 1)
  830. --     cells[" "]=cell{parent={{checkerfloor,{cells[","], cells["."]; side=2}}}}
  831. function checkerfloor(x, y, items)
  832.    local count = getn(items)
  833.    local remainder = mod(x+y, count)
  834.    local sidex, sidey = 1, 1
  835.    local offsetx, offsety = 0, 0
  836.  
  837.    if (items.side ~= nil) then
  838.       sidex = items.side
  839.       sidey = sidex
  840.    end
  841.  
  842.    if (items.sidex ~= nil) then
  843.       sidex = items.sidex
  844.    end
  845.  
  846.    if (items.sidey ~= nil) then
  847.       sidey = items.sidey
  848.    end
  849.  
  850.    if (items.offset ~= nil) then
  851.       offsetx = items.offset
  852.       offsety = offsetx
  853.    end
  854.  
  855.    if (items.offsetx ~= nil) then
  856.       offsetx = items.offsetx
  857.    end
  858.  
  859.    if (items.offsety ~= nil) then
  860.       offsety = items.offsety
  861.    end
  862.  
  863.    mcheckerfloor(x, y, sidex, sidey, offsetx, offsety, getn(items), items)
  864. end
  865.  
  866. -- the random floor parent
  867. --  every item may be:
  868. --   texture -- parent function, for example cell[] function
  869. --   occurence -- occurence factor for previous texture. Defaults to 1.
  870. function randomfloor(x, y, ...)
  871.    local count = 0
  872.    local total = 0 --total occurences
  873.  
  874.    local items = {}
  875.    if (getn(arg) == 1) then
  876.       if (type(arg[1]) == "table") then
  877.      items = arg[1]    -- table is passed
  878.       else
  879.      items = {arg[1]}  -- single function passed (hope it's a function)... who could do it?
  880.       end
  881.    else
  882.       items = arg          -- a list of functions and their rarities is not passed in table, but as arguments
  883.    end
  884.  
  885.    local itemlist = {}
  886.  
  887.    for i = 1,getn(items) do
  888.       local item  = items[i]
  889.       local titem = type(item)
  890.       if (titem == "function") then
  891.      count = count + 1
  892.      itemlist[count] = {}
  893.      itemlist[count].func = item
  894.      itemlist[count].occf = 1
  895.      total = total + 1
  896.       elseif (titem == "number") then
  897.      itemlist[count].occf = item
  898.      total = total + item-1
  899.       end
  900.    end
  901.  
  902.    local rand = total*random()
  903.    local ctr  = 0
  904.  
  905.    for i=1,count do
  906.       local move = itemlist[i].occf
  907.       if ((rand>=ctr) and (rand<ctr+move)) then
  908.      itemlist[i].func(x,y)
  909.       end
  910.       ctr = ctr + move
  911.    end
  912. end
  913.  
  914.  
  915.  
  916.  
  917.  
  918. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  919. -- OBJECT GROUPS [MULTIPLES]  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  920. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  921. -- see ant.lua documentation for extensive howto
  922.  
  923. -- add a stone to a group
  924. -- face: this is stone face
  925. -- group: object group table
  926. -- attribs: object attributes
  927. function add_multistone(x, y, face, group, attribs)
  928.    local attribs = attribs or {}
  929.    attribs["name"] = attribs.name or (face..(getn(group)+1))
  930.    tinsert(group, set_stone(face, x, y, attribs))
  931. end
  932.  
  933. -- add a floor to a group
  934. -- face: this is floor face
  935. -- group: object group table
  936. -- attribs: object attributes
  937. function add_multifloor(x, y, face, group, attribs)
  938.    local attribs = attribs or {}
  939.    attribs["name"] = attribs.name or (face..(getn(group)+1))
  940.    tinsert(group, set_floor(face, x, y, attribs))
  941. end
  942.  
  943. -- add an item to a group
  944. -- face: this is an item kind
  945. -- group: object group table
  946. -- attribs: object attributes
  947. function add_multiitem(x, y, face, group, attribs)
  948.    local attribs = attribs or {}
  949.    attribs["name"] = attribs.name or (face..(getn(group)+1))
  950.    tinsert(group, set_item(face, x, y, attribs))
  951. end
  952.  
  953. -- add an actor to a group
  954. -- face: this is floor face
  955. -- group: object group table
  956. -- attribs: object attributes
  957. function add_multiactor(x, y, face, group, attribs, actor_mode)
  958.    local attribs = attribs or {}
  959.    local actor_mode = actor_mode or 3
  960.    attribs["name"] = attribs.name or (face..(getn(group)+1))
  961.    tinsert(group, set_actor(face, get_actor_x(x, actor_mode), get_actor_y(y, actor_mode), attribs))
  962. end
  963.  
  964. -- for generic multiples, this only stores cell coordinates and tag information
  965. -- this is usable for example to construct puzzles and trains, see below
  966. function add_multicell(x, y, group, tag)
  967.    local key = getkey(x,y)
  968.    group[key] = {}
  969.    group[key].x = x
  970.    group[key].y = y
  971.    group[key].tag = tag
  972. end
  973.  
  974. -- another generic multiple
  975. -- this stores the result of given function(x,y) to table
  976. function add_multiobject(x, y, group, func)
  977.    tinsert(group, func(x, y))
  978. end
  979.  
  980.  
  981.  
  982. -- couple of functions to mark all cells in given area with
  983. -- given tagnumber. Used for rendering gradients. Area must
  984. -- be closed, otherwise stack overflow occurs.
  985. -- usage:
  986. --   slopes={}
  987. --   pivots={}
  988. --   cells["*"]=cell{{{add_multicell, slopes, 1}}}
  989. --   cells["&"]=cell{{{add_multicell, pivots, slopes}}}
  990. -- at the end of levelfile:
  991. --   spread_tag(pivots)
  992. --   render_slopes(slopes)
  993. -- BUGS:
  994. --  stack overflows, if:
  995. --  + the shape is not closed
  996. --  + area is too large (for example very long corridor...)
  997. function spread_tag_depth(x0, y0, tab, tag)
  998.    if tab[getkey(x0, y0)] then
  999.       return
  1000.    end
  1001.  
  1002.    add_multicell(x0, y0, tab, tag)
  1003.    spread_tag_depth(x0,   y0-1, tab, tag)
  1004.    spread_tag_depth(x0+1, y0  , tab, tag)
  1005.    spread_tag_depth(x0,   y0+1, tab, tag)
  1006.    spread_tag_depth(x0-1, y0  , tab, tag)
  1007. end
  1008.  
  1009. function spread_tag(tab, tag)
  1010.    local tag = tag or 2
  1011.    for _,val in pairs(tab) do
  1012.       local x0 = val.x
  1013.       local y0 = val.y
  1014.       local tab0 = val.tag
  1015.       spread_tag_depth(x0, y0, tab0, tag)
  1016.    end
  1017. end
  1018.  
  1019. -- add the rubber band between all objects in group 1 and all objects in group 2
  1020. -- that is, each object from gr1 will be connected with each object from gr2
  1021. function add_rubber_bands(gr1, gr2, strength, length)
  1022.    for i = 1,getn(gr1) do
  1023.       for j = 1,getn(gr2) do
  1024.      AddRubberBand(gr1[i], gr2[j], strength, length)
  1025.       end
  1026.    end
  1027. end
  1028.  
  1029. -- add pairs: 1st object from gr1 will be connected with 1st from gr2 and so on
  1030. -- requires same sized groups, of course...
  1031. function add_rubber_band_pairs(gr1, gr2, strength, length)
  1032.    for i = 1,getn(gr1) do
  1033.       AddRubberBand(gr1[i], gr2[i], strength, length)
  1034.    end
  1035. end
  1036.  
  1037. -- to rubber-band given objects [1,2,3,...,n] like that:
  1038. --  1=2=3=...=n=1
  1039. function rubber_band_circle(gr1, strength, length)
  1040.    local remember = nil
  1041.    local first = nil
  1042.    for a = 1,getn(gr1) do
  1043.       local obj1 = gr1[a]
  1044.       if (remember) then
  1045.      AddRubberBand(obj1, remember, strength, length)
  1046.       else
  1047.      first = obj1
  1048.       end
  1049.  
  1050.       remember = obj1
  1051.    end
  1052.  
  1053.    if (first) then
  1054.       AddRubberBand(first, remember, strength, length)
  1055.    end
  1056. end
  1057.  
  1058. -- send message to each object in group
  1059. function send_group_message(group, message, third)
  1060.    for i = 1,getn(group) do
  1061.        SendMessage(group[i], message, third)
  1062.    end
  1063. end
  1064.  
  1065. -- send a message to named object
  1066. function send_message_named(objname, message, third)
  1067.     SendMessage(objname, message, third)
  1068. end
  1069.  
  1070. -- set attribute to each of the objects in group
  1071. function set_group_attribs(group, attribs)
  1072.    for i = 1,getn(group) do
  1073.       set_attribs(group[i], attribs)
  1074.    end
  1075. end
  1076.  
  1077.  
  1078.  
  1079.  
  1080.  
  1081. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1082. -- RAILWAY GENERATOR -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1083. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1084. -- see ant.lua documentation for extensive howto
  1085.  
  1086. function new_rail(engines, path)
  1087.    local func0 = function()
  1088.             for _,engine in pairs(engines) do
  1089.                local ekey = getkey(engine.x, engine.y)
  1090.  
  1091.                for _, dir in pairs({engine.dir,{1,0},{0,1},{-1,0},{0,-1}}) do
  1092.               local x0 = engine.x + dir[1]
  1093.               local y0 = engine.y + dir[2]
  1094.               local key = getkey(x0, y0)
  1095.  
  1096.               if ((path[key]) and (path[key].tag ~= path[ekey].tag)) then
  1097.                  path[key].tag = path[ekey].tag
  1098.                  engine.x, engine.y = x0, y0
  1099.                  engine.dir = dir -- remember direction
  1100.                  engine.tag(x0, y0)
  1101.                  break
  1102.               end
  1103.                end--for directions
  1104.  
  1105.             end--for engines
  1106.          end--function
  1107.    return func0
  1108. end
  1109.  
  1110.  
  1111.  
  1112.  
  1113. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1114. -- PUZZLE GENERATOR  -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1115. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1116. -- see ant.lua documentation for extensive howto
  1117. function render_puzzles(tab, kind, generatorfunc)
  1118.    for _,val in pairs(tab) do
  1119.       local kind = kind or puzzle
  1120.       local x,y = val.x, val.y
  1121.  
  1122.       local up   = 0;
  1123.       local down = 0;
  1124.       local left = 0;
  1125.       local right= 0;
  1126.       if (tab[getkey(x, y-1)] ~= nil) then up = 1 end
  1127.       if (tab[getkey(x, y+1)] ~= nil) then down = 1 end
  1128.       if (tab[getkey(x-1, y)] ~= nil) then left = 1 end
  1129.       if (tab[getkey(x+1, y)] ~= nil) then right = 1 end
  1130.  
  1131.       if (generatorfunc) then
  1132.      generatorfunc(val);
  1133.       end
  1134.  
  1135.       if ((val.tag ~= 2) and (kind)) then
  1136.      kind(x, y, getglobal("PUZ_"..up..right..down..left))
  1137.       end
  1138.    end
  1139. end
  1140.  
  1141.  
  1142.  
  1143.  
  1144. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1145. -- BLACK HOLES GENERATOR - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1146. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1147. -- see ant.lua documentation for extensive howto
  1148.  
  1149. function render_wormholes(holes, targets, whole_attribs, actor_mode)
  1150.    local whole_attribs = whole_attribs or {}
  1151.    local actor_mode = actor_mode or 3
  1152.  
  1153.    for _,hval in pairs(holes) do
  1154.       local target = 0
  1155.       for _,tval in pairs(targets) do
  1156.      if (tval.tag == hval.tag) then
  1157.         target = tval;
  1158.         break
  1159.      end
  1160.       end
  1161.  
  1162.       if (target ~= 0) then
  1163.      local targetx = get_actor_x(target.x, actor_mode)
  1164.      local targety = get_actor_y(target.y, actor_mode)
  1165.      wormhole(hval.x, hval.y, targetx, targety, whole_attribs)
  1166.       end
  1167.    end
  1168. end
  1169.  
  1170. function worm_hole_pair(cellfuncs, whole_cell, tgt_cell, whole_parent, tgt_parent, whole_grp, tgt_grp, tagnumber)
  1171.    cellfuncs[whole_cell] = cell{{whole_parent, {add_multicell, whole_grp, tagnumber}}}
  1172.    cellfuncs[tgt_cell]   = cell{{tgt_parent,   {add_multicell, tgt_grp,   tagnumber}}}
  1173. end
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1181. -- SLOPE GENERATOR - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1182. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1183. -- see ant.lua documentation for extensive howto
  1184.  
  1185. __slopemap = {}
  1186. __slopemap["x0x11x1x"]=SLOPE_N
  1187. __slopemap["x1x01x1x"]=SLOPE_W
  1188. __slopemap["x1x10x1x"]=SLOPE_E
  1189. __slopemap["x1x11x0x"]=SLOPE_S
  1190. __slopemap["x1x00x0x"]=SLOPE_S
  1191. __slopemap["x0x10x0x"]=SLOPE_E
  1192. __slopemap["x0x01x0x"]=SLOPE_W
  1193. __slopemap["x0x00x1x"]=SLOPE_N
  1194.  
  1195. -- soft conditions
  1196. __slopemap["x11x1xxx"]=SLOPE_SMALL_SW
  1197. __slopemap["x1x1111x"]=SLOPE_LARGE_NE
  1198. __slopemap["xxx1x11x"]=SLOPE_SMALL_NE
  1199. __slopemap["x1111x1x"]=SLOPE_LARGE_SW
  1200. __slopemap["xxxx1x11"]=SLOPE_SMALL_NW
  1201. __slopemap["11x11x1x"]=SLOPE_LARGE_SE
  1202. __slopemap["11x1xxxx"]=SLOPE_SMALL_SE
  1203. __slopemap["x1x11x11"]=SLOPE_LARGE_NW
  1204.  
  1205. -- hard conditions -- these don't match always, but help to break ambiguous matches
  1206. __slopemap["x1101x0x"]=SLOPE_SMALL_SW
  1207. __slopemap["x101111x"]=SLOPE_LARGE_NE
  1208. __slopemap["x0x1011x"]=SLOPE_SMALL_NE
  1209. __slopemap["x111101x"]=SLOPE_LARGE_SW
  1210. __slopemap["x0x01x11"]=SLOPE_SMALL_NW
  1211. __slopemap["11x11x10"]=SLOPE_LARGE_SE
  1212. __slopemap["11x10x0x"]=SLOPE_SMALL_SE
  1213. __slopemap["01x11x11"]=SLOPE_LARGE_NW
  1214.  
  1215. --inverses
  1216. __grad_inverse={}
  1217. __grad_inverse[SLOPE_S]=SLOPE_N
  1218. __grad_inverse[SLOPE_N]=SLOPE_S
  1219. __grad_inverse[SLOPE_E]=SLOPE_W
  1220. __grad_inverse[SLOPE_W]=SLOPE_E
  1221. __grad_inverse[SLOPE_LARGE_SE]=SLOPE_SMALL_NW
  1222. __grad_inverse[SLOPE_LARGE_SW]=SLOPE_SMALL_NE
  1223. __grad_inverse[SLOPE_LARGE_NE]=SLOPE_SMALL_SW
  1224. __grad_inverse[SLOPE_LARGE_NW]=SLOPE_SMALL_SE
  1225. __grad_inverse[SLOPE_SMALL_SE]=SLOPE_LARGE_NW
  1226. __grad_inverse[SLOPE_SMALL_NE]=SLOPE_LARGE_SW
  1227. __grad_inverse[SLOPE_SMALL_SW]=SLOPE_LARGE_NE
  1228. __grad_inverse[SLOPE_SMALL_NW]=SLOPE_LARGE_SE
  1229.  
  1230. -- return correct gradient type based on neighbors
  1231. function map_slope(x, y, node)
  1232.    local map = __slopemap;
  1233.    local re  = ""..node[1]..node[2]..node[3]..node[4]..node[5]..node[6]..node[7]..node[8]
  1234.    --
  1235.    local longest = 0;
  1236.    local longkey = 0;
  1237.    local longval = 0;
  1238.    local warns = {}
  1239.    --
  1240.    for key,val in pairs(map) do
  1241.       local okay = 1
  1242.       local count = 0
  1243.       -- okay turns to 0, if any char, that is not 'x', doesn't match
  1244.       for i = 1,strlen(key) do
  1245.      local char1 = strsub(key, i, i)
  1246.      local char2 = strsub(re, i, i)
  1247.      --
  1248.      if ((char1 ~= 'x') and (char2 ~= 'x') and (char1 ~= char2)) then
  1249.         okay = 0
  1250.         break
  1251.      else
  1252.         if ((char1 ~= 'x') and (char2 ~= 'x')) then
  1253.            count = count +1
  1254.         end
  1255.      end
  1256.       end
  1257.       --
  1258.       if (okay == 1) then
  1259.      if (count > longest) then
  1260.         longest = count;
  1261.         longkey = key;
  1262.         longval = val;
  1263.         warns = {}
  1264.      elseif (count == longest) then
  1265.         tinsert(warns, "map_slope: ambiguous match: '"..longkey.."' vs. '"..key.."' for re '"..re.."'")
  1266.      end
  1267.       end
  1268.    end
  1269.    --
  1270.    for i = 1,getn(warns) do
  1271.       debug(warns[i])
  1272.    end
  1273.  
  1274.    if (longest == 0) then
  1275.       warning("map_slope: no match for mask '"..re.."' at ["..x..","..y.."].")
  1276.    end
  1277.  
  1278.    return longval;
  1279. end
  1280.  
  1281. function render_slopes(tab, invert)
  1282.    for _,val in pairs(tab) do
  1283.       local x,y = val.x, val.y
  1284.  
  1285.       local node = {}
  1286.       if (tab[getkey(x-1,y-1)] ~= nil) then tinsert(node, 1) else  tinsert(node, 0) end
  1287.       if (tab[getkey(x  ,y-1)] ~= nil) then tinsert(node, 1) else  tinsert(node, 0) end
  1288.       if (tab[getkey(x+1,y-1)] ~= nil) then tinsert(node, 1) else  tinsert(node, 0) end
  1289.       if (tab[getkey(x-1,y  )] ~= nil) then tinsert(node, 1) else  tinsert(node, 0) end
  1290.       if (tab[getkey(x+1,y  )] ~= nil) then tinsert(node, 1) else  tinsert(node, 0) end
  1291.       if (tab[getkey(x-1,y+1)] ~= nil) then tinsert(node, 1) else  tinsert(node, 0) end
  1292.       if (tab[getkey(x  ,y+1)] ~= nil) then tinsert(node, 1) else  tinsert(node, 0) end
  1293.       if (tab[getkey(x+1,y+1)] ~= nil) then tinsert(node, 1) else  tinsert(node, 0) end
  1294.  
  1295.       if (val.tag ~= 2) then
  1296.      if( (invert ~= nil) ~= (val.tag == -1)) then   -- this is !(invert xor (val.tag == -1))
  1297.         gradient(x, y, __grad_inverse[map_slope(x, y, node)])
  1298.      else
  1299.         gradient(x, y, map_slope(x, y, node))
  1300.      end
  1301.       end
  1302.    end
  1303. end
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1310. -- BOOLEAN TABLES -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1311. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1312. -- see ant.lua documentation for extensive howto
  1313.  
  1314. -- bool_and tests table for and: all elements have to be '1' to succeed
  1315. function bool_and(tab)
  1316.    return tab.count == tab.value
  1317. end
  1318.  
  1319.  
  1320. -- bool_or tests table for or: at least one element has to be '1' to succeed
  1321. function bool_or(tab)
  1322.    return tab.value > 0
  1323. end
  1324.  
  1325.  
  1326. -- bool_xor tests table for xor: odd number of elements has to be '1' to succeed
  1327. function bool_xor(tab)
  1328.    return mod(tab.value, 2) ~= 0
  1329. end
  1330.  
  1331.  
  1332. -- bool_table initialization
  1333. -- count_tot  is number of cells in table (that is the number of triggers)
  1334. -- count_init is number of cells to init (number of negset triggers)
  1335. -- test_func  is a function to get called each set and negset - a test function
  1336. -- true_func  is a function to be called if test passed
  1337. -- false_func is a function to be called if test failed
  1338. function bool_table(count_tot, count_init, test_func, true_func, false_func)
  1339.    local tab   = {};
  1340.  
  1341.    tab.test    = test_func  or function() return nil end;
  1342.    tab.ontrue    = true_func  or function() return nil end;
  1343.    tab.onfalse   = false_func or function() return nil end;
  1344.    tab.count   = count_tot  or 1;
  1345.    tab.value   = count_init or 0;
  1346.    tab.remember= -1;
  1347.  
  1348.    return tab;
  1349. end
  1350.  
  1351.  
  1352. -- bool val set
  1353. -- this gets called upon every trigger/switcher state change
  1354. -- it changes value of one element of given table
  1355. function bool_set(value, omit, tab)
  1356.    if (value == 0) then
  1357.       tab.value = tab.value -1;
  1358.    else
  1359.       tab.value = tab.value +1;
  1360.    end
  1361.  
  1362.    local res = tab.test(tab);
  1363.    if (tab.remember ~= res) then
  1364.       tab.remember = res;
  1365.  
  1366.       if (res) then
  1367.      debug("bool_set: true")
  1368.      tab.ontrue()
  1369.       else
  1370.      debug("bool_set: false")
  1371.      tab.onfalse()
  1372.       end
  1373.    end
  1374. end
  1375.  
  1376.  
  1377. -- bool val negative set
  1378. -- this is similar to bool_val, except that it sets '1' if triggered off and vice versa
  1379. function bool_negset(value, omit, tab)
  1380.    if (value == 0) then
  1381.       bool_set(1, nil, tab)
  1382.    else
  1383.       bool_set(0, nil, tab)
  1384.    end
  1385. end
  1386.  
  1387.  
  1388.  
  1389.  
  1390.  
  1391. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1392. -- WRAPPED init.lua FUNCTIONS -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1393. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1394.  
  1395. -- This somehow generalizes oxyd() from init.lua. You can pick your
  1396. -- own color and flavor of oxyd stone. If you omit 'acolor', or pass a
  1397. -- '' (empty string) instead, default value (or last time used value)
  1398. -- is used instead. Omitting aflavor or passing empty string as
  1399. -- aflavor results in using default or last used flavor.
  1400.  
  1401. function oxyd_custom(x,y,aflavor,acolor)
  1402.    if ((not aflavor) or (aflavor=='')) then
  1403.       aflavor = oxyd_default_flavor
  1404.    end
  1405.  
  1406.    if ((not acolor) or (acolor=='')) then
  1407.       acolor = oxyd_current_color
  1408.    end
  1409.  
  1410.    oxyd_default_flavor = aflavor;
  1411.    oxyd_current_color = acolor;
  1412.  
  1413.    oxyd(x,y)
  1414. end
  1415.  
  1416.  
  1417. -- these functions override common init.lua functions, giving them the power
  1418. -- of ant.lua syntax -- that is, calling with list of coordinates,
  1419. -- using negative coordinates for positions relative to lower-right corner
  1420. -- and maybe also some others that I do not recall now :)
  1421. -- Note, that basic syntax remain intact, so at first glance no changes are visible!
  1422. -- Wrapped functions are a lot slower, empirically nearly 3.5 times. Not a great deal,
  1423. -- as LUA is really fast, and the same for enigma. Tested on rather slow 166MHz AMD,
  1424. -- 80 megs of memory, Win95 - you won't notice extra time spent by loading a level.
  1425.  
  1426. -- stones
  1427. oxyd =     cell{oxyd}
  1428. fakeoxyd = cell{fakeoxyd}
  1429. oneway =   cell{oneway}
  1430. laser =    cell{laser}
  1431. mirrorp =  cell{mirrorp}
  1432. mirror3 =  cell{mirror3}
  1433. puzzle =   cell{puzzle}
  1434. switch =   cell{switch}
  1435.  
  1436. -- floors
  1437. abyss =    cell{abyss}
  1438. hollow =   cell{hollow}
  1439. hill=      cell{item="it-hill"}
  1440.  
  1441. -- items
  1442. Document = cell{Document}
  1443. hammer =   cell{hammer}
  1444. dynamite = cell{dynamite}
  1445. bomb =     cell{bomb}
  1446. shogundot= cell{shogundot}
  1447. keya =     cell{keya}
  1448. keyb =     cell{keyb}
  1449. keyc =     cell{keyc}
  1450. shogundot1=cell{{{shogundot, 1}}}
  1451. shogundot2=cell{{{shogundot, 2}}}
  1452. shogundot3=cell{{{shogundot, 3}}}
  1453. Wormhole = cell{Wormhole}
  1454. doorh =    cell{doorh}
  1455. doorv =    cell{doorv}
  1456. gradient = cell{gradient}
  1457.  
  1458. -- lower case equivalents
  1459. document = Document
  1460. wormhole = Wormhole
  1461.  
  1462. -- 'andvanced' oxyd functions
  1463. oxyd_col = cell{{{oxyd_custom, ''}}}
  1464. oxyd_fla = cell{{{oxyd_custom}}}
  1465.  
  1466.  
  1467.  
  1468.  
  1469. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1470. -- MEANINGS FOR COMMON CELL KEYS -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1471. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
  1472. -- here are declarations for default cell bindings
  1473.  
  1474. -- bindings based on init.lua functions
  1475. map_cell_meaning(".", abyss)
  1476. map_cell_meaning("0", oxyd)
  1477.  
  1478. -- common constructions
  1479. map_cell_meaning("W", cell{stone="st-wood"})
  1480. map_cell_meaning("B", cell{stone="st-block"})
  1481. map_cell_meaning("D", cell{stone="st-death"})
  1482. map_cell_meaning("=", cell{stone="st-glass"})
  1483. map_cell_meaning("X", cell{stone="st-grate1"})
  1484.  
  1485. -- actors
  1486. map_cell_meaning("o", cell{actor={"ac-whiteball-small", {player=0, mouseforce=1}}})
  1487. map_cell_meaning("O", cell{actor={"ac-blackball", {mouseforce=1}}})
  1488.  
  1489. -- presets
  1490. function meditation_mode()
  1491.    map_cell_meaning("O", hollow)
  1492. end
  1493.  
  1494. function multiplayer_mode()
  1495.    map_cell_meaning("1", cell{item="it-yinyang", actor={"ac-blackball", {mouseforce=1}}})
  1496.    map_cell_meaning("2", cell{item="it-yinyang", actor={"ac-whiteball", {mouseforce=1}}})
  1497. end
  1498.  
  1499. -- level mood
  1500. function grass_mode()
  1501.    map_cell_meaning(" ", cell{floor="fl-leaves"})
  1502.    map_cell_meaning("#", cell{stone="st-rock1"})
  1503. end
  1504.  
  1505. function metal_mode()
  1506.    map_cell_meaning(" ", cell{floor="fl-metal"})
  1507.    map_cell_meaning("#", cell{stone="st-rock2"})
  1508. end
  1509.  
  1510. -- maybe in a future, there will be a possibility to integrate Nat's mazes into maps
  1511. function maze_mode()
  1512.    Require("levels/lib/natmaze.lua")
  1513.    --map_cell_meaning("!", )
  1514. end
  1515.  
  1516.  
  1517.  
  1518.  
  1519.  
  1520.  
  1521.  
  1522.  
  1523.  
  1524.  
  1525.  
  1526.  
  1527.