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]
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={}
function names(root)
local n=mnames[root]
@ -279,12 +246,14 @@ function kbd:release(i)
end
function tostring(any)
if (type(any)!="table") return tostr(any)
local str = "{ "
for k,v in pairs(any) do
str..=tostring(k).."->"..tostring(v).." "
if type(any)=="table" then
local str = "{ "
for k,v in pairs(any) do
str=str..tostring(k).."->"..tostring(v).." "
end
return str.."}"
end
return str.."}"
return tostr(any)
end
-->8
@ -300,7 +269,7 @@ function title:draw()
print("pyrex",32,73,7)
print("[nyeogmi]",62,73,7)
print("kistaro",32,79,7)
local lvlstr = fmt("⬅️ %v ➡️",start_level)
local lvlstr = "⬅️ "..start_level.." ➡️"
print(lvlstr,50,91,1)
print(lvlstr,51,90,blinkcol)
end
@ -470,7 +439,8 @@ function level:recollide_reanchor()
not self:mcoll(mx1,my0) and
not self:mcoll(mx1,my1)
) 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
}
end
@ -478,9 +448,10 @@ function level:recollide_reanchor()
end
for _,cr in pairs(self._crates) do
local key="CRATE"..cr.id..","..dx..","..dy
local mx0,my0=cr.mx,cr.my
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
}
end
@ -1088,7 +1059,7 @@ function rope:draw(artificial_px,artificial_py)
if (anch.ady>0) y-=1
end
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
local n0=n1.prev
@ -1777,41 +1748,20 @@ function rot13(s)
end
return chr(unpack(sord))
end
--hint file format:
-- each row is one hint.
-- 4 or 5 columns
-- separated with a
-- grave (`) character
-- [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
-- 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`42`57`🅾️ yVPX` ■
0`42`73`❎, ❎ cHYY
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]]
local h = gsv[[0`64`64`zYRZ
0`32`32`fCYHOC]]
for rec in all(h) do
rec[4]=rot13(rec[4])
if(rec[5]) rec[5]=rot13(rec[5])
local lh = self[rec[1]]
if lh then
add(lh,rec)
@ -1823,11 +1773,6 @@ function hints:init()
menuitem(2,"hide hints",function() level.hintlevel=0 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"
function hints:draw2()
pal()
@ -1835,9 +1780,9 @@ function hints:draw2()
for i,h in ipairs(self[level.ix]) do
if (i > level.hintlevel) return
local _,x,y,txt,txt2=unpack(h)
shdprint(txt,x,y,c)
if (txt2) shdprint(txt2,x,y+8,c)
local _,x,y,txt=unpack(h)
print(txt,x-1,y+1,1)
print(txt,x,y,c)
end
end
@ -1863,7 +1808,7 @@ function debugmouse:draw3()
if (c == " ") spr(50,x,y)
print(c,x,y,15)
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()
end