home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / programs / programming / wwbounce / !WWHouse / WWv2Data < prev   
Encoding:
Text File  |  1998-06-24  |  6.5 KB  |  232 lines

  1. # WimpWorks Information File
  2. # WimpWorks © Jaffa Software 1997. All rights reserved.
  3.  
  4. DEF TASKdetails
  5.     Name        WWHouse
  6.     Purpose        Server for WWBounce
  7.     Author        © Charles Talibard 1998
  8.     Licence        Public Domain
  9.     Version        1.00 (11 March 1998)
  10.     Compress    False
  11.     Memory        0K
  12.     IconbarSide    Right
  13.     IconbarPriority    &00000000
  14.     IconbarSprite    !wwhouse
  15.     IconbarText    Server
  16. ENDTASK
  17.  
  18. DEF WEMinclude
  19. ENDWEM
  20.  
  21. DEF MENUiconMenu%
  22.     WWHouse
  23.     Info
  24.         S(infoWindow%)
  25.         
  26.     Quit
  27.         
  28.         CLOSEDOWN
  29. ENDMENU
  30.  
  31. DEF SUBR_PROCHouseInit
  32.     Event    0
  33.     Every    -1
  34. DEF PROCHouseInit
  35.   TotalRooms% = 0
  36.   ActiveRoom% = 0
  37.   
  38.   running%=FALSE
  39.   
  40.   wwhouse%=TASKHANDLE("WWHouse")
  41.   IF wwhouse%<>TASKINFO(&04) AND wwhouse%>0 THEN WARNING("A WWHouse server is already running","Error from WWHouse"):CLOSEDOWN
  42.   
  43.   running%=TRUE
  44. ENDPROC
  45. ENDSUBR
  46.  
  47. DEF SUBR_PROCAACommand
  48.     Event    13
  49.     Every    -1
  50. DEF PROCAACommand(task$, reference%, command$)
  51.   LOCAL addr%,ptr%,prev%,roomId%,hadBall%,currentId%,commandName$,reply$
  52.   LOCAL finished%,XPos%,YPos%,dead%,next%,canGetBall%
  53.   
  54.   commandName$ = FNStringToken(command$)
  55.   
  56.   IF task$ <> "WWBounce" THEN ENDPROC
  57.   
  58.   CASE commandName$ OF
  59.   WHEN "HELLO" : IF TotalRooms% = 0 THEN 
  60.                    REPLY(task$,reference%,"HELLO "+STR$(TotalRooms%+1)+" Y")
  61.                    Bounce_List%    = CLAIM(28)
  62.                    Bounce_List%!0  = -1
  63.                    Bounce_List%!4  = reference%
  64.                    Bounce_List%!24 = 1
  65.                  ELSE
  66.                    REPLY(task$,reference%,"HELLO "+STR$(TotalRooms%+1)+" N")
  67.                    addr%    = CLAIM(28)
  68.                    addr%!0  = -1
  69.                    addr%!4  = reference%
  70.                    addr%!24 = 0
  71.                    
  72.                    ptr% = Bounce_List%
  73.                    WHILE !ptr%<>-1:ptr%=!ptr%:ENDWHILE
  74.                    ptr%!0 = addr%
  75.                  ENDIF  
  76.                  TotalRooms% += 1
  77.                  
  78.   WHEN "DYING" : roomId% = VAL(FNStringToken(command$))
  79.                  IF roomId% > TotalRooms% THEN ENDPROC
  80.                  prev%      = -1
  81.                  addr%      = Bounce_List%
  82.                  next%      = addr%!0
  83.                  dead%      = FALSE
  84.                  currentId% = roomId%
  85.                  WHILE currentId% > 1
  86.                    next%       = addr%!0
  87.                    prev%       = addr%
  88.                    addr%       = next%
  89.                    currentId% -= 1
  90.                  ENDWHILE
  91.                  next%    = addr%!0
  92.                  IF prev% = -1 THEN Bounce_List%=next% ELSE prev%!0=next%
  93.                  hadBall% = ((addr%!24 AND 1) = 1)
  94.                  RELEASE(addr%)
  95.                  
  96.                  TotalRooms% -= 1
  97.                  currentId%   = roomId%
  98.                  ptr%         = next%
  99.                  canGetBall%  = TRUE
  100.                  
  101.                  IF Bounce_List%=-1 THEN ENDPROC
  102.                  IF ptr%=-1 THEN
  103.                    IF hadBall% THEN ptr%=Bounce_List%:currentId%=1 ELSE ENDPROC
  104.                  ENDIF
  105.                  
  106.                  WHILE ptr%<>-1
  107.                    reply$ = "HELLO "+STR$(currentId%)+" "
  108.                    IF hadBall% OR ((ptr%!24 AND 1)=1 AND canGetBall%) THEN
  109.                      reply$     += "Y"
  110.                      hadBall%    = FALSE
  111.                      canGetBall% = FALSE
  112.                      ptr%!24     = ptr%!24 OR 1
  113.                    ELSE
  114.                      reply$  += "N"
  115.                      ptr%!24  = ptr%!24 AND (NOT 1)
  116.                    ENDIF
  117.                    REPLY(task$,ptr%!4,reply$)
  118.                    
  119.                    currentId% += 1
  120.                    prev%       = ptr%
  121.                    ptr%        = ptr%!0
  122.                  ENDWHILE
  123.                  ' Ensure linked list is terminated
  124.                  IF prev%<>-1 THEN prev%!0 = -1
  125.  
  126.                  
  127.   WHEN "RESIZ" : roomId%  = VAL(FNStringToken(command$))
  128.                  addr%    = FNGetRoom(roomId%)
  129.                  IF addr% = -1 THEN ENDPROC
  130.                  
  131.                  addr%!8   = VAL(FNStringToken(command$))
  132.                  addr%!12  = VAL(FNStringToken(command$))
  133.                  addr%!16  = VAL(FNStringToken(command$))
  134.                  addr%!16 += addr%!8
  135.                  addr%!20  = addr%!12 - VAL(FNStringToken(command$))
  136.                  
  137.   WHEN "BOUNC" : roomId%  = VAL(FNStringToken(command$))
  138.                  
  139.                  ptr%    = FNGetRoom(roomId%)
  140.                  IF ptr% = -1 THEN ENDPROC
  141.                  
  142.                  XPos%  = VAL(FNStringToken(command$))
  143.                  YPos%  = VAL(FNStringToken(command$))
  144.                  
  145.                  XPos% += ptr%!8
  146.                  YPos% += ptr%!12
  147.                  
  148.                  addr%      = Bounce_List%
  149.                  currentId% = 1
  150.                  finished%  = FALSE
  151.                                   
  152.                  WHILE addr%<>-1 AND NOT finished%
  153.                    IF currentId% <> roomId% THEN
  154.                      IF (XPos%>addr%!8) AND (XPos%<addr%!16) AND (YPos%>addr%!20) AND (YPos%<addr%!12) THEN
  155.                        ' Change the current bouncing client
  156.                        addr%!24 = addr%!24 AND (NOT 1)
  157.                        REPLY(task$,reference%,"NOBLL")
  158.                        PROCNewClient(currentId%,(XPos% - addr%!8), (YPos% - addr%!12), command$)
  159.                        finished% = TRUE
  160.                      ENDIF
  161.                    ENDIF
  162.                    addr%       = !addr%
  163.                    currentId% += 1
  164.                  ENDWHILE
  165.   ENDCASE                   
  166. ENDPROC
  167. ENDSUBR
  168.  
  169. DEF SUBR_FNClosedown
  170.     Event    2
  171.     Every    -1
  172. DEF FNClosedown
  173.   LOCAL ref%
  174.   
  175.   IF running% THEN ref%=COMMAND("WWBounce","Quit")
  176. =TRUE
  177. ENDSUBR
  178.  
  179. DEF SUBR_FNNumLength
  180.     Event    -1
  181.     Every    -1
  182. DEF FNNumLength(number%)
  183.   ' IF number% = 0 THEN =1
  184.   ' IF number% < 0 THEN =1+FNNumLength(ABS(number%))
  185.   ' =INT(LOG(number%))+1
  186. =LEN(STR$(number%))
  187. ENDSUBR
  188.  
  189. DEF SUBR_FNGetRoom
  190.     Event    -1
  191.     Every    -1
  192. DEF FNGetRoom(roomId%)
  193.   LOCAL addr%
  194.   
  195.   IF roomId% > TotalRooms% THEN =-1
  196.   
  197.   addr%=Bounce_List%
  198.   WHILE roomId% > 1
  199.     addr%    = !addr%
  200.     roomId% -= 1
  201.   ENDWHILE
  202. =addr%
  203. ENDSUBR
  204.  
  205. DEF SUBR_PROCNewClient
  206.     Event    -1
  207.     Every    -1
  208. DEF PROCNewClient(roomId%, XPos%, YPos%, velocities$)
  209.   LOCAL myRef%
  210.   
  211.   myRef%    = FNGetRoom(roomId%)
  212.   myRef%!24 = myRef%!24 OR 1
  213.  
  214.   velocities$ = STR$(XPos%)+" "+STR$(YPos%)+" "+velocities$
  215.   myRef% = COMMAND("WWBounce","GETBL "+STR$(roomId%)+" "+velocities$)
  216. ENDPROC
  217. ENDSUBR
  218.  
  219. DEF SUBR_FNStringToken
  220.     Event    -1
  221.     Every    -1
  222. DEF FNStringToken(RETURN string$)
  223.   LOCAL next$,pos%
  224.     
  225.   pos%    = INSTR(string$," ")
  226.   next$   = LEFT$(string$, pos%-1)
  227.   string$ = MID$(string$, pos%+1)
  228.   IF pos% = 0 THEN string$=""
  229. =next$
  230. ENDSUBR
  231.  
  232.