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: pyrex/chameleonic#18
Co-authored-by: Kistaro Windrider <kistaro@gmail.com>
Co-committed-by: Kistaro Windrider <kistaro@gmail.com>
This commit is contained in:
Kistaro Windrider 2023-01-01 07:56:37 +00:00 committed by Pyrex
parent f052186c97
commit 693cdaa11d

View File

@ -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