123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- (var _dialogue [])
- (fn dialogue? [] (not (empty? _dialogue)))
- (fn dialogue! [f] (add _dialogue f))
- (fn enter-btn? [] (or (btnp 4) (keyp 50)))
- (fn cancel-btn? [] (or (btnp 5)))
- (fn action-btn? [] (or (btnp 5)))
- (fn exit-dialogue []
- (set _dialogue [])
- (set _button_dirty true))
- (fn dialogue-back []
- (if (not (empty? _dialogue))
- (remove _dialogue (last _dialogue))))
- (fn draw-menu [title color bg]
- (clip 20 20 200 100)
- (cls)
- (rect 21 21 198 9 (or bg 2))
- (print title 24 23 (or color 15))
- (print "[x]" 205 23)
- (when (cancel-btn?)
- (sound! :cancel)
- (set _button_dirty true)
- (dialogue-back)))
- (fn option-list [v opts state colors]
- ;draw a list of text with a selected cursor
- ;handle keys for moving cursor or choosing something
- ;returns a value if something has been chosen
- (if (not state.idx)
- (if (not (empty? opts)) (tset state :idx 1)))
- (each [i s (ipairs opts)]
- (if colors
- (print s (+ v.x 8) (+ v.y (* (dec i) 8)) (. colors i))
- (print s (+ v.x 8) (+ v.y (* (dec i) 8))))
- (if (= i state.idx)
- (spr 240 (- v.x 2) (+ v.y (* (dec i) 8)))))
- (if (or (btnp 0) (btnp 1))
- (sound! :beep))
- (if
- (btnp 0)
- (if (= 1 state.idx)
- (set state.idx (# opts))
- (set state.idx (dec state.idx)))
- (btnp 1)
- (if (= (# opts) state.idx)
- (set state.idx 1)
- (set state.idx (inc state.idx)))
- (enter-btn?)
- (do
- (sound! :beep)
- state.idx)))
- (fn items-menu [col title filt f]
- ;show title and filtered list of item collection,
- ;selecting an item calls f on it
- (let [state {}
- inv (filter filt col)
- names (map (fn [o] "") inv)
- colors (map (fn [o] o.color) inv)]
- (dialogue! (fn []
- (draw-menu title 11)
- ;draw items ourself
- (each [i o (ipairs inv)]
- (item-print o (point 38 (+ 40 (* 8 (dec i)))))
- (print (.. "$" (math.floor (item-value o))) 174 (+ 40 (* 8 (dec i)))
- (if (< (item-value o) player.gold) 14 7)))
- (let [cmd (option-list (point 30 40) names state colors)]
- (when cmd (sound! :select) (f (. inv cmd))))))))
- (fn inventory-menu [title filt f]
- (items-menu player.inventory title filt f))
- (fn equipment-menu [title filt f]
- (items-menu (vals player.equip) title filt f))
- (fn command-menu [s]
- (var state {})
- (dialogue! (fn []
- (draw-menu "commands" 6)
- (let [cmd (option-list (point 30 40) ["drop" "wear" "use" "remove"] state)]
- (if (= cmd 1) (inventory-menu "drop" identity (fn [o] (drop player o) (exit-dialogue)))
- (= cmd 3)
- (inventory-menu
- "use"
- (fn [o] o.use)
- (fn [o] (o.use player o) (exit-dialogue)))
- (= cmd 2)
- (inventory-menu "wear"
- (fn [o] (if (or o.wear o.weapon) true))
- (fn [o] (wear player o) (exit-dialogue)))
- (= cmd 4) (equipment-menu "remove" identity (fn [o] (unwear player o) (exit-dialogue)))
- )))))
- (fn _shop [k]
- (var state {})
- (dialogue! (fn []
- (var name (if (= k :general) "clothes barn" (.. k " store")))
- (draw-menu name 6)
- (let [things (get {:armory ARMORY :general GENERAL :magic MAGIC} k)
- cmd (option-list (point 30 40) ["buy" "sell"] state)]
- (if (= cmd 1) (items-menu things (.. name " - buy") identity
- (fn [o]
- (when (< (item-value o) player.gold)
- (remove things o)
- (add player.inventory o)
- (set player.gold (- player.gold (item-value o))))
- (exit-dialogue)))
- (= cmd 2) (inventory-menu (.. name " - sell") identity
- (fn [o]
- (remove player.inventory o)
- (set player.gold (+ player.gold (* (item-value o) 0.5)))
- (exit-dialogue)))
- )))))
- (set shop _shop)
|