diff --git a/game/defs.fnl b/game/defs.fnl index 53e199b..0caac57 100644 --- a/game/defs.fnl +++ b/game/defs.fnl @@ -18,10 +18,10 @@ (local org { :tiles (prg:org 0x4000) - :font (prg:org 0x4e00) - :map (prg:org 0x5000) - :entity (prg:org 0x5100) - :levelcode (prg:org 0x5200) + :font (prg:org 0x4f00) + :map (prg:org 0x5100) + :entity (prg:org 0x5200) + :levelcode (prg:org 0x5300) :code vm.code }) diff --git a/game/init.fnl b/game/init.fnl index 3e8150a..22aabf6 100644 --- a/game/init.fnl +++ b/game/init.fnl @@ -12,8 +12,9 @@ (tile.appendtiles org.tiles) (tile.appendgfx org.font (tile.loadgfx tile.fn-font)) +(vm:var :tick-count) (vm:word :handle-key :tick :read-key :player-key :hide-footer) -(vm:word :tick :map-specific-tick) +(vm:word :tick :map-specific-tick :tick-count :get 1 :+ :tick-count :set :player-redraw) (vm:word :load-level :lit :map-jaye-yx :get :jaye-yx :set diff --git a/game/level5.fnl b/game/level5.fnl index a70ac99..dc0277f 100644 --- a/game/level5.fnl +++ b/game/level5.fnl @@ -27,8 +27,8 @@ :garbagerexx-yx :get :get-responder :get := (vm:when vm.true :is-garbagerexx :set :garbagerexx-introduced :get :not (vm:when - (say :rexx "BO@*SS5S...,? ") - (say :rexx "I DON'T F3EL SO GOO00)OD...>?&**;") + (say :rexx "BO@oSSsS...,? htgz") + (say :rexx "I DON'T F3EL SO GOp0%foo)OD...>?qw" "idontfeelsogood") vm.true :garbagerexx-introduced :set )) ] [ @@ -46,7 +46,7 @@ (vm:word :move-garbagerexx ; yx -- f (vm:if-and [[:is-rexx?] [:is-garbagerexx :get]] [:dup 0xff :& 0x0d := (vm:if [ - (say :rexx "PARITY #ERPOR!*(!@$[") :drop vm.true :ret + (say :rexx "PARITYe#ERPORr(sbaitso" " tellmeabout" " your problems") :drop vm.true :ret ] [ (vm:if-and [[:dup :not-picking-up?] [:dup :can-drop-rubble?]] [:rexx-yx :get :randomgarbage :update-itile]) @@ -65,9 +65,9 @@ :garbagerexx-yx :get :dup (itile :t-rexxstop) :update-itile :rexx-yx :set controlstate.rexx :controlstate :bset 0x00ff :move :move :move - (say :rexx "DAAAISYY" " DAAAAAIIISYYYY") :hide-footer + (say :rexx "DAAAISYY" " DAAAAAIIISYYYY" "d a i s y") :hide-footer :move :drop 0xff00 :move - (say :rexx "GIVE ME" " .,#YOUR ANSWE!@#ER" " %$DOO00OO@'\"") :hide-footer + (say :rexx "GIVE ME" " .,#YOUR ANSWEibmER" " %$DOO00OOooo@'bell\"") :hide-footer :move :drop (say :rexx "UH OH") :hide-footer 0xff00 :explode 0x0100 :explode 0x00ff :explode 0x0001 :explode 0 :explode diff --git a/game/level6.fnl b/game/level6.fnl index a5f25f6..f0ace24 100644 --- a/game/level6.fnl +++ b/game/level6.fnl @@ -1,4 +1,4 @@ -(local {: deflevel : say : itile : controlstate} (require :game.defs)) +(local {: deflevel : say : say-runon : itile : controlstate} (require :game.defs)) (local {: ev} (require :game.entity)) (local tile (require :game.tiles)) (local {: walkable : neutable : debris : sittable} tile.flag-to-bit) @@ -18,7 +18,15 @@ (vm:if-and [[:is-neut?] [:over ev.touch :=] [:responder-itile (itile :t-keyoff) :=]] [(say :pady "OH HI THERE, SUSPICIOUS" "PROGRAM! WHAT CAN I DO" "YOU FOR?") (say :neut "PEOPLE ARE IN DANGER" "PLEASE OPEN THE DOOR") - (say :pady "WELL THAT'S TERRIBLE!" "BUT I JUST CAN'T OPEN" "WITHOUT THE PROPER CODE.")]) + (say :pady "WELL THAT'S TERRIBLE!" "BUT I JUST CAN'T OPEN" "WITHOUT THE PROPER CODE.") + :libb-present :get (vm:when (say :libb "OH JEEZ, LET ME AT HER, NEUT."))]) + (vm:if-and [[:dup ev.hack :=] [:responder-itile (itile :t-keyoff) :=]] + [(say :pady "ANOTHER STRANGE PROGRAM!" "MY, I'M POPULAR TODAY!") + (say :libb "OH PUKE. PLEASE SHUT UP.") + (say-runon :pady "HOW RUD") + (say :libb "]/WINNUKE 182.556.21.74") + (say :pady "PADYSEC CAUSED A GENERAL" "PROTECTION FAULT IN MODULE" "MORICON.DLL AT 000A:BE3F.") + (say :libb "]/OPEN")]) :keypad) (vm:word :keypad1 0x5197 :first-keypad) diff --git a/game/player.fnl b/game/player.fnl index 3b2e3be..2dbcf96 100644 --- a/game/player.fnl +++ b/game/player.fnl @@ -132,8 +132,9 @@ [0x00ff (itile :gord-w)] [:else (itile :gord-e)])])) -(vm:word :neut-tile (itile :neut1)) ; todo: animate -(vm:word :libb-tile (itile :libb1)) +(vm:word :two-frame :tick-count :get 0x1f :& 0x10 :<) +(vm:word :neut-tile :two-frame (vm:if [(itile :neut1)] [(itile :neut2)])) +(vm:word :libb-tile :two-frame (vm:if [(itile :libb1)] [(itile :libb2)])) (vm:word :flag-at? ; yx flag -- f :swap :itile-at :lookup-flags :&) diff --git a/link/mame.fnl b/link/mame.fnl index 83ae937..d041578 100644 --- a/link/mame.fnl +++ b/link/mame.fnl @@ -97,8 +97,9 @@ (mem:write_u8 (+ addr i -1) (string.byte (bytes:sub i i)))))" (bencode.encode {: addr : bytes}))) (fn Machine.launch [self prg] + (self:eval "(: (manager:machine) :soft_reset)") (self:eval (string.format "(emu.keypost \"CALL-151\\n %xG\\n\")" (prg:lookup-addr prg.start-symbol)))) -(fn Machine.reboot [self] (self:eval "(: (manager:machine) :soft_reset)")) +(fn Machine.reboot [self] (self:eval "(: (manager:machine) :hard_reset)")) (fn Machine.coro-eval [self code] (var result nil) (local append-to-result #(set result (.. (or result "") $2))) diff --git a/todo.txt b/todo.txt index ac70abb..b604b25 100644 --- a/todo.txt +++ b/todo.txt @@ -1,14 +1,10 @@ Game: -* Neut tileset * level loading -* Rexx can run over Jaye and vice versa -* drawing queue (tile index = priority?) * Title screen * Ending screen +* drawing queue (tile index = priority?) tooling ideas: -* rearrange tile order, preserving maps - * (needed for Neut tileset? or special neut-ified versions of _everything_?) * REPLy buffer (Polywell?) * save player positions & map state during hot reload * debug movement (noclip? teleport? activate by clicking? MAME supports mouse input / debug overlays...)