local xmath = require("xmath") local sprite = sprite -- local maputil = {} -- csfunc = maputil.CreateCrossSpriteFunc(use_sprite_i_func, use_sprite_j_func) -- -- use_sprite_i_func: function(spri, ud), where -- <spri> is a reference to sprite i -- use_sprite_j_func: function(sprj, spri, ud), where -- <spri> is a reference to sprite i -- <sprj> is a reference to sprite j -- -- csfunc: function(userdata, process_sprite_j_func), where -- <userdata> is passed as <ud> to the functions described above -- <process_sprite_j_func>: function(sprj, spri, ud), the user-provided -- function that processes sprite j in some way function maputil.CreateCrossSpriteFunc(use_sprite_i_func, use_sprite_j_func) return function(userdata, process_sprite_j_func) for i in sprite.all() do if (use_sprite_i_func(sprite[i], userdata)) then for j in sprite.all() do if (use_sprite_j_func(sprite[j], sprite[i], userdata)) then process_sprite_j_func(sprite[j], sprite[i], userdata) end end end end end end -- Functions for "for all sprites Y of tile X that are closer than D, ..." -- Passed userdefs: { picnumi, picnumj, maxldist } local function snearpic_usei(spr, ud) return spr.picnum == ud[1] end local function snearpic_usej(sprj, spri, ud) return sprj.picnum == ud[2] and xmath.ldist(spri, sprj) <= ud[3] end local snearpic_func = maputil.CreateCrossSpriteFunc(snearpic_usei, snearpic_usej) -- maputil.for_sprites_near_picnum(picnumi, picnumj, dist, process_sprite_func) -- -- Runs the following loop: -- -- for all sprites i with tile <picnumi>, -- for all sprites j of tile <picnumj> that are closer to sprite i than <dist> [*], -- call process_sprite_func(sprite[j], sprite[i]) -- -- [*] using xmath.ldist() function maputil.for_sprites_near_picnum(picnumi, picnumj, dist, process_sprite_func) snearpic_func({picnumi, picnumj, dist}, process_sprite_func) end return maputil