From 693cdaa11d1be5a452659557dbfcd5d136b0aac6 Mon Sep 17 00:00:00 2001 From: Kistaro Windrider Date: Sun, 1 Jan 2023 07:56:37 +0000 Subject: [PATCH] Implement hint system and music mute. (#18) Test hints now both display on level 0 Allows testing progressive display of more hints. Code review feedback, debug mode Reviewed-on: https://git.chromaticdragon.app/pyrex/chameleonic/pulls/18 Co-authored-by: Kistaro Windrider Co-committed-by: Kistaro Windrider --- chameleonic.p8 | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/chameleonic.p8 b/chameleonic.p8 index e12c95c..017e2e9 100644 --- a/chameleonic.p8 +++ b/chameleonic.p8 @@ -8,6 +8,7 @@ real_modules={} frame=0 function _init() -- printh("restarting") + music_on() _doall("init") end function _update() frame+=1 @@ -15,6 +16,23 @@ function _update() function _draw() _doall("draw") end +function music_on() + music(0) + menuitem(3, "music: on", music_off) +end + +function music_off() + music(-1) + menuitem(3, "music: off", music_on) +end + +function gsv(s) + local ret=split(s,"\n") + for i,v in ipairs(ret) do + ret[i] = type(v) == "string" and split(v,"`") or {v} end + return ret +end + mnames={} function names(root) local n=mnames[root] @@ -97,6 +115,15 @@ function sgn0(x) return x!=0 and sgn(x) or 0 end +function inorder(tbl) + local prev + for v in all(tbl) do + if (prev and v < prev) return + prev = v + end + return true +end + function _mnmx(x,y) if (x>y)return y,x return x,y @@ -266,6 +293,7 @@ function level:init() end function level:reinit(n) + self.hintlevel = 0 self.ix=n self.todo={} self.bigx,self.bigy=n%8,n\8 @@ -1704,6 +1732,63 @@ function level_text:draw() print(xys[4],xys[2],xys[3],6) end end + +-->8 +--hint system +function rot13(s) + local sord = pack(ord(s,1,#s)) + for i,c in ipairs(sord) do + if (inorder{65, c, 77} or inorder{97, c, 109}) sord[i]=c+13 + if (inorder{78, c, 90} or inorder{110, c, 122}) sord[i]=c-13 + end + return chr(unpack(sord)) +end +--hint file format: +-- each row is one hint. 4 columns per row +-- separated with a grave (`) character +-- room# ` X (screen px) ` Y (screen px) ` message +-- message is ROT13d; works for a-zA-Z + +hints = {} +add(real_modules,hints) + +function hints:init() + local h = gsv[[0`64`64`zYRZ +0`32`32`fCYHOC]] + for rec in all(h) do + rec[4]=rot13(rec[4]) + local lh = self[rec[1]] + if lh then + add(lh,rec) + else + self[rec[1]] = {rec} + end + end + menuitem(1,"get hint",function() level.hintlevel+=1 end) + menuitem(2,"hide hints",function() level.hintlevel=0 end) + -- debug mode: enable mouse + poke(0x5f2d,1) +end + +hintflicker={7,10,9,8,8,9,10,7} +function hints:draw2() + pal() + local c=hintflicker[t()%1*#hintflicker\1+1] + -- debug mode: mouse coord display + if stat(34) != 0 then + local mousex, mousey = stat(32), stat(33) + print("x ("..mousex..", "..mousey..")",mousex,mousey,c) + end + + + for i,h in ipairs(self[level.ix]) do + if (i > level.hintlevel) return + local _,x,y,txt=unpack(h) + print(txt,x-1,y+1,1) + print(txt,x,y,c) + end +end + __gfx__ 000030000000002200003000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeff1ff1ff1fffffff1ffffff1fffffff1dddddddd111111110005000000000000 003333300000332200333330eeffffffffffffffffffffeee5e555e55e555e5eff1ff1ffffffffffffffffffffffffffdddddddd111111110000500000000000