mirror of
				https://github.com/LDDestroier/CC/
				synced 2025-10-31 07:22:59 +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()
 | 
