mirror of
				https://github.com/LDDestroier/CC/
				synced 2025-11-04 01:13:01 +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()
 |