[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) Select
[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!





;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:


; 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