December 11, 2019, 08:33:17 PM

Author Topic: [bb] Snakes Client and Server by Blitzplotter [ 1+ years ago ]  (Read 1183 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
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
  1. [codebox]; WORMCLIENT.bb - you can run up to 10 clients - dependant
  2. ; on CPU grunt.......Although even on my laptop I could not
  3. ; get my CPU above 57 percent
  4. ; a little SNAKES client by Blitzplotter, note you will need
  5. ; to compile the associated code WORMSERVER, make
  6. ; the executable WORMSERVER & the client will automatically
  7. ; try and start a server if one is not running. If you close the
  8. ; client(s) before closing the WORMSERVER, the WORMSERVER will
  9. ; mop up the 123456789 files that appear whilst the clients &
  10. ; server are running.
  11.  
  12.  
  13. Global print_once=0
  14.  
  15. Global title_once=0
  16.  
  17. max_bank = 512
  18. sent_count=0
  19.  
  20. Dim srv_player_data(512);  place to store what the server reckons state of play is
  21.  
  22. test_x_move=5;   amount of packets to have sent before start adjusting x co-ord of this player
  23. test_y_move=5;    amount of packets to have sent before start adjusting y co-ord of this player
  24. x_move=0
  25. y_move=0
  26.  
  27. Global box_size=500
  28.  
  29. Global player_score=0
  30. Global player_mult_score=0
  31.  
  32. Global worm_walled=0
  33. Global worm_hit_player=0
  34.  
  35. Global x_check_move=0
  36. Global y_check_move=0
  37.  
  38. maxplayers=35
  39. params=3        ; 0=playernum
  40. XX#=1                   ; 1=x
  41. YY#=2                   ; 2=y;
  42. ALIVE#=3                ; 3=alive set to (1) or (0) for dead
  43.  
  44. Dim collArray(35,5)
  45.  
  46. Global this_player=99
  47.  
  48. Global this_player_num = 0
  49. Global change_player_num_once=0
  50.  
  51.  
  52. Dim proxArray(5)    ; 5 levels of proximity
  53.  
  54.        
  55.  
  56. ;basically got eight directions to move the worm in. 2 ways to do this, send
  57.  
  58.  
  59. Dim move_logic_x(8)
  60. Dim move_logic_y(8)
  61.  
  62. Global move_count=1  ;note this goes up to 8 & cycles back to 1
  63.  
  64. move_logic_x(0)=0 : move_logic_y(0)=0  ;dead, therefore do not move
  65.  
  66. move_logic_x(1)=1 : move_logic_y(1)=0  ;right    NOTE 1=+1; 2=-1 on server
  67. move_logic_x(2)=1 : move_logic_y(2)=1  ;up right
  68. move_logic_x(3)=0 : move_logic_y(3)=1  ;up
  69. move_logic_x(4)=2 : move_logic_y(4)=1  ;up Left
  70. move_logic_x(5)=2 : move_logic_y(5)=0  ;left
  71. move_logic_x(6)=2 : move_logic_y(6)=2  ;down left
  72. move_logic_x(7)=0 : move_logic_y(7)=2  ;down
  73. move_logic_x(8)=1 : move_logic_y(8)=2  ;down right
  74.  
  75.  
  76. tcp_sendbank=CreateBank(max_bank)
  77. tcp_recbank=CreateBank(max_bank)
  78.  
  79.  
  80. ;use this string to run numerous clients on ONE laptop
  81. Global USE_LOOPBACK$="127.0.0.1"
  82.  
  83. ;If you want to access a server on your network, open a
  84. ;command prompt and enter ipconfig on the PC/laptop you
  85. ;intend to run the server on:-
  86.  
  87. Global USE_NETWORK$="192.168.1.4" ; modify this IP for a remote
  88.                                   ; computer on your LAN you wish
  89.                                                                   ; to attach to the Server
  90.  
  91. link_string$=USE_LOOPBACK$     ;will detect the WORMSERVER if running on the client computer
  92. ;link_string$=USE_NETWORK$
  93.  
  94.  
  95. ;Graphics3D 700,500,16,2            ; B3D
  96. Graphics 800,600,16,2               ;
  97.  
  98.  
  99.  
  100.  
  101. ;populate the collision Array params:
  102. For count=1 To 30
  103.         collArray(count,XX)=5
  104.         collArray(count,YY)=5
  105.         collArray(count,ALIVE)=1
  106. Next
  107.  
  108. ;link=OpenTCPStream("127.0.0.1",7056)                   ;NOTE:  might need to replace with your IP info
  109. ;link=OpenTCPStream("192.168.0.2",7056)         ;
  110.  
  111. link=OpenTCPStream(link_string,7056)
  112.  
  113. If Not link
  114.         Print "failed to create link - No server detected - looking.....4" : ExecFile("WORMSERVER.exe"): Delay 1500
  115.        
  116.         link=OpenTCPStream(link_string,7056)
  117.        
  118.         If Not link
  119.                
  120.                 wait$=Input ("Waited 15 seconds to detect Server - want to wait longer? (Y or N):")
  121.                 If wait$="y" Or wait$="Y"
  122.                         Print "okay, hanging on for a 30 second now.... last chance": Delay 30000
  123.                         link=OpenTCPStream(link_string,7056)
  124.                        
  125.                         If Not link
  126.                                 Print "Ending...": Delay 1500:
  127.                                 End
  128.                         Else
  129.                                 Print "                                         Server located, finally."
  130.                                 ;perimeter
  131.                                
  132.                                
  133.                                
  134.                                 Line box_size,0,box_size,box_size
  135.                                 Line 0,box_size,box_size,box_size
  136.                         EndIf
  137.                 Else
  138.                         Print "Terminating Client.": Delay 1500: End
  139.                                
  140.                        
  141.                 End If
  142.         Else
  143.                 Print"                                         Server started by moi.": Delay 1500: Cls
  144.         EndIf
  145.        
  146. Else
  147.         Text 520,12,("Server detected")
  148. EndIf
  149.  
  150. Text 12,580,(" Connected.. This player is Alive in the world....")
  151.  
  152. status=12; we emulate a logged in client
  153.  
  154. Text 520,30,("left & right cursors to turn")
  155.  
  156. ; Draw perimeter
  157.  
  158. Line box_size,0,box_size,box_size
  159. Line 0,box_size,box_size,box_size
  160.  
  161. While Not KeyHit(1)
  162.  
  163.         ;If Eof(link) Then Print "Server has gone, 5 secs until this is gone too.... " : Delay 5000 : End
  164.         If Eof(link)
  165.                 Print "Server has gone, you had a score of:"+((player_mult_score*255)+player_score)
  166.                
  167.                 wait$=Input ("Want to see if Server will restart? (Y or N):")
  168.                 If wait$="y" Or wait$="Y"
  169.                         Print "okay, hanging on for a 8 second wait before re-try.... last chance": Delay 8000
  170.                         link=OpenTCPStream(link_string,7056)
  171.                        
  172.                         If Not link
  173.                                 Print "Ending...": Delay 1500:
  174.                                 End
  175.                         Else
  176.                                 Print "Server located."
  177.                                 status=14; attempt at pushing x & y to server
  178.                         EndIf
  179.                         Delay 5000
  180.                         Cls
  181.                        
  182.                         ;perimeter
  183.                         Line 512,0,512,512
  184.                         Line 0,512,512,512
  185.                        
  186.                 Else
  187.                         Print "Terminating Client. This was player"+this_player_num: Delay 1500: End
  188.                        
  189.                        
  190.                 End If
  191.                
  192.         EndIf
  193.                
  194.                
  195.        
  196.  
  197.         Select status
  198.        
  199.                 Case 10
  200.                        
  201.                         If player_score>=255
  202.                                 player_score=1
  203.                                 player_mult_score=player_mult_score+1
  204.                         EndIf
  205.                        
  206.        
  207.                 If ReadAvail(link)>=max_bank
  208.                
  209.                         ;time to read some ;)
  210.                         r=ReadBytes(tcp_recbank,link,0,max_bank)
  211.                         If pon=1
  212.                         Print "have readin "+r+" bytes from server."
  213.                         Print "-----------------------------------------------------"
  214.                 EndIf
  215.                
  216.                         ;my attempt at accessing sent count
  217.                         xth=PeekByte(tcp_recbank,0)        ;the amount of clients server has detected all
  218.                                                            ;together: Note if a client is registered
  219.                                                            ;by the server - the logic will dictate that
  220.                                                            ;once that client dies it stays dead until
  221.                                                                                            ; a new 'game' is ininitiated & the server
  222.                                                                                            ;opens up all players for joining again. The
  223.                                                                                                 ;problem is that the server decrements the
  224.                                                                                                 ; client count at the moment when a player
  225.                                                                                                 ; stroke client is detected as 'left'.
  226.                                 serv_count=PeekByte(tcp_recbank,1)
  227.                                
  228.                                
  229.                     ;attempt at copying in data received from server now
  230.                     For copy_ct=1 To 511
  231.                     srv_player_data(copy_ct)=PeekByte(tcp_recbank,copy_ct)
  232.                     Next
  233.                        
  234.                         ;current players
  235.                         mem_loc=((20*1)-10)
  236.                        
  237.                         For loop = 1 To xth  ;cycling through the number of clients server states
  238.                                                                 ;is connected:  
  239.                                
  240.                                 ;Note - the xth is simply a loop index of how many clients are currently attached
  241.                     ;work out where in 512 bytes this players x and y co-ords are:             
  242.                             mem_loc=((20*loop)-10)
  243.                                 If pon=1
  244.                                        
  245.                             Print"mem_loc is:"+mem_loc
  246.                            
  247.                                 Print "player: "+loop+" x co-ord:"+srv_player_data(mem_loc+1)
  248.                                 Print "player: "+loop+" y co-ord:"+srv_player_data(mem_loc+2)
  249.                                
  250.                         EndIf
  251.                        
  252.                         If skiponce<3              ;needs to pass 3 times before it settles down
  253.                                 skiponce=skiponce+1
  254.                         Else
  255.                                 Text 20,550,"This is Player :"+this_player_num
  256.                         EndIf
  257.                        
  258.                        
  259.                         Flip
  260.                        
  261.                         Select loop
  262.                                        
  263.                                 Case 1
  264.                                         Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
  265.                                        
  266.                                        
  267.                                         ;Text 610,(112)+loop*11,"player:"+loop+" score:"+player_score
  268.                                        
  269.                                         ;Text 610,(132)+loop*11,"player:"+loop+" score:"+test_score
  270.                                        
  271.                                        
  272.                                         collArray(1,XX)=srv_player_data(mem_loc+1)*2
  273.                                         collArray(1,YY)=srv_player_data(mem_loc+2)*2
  274.                 Case 2
  275.                         Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
  276.                         ;is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
  277.                        
  278.                         collArray(2,XX)=srv_player_data(mem_loc+1)*2
  279.                         collArray(2,YY)=srv_player_data(mem_loc+2)*2
  280.                        
  281.                        
  282.                        
  283.                 Case 3
  284.                         Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
  285.                         ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
  286.                        
  287.                         collArray(3,XX)=srv_player_data(mem_loc+1)*2
  288.                         collArray(3,YY)=srv_player_data(mem_loc+2)*2
  289.                        
  290.                 Case 4
  291.                         Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
  292.                         ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
  293.                        
  294.                        
  295.                         collArray(4,XX)=srv_player_data(mem_loc+1)*2
  296.                         collArray(4,YY)=srv_player_data(mem_loc+2)*2
  297.                        
  298.                 Case 5
  299.                         Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
  300.                         ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
  301.                        
  302.                         collArray(5,XX)=srv_player_data(mem_loc+1)*2
  303.                         collArray(5,YY)=srv_player_data(mem_loc+2)*2
  304.                        
  305.                 Case 6
  306.                         Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
  307.                         ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
  308.                        
  309.                        
  310.                         collArray(6,XX)=srv_player_data(mem_loc+1)*2
  311.                         collArray(6,YY)=srv_player_data(mem_loc+2)*2
  312.                        
  313.                 Case 7
  314.                         Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
  315.                         ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
  316.                        
  317.                        
  318.                         collArray(7,XX)=srv_player_data(mem_loc+1)*2
  319.                         collArray(7,YY)=srv_player_data(mem_loc+2)*2
  320.                        
  321.                 Case 8
  322.                         Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
  323.                         ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
  324.                        
  325.                        
  326.                         collArray(8,XX)=srv_player_data(mem_loc+1)*2
  327.                         collArray(8,YY)=srv_player_data(mem_loc+2)*2
  328.                        
  329.                 Case 9
  330.                         Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
  331.                         ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
  332.                        
  333.                        
  334.                         collArray(9,XX)=srv_player_data(mem_loc+1)*2
  335.                         collArray(9,YY)=srv_player_data(mem_loc+2)*2
  336.                        
  337.                 Case 10
  338.                         Plot srv_player_data(mem_loc+1)*2,srv_player_data(mem_loc+2)*2
  339.                         ;" is alive";+srv_player_data(mem_loc+1);+" Y:"+srv_player_data(mem_loc+2)
  340.                        
  341.                        
  342.                         collArray(10,XX)=srv_player_data(mem_loc+1)*2
  343.                         collArray(10,YY)=srv_player_data(mem_loc+2)*2
  344.                        
  345.                        
  346.         End Select
  347.        
  348. Next   
  349.                        
  350.                         If change_player_num_once=0
  351.                                 change_player_num_once=1
  352.                                 this_player_num=xth
  353.                                
  354.                                 ;this should ensure that this player num is only set once
  355.                                
  356.                         EndIf
  357.                        
  358.                        
  359.                         status=12 ; Yeppp time to respond...
  360.                 End If
  361.                        
  362.        
  363.         Case 12
  364.        
  365.                 ;THIS IS THE SENDER
  366.        
  367.             ;          player count:  1 byte   
  368.                 ;          player: x, y co -ords, 2 bytes
  369.                 ;          shot anything:  yes/no 1 byte
  370.                 ;          projectile alive: 1 byte
  371.                 ;          projectile x,y: 2 bytes
  372.                 ;          player world count:  1 byte
  373.                 ;          leaving 2 bytes for whatever      
  374.        
  375.        
  376.             ;byte 1: 1, add 1 to x,2 subtract 1 from x
  377.             ;byte 2: 1, add 1 to y,2 subtract 1 from y
  378.                
  379.                 ;byte seven: chaning to 12 from the 13 the server sets it to
  380.        
  381.                 ;haha client time to spam server first we make a cool tcp packet with random nunbers.
  382.                 For i=0 To (max_bank-1)
  383.                         PokeByte tcp_sendbank,i,0
  384.                         If sentcount<255
  385.                         PokeByte tcp_sendbank,0,sent_count
  386.                         Else sentcount=255
  387.                         EndIf
  388.                 Next
  389.                
  390.                 PokeByte tcp_sendbank,3,this_player_num; poke the player_num byte the changed once number
  391.                
  392.                
  393.         ;encapsulate the move stuff within if alive logic
  394.                
  395.                 If worm_walled=0
  396.                
  397.                
  398.                 If x_move>test_x_move Then
  399.                     ;Print"set x________ to move"
  400.                         PokeByte tcp_sendbank,1,move_logic_x(move_count);1 here means server needs To move x For this
  401.                                                         ;player/client by +1
  402.                        
  403.                         ;x_check_move=2*(move_logic_x(move_count)) this is only 1 to 8 doh!
  404.                        
  405.                 ;Note the client is Not self aware therefore how to instigate direction changes
  406.                 ;as a result of input.....
  407.                        
  408.                         ;easy - need to detect left cursor & right cursor first - this will be the
  409.                         ;controlling influence for the worm.....
  410.  
  411.                 End If
  412.                 If y_move>test_y_move Then
  413.                     ;Print"set y________ to move"
  414.                         PokeByte tcp_sendbank,2,move_logic_y(move_count)       ;1 here means server needs to move y for this
  415.                                                         ;player/client by +1
  416.                        
  417.                         ;y_check_move=2*(move_logic_y(move_count))
  418.                        
  419.                 End If
  420.                
  421.         Else
  422.                
  423.                 PokeByte tcp_sendbank,1,move_logic_x(0);1 here means server needs To move x For this by nothing
  424.                 PokeByte tcp_sendbank,2,move_logic_y(0);1 here means server needs to move y for this by nothing
  425.                
  426.                
  427.         EndIf; endif for worm_walled code - basically this worm WILL MOVE NO MORE!!!!!!
  428.        
  429.         this_dead_mem_loc=((20*(loop-1)-10))
  430.        
  431.        
  432.        
  433.        
  434.        
  435.        
  436.        
  437.         If collArray(this_player_num,XX)>498 Or collArray(this_player_num,YY)>498 Then
  438.                                
  439.                         worm_walled=1
  440.                        
  441.                         PokeByte tcp_sendbank,(this_player_num*20)-13,12    ;13 here means this client is unlucky and dead!!!!
  442.                         ; NOTE: if going to
  443.                        
  444.                         ;Text 250,250,"WORM SPLATTERED INTO A WALL..xmove: "+x_move+" &y:"+y_move
  445.                        
  446.                         this_dead_mem_loc=((20*(loop-1)-10))
  447.                        
  448.                         Text 40,420,"player: "+this_player_num+" dead at x co-ord:"+collArray(this_player_num,XX)
  449.                         Text 40,440,"player: "+this_player_num+" dead at y co-ord:"+collArray(this_player_num,YY)
  450.                         Text 40,460,"player: "+this_player_num+" Score:"++((player_mult_score*255)+player_score)
  451.                        
  452.                         PokeByte tcp_sendbank,1,move_logic_x(0);1 here means server needs To move x For this by nothing
  453.                         PokeByte tcp_sendbank,2,move_logic_y(0);1 here means server needs to move y for this by nothing
  454.                        
  455.                 EndIf
  456.                
  457.                 If worm_walled=0
  458.                        
  459.                         PokeByte tcp_sendbank,7,12       ;12 here means this client is alive
  460.                        
  461.                                                                                         ;this'll hopefully be changing the server from
  462.                                                                                         ;13 to 12........................
  463.                                                         ;player/client by +1
  464.                        
  465.                         Text 500,380,("player not hit wall")
  466.                        
  467.                        
  468.                         ;player alive so increment score
  469.                         player_score=player_score+1  
  470.                        
  471.                 Else
  472.                 ;need to send the number here to server to inform player walled (& hit other player)
  473.                         Text 500,400,("player hit wall")
  474.                        
  475.                         PokeByte tcp_sendbank,7,13
  476.                        
  477.                 EndIf
  478.                
  479.                
  480.                 PokeByte tcp_sendbank,5,player_score  
  481.                 PokeByte tcp_sendbank,6,player_mult_score
  482.                
  483.                 s=WriteBytes (tcp_sendbank,link,0,max_bank)
  484.                 ;Print "Sending "+s+" bytes to server."+sent_count+" times"
  485.                 sent_count=sent_count+1
  486.                
  487.                 status=10  ; Well we go out and wait for packet        
  488.                
  489.         Case 14
  490.                
  491.                 ;Client to contact server first we make a cool tcp packet
  492.                 For i=0 To (max_bank-1)
  493.                         PokeByte tcp_sendbank,i,0
  494.                         If sentcount<255
  495.                                 PokeByte tcp_sendbank,0,sent_count
  496.                                 Else sentcount=255
  497.                         EndIf
  498.                 Next
  499.                
  500.                 If x_move>test_x_move Then
  501.                         PokeByte tcp_sendbank,1,srv_player_data(mem_loc+1)              ;1 here means server needs to move x for this
  502.                                                         ;player/client by +1
  503.                        
  504.                 End If
  505.                 If y_move>test_y_move Then
  506.                         PokeByte tcp_sendbank,2,srv_player_data(mem_loc+2)      ;1 here means server needs to move y for this
  507.                                                         ;player/client by +1
  508.                        
  509.                 End If
  510.                
  511.                 PokeByte tcp_sendbank,1,srv_player_data(mem_loc+1)
  512.                 PokeByte tcp_sendbank,2,srv_player_data(mem_loc+2)
  513.                
  514.                
  515.                 s=WriteBytes (tcp_sendbank,link,0,max_bank)
  516.                 sent_count=sent_count+1
  517.                
  518.                 status=10
  519.                
  520.         Case 16  
  521.                
  522.                 If ReadAvail(link)>=max_bank
  523.                        
  524.                         ;time to read some ;)
  525.                         r=ReadBytes(tcp_recbank,link,0,max_bank)
  526.                         If pon=1
  527.                                
  528.                         Print "have readin "+r+" bytes from server."
  529.                         Print "-----------------------------------------------------"
  530.                 EndIf
  531.                
  532.                         ;accessing sent count
  533.                         xth=PeekByte(tcp_recbank,0)
  534.                         serv_count=PeekByte(tcp_recbank,1)
  535.                        
  536.                     ;copying in data received from server now
  537.                     For copy_ct=1 To 511
  538.                                 srv_player_data(copy_ct)=PeekByte(tcp_recbank,copy_ct)
  539.                     Next
  540.                        
  541.                         ;current players
  542.                         mem_loc=((20*1)-10)
  543.                         For loop = 1 To xth
  544.                     ;work out where in 512 bytes this players x and y co-ords are:             
  545.                             mem_loc=((20*loop)-10)
  546.                                 If pon=1
  547.                                        
  548.                             Print"mem_loc is:"+mem_loc
  549.                            
  550.                                 Print "player: "+loop+" x co-ord:"+srv_player_data(mem_loc+1)
  551.                                 Print "player: "+loop+" y co-ord:"+srv_player_data(mem_loc+2)
  552.                         EndIf
  553.                        
  554.                                
  555.                         Next   
  556.                        
  557.                         status=12 ; Yeppp time to respond...
  558.                 End If
  559.                
  560.                
  561.                
  562.        
  563. End Select
  564.  
  565.        
  566.         play_ct=0
  567.  
  568.     ;update x and y co-ords for this client to send to server:-
  569.        
  570.         x_move = x_move+1
  571.         y_move = y_move+1
  572.  
  573.         ;Delay 10 ; yep we have to delay some here to emulate many clients.. or cpu dies.
  574.        
  575.         Delay 50
  576.        
  577.         VWait 1; let the CPU rest
  578.        
  579.        
  580.         If KeyDown(203)
  581.                 ;Text 400,400,("left detected")
  582.                 If move_count>1
  583.                         move_count=move_count-1
  584.                 Else
  585.                         move_count=8
  586.                 EndIf
  587.         ;Else
  588.                 ;Text 400,400,("             nowt detected")
  589.         EndIf
  590.  
  591.         If KeyDown(205)
  592.                 ;Text 400,400,("right detected")
  593.                 If move_count<8
  594.                         move_count=move_count+1
  595.                 Else
  596.                         move_count=1
  597.                 EndIf
  598.         EndIf
  599.  
  600.         If title_once<=6
  601.                
  602.                 AppTitle "Worm Client Number "+this_player_num
  603.                 title_once=title_once+1
  604.                
  605.                 Text 20,500,"vvvvvv Proximity meter: 10 to 50 units respectively vvvvvv"
  606.                
  607.         EndIf
  608.        
  609.         ;call the proximity detector function
  610.         If xth>1
  611.                 proximity(this_player_num,xth)
  612.         EndIf
  613.        
  614.        
  615.        
  616. Wend
  617.  
  618.  
  619. Function proximity(thisplayer,maxplayers)
  620.        
  621.        
  622.         For checkOthers=1 To maxplayers
  623.                
  624.                 Local XX=1
  625.                 Local YY=2
  626.                
  627.                 If checkOthers=thisplayer
  628.                         ;do nothing
  629.                 Else
  630.                         If collArray(checkOthers,XX)>collArray(thisplayer,XX)
  631.                                 xdiff=collArray(checkOthers,XX)-collArray(thisplayer,XX)
  632.                         Else
  633.                                 xdiff=collArray(thisplayer,XX)-collArray(checkOthers,XX)
  634.                         EndIf
  635.                        
  636.                         If collArray(checkOthers,YY)>collArray(thisplayer,YY)
  637.                                 ydiff=collArray(checkOthers,YY)-collArray(thisplayer,YY)
  638.                         Else
  639.                                 ydiff=collArray(thisplayer,YY)-collArray(checkOthers,YY)
  640.                         EndIf
  641.                        
  642.                        
  643.                         For closeness=50 To 10 Step -10
  644.                                
  645.                                 If xdiff<closeness
  646.                                         If xdiff>(closeness-10)
  647.                                                 proxArray(closeness/10)=proxArray(closeness/10)+1
  648.                                         EndIf
  649.                                 EndIf
  650.                                
  651.                         Next
  652.                        
  653.                 EndIf
  654.                
  655.         Next
  656.        
  657.         ;draw the five proximity lines:
  658.         For drawProx=1 To 5
  659.                 Line 1,510+(drawProx*6),(proxArray(drawProx)),510+(drawProx*6)
  660.         Next
  661.        
  662. End Function
  663.  
  664. ;END CLIENT CODE
  665. ;=========================================================================     
  666. [codebox]
  667.  
  668. [codebox]
  669.  
  670.  
  671. ;WORMSERVER.bb - create an executable called WORMSERVER.exe
  672. ; in the same directory as the WORMCLIENT.exe
  673.  
  674. ;removed need for a separate folder to hide files in
  675.  
  676. ;VARS------------------------------------------------------------
  677.  
  678. Dim player_data(512)  ;512 bytes to copy into each clients
  679.  
  680. ;Populate dummy player data
  681. For count = 10 To 490 Step 20
  682.         player_data(count+1)=player_number      ;x    (-9)      
  683.         player_data(count+2)=count                              ;y    (-8)
  684.         player_data(count+3)=count                              ;THIS IS JUST A COUNT OF CLIENTS THAT ARE RUNNING    
  685.         player_data(count+4)=0                                  ;(-7) 0 bullet dead, 1 alive  - now player num
  686.                                                                                         ;(-6)player score - not doing bullets for a while anyway.make this score count 1(1-255)
  687.         player_data(count+5)=count+10                   ;(-5)2nd part score make this score count 2(255*255)   i.e. 10+(2*255)
  688.         player_data(count+6)=count+10                   ;(-4)
  689.  
  690. player_data(count+7)=13                                 ;alive signified by 13
  691.  
  692. Next
  693.  
  694.  
  695.  
  696. max_bank=512
  697. global_client_count=0
  698. Dim file_name$(255); 255 possible clients - who'd need more?
  699. Global file_count=0
  700.  
  701.  
  702. Type session
  703.  
  704.         Field link
  705.         Field tcp_sendbank
  706.         Field tcp_recbank
  707.         Field status
  708.         Field player_number
  709.  
  710. End Type
  711.  
  712.  
  713. Graphics 400,600,16,2            ; B3D
  714.  
  715. AppTitle "Serving worms with killer logic"
  716.  
  717. server=CreateTCPServer(7056)
  718. ;print "server is running.."
  719.  
  720. msmin=9999999 ; minimums millisecs :D
  721.  
  722. While Not KeyHit(1)  
  723.  
  724.         stream = AcceptTCPStream(server)
  725.         If stream
  726.                 global_client_count=global_client_count+1
  727.                 ;print "New stream detected. memory allocated."
  728.                 ses.session = New session
  729.                 seslink=stream
  730.                 ses     cp_sendbank = CreateBank(max_bank)     
  731.                 ses     cp_recbank = CreateBank(max_bank)
  732.                 sesstatus =10 ; Simulate login.
  733.                 ;sesclient_count=global_client_count
  734.                
  735.                 sesplayer_number=global_client_count  
  736.                 Print "global_client_count is:"+sesplayer_number
  737.                
  738.                 fn_create_file(Int seslink)
  739.        
  740.         End If
  741.  
  742.  
  743.         oldms=MilliSecs()
  744.         ;Validate streams..
  745.         For ses.session = Each session
  746.        
  747.                 If Eof(seslink)
  748.                         ;print "A session called "+seslink+" has stop working."
  749.                         ;print "Frees memory banks for session "+seslink
  750.                         FreeBank ses    cp_sendbank
  751.                         FreeBank ses    cp_recbank
  752.                         ;print "deletes sessions "+seslink
  753.                        
  754.                         numberin=seslink
  755.                         fn_delete_file(Int seslink)
  756.                        
  757.                         Delete ses
  758.                         ;global_client_count=global_client_count-1 ;removing This could have BIG ramifications:-
  759.                        
  760.                         ;instead of doing the aboveset the dead byte in the client:-
  761.                        
  762.                        
  763.                 End If
  764.                
  765.         Next
  766.        
  767.         For ses.session = Each session; this is looking at the first few bytes sent in from each session/client
  768.        
  769.        
  770.                 Select sesstatus
  771.                 Case 10
  772.                
  773.                         If ReadAvail(seslink)>=max_bank
  774.                        
  775.                                 ;so we got a new packet :D and its all 100% secure... so we can go on live our lifes
  776.                                 r=ReadBytes (ses        cp_recbank,seslink,0,max_bank)
  777.                                 ;print "for session "+seslink+" who has a tcp recbank of:"+ses  cp_recbank
  778.                                 ;print "read "+r+" bytes from stream"
  779.                                
  780.                                 ;my attempt at accessing sent count
  781.                                 rx_count=PeekByte(ses   cp_recbank,0)
  782.  
  783.                                 If PeekByte(ses cp_recbank,3)>0
  784.                                         client_has_player_num=PeekByte(ses      cp_recbank,3)
  785.                                        
  786.                                        
  787.                                         ;print"***********************************************************"
  788.                                         Print"   Found player number in data:  "+client_has_player_num+"......Press any key"
  789.                                        
  790.                                         ;so try setting the player_number for sending back to 41
  791.                                         sesplayer_number=client_has_player_num  ;IS NOW WORKING
  792.                                        
  793.  
  794.                                 Else
  795.                                        
  796.                                         Print "Setting playernum to :"+global_client_count+" Press any key"
  797.                                         ;WaitKey
  798.                                         client_has_player_num = global_client_count
  799.                                         playerNumLoc=(20*sesplayer_number)-7                            ;
  800.                                         player_data(playerNumLoc)=client_has_player_num
  801.  
  802.                                        
  803.                                 EndIf
  804.                                
  805.                                
  806.                                
  807.                                
  808.                                 ; end add player_number to a player if he already does not have one
  809.                                 ;############################################################################
  810.  
  811.                                
  812.                                 ;##########################################
  813.                                 ; player alive or dead status
  814.                                
  815.                                 If PeekByte(ses cp_recbank,7)=12
  816.                                         alive_data=PeekByte(ses cp_recbank,2)
  817.                                        
  818.                                        
  819.                                         ;print"***********************************************************"
  820.                                         Print"   Found alive data (set to 12):  "+alive_data
  821.                                         ;print"***********************************************************"
  822.                                         ;----------------------------------------------------------------------
  823.                                         ;okay moving the logic to move the worm here coz its alive:-
  824.                                        
  825.                                        
  826.                                                 ;############################################################################
  827.                                 ; now access the data wrt the player/client
  828.                                        
  829.                                                                         ;###################################
  830.                                 ;player score discovery
  831.                                        
  832.                                         If PeekByte(ses cp_recbank,5)>0
  833.                                                 client_has_score=PeekByte(ses   cp_recbank,5)
  834.                                                 client_big_score=PeekByte(ses   cp_recbank,6)
  835.                                                
  836.                                         ;print"***********************************************************"
  837.                                                 Print client_has_player_num+"   Found player number score in data:  "+client_has_score
  838.                                                 Print client_has_player_num+"   Found player multiplier score in data:  "+client_big_score
  839.                                                
  840.                                         ;print"***********************************************************"
  841.                                                
  842.                                         Else
  843.                                                 client_has_score = 69
  844.                                                 playerNumLoc=(20*sesplayer_number)-6
  845.                                                 player_data(playerNumLoc)=client_has_score
  846.                                                
  847.                                         ;print"***********************************************************"
  848.                                                 Print"   Assigned a player score to a new client"
  849.                                         ;print"***********************************************************"
  850.                                                
  851.                                         ;2nd bit of score
  852.                                                 playerNumLoc=(20*sesplayer_number)-5
  853.                                                 player_data(playerNumLoc)=client_has_score
  854.                                                
  855.                                                
  856.                                         EndIf
  857.                                        
  858.                        
  859.                                        
  860.                                         If PeekByte(ses cp_recbank,1)>0
  861.                                                 xmove=PeekByte(ses      cp_recbank,1)
  862.                                                
  863.                                         ;print"XMOVE detected as :"+xmove
  864.                                                
  865.                                                 If xmove=1;add one
  866.                                                         xloc=(20*sesplayer_number)-9
  867.                                                         If player_data(xloc)<=250
  868.                                                                 player_data(xloc)=player_data(xloc)+1
  869.                                                 ;print"adding ++++++++++++++++++++++++X"
  870.                                                 ;print"adding ++++++++++++++++++++++++X"
  871.                                                                
  872.                                                         EndIf
  873.                                                 EndIf
  874.                                                 If xmove=2
  875.                                                 ;subtract one  
  876.                                                         xloc=(20*sesplayer_number)-9
  877.                                                         If player_data(xloc)>=1
  878.  
  879.                                                                 player_data(xloc)=player_data(xloc)-1
  880.  
  881.                                                         EndIf
  882.                                                 EndIf
  883.                                                
  884.                                                 If xmove>2  
  885.                                                         xloc=(20*sesplayer_number)-9
  886.                
  887.                                                         player_data(xloc)=xmove
  888.                                                 EndIf
  889.                        
  890.                                         EndIf
  891.                                        
  892.                                        
  893.                                         If PeekByte(ses cp_recbank,2)>0
  894.                                                 ymove=PeekByte(ses      cp_recbank,2)
  895.                                                
  896.                                                
  897.                                         ;;print "Detected Move request for y of client:"+ses    cp_recbank
  898.                                                 yloc=(20*sesplayer_number)-8
  899.                                                 ymove=PeekByte(ses      cp_recbank,2)
  900.  
  901.                                                 If ymove=1;add one
  902.                                                         yloc=(20*sesplayer_number)-8
  903.                                                         If player_data(yloc)<=250
  904.                                                                 player_data(yloc)=player_data(yloc)+1
  905.                                                         EndIf
  906.                                                 EndIf
  907.                                                 If ymove=2;subtract one  
  908.                                                         yloc=(20*sesplayer_number)-8
  909.                                                         If player_data(yloc)>=1
  910.                                                                 player_data(yloc)=player_data(yloc)-1
  911.                                                         EndIf
  912.                                                 EndIf
  913.                                                
  914.                                                
  915.                                                 If ymove>2;refresh from client
  916.                                                        
  917.                                                         yloc=(20*sesplayer_number)-8
  918.                                                 ;If player_data(yloc)>=1
  919.                                                         player_data(yloc)=ymove
  920.                                                 ;EndIf
  921.                                                 EndIf
  922.        
  923.                                         EndIf
  924.  
  925.                                         ;---------------------------------------------------------------------
  926.                                 Else
  927.  
  928.                                         client_has_player_num = global_client_count
  929.                                         playerNumLoc=(20*sesplayer_number)-3   ;might be right?
  930.                                         player_data(playerNumLoc)=client_has_player_num
  931.                                        
  932.                                 EndIf
  933.                                
  934.                                 If PeekByte(ses cp_recbank,7)=13
  935.                                        
  936.                                         Cls
  937.                                        
  938.                                         ;Text 20,100,
  939.                                         Print "Wall hit for player:"+player_data(playerNumLoc)
  940.                                        
  941.                                         ;Text 20,120,
  942.                                         Print "last xmove was:"+xmove+"last ymove was:"+ymove
  943.                                        
  944.                                 EndIf
  945.  
  946.                        
  947.                                 sesstatus=12 ; well time to reply this packet next round :D
  948.                        
  949.                         EndIf
  950.                
  951.                 Case 12 ; Well time to reply a packet.
  952.                
  953.                         ;First we fill it upp with 0
  954.                         For i=0 To (max_bank-1)
  955.                                 ;PokeByte ses   cp_sendbank,i,Rnd(255)
  956.                                 PokeByte ses    cp_sendbank,i,0
  957.                         Next
  958.                        
  959.                        
  960.  
  961.                         rx_count=PeekByte(ses   cp_recbank,0)
  962.                        
  963.                         ;client_count=PeekByte(ses      cp_recbank,0)
  964.                         PokeByte ses    cp_sendbank,0,global_client_count  
  965.                         PokeByte ses    cp_sendbank,1,rx_count
  966.        
  967.                         For count = 10 To 490
  968.                                 PokeByte ses    cp_sendbank,count,player_data(count); copying in data
  969.                         Next
  970.                        
  971.                        
  972.                         ; SETTING THE PLAYER NUMBER TO WHAT THE CLIENT RECKONS
  973.                         Print"==================================="
  974.                         Print "Client Number set to: "+sesplayer_number
  975.                         PokeByte ses    cp_sendbank,3,sesplayer_number
  976.  
  977.  
  978.                         ;Secondly we reply it kindly.
  979.                         s=WriteBytes (ses       cp_sendbank,seslink,0,max_bank)
  980.                         ;;print "Succesfull sending "+s+" bytes of data"
  981.                          packetssent= packetssent+1
  982.        
  983.                         sesstatus=10 ; Well we cant wait for next coll packet to arive :D"
  984.                        
  985.                 End Select
  986.        
  987.        
  988.         Next   
  989.        
  990.         ms=MilliSecs()-oldms
  991.         If ms>msmax Then msmax=ms
  992.         If ms<msmin Then msmin=ms
  993.         count=count+1
  994.         cmsmed=cmsmed+ms
  995.         msmed=cmsmed/count   ; medium millisecs
  996.        
  997.        
  998.         tick=tick+1
  999.         If tick>=500 Then Print "Ticks: "+count+" MS="+ms+" MIN="+msmin+" MED="+msmed+" MAX="+msmax+ "Packets sent "+ packetssent : tick=0
  1000.  
  1001.        
  1002.                 If KeyHit(19) Then MSMIN=99999 : msmed=0 : count=0 : msmax=0 : packetssent=0 :cmsmed=0: ;print "Counter resets."
  1003.  
  1004.                 Delay 8 ; this gives cpu time to rest of OS in windows. as server is not so cpu intensive.
  1005.  
  1006. Wend
  1007. ;---------------------------------------------------------------------
  1008. ;  functions
  1009. ;---------------------------------------------------------------------
  1010.  
  1011.  
  1012.  
  1013. Function fn_delete_file(numberin)
  1014.         ;print "Deleting File: "+numberin
  1015.         ;del_file_name$="file_dir/"+numberin+".ini"
  1016.         del_file_name$="./"+numberin+".ini"
  1017.  
  1018.         DeleteFile (del_file_name$)
  1019.         ;print "File Deleted"  
  1020. End Function
  1021.  
  1022.  
  1023. Function fn_create_file(numberin)
  1024.  
  1025.         BestName$="Mark"
  1026.  
  1027.         file_name$(file_count)="./"+numberin+".ini"
  1028.  
  1029.         ;print file_name$(file_count)
  1030.         writethis$=file_name$(file_count)
  1031.         file_count=file_count+1
  1032.        
  1033.         ; Open a file to write to
  1034.         fileout = WriteFile(writethis$)
  1035.  
  1036.        
  1037.         WriteString( fileout, "new string:1" )
  1038.  
  1039.         ; Close the file
  1040.         CloseFile( fileout )
  1041.        
  1042. End Function
  1043.  
  1044.  
  1045. ;END WORMSERVER.bb
  1046. ;=================================================================
  1047.  
  1048. [/codebox]


Comments : none...

Offline 3DzForMe

  • Hero Member
  • *****
  • Posts: 828
Re: [bb] Snakes Client and Server by Blitzplotter [ 1+ years ago ]
« Reply #1 on: June 01, 2019, 07:45:13 AM »
The Wormserver code had some errant spaces in it.... the following is the server code corrected - at least it compiles now!

Code: [Select]



;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: [Select]
; 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