Conditional flag support
This commit is contained in:
parent
8403e58857
commit
a5dbc5fcfc
BIN
8Bitsy.dsk
BIN
8Bitsy.dsk
Binary file not shown.
|
@ -42,4 +42,22 @@
|
||||||
(actions.register-const :move-here :move-to-responder)
|
(actions.register-const :move-here :move-to-responder)
|
||||||
(actions.register-const :disappear :disappear)
|
(actions.register-const :disappear :disappear)
|
||||||
|
|
||||||
|
(actions.register :set-flag
|
||||||
|
(fn [action view x y w i]
|
||||||
|
(let [y (+ y style.padding.y)
|
||||||
|
x (renderer.draw_text style.font "Set " x y style.text)
|
||||||
|
flag (or action.flag (. files.game.flags 1))
|
||||||
|
flag (dropdown view [:set-flag :flag i] flag files.game.flags x y 100)
|
||||||
|
x (renderer.draw_text style.font " to " (+ x 100) y style.text)
|
||||||
|
options (lume.concat
|
||||||
|
[{:label "<Yes>" :value 0xffff} {:label "<No>" :value 0}]
|
||||||
|
(icollect [_ flag (ipairs files.game.flags)] {:label flag :value (.. :cond- flag)}))
|
||||||
|
rhs (or action.rhs (. options 1))
|
||||||
|
(rhs y) (dropdown view [:set-flag :rhs i] rhs options x y 100)]
|
||||||
|
(set action.flag flag)
|
||||||
|
(set action.rhs rhs)
|
||||||
|
y))
|
||||||
|
(fn [action vm]
|
||||||
|
(values action.rhs.value (.. :cond-var- action.flag) :set)))
|
||||||
|
|
||||||
{}
|
{}
|
||||||
|
|
|
@ -86,9 +86,12 @@
|
||||||
(set view.imstate.active (make-tag tag))
|
(set view.imstate.active (make-tag tag))
|
||||||
true))
|
true))
|
||||||
|
|
||||||
|
(fn set-cursor [view cursor]
|
||||||
|
(when (= view.cursor nil) (set view.cursor cursor)))
|
||||||
|
|
||||||
(fn active? [view tag] (= view.imstate.active (make-tag tag)))
|
(fn active? [view tag] (= view.imstate.active (make-tag tag)))
|
||||||
(fn button [view tag x y w h]
|
(fn button [view tag x y w h]
|
||||||
(when (mouse-inside x y w h) (set view.cursor :hand))
|
(when (mouse-inside x y w h) (set-cursor view :hand))
|
||||||
(activate view tag x y w h)
|
(activate view tag x y w h)
|
||||||
(values (and (active? view tag) (= view.imstate.left :released) (mouse-inside x y w h)) (+ y h style.padding.y)))
|
(values (and (active? view tag) (= view.imstate.left :released) (mouse-inside x y w h)) (+ y h style.padding.y)))
|
||||||
|
|
||||||
|
@ -197,7 +200,7 @@
|
||||||
(set textNew (replace-selection view textNew "" iStartDel iLimDel)))))))
|
(set textNew (replace-selection view textNew "" iStartDel iLimDel)))))))
|
||||||
|
|
||||||
; handle mouse events
|
; handle mouse events
|
||||||
(when (mouse-inside x y w h) (set view.cursor :ibeam))
|
(when (mouse-inside x y w h) (set-cursor view :ibeam))
|
||||||
(when (and (focused? view tag) (active? view tag) (mouse-inside x y w h))
|
(when (and (focused? view tag) (active? view tag) (mouse-inside x y w h))
|
||||||
(local mouse-i (i-from-x textNew (love.mouse.getX) x style.font))
|
(local mouse-i (i-from-x textNew (love.mouse.getX) x style.font))
|
||||||
(when initial-press
|
(when initial-press
|
||||||
|
@ -230,19 +233,23 @@
|
||||||
(renderer.draw_text style.font label x y style.text)
|
(renderer.draw_text style.font label x y style.text)
|
||||||
(textbox view label text (+ x wLabel) y wText))
|
(textbox view label text (+ x wLabel) y wText))
|
||||||
|
|
||||||
|
(fn option-text [option]
|
||||||
|
(match (type option)
|
||||||
|
:string option
|
||||||
|
:table (or option.label (tostring option))
|
||||||
|
_ (tostring option)))
|
||||||
|
|
||||||
(fn dropdown [view tag selection options x y w]
|
(fn dropdown [view tag selection options x y w]
|
||||||
(local row-h (+ (style.font:get_height) style.padding.y))
|
(local row-h (+ (style.font:get_height) style.padding.y))
|
||||||
(var new-selection nil)
|
(var new-selection nil)
|
||||||
|
|
||||||
(renderer.draw_rect x y w row-h style.selection)
|
(renderer.draw_rect x y w row-h style.selection)
|
||||||
(renderer.draw_text style.font selection (+ x style.padding.x) (+ y (/ style.padding.y 2)) style.text)
|
(renderer.draw_text style.font (option-text selection) (+ x style.padding.x) (+ y (/ style.padding.y 2)) style.text)
|
||||||
(renderer.draw_text style.icon_font "-" (+ x w (- style.padding.x)) (+ y (/ style.padding.y 2)) style.text)
|
(renderer.draw_text style.icon_font "-" (+ x w (- style.padding.x)) (+ y (/ style.padding.y 2)) style.text)
|
||||||
|
|
||||||
(when (focused? view tag)
|
(when (focused? view tag)
|
||||||
(var row-y (+ y row-h))
|
(var row-y (+ y row-h))
|
||||||
(each [i option (ipairs options)]
|
(each [i option (ipairs options)]
|
||||||
(renderer.draw_rect x row-y w row-h style.selection)
|
|
||||||
(renderer.draw_text style.font option (+ x style.padding.x) (+ row-y (/ style.padding.y 2)) style.text)
|
|
||||||
(when (button view [(make-tag tag) i] x row-y w row-h)
|
(when (button view [(make-tag tag) i] x row-y w row-h)
|
||||||
(set new-selection option))
|
(set new-selection option))
|
||||||
(set row-y (+ row-y row-h)))
|
(set row-y (+ row-y row-h)))
|
||||||
|
@ -250,7 +257,7 @@
|
||||||
(var row-y (+ y row-h))
|
(var row-y (+ y row-h))
|
||||||
(each [i option (ipairs options)]
|
(each [i option (ipairs options)]
|
||||||
(renderer.draw_rect x row-y w row-h style.selection)
|
(renderer.draw_rect x row-y w row-h style.selection)
|
||||||
(renderer.draw_text style.font option (+ x style.padding.x) (+ row-y (/ style.padding.y 2)) style.text)
|
(renderer.draw_text style.font (option-text option) (+ x style.padding.x) (+ row-y (/ style.padding.y 2)) style.text)
|
||||||
(set row-y (+ row-y row-h))))))
|
(set row-y (+ row-y row-h))))))
|
||||||
(focus view tag x y w row-h)
|
(focus view tag x y w row-h)
|
||||||
(values (or new-selection selection) (+ y row-h)))
|
(values (or new-selection selection) (+ y row-h)))
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
(local util (require :lib.util))
|
(local util (require :lib.util))
|
||||||
(local lume (require :lib.lume))
|
(local lume (require :lib.lume))
|
||||||
(local files (require :game.files))
|
(local files (require :game.files))
|
||||||
(local {: mouse-inside : activate : active? : checkbox : textfield : textbutton : dropdown} (util.require :editor.imstate))
|
(local {: mouse-inside : activate : active? : checkbox : textfield : textbutton : textbox : dropdown} (util.require :editor.imstate))
|
||||||
(local {: tilestrip-to-sprite} (util.require :editor.tiledraw))
|
(local {: tilestrip-to-sprite} (util.require :editor.tiledraw))
|
||||||
(local {: encode-yx : encode-itile : decode-itile} (util.require :game.tiles))
|
(local {: encode-yx : encode-itile : decode-itile} (util.require :game.tiles))
|
||||||
(local actions (require :editor.actions))
|
(local actions (require :editor.actions))
|
||||||
|
@ -156,6 +156,15 @@
|
||||||
(if (= self.imstate.left :released) (set self.iobject-linking nil)
|
(if (= self.imstate.left :released) (set self.iobject-linking nil)
|
||||||
(self:draw-link-line x y self.iobject-linking [0 1 0] true)))))
|
(self:draw-link-line x y self.iobject-linking [0 1 0] true)))))
|
||||||
|
|
||||||
|
(fn condition-label [flag]
|
||||||
|
(if flag {:label flag : flag} {:label "<always>"}))
|
||||||
|
|
||||||
|
(fn condition-options []
|
||||||
|
(let [options [(condition-label nil)]]
|
||||||
|
(each [_ flag (ipairs (or files.game.flags []))]
|
||||||
|
(table.insert options (condition-label flag)))
|
||||||
|
options))
|
||||||
|
|
||||||
(fn MapEditView.draw-object-code-editor [self object x y]
|
(fn MapEditView.draw-object-code-editor [self object x y]
|
||||||
(var y y)
|
(var y y)
|
||||||
(var istep-to-delete nil)
|
(var istep-to-delete nil)
|
||||||
|
@ -163,6 +172,9 @@
|
||||||
(each [istep step (ipairs object.steps)]
|
(each [istep step (ipairs object.steps)]
|
||||||
(when (textbutton self "X" (+ x 280) y)
|
(when (textbutton self "X" (+ x 280) y)
|
||||||
(set istep-to-delete istep))
|
(set istep-to-delete istep))
|
||||||
|
(set step.condition (. (dropdown self [:code-condition istep] (condition-label step.condition) (condition-options)
|
||||||
|
(+ x 100 style.padding.x) y 100)
|
||||||
|
:flag))
|
||||||
(set (step.action y) (dropdown self [:code-action istep] (or step.action (. actions.actionlist 1)) actions.actionlist x y 100))
|
(set (step.action y) (dropdown self [:code-action istep] (or step.action (. actions.actionlist 1)) actions.actionlist x y 100))
|
||||||
(set y (actions.edit step self x y 300 istep))
|
(set y (actions.edit step self x y 300 istep))
|
||||||
(set y (+ y style.padding.y)))
|
(set y (+ y style.padding.y)))
|
||||||
|
@ -186,8 +198,16 @@
|
||||||
y (if object.advanced
|
y (if object.advanced
|
||||||
(self:draw-object-advanced-editor object x y)
|
(self:draw-object-advanced-editor object x y)
|
||||||
(self:draw-object-code-editor object x y))
|
(self:draw-object-code-editor object x y))
|
||||||
|
new-flag-name (textbox self :new-flag-name self.new-flag-name x (+ y style.padding.y) 200)
|
||||||
|
(mk-new-flag y) (textbutton self "+ New Flag" (+ x 200 style.padding.x) (+ y style.padding.y))
|
||||||
do-delete (textbutton self "Delete" x (+ y 40))
|
do-delete (textbutton self "Delete" x (+ y 40))
|
||||||
(do-advanced y) (textbutton self (if object.advanced "Simple" "Advanced") (+ x 150) (+ y 40))]
|
(do-advanced y) (textbutton self (if object.advanced "Simple" "Advanced") (+ x 150) (+ y 40))]
|
||||||
|
(set self.new-flag-name new-flag-name)
|
||||||
|
(when mk-new-flag
|
||||||
|
(when (= files.game.flags nil)
|
||||||
|
(set files.game.flags []))
|
||||||
|
(table.insert files.game.flags new-flag-name)
|
||||||
|
(set self.new-flag-name ""))
|
||||||
(when do-delete
|
(when do-delete
|
||||||
(move-object self.level.objects (+ self.iobject 1) self.iobject)
|
(move-object self.level.objects (+ self.iobject 1) self.iobject)
|
||||||
(set self.iobject nil))
|
(set self.iobject nil))
|
||||||
|
|
|
@ -146,7 +146,8 @@
|
||||||
(when (not entity.advanced)
|
(when (not entity.advanced)
|
||||||
(let [code []]
|
(let [code []]
|
||||||
(each [iaction action (ipairs (or entity.steps []))]
|
(each [iaction action (ipairs (or entity.steps []))]
|
||||||
(lume.push code (actions.generate action vm iaction)))
|
(if action.condition (lume.push code (.. :cond- action.condition) (vm:when (actions.generate action vm iaction)))
|
||||||
|
(lume.push code (actions.generate action vm iaction))))
|
||||||
(vm:word (.. prefix ientity) :drop (table.unpack code))))))
|
(vm:word (.. prefix ientity) :drop (table.unpack code))))))
|
||||||
|
|
||||||
(fn deflevel [ilevel label]
|
(fn deflevel [ilevel label]
|
||||||
|
|
|
@ -37,12 +37,17 @@
|
||||||
:levels (do (set value.map (value.map:tohex)) value)
|
:levels (do (set value.map (value.map:tohex)) value)
|
||||||
_ value))
|
_ value))
|
||||||
|
|
||||||
|
(fn clone [v]
|
||||||
|
(match (type v)
|
||||||
|
:table (lume.clone v)
|
||||||
|
_ v))
|
||||||
|
|
||||||
(fn files.load []
|
(fn files.load []
|
||||||
(set files.game
|
(set files.game
|
||||||
(if (util.file-exists filename)
|
(if (util.file-exists filename)
|
||||||
(let [game (util.readjson filename)]
|
(let [game (util.readjson filename)]
|
||||||
(each [k v (pairs game)]
|
(each [k v (pairs game)]
|
||||||
(tset game k (lume.map v #(deserialize k (lume.clone $1)))))
|
(tset game k (lume.map v #(deserialize k (clone $1)))))
|
||||||
game)
|
game)
|
||||||
{:tiles [] :portraits [] :font [] :levels []}))
|
{:tiles [] :portraits [] :font [] :levels []}))
|
||||||
files.game)
|
files.game)
|
||||||
|
@ -50,7 +55,7 @@
|
||||||
(fn files.save []
|
(fn files.save []
|
||||||
(let [game {}]
|
(let [game {}]
|
||||||
(each [k v (pairs files.game)]
|
(each [k v (pairs files.game)]
|
||||||
(tset game k (lume.map v #(serialize k (lume.clone $1)))))
|
(tset game k (lume.map v #(serialize k (clone $1)))))
|
||||||
(util.writejson filename game)))
|
(util.writejson filename game)))
|
||||||
|
|
||||||
(fn new-cache [game key]
|
(fn new-cache [game key]
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -32,6 +32,10 @@
|
||||||
:map-specific-load
|
:map-specific-load
|
||||||
:full-redraw)
|
:full-redraw)
|
||||||
|
|
||||||
|
(each [_ flag (ipairs (or files.game.flags []))]
|
||||||
|
(vm:var (.. :cond-var- flag) vm.false)
|
||||||
|
(vm:word (.. :cond- flag) (.. :cond-var- flag) :get))
|
||||||
|
|
||||||
(each [imap _ (ipairs files.game.levels)]
|
(each [imap _ (ipairs files.game.levels)]
|
||||||
(deflevel imap (.. :map imap)))
|
(deflevel imap (.. :map imap)))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue