map.fnl 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. (fn make-map [w h fill]
  2. (let [res []]
  3. (for [y 1 h]
  4. (let [row []]
  5. (for [x 1 w]
  6. (tset row x fill))
  7. (tset res y row)))
  8. res))
  9. (fn in-bounds [m v]
  10. (if (<= 1 v.y (# m))
  11. (if (<= 1 v.x (# (. m 1))) true false)
  12. false))
  13. (fn in-border [m v]
  14. (if (<= 2 v.y (dec (# m)))
  15. (if (<= 2 v.x (dec (# (. m 1)))) true false)
  16. false))
  17. (fn gget [m v]
  18. (if (in-bounds m v)
  19. (. (. m (. v :y)) (. v :x))))
  20. (fn gset [m v x]
  21. (if if (in-bounds m v)
  22. (tset (. m (. v :y)) (. v :x) x)))
  23. (fn geach [m f]
  24. ;calls f on each tile with coords and value
  25. (for [y 1 (# m)]
  26. (let [row (. m y)]
  27. (for [x 1 (# row)]
  28. (f (point x y) (. row x))))))
  29. (fn draw-map [m v lookup]
  30. ;assumes 8x tiles, lookup is a fn to find sprite number from map value
  31. (each [y row (pairs m)]
  32. (each [x val (pairs row)]
  33. (spr val (+ (* x 8) v.x) (+ (* y 8) v.y)))))
  34. (fn themeget [col k]
  35. (let [v (. col k)]
  36. (if (= (type v) "table")
  37. (rand-nth v) v)))
  38. (fn map->tiles [m t theme]
  39. (geach m (fn [v g]
  40. (if
  41. (= g 0)
  42. (gset t v (themeget theme :0))
  43. (= g 1)
  44. (if (= 0 (gget m (vadd v (point 0 -1))))
  45. (gset t v (themeget theme :0->1)) ;wall-floor transition
  46. (gset t v (themeget theme :1)))
  47. (= g 2)
  48. (if (= 0 (gget m (vadd v (point 0 -1))))
  49. (gset t v (themeget theme :0->2)) ;wall-water transition
  50. (= 1 (gget m (vadd v (point 0 -1))))
  51. (gset t v (themeget theme :1->2)) ;floor-water transition
  52. (gset t v (themeget theme :2))) ))))
  53. (fn random-tile [m n]
  54. (let [w (# (. m 1))
  55. h (# m)
  56. v (point (rand w) (rand h))]
  57. (if (= (gget m v) n) v (random-tile m n))))
  58. (fn attempt-tile-dist [m n pos d max]
  59. (let [v (random-tile m n)]
  60. (if (>= (dist v pos) d) v
  61. (if (> max 0)
  62. (attempt-tile-dist m n pos d (- max 1))
  63. (attempt-tile-dist m n pos (- d 3) 5)))))
  64. (fn random-tile-dist [m n pos d]
  65. (attempt-tile-dist m n pos d 5))
  66. (var lastdrunk (point 1 0))
  67. (fn drunk-dungeon [m v cnt tile bav]
  68. (var v v)
  69. (for [i 1 cnt]
  70. (gset m v tile)
  71. (let [dir (if (chance (or bav 50)) lastdrunk
  72. (rand-nth [(point -1 0) (point 1 0) (point 0 -1) (point 0 1)]))
  73. nv (vadd v dir)]
  74. (set lastdrunk dir)
  75. (when (in-border m nv)
  76. (set v nv)))))
  77. ;TODO BSP dungeon
  78. ;dungeon is two points, pos and dim