1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- (var _dialogue [])
- (var _button_dirty false)
- (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?)
- (sfx 61)
- (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))
- (sfx 63))
- (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
- (sfx 63)
- 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] o.name) inv)
- colors (map (fn [o] o.color) inv)]
- (dialogue! (fn []
- (draw-menu title 11)
- (let [cmd (option-list (point 30 40) names state colors)]
- (when cmd (sfx 62) (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" identity (fn [o] (exit-dialogue)))
- (= cmd 2) (inventory-menu "wear" (fn [o] (if o.wear 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 []
- (draw-menu (.. k " store") 6)
- (let [cmd (option-list (point 30 40) ["buy" "sell"] state)]
- (if (= cmd 1) (inventory-menu "buy" identity (fn [o] (exit-dialogue)))
- (= cmd 2) (inventory-menu "sell" identity (fn [o] (exit-dialogue)))
- )))))
- (set shop _shop)
|