1 Commits

Author SHA1 Message Date
aefdfeb99c Better debug mouse
Debug mouse is now its own module, so it can be separated from the hint system, since it is useful for more than just positioning hints. It now has the following enhancements:

1. Clock-based table cyclng now has a helper function (cycle)
2. Debug mouse color cycling is distinct from hint color cycling, so debug position readout remains legible
3. Debug position readout now stays on screen even when the cursor is near or past the edges
4. Debug cursor cycles between a mouse sprite specifically marking the exact pixel that is being sampled, an "X" for text character sizing, and a "□" for positioning the centered 3x3 characters often used as hint target markers
5. Map cell coordinates (in square brackets) are displayed in addition to pixel coordnates (in parentheses)

Sprite 50 is now the mouse cursor. Color 15 is color cycling for debug readouts.

Debug mouse features can be disabled by commenting out `add(real_modules, debugmouse)`.

I've done a little bit of golfing but this is stiill a token expense. I'm going to write a crappy sprintf function to save tokens everywhere we're assembling strings from their component parts.
2023-01-01 12:06:22 -08:00

View File

@ -38,39 +38,6 @@ function cycle(tbl,period)
return tbl[t()%period*#tbl\period+1] return tbl[t()%period*#tbl\period+1]
end end
-- fake sprintf function
-- %~ for literal "%"
-- %v for param
-- %! for tostring(param)
-- which dumps tables
function fmt(f, ...)
local out, i = "", 0
for s in all(split(f,"%")) do
if i == 0 then
-- before first format directive
out ..= s
i = 1
else
local m = s[1]
if m == "~" then
out ..= "%"
else
local p = select(i,...)
i+=1
if m == "v" then
out ..= p
elseif m == "!" then
out ..= tostring(p)
else
assert(false, tostr(m).."is not a formatting directive")
end
end
out ..=sub(s,2)
end
end
return out
end
mnames={} mnames={}
function names(root) function names(root)
local n=mnames[root] local n=mnames[root]
@ -279,12 +246,14 @@ function kbd:release(i)
end end
function tostring(any) function tostring(any)
if (type(any)!="table") return tostr(any) if type(any)=="table" then
local str = "{ " local str = "{ "
for k,v in pairs(any) do for k,v in pairs(any) do
str..=tostring(k).."->"..tostring(v).." " str=str..tostring(k).."->"..tostring(v).." "
end end
return str.."}" return str.."}"
end
return tostr(any)
end end
-->8 -->8
@ -300,7 +269,7 @@ function title:draw()
print("pyrex",32,73,7) print("pyrex",32,73,7)
print("[nyeogmi]",62,73,7) print("[nyeogmi]",62,73,7)
print("kistaro",32,79,7) print("kistaro",32,79,7)
local lvlstr = fmt("⬅️ %v ➡️",start_level) local lvlstr = "⬅️ "..start_level.." ➡️"
print(lvlstr,50,91,1) print(lvlstr,50,91,1)
print(lvlstr,51,90,blinkcol) print(lvlstr,51,90,blinkcol)
end end
@ -470,7 +439,8 @@ function level:recollide_reanchor()
not self:mcoll(mx1,my0) and not self:mcoll(mx1,my0) and
not self:mcoll(mx1,my1) not self:mcoll(mx1,my1)
) then ) then
anch_new[fmt("GEOM%v,%v,%v,%v",mx0,my0,dx,dy)]= { local key="GEOM"..mx0..","..my0..","..dx..","..dy
anch_new[key]= {
max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy
} }
end end
@ -478,9 +448,10 @@ function level:recollide_reanchor()
end end
for _,cr in pairs(self._crates) do for _,cr in pairs(self._crates) do
local key="CRATE"..cr.id..","..dx..","..dy
local mx0,my0=cr.mx,cr.my local mx0,my0=cr.mx,cr.my
local mx1,my1=mx0+dx,my0+dy local mx1,my1=mx0+dx,my0+dy
anch_new[fmt("CRATE%v,%v,%v",cr.id,dx,dy)]={ anch_new[key]={
max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy
} }
end end
@ -1088,7 +1059,7 @@ function rope:draw(artificial_px,artificial_py)
if (anch.ady>0) y-=1 if (anch.ady>0) y-=1
end end
rectfill(x-1,y-1,x+1,y+1,12) rectfill(x-1,y-1,x+1,y+1,12)
print(fmt("ax=%v,ay=%v",n1.ax,n1.ay),72,sy) print("ax="..n1.ax..",ay="..n1.ay,72,sy)
sy+=7 sy+=7
local n0=n1.prev local n0=n1.prev
@ -1777,41 +1748,20 @@ function rot13(s)
end end
return chr(unpack(sord)) return chr(unpack(sord))
end end
--hint file format: --hint file format:
-- each row is one hint. -- each row is one hint. 4 columns per row
-- 4 or 5 columns -- separated with a grave (`) character
-- separated with a -- room# ` X (screen px) ` Y (screen px) ` message
-- grave (`) character -- message is ROT13d; works for a-zA-Z
-- [1] room#
-- [2] x coord
-- [3] y coord
-- [4] message line 1 (rot13)
-- [5] message llne 2 (rot13)
-- row 5 can be omitted
-- for a 1-line hint
--
-- multiple hints for the same
-- room are revealed in order
hints = {} hints = {}
add(real_modules,hints) add(real_modules,hints)
function hints:init() function hints:init()
local h = gsv[[0`42`57`🅾️ yVPX` ■ local h = gsv[[0`64`64`zYRZ
0`42`73`❎, ❎ cHYY 0`32`32`fCYHOC]]
1`35`34`⁘ sVYY
1`99`82`■ cHYY
1`42`98`⁘`VTABER
2`75`65`i <`⁘
2`104`73` ■`cHYY
2`27`42`⁘
3`51`106`■ cHYY
3`27`81`⁘ HAOYBPX ZR
3`91`33`■ FGNAQ` URER]]
for rec in all(h) do for rec in all(h) do
rec[4]=rot13(rec[4]) rec[4]=rot13(rec[4])
if(rec[5]) rec[5]=rot13(rec[5])
local lh = self[rec[1]] local lh = self[rec[1]]
if lh then if lh then
add(lh,rec) add(lh,rec)
@ -1823,11 +1773,6 @@ function hints:init()
menuitem(2,"hide hints",function() level.hintlevel=0 end) menuitem(2,"hide hints",function() level.hintlevel=0 end)
end end
function shdprint(txt,x,y,c)
print(txt,x-1,y+1,1)
print(txt,x,y,c)
end
hintflicker=split"7,10,9,8,8,9,10,7" hintflicker=split"7,10,9,8,8,9,10,7"
function hints:draw2() function hints:draw2()
pal() pal()
@ -1835,9 +1780,9 @@ function hints:draw2()
for i,h in ipairs(self[level.ix]) do for i,h in ipairs(self[level.ix]) do
if (i > level.hintlevel) return if (i > level.hintlevel) return
local _,x,y,txt,txt2=unpack(h) local _,x,y,txt=unpack(h)
shdprint(txt,x,y,c) print(txt,x-1,y+1,1)
if (txt2) shdprint(txt2,x,y+8,c) print(txt,x,y,c)
end end
end end
@ -1863,7 +1808,7 @@ function debugmouse:draw3()
if (c == " ") spr(50,x,y) if (c == " ") spr(50,x,y)
print(c,x,y,15) print(c,x,y,15)
local px, py = mid(0,x,89), mid(0, y > 111 and y - 12 or y + 6, 117) local px, py = mid(0,x,89), mid(0, y > 111 and y - 12 or y + 6, 117)
print(fmt("(%v, %v)\n[%v, %v]",x,y,x\8,y\8),px,py,15) print("("..x..", "..y..")\n["..(x\8)..", "..(y\8).."]",px,py,15)
pal() pal()
end end