IncludeSheet "snake1",1,1,200,84
IncludeSheet "snake2",2,1,200,40
IncludeSheet "snake3",3,1,8,8
IncludeSheet "snake4",4,1,8,8
IncludeSheet "snake5",5,1,8,8
IncludeSheet "snake6",6,1,8,8
IncludeSheet "snake7",7,1,8,8
IncludeSheet "snake8",8,1,8,8
IncludeSheet "snake9",9,1,8,8
IncludeSheet "snakeA",10,1,50,52
IncludeSheet "snakeB",11,1,50,52
IncludeSheet "snakeC",12,1,32,8
IncludeSheet "snaked",13,1,8,32
IncludeSheet "snakee",14,1,24,24

;Sheets for the background and logo
Var shBack:Int=0
Var shLogo:Int=0
Var shA:Int=0
Var shB:Int=0
Var shW1:Int=0
Var shW2:Int=0
Var shicon:Int=0

;Sheets for the Snakes
Var shSnake1_1:Int=0
Var shSnake1_2:Int=0
Var shSnake2_1:Int=0
Var shSnake2_2:Int=0

;Sheets for the Foords
Var shFood1:Int=0
Var shFood2:Int=0
Var shFood3:Int=0

;Used for loops
Var Gloop:Int=0
Var I:Int=0
Var j:Int=0
Var k:Int=0
Var l:Int=0
Var w:Int=0
Var TimerTick:Int=0
Var customtimer:Int=0
Var customset:Int=0
Var gamespeed:Int=1
Var GetReadyCount:Int=3
Var GetReady=0
Var RestartReady=0
Var GetReadytimer=0

;All the imageboxes for the snakes
Var Snake1S(40):Int
Var Snake2S(40):Int

;X/Y posistions for snakes
Var SnakeX1:Int=0
Var SnakeX2:Int=0
Var SnakeY1:Int=0
Var SnakeY2:Int=0

;used for the intro- screen to blink the text and move the snakes
Var gamestatus:Int=0
Var Keylock:Int=0
Var Keylock2:Int=0
Var Keylock3:Int=0
Var Keylock4:Int=0
Var Keylock5:Int=0
Var Keylock6:Int=0
Var KeyMenu:Int=0

; Used for the Grid and snakes
Var grid(35,30):Int=0 ;25,20

Var RandomX:Int=0
Var RandomY:Int=0
Var ORandomX:Int=0
Var ORandomY:Int=0

Var food_plot:Int=0
Var current_food:Int=0
Var current_snake:Int=0

Var snake1Max:Int=4
Var Snake1Direction:Int=0
Var Snake1Last:Int=4
Var Snake1LastX:Int
Var Snake1LastY:Int
Var Snake1Speed:Int=0
Var Snake1SpeedTimer:Int=0

Var snake2Max:Int=4
Var Snake2Direction:Int=0
Var Snake2Last:Int=4
Var Snake2LastX:Int
Var Snake2LastY:Int
Var Snake2Speed:Int=0
Var Snake2SpeedTimer:Int=0

Var SendSnake1Pos:Int=0

Var PlayLevel:Int=0
;Used for network related routines
Global INmsg$
Global temp$
Global netmsg$
Global netarray$(99)

Var NetSync:Int=1
Var N:Int=0
Var netcount:Int=0
Var lastmsg:Int=0
Var firsttime:Int=0
Var connectType:Int=0
Var MyIP:String
Var MyPort:String
Var Myres:String
Var port:Int



Function Plot_Snake1;         SNAKE 1
	
	Snake1SpeedTimer=Snake1SpeedTimer+1

	If Snake1SpeedTimer=Snake1Speed Then
		Snake1SpeedTimer=0
		
		If connectType=2 Then
			Snake1Direction=SendSnake1Pos
		EndIf


		If Snake1Direction<> 0 Then

			Snake1LastY=GetObjTop (Snake1S(Snake1Last))
			Snake1LastX=GetObjLeft (Snake1S(Snake1Last))	

			RefreshArea background1_id,Snake1LastX,Snake1LastY,8,8
			RefreshArea background2_id,Snake1LastX,Snake1LastY,8,8
			grid(Snake1LastX/8,Snake1LastY/8)=0

			SetObjPos Snake1S(Snake1Last),SnakeX1,SnakeY1
			grid(SnakeX1/8,SnakeY1/8)=1

			If Snake1Direction=1 ;R
				SetObjGraphic Snake1S(1),shSnake1_1,2
				SetObjGraphic Snake1S(Snake1Last),shSnake1_2,0
				SnakeX1=SnakeX1+8
			EndIf

			If Snake1Direction=2 ;L
				SetObjGraphic Snake1S(1),shSnake1_1,1
				SetObjGraphic Snake1S(Snake1Last),shSnake1_2,0
				SnakeX1=SnakeX1-8
			EndIf

			If Snake1Direction=3 ;U
				SetObjGraphic Snake1S(1),shSnake1_1,0
				SetObjGraphic Snake1S(Snake1Last),shSnake1_2,1
				SnakeY1=SnakeY1-8
			EndIf	

			If Snake1Direction=4 ;D
				SetObjGraphic Snake1S(1),shSnake1_1,3
				SetObjGraphic Snake1S(Snake1Last),shSnake1_2,1
				SnakeY1=SnakeY1+8
			EndIf	

			SetObjPos Snake1S(1),SnakeX1,SnakeY1	

	
			If grid(SnakeX1/8,SnakeY1/8)=2 Then
				grid(SnakeX1/8,SnakeY1/8)=0	
				current_snake=1
				ForcePowerUp()
			EndIf


			If SnakeX1<0 Or SnakeY1<0 Or SnakeX1>199 Or SnakeY1>159 Then
				current_snake=1
				If connectType<>1 Then
					SnakeError()
				EndIf
			EndIf

			If grid(SnakeX1/8,SnakeY1/8)=1 Then
				current_snake=1
				If connectType<>1 Then
					SnakeError()
				EndIf
			Else
				grid(SnakeX1/8,SnakeY1/8)=1
			EndIf

		
			RefreshObj Snake1S(1)
			RefreshObj Snake1S(Snake1Last)

			Snake1Last=Snake1Last -1
			If Snake1Last=1 Then Snake1Last=snake1Max
		EndIf
	EndIf
EndF


Function Plot_Snake2 ; SNAKE 2

	Snake2SpeedTimer=Snake2SpeedTimer+1

	If Snake2SpeedTimer=Snake2Speed Then
		Snake2SpeedTimer=0

		If Snake2Direction<> 0 Then

			Snake2LastY=GetObjTop (Snake2S(Snake2Last))
			Snake2LastX=GetObjLeft (Snake2S(Snake2Last))	
			RefreshArea background1_id,Snake2LastX,Snake2LastY,8,8
			RefreshArea background2_id,Snake2LastX,Snake2LastY,8,8
			grid(Snake2LastX/8,Snake2LastY/8)=0

			SetObjPos Snake2S(Snake2Last),SnakeX2,SnakeY2
			grid(SnakeX2/8,SnakeY2/8)=1

			If Snake2Direction=1 ;R
				SetObjGraphic Snake2S(1),shSnake2_1,2
				SetObjGraphic Snake2S(Snake2Last),shSnake2_2,0
				SnakeX2=SnakeX2+8
			EndIf

			If Snake2Direction=2 ;L
				SetObjGraphic Snake2S(1),shSnake2_1,1
				SetObjGraphic Snake2S(Snake2Last),shSnake2_2,0
				SnakeX2=SnakeX2-8
			EndIf

			If Snake2Direction=3 ;U
				SetObjGraphic Snake2S(1),shSnake2_1,0
				SetObjGraphic Snake2S(Snake2Last),shSnake2_2,1
				SnakeY2=SnakeY2-8
			EndIf	

			If Snake2Direction=4 ;D
				SetObjGraphic Snake2S(1),shSnake2_1,3
				SetObjGraphic Snake2S(Snake2Last),shSnake2_2,1
				SnakeY2=SnakeY2+8
			EndIf	

			SetObjPos Snake2S(1),SnakeX2,SnakeY2	

			If grid(SnakeX2/8,SnakeY2/8)=2 Then
				current_snake=2
				grid(SnakeX1/8,SnakeY1/8)=0	
				ForcePowerUp()
			EndIf


			If SnakeX2<0 Or SnakeY2<0 Or SnakeX2>200 Or SnakeY2>160 Then
				current_snake=2
				If connectType<>1 Then
					SnakeError()
				EndIf
			EndIf

			If grid(SnakeX2/8,SnakeY2/8)=1 Then
				current_snake=2
				If connectType<>1 Then
					SnakeError()
				EndIf
			Else
				grid(SnakeX2/8,SnakeY2/8)=1
			EndIf
		
			RefreshObj Snake2S(1)
			RefreshObj Snake2S(Snake2Last)

			Snake2Last=Snake2Last -1
			If Snake2Last=1 Then Snake2Last=snake2Max
		EndIf
	EndIf
EndF


Function SnakeError

	If current_snake=1 Then
		SetObjGraphic Snake1S(1),shSnake1_1,4
		RefreshObj Snake1S(1)
			Form1.Status.Text = "Oh oh .. player 1 lost some points here!"
			Form1.Status.Refresh

			If connectType<>3  Then
				Net.TCP.Send("RESET:1*"+ Chr(13)+Chr(10))
			EndIf
	EndIf

	If current_snake=2 Then
		SetObjGraphic Snake2S(1),shSnake2_1,4
		RefreshObj Snake2S(1)
			Form1.Status.Text = "Oh oh .. player 2 lost some points here!"
			Form1.Status.Refresh

			If connectType<>3  Then
				Net.TCP.Send("RESET:2*"+ Chr(13)+Chr(10))
			EndIf
	EndIf

	Snake2Direction=0
	Snake1Direction=0
	customset=0 ; stop timer and wait for a key from the host.
	NetSync=0
EndF


// Event Control MoveSnakeTimer
Function MoveSnake


	If Snake1Direction<> 0 Or Snake2Direction <> 0 Then

		If connectType=2  And NetSync=1 Then ; server mode
			NetSync=0
			SendSnake1Pos=Snake1Direction
			If food_plot => 350 Then
				 ; when server .. give power up .. and move the snake are in the powerup loop in 1 cycle
				PowerUp()
				food_plot=0
			Else
				Net.TCP.Send("SDIR:" + Str(SendSnake1Pos)+"*"+ Chr(13)+Chr(10))
			EndIf

		EndIf
	
		If connectType=3 Then  ;Single player
			Plot_Snake1()
		EndIf

	EndIf

EndF


// Open Form Form
Function Load_Refresh

	StartTXT.Text = StartTXT.Text +"!"
	StartTXT.Refresh

EndF


Function Setsnakelength

	For j=2 To 33
		SetObjPos Snake1S(j),5000,5000
		SetObjPos Snake2S(j),5000,5000
	Next j

	If connectType <> 3 Then
		SetObjPos Snake2S(1),160,80
		SnakeX2=160
		SnakeY2=80
		grid(160/8,80/8)=1
		SetObjGraphic Snake2S(1),shSnake2_1,1
	EndIf

	SetObjPos Snake1S(1),40,80
	SnakeX1=40
	SnakeY1=80
	grid(40/8,80/8)=1
	
	SetObjGraphic Snake1S(1),shSnake1_1,1	

	For k=0 To 25
		For l=0 To 20	
			grid(k,l)=0
		Next I
	Next k

	SetObjPos Food1,5000,5000	

	snake1Max=4
	snake2Max=4

	Snake1Last=4
	Snake2Last=4
	Snake1Speed=4
	Snake2Speed=4
	Snake1SpeedTimer=0
	Snake2SpeedTimer=0
	PlayLevel=PlayLevel+1
	Level()
	RefreshAll 1

		If connectType=3 Then ;timer aan zetten voor single player
			customset=3
			Form1.Status.Text = "Get ready!"
			Form1.Status.Refresh

		EndIf



EndF


Function Form1_Open

		Randomize GetSecond() * GetMinute()
		

	StartTXT.Text = " Loading SymbOS Snake game. Please Wait"
	StartTXT.Refresh

	shBack = LoadSheet(InitDir$+"snake1.gsh")
		Load_Refresh()
	shLogo = LoadSheet(InitDir$+"snake2.gsh")
		Load_Refresh()
	shSnake1_1 = LoadSheet(InitDir$+"snake3.gsh")
		Load_Refresh()
	shSnake1_2 = LoadSheet(InitDir$+"snake4.gsh")
		Load_Refresh()
	shSnake2_1 = LoadSheet(InitDir$+"snake5.gsh")
		Load_Refresh()
	shSnake2_2 = LoadSheet(InitDir$+"snake6.gsh")
		Load_Refresh()
	shFood1 = LoadSheet(InitDir$+"snake7.gsh")
		Load_Refresh()
	shFood2 = LoadSheet(InitDir$+"snake8.gsh")
		Load_Refresh()
	shFood3= LoadSheet(InitDir$+"snake9.gsh")
		Load_Refresh()
	shA= LoadSheet(InitDir$+"snakeA.gsh")
		Load_Refresh()
	shB= LoadSheet(InitDir$+"snakeB.gsh")
		Load_Refresh()
	shW1= LoadSheet(InitDir$+"snakeC.gsh")
		Load_Refresh()
	shW2= LoadSheet(InitDir$+"snakeD.gsh")
		Load_Refresh()
	shicon= LoadSheet(InitDir$+"snakee.gsh")
		Load_Refresh()

	SetObjGraphic background1,shBack,0
	SetObjGraphic background2,shBack,0	
	SetObjGraphic SnakeLogo,shLogo,0
	SetObjGraphic bg1,shA,0
	SetObjGraphic bg2,shB,0
	SetObjGraphic Icon,shicon,0
	SetObjGraphic food1,shFood1,0
	SetObjGraphic food2,shFood2,0
	SetObjGraphic food3,shFood3,0

	;Get ObjectID for Players
	
	Snake1S(1)=GetObjID(1,5)
	Snake2S(1)=GetObjID(1,38)
	SetObjGraphic Snake1S(1),shSnake1_1,1
	SetObjGraphic Snake2S(1),shSnake2_1,1
	RefreshObj Snake1S(1)
	RefreshObj Snake2S(1)

	For Gloop=2 To 33
		Snake1S(Gloop)=GetObjID(1,Gloop+4)
		Snake2S(Gloop)=GetObjID(1,Gloop+37)
		SetObjGraphic Snake1S(Gloop),shSnake1_2,0
		SetObjGraphic Snake2S(Gloop),shSnake2_2,0
		RefreshObj Snake1S(Gloop)
		RefreshObj Snake2S(Gloop)
	Next

	;walls

	SetObjGraphic WH1,shW1,0
	SetObjGraphic WH2,shW1,0
	SetObjGraphic WH3,shW1,0
	SetObjGraphic WH4,shW1,0
	SetObjGraphic WH5,shW1,0
	SetObjGraphic WH6,shW1,0
	SetObjGraphic WH7,shW1,0
	SetObjGraphic WH8,shW1,0
	SetObjGraphic WH9,shW1,0
	SetObjGraphic WH10,shW1,0

	SetObjGraphic WV1,shW2,0
	SetObjGraphic WV2,shW2,0
	SetObjGraphic WV3,shW2,0
	SetObjGraphic WV4,shW2,0
	SetObjGraphic WV5,shW2,0
	SetObjGraphic WV6,shW2,0
	SetObjGraphic WV7,shW2,0
	SetObjGraphic WV8,shW2,0
	SetObjGraphic WV9,shW2,0
	SetObjGraphic WV10,shW2,0

	RefreshAll 1

EndF

// Event Control Form1
Function Form1_Main

	; Display START TEXT 
	If gamestatus< 8 Then
		Gloop=Gloop+1
		If Gloop=>50 Then Gloop=1

		If Gloop=1 Then
			If gamestatus=0 Then
				StartTXT.Text = "                Press [S]  to start the game!"
				RefreshObj StartTXT
			EndIf
			If gamestatus=1 Then
				StartTXT.Text ="        [1] Single game    [2] For multiplayer       "
				RefreshObj StartTXT
			EndIf
			If gamestatus=2 Then
				StartTXT.Text = "          Give network settings and press F1            "
				RefreshObj StartTXT	

			EndIf

			If gamestatus=3 Then
				StartTXT.Text = "      Press [C] for Client  [S] for Server game"
				RefreshObj StartTXT	
			EndIf
			If gamestatus=4 Then

				Myres$=Net.DNS.Resolve(Control.Text(HostName))

				If Myres$="" Then
					MyIP="ERROR" 
				EndIf
				MyIP=Myres
				MyPort=Control.Text(PortName)
				port=CInt(MyPort)	

				Net.TCP.Client.Open(65535,MyIP,port)

				connectType = 1 ; client
				Form1.Status.Text = "Trying to connect to server on : " + MyIP + ":" + Str(port)
				Form1.Status.Refresh
				gamestatus=6

			EndIf
			If gamestatus=5 Then
				connectType = 2 ; Server
				MyPort=Control.Text(PortName)
				port=CInt(MyPort)	

				Net.TCP.Server.Open(port)
				Form1.Status.Text = "Server is waiting for client to connect game on port: " +Str(port)
				Form1.Status.Refresh
				gamestatus=6
			EndIf

			If gamestatus=7 Then; 1 player
				connectType=3
				gamestatus=6
				Form1.Status.Text = "Playing game in single player mode."
				Form1.Status.Refresh

			EndIf

			If gamestatus=6 Then ; start game
				gamestatus=99 ;lock menu
				KeyMenu=1
				SetObjPos SnakeLogo,5000,5000
				SetObjPos bg1,5000,5000
				SetObjPos bg2,5000,5000
				StartTXT.Text = "               Waiting for the game to start ....               "
				RefreshAll 1

			EndIf
	Else 		
			If Gloop=25 Then 
				 StartTXT.Text = "                                                                  " 
				RefreshObj StartTXT		
			EndIf
		EndIf
	EndIf


	If connectType=3 Then ;singleplayermode=3

		If Key(01) Then ;R
			Snake1Direction=1
		EndIf
		
		If Key(08) Then ;L
			Snake1Direction=2
		EndIf	

		If Key(00) Then ;U
			Snake1Direction=3
		EndIf

		If Key(2) Then  ;D
			Snake1Direction=4
		EndIf
	EndIf

	If connectType=2 Then ;server=2

		If Key(01) Then ;R
			Snake1Direction=1
		EndIf
		
		If Key(08) Then ;L
			Snake1Direction=2
		EndIf	

		If Key(00) Then ;U
			Snake1Direction=3
		EndIf

		If Key(2) Then  ;D
			Snake1Direction=4
		EndIf
	EndIf



	If connectType=1 Then ;client

		If Key(01) Then ;R
			Snake2Direction=1
		EndIf
	
		If Key(08) Then ;L
			Snake2Direction=2
		EndIf
	
		If Key(00) Then ;U
			Snake2Direction=3
		EndIf

		If Key(2) Then  ;D
			Snake2Direction=4
		EndIf

	EndIf


	If KeyMenu=0 Then
		If Key(60) And gamestatus<> 2 Then ;S
			If Keylock = 0 Then
				If gamestatus = 3 Then
					gamestatus=5
				Else
					If gamestatus=5 Then
					Else
					gamestatus=1
					EndIf
				EndIf	

				Keylock = 1
			EndIf
		Else
			Keylock = 0
		EndIf


		If Key(62) And gamestatus<>2  Then ; C
			If Keylock2= 0 Then
				gamestatus=4
				Keylock2 = 1
			EndIf
		Else
			Keylock2 = 0
		EndIf	

		If Key(64) And gamestatus=1 Then ;1
			If Keylock3=0 Then
				gamestatus=7
				Keylock3=1	
			EndIf
		Else
			Keylock3=0
		EndIf

		If Key(65) And gamestatus=1 Then ;2
			If Keylock4= 0 Then
					gamestatus=2
					Keylock4 = 1
					SetObjPos HostName,10,82
					SetObjPos PortName,130,82
			
					RefreshObj HostName
					RefreshObj PortName

			EndIf
		Else
			Keylock4 = 0
		EndIf

		If Key(13) Then ;network settings F1
			If Keylock5= 0 Then
					gamestatus=3
					SetObjPos HostName,2000,2000
					SetObjPos PortName,2000,2000
	
					RefreshObj  background2
					RefreshObj bg1
					RefreshObj bg2
					Keylock5=1
			EndIf
		Else
			Keylock5 = 0
		EndIf

	EndIf


	If customset=1 Then ;server mode
		customtimer=customtimer+1
		If customtimer=>gamespeed Then
			MoveSnake()
			customtimer=0
			food_plot = food_plot + 1
		EndIf
	EndIf

	If customset=3 Then ;single player mode
		customtimer=customtimer+1
		If customtimer=>gamespeed+5 Then
			MoveSnake()
			customtimer=0
				food_plot = food_plot + 1
	
				If food_plot => 90 Then
					PowerUp()
					food_plot=0
				EndIf
		EndIf
	EndIf


	If Key(47) And gamestatus=99 Then ;Space to continue
		If Keylock6= 0 Then
			Keylock6 = 1
			RestartReady=0
			If connectType <> 1 Then
				
				If connectType=2 Then
					customset=0
					NetSync=0
					
					Form1.Status.Text = "Server is sending a restart to the client."
					Form1.Status.Refresh
					Net.TCP.Send("GETREADY*"+Chr(13)+Chr(10))
					SetObjPos StartTXT,1,70
					GetReady=1
				Else
					Setsnakelength()
					customset=3

				EndIf
				
				Form1.Status.Text = ""
				Form1.Status.Refresh

			Else
				Form1.Status.Text = "Waiting for server to respond."
				Form1.Status.Refresh
			EndIf
	
		Else
			Keylock6 = 0
		EndIf
	
	EndIf


	If GetReady=1 Then
		GetReadytimer=GetReadytimer+1

		If GetReadytimer=>80 Then

			GetReady_Event()
			GetReadytimer=0
		EndIf
	EndIf

		


EndF

Function Net_Event

	If Net.Status = Net.TCP.Established Then
		If firsttime=0 And connectType=1 Then
			;first time as client connection
			firsttime=1
			Net.TCP.Send("CONNECT:1*"+ Chr(13)+Chr(10))
			Form1.Status.Text ="Try to join the server game as network client."
			Form1.Status.Refresh
		EndIf

		If firsttime=1 Then
			Form1.Status.Text = "Established connection as network client."
			Form1.Status.Refresh
			firsttime=2
		EndIf

		While Net.Received>0 
		
			INmsg= Net.TCP.String.Receive(Net.Received)

			;CHECK INCOMMING STRING ON STRAINGE CHARACTERS
			netcount=0
			netmsg=""
			temp=""

				For N=1 To Len(Inmsg)
					If Asc(Mid$(INmsg$,N,1)) =>32  And Asc(Mid$(INmsg$,N,1)) =<127 Then	

						If Mid(INmsg$,N,1) ="*" Then
							netcount=netcount+1
							netarray$(netcount) =  temp
							temp = ""
						Else
				 			temp=temp+Mid(Inmsg,N,1)
						EndIf
					EndIf
		
				Next N

		Wend

		lastmsg=netcount

		For netcount=0 To lastmsg

			Netmsg = netarray$(netcount)

			;INCOMMING PROTOCOL
			If Mid(NetMsg,1,5) = "SDIR:" Then	
			
				If connectType=2 Then ;server
					NetSync=1
					If Mid(netMsg,6,1) = "0" Then
						Snake2Direction=0
					EndIf	
					If Mid(netMsg,6,1) = "1" Then
						Snake2Direction=1
					EndIf	
					If Mid(netMsg,6,1) = "2" Then
						Snake2Direction=2
					EndIf	
					If Mid(netMsg,6,1) = "3" Then
						Snake2Direction=3
					EndIf	
					If Mid(netMsg,6,1) = "4" Then
						Snake2Direction=4
					EndIf	

						Plot_Snake1()
						Plot_Snake2()
				EndIf

				If connectType=1 Then; client
		
					If Mid(netMsg,6,1) = "0" Then
						Snake1Direction=0
					EndIf	
					If Mid(netMsg,6,1) = "1" Then
						Snake1Direction=1
					EndIf	
					If Mid(netMsg,6,1) = "2" Then
						Snake1Direction=2
					EndIf	
					If Mid(netMsg,6,1) = "3" Then
						Snake1Direction=3
					EndIf	
					If Mid(netMsg,6,1) = "4" Then
						Snake1Direction=4
					EndIf	
					SendSnake1Pos=Snake1Direction
					Plot_Snake1()
				 	Plot_Snake2()
					Net.TCP.Send("SDIR:" + Str(Snake2Direction)+"*"+Chr(13)+Chr(10))

				EndIf

			EndIf

			If Mid(NetMsg,1,8) = "CONNECT:" Then
	
				If Mid(netMsg,9,1) = "1" Then
				;	customset=1
					Form1.Status.Text = "Established connection as network server."
					Form1.Status.Refresh
					; First time connection.
					SetObjPos StartTXT,1,70
					Net.TCP.Send("GETREADY*"+Chr(13)+Chr(10))
					GetReady=1			

				EndIf	

			EndIf

			If Mid(NetMsg,1,8) = "GETREADY" Then
					SetObjPos StartTXT,1,70
					GetReady=1			
			EndIf



			If Mid(NetMsg,1,6) = "RESET:" Then
	
				If Mid(netMsg,7,1) = "1" Then
					
					SetObjGraphic Snake1S(1),shSnake1_1,4
					RefreshObj Snake1S(1)
					Form1.Status.Text = "Oh oh .. player 1 lost some points here!"
					Form1.Status.Refresh

					Snake2Direction=0
					Snake1Direction=0
					customset=0 ; stop timer and wait for a key from the host.
					NetSync=0


				EndIf	

				If Mid(netMsg,7,1) = "2" Then
					
					SetObjGraphic Snake2S(1),shSnake2_1,4
					RefreshObj Snake2S(1)
					Form1.Status.Text = "Oh oh .. player 2 lost some points here!"
					Form1.Status.Refresh

					Snake2Direction=0
					Snake1Direction=0
					customset=0 ; stop timer and wait for a key from the host.
					NetSync=0

					
				EndIf	


			EndIf

			If Mid(NetMsg,1,8) = "RESTART:" Then
	
				If Mid(netMsg,9,1) = "1" Then
					RestartReady=1
				EndIf
			EndIf


			If Mid(NetMsg,1,5) = "FOOD:" Then

				If Mid(netMsg,6,1) = "1" Then
					RandomX=CInt(Mid(Netmsg,7,Len(Netmsg)-6))
				EndIf
				If Mid(netMsg,6,1) = "2" Then
					RandomY=CInt(Mid(Netmsg,7,Len(Netmsg)-6))
				EndIf
				If Mid(netMsg,6,1) = "3" Then

					If grid(ORandomX,ORandomY)=2 Or grid(ORandomX,ORandomY)=0 Then
						RefreshArea background1_id,ORandomX*8,ORandomY*8,8,8
						RefreshArea background2_id,ORandomX*8,ORandomY*8,8,8
						grid(ORandomX,ORandomY)=0
					EndIf

					current_food=CInt(Mid(Netmsg,7,Len(Netmsg)))
					SetObjPos Food1,RandomX*8,RandomY*8
					SetObjGraphic food1,shFood1,current_food
					RefreshObj Food1
					grid(RandomX,RandomY)=2
						
					ORandomX=RandomX
					ORandomY=RandomY
				EndIf

			EndIf

		Next netcount
	Else
		;No network
		If connectType=1 Then
			Form1.Status.Text = "Trying to establish a connection... retry .."
			Form1.Status.Refresh
			gamestatus=4
		EndIf

	EndIf

EndF


// Close Form Form1
Function Form1_Close

	FreeSheet shBack 
	FreeSheet shLogo 
	FreeSheet shSnake1_1
	FreeSheet shSnake1_2
	FreeSheet shSnake2_1
	FreeSheet shSnake2_2
	FreeSheet shFood1
	FreeSheet shFood2
	FreeSheet shFood3
	FreeSheet shA
	FreeSheet shB
	FreeSheet shW1
	FreeSheet shW2



	If connectType=1 Or connectType=2 Then
		Net.TCP.Close
	EndIf

EndF

Function ForcePowerUp

	If current_snake=1 Then
		SetObjGraphic Snake1S(1),shSnake1_1,4
	EndIf

	If current_snake=2 Then
		SetObjGraphic Snake1S(1),shSnake2_1,4
	EndIf

	RefreshObj Snake1S(1)
	RefreshObj Snake1S(2)


	If current_food=0 Then	;level
		If current_snake=1 Then
			snake1Max=snake1Max+15
			If snake1Max>33 Then snake1Max=33
		EndIf
		If current_snake=2 Then
			snake2Max=snake2Max+15
			If snake2Max>33 Then snake2Max=33
		EndIf

	EndIf

	If current_food=1 Then	;10 points
		If current_snake=1 Then
			Snake1Speed=1
		EndIf
		If current_snake=2 Then
			Snake2Speed=1
		EndIf
	EndIf

	If current_food=2 Then	;get small again
		If current_snake=1 Then
			snake1Max=snake1Max-1
			If snake1Max=<4 Then snake1Max=4
		EndIf
		If current_snake=2 Then
			snake2Max=snake2Max-1
			If snake2Max<=4 Then snake2Max=4
		EndIf

	EndIf

	If current_food=3 Then	;move wall
		If current_snake=1 Then

		EndIf
		If current_snake=2 Then

		EndIf
	EndIf

	If current_food=4 Then	;Freeze snake
		If current_snake=1 Then

		EndIf
		If current_snake=2 Then

		EndIf
	EndIf

	If current_food=5 Then	;speed -
		If current_snake=1 Then
			Snake1Speed=Snake1Speed+1
			If Snake1Speed=>5 Then Snake1Speed=5
		EndIf
		If current_snake=2 Then
			Snake2Speed=Snake2Speed+1
			If Snake2Speed=>5 Then Snake2Speed=5
		EndIf
	EndIf

	If current_food=6 Then	;speed +
		If current_snake=1 Then
			Snake1Speed=Snake1Speed-1
			If Snake1Speed=<1 Then Snake1Speed=1
		EndIf
		If current_snake=2 Then
			Snake2Speed=Snake2Speed-1
			If Snake2Speed=<1 Then Snake2Speed=1
		EndIf
	EndIf

	If current_food=7 Then	;turn
		If current_snake=1 Then

		EndIf
		If current_snake=2 Then

		EndIf
	EndIf

	If current_food=8 Then	;food
		If current_snake=1 Then
			snake1Max=snake1Max+2
			If snake1Max>33 Then snake1Max=33

		EndIf
		If current_snake=2 Then
			snake2Max=snake2Max+2
			If snake2Max>33 Then snake2Max=33
		EndIf
	EndIf

	If current_food=9 Then	;food
		If current_snake=1 Then
			snake1Max=snake1Max+1
			If snake1Max>33 Then snake1Max=33
		EndIf
		If current_snake=2 Then
			snake2Max=snake2Max+1
			If snake2Max>33 Then snake2Max=33
		EndIf
	EndIf

	current_food=99
	
EndF


Function PowerUp

	If  connectType=2 Or connectType=3 Then ; Server or single player

		If grid(RandomX,RandomY)=2 Or grid(RandomX,RandomY)=0 Then
			RefreshArea background1_id,RandomX*8,RandomY*8,8,8
			RefreshArea background2_id,RandomX*8,RandomY*8,8,8
			grid(RandomX,RandomY)=0
		EndIf
	
		RandomX = Rnd (24)
		RandomY = Rnd (19)
	;	RandomX =6
	;	RandomY =10


		If grid(RandomX,RandomY)=0 Then

			current_food = Rnd(9)
			;current_food = 1
			SetObjPos Food1,RandomX*8,RandomY*8
			SetObjGraphic food1,shFood1,current_food
			RefreshObj Food1
			grid(RandomX,RandomY)=2

			If connectType=2 Then ;food+move
				Net.TCP.Send("FOOD:1"+Str(RandomX)+"*FOOD:2"+Str(RandomY)+"*FOOD:3"+ Str(current_food)+"*SDIR:" + Str(SendSnake1Pos)+"*"+ Chr(13)+Chr(10))
			EndIf

		Else
			If connectType=2 Then ;food+move
				Net.TCP.Send("*SDIR:" + Str(SendSnake1Pos)+"*"+ Chr(13)+Chr(10))
			EndIf
		EndIf

	EndIf

EndF



Function Level

;	If PlayLevel=1 Then

		SetObjPos wh1,16,32	
		SetObjPos wh2,48,32	
		SetObjPos wh3,120,32	
		SetObjPos wh4,152,32	
		SetObjPos wh5,16,112	
		SetObjPos wh6,48,112	
		SetObjPos wh7,120,112	
		SetObjPos wh8,152,112	
		SetObjPos wv1,72,64	
		SetObjPos wv2,120,64	
		SetObjPos wv3,96,8	
		SetObjPos wv4,96,120	

		For w=2 To 9
			 grid(w,4)=1
		Next
		For w=15 To 22
			 grid(w,4)=1
		Next
		For w=2 To 9
			 grid(w,14)=1
		Next
		For w=15 To 22
			 grid(w,14)=1
		Next
		For w=8 To 11
			 grid(9,w)=1
		Next
		For w=15 To 18
			 grid(12,w)=1
		Next
		For w=8 To 11
			 grid(15,w)=1
		Next
		For w=1 To 4
			 grid(12,w)=1
		Next


EndF


// Event Control Timer1
Function GetReady_Event


		StartTXT.Text= "                 Get Ready in     [" + Str(GetReadyCount) + "]  !!!!"
		RefreshObj StartTXT
		GetReadyCount=GetReadyCount-1

		If GetReadyCount=<-1 And connectType=1  Then 
			Form1.Status.Text = "                                                                            "
			Form1.Status.Refresh
			SetObjPos StartTXT,5000,5000
			GetReadyCount=3
			GetReady=0			
			Snake1Direction=1
			Snake2Direction=1
			Setsnakelength()
			Net.TCP.Send("RESTART:1*"+ Chr(13)+Chr(10))

		EndIf

		If connectType=2 And RestartReady=1 And GetReadyCount=< -2  Then
			Setsnakelength()
			GetReadyCount=3
			GetReady=0
			RestartReady=0
			Form1.Status.Text = "                                                                            "
			Form1.Status.Refresh
			SetObjPos StartTXT,5000,5000
		
			Snake1Direction=1
			Snake2Direction=1

		
			customset=1
			NetSync=1

		EndIf



EndF




