forked from pyrex/chameleonic
		
	Compare commits
	
		
			13 Commits
		
	
	
		
			f052186c97
			...
			sprintf
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						
						
							
						
						e028209adf
	
				 | 
					
					
						|||
| 
						
						
							
						
						ce3fc83221
	
				 | 
					
					
						|||
| 
						
						
							
						
						3e2229be65
	
				 | 
					
					
						|||
| 
						
						
							
						
						46f1339e19
	
				 | 
					
					
						|||
| 
						
						
							
						
						f86e52d3bd
	
				 | 
					
					
						|||
| 
						
						
							
						
						e6c35dbeda
	
				 | 
					
					
						|||
| 
						
						
							
						
						3516d2855e
	
				 | 
					
					
						|||
| 
						
						
							
						
						2264349e72
	
				 | 
					
					
						|||
| 
						
						
							
						
						93c154f876
	
				 | 
					
					
						|||
| 
						
						
							
						
						3494c48e74
	
				 | 
					
					
						|||
| 
						
						
							
						
						e878717c31
	
				 | 
					
					
						|||
| a6debc3974 | |||
| 693cdaa11d | 
							
								
								
									
										191
									
								
								chameleonic.p8
									
									
									
									
									
								
							
							
						
						
									
										191
									
								
								chameleonic.p8
									
									
									
									
									
								
							@@ -8,6 +8,7 @@ real_modules={}
 | 
				
			|||||||
frame=0
 | 
					frame=0
 | 
				
			||||||
function _init()
 | 
					function _init()
 | 
				
			||||||
 -- printh("restarting")
 | 
					 -- printh("restarting")
 | 
				
			||||||
 | 
					 music_on()
 | 
				
			||||||
 _doall("init") end
 | 
					 _doall("init") end
 | 
				
			||||||
function _update()
 | 
					function _update()
 | 
				
			||||||
 frame+=1
 | 
					 frame+=1
 | 
				
			||||||
@@ -15,6 +16,61 @@ function _update()
 | 
				
			|||||||
function _draw()
 | 
					function _draw()
 | 
				
			||||||
 _doall("draw") end
 | 
					 _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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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={}
 | 
					mnames={}
 | 
				
			||||||
function names(root)
 | 
					function names(root)
 | 
				
			||||||
 local n=mnames[root]
 | 
					 local n=mnames[root]
 | 
				
			||||||
@@ -97,6 +153,15 @@ function sgn0(x)
 | 
				
			|||||||
 return x!=0 and sgn(x) or 0
 | 
					 return x!=0 and sgn(x) or 0
 | 
				
			||||||
end
 | 
					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)
 | 
					function _mnmx(x,y)
 | 
				
			||||||
 if (x>y)return y,x
 | 
					 if (x>y)return y,x
 | 
				
			||||||
 return x,y
 | 
					 return x,y
 | 
				
			||||||
@@ -214,15 +279,13 @@ function kbd:release(i)
 | 
				
			|||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function tostring(any)
 | 
					function tostring(any)
 | 
				
			||||||
 if type(any)=="table" then
 | 
					 if (type(any)!="table") return tostr(any)
 | 
				
			||||||
 local str = "{ "
 | 
					 local str = "{ "
 | 
				
			||||||
 for k,v in pairs(any) do
 | 
					 for k,v in pairs(any) do
 | 
				
			||||||
      str=str..tostring(k).."->"..tostring(v).." "
 | 
					  str..=tostring(k).."->"..tostring(v).." "
 | 
				
			||||||
 end
 | 
					 end
 | 
				
			||||||
 return str.."}"
 | 
					 return str.."}"
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 return tostr(any)
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
-->8
 | 
					-->8
 | 
				
			||||||
-- title screen
 | 
					-- title screen
 | 
				
			||||||
@@ -237,7 +300,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 = "⬅️ "..start_level.." ➡️"
 | 
					 local lvlstr = fmt("⬅️ %v ➡️",start_level)
 | 
				
			||||||
 print(lvlstr,50,91,1)
 | 
					 print(lvlstr,50,91,1)
 | 
				
			||||||
 print(lvlstr,51,90,blinkcol) 
 | 
					 print(lvlstr,51,90,blinkcol) 
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
@@ -266,6 +329,7 @@ function level:init()
 | 
				
			|||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function level:reinit(n)
 | 
					function level:reinit(n)
 | 
				
			||||||
 | 
					 self.hintlevel = 0
 | 
				
			||||||
 self.ix=n
 | 
					 self.ix=n
 | 
				
			||||||
 self.todo={}
 | 
					 self.todo={}
 | 
				
			||||||
 self.bigx,self.bigy=n%8,n\8
 | 
					 self.bigx,self.bigy=n%8,n\8
 | 
				
			||||||
@@ -406,8 +470,7 @@ 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
 | 
				
			||||||
     local key="GEOM"..mx0..","..my0..","..dx..","..dy
 | 
					     anch_new[fmt("GEOM%v,%v,%v,%v",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
 | 
				
			||||||
@@ -415,10 +478,9 @@ 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[key]={
 | 
					   anch_new[fmt("CRATE%v,%v,%v",cr.id,dx,dy)]={
 | 
				
			||||||
    max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy
 | 
					    max(mx0,mx1),max(my0,my1),adx=-dx,ady=-dy
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
@@ -1026,7 +1088,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("ax="..n1.ax..",ay="..n1.ay,72,sy)
 | 
					  print(fmt("ax=%v,ay=%v",n1.ax,n1.ay),72,sy)
 | 
				
			||||||
  sy+=7
 | 
					  sy+=7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  local n0=n1.prev
 | 
					  local n0=n1.prev
 | 
				
			||||||
@@ -1704,6 +1766,107 @@ function level_text:draw()
 | 
				
			|||||||
  print(xys[4],xys[2],xys[3],6)
 | 
					  print(xys[4],xys[2],xys[3],6)
 | 
				
			||||||
 end
 | 
					 end
 | 
				
			||||||
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 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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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]]
 | 
				
			||||||
 | 
					 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)
 | 
				
			||||||
 | 
					  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)
 | 
				
			||||||
 | 
					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()
 | 
				
			||||||
 | 
					 local c=cycle(hintflicker)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 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)
 | 
				
			||||||
 | 
					 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__
 | 
					__gfx__
 | 
				
			||||||
000030000000002200003000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeff1ff1ff1fffffff1ffffff1fffffff1dddddddd111111110005000000000000
 | 
					000030000000002200003000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeff1ff1ff1fffffff1ffffff1fffffff1dddddddd111111110005000000000000
 | 
				
			||||||
003333300000332200333330eeffffffffffffffffffffeee5e555e55e555e5eff1ff1ffffffffffffffffffffffffffdddddddd111111110000500000000000
 | 
					003333300000332200333330eeffffffffffffffffffffeee5e555e55e555e5eff1ff1ffffffffffffffffffffffffffdddddddd111111110000500000000000
 | 
				
			||||||
@@ -1729,10 +1892,10 @@ eeee0000cc04405500444400efeeee5e11111111e5eeeefeeeeeeeeeeeeeeeeeffffffffffffffff
 | 
				
			|||||||
0a000aa4441a91a1bbabbbbbeffeeeeeeeeeeeeeeeeeeffeff1ff1ff11111111ff1111ff00000000000000000000000000000000000000000000000000000000
 | 
					0a000aa4441a91a1bbabbbbbeffeeeeeeeeeeeeeeeeeeffeff1ff1ff11111111ff1111ff00000000000000000000000000000000000000000000000000000000
 | 
				
			||||||
00a0044449a110a1bbbbbbbbeeffffffffffffffffffffeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000
 | 
					00a0044449a110a1bbbbbbbbeeffffffffffffffffffffeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000
 | 
				
			||||||
000aa111991111103bbbbbb3eeeeeeeeeeeeeeeeeeeeeeeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000
 | 
					000aa111991111103bbbbbb3eeeeeeeeeeeeeeeeeeeeeeeeff1ff1ffffffffffffffffff00000000000000000000000000000000000000000000000000000000
 | 
				
			||||||
00000000991000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111999999111111111
 | 
					0000000099100000f765000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111999999111111111
 | 
				
			||||||
00000000990000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999999911999999119999999
 | 
					00000000990000007700000000000000000000000000000000000000000000000000000000000000000000000000000019911991999999911999999119999999
 | 
				
			||||||
00000000990000000000000000000000000000000000000000000000000000000000000000000000000000000000000019977991999999911999999119999999
 | 
					00000000990000006060000000000000000000000000000000000000000000000000000000000000000000000000000019977991999999911999999119999999
 | 
				
			||||||
00000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999
 | 
					00000000090000005005000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999
 | 
				
			||||||
00000000aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999
 | 
					00000000aa0000000000000000000000000000000000000000000000000000000000000000000000000000000000000019911991999117111991199111711999
 | 
				
			||||||
0000000077a000000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911997799119999999
 | 
					0000000077a000000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911997799119999999
 | 
				
			||||||
00000007777a00000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911991199119999999
 | 
					00000007777a00000000000000000000000000000000000000000000000000000000000000000000000000000000000019999991999999911991199119999999
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user