diff --git a/8Bitsy.dsk b/8Bitsy.dsk index 06c53d6..47fa253 100644 Binary files a/8Bitsy.dsk and b/8Bitsy.dsk differ diff --git a/editor/8bitsy.fnl b/editor/8bitsy.fnl index 57449ce..ab6f4b8 100644 --- a/editor/8bitsy.fnl +++ b/editor/8bitsy.fnl @@ -1,6 +1,6 @@ (local util (require :lib.util)) (local actions (require :editor.actions)) -(local {: textbox : dropdown } (util.require :editor.imstate)) +(local {: textbox : dropdown : textfield} (util.require :editor.imstate)) (local files (require :game.files)) (local lume (require :lib.lume)) (local style (require :core.style)) @@ -10,12 +10,11 @@ (let [characters (lume.map files.game.portraits #$1.label) character (or action.character (. characters 1)) lines (or action.lines []) - (character y) (dropdown view [:say :char i] character characters x (+ y style.padding.y) 300) - (line1 y) (textbox view [:say :line1 i] (. lines 1) x (+ y style.padding.y) 300) - (line2 y) (textbox view [:say :line2 i] (. lines 2) x y 300) - (line3 y) (textbox view [:say :line3 i] (. lines 3) x y 300) - (line4 y) (textbox view [:say :line4 i] (. lines 4) x y 300) - ] + (character y) (dropdown view [:say :char i] character characters x (+ y style.padding.y) w) + (line1 y) (textbox view [:say :line1 i] (. lines 1) x (+ y style.padding.y) w) + (line2 y) (textbox view [:say :line2 i] (. lines 2) x y w) + (line3 y) (textbox view [:say :line3 i] (. lines 3) x y w) + (line4 y) (textbox view [:say :line4 i] (. lines 4) x y w)] (set action.character character) (util.nested-tset action [:lines 1] line1) (util.nested-tset action [:lines 2] line2) @@ -26,4 +25,18 @@ (local {: say} (require :game.defs)) (say action.character (table.unpack (lume.map action.lines #($1:upper)))))) +(actions.register :warp + (fn [action view x y w i] + (let [maps (icollect [imap _ (ipairs files.game.levels)] (.. :map imap)) + map (or action.map (. maps 1)) + y (+ y style.padding.y) + map (dropdown view [:warp :map i] map maps x y 100) + (position-string y) (textbox view [:warp :loc i] (string.format "%x" (or action.position 0)) (+ x 150) y 150) + position (or (tonumber position-string 16) action.position)] + (set action.map map) + (set action.position position) + y)) + (fn [action vm] + (values action.position :lit action.map :map-player-yx-ptr :set :lit action.map :next-level :set))) + {} diff --git a/editor/actions.fnl b/editor/actions.fnl index f8a174e..b5e2e80 100644 --- a/editor/actions.fnl +++ b/editor/actions.fnl @@ -12,6 +12,7 @@ (fn actions.register [key edit generate] (when (= actions.actionlist nil) (set actions.actionlist [])) + (lume.remove actions.actionlist key) (table.insert actions.actionlist key) (defmethod actions.edit key edit) (defmethod actions.generate key generate)) diff --git a/editor/mapedit.fnl b/editor/mapedit.fnl index 814c058..66af13a 100644 --- a/editor/mapedit.fnl +++ b/editor/mapedit.fnl @@ -163,7 +163,7 @@ (each [istep step (ipairs object.steps)] (when (textbutton self "X" (+ x 280) y) (set istep-to-delete istep)) - (set (step.action y) (dropdown self [:code-action istep] (or step.action :say) [:say :warp] 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 (+ y style.padding.y))) (when istep-to-delete (table.remove object.steps istep-to-delete)) @@ -198,7 +198,8 @@ (set self.stripcache {}) (when (= (. files.game.levels self.ilevel) nil) (tset files.game.levels self.ilevel {:map (string.rep "\0" (* mapw maph)) :objects []})) - (set self.level (. files.game.levels self.ilevel))) + (set self.level (. files.game.levels self.ilevel)) + (set self.iobject nil)) (fn MapEditView.reload [self] (MapEditView.super.reload self) diff --git a/game/content.fnl b/game/content.fnl deleted file mode 100644 index fc08522..0000000 --- a/game/content.fnl +++ /dev/null @@ -1,4 +0,0 @@ -; TODO: Generate from data? -(local {: vm : say : deflevel} (require :game.defs)) - -(deflevel 1 :map1) diff --git a/game/defs.fnl b/game/defs.fnl index f14e790..d23693f 100644 --- a/game/defs.fnl +++ b/game/defs.fnl @@ -135,7 +135,8 @@ (vm.code:append :map-ptr [:db 0] :map-page [:db 0]) (vm:word :map :lit :map-ptr :get) (vm:word :entity-count :map 240 :+ :bget) -(vm:word :map-player-yx :map 241 :+ :get) +(vm:word :map-player-yx-ptr 241 :+) +(vm:word :map-player-yx :map :map-player-yx-ptr :get) (vm:word :map-specific-tick :map 243 :+ :execute) (vm:word :map-specific-move :map 246 :+ :execute) (vm:word :map-specific-load :map 249 :+ :execute) @@ -146,7 +147,7 @@ (let [code []] (each [iaction action (ipairs (or entity.steps []))] (lume.push code (actions.generate action vm iaction))) - (vm:word (.. prefix ientity) (table.unpack code)))))) + (vm:word (.. prefix ientity) :drop (table.unpack code)))))) (fn deflevel [ilevel label] (local level prg) ; todo: (asm.new prg) - if we want to load levels as an overlay diff --git a/game/game.json b/game/game.json index b24f435..3792a5e 100644 --- a/game/game.json +++ b/game/game.json @@ -1 +1 @@ -{"tiles":[{"gfx":"8080808080808080808080808080808080808080808080808080808080808080","word":"","label":"","flags":{"walkable":true}},{"gfx":"8080C0C0C0C0E0F0F8FCE6E6E0B0B0B0808183838383878F9FBFE7E7868C8C8C","word":"","label":"player-frame1","flags":[]},{"gfx":"8080808084CCFCFCFCFCFCF8F0B0B0B080808080E1E1E1F1B99F9F8F8F8C8C8C","word":"","label":"","flags":[]},{"gfx":"D5D5D5858585A5A5A5A5858585D5D5D5AAAAAAA8A8A8A9A9A9A9A8A8A8AAAAAA","word":"","label":"","flags":[]},{"gfx":"8080D4D0D0D0D4D45454D4D4D4D0808080808A8282828A8A8A0A0A8A8A828080","word":"pot","label":"","flags":[]},{"gfx":"8080808080D490948484A48494D080808080808080AA88A8A0A5A5A0A88A8080","word":"","label":"","flags":[]},{"gfx":"8080D4D0D0D0D4D45454D4D4D4D0808080808A8282828A8A8A0A0A8A8A828080","word":"","label":"","flags":[]},{"gfx":"000000A0908884827E0A0A0A0000000000000000201008040785858500000000","word":"","label":"","flags":[]},{"gfx":"000014040414500000000000A888A8800000282020280A010101010195919580","word":"","label":"","flags":[]},{"gfx":"00008C92921C60105010781C0E070300000098A4A41C030504050F1C38706000","word":"","label":"","flags":[]},{"gfx":"000000004040000000D4D4ECECECD480000000000202010101AAAAB6B6B6AA80","word":"","label":"","flags":[]},{"gfx":"0000000000004828282828482800000000000000000004050505050405000000","word":"","label":"","flags":[]}],"font":[{"flags":[],"gfx":"0000000000000000"},{"flags":[],"gfx":"081C1C1C08000800"},{"flags":[],"gfx":"3636241200000000"},{"flags":[],"gfx":"123F1212123F1200"},{"flags":[],"gfx":"083C0A1C281E0800"},{"flags":[],"gfx":"0026160834320000"},{"flags":[],"gfx":"0E1B1B062F1B3600"},{"flags":[],"gfx":"0C0C080400000000"},{"flags":[],"gfx":"180C0606060C1800"},{"flags":[],"gfx":"0C18303030180C00"},{"flags":[],"gfx":"082A1C081C2A0800"},{"flags":[],"gfx":"000C0C3F3F0C0C00"},{"flags":[],"gfx":"000000000C0C0804"},{"flags":[],"gfx":"0000001E1E000000"},{"flags":[],"gfx":"00000000000C0C00"},{"flags":[],"gfx":"002030180C060200"},{"flags":[],"gfx":"1C26263E26261C00"},{"flags":[],"gfx":"181C181818183C00"},{"flags":[],"gfx":"1C2620180C063E00"},{"flags":[],"gfx":"1C26201820261C00"},{"flags":[],"gfx":"2626263C30303000"},{"flags":[],"gfx":"3E061E2020201E00"},{"flags":[],"gfx":"1C26061E26261C00"},{"flags":[],"gfx":"3E2630180C0C0C00"},{"flags":[],"gfx":"1C26261C26261C00"},{"flags":[],"gfx":"1C26263C20201C00"},{"flags":[],"gfx":"000C0C000C0C0000"},{"flags":[],"gfx":"000C0C000C0C0804"},{"flags":[],"gfx":"30180C060C183000"},{"flags":[],"gfx":"00003E003E000000"},{"flags":[],"gfx":"060C1830180C0600"},{"flags":[],"gfx":"1C3630180C000C00"},{"flags":[],"gfx":"1E33212D3D011E00"},{"flags":[],"gfx":"1C3E26263E262600"},{"flags":[],"gfx":"1E26261E26261E00"},{"flags":[],"gfx":"1C26060606261C00"},{"flags":[],"gfx":"1E26262626261E00"},{"flags":[],"gfx":"3E06061E06063E00"},{"flags":[],"gfx":"3E06061E06060600"},{"flags":[],"gfx":"1C26063626263C00"},{"flags":[],"gfx":"2626263E26262600"},{"flags":[],"gfx":"3C18181818183C00"},{"flags":[],"gfx":"3C30303036361C00"},{"flags":[],"gfx":"2626261E26262600"},{"flags":[],"gfx":"0606060606063E00"},{"flags":[],"gfx":"373F2B2B23232300"},{"flags":[],"gfx":"26262E3626262600"},{"flags":[],"gfx":"1C26262626261C00"},{"flags":[],"gfx":"1E26261E06060600"},{"flags":[],"gfx":"1C26262626363C00"},{"flags":[],"gfx":"1E26261E26262600"},{"flags":[],"gfx":"3C26061C20221E00"},{"flags":[],"gfx":"3F0C0C0C0C0C0C00"},{"flags":[],"gfx":"2626262626261C00"},{"flags":[],"gfx":"2626261C1C1C0800"},{"flags":[],"gfx":"2323232B2B2A3600"},{"flags":[],"gfx":"2626261C26262600"},{"flags":[],"gfx":"2626261C18181800"},{"flags":[],"gfx":"3E3E30180C063E00"},{"flags":[],"gfx":"1C0C0C0C0C0C1C00"},{"flags":[],"gfx":"0002060C18302000"},{"flags":[],"gfx":"1C18181818181C00"},{"flags":[],"gfx":"081C260000000000"},{"flags":[],"gfx":"0000000000003E00"},{"flags":[],"gfx":"0C0C100000000000"}],"levels":[{"loadword":"","map":"000000000000000000000000000000000000000000606060606060606060606060606060606060000060000000000000000000000000000000006000006000000000000000000000000000000000600000600000A00000000000000000004000000060000060000000000000000000000000000000006000006000000000000000000000000000000000600000600000000000000000000000000000000060000060000000000000000080808080800000006000006000000000000000000000000000000000600000606060606060606060606060606060606060000000000000000000000000000000000000000000","player":{"y":4,"x":5},"tickword":"","moveword":"","objects":[{"x":15,"linkword":"","linkentity":"","func":"cat","y":8,"name":"","steps":[{"character":"cat","lines":["I'm an apple.","","",""],"action":"say"},{"character":"player","lines":["Strange, you look like a cat.","","",""],"action":"say"}]},{"x":5,"linkentity":"","func":"fish","name":"","linkword":"","y":8},{"x":13,"linkentity":"","func":"pot","name":"","linkword":"","y":4},{"x":12,"linkentity":"","func":"suspiciouspot","linkword":"","name":"","y":4},{"x":11,"linkentity":"","func":"pot","linkword":"","name":"","y":4},{"x":14,"linkentity":"","func":"pot","linkword":"","name":"","y":4},{"x":15,"linkentity":"","func":"pot","linkword":"","name":"","y":4}]}],"portraits":[{"gfx":"000000000000000000000000000000000000007C7C7E7E7E7E7E7E7E7E7E7E7E00000000707F7F7F7F7F7F7F7F7F7F7F7E7E7E7E7F7F7F7F7F7F7F7F7F7F7F7F0000000F0F1F1F1F1F1F1F1F1F1F1F1F000000000000000000000000000000001F1F1F1F7F7F7F7F7F7F7F7F7F7F7F7F00000000077F7F7F7F7F7F7F7F7F7F7F","label":"player","flags":[]},{"gfx":"00000000004040606060707070707070000000000000010103037F7F7F7F7F7F707060604000000000000000000000007F7F7F7F7F7F7800004040406060606000000000001018383C3C7F7F7F7F7F7F000000000000000000000000000000007F7F7F3F0F67717C7F7F7F7F7F7F7F7F00007C7E7F7F7F7F7F7F7F7F7F7F7F7F","label":"cat","flags":[]},{"gfx":"80808080808080808080D5818181858480808080808080808080AA80808080808484848484A4848484A48484848494D0809090D0D4F5D5D5D5D5D480808080AA80808080808080808080D5808080808080808080808080808080AAA0A0A0A888808080808AA8AAAAAA828080808080D588888888888889898888888888888A82","label":"angryfish","flags":[]}]} \ No newline at end of file +{"tiles":[{"gfx":"8080808080808080808080808080808080808080808080808080808080808080","word":"","label":"","flags":{"walkable":true}},{"gfx":"8080C0C0C0C0E0F0F8FCE6E6E0B0B0B0808183838383878F9FBFE7E7868C8C8C","word":"","label":"player-frame1","flags":[]},{"gfx":"8080808084CCFCFCFCFCFCF8F0B0B0B080808080E1E1E1F1B99F9F8F8F8C8C8C","word":"","label":"","flags":[]},{"gfx":"D5D5D5858585A5A5A5A5858585D5D5D5AAAAAAA8A8A8A9A9A9A9A8A8A8AAAAAA","word":"","label":"","flags":[]},{"gfx":"8080D4D0D0D0D4D45454D4D4D4D0808080808A8282828A8A8A0A0A8A8A828080","word":"pot","label":"","flags":[]},{"gfx":"8080808080D490948484A48494D080808080808080AA88A8A0A5A5A0A88A8080","word":"","label":"","flags":[]},{"gfx":"8080D4D0D0D0D4D45454D4D4D4D0808080808A8282828A8A8A0A0A8A8A828080","word":"","label":"","flags":[]},{"gfx":"000000A0908884827E0A0A0A0000000000000000201008040785858500000000","word":"","label":"","flags":[]},{"gfx":"000014040414500000000000A888A8800000282020280A010101010195919580","word":"","label":"","flags":[]},{"gfx":"00008C92921C60105010781C0E070300000098A4A41C030504050F1C38706000","word":"","label":"","flags":[]},{"gfx":"000000004040000000D4D4ECECECD480000000000202010101AAAAB6B6B6AA80","word":"","label":"","flags":[]},{"gfx":"0000000000004828282828482800000000000000000004050505050405000000","word":"","label":"","flags":[]}],"levels":[{"loadword":"","objects":[{"x":15,"y":8,"linkentity":"","func":"cat","name":"","linkword":"","steps":[{"lines":["I'm an apple.","","",""],"action":"say","character":"cat"},{"lines":["Strange, you look like a cat.","","",""],"action":"say","character":"player"}]},{"x":5,"linkentity":"","func":"fish","y":8,"name":"","linkword":""},{"x":13,"linkentity":"","func":"pot","y":4,"name":"","linkword":""},{"x":12,"linkentity":"","func":"suspiciouspot","y":4,"linkword":"","name":""},{"x":11,"linkentity":"","func":"pot","y":4,"linkword":"","name":""},{"x":14,"linkentity":"","func":"pot","y":4,"linkword":"","name":""},{"x":15,"linkentity":"","func":"pot","y":4,"linkword":"","name":""},{"func":"","x":20,"y":7,"steps":[{"position":1537,"character":"player","action":"warp","lines":["","","",""],"map":"map2"}]}],"player":{"y":4,"x":5},"tickword":"","moveword":"","map":"000000000000000000000000000000000000000000606060606060606060606060606060606060000060000000000000000000000000000000006000006000000000000000000000000000000000600000600000A00000000000000000004000000060600060000000000000000000000000000000000000006000000000000000000000000000000000606000600000000000000000000000000000000060000060000000000000000080808080800000006000006000000000000000000000000000000000600000606060606060606060606060606060606060000000000000000000000000000000000000000000"},{"loadword":"","map":"000000000000000000000000000000000000000000606060606060606060606060606060606060000060000000000000000000000000000000006000006000000000000000000000000000000000600060600000000000000000000000000000000060000000000000000000000000000000000000006000606000000000000000000000000000000000600000600000000000000000000000000000000060000060000000000000000000000000000000006000006000000000000000000000000000000000600000606060606060606060606060606060606060000000000000000000000000000000000000000000","tickword":"","moveword":"","objects":[{"func":"","x":1,"y":7,"steps":[{"position":1554,"character":"player","action":"warp","lines":["","","",""],"map":"map1"}]}]}],"portraits":[{"gfx":"000000000000000000000000000000000000007C7C7E7E7E7E7E7E7E7E7E7E7E00000000707F7F7F7F7F7F7F7F7F7F7F7E7E7E7E7F7F7F7F7F7F7F7F7F7F7F7F0000000F0F1F1F1F1F1F1F1F1F1F1F1F000000000000000000000000000000001F1F1F1F7F7F7F7F7F7F7F7F7F7F7F7F00000000077F7F7F7F7F7F7F7F7F7F7F","label":"player","flags":[]},{"gfx":"00000000004040606060707070707070000000000000010103037F7F7F7F7F7F707060604000000000000000000000007F7F7F7F7F7F7800004040406060606000000000001018383C3C7F7F7F7F7F7F000000000000000000000000000000007F7F7F3F0F67717C7F7F7F7F7F7F7F7F00007C7E7F7F7F7F7F7F7F7F7F7F7F7F","label":"cat","flags":[]},{"gfx":"80808080808080808080D5818181858480808080808080808080AA80808080808484848484A4848484A48484848494D0809090D0D4F5D5D5D5D5D480808080AA80808080808080808080D5808080808080808080808080808080AAA0A0A0A888808080808AA8AAAAAA828080808080D588888888888889898888888888888A82","label":"angryfish","flags":[]}],"font":[{"flags":[],"gfx":"0000000000000000"},{"flags":[],"gfx":"081C1C1C08000800"},{"flags":[],"gfx":"3636241200000000"},{"flags":[],"gfx":"123F1212123F1200"},{"flags":[],"gfx":"083C0A1C281E0800"},{"flags":[],"gfx":"0026160834320000"},{"flags":[],"gfx":"0E1B1B062F1B3600"},{"flags":[],"gfx":"0C0C080400000000"},{"flags":[],"gfx":"180C0606060C1800"},{"flags":[],"gfx":"0C18303030180C00"},{"flags":[],"gfx":"082A1C081C2A0800"},{"flags":[],"gfx":"000C0C3F3F0C0C00"},{"flags":[],"gfx":"000000000C0C0804"},{"flags":[],"gfx":"0000001E1E000000"},{"flags":[],"gfx":"00000000000C0C00"},{"flags":[],"gfx":"002030180C060200"},{"flags":[],"gfx":"1C26263E26261C00"},{"flags":[],"gfx":"181C181818183C00"},{"flags":[],"gfx":"1C2620180C063E00"},{"flags":[],"gfx":"1C26201820261C00"},{"flags":[],"gfx":"2626263C30303000"},{"flags":[],"gfx":"3E061E2020201E00"},{"flags":[],"gfx":"1C26061E26261C00"},{"flags":[],"gfx":"3E2630180C0C0C00"},{"flags":[],"gfx":"1C26261C26261C00"},{"flags":[],"gfx":"1C26263C20201C00"},{"flags":[],"gfx":"000C0C000C0C0000"},{"flags":[],"gfx":"000C0C000C0C0804"},{"flags":[],"gfx":"30180C060C183000"},{"flags":[],"gfx":"00003E003E000000"},{"flags":[],"gfx":"060C1830180C0600"},{"flags":[],"gfx":"1C3630180C000C00"},{"flags":[],"gfx":"1E33212D3D011E00"},{"flags":[],"gfx":"1C3E26263E262600"},{"flags":[],"gfx":"1E26261E26261E00"},{"flags":[],"gfx":"1C26060606261C00"},{"flags":[],"gfx":"1E26262626261E00"},{"flags":[],"gfx":"3E06061E06063E00"},{"flags":[],"gfx":"3E06061E06060600"},{"flags":[],"gfx":"1C26063626263C00"},{"flags":[],"gfx":"2626263E26262600"},{"flags":[],"gfx":"3C18181818183C00"},{"flags":[],"gfx":"3C30303036361C00"},{"flags":[],"gfx":"2626261E26262600"},{"flags":[],"gfx":"0606060606063E00"},{"flags":[],"gfx":"373F2B2B23232300"},{"flags":[],"gfx":"26262E3626262600"},{"flags":[],"gfx":"1C26262626261C00"},{"flags":[],"gfx":"1E26261E06060600"},{"flags":[],"gfx":"1C26262626363C00"},{"flags":[],"gfx":"1E26261E26262600"},{"flags":[],"gfx":"3C26061C20221E00"},{"flags":[],"gfx":"3F0C0C0C0C0C0C00"},{"flags":[],"gfx":"2626262626261C00"},{"flags":[],"gfx":"2626261C1C1C0800"},{"flags":[],"gfx":"2323232B2B2A3600"},{"flags":[],"gfx":"2626261C26262600"},{"flags":[],"gfx":"2626261C18181800"},{"flags":[],"gfx":"3E3E30180C063E00"},{"flags":[],"gfx":"1C0C0C0C0C0C1C00"},{"flags":[],"gfx":"0002060C18302000"},{"flags":[],"gfx":"1C18181818181C00"},{"flags":[],"gfx":"081C260000000000"},{"flags":[],"gfx":"0000000000003E00"},{"flags":[],"gfx":"0C0C100000000000"}]} \ No newline at end of file diff --git a/game/init.fnl b/game/init.fnl index 2acb7bb..3cf4384 100644 --- a/game/init.fnl +++ b/game/init.fnl @@ -1,7 +1,7 @@ (local util (require :lib.util)) (local {: lo : hi : readjson} util) (local tile (util.reload :game.tiles)) -(local {: prg : vm : org} (util.reload :game.defs)) +(local {: prg : vm : org : deflevel} (util.reload :game.defs)) (local files (require :game.files)) (local disk (util.reload :game.disk)) @@ -32,7 +32,8 @@ :map-specific-load :full-redraw) -(util.reload :game.content) +(each [imap _ (ipairs files.game.levels)] + (deflevel imap (.. :map imap))) (vm.code:append :main [:jsr :reset]