dialogue.fnl 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. (var _dialogue [])
  2. (fn dialogue? [] (not (empty? _dialogue)))
  3. (fn dialogue! [f] (add _dialogue f))
  4. (fn enter-btn? [] (or (btnp 4) (keyp 50)))
  5. (fn cancel-btn? [] (or (btnp 5)))
  6. (fn action-btn? [] (or (btnp 5)))
  7. (fn exit-dialogue []
  8. (set _dialogue [])
  9. (set _button_dirty true))
  10. (fn dialogue-back []
  11. (if (not (empty? _dialogue))
  12. (remove _dialogue (last _dialogue))))
  13. (fn draw-menu [title color bg]
  14. (clip 20 20 200 100)
  15. (cls)
  16. (rect 21 21 198 9 (or bg 2))
  17. (print title 24 23 (or color 15))
  18. (print "[x]" 205 23)
  19. (when (cancel-btn?)
  20. (sound! :cancel)
  21. (set _button_dirty true)
  22. (dialogue-back)))
  23. (fn option-list [v opts state colors]
  24. ;draw a list of text with a selected cursor
  25. ;handle keys for moving cursor or choosing something
  26. ;returns a value if something has been chosen
  27. (if (not state.idx)
  28. (if (not (empty? opts)) (tset state :idx 1)))
  29. (each [i s (ipairs opts)]
  30. (if colors
  31. (print s (+ v.x 8) (+ v.y (* (dec i) 8)) (. colors i))
  32. (print s (+ v.x 8) (+ v.y (* (dec i) 8))))
  33. (if (= i state.idx)
  34. (spr 240 (- v.x 2) (+ v.y (* (dec i) 8)))))
  35. (if (or (btnp 0) (btnp 1))
  36. (sound! :beep))
  37. (if
  38. (btnp 0)
  39. (if (= 1 state.idx)
  40. (set state.idx (# opts))
  41. (set state.idx (dec state.idx)))
  42. (btnp 1)
  43. (if (= (# opts) state.idx)
  44. (set state.idx 1)
  45. (set state.idx (inc state.idx)))
  46. (enter-btn?)
  47. (do
  48. (sound! :beep)
  49. state.idx)))
  50. (fn items-menu [col title filt f]
  51. ;show title and filtered list of item collection,
  52. ;selecting an item calls f on it
  53. (let [state {}
  54. inv (filter filt col)
  55. names (map (fn [o] "") inv)
  56. colors (map (fn [o] o.color) inv)]
  57. (dialogue! (fn []
  58. (draw-menu title 11)
  59. ;draw items ourself
  60. (each [i o (ipairs inv)]
  61. (item-print o (point 38 (+ 40 (* 8 (dec i)))))
  62. (print (.. "$" (math.floor (item-value o))) 174 (+ 40 (* 8 (dec i)))
  63. (if (< (item-value o) player.gold) 14 7)))
  64. (let [cmd (option-list (point 30 40) names state colors)]
  65. (when cmd (sound! :select) (f (. inv cmd))))))))
  66. (fn inventory-menu [title filt f]
  67. (items-menu player.inventory title filt f))
  68. (fn equipment-menu [title filt f]
  69. (items-menu (vals player.equip) title filt f))
  70. (fn command-menu [s]
  71. (var state {})
  72. (dialogue! (fn []
  73. (draw-menu "commands" 6)
  74. (let [cmd (option-list (point 30 40) ["drop" "wear" "use" "remove"] state)]
  75. (if (= cmd 1) (inventory-menu "drop" identity (fn [o] (drop player o) (exit-dialogue)))
  76. (= cmd 3)
  77. (inventory-menu
  78. "use"
  79. (fn [o] o.use)
  80. (fn [o] (o.use player o) (exit-dialogue)))
  81. (= cmd 2)
  82. (inventory-menu "wear"
  83. (fn [o] (if (or o.wear o.weapon) true))
  84. (fn [o] (wear player o) (exit-dialogue)))
  85. (= cmd 4) (equipment-menu "remove" identity (fn [o] (unwear player o) (exit-dialogue)))
  86. )))))
  87. (fn _shop [k]
  88. (var state {})
  89. (dialogue! (fn []
  90. (var name (if (= k :general) "clothes barn" (.. k " store")))
  91. (draw-menu name 6)
  92. (let [things (get {:armory ARMORY :general GENERAL :magic MAGIC} k)
  93. cmd (option-list (point 30 40) ["buy" "sell"] state)]
  94. (if (= cmd 1) (items-menu things (.. name " - buy") identity
  95. (fn [o]
  96. (when (< (item-value o) player.gold)
  97. (remove things o)
  98. (add player.inventory o)
  99. (set player.gold (- player.gold (item-value o))))
  100. (exit-dialogue)))
  101. (= cmd 2) (inventory-menu (.. name " - sell") identity
  102. (fn [o]
  103. (remove player.inventory o)
  104. (set player.gold (+ player.gold (* (item-value o) 0.5)))
  105. (exit-dialogue)))
  106. )))))
  107. (set shop _shop)