map.lua 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. --[[
  2. @classmod Map
  3. a Map assemble layers and markers
  4. no marker can be added without creating a map first
  5. a map has a name, a width, and a height (in tile units)
  6. ]]
  7. local bitser = require (LIB_PATH.."bitser")
  8. local Marker = require ("marker")
  9. local lume = require (LIB_PATH .. "lume")
  10. local Layers = require "layers"
  11. local output_list = function(list)
  12. return lume.reduce(lume.map(list, function (v)
  13. return string.format ("%s (X:%i Y:%i)", v.name, v.x, v.y)
  14. end),
  15. function(v, w)
  16. return string.format("%s %s", v, w)
  17. end)
  18. end
  19. return pl.class {
  20. _name = "Map",
  21. _init = function (self, name, w, h)
  22. self.name = name or "untitledmap"
  23. self.w, self.h = w, h
  24. self.layers = Layers()
  25. self.markers = {}
  26. end,
  27. update = function (self)
  28. end,
  29. draw = function (self)
  30. self.layers:draw()
  31. lume.each(self.markers, function (m) m:draw() end)
  32. end,
  33. marker_add = function (self, name, x, y)
  34. local x = x or 0
  35. local y = y or 0
  36. if not name then return "marker need a name" end
  37. local m = self:marker_get(name)
  38. local n = self:marker_get(x, y)
  39. if m then
  40. return string.format("a marker with name %s already exists at x: %i y: %i", m.name, m.x, m.y)
  41. end
  42. if n then
  43. return string.format("a marker with position %i %i already exists with name ", n.x, n.y, n.name)
  44. end
  45. local mark = Marker(name, x, y)
  46. table.insert(self.markers, mark)
  47. Sled.current_marker = mark
  48. return string.format("added marker %s at x: %i y:%i", name, x, y)
  49. end,
  50. marker_get = function (self, v, u)
  51. for k, m in ipairs(self.markers) do
  52. if type(v) == "string" then
  53. if m:get_name() == v then return m end
  54. elseif type(v) == "number" and type(u) == "number" then
  55. if m.x == v and m.y == u then return m end
  56. end
  57. end
  58. return
  59. end,
  60. marker_remove = function (self, name)
  61. local m = self:get_marker(name)
  62. if not self:get_marker(name) then
  63. return "no marker with name " .. name
  64. end
  65. lume.remove(self.markers, m)
  66. end,
  67. markers_list = function (self)
  68. if #self.markers == 0 then return end
  69. return output_list (self.markers)
  70. end,
  71. get_dimensions = function (self)
  72. return self.w, self.h
  73. end,
  74. make_layer = function (self, name, z)
  75. local l = self.layers:add(name, z, self.w, self.h)
  76. Sled.current_layer = l
  77. end,
  78. get_name = function (self)
  79. return string.match(self.name, "(%a+)%(*")
  80. end,
  81. rename = function (self, str)
  82. local count = lume.count(Sled.maps, function (m)
  83. return str == m:get_name()
  84. end)
  85. if count > 0 then
  86. str = str .. "("..(count+1)..")"
  87. end
  88. self.name = str
  89. end,
  90. export = function (self, filename)
  91. local to = "maps/"..filename..".map"
  92. self.name = filename or self:get_name()
  93. local l_t = lume.map(self.layers.tbl, function (l)
  94. return {
  95. name = l.name,
  96. z = l.z,
  97. w = l.w,
  98. h = l.h,
  99. str = l:get_idata():getString()
  100. }
  101. end)
  102. local m_t = lume.map(self.markers, function(m)
  103. return { name = m.name, x = m.x, y = m.y }
  104. end)
  105. local map_exp = {
  106. name = self.name,
  107. w = self.w,
  108. h = self.h,
  109. layers = l_t,
  110. markers = m_t
  111. }
  112. local exp_str = pl.pretty.write(map_exp)
  113. _lf.write(to, exp_str)
  114. end,
  115. }