mirror of
https://github.com/LDDestroier/CC/
synced 2024-12-04 23:39:58 +00:00
325 lines
7.7 KiB
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()
|