ldd-CC/pixeltoast-tron.lua

325 lines
7.7 KiB
Lua

--[[
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()