[bb] Snakes Client and Server by Blitzplotter [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:39

Previous topic - Next topic

BlitzBot

Title : Snakes Client and Server
Author : Blitzplotter
Posted : 1+ years ago

Description : This was based initially on Wing's TCP/IP code - I've added a little bit of extra code - tried to comment it effectively.

You can run 3 or 4 clients and make 'art' with them.

The last addition to the code was the proximity function which increases the size of a horizontal bar beneath the client' play area dependant upon how close you are to other players (10 to 50 pixels in steps of 10)

[Edit] 2014, I revisited this and it just bugged the hell outa me I didn't codebox it, Hmmm it might be the vino, but it would appear you cannot codebox in the code archives, oh well - theres an extra de-limiter in the code now to delimit the Server and client code at least.


Code :
Code: blitzbasic
[codebox]; WORMCLIENT.bb - you can run up to 10 clients - dependant 
; on CPU grunt.......Although even on my laptop I could not
; get my CPU above 57 percent
; a little SNAKES client by Blitzplotter, note you will need 
; to compile the associated code WORMSERVER, make
; the executable WORMSERVER & the client will automatically
; try and start a server if one is not running. If you close the
; client(s) before closing the WORMSERVER, the WORMSERVER will
; mop up the 123456789 files that appear whilst the clients & 
; server are running. 


Global print_once=0

Global title_once=0

max_bank = 512
sent_count=0

Dim srv_player_data(512);  place to store what the server reckons state of play is

test_x_move=5;   amount of packets to have sent before start adjusting x co-ord of this player
test_y_move=5;    amount of packets to have sent before start adjusting y co-ord of this player
x_move=0
y_move=0

Global box_size=500

Global player_score=0
Global player_mult_score=0

Global worm_walled=0
Global worm_hit_player=0

Global x_check_move=0
Global y_check_move=0

maxplayers=35
params=3     	; 0=playernum
XX#=1			; 1=x
YY#=2			; 2=y; 
ALIVE#=3		; 3=alive set to (1) or (0) for dead

Dim collArray(35,5)

Global this_player=99

Global this_player_num = 0
Global change_player_num_once=0


Dim proxArray(5)    ; 5 levels of proximity

	

;basically got eight directions to move the worm in. 2 ways to do this, send


Dim move_logic_x(8)
Dim move_logic_y(8)

Global move_count=1  ;note this goes up to 8 & cycles back to 1

move_logic_x(0)=0 : move_logic_y(0)=0  ;dead, therefore do not move

move_logic_x(1)=1 : move_logic_y(1)=0  ;right    NOTE 1=+1; 2=-1 on server
move_logic_x(2)=1 : move_logic_y(2)=1  ;up right
move_logic_x(3)=0 : move_logic_y(3)=1  ;up
move_logic_x(4)=2 : move_logic_y(4)=1  ;up Left
move_logic_x(5)=2 : move_logic_y(5)=0  ;left
move_logic_x(6)=2 : move_logic_y(6)=2  ;down left
move_logic_x(7)=0 : move_logic_y(7)=2  ;down
move_logic_x(8)=1 : move_logic_y(8)=2  ;down right


tcp_sendbank=CreateBank(max_bank)
tcp_recbank=CreateBank(max_bank)


;use this string to run numerous clients on ONE laptop
Global USE_LOOPBACK$="127.0.0.1"

;If you want to access a server on your network, open a 
;command prompt and enter ipconfig on the PC/laptop you
;intend to run the server on:-

Global USE_NETWORK$="192.168.1.4" ; modify this IP for a remote
                                  ; computer on your LAN you wish
								  ; to attach to the Server

link_string$=USE_LOOPBACK$     ;will detect the WORMSERVER if running on the client computer
;link_string$=USE_NETWORK$


;Graphics3D 700,500,16,2            ; B3D
Graphics 800,600,16,2               ; 




;populate the collision Array params:
For count=1 To 30
	collArray(count,XX)=5
	collArray(count,YY)=5
	collArray(count,ALIVE)=1
Next

;link=OpenTCPStream("127.0.0.1",7056)			;NOTE:  might need to replace with your IP info
;link=OpenTCPStream("192.168.0.2",7056)         ;

link=OpenTCPStream(link_string,7056)

If Not link
	Print "failed to create link - No server detected - looking.....4" : ExecFile("WORMSERVER.exe"): Delay 1500
	
	link=OpenTCPStream(link_string,7056)
	
	If Not link
		
		wait$=Input ("Waited 15 seconds to detect Server - want to wait longer? (Y or N):")
		If wait$="y" Or wait$="Y"
			Print "okay, hanging on for a 30 second now.... last chance": Delay 30000
			link=OpenTCPStream(link_string,7056)
			
			If Not link
				Print "Ending...": Delay 1500: 
				End
			Else
				Print "                                         Server located, finally."
				;perimeter
				
				
				
				Line box_size,0,box_size,box_size
				Line 0,box_size,box_size,box_size
			EndIf
		Else
			Print "Terminating Client.": Delay 1500: End
				
			
		End If
	Else
		Print"                                         Server started by moi.": Delay 1500: Cls
	EndIf
	
Else
	Text 520,12,("Server detected")
EndIf

Text 12,580,(" Connected.. This player is Alive in the world....")

status=12; we emulate a logged in client

Text 520,30,("left & right cursors to turn")

; Draw perimeter

Line box_size,0,box_size,box_size
Line 0,box_size,box_size,box_size

While Not KeyHit(1)

	;If Eof(link) Then Print "Server has gone, 5 secs until this is gone too.... " : Delay 5000 : End 
	If Eof(link)
		Print "Server has gone, you had a score of:"+((player_mult_score*255)+player_score)
		
		wait$=Input ("Want to see if Server will restart? (Y or N):")
		If wait$="y" Or wait$="Y"
			Print "okay, hanging on for a 8 second wait before re-try.... last chance": Delay 8000
			link=OpenTCPStream(link_string,7056)
			
			If Not link
				Print "Ending...": Delay 1500: 
				End
			Else
				Print "Server located."
				status=14; attempt at pushing x & y to server
			EndIf
			Delay 5000
			Cls
			
			;perimeter
			Line 512,0,512,512
			Line 0,512,512,512
			
		Else
			Print "Terminating Client. This was player"+this_player_num: Delay 1500: End
			
			
		End If
		
	EndIf
		
		
	

	Select status
	
		Case 10
			
			If player_score>=255
				player_score=1
				player_mult_score=player_mult_score+1
			EndIf
			
	
		If ReadAvail(link)>=max_bank
		
			;time to read some ;)
			r=ReadBytes(tcp_recbank,link,0,max_bank)
			If pon=1
			Print "have readin "+r+" bytes from server."
			Print "-----------------------------------------------------"
		EndIf
		
			;my attempt at accessing sent count
			xth=PeekByte(tcp_recbank,0)        ;the amount of clients server has detected all
			                                   ;together: Note if a client is registered
			                                   ;by the server - the logic will dictate that
			                                   ;once that client dies it stays dead until
											   ; a new 'game' is ininitiated & the server
											   ;opens up all players for joining again. The
												;problem is that the server decrements the 
												; client count at the moment when a player 
												; stroke client is detected as 'left'.
				serv_count=PeekByte(tcp_recbank,1)
				
				
		    ;attempt at copying in data received from server now
		    For copy_ct=1 To 511
		    srv_player_data(copy_ct)=PeekByte(tcp_recbank,copy_ct)
		    Next
			
			;current players
			mem_loc=((20*1)-10)
			
			For loop = 1 To xth  ;cycling through the number of clients server states
								;is connected:  
				
				;Note - the xth is simply a loop index of how many clients are currently attached
	            ;work out where in 512 bytes this players x and y co-ords are:		
			    mem_loc=((20*loop)-10)
				If pon=1
					
			    Print"mem_loc is:"+mem_loc
			    
				Print "player: "+loop+" x co-ord:"+srv_player_data(mem_loc+1)
				Print "player: "+loop+" y co-ord:"+srv_player_data(mem_loc+2)
				
			EndIf
			
			If skiponce<3              ;needs to pass 3 times before it settles down
				skiponce=skiponce+1
			Else
				Text 20,550,"This is Player :"+this_player_num
			EndIf
			
			
			Flip
			
			Select loop
					
				Case 1
					Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
					
					
					;Text 610,(112)+loop*11,"player:"+loop+" score:"+player_score
					
					;Text 610,(132)+loop*11,"player:"+loop+" score:"+test_score
					
					
					collArray(1,XX)=srv_player_data(mem_loc+1)*2
					collArray(1,YY)=srv_player_data(mem_loc+2)*2
		Case 2
			Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
			;is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
			
			collArray(2,XX)=srv_player_data(mem_loc+1)*2
			collArray(2,YY)=srv_player_data(mem_loc+2)*2
			
			
			
		Case 3
			Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
			;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
			
			collArray(3,XX)=srv_player_data(mem_loc+1)*2
			collArray(3,YY)=srv_player_data(mem_loc+2)*2
			
		Case 4
			Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
			;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
			
			
			collArray(4,XX)=srv_player_data(mem_loc+1)*2
			collArray(4,YY)=srv_player_data(mem_loc+2)*2
			
		Case 5
			Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
			;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
			
			collArray(5,XX)=srv_player_data(mem_loc+1)*2
			collArray(5,YY)=srv_player_data(mem_loc+2)*2
			
		Case 6
			Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
			;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
			
			
			collArray(6,XX)=srv_player_data(mem_loc+1)*2
			collArray(6,YY)=srv_player_data(mem_loc+2)*2
			
		Case 7
			Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
			;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
			
			
			collArray(7,XX)=srv_player_data(mem_loc+1)*2
			collArray(7,YY)=srv_player_data(mem_loc+2)*2
			
		Case 8
			Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
			;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
			
			
			collArray(8,XX)=srv_player_data(mem_loc+1)*2
			collArray(8,YY)=srv_player_data(mem_loc+2)*2
			
		Case 9
			Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
			;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
			
			
			collArray(9,XX)=srv_player_data(mem_loc+1)*2
			collArray(9,YY)=srv_player_data(mem_loc+2)*2
			
		Case 10
			Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
			;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
			
			
			collArray(10,XX)=srv_player_data(mem_loc+1)*2
			collArray(10,YY)=srv_player_data(mem_loc+2)*2
			
			
	End Select
	
Next	
			
			If change_player_num_once=0
				change_player_num_once=1
				this_player_num=xth
				
				;this should ensure that this player num is only set once
				
			EndIf
			
			
			status=12 ; Yeppp time to respond... 
		End If
			
	
	Case 12
	
		;THIS IS THE SENDER
	
	    ;          player count:  1 byte	
		;          player: x, y co -ords, 2 bytes
		;          shot anything:  yes/no 1 byte
		;          projectile alive: 1 byte
		;          projectile x,y: 2 bytes
		;          player world count:  1 byte
		;          leaving 2 bytes for whatever       
	
	
	    ;byte 1: 1, add 1 to x,2 subtract 1 from x
	    ;byte 2: 1, add 1 to y,2 subtract 1 from y
		
		;byte seven: chaning to 12 from the 13 the server sets it to
	
		;haha client time to spam server first we make a cool tcp packet with random nunbers.
		For i=0 To (max_bank-1)
			PokeByte tcp_sendbank,i,0
			If sentcount<255
			PokeByte tcp_sendbank,0,sent_count
			Else sentcount=255
			EndIf
		Next
		
		PokeByte tcp_sendbank,3,this_player_num; poke the player_num byte the changed once number
		
		
	;encapsulate the move stuff within if alive logic
		
		If worm_walled=0
		
		
		If x_move>test_x_move Then
		    ;Print"set x________ to move"
			PokeByte tcp_sendbank,1,move_logic_x(move_count);1 here means server needs To move x For this
			                                ;player/client by +1
			
			;x_check_move=2*(move_logic_x(move_count)) this is only 1 to 8 doh!
			
		;Note the client is Not self aware therefore how to instigate direction changes 
		;as a result of input.....
			
			;easy - need to detect left cursor & right cursor first - this will be the 
			;controlling influence for the worm.....

		End If
		If y_move>test_y_move Then
		    ;Print"set y________ to move"
			PokeByte tcp_sendbank,2,move_logic_y(move_count)       ;1 here means server needs to move y for this
			                                ;player/client by +1
			
			;y_check_move=2*(move_logic_y(move_count))
			
		End If
		
	Else
		
		PokeByte tcp_sendbank,1,move_logic_x(0);1 here means server needs To move x For this by nothing
		PokeByte tcp_sendbank,2,move_logic_y(0);1 here means server needs to move y for this by nothing
		
		
	EndIf; endif for worm_walled code - basically this worm WILL MOVE NO MORE!!!!!!
	
	this_dead_mem_loc=((20*(loop-1)-10))
	
	
	
	
	
	
	
	If collArray(this_player_num,XX)>498 Or collArray(this_player_num,YY)>498 Then
				
			worm_walled=1
			
			PokeByte tcp_sendbank,(this_player_num*20)-13,12    ;13 here means this client is unlucky and dead!!!!
			; NOTE: if going to 
			
			;Text 250,250,"WORM SPLATTERED INTO A WALL..xmove: "+x_move+" &y:"+y_move
			
			this_dead_mem_loc=((20*(loop-1)-10))
			
			Text 40,420,"player: "+this_player_num+" dead at x co-ord:"+collArray(this_player_num,XX)
			Text 40,440,"player: "+this_player_num+" dead at y co-ord:"+collArray(this_player_num,YY)
			Text 40,460,"player: "+this_player_num+" Score:"++((player_mult_score*255)+player_score)
			
			PokeByte tcp_sendbank,1,move_logic_x(0);1 here means server needs To move x For this by nothing
			PokeByte tcp_sendbank,2,move_logic_y(0);1 here means server needs to move y for this by nothing
			
		EndIf
		
		If worm_walled=0
			
			PokeByte tcp_sendbank,7,12       ;12 here means this client is alive
			
											;this'll hopefully be changing the server from
											;13 to 12........................
			                                ;player/client by +1
			
			Text 500,380,("player not hit wall")
			
			
			;player alive so increment score
			player_score=player_score+1  
			
		Else
		;need to send the number here to server to inform player walled (& hit other player)
			Text 500,400,("player hit wall")
			
			PokeByte tcp_sendbank,7,13 
			
		EndIf
		
		
		PokeByte tcp_sendbank,5,player_score  
		PokeByte tcp_sendbank,6,player_mult_score 
		
		s=WriteBytes (tcp_sendbank,link,0,max_bank)
		;Print "Sending "+s+" bytes to server."+sent_count+" times"
		sent_count=sent_count+1
		
		status=10  ; Well we go out and wait for packet		
		
	Case 14
		
		;Client to contact server first we make a cool tcp packet
		For i=0 To (max_bank-1)
			PokeByte tcp_sendbank,i,0
			If sentcount<255
				PokeByte tcp_sendbank,0,sent_count
				Else sentcount=255
			EndIf
		Next
		
		If x_move>test_x_move Then
			PokeByte tcp_sendbank,1,srv_player_data(mem_loc+1)		;1 here means server needs to move x for this
			                                ;player/client by +1
			
		End If
		If y_move>test_y_move Then
			PokeByte tcp_sendbank,2,srv_player_data(mem_loc+2)      ;1 here means server needs to move y for this
			                                ;player/client by +1
			
		End If
		
		PokeByte tcp_sendbank,1,srv_player_data(mem_loc+1)
		PokeByte tcp_sendbank,2,srv_player_data(mem_loc+2)
		
		
		s=WriteBytes (tcp_sendbank,link,0,max_bank)
		sent_count=sent_count+1
		
		status=10
		
	Case 16  
		
		If ReadAvail(link)>=max_bank
			
			;time to read some ;)
			r=ReadBytes(tcp_recbank,link,0,max_bank)
			If pon=1
				
			Print "have readin "+r+" bytes from server."
			Print "-----------------------------------------------------"
		EndIf
		
			;accessing sent count
			xth=PeekByte(tcp_recbank,0)
			serv_count=PeekByte(tcp_recbank,1)
			
		    ;copying in data received from server now
		    For copy_ct=1 To 511
				srv_player_data(copy_ct)=PeekByte(tcp_recbank,copy_ct)
		    Next
			
			;current players
			mem_loc=((20*1)-10)
			For loop = 1 To xth
	            ;work out where in 512 bytes this players x and y co-ords are:		
			    mem_loc=((20*loop)-10)
				If pon=1
					
			    Print"mem_loc is:"+mem_loc
			    
				Print "player: "+loop+" x co-ord:"+srv_player_data(mem_loc+1)
				Print "player: "+loop+" y co-ord:"+srv_player_data(mem_loc+2)
			EndIf
			
				
			Next	
			
			status=12 ; Yeppp time to respond... 
		End If
		
		
		
	
End Select

	
	play_ct=0

    ;update x and y co-ords for this client to send to server:-	
	
	x_move = x_move+1
	y_move = y_move+1

	;Delay 10 ; yep we have to delay some here to emulate many clients.. or cpu dies.
	
	Delay 50
	
	VWait 1; let the CPU rest
	
	
	If KeyDown(203)
		;Text 400,400,("left detected")
		If move_count>1
			move_count=move_count-1
		Else
			move_count=8
		EndIf
	;Else
		;Text 400,400,("             nowt detected")
	EndIf

	If KeyDown(205)
		;Text 400,400,("right detected")
		If move_count<8
			move_count=move_count+1
		Else
			move_count=1
		EndIf
	EndIf

	If title_once<=6
		
		AppTitle "Worm Client Number "+this_player_num
		title_once=title_once+1
		
		Text 20,500,"vvvvvv Proximity meter: 10 to 50 units respectively vvvvvv"
		
	EndIf
	
	;call the proximity detector function
	If xth>1
		proximity(this_player_num,xth)
	EndIf
	
	
	
Wend


Function proximity(thisplayer,maxplayers)
	
	
	For checkOthers=1 To maxplayers
		
		Local XX=1
		Local YY=2
		
		If checkOthers=thisplayer
			;do nothing
		Else
			If collArray(checkOthers,XX)>collArray(thisplayer,XX)
				xdiff=collArray(checkOthers,XX)-collArray(thisplayer,XX)
			Else
				xdiff=collArray(thisplayer,XX)-collArray(checkOthers,XX)
			EndIf
			
			If collArray(checkOthers,YY)>collArray(thisplayer,YY)
				ydiff=collArray(checkOthers,YY)-collArray(thisplayer,YY)
			Else
				ydiff=collArray(thisplayer,YY)-collArray(checkOthers,YY)
			EndIf
			
			
			For closeness=50 To 10 Step -10
				
				If xdiff<closeness
					If xdiff>(closeness-10)
						proxArray(closeness/10)=proxArray(closeness/10)+1
					EndIf
				EndIf
				
			Next
			
		EndIf
		
	Next
	
	;draw the five proximity lines:
	For drawProx=1 To 5
		Line 1,510+(drawProx*6),(proxArray(drawProx)),510+(drawProx*6)
	Next
	
End Function

;END CLIENT CODE
;=========================================================================	
[codebox]

[codebox]


;WORMSERVER.bb - create an executable called WORMSERVER.exe
; in the same directory as the WORMCLIENT.exe

;removed need for a separate folder to hide files in

;VARS------------------------------------------------------------

Dim player_data(512)  ;512 bytes to copy into each clients

;Populate dummy player data
For count = 10 To 490 Step 20
	player_data(count+1)=player_number      ;x    (-9)      
	player_data(count+2)=count				;y    (-8)
	player_data(count+3)=count				;THIS IS JUST A COUNT OF CLIENTS THAT ARE RUNNING    
	player_data(count+4)=0					;(-7) 0 bullet dead, 1 alive  - now player num 
											;(-6)player score - not doing bullets for a while anyway.make this score count 1(1-255)
	player_data(count+5)=count+10			;(-5)2nd part score make this score count 2(255*255)   i.e. 10+(2*255)
	player_data(count+6)=count+10			;(-4)

player_data(count+7)=13			        	;alive signified by 13

Next



max_bank=512
global_client_count=0
Dim file_name$(255); 255 possible clients - who'd need more?
Global file_count=0


Type session

	Field link
	Field tcp_sendbank
	Field tcp_recbank
	Field status
	Field player_number

End Type


Graphics 400,600,16,2            ; B3D

AppTitle "Serving worms with killer logic"

server=CreateTCPServer(7056)
;print "server is running.."

msmin=9999999 ; minimums millisecs :D

While Not KeyHit(1)   

	stream = AcceptTCPStream(server)
	If stream
		global_client_count=global_client_count+1
		;print "New stream detected. memory allocated."
		ses.session = New session
		seslink=stream
		ses	cp_sendbank = CreateBank(max_bank)	
		ses	cp_recbank = CreateBank(max_bank)
		sesstatus =10 ; Simulate login.
		;sesclient_count=global_client_count
		
		sesplayer_number=global_client_count  
		Print "global_client_count is:"+sesplayer_number
		
		fn_create_file(Int seslink)
	
	End If


	oldms=MilliSecs()
	;Validate streams.. 
	For ses.session = Each session
	
		If Eof(seslink) 
			;print "A session called "+seslink+" has stop working."
			;print "Frees memory banks for session "+seslink
			FreeBank ses	cp_sendbank 
			FreeBank ses	cp_recbank
			;print "deletes sessions "+seslink
			
			numberin=seslink
			fn_delete_file(Int seslink)
			
			Delete ses
			;global_client_count=global_client_count-1 ;removing This could have BIG ramifications:-
			
			;instead of doing the aboveset the dead byte in the client:-
			
			
		End If
		
	Next
	
	For ses.session = Each session; this is looking at the first few bytes sent in from each session/client
	
	
		Select sesstatus
		Case 10
		
			If ReadAvail(seslink)>=max_bank
			
				;so we got a new packet :D and its all 100% secure... so we can go on live our lifes
				r=ReadBytes (ses	cp_recbank,seslink,0,max_bank)
				;print "for session "+seslink+" who has a tcp recbank of:"+ses	cp_recbank
				;print "read "+r+" bytes from stream"
				
				;my attempt at accessing sent count
				rx_count=PeekByte(ses	cp_recbank,0)

				If PeekByte(ses	cp_recbank,3)>0
					client_has_player_num=PeekByte(ses	cp_recbank,3)
					
					
					;print"***********************************************************"
					Print"   Found player number in data:  "+client_has_player_num+"......Press any key"
					
					;so try setting the player_number for sending back to 41
					sesplayer_number=client_has_player_num  ;IS NOW WORKING
					

				Else
					
					Print "Setting playernum to :"+global_client_count+" Press any key"
					;WaitKey
					client_has_player_num = global_client_count
					playerNumLoc=(20*sesplayer_number)-7				;
					player_data(playerNumLoc)=client_has_player_num

					
				EndIf
				
				
				
				
				; end add player_number to a player if he already does not have one
				;############################################################################

				
				;##########################################
				; player alive or dead status
				
				If PeekByte(ses	cp_recbank,7)=12
					alive_data=PeekByte(ses	cp_recbank,2)
					
					
					;print"***********************************************************"
					Print"   Found alive data (set to 12):  "+alive_data
					;print"***********************************************************"
					;----------------------------------------------------------------------
					;okay moving the logic to move the worm here coz its alive:-
					
					
						;############################################################################
				; now access the data wrt the player/client 
					
									;###################################
				;player score discovery
					
					If PeekByte(ses	cp_recbank,5)>0
						client_has_score=PeekByte(ses	cp_recbank,5)
						client_big_score=PeekByte(ses	cp_recbank,6)
						
					;print"***********************************************************"
						Print client_has_player_num+"   Found player number score in data:  "+client_has_score
						Print client_has_player_num+"   Found player multiplier score in data:  "+client_big_score
						
					;print"***********************************************************"
						
					Else
						client_has_score = 69
						playerNumLoc=(20*sesplayer_number)-6
						player_data(playerNumLoc)=client_has_score
						
					;print"***********************************************************"
						Print"   Assigned a player score to a new client"
					;print"***********************************************************"
						
					;2nd bit of score
						playerNumLoc=(20*sesplayer_number)-5
						player_data(playerNumLoc)=client_has_score
						
						
					EndIf
					
			
					
					If PeekByte(ses	cp_recbank,1)>0 
						xmove=PeekByte(ses	cp_recbank,1)
						
					;print"XMOVE detected as :"+xmove
						
						If xmove=1;add one
							xloc=(20*sesplayer_number)-9
							If player_data(xloc)<=250 
								player_data(xloc)=player_data(xloc)+1
						;print"adding ++++++++++++++++++++++++X"
						;print"adding ++++++++++++++++++++++++X"
								
							EndIf
						EndIf
						If xmove=2
						;subtract one  
							xloc=(20*sesplayer_number)-9
							If player_data(xloc)>=1 

								player_data(xloc)=player_data(xloc)-1

							EndIf
						EndIf
						
						If xmove>2   
							xloc=(20*sesplayer_number)-9
		
							player_data(xloc)=xmove
						EndIf
			
					EndIf
					
					
					If PeekByte(ses	cp_recbank,2)>0
						ymove=PeekByte(ses	cp_recbank,2)
						
						
					;;print "Detected Move request for y of client:"+ses	cp_recbank
						yloc=(20*sesplayer_number)-8
						ymove=PeekByte(ses	cp_recbank,2)

						If ymove=1;add one
							yloc=(20*sesplayer_number)-8
							If player_data(yloc)<=250 
								player_data(yloc)=player_data(yloc)+1
							EndIf
						EndIf
						If ymove=2;subtract one  
							yloc=(20*sesplayer_number)-8
							If player_data(yloc)>=1 
								player_data(yloc)=player_data(yloc)-1
							EndIf
						EndIf
						
						
						If ymove>2;refresh from client
							
							yloc=(20*sesplayer_number)-8
				   		;If player_data(yloc)>=1 
							player_data(yloc)=ymove
						;EndIf
						EndIf
	
					EndIf

					;---------------------------------------------------------------------
				Else

					client_has_player_num = global_client_count
					playerNumLoc=(20*sesplayer_number)-3   ;might be right?
					player_data(playerNumLoc)=client_has_player_num
					
				EndIf
				
				If PeekByte(ses	cp_recbank,7)=13
					
					Cls
					
					;Text 20,100,
					Print "Wall hit for player:"+player_data(playerNumLoc)
					
					;Text 20,120,
					Print "last xmove was:"+xmove+"last ymove was:"+ymove
					
				EndIf

			
				sesstatus=12 ; well time to reply this packet next round :D
			
			EndIf
		
		Case 12 ; Well time to reply a packet.
		
			;First we fill it upp with 0
			For i=0 To (max_bank-1)
				;PokeByte ses	cp_sendbank,i,Rnd(255)
				PokeByte ses	cp_sendbank,i,0
			Next
			
			

			rx_count=PeekByte(ses	cp_recbank,0)
			
			;client_count=PeekByte(ses	cp_recbank,0)
			PokeByte ses	cp_sendbank,0,global_client_count   
			PokeByte ses	cp_sendbank,1,rx_count
	
			For count = 10 To 490
				PokeByte ses	cp_sendbank,count,player_data(count); copying in data
			Next
			
			
			; SETTING THE PLAYER NUMBER TO WHAT THE CLIENT RECKONS
			Print"==================================="
			Print "Client Number set to: "+sesplayer_number
			PokeByte ses	cp_sendbank,3,sesplayer_number 


			;Secondly we reply it kindly.
			s=WriteBytes (ses	cp_sendbank,seslink,0,max_bank)
			;;print "Succesfull sending "+s+" bytes of data"
			 packetssent= packetssent+1
	
			sesstatus=10 ; Well we cant wait for next coll packet to arive :D"
			
		End Select
	
	
	Next	
	
	ms=MilliSecs()-oldms
	If ms>msmax Then msmax=ms
	If ms<msmin Then msmin=ms
	count=count+1
	cmsmed=cmsmed+ms
	msmed=cmsmed/count   ; medium millisecs
	
	
	tick=tick+1
	If tick>=500 Then Print "Ticks: "+count+" MS="+ms+" MIN="+msmin+" MED="+msmed+" MAX="+msmax+ "Packets sent "+ packetssent : tick=0

	
		If KeyHit(19) Then MSMIN=99999 : msmed=0 : count=0 : msmax=0 : packetssent=0 :cmsmed=0: ;print "Counter resets."

		Delay 8 ; this gives cpu time to rest of OS in windows. as server is not so cpu intensive.

Wend
;---------------------------------------------------------------------
;  functions
;---------------------------------------------------------------------



Function fn_delete_file(numberin)
	;print "Deleting File: "+numberin
	;del_file_name$="file_dir/"+numberin+".ini"
	del_file_name$="./"+numberin+".ini"

	DeleteFile (del_file_name$)
	;print "File Deleted"	
End Function


Function fn_create_file(numberin)

	BestName$="Mark"

	file_name$(file_count)="./"+numberin+".ini"

	;print file_name$(file_count)
	writethis$=file_name$(file_count)
	file_count=file_count+1
	
	; Open a file to write to 
	fileout = WriteFile(writethis$)

	
	WriteString( fileout, "new string:1" ) 

	; Close the file 
	CloseFile( fileout ) 
	
End Function


;END WORMSERVER.bb
;=================================================================

[/codebox]


Comments : none...

3DzForMe

The Wormserver code had some errant spaces in it.... the following is the server code corrected - at least it compiles now!

Code: BASIC




;EDITED 1 June 2019 - there was some blank spaces inserted into

; the server code previouisly posted which was preventing the server from compiling - FIXED.


;WORMSERVER.bb - create an executable called WORMSERVER.exe
; in the same directory as the WORMCLIENT.exe

;removed need for a separate folder to hide files in

;VARS------------------------------------------------------------

Dim player_data(512)  ;512 bytes to copy into each clients

;Populate dummy player data
For count = 10 To 490 Step 20
        player_data(count+1)=player_number      ;x    (-9)     
        player_data(count+2)=count                              ;y    (-8)
        player_data(count+3)=count                              ;THIS IS JUST A COUNT OF CLIENTS THAT ARE RUNNING   
        player_data(count+4)=0                                  ;(-7) 0 bullet dead, 1 alive  - now player num
                                                                                        ;(-6)player score - not doing bullets for a while anyway.make this score count 1(1-255)
        player_data(count+5)=count+10                   ;(-5)2nd part score make this score count 2(255*255)   i.e. 10+(2*255)
        player_data(count+6)=count+10                   ;(-4)

player_data(count+7)=13                                 ;alive signified by 13

Next



max_bank=512
global_client_count=0
Dim file_name$(255); 255 possible clients - who'd need more?
Global file_count=0


Type session

        Field link
        Field tcp_sendbank
        Field tcp_recbank
        Field status
        Field player_number

End Type


Graphics 400,600,16,2            ; B3D

AppTitle "Serving worms with killer logic"

server=CreateTCPServer(7056)
;print "server is running.."

msmin=9999999 ; minimums millisecs :D

While Not KeyHit(1) 

        stream = AcceptTCPStream(server)
        If stream
                global_client_count=global_client_count+1
                ;print "New stream detected. memory allocated."
                ses.session = New session
                seslink=stream
               sestcp_sendbank = CreateBank(max_bank)     
               sestcp_recbank = CreateBank(max_bank)
                sesstatus =10 ; Simulate login.
                ;sesclient_count=global_client_count
               
                sesplayer_number=global_client_count 
                Print "global_client_count is:"+sesplayer_number
               
                fn_create_file(Int seslink)

;DEBUG 1 June 2019:---


;Else

; Print "Failed to create stream...."

; WaitKey
 
        End If


        oldms=MilliSecs()
        ;Validate streams..
        For ses.session = Each session
       
                If Eof(seslink)
                        ;print "A session called "+seslink+" has stop working."
                        ;print "Frees memory banks for session "+seslink
                        FreeBank sestcp_sendbank
                        FreeBank sestcp_recbank
                        ;print "deletes sessions "+seslink
                       
                        numberin=seslink
                        fn_delete_file(Int seslink)
                       
                        Delete ses
                        ;global_client_count=global_client_count-1 ;removing This could have BIG ramifications:-
                       
                        ;instead of doing the aboveset the dead byte in the client:-
                       
                       
                End If
               
        Next
       
        For ses.session = Each session; this is looking at the first few bytes sent in from each session/client
       
       
                Select sesstatus
                Case 10
               
                        If ReadAvail(seslink)>=max_bank
                       
                                ;so we got a new packet :D and its all 100% secure... so we can go on live our lifes
                                r=ReadBytes (sestcp_recbank,seslink,0,max_bank)
                                ;print "for session "+seslink+" who has a tcp recbank of:"+ses  cp_recbank
                                ;print "read "+r+" bytes from stream"
                               
                                ;my attempt at accessing sent count
                                rx_count=PeekByte(sestcp_recbank,0)

                                If PeekByte(sestcp_recbank,3)>0
                                        client_has_player_num=PeekByte(sestcp_recbank,3)
                                       
                                       
                                        ;print"***********************************************************"
                                        Print"   Found player number in data:  "+client_has_player_num+"......Press any key"
                                       
                                        ;so try setting the player_number for sending back to 41
                                        sesplayer_number=client_has_player_num  ;IS NOW WORKING
                                       

                                Else
                                       
                                        Print "Setting playernum to :"+global_client_count+" Press any key"
                                        ;WaitKey
                                        client_has_player_num = global_client_count
                                        playerNumLoc=(20*sesplayer_number)-7                            ;
                                        player_data(playerNumLoc)=client_has_player_num

                                       
                                EndIf
                               
                               
                               
                               
                                ; end add player_number to a player if he already does not have one
                                ;############################################################################

                               
                                ;##########################################
                                ; player alive or dead status
                               
                                If PeekByte(sestcp_recbank,7)=12
                                        alive_data=PeekByte(sestcp_recbank,2)
                                       
                                       
                                        ;print"***********************************************************"
                                        Print"   Found alive data (set to 12):  "+alive_data
                                        ;print"***********************************************************"
                                        ;----------------------------------------------------------------------
                                        ;okay moving the logic to move the worm here coz its alive:-
                                       
                                       
                                                ;############################################################################
                                ; now access the data wrt the player/client
                                       
                                                                        ;###################################
                                ;player score discovery
                                       
                                        If PeekByte(sestcp_recbank,5)>0
                                                client_has_score=PeekByte(sestcp_recbank,5)
                                                client_big_score=PeekByte(sestcp_recbank,6)
                                               
                                        ;print"***********************************************************"
                                                Print client_has_player_num+"   Found player number score in data:  "+client_has_score
                                                Print client_has_player_num+"   Found player multiplier score in data:  "+client_big_score
                                               
                                        ;print"***********************************************************"
                                               
                                        Else
                                                client_has_score = 69
                                                playerNumLoc=(20*sesplayer_number)-6
                                                player_data(playerNumLoc)=client_has_score
                                               
                                        ;print"***********************************************************"
                                                Print"   Assigned a player score to a new client"
                                        ;print"***********************************************************"
                                               
                                        ;2nd bit of score
                                                playerNumLoc=(20*sesplayer_number)-5
                                                player_data(playerNumLoc)=client_has_score
                                               
                                               
                                        EndIf
                                       
                       
                                       
                                        If PeekByte(sestcp_recbank,1)>0
                                                xmove=PeekByte(sestcp_recbank,1)
                                               
                                        ;print"XMOVE detected as :"+xmove
                                               
                                                If xmove=1;add one
                                                        xloc=(20*sesplayer_number)-9
                                                        If player_data(xloc)<=250
                                                                player_data(xloc)=player_data(xloc)+1
                                                ;print"adding ++++++++++++++++++++++++X"
                                                ;print"adding ++++++++++++++++++++++++X"
                                                               
                                                        EndIf
                                                EndIf
                                                If xmove=2
                                                ;subtract one 
                                                        xloc=(20*sesplayer_number)-9
                                                        If player_data(xloc)>=1

                                                                player_data(xloc)=player_data(xloc)-1

                                                        EndIf
                                                EndIf
                                               
                                                If xmove>2 
                                                        xloc=(20*sesplayer_number)-9
               
                                                        player_data(xloc)=xmove
                                                EndIf
                       
                                        EndIf
                                       
                                       
                                        If PeekByte(sestcp_recbank,2)>0
                                                ymove=PeekByte(sestcp_recbank,2)
                                               
                                               
                                        ;;print "Detected Move request for y of client:"+ses    cp_recbank
                                                yloc=(20*sesplayer_number)-8
                                                ymove=PeekByte(sestcp_recbank,2)

                                                If ymove=1;add one
                                                        yloc=(20*sesplayer_number)-8
                                                        If player_data(yloc)<=250
                                                                player_data(yloc)=player_data(yloc)+1
                                                        EndIf
                                                EndIf
                                                If ymove=2;subtract one 
                                                        yloc=(20*sesplayer_number)-8
                                                        If player_data(yloc)>=1
                                                                player_data(yloc)=player_data(yloc)-1
                                                        EndIf
                                                EndIf
                                               
                                               
                                                If ymove>2;refresh from client
                                                       
                                                        yloc=(20*sesplayer_number)-8
                                                ;If player_data(yloc)>=1
                                                        player_data(yloc)=ymove
                                                ;EndIf
                                                EndIf
       
                                        EndIf

                                        ;---------------------------------------------------------------------
                                Else

                                        client_has_player_num = global_client_count
                                        playerNumLoc=(20*sesplayer_number)-3   ;might be right?
                                        player_data(playerNumLoc)=client_has_player_num
                                       
                                EndIf
                               
                                If PeekByte(sestcp_recbank,7)=13
                                       
                                        Cls
                                       
                                        ;Text 20,100,
                                        Print "Wall hit for player:"+player_data(playerNumLoc)
                                       
                                        ;Text 20,120,
                                        Print "last xmove was:"+xmove+"last ymove was:"+ymove
                                       
                                EndIf

                       
                                sesstatus=12 ; well time to reply this packet next round :D
                       
                        EndIf
               
                Case 12 ; Well time to reply a packet.
               
                        ;First we fill it upp with 0
                        For i=0 To (max_bank-1)
                                ;PokeByte ses   cp_sendbank,i,Rnd(255)
                                PokeByte sestcp_sendbank,i,0
                        Next
                       
                       

                        rx_count=PeekByte(sestcp_recbank,0)
                       
                        ;client_count=PeekByte(ses      cp_recbank,0)
                        PokeByte sestcp_sendbank,0,global_client_count 
                        PokeByte sestcp_sendbank,1,rx_count
       
                        For count = 10 To 490
                                PokeByte sestcp_sendbank,count,player_data(count); copying in data
                        Next
                       
                       
                        ; SETTING THE PLAYER NUMBER TO WHAT THE CLIENT RECKONS
                        Print"==================================="
                        Print "Client Number set to: "+sesplayer_number
                        PokeByte sestcp_sendbank,3,sesplayer_number


                        ;Secondly we reply it kindly.
                        s=WriteBytes (sestcp_sendbank,seslink,0,max_bank)
                        ;;print "Succesfull sending "+s+" bytes of data"
                         packetssent= packetssent+1
       
                        sesstatus=10 ; Well we cant wait for next coll packet to arive :D"
                       
                End Select
       
       
        Next   
       
        ms=MilliSecs()-oldms
        If ms>msmax Then msmax=ms
        If ms<msmin Then msmin=ms
        count=count+1
        cmsmed=cmsmed+ms
        msmed=cmsmed/count   ; medium millisecs
       
       
        tick=tick+1
        If tick>=500 Then Print "Ticks: "+count+" MS="+ms+" MIN="+msmin+" MED="+msmed+" MAX="+msmax+ "Packets sent "+ packetssent : tick=0

       
                If KeyHit(19) Then MSMIN=99999 : msmed=0 : count=0 : msmax=0 : packetssent=0 :cmsmed=0: ;print "Counter resets."

                Delay 8 ; this gives cpu time to rest of OS in windows. as server is not so cpu intensive.

Wend
;---------------------------------------------------------------------
;  functions
;---------------------------------------------------------------------



Function fn_delete_file(numberin)
        ;print "Deleting File: "+numberin
        ;del_file_name$="file_dir/"+numberin+".ini"
        del_file_name$="./"+numberin+".ini"

        DeleteFile (del_file_name$)
        ;print "File Deleted" 
End Function


Function fn_create_file(numberin)

        BestName$="Mark"

        file_name$(file_count)="./"+numberin+".ini"

        ;print file_name$(file_count)
        writethis$=file_name$(file_count)
        file_count=file_count+1
       
        ; Open a file to write to
        fileout = WriteFile(writethis$)

       
        WriteString( fileout, "new string:1" )

        ; Close the file
        CloseFile( fileout )
       
End Function


;END WORMSERVER.bb
;=================================================================






And here is the client code provided in a separate copy and paste tastic box:

Code: BASIC

; WORMCLIENT.bb - you can run up to 10 clients - dependant
; on CPU grunt.......Although even on my laptop I could not
; get my CPU above 57 percent
; a little SNAKES client by Blitzplotter, note you will need
; to compile the associated code WORMSERVER, make
; the executable WORMSERVER & the client will automatically
; try and start a server if one is not running. If you close the
; client(s) before closing the WORMSERVER, the WORMSERVER will
; mop up the 123456789 files that appear whilst the clients &
; server are running.


Global print_once=0

Global title_once=0

max_bank = 512
sent_count=0

Dim srv_player_data(512);  place to store what the server reckons state of play is

test_x_move=5;   amount of packets to have sent before start adjusting x co-ord of this player
test_y_move=5;    amount of packets to have sent before start adjusting y co-ord of this player
x_move=0
y_move=0

Global box_size=500

Global player_score=0
Global player_mult_score=0

Global worm_walled=0
Global worm_hit_player=0

Global x_check_move=0
Global y_check_move=0

maxplayers=35
params=3        ; 0=playernum
XX#=1                   ; 1=x
YY#=2                   ; 2=y;
ALIVE#=3                ; 3=alive set to (1) or (0) for dead

Dim collArray(35,5)

Global this_player=99

Global this_player_num = 0
Global change_player_num_once=0


Dim proxArray(5)    ; 5 levels of proximity

       

;basically got eight directions to move the worm in. 2 ways to do this, send


Dim move_logic_x(8)
Dim move_logic_y(8)

Global move_count=1  ;note this goes up to 8 & cycles back to 1

move_logic_x(0)=0 : move_logic_y(0)=0  ;dead, therefore do not move

move_logic_x(1)=1 : move_logic_y(1)=0  ;right    NOTE 1=+1; 2=-1 on server
move_logic_x(2)=1 : move_logic_y(2)=1  ;up right
move_logic_x(3)=0 : move_logic_y(3)=1  ;up
move_logic_x(4)=2 : move_logic_y(4)=1  ;up Left
move_logic_x(5)=2 : move_logic_y(5)=0  ;left
move_logic_x(6)=2 : move_logic_y(6)=2  ;down left
move_logic_x(7)=0 : move_logic_y(7)=2  ;down
move_logic_x(8)=1 : move_logic_y(8)=2  ;down right


tcp_sendbank=CreateBank(max_bank)
tcp_recbank=CreateBank(max_bank)


;use this string to run numerous clients on ONE laptop
Global USE_LOOPBACK$="127.0.0.1"

;If you want to access a server on your network, open a
;command prompt and enter ipconfig on the PC/laptop you
;intend to run the server on:-

Global USE_NETWORK$="192.168.1.4" ; modify this IP for a remote
                                  ; computer on your LAN you wish
                                                                  ; to attach to the Server

link_string$=USE_LOOPBACK$     ;will detect the WORMSERVER if running on the client computer
;link_string$=USE_NETWORK$


;Graphics3D 700,500,16,2            ; B3D
Graphics 800,600,16,2               ;




;populate the collision Array params:
For count=1 To 30
        collArray(count,XX)=5
        collArray(count,YY)=5
        collArray(count,ALIVE)=1
Next

;link=OpenTCPStream("127.0.0.1",7056)                   ;NOTE:  might need to replace with your IP info
;link=OpenTCPStream("192.168.0.2",7056)         ;

link=OpenTCPStream(link_string,7056)

If Not link
        Print "failed to create link - No server detected - looking.....4" : ExecFile("WORMSERVER.exe"): Delay 1500
       
        link=OpenTCPStream(link_string,7056)
       
        If Not link
               
                wait$=Input ("Waited 15 seconds to detect Server - want to wait longer? (Y or N):")
                If wait$="y" Or wait$="Y"
                        Print "okay, hanging on for a 30 second now.... last chance": Delay 30000
                        link=OpenTCPStream(link_string,7056)
                       
                        If Not link
                                Print "Ending...": Delay 1500:
                                End
                        Else
                                Print "                                         Server located, finally."
                                ;perimeter
                               
                               
                               
                                Line box_size,0,box_size,box_size
                                Line 0,box_size,box_size,box_size
                        EndIf
                Else
                        Print "Terminating Client.": Delay 1500: End
                               
                       
                End If
        Else
                Print"                                         Server started by moi.": Delay 1500: Cls
        EndIf
       
Else
        Text 520,12,("Server detected")
EndIf

Text 12,580,(" Connected.. This player is Alive in the world....")

status=12; we emulate a logged in client

Text 520,30,("left & right cursors to turn")

; Draw perimeter

Line box_size,0,box_size,box_size
Line 0,box_size,box_size,box_size

While Not KeyHit(1)

        ;If Eof(link) Then Print "Server has gone, 5 secs until this is gone too.... " : Delay 5000 : End
        If Eof(link)
                Print "Server has gone, you had a score of:"+((player_mult_score*255)+player_score)
               
                wait$=Input ("Want to see if Server will restart? (Y or N):")
                If wait$="y" Or wait$="Y"
                        Print "okay, hanging on for a 8 second wait before re-try.... last chance": Delay 8000
                        link=OpenTCPStream(link_string,7056)
                       
                        If Not link
                                Print "Ending...": Delay 1500:
                                End
                        Else
                                Print "Server located."
                                status=14; attempt at pushing x & y to server
                        EndIf
                        Delay 5000
                        Cls
                       
                        ;perimeter
                        Line 512,0,512,512
                        Line 0,512,512,512
                       
                Else
                        Print "Terminating Client. This was player"+this_player_num: Delay 1500: End
                       
                       
                End If
               
        EndIf
               
               
       

        Select status
       
                Case 10
                       
                        If player_score>=255
                                player_score=1
                                player_mult_score=player_mult_score+1
                        EndIf
                       
       
                If ReadAvail(link)>=max_bank
               
                        ;time to read some ;)
                        r=ReadBytes(tcp_recbank,link,0,max_bank)
                        If pon=1
                        Print "have readin "+r+" bytes from server."
                        Print "-----------------------------------------------------"
                EndIf
               
                        ;my attempt at accessing sent count
                        xth=PeekByte(tcp_recbank,0)        ;the amount of clients server has detected all
                                                           ;together: Note if a client is registered
                                                           ;by the server - the logic will dictate that
                                                           ;once that client dies it stays dead until
                                                                                           ; a new 'game' is ininitiated & the server
                                                                                           ;opens up all players for joining again. The
                                                                                                ;problem is that the server decrements the
                                                                                                ; client count at the moment when a player
                                                                                                ; stroke client is detected as 'left'.
                                serv_count=PeekByte(tcp_recbank,1)
                               
                               
                    ;attempt at copying in data received from server now
                    For copy_ct=1 To 511
                    srv_player_data(copy_ct)=PeekByte(tcp_recbank,copy_ct)
                    Next
                       
                        ;current players
                        mem_loc=((20*1)-10)
                       
                        For loop = 1 To xth  ;cycling through the number of clients server states
                                                                ;is connected: 
                               
                                ;Note - the xth is simply a loop index of how many clients are currently attached
                    ;work out where in 512 bytes this players x and y co-ords are:             
                            mem_loc=((20*loop)-10)
                                If pon=1
                                       
                            Print"mem_loc is:"+mem_loc
                           
                                Print "player: "+loop+" x co-ord:"+srv_player_data(mem_loc+1)
                                Print "player: "+loop+" y co-ord:"+srv_player_data(mem_loc+2)
                               
                        EndIf
                       
                        If skiponce<3              ;needs to pass 3 times before it settles down
                                skiponce=skiponce+1
                        Else
                                Text 20,550,"This is Player :"+this_player_num
                        EndIf
                       
                       
                        Flip
                       
                        Select loop
                                       
                                Case 1
                                        Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
                                       
                                       
                                        ;Text 610,(112)+loop*11,"player:"+loop+" score:"+player_score
                                       
                                        ;Text 610,(132)+loop*11,"player:"+loop+" score:"+test_score
                                       
                                       
                                        collArray(1,XX)=srv_player_data(mem_loc+1)*2
                                        collArray(1,YY)=srv_player_data(mem_loc+2)*2
                Case 2
                        Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
                        ;is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
                       
                        collArray(2,XX)=srv_player_data(mem_loc+1)*2
                        collArray(2,YY)=srv_player_data(mem_loc+2)*2
                       
                       
                       
                Case 3
                        Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
                        ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
                       
                        collArray(3,XX)=srv_player_data(mem_loc+1)*2
                        collArray(3,YY)=srv_player_data(mem_loc+2)*2
                       
                Case 4
                        Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
                        ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
                       
                       
                        collArray(4,XX)=srv_player_data(mem_loc+1)*2
                        collArray(4,YY)=srv_player_data(mem_loc+2)*2
                       
                Case 5
                        Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
                        ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
                       
                        collArray(5,XX)=srv_player_data(mem_loc+1)*2
                        collArray(5,YY)=srv_player_data(mem_loc+2)*2
                       
                Case 6
                        Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
                        ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
                       
                       
                        collArray(6,XX)=srv_player_data(mem_loc+1)*2
                        collArray(6,YY)=srv_player_data(mem_loc+2)*2
                       
                Case 7
                        Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
                        ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
                       
                       
                        collArray(7,XX)=srv_player_data(mem_loc+1)*2
                        collArray(7,YY)=srv_player_data(mem_loc+2)*2
                       
                Case 8
                        Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
                        ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
                       
                       
                        collArray(8,XX)=srv_player_data(mem_loc+1)*2
                        collArray(8,YY)=srv_player_data(mem_loc+2)*2
                       
                Case 9
                        Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
                        ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
                       
                       
                        collArray(9,XX)=srv_player_data(mem_loc+1)*2
                        collArray(9,YY)=srv_player_data(mem_loc+2)*2
                       
                Case 10
                        Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
                        ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
                       
                       
                        collArray(10,XX)=srv_player_data(mem_loc+1)*2
                        collArray(10,YY)=srv_player_data(mem_loc+2)*2
                       
                       
        End Select
       
Next   
                       
                        If change_player_num_once=0
                                change_player_num_once=1
                                this_player_num=xth
                               
                                ;this should ensure that this player num is only set once
                               
                        EndIf
                       
                       
                        status=12 ; Yeppp time to respond...
                End If
                       
       
        Case 12
       
                ;THIS IS THE SENDER
       
            ;          player count:  1 byte   
                ;          player: x, y co -ords, 2 bytes
                ;          shot anything:  yes/no 1 byte
                ;          projectile alive: 1 byte
                ;          projectile x,y: 2 bytes
                ;          player world count:  1 byte
                ;          leaving 2 bytes for whatever     
       
       
            ;byte 1: 1, add 1 to x,2 subtract 1 from x
            ;byte 2: 1, add 1 to y,2 subtract 1 from y
               
                ;byte seven: chaning to 12 from the 13 the server sets it to
       
                ;haha client time to spam server first we make a cool tcp packet with random nunbers.
                For i=0 To (max_bank-1)
                        PokeByte tcp_sendbank,i,0
                        If sentcount<255
                        PokeByte tcp_sendbank,0,sent_count
                        Else sentcount=255
                        EndIf
                Next
               
                PokeByte tcp_sendbank,3,this_player_num; poke the player_num byte the changed once number
               
               
        ;encapsulate the move stuff within if alive logic
               
                If worm_walled=0
               
               
                If x_move>test_x_move Then
                    ;Print"set x________ to move"
                        PokeByte tcp_sendbank,1,move_logic_x(move_count);1 here means server needs To move x For this
                                                        ;player/client by +1
                       
                        ;x_check_move=2*(move_logic_x(move_count)) this is only 1 to 8 doh!
                       
                ;Note the client is Not self aware therefore how to instigate direction changes
                ;as a result of input.....
                       
                        ;easy - need to detect left cursor & right cursor first - this will be the
                        ;controlling influence for the worm.....

                End If
                If y_move>test_y_move Then
                    ;Print"set y________ to move"
                        PokeByte tcp_sendbank,2,move_logic_y(move_count)       ;1 here means server needs to move y for this
                                                        ;player/client by +1
                       
                        ;y_check_move=2*(move_logic_y(move_count))
                       
                End If
               
        Else
               
                PokeByte tcp_sendbank,1,move_logic_x(0);1 here means server needs To move x For this by nothing
                PokeByte tcp_sendbank,2,move_logic_y(0);1 here means server needs to move y for this by nothing
               
               
        EndIf; endif for worm_walled code - basically this worm WILL MOVE NO MORE!!!!!!
       
        this_dead_mem_loc=((20*(loop-1)-10))
       
       
       
       
       
       
       
        If collArray(this_player_num,XX)>498 Or collArray(this_player_num,YY)>498 Then
                               
                        worm_walled=1
                       
                        PokeByte tcp_sendbank,(this_player_num*20)-13,12    ;13 here means this client is unlucky and dead!!!!
                        ; NOTE: if going to
                       
                        ;Text 250,250,"WORM SPLATTERED INTO A WALL..xmove: "+x_move+" &y:"+y_move
                       
                        this_dead_mem_loc=((20*(loop-1)-10))
                       
                        Text 40,420,"player: "+this_player_num+" dead at x co-ord:"+collArray(this_player_num,XX)
                        Text 40,440,"player: "+this_player_num+" dead at y co-ord:"+collArray(this_player_num,YY)
                        Text 40,460,"player: "+this_player_num+" Score:"++((player_mult_score*255)+player_score)
                       
                        PokeByte tcp_sendbank,1,move_logic_x(0);1 here means server needs To move x For this by nothing
                        PokeByte tcp_sendbank,2,move_logic_y(0);1 here means server needs to move y for this by nothing
                       
                EndIf
               
                If worm_walled=0
                       
                        PokeByte tcp_sendbank,7,12       ;12 here means this client is alive
                       
                                                                                        ;this'll hopefully be changing the server from
                                                                                        ;13 to 12........................
                                                        ;player/client by +1
                       
                        Text 500,380,("player not hit wall")
                       
                       
                        ;player alive so increment score
                        player_score=player_score+1 
                       
                Else
                ;need to send the number here to server to inform player walled (& hit other player)
                        Text 500,400,("player hit wall")
                       
                        PokeByte tcp_sendbank,7,13
                       
                EndIf
               
               
                PokeByte tcp_sendbank,5,player_score 
                PokeByte tcp_sendbank,6,player_mult_score
               
                s=WriteBytes (tcp_sendbank,link,0,max_bank)
                ;Print "Sending "+s+" bytes to server."+sent_count+" times"
                sent_count=sent_count+1
               
                status=10  ; Well we go out and wait for packet       
               
        Case 14
               
                ;Client to contact server first we make a cool tcp packet
                For i=0 To (max_bank-1)
                        PokeByte tcp_sendbank,i,0
                        If sentcount<255
                                PokeByte tcp_sendbank,0,sent_count
                                Else sentcount=255
                        EndIf
                Next
               
                If x_move>test_x_move Then
                        PokeByte tcp_sendbank,1,srv_player_data(mem_loc+1)              ;1 here means server needs to move x for this
                                                        ;player/client by +1
                       
                End If
                If y_move>test_y_move Then
                        PokeByte tcp_sendbank,2,srv_player_data(mem_loc+2)      ;1 here means server needs to move y for this
                                                        ;player/client by +1
                       
                End If
               
                PokeByte tcp_sendbank,1,srv_player_data(mem_loc+1)
                PokeByte tcp_sendbank,2,srv_player_data(mem_loc+2)
               
               
                s=WriteBytes (tcp_sendbank,link,0,max_bank)
                sent_count=sent_count+1
               
                status=10
               
        Case 16 
               
                If ReadAvail(link)>=max_bank
                       
                        ;time to read some ;)
                        r=ReadBytes(tcp_recbank,link,0,max_bank)
                        If pon=1
                               
                        Print "have readin "+r+" bytes from server."
                        Print "-----------------------------------------------------"
                EndIf
               
                        ;accessing sent count
                        xth=PeekByte(tcp_recbank,0)
                        serv_count=PeekByte(tcp_recbank,1)
                       
                    ;copying in data received from server now
                    For copy_ct=1 To 511
                                srv_player_data(copy_ct)=PeekByte(tcp_recbank,copy_ct)
                    Next
                       
                        ;current players
                        mem_loc=((20*1)-10)
                        For loop = 1 To xth
                    ;work out where in 512 bytes this players x and y co-ords are:             
                            mem_loc=((20*loop)-10)
                                If pon=1
                                       
                            Print"mem_loc is:"+mem_loc
                           
                                Print "player: "+loop+" x co-ord:"+srv_player_data(mem_loc+1)
                                Print "player: "+loop+" y co-ord:"+srv_player_data(mem_loc+2)
                        EndIf
                       
                               
                        Next   
                       
                        status=12 ; Yeppp time to respond...
                End If
               
               
               
       
End Select

       
        play_ct=0

    ;update x and y co-ords for this client to send to server:-
       
        x_move = x_move+1
        y_move = y_move+1

        ;Delay 10 ; yep we have to delay some here to emulate many clients.. or cpu dies.
       
        Delay 50
       
        VWait 1; let the CPU rest
       
       
        If KeyDown(203)
                ;Text 400,400,("left detected")
                If move_count>1
                        move_count=move_count-1
                Else
                        move_count=8
                EndIf
        ;Else
                ;Text 400,400,("             nowt detected")
        EndIf

        If KeyDown(205)
                ;Text 400,400,("right detected")
                If move_count<8
                        move_count=move_count+1
                Else
                        move_count=1
                EndIf
        EndIf

        If title_once<=6
               
                AppTitle "Worm Client Number "+this_player_num
                title_once=title_once+1
               
                Text 20,500,"vvvvvv Proximity meter: 10 to 50 units respectively vvvvvv"
               
        EndIf
       
        ;call the proximity detector function
        If xth>1
                proximity(this_player_num,xth)
        EndIf
       
       
       
Wend


Function proximity(thisplayer,maxplayers)
       
       
        For checkOthers=1 To maxplayers
               
                Local XX=1
                Local YY=2
               
                If checkOthers=thisplayer
                        ;do nothing
                Else
                        If collArray(checkOthers,XX)>collArray(thisplayer,XX)
                                xdiff=collArray(checkOthers,XX)-collArray(thisplayer,XX)
                        Else
                                xdiff=collArray(thisplayer,XX)-collArray(checkOthers,XX)
                        EndIf
                       
                        If collArray(checkOthers,YY)>collArray(thisplayer,YY)
                                ydiff=collArray(checkOthers,YY)-collArray(thisplayer,YY)
                        Else
                                ydiff=collArray(thisplayer,YY)-collArray(checkOthers,YY)
                        EndIf
                       
                       
                        For closeness=50 To 10 Step -10
                               
                                If xdiff<closeness
                                        If xdiff>(closeness-10)
                                                proxArray(closeness/10)=proxArray(closeness/10)+1
                                        EndIf
                                EndIf
                               
                        Next
                       
                EndIf
               
        Next
       
        ;draw the five proximity lines:
        For drawProx=1 To 5
                Line 1,510+(drawProx*6),(proxArray(drawProx)),510+(drawProx*6)
        Next
       
End Function

;END CLIENT CODE
;=========================================================================



8) 8) :P :P
BLitz3D, IDEal, AGK Studio, BMax, Java Code, Cerberus
Recent Hardware: Lenovo Re-furb'd Laptop
Oldest Hardware: Commodore Amiga 1200 with 1084S Monitor & Blitz Basic 2.1