Лллю ю ю ю юлл ю ю ю ю ю ю юллю ю ю ю юллю ю ю ю юллллю ю ю ю ю ю ю ллюллю ю ю ю ю ю ю ю ю ю юллюлл ю ю юллю ю юлл юлл ю ю юллю ю ю ллю ю ю ю л ю ю ю ю ллю ю ю ю ю ю юлл ю ю ю ю ю ю ллю ю ю ю ю ллю ю ю ю ю ю ю ллю ю ю ю ю люл ю лю ю ю ю ю ю ю ю ю ю юлл ю ю ю юлл юлл юлл ю ю ю ю ю ю ю ю юлю юлл ю л ю ю ю ю ллю ю ю ю ю ю ю ю ю ю ллюллю ю ю ю юллю ю ю ллю ю ю ю ю ю ю л ю л лл юллю ю ю ю юллю ю ю ю ю ю ллю ю ю ллю ю ю ллюлл ю ю ю ю ю ю ю ю ю ю ю ю ю ю ю ю ю ю ллю ю ю ю ю ю ллллю ю ю ю ю ю ю ю юлл юлл ю ю ю ю ю ю ю ллю ллю ю ю ю ю ю ю ю ллю ю ю ю юлл ю лю лю юлл ллю ю ю ю лю ю ю ю ллю ю ю ю ю ю ю ю ю ю ю ю ю ю лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл лллл лллл лллл лллл юююю юююю юююю юююю ллллллллллллллллллллллллллллллллюлюлллюлллллюллллллл лл лллл лллллл ллллллллюллллллюллллюллюллллллл ллллл ллл л лл ллллл л юлюлллллюллюллллюлл ллю ю ллюлл ллллллллюллллллюллюлллллюлллллллллллллл ллллл лл лллллл лллл юллл юлллллллллллллллллллллллллллллллллллллллллл юллл юллл л ллюллю лл ллюлюлллюлллллюллллллллллллллллллллллллл лллллл ллллллллллллллллллллллллллллллллллллллллюллллллюллллллллллллллллллллллллл ллллл ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллю ю ллллю ю ю ю ю ю ллллю ю ллю л ю ллюю юлю ллллю ю ю люлллюлл л ю лю лл ю лл ю ю ллю ю юлю юлю ю л ю ю ллю л ю ю ю ю ллллю ю ю лю люлл ллю ю ю юлю ю ю ллю л юл лю ю ю юлл ю юлл ю юллю ю ю ю ллллю ю ю юллю ю ю ю ллюлл ю ю лю лю ллю ю ю ю ллю ю ю ю ллллю ю ю ю лл ю ю ю ллю лллллю ю лллллю """""""""""""""" UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU """ """"""""""""" """""" ""   PUPUUPUUUUUUUUUUUUUUUPUUUUUUPUUUUUUUUUUUUUUUUPUUPUPUUP   "" " """""" """""""" """""""""""""""""" """""""""" """" """"""" UPUUUUUUUPUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"""" " " """" """"""""" """""" """""""""""""""""""""""""" """"""""""""" """"""""""""""""" """""""""UUUUUUUUUUUUUUUUPUUUUUUUUUUUUU """" """"""""""" """""""""""""""" """"""""""" """""""""" """"""""""""""""UUUUUPPPPUUUUUUUUPUUUUUPUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUPPUUUUUUUUUUUUU " """""""""""""""""""""""" """""""""""""" """""PUUUPPPUUUUUPUPUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUPPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUPUUUPUU """"""""""""""""""" """""""""""""""""""""""""""""""""""""""""""""""""" "" """"""PPPUPUUUUPPUUPUUUUUUUUUUUUUUPUUUUUUUUUPPUUUUUUPUUPPPP " """"""""""" " """"""" """"""" """"""" """""""""""""""""""""""""""""""""""UUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPUUUUUUUUUU """ """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""`gxVp`PP`pуy-G#G#G#G#G#G#G#G#G,K N$%K !"#$%&'()*+,-./N$0123456789:;<=>?%K@ABCDEFGHIJKLMNON$PQRSTUVWXYZ[\]^_%K`abcdefghijklmnoN$pqrstuvwxyz{%KN*J"J"J"J"J"J"J"J"J+ >ю? ллллллллююююююююлллллллллллллллл ллллллллююююююююлллллллллллллллл ллллллллююююююююлллллллллллллллл ллллллллююююююююлллллллллллллллл ллллююююююююлллллллллллл ллллююююююююлллллллллллллллллл ллллллллллююююююююлллллллллллллллллл ллллллллллююююююююлллллллллллллллллллллллллллллллллллллллллллллллл ллллллллллллллллллллллллллллллллллллююююююююлллллллллллллллллллллллллллллллллллллллллллл ллллллллллллллллллллллллллллллллллллююююююююлллллллллллллллллллллллллллллллллллллллллллллл ллллллллллллллллллллллллллллллллллллллююююююююлллллллллллллллллллллллллллллллллллллллллллллл ллллллллллллллллллллллллллллллллллллллююююююююлллллллллллллллллллллллллллллллллл ллллллллллллллллллллллллллююююююююлллллллллллллллллллллллллллллл ллллллллллллллллллллллллллююююююююлллллллллллллллллллллллл ллллллллллллллллллллююююююююлллллллллллллллллллллллл ллллллллллллллллллллююююююююлллллллллллллллллл ллллллллллллллююююююююлллллллллллллл ллллллллллллллююююююююлллллллллллл ллллллллллллююююююююлллллллллллл ллллллллллллююююююююлллллллллллл ллллллллллллююююлллллллллллл ллллллллллллююююлллллллллллл ллллллллллллююююлллллллллллл ллллллллллллююююлллллллллллллллл лллллллллллллллллллллллллллллллл лллллллллллллллллллллллллллллллллллл лллллллллллллллллллллллллллллллллллллллл лллллллллллллллллллллллллллллллллллллллл лллллллллллллллллллллллллллллллллллллллл лллллллллллллллллллллллллллллллллллл лллллллллллллллллллллллллллллллл ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллю ю ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллюлл юлл ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллюлллл юлллл ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллюлллллл юлллллл ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллюлллллллл ллллллллллллллллллллллллллллллллллллллллллллллллллллллюлллллллллллллллллллллллллллллллллллллллллллюлллллллллл лллллллллллллллллллллллллллллллллллллллллллллллллллллллюллллллллллллллллллллллллллллллллллллллллллллюлллллллллллл ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллюлллллллллллллллллллллллллллллллллллллллллллюлллллллллллллл лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллюлллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл ллллллллллллллллллллллллллллллллллллллллллллллллллллллюллллллллллллллллюллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл лллллллллллллллллллллллллллллллллллллллллллллллллллллюллллллллллллллллюлллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл ллллллллллллллллллллллллллллллллллллллллллллллллллллюллллллллллллллллюллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл лллллллллллллллллллллллллллллллллллллллллллллллллллюллллллллллллллллюлллллллллллллллллллллллллллллллллллллллллллллллллллллл ллллллллллллллллллллллллллллллллллллллюлллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл ллллллллллллллллллллллллллллллллллллллюлллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл ллллллллллллллллллллллллллллллллллллллллллллллюлллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл ллллллллллллллллллллллллллллллллллллллллллллллюллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллюллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллюллллллллллллллллллллллллллллллллллллллллллллллллллллллллллю ллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллюлллллллллллллллллллллллллллллллллллллллллллллллллллллллллюлл лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллюллллллллллллюлллл ллллллллллллллллллюлллллллллллюлллллл лллллллллллллллллллюллллллллллюлллллллл ллллллллллллллллллллюлллллллллюлллллллллл лллллллллллллллллллллюлллллллллллллллллллл ллллллллллллллллллю ю юллллллллллллюлллллллю ю ю ю ю ю ю ю ю ю ю ю лллллллллллл лллллллю ю ю ю ю ю ю ю ю люллллллллллллюллллллллю ю ю ю ю ю ю ю ллллллллллллл ллллллю ю ю ю ю ю ю ю ю юллллллллллллюлллллю ю ю ю ю ю ю ю ю ю ю ю лллллллллллл лллллллллллллллюлл ю юллллллллллллюлллл╫-- title: ticdraw -- author: AnstheRam -- desc: Kinda like Pet-Draw, but for TIC80 and with custom tiles. -- script: lua -- menu: Save Canvas Load Canvas Clear Canvas -- saveid: ticDraw t=1 x=0 y=0 menuing=1 tileString={} finaltile=123 timer=0 local modes={ snapshot=0, draw=1, picker=2, texttool1=3, texttool2=4, qtile=5, } curmode=modes.draw canbut={0,0,0,0} function TIC() if curmode==modes.snapshot then map() if btnp(7) then curmode=modes.draw end elseif curmode==modes.draw then ModeDraw() elseif curmode==modes.picker then ModePicker() elseif curmode==modes.texttool1 then ModeTextTool() elseif curmode==modes.texttool2 then ModeTextTool(true) elseif curmode==modes.qtile then ModeQuarterTiles() end for i=1,#canbut do if not btn(i+3) then canbut[i]=0 end end handleBtnrTmr() timer=(timer+1) end function ModeDraw() if btnp(7) then curmode=modes.picker return end if btnr(0) then y=y-1 if y<0 then y=y+17 end end if btnr(1) then y=(y+1)%17 end if btnr(2) then x=x-1 if x<0 then x=x+30 end end if btnr(3) then x=(x+1)%30 end if btnr(5) then t=(t+1)%(finaltile+1) end if btnr(6) then t=(t-1) if t<0 then t=finaltile end end if btn(4) and canbut[1]==0 then mset(x,y,t) end map() if math.floor(timer/12)%2==0 then spr(t,x*8,y*8) end CursorSpinDraw(x*8,y*8) end function ModePicker() local pickerFuncs={ {"Snapshot Mode",function () curmode=modes.snapshot end}, {"Text Tool",function () curmode=modes.texttool1 end}, {"QTile Draw",function () curmode=modes.qtile x,y=x*2,y*2 end}, } if btnp(4) then curmode=modes.draw canbut[1]=1 return end if btnr(0) then t=t-16 end if btnr(1) then t=t+16 end if btnr(2) then t=t-1 end if btnr(3) then t=t+1 end t=t%(finaltile+1) if btnr(5) then menuing=((menuing)%(#pickerFuncs))+1 end if btnr(6) then menuing=(menuing-1) if menuing<1 then menuing=#pickerFuncs end end if btnp(7) then pickerFuncs[menuing][2]() end map() map(210,119,19,11) for i=1,#pickerFuncs do local dx=(20*8) local pcol=13 if i==menuing then pcol=12 if math.floor(timer/12)%2==0 then spr(55,dx-5,(i*8)) end end print(pickerFuncs[i][1],dx+1,(i*8)+3,15) print(pickerFuncs[i][1],dx,(i*8)+2,pcol) end local lx,ly=8+((t%16)*8),8+(math.floor(t/16)*8) CursorSpinDraw(lx,ly) end function ModeTextTool(submode) map() if submode then if btn(0) then curmode=modes.picker return end local keyTileTrans={ [1]=1, [2]=2, [3]=3, [4]=4, [5]=5, [6]=6, [7]=7, [8]=8, [9]=9, [10]=10, [11]=11, [12]=12, [13]=13, [14]=14, [15]=15, [16]=16, [17]=17, [18]=18, [19]=19, [20]=20, [21]=21, [22]=22, [23]=23, [24]=24, [25]=25, [26]=26, [27]=112, [28]=113, [29]=114, [30]=115, [31]=116, [32]=117, [33]=118, [34]=119, [35]=120, [36]=121, [42]=32, [43]=111, [44]=107, --afaik, there it no keycode for tilde/hashtag, which my keyboard has next to the enter key. this keycode is the grave, which is above tab. [45]=30, [46]=29, [47]=27, [48]=0, } local shiftKeyTrans={ [27]=123, [28]=28, [30]=109, [31]=108, [34]=110, [36]=122, [42]=31, } if #tileString<(30-x) then for i=1,#keyTileTrans do if keyp(i) then local placeTile=keyTileTrans[i] if key(64) and shiftKeyTrans[i] then placeTile=shiftKeyTrans[i] end table.insert(tileString,placeTile) end end end if #tileString>0 then if keyp(51) then table.remove(tileString, #tileString) end for i=1,#tileString do spr(tileString[i],(x*8)+((i-1)*8),(y*8)) end end if math.floor(timer/12)%2==0 then spr(74,(x*8)+(#tileString*8),y*8) end if keyp(50) then for i=1,#tileString do mset(x+(i-1),y,tileString[i]) end x=x+#tileString curmode=modes.draw end return end if btnp(7) then curmode=modes.picker return end if btnr(0) then y=y-1 if y<0 then y=y+17 end end if btnr(1) then y=(y+1)%17 end if btnr(2) then x=x-1 if x<0 then x=x+30 end end if btnr(3) then x=(x+1)%30 end if btnr(5) then t=(t+1)%(finaltile+1) end if btnr(6) then t=(t-1) if t<0 then t=finaltile end end if btn(4) then tileString={} curmode=modes.texttool2 end CursorSpinDraw(x*8,y*8) end function ModeQuarterTiles() map() if btnp(7) then curmode=modes.picker x,y=math.floor(x/2),math.floor(y/2) return end local tx,ty=math.floor(x/2),math.floor(y/2) local qx,qy=x%2,y%2 local qTiles={ ["0000"]=0, ["1111"]=33, ["0011"]=34, ["1100"]=35, ["1010"]=36, ["0101"]=37, ["0010"]=38, ["0001"]=39, ["1000"]=40, ["0100"]=41, ["1011"]=42, ["0111"]=43, ["1101"]=44, ["1110"]=45, ["0110"]=49, ["1001"]=50, } if btn(4) then drawQTile(1,qx,qy,tx,ty,qTiles) end if btn(5) then drawQTile(0,qx,qy,tx,ty,qTiles) end if btnr(6) then drawQTile("inv",qx,qy,tx,ty,qTiles) end if btnr(0) then y=y-1 if y<0 then y=y+(17*2) end end if btnr(1) then y=(y+1)%(17*2) end if btnr(2) then x=x-1 if x<0 then x=x+(30*2) end end if btnr(3) then x=(x+1)%(30*2) end spr(258,(x*4)-2,(y*4)-2,0) --print(getQTile(tx,ty,qTiles),0,0,3) end function drawQTile(lqt,qx,qy,tx,ty,qTiles) local qcode=getQTile(tx,ty,qTiles) local subqc={} for i=1,4 do subqc[i]=string.sub(qcode,i,i) end for i=0,1 do for j=0,1 do if qy==j and qx==i then if lqt=="inv" then if subqc[(qx+1)+(qy*2)]=="1" then subqc[(qx+1)+(qy*2)]="0" else subqc[(qx+1)+(qy*2)]="1" end else subqc[(qx+1)+(qy*2)]=tostring(lqt) end qcode=subqc[1]..subqc[2]..subqc[3]..subqc[4] setQTile(qcode,tx,ty,qTiles) break end end end end function setQTile(qcode,x,y,qTiles) for k,l in pairs(qTiles) do if k==qcode then mset(x,y,l) return true end end return false end function getQTile(x,y,qTiles) local thetile=mget(x,y) for k,l in pairs(qTiles) do if l==thetile then return k end end return "0000" end -- repeat button code, copy starting here -- btnr is similar to btn, but has a -- set delay and repeat speed btnrtmr={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} function handleBtnrTmr() --this needs to run every frame, put it in TIC() for i=1,32 do if btn(i-1) then btnrtmr[i]=btnrtmr[i]+1 -- -1 and +1 account for lua being 1 indexed >:( else btnrtmr[i]=0 end end end function btnr(id, delay, rate) if not delay then delay=20 end if not rate then rate=6 end if btnp(id) then return true end if btnrtmr[id+1]>delay then if timer%rate==0 then -- IMPORTANT, replace "timer" with variable incremented every frame return true end end return false end -- end of repeat button code function CursorSpinDraw(csx,csy) local dsp=256 local rot=0 local ltimer=math.floor(timer/2) if ltimer%2==1 then dsp=257 end if ltimer%8>5 then rot=3 elseif ltimer%8>3 then rot=2 elseif ltimer%8>1 then rot=1 end spr(dsp,csx,csy,0,1,0,rot) end function byteCongealTo4(val1,val2,val3,val4) if val1<0 then --use negative to indicate reversal local vals={nil,nil,nil,nil} for i=1,4 do vals[i]=math.floor((val2&(0xFF*(0x100^(i-1))))/(0x100^(i-1))) end return vals else local finalval=0x00000000 local vals={val1,val2,val3,val4} for i=1,4 do finalval=finalval|(vals[-i+5]*(0x100^(i-1))) end return finalval end return nil end function SaveGame() local k=0 for i=0,128 do local tiles={0,0,0,0} for j=1,4 do tiles[j]=mget(k%30,math.floor(k/30)) k=k+1 end local saveVal=byteCongealTo4(tiles[1],tiles[2],tiles[3],tiles[4]) pmem(i,saveVal) end end function LoadGame() local k=0 for i=0,128 do local tiles=byteCongealTo4(-1,pmem(i)) for j=1,4 do mset(k%30,math.floor(k/30),tiles[5-j]) k=k+1 end end end function Clear() for i=0,30 do for j=0,17 do mset(i,j,0) end end end GameMenu={SaveGame,LoadGame,Clear} function MENU(i) GameMenu[i+1]() end function BOOT() LoadGame() end