-+-+-+-+-+-+-+-+ START OF PART 6 -+-+-+-+-+-+-+-+ X;`09addw2`09#`5EA/1/+`5EX80, r2`09`09; get number with parity bit set X;`09locc`09r2, screen_len, outbuf X;`09beql`0950$`09`09`09; could not find it !!! X;`09movb`09#`5EA/`60/, (r1)`09`09; change to diamond X50$: X`09callg`09update_par, snake_write X`09blbc`09game_going, 100$`09; bit clear if game has finished X`09bbsc`09player, you_just_died, 60$ ; see if we just died X`09rsb X60$:`09movb`09#1, dead`09`09; say we are dead X`09callg`09text_wait, snake_write`09; tell them to wait for next game_exit, X`09rsb X80$:`09; dont copy buffer if no head to update because we are dead X`09callg`09update_par2, snake_write X`09blbc`09game_going, 100$ X`09rsb X100$: X`09$setimr_s efn=#6, daytim=second_1`09; so we can see last move X`09$waitfr_s efn=#6 X`09ret`09`09`09`09; return from SNAKE_PLAY if end game X`09.disable local_block X X X`09.entry`09- XCHECK_AST, `5Em X;+ X;`09called when check_timer expires (2 seconds) X;`09we should only get here if one of the other snakes has aborted X;`09or `5ES ed . Force the snake out of the game. X;- X`09$readef_s efn=#64, state=cluster_2`09; get done flags X`09extzv`09#flag$v_done, #snake, cluster_2, r2 ; get done flags X;`09movb`09other_players+1, r3`09`09; get other players X`09bicw3`09r2, other_players+1, r3`09`09; find players who have not X`09`09`09`09`09`09; responded X`09bicw2`09r3, other_players+1`09`09; and say they are dead X`09clrl`09r2`09`09`09`09; snake 0 X100$:`09bbc`09r2, r3, 200$ X`09clrb`09move(r2)`09`09`09; say snake has quitted X`09addl3`09#flag$v_done+64, r2, r0`09`09; get event flag X`09$setef_s efn=r0`09`09`09`09; set event flag so I will X`09`09`09`09`09`09; wake up on return from here X200$:`09aoblss`09#snake, r2, 100$`09`09; for all 8 snakes X X`09ret X X X`09.entry`09- XSNAKE_GAME_END, `5Em<> X;+ X;`09synchronizes the end of the game X;- X`09clrb`09dead`09`09`09; we are not dead X`09blbc`09master, 500$`09`09; if not master snake --> 500$ X`09$clref_s efn=#flag$v_game+64`09; say game not in progress X`09clrb`09game_going`09`09; and again X`09$setimr_s efn=#flag$v_endofgame+64, daytim=second_2 X`09clrw`09you_just_died`09`09; reset died flags X500$: X`09$waitfr_s efn=#flag$v_endofgame+64 ; wait for end of game X`09blbs`09abort, 800$`09`09; if we should abort --> 800$ X`09ret X800$:`09; we must abort. Probably because master snake stopped X`09$exit_s #1 X X X`09.entry`09- XSNAKE_EXIT, `5Em X;+ X;`09called as an exit handler X;- X;`09$cancel_s chan=mbxchan`09`09; cancel mailbox read X X`09movl`09player, r3`09`09; get my snake number X`09blss`0980$`09`09`09; we never were playing X`09clrb`09move(r3)`09`09; make next move a quit X`09addl3`09#flag$v_done, r3, r2`09; get done bit X`09bbcc`09r2, other_players, 50$`09; stop master snake from waiting for me X50$:`09addl2`09#64, r2`09`09`09; make into event flag X`09$setef_s efn=r2`09`09`09; say input done X`09bbcc`09r3, players, 60$`09; say this snake available X60$: X`09clrl`09score`5Br3`5D`09`09; zero score X`09clrl`09n_games`5Br3`5D`09`09; zero # of games played X80$: X`09blbc`09master, 100$`09`09; are we master snake ? X`09movb`09#1, abort`09`09; tell all other snakes to abort X`09clrb`09master_flag`09`09; say no master snake X`09$setef_s efn=#flag$v_read+64`09; wake everybody up X`09$setef_s efn=#flag$v_update+64 X`09$setef_s efn=#flag$v_endofgame+64 X`09$setef_s efn=#flag$v_synch+64 X`09$setef_s efn=#flag$v_game+64`09; for people waiting for a game X100$: X X;`09$qiow_s func=#io$_setmode, chan=ttchan, p1=ttmode ;reset terminal X X;`09clear screen and put out of graphics mode X`09callg`09text_end_game, snake_write X`09blbc`09abort, 200$`09`09; game is not being aborted --> 200$ X`09callg`09text_abort, snake_write X200$: X`09$deltva_s inadr=ret_range`09; delete global section X;`09$dassgn_s chan=snake_fab+fab$l_stv ; deassign channel X X`09ret X X`09 X`09.entry`09- XNAME_SET, `5Em X;+ X;`09CALL NAME_SET( name ) X;`09set this players name X;- X`09mull3`09#name_size, player, r3`09; get our player number (0-7) X`09addl2`09#13, r3`09`09`09; skip username X`09movc3`09#name_size-13, @4(ap), name(r3) ; store name in shared memory X`09ret X X`09.entry`09- XNAME_GET, `5Em X;+ X;`09CALL NAME_GET( name , player # ) X;`09returns the name of specified player (1-8) X;- X`09subl3`09#1, @8(ap), r1`09`09; get player number (0-7) X`09mull2`09#name_size, r1`09`09; offset to this players name X`09movc3`09#name_size, name(r1), @4(ap) ; return players name X`09ret X X`09.entry`09- XSCORE_SET, `5Em<> X;+ X;`09CALL SCORE_SET( player #, score , # games , # wins ) X;- Xplayer_arg = 4 Xscore_arg = 8 Xgames_arg = 12 Xwins_arg = 16 X`09subl3`09#1, @player_arg(ap), r1`09`09; get our player # (0-snake) X`09movl`09@score_arg(ap), score`5Br1`5D`09; store score X`09movl`09@games_arg(ap), n_games`5Br1`5D X`09movl`09@wins_arg(ap), wins`5Br1`5D X`09ret X X`09.entry`09- XSCORE_GET, `5Em<> X;+ X;`09CALL SCORE_GET( player , score , # games , # wins ) X;- X;player_arg = 4 X;score_arg = 8 X;games_arg = 12 X;wins_arg = 16 X`09subl3`09#1, @player_arg(ap), r1`09`09; get player # (0-snake) X`09movl`09score`5Br1`5D, @score_arg(ap)`09; return score X`09movl`09n_games`5Br1`5D, @games_arg(ap)`09; return # of games played X`09movl`09wins`5Br1`5D, @wins_arg(ap)`09`09; return # of wins X`09ret X X`09.entry`09- Xsnake_game_count, `5Em<> X;+ X;`09CALL SNAKE_GAME_COUNT( # games ) X;`09returns # of games played (total) X;- X`09movl`09game_count, @4(ap) X`09ret X X`09.end $ CALL UNPACK MQIXM.MAR;1 1312308785 $ v=f$verify(v) $ EXIT