home *** CD-ROM | disk | FTP | other *** search
- # WimpWorks Information File
- # WimpWorks © Jaffa Software 1997. All rights reserved.
-
- DEF TASKdetails
- Name WWHouse
- Purpose Server for WWBounce
- Author © Charles Talibard 1998
- Licence Public Domain
- Version 1.00 (11 March 1998)
- Compress False
- Memory 0K
- IconbarSide Right
- IconbarPriority &00000000
- IconbarSprite !wwhouse
- IconbarText Server
- ENDTASK
-
- DEF WEMinclude
- ENDWEM
-
- DEF MENUiconMenu%
- WWHouse
- Info
- S(infoWindow%)
-
- Quit
-
- CLOSEDOWN
- ENDMENU
-
- DEF SUBR_PROCHouseInit
- Event 0
- Every -1
- DEF PROCHouseInit
- TotalRooms% = 0
- ActiveRoom% = 0
-
- running%=FALSE
-
- wwhouse%=TASKHANDLE("WWHouse")
- IF wwhouse%<>TASKINFO(&04) AND wwhouse%>0 THEN WARNING("A WWHouse server is already running","Error from WWHouse"):CLOSEDOWN
-
- running%=TRUE
- ENDPROC
- ENDSUBR
-
- DEF SUBR_PROCAACommand
- Event 13
- Every -1
- DEF PROCAACommand(task$, reference%, command$)
- LOCAL addr%,ptr%,prev%,roomId%,hadBall%,currentId%,commandName$,reply$
- LOCAL finished%,XPos%,YPos%,dead%,next%,canGetBall%
-
- commandName$ = FNStringToken(command$)
-
- IF task$ <> "WWBounce" THEN ENDPROC
-
- CASE commandName$ OF
- WHEN "HELLO" : IF TotalRooms% = 0 THEN
- REPLY(task$,reference%,"HELLO "+STR$(TotalRooms%+1)+" Y")
- Bounce_List% = CLAIM(28)
- Bounce_List%!0 = -1
- Bounce_List%!4 = reference%
- Bounce_List%!24 = 1
- ELSE
- REPLY(task$,reference%,"HELLO "+STR$(TotalRooms%+1)+" N")
- addr% = CLAIM(28)
- addr%!0 = -1
- addr%!4 = reference%
- addr%!24 = 0
-
- ptr% = Bounce_List%
- WHILE !ptr%<>-1:ptr%=!ptr%:ENDWHILE
- ptr%!0 = addr%
- ENDIF
- TotalRooms% += 1
-
- WHEN "DYING" : roomId% = VAL(FNStringToken(command$))
- IF roomId% > TotalRooms% THEN ENDPROC
- prev% = -1
- addr% = Bounce_List%
- next% = addr%!0
- dead% = FALSE
- currentId% = roomId%
- WHILE currentId% > 1
- next% = addr%!0
- prev% = addr%
- addr% = next%
- currentId% -= 1
- ENDWHILE
- next% = addr%!0
- IF prev% = -1 THEN Bounce_List%=next% ELSE prev%!0=next%
- hadBall% = ((addr%!24 AND 1) = 1)
- RELEASE(addr%)
-
- TotalRooms% -= 1
- currentId% = roomId%
- ptr% = next%
- canGetBall% = TRUE
-
- IF Bounce_List%=-1 THEN ENDPROC
- IF ptr%=-1 THEN
- IF hadBall% THEN ptr%=Bounce_List%:currentId%=1 ELSE ENDPROC
- ENDIF
-
- WHILE ptr%<>-1
- reply$ = "HELLO "+STR$(currentId%)+" "
- IF hadBall% OR ((ptr%!24 AND 1)=1 AND canGetBall%) THEN
- reply$ += "Y"
- hadBall% = FALSE
- canGetBall% = FALSE
- ptr%!24 = ptr%!24 OR 1
- ELSE
- reply$ += "N"
- ptr%!24 = ptr%!24 AND (NOT 1)
- ENDIF
- REPLY(task$,ptr%!4,reply$)
-
- currentId% += 1
- prev% = ptr%
- ptr% = ptr%!0
- ENDWHILE
- ' Ensure linked list is terminated
- IF prev%<>-1 THEN prev%!0 = -1
-
-
- WHEN "RESIZ" : roomId% = VAL(FNStringToken(command$))
- addr% = FNGetRoom(roomId%)
- IF addr% = -1 THEN ENDPROC
-
- addr%!8 = VAL(FNStringToken(command$))
- addr%!12 = VAL(FNStringToken(command$))
- addr%!16 = VAL(FNStringToken(command$))
- addr%!16 += addr%!8
- addr%!20 = addr%!12 - VAL(FNStringToken(command$))
-
- WHEN "BOUNC" : roomId% = VAL(FNStringToken(command$))
-
- ptr% = FNGetRoom(roomId%)
- IF ptr% = -1 THEN ENDPROC
-
- XPos% = VAL(FNStringToken(command$))
- YPos% = VAL(FNStringToken(command$))
-
- XPos% += ptr%!8
- YPos% += ptr%!12
-
- addr% = Bounce_List%
- currentId% = 1
- finished% = FALSE
-
- WHILE addr%<>-1 AND NOT finished%
- IF currentId% <> roomId% THEN
- IF (XPos%>addr%!8) AND (XPos%<addr%!16) AND (YPos%>addr%!20) AND (YPos%<addr%!12) THEN
- ' Change the current bouncing client
- addr%!24 = addr%!24 AND (NOT 1)
- REPLY(task$,reference%,"NOBLL")
- PROCNewClient(currentId%,(XPos% - addr%!8), (YPos% - addr%!12), command$)
- finished% = TRUE
- ENDIF
- ENDIF
- addr% = !addr%
- currentId% += 1
- ENDWHILE
- ENDCASE
- ENDPROC
- ENDSUBR
-
- DEF SUBR_FNClosedown
- Event 2
- Every -1
- DEF FNClosedown
- LOCAL ref%
-
- IF running% THEN ref%=COMMAND("WWBounce","Quit")
- =TRUE
- ENDSUBR
-
- DEF SUBR_FNNumLength
- Event -1
- Every -1
- DEF FNNumLength(number%)
- ' IF number% = 0 THEN =1
- ' IF number% < 0 THEN =1+FNNumLength(ABS(number%))
- ' =INT(LOG(number%))+1
- =LEN(STR$(number%))
- ENDSUBR
-
- DEF SUBR_FNGetRoom
- Event -1
- Every -1
- DEF FNGetRoom(roomId%)
- LOCAL addr%
-
- IF roomId% > TotalRooms% THEN =-1
-
- addr%=Bounce_List%
- WHILE roomId% > 1
- addr% = !addr%
- roomId% -= 1
- ENDWHILE
- =addr%
- ENDSUBR
-
- DEF SUBR_PROCNewClient
- Event -1
- Every -1
- DEF PROCNewClient(roomId%, XPos%, YPos%, velocities$)
- LOCAL myRef%
-
- myRef% = FNGetRoom(roomId%)
- myRef%!24 = myRef%!24 OR 1
-
- velocities$ = STR$(XPos%)+" "+STR$(YPos%)+" "+velocities$
- myRef% = COMMAND("WWBounce","GETBL "+STR$(roomId%)+" "+velocities$)
- ENDPROC
- ENDSUBR
-
- DEF SUBR_FNStringToken
- Event -1
- Every -1
- DEF FNStringToken(RETURN string$)
- LOCAL next$,pos%
-
- pos% = INSTR(string$," ")
- next$ = LEFT$(string$, pos%-1)
- string$ = MID$(string$, pos%+1)
- IF pos% = 0 THEN string$=""
- =next$
- ENDSUBR
-
-