Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- 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
- 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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement