diff --git a/chameleonic.p8 b/chameleonic.p8 index 6dca504..30b30c6 100644 --- a/chameleonic.p8 +++ b/chameleonic.p8 @@ -33,6 +33,44 @@ function gsv(s) return ret end +function cycle(tbl,period) + period = period or 1 + 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] @@ -241,14 +279,12 @@ function kbd:release(i) end function tostring(any) - if type(any)=="table" then - local str = "{ " - for k,v in pairs(any) do - str=str..tostring(k).."->"..tostring(v).." " - end - return str.."}" + if (type(any)!="table") return tostr(any) + local str = "{ " + for k,v in pairs(any) do + str..=tostring(k).."->"..tostring(v).." " end - return tostr(any) + return str.."}" end -->8 @@ -264,7 +300,7 @@ function title:draw() print("pyrex",32,73,7) print("[nyeogmi]",62,73,7) print("kistaro",32,79,7) - local lvlstr = "⬅️ "..start_level.." ➡️" + local lvlstr = fmt("⬅️ %v ➡️",start_level) print(lvlstr,50,91,1) print(lvlstr,51,90,blinkcol) end @@ -434,8 +470,7 @@ function level:recollide_reanchor() not self:mcoll(mx1,my0) and not self:mcoll(mx1,my1) ) then - local key="GEOM"..mx0..","..my0..","..dx..","..dy - anch_new[key]= { + anch_new[fmt("GEOM%v,%v,%v,%v",mx0,my0,dx,dy)]= { max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy } end @@ -443,10 +478,9 @@ 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[key]={ + anch_new[fmt("CRATE%v,%v,%v",cr.id,dx,dy)]={ max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy } end @@ -1054,7 +1088,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("ax="..n1.ax..",ay="..n1.ay,72,sy) + print(fmt("ax=%v,ay=%v",n1.ax,n1.ay),72,sy) sy+=7 local n0=n1.prev @@ -1787,8 +1821,6 @@ function hints:init() 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 function shdprint(txt,x,y,c) @@ -1796,16 +1828,10 @@ function shdprint(txt,x,y,c) print(txt,x,y,c) end -hintflicker={7,10,9,8,8,9,10,7} +hintflicker=split"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 - + local c=cycle(hintflicker) for i,h in ipairs(self[level.ix]) do if (i > level.hintlevel) return @@ -1815,6 +1841,32 @@ function hints:draw2() end end +-->8 +-- debug mouse support + +debugmouse = {} + +-- comment this out to disable debug mode +add(real_modules, debugmouse) + +function debugmouse:init() + poke(0x5f2d,1) +end + +debugflicker=split"5,6,7,15,14,8,2,4,9,10,11,3,12,13" +debugchs = split" ,x, ,□" + +function debugmouse:draw3() + if (stat(34) == 0) return + pal(15,cycle(debugflicker,1.5)) + local x, y, c = stat(32), stat(33), cycle(debugchs,2) + 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) + pal() +end + __gfx__ 000030000000002200003000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeff1ff1ff1fffffff1ffffff1fffffff1dddddddd111111110005000000000000 003333300000332200333330eeffffffffffffffffffffeee5e555e55e555e5eff1ff1ffffffffffffffffffffffffffdddddddd111111110000500000000000 @@ -1840,10 +1892,10 @@ eeee0000cc04405500444400efeeee5e11111111e5eeeefeeeeeeeeeeeeeeeeeffffffffffffffff 0a000aa4441a91a1bbabbbbbeffeeeeeeeeeeeeeeeeeeffeff1ff1ff11111111ff1111ff00000000000000000000000000000000000000000000000000000000 00a0044449a110a1bbbbbbbbeeffffffffffffffffffffeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 000aa111991111103bbbbbb3eeeeeeeeeeeeeeeeeeeeeeeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000 -00000000991000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111999999111111111 -00000000990000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999999911999999119999999 -00000000990000000000000000000000000000000000000000000000000000000000000000000000000000000000000019977991999999911999999119999999 -00000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999 +0000000099100000f765000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111999999111111111 +00000000990000007700000000000000000000000000000000000000000000000000000000000000000000000000000019911991999999911999999119999999 +00000000990000006060000000000000000000000000000000000000000000000000000000000000000000000000000019977991999999911999999119999999 +00000000090000005005000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999 00000000aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999 0000000077a000000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911997799119999999 00000007777a00000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911991199119999999