pixeltoast tron
Description
A collection of all my ComputerCraft programs and the APIs they use. This is mostly just to get them the fuck off of pastebin, and also to ensure that API owners don't change things to break my precious programs...!
Installation
Copy one of these commands into your ComputerCraft terminal:
wget:
wget https://raw.githubusercontent.com/LDDestroier/CC/master/pixeltoast-tron.lua pixeltoast_tronArchive:
wget https://cc.shobie.xyz/cc/get/gh-LDDestroier-CC-pixeltoast-tron pixeltoast_tron
Quick Install:
wget https://cc.shobie.xyz/cc/get/gh-LDDestroier-CC-pixeltoast-tron pixeltoast tron
Usage
Run: pixeltoast-tron
Tags
Source
View Original SourceCode Preview
--[[
pastebin get jgyepx3g tron
std pb jgyepx3g tron
--]]
local isOpen=false
for k,v in pairs({"right","left","top","bottom","front","back"}) do
if peripheral.getType(v)=="modem" then
rednet.open(v)
isOpen=true
end
end
if not isOpen then
error("no modem attached")
end
if not term.isColor() then
if _CC_VERSION then
colors.orange = colors.lightGray
colors.blue = colors.lightGray
colors.red = colors.white
colors.lightBlue = colors.white
else
colors.gray = colors.black
colors.orange = colors.white
colors.blue = colors.white
colors.red = colors.white
colors.lightBlue = colors.white
end
end
local Mx,My=term.getSize()
local Cx,Cy=math.floor(Mx/2),math.floor(My/2)
function maingame()
local lang={"Waiting for player",{[0]="^",">","v","<"},{{"|","/","|","\\"},{"/","-","\\","-"},{"|","\\","|","/"},{"\\","-","/","-"}},"You died.","You won."}
local board=setmetatable({},{__index=function(s,n) s[n]={} return s[n] end})
for l1=99,-99,-1 do
board[l1][-99]={"-",3}
end
for l1=99,-99,-1 do
board[l1][99]={"|",3}
end
for l1=99,-99,-1 do
board[-99][l1]={"-",3}
end
for l1=99,-99,-1 do
board[99][l1]={"|",3}
end
board[100][100]={"/",3}
board[100][-100]={"\\",3}
board[-100][100]={"/",3}
board[-100][-100]={"\\",3}
local modem
local initheader="TRON:"
local pnid
local function send(...)
rednet.send(pnid,string.sub(textutils.serialize({...}),2,-2))
end
local function decode(dat)
return textutils.unserialize("{"..dat.."}")
end
local col
term.setCursorPos(math.floor(Cx-(#lang[1])/2),Cy)
term.setTextColor(colors.orange)
term.setBackgroundColor(colors.black)
term.clear()
term.write(lang[1])
rednet.broadcast(initheader.."pingcon")
local p1,p2
while true do
local p={os.pullEvent()}
if p[1]=="rednet_message" and p[2]~=os.getComputerID() then
if p[3]==initheader.."pingcon" then
rednet.send(p[2],initheader.."pongcon")
pnid=p[2]
col={colors.blue,colors.red,colors.lightBlue}
p1={pos={x=2,y=1},dir=0}
p2={pos={x=1,y=1},dir=0}
break
elseif p[3]==initheader.."pongcon" then
pnid=p[2]
col={colors.red,colors.blue,colors.lightBlue}
p1={pos={x=1,y=1},dir=0}
p2={pos={x=2,y=1},dir=0}
break
end
end
end
term.setBackgroundColor(colors.black)
term.clear()
local frs=0
local fps=0 -- frame counter (debugging)
local function render()
local tsv = term.current().setVisible
if tsv then tsv(false) end
frs=frs+1
term.setTextColor(colors.gray)
for l1=1,My do
term.setCursorPos(1,l1)
local pre=p1.pos.x%3
if (l1+p1.pos.y)%3==0 then
if pre==1 then
pre="--"
elseif pre==2 then
pre="-"
else
pre=""
end
term.write(pre..("+--"):rep(math.ceil(Mx/2)))
else
if pre==1 then
pre=" "
elseif pre==2 then
pre=" "
else
pre=""
end
term.write(pre..("| "):rep(math.ceil(Mx/2)))
end
end
term.setTextColor(colors.blue)
local num=0
for k,v in pairs(board) do
for l,y in pairs(v) do
if (k-p1.pos.x)+Cx<=Mx and (k-p1.pos.x)+Cx>=1 and (l-p1.pos.y)+Cy<=My and (l-p1.pos.y)+Cy>=1 then
term.setTextColor(col[y[2]] or y[2])
term.setCursorPos((k-p1.pos.x)+Cx,(l-p1.pos.y)+Cy)
term.write(y[1])
num=num+1
end
end
end
term.setCursorPos(1,1)
if col[1]==colors.blue then
term.setTextColor(colors.blue)
term.write("BLUE")
else
term.setTextColor(colors.red)
term.write("RED")
end
if tsv then tsv(true) end
end
local odr={[p1]=p1.dir,[p2]=p2.dir}
local function processmove(u)
local ccol
if u==p1 then
ccol=col[1]
else
ccol=col[2]
end
term.setTextColor(ccol)
if u==p1 and board[u.pos.x][u.pos.y] then
send("DIE")
term.setCursorPos(Cx,Cy)
term.write("x")
sleep(2)
term.setCursorPos(Cx-math.floor(#lang[4]/2),Cy)
term.setTextColor(colors.orange)
term.clear()
term.write(lang[4])
sleep(5)
term.setTextColor(colors.white)
term.setBackgroundColor(colors.black)
term.setCursorPos(1,1)
term.clear()
error("",0)
end
if odr[u]~=u.dir then
board[u.pos.x][u.pos.y]={lang[3][odr[u]+1][u.dir+1],ccol}
end
if not board[u.pos.x][u.pos.y] then
if u.dir%2==0 then
board[u.pos.x][u.pos.y]={"|",ccol}
else
board[u.pos.x][u.pos.y]={"-",ccol}
end
end
local chr=board[u.pos.x][u.pos.y][1]
local shr={x=u.pos.x,y=u.pos.y}
if u.dir==0 then
u.pos.y=u.pos.y-1
elseif u.dir==1 then
u.pos.x=u.pos.x+1
elseif u.dir==2 then
u.pos.y=u.pos.y+1
else
u.pos.x=u.pos.x-1
end
odr[u]=u.dir
return chr,shr
end
local function renderchar(u)
local ccol
if u==p1 then
ccol=col[1]
term.setCursorPos(Cx,Cy)
else
ccol=col[2]
term.setCursorPos((p2.pos.x-p1.pos.x)+Cx,(p2.pos.y-p1.pos.y)+Cy)
end
term.setTextColor(ccol)
term.write(lang[2][u.dir])
end
function processturn(p,u)
local dirs={[keys.up]=0,[keys.right]=1,[keys.down]=2,[keys.left]=3}
if (odr[u]+2)%4~=dirs[p] then
u.dir=dirs[p]
renderchar(u)
if u==p1 then
send("ROT",u.dir)
end
end
end
render()
local move=os.startTimer(0.1)
local fct=os.startTimer(1)
while true do
local p={os.pullEvent()}
if p[1]=="key" then
if p[2]==keys.up or p[2]==keys.right or p[2]==keys.down or p[2]==keys.left then
processturn(p[2],p1)
end
elseif p[1]=="timer" then
if p[2]==move then
local ret,ret2=processmove(p1)
move=os.startTimer(0.1)
send("MOVE",ret2,ret)
elseif p[2]==fct then
fps=frs
frs=0
fct=os.startTimer(1)
end
elseif p[1]=="rednet_message" and p[2]==pnid then
local dat=decode(p[3])
if dat[1]=="ROT" then
p2.dir=dat[2]
renderchar(p2)
elseif dat[1]=="DIE" then
p1.pos=p2.pos
render()
term.setTextColor(col[2])
term.setCursorPos(Cx,Cy)
term.write("x")
sleep(2)
term.setCursorPos(Cx-math.floor(#lang[5]/2),Cy)
term.setTextColor(colors.orange)
term.clear()
term.write(lang[5])
sleep(5)
term.setTextColor(colors.white)
term.setBackgroundColor(colors.black)
term.setCursorPos(1,1)
term.clear()
return
elseif dat[1]=="MOVE" then
p2.pos=dat[2]
board[p2.pos.x][p2.pos.y]={dat[3],col[2]}
render()
renderchar(p1)
renderchar(p2)
end
end
end
end
local selected=1
local function rmain()
term.setBackgroundColor(colors.black)
term.clear()
term.setCursorPos(1,1)
term.setTextColor(colors.blue)
local txt=" _ _______________ ________ __ _\n/ \\/ _____________\\ / ____ \\ | \\ / |\n\\_/| / / \\ | / / \\ \\ | \\ __/ |\n | | | |\\ ___/ | | | || \\ |\n | | | | \\ \\ | | | || __\\ |\n | | | | \\ \\ \\ \\____/ / | / \\ |\n \\_/ \\_/ \\_/ \\________/ |_/ \\__|"
local cnt=1
local cnt2=Cx-23
for char in string.gmatch(txt,".") do
if char~=" " and char~="\n" then
term.setCursorPos(cnt2,cnt)
term.write(char)
elseif char=="\n" then
cnt=cnt+1
cnt2=Cx-23
end
cnt2=cnt2+1
end
local selections={"Multiplayer","Exit"}
selected=((selected-1)%(#selections))+1
for k,v in pairs(selections) do
if k==selected then
term.setTextColor(colors.blue)
term.setCursorPos(Cx-(math.floor(#v/2)+1),k+10)
term.write(">"..v.."<")
term.setTextColor(colors.lightBlue)
term.setCursorPos(Cx-math.floor(#v/2),k+10)
term.write(v)
else
term.setTextColor(colors.lightBlue)
term.setCursorPos(Cx-math.floor(#v/2),k+10)
term.write(v)
end
end
end
rmain()
while true do
p={os.pullEvent()}
if p[1]=="key" then
if p[2]==keys.up then
selected=selected-1
rmain()
elseif p[2]==keys.down then
selected=selected+1
rmain()
elseif p[2]==keys.enter then
if selected==1 then
a,b=pcall(maingame)
if not a and b~="" then
error(b,0)
end
rmain()
else
break
end
end
end
end
term.setCursorPos(1,1)
term.clear()