-+-+-+-+-+-+-+-+ START OF PART 3 -+-+-+-+-+-+-+-+ X Dir_Y := 1; X end; X otherwise `7B Do Nothing Same Dir As Before `7D X end `7B Case `7D; X`09 If Not Died_This_Round`5BPLay`5D Then Begin X If Screen`5BPos_X,Pos_y`5D = '+' Then`20 X Buff_Pos_Char_1(Pos_X,Pos_Y,Screen`5BPos_x,Pos_Y`5D) X else begin`20 X If ( Ord(Screen`5BPos_X,Pos_Y`5D) = (Ord(Head_Sym`5Bplay`5D)- V128) ) Then Begin X Screen`5BPos_X ,Pos_Y `5D := ' '; X Buff_Pos_Char_1(Pos_X,Pos_Y,' '); X End Else Begin`20 X If Screen`5BPos_x,Pos_Y`5D = 'O' Then`20 X Buff_Pos_Char_1(Pos_X,Pos_Y,'O') X Else Begin `7B Must be In Another Player or blank `7D X Buff_Pos_Char_1(Pos_X,Pos_Y,Esc); X Buff_Char_1('C'); X End; X End; X End; X End; X `7B Given LAst Direction Or New Direction `7D X If ( Dir_X = -1*move_X`5Bplay`5D) and ( Dir_Y = -1*Move_Y`5Bplay`5D V) Then Begin X Dir_X := Move_X`5BPlay`5D; `7B Can't Reverse Your Direction `7D X Dir_Y := MOve_Y`5BPlay`5D; X end; X If Screen`5BPos_X + Dir_X , Pos_Y + Dir_Y `5D in `5B' ','O','+','1' V..'8'`5D Then Begin `20 X`09 `7B Going into a Blank square ok to move `7D X If Not Died_This_Round`5BPlay`5D Then Begin `7B Just Want TO Fir Ve Laser `7D X If Screen`5BPos_X + Dir_X , Pos_Y + Dir_Y `5D = '+' Then X Shields`5Bplay`5D := True X else X If Screen`5BPos_X + Dir_X , Pos_Y + Dir_Y `5D = '+' Then X Laser_Charge`5Bplay`5D := Laser_Charge`5Bplay`5D + 3; X Pos_X := Pos_X + Dir_X; X Pos_Y := Pos_Y + Dir_Y; X Move_X`5BPlay`5D := Dir_X; X Move_Y`5BPLay`5D := Dir_Y; X Head_X`5BPlay`5D := Pos_X; X Head_Y`5BPlay`5D := Pos_Y; X Draw_Head; X `09 If Not ( Screen`5BPos_X,Pos_Y`5D = 'O' ) Then`20 X Screen`5BPos_X,Pos_Y`5D := chr(Ord(Head_sym`5BPLay`5D)-12 V8); `7B Get Rid Of First Bit Set For Comparisons Later `7D X End `7B If Not Died_This_Round `7D ; X end else begin `7B You HAve Died Hit Into A Non Blank Square `7D X If Not Died_This_Round`5BPLay`5D Then Begin X Pos_X := Pos_X + Dir_X; X Pos_Y := Pos_Y + Dir_Y; X Move_X`5BPlay`5D := Dir_X; X Move_Y`5BPLay`5D := Dir_Y; X `09 Head_X`5BPlay`5D := Pos_X; X Head_Y`5BPlay`5D := Pos_Y; X If Screen`5BPos_X , Pos_Y `5D = 'x' Then Begin X Head_X`5Bplay`5D := Screen_Dim_X - Head_X`5Bplay`5D + 1; X If Pos_Y = Screen_Dim_Y Then`20 X Head_Y`5Bplay`5D := 2 X Else X Head_Y`5Bplay`5D := Screen_Dim_Y - 1; X`09`09 If not ( Screen`5BHead_X`5Bplay`5D,Head_Y`5Bplay`5D`5D = 'O') Then`2 V0 X Screen`5BHead_X`5Bplay`5D,Head_Y`5BPlay`5D`5D := `20 X chr(Ord(Head_sym`5BPLay`5D)-128);`20 X Buff_Pos_Char_1(Head_X`5BPlay`5D,Head_y`5Bplay`5D,Head_Sym V`5Bplay`5D); X end Else X If Screen`5BPos_X,Pos_Y`5D = 'q' Then Begin X Head_Y`5Bplay`5D := Screen_Dim_Y - Head_Y`5Bplay`5D + 1 V; X If Pos_X = Screen_Dim_X Then X Head_X`5Bplay`5D := 2 X Else X Head_X`5Bplay`5D := Screen_Dim_X - 1; X `09`09 If Not ( Screen`5BHead_X`5Bplay`5D,Head_Y`5Bplay`5D`5D = 'O V' ) Then`20 X Screen`5BHead_X`5Bplay`5D,Head_Y`5BPlay`5D`5D := `20 X chr(Ord(Head_sym`5BPLay`5D)-128);`20 X Buff_Pos_Char_1(Head_X`5BPlay`5D,Head_y`5Bplay`5D,Head_ VSym`5Bplay`5D); X End Else`20 X `09 player_Died(play,False); X End; X end; X end; Xend; X X Procedure Jump_Player( Play : Integer ); X X Begin X Head_X`5BPlay`5D := Init_Pos_X`5BRand`5Bplay`5D`5D; X Head_Y`5BPlay`5D := Init_Pos_Y`5BRand`5Bplay`5D`5D; X Move_X`5Bplay`5D := 0; X Move_Y`5Bplay`5D := 0; X If Head_Y`5BPlay`5D = (Screen_Dim_Y - 1 )Then`20 X Move_Y`5Bplay`5D := -1 X else X If Head_Y`5Bplay`5D = 2 Then`20 X Move_Y`5Bplay`5D := 1 X Else X If Head_X`5Bplay`5D = 2 THen X Move_X`5BPLay`5D := 1 X Else X Move_X`5BPlay`5D := -1; X responce`5Bplay`5D := chr(1); X end; X X begin X Move_Count := Move_Count + 1;`20 X remove_phaser;`20 X For PLay := 1 to Max_Player_Number Do Begin X Died_This_Round`5BPlay`5D := False; X end; X If Players_reMoving = 1 Then Begin `7B If 1 Then Loop Clockwise `7D X For Play := 1 to Max_Player_number do`20 X add_This_Players_head; X PLayers_ReMoving := 2; `7B Next Round Shall remove Even V Ones `7D X For Play := 1 to Max_Player_number do`20 X Fire_This_Players_Phaser; X end else`20 X If Players_removing = 2 Then Begin X For Play := Max_Player_Number downto 1 do`20 X add_This_Players_head; `7B Go Clockwise In Updatin Vg `7D X PLayers_ReMoving := 1; X For Play := Max_Player_Number downto 1 do`20 X Fire_This_Players_Phaser; `20 X end else Begin X If Players_removing < 0 Then Begin X Players_Removing := Players_removing + 1; X `09 For Num_Hazzards := 1 to Max_num_Hazzards do Begin X Repeat`20 X X := Gap_Around + trunc(Mth$Random(Seed)*(Screen_Dim_X-GaP V_around*2)) + 1; X until Not ( ( X = 2 ) or`20 X ( X = (Screen_Dim_X - 1)) or X ( X = ( Screen_Dim_x div 2 + 1 ) ) ); X repeat X Y := Gap_Around + trunc(Mth$Random(seed)*(Screen_Dim_Y-Gap V_Around*2)) + 1; X Until Not ( ( Y = ( Screen_Dim_Y div 2 )) or`20 X ( Y = 2 ) or`20 X ( Y = Screen_Dim_Y - 1 ) ) ; X`09 If Screen`5BX,y`5D = ' ' Then Begin X Screen`5BX,y`5D := 'X'; X Buff_Pos_Char_1(X,y,'X'); X End; X End; X For PLay := 1 to Max_PLayer_Number do`20 X If Not Quit`5BPLay`5D Then Begin X Move_X`5Bplay`5D := 0; X Move_Y`5BPLay`5D := 0; X If ( Head_Y`5BPLay`5D > ( Screen_Dim_Y Div 2 ) ) Then`20 X Move_Y`5BPlay`5D := -1 X Else X If ( Head_Y`5BPLay`5D < ( Screen_Dim_Y Div 2 ) ) Then`2 V0 X Move_Y`5BPLay`5D := 1 X Else `7B = `7D X If ( Head_X`5BPlay`5D > ( Screen_Dim_X Div 2 )) Then X Move_X`5BPlay`5D := -1 X else `7B < `7D`20 X Move_X`5BPlay`5D := 1; X end; X End Else Begin X Players_Removing := Players_removing + 1; X Sleep(1); X End; X end; X Num_Moved := 0; X For PLay := 1 to Max_Player_Number Do`20 X If ( Not Died`5Bplay`5D ) and ( Not Quit`5Bplay`5D ) Then Begin X Num_Moved := Num_Moved + 1; X If Died_This_Round`5BPLay`5D Then Begin X If Screen`5BHead_X`5Bplay`5D,Head_Y`5Bplay`5D`5D = ' ' Then`20 X Buff_Pos_Char_1(Head_X`5Bplay`5D,Head_Y`5BPlay`5D,' '); X If Shields`5BPlay`5D Then Begin X Shields`5Bplay`5D := False; X Jump_Player(play); X End Else Begin X Num_Moved := Num_Moved + 1; X Died`5BPlay`5D := True; X End; X End; X end; X If Num_Moved < Num_Moved_Last_Round Then`20 X Move_Count := 0; X If ( Num_Moved * Moves_Per_Player < Move_Count ) Then Begin X NUm_Moved := 0; X Buff_Char_3(Chr(7),Chr(7),Chr(7)); X For play := 1 to Max_Num_Players do`20 X If ( Not Quit`5Bplay`5D ) and`20 X ( Not Died`5Bplay`5D ) and X ( Not Died_This_Round`5Bplay`5D ) Then Begin X Shields`5Bplay`5D := False; X PLayer_Died(play,False); X end; X end; X Num_Moved_Last_Round := Num_Moved; X If Num_Moved_Last_Round <= 1 Then Begin `7B Ie There IS V Only 1 or 0 PLayers Left `7D X For PLay := 1 to Max_player_Number do Begin X`09If Not Quit`5BPlay`5D Then Begin X If ( Not Died`5BPLay`5D ) and ( Not Died_this_Round`5Bplay`5D ) V Then Begin X Score`5BPLay`5D := Score`5BPlay`5D + 100; `7B One Hundred V If You Last Left `7D X Games_Won`5BPLay`5D := Games_Won`5BPLay`5D + 1; X end; X Score_set(Play,Score`5BPlay`5D,Game`5BPlay`5D,Games_Won`5BPLay`5 VD); X end; X end; X Add_head := 0; `7B Return 0 To Stop The Game `7D X end else`20 X Add_Head := 1; `7B 1 To Continue `7D X Buff_Pos_char_1(23,40,chr(0)); X Break_Buff; `7B does not write the buffer just says To`20 X Write this buffer to all the players when add_head exits V `7D Xend `7B add_Head`7D; X X XProcedure Snake_PLay;extern; X X XBegin `7B Mainline `7D X LineLimit(Output,MaxInt); X Initalise_Mainline; X While True Do Begin X Initalise_Positions; `7B initalises Pos Only relavent for master V snake `7D X Snake_Play; `7B Calls Add_head with the Moves of the pla Vyers until add_head returns 1 ( end of game ) `7D X Draw_Scores; X Snake_Game_End; `7B Syncs all players Together `7D X end; X9999 :`20 X Writeln(esc,'<', esc, '`5B62;1"p' ); Xend. $ CALL UNPACK TANK.PAS;1 6822850 $ create 'f' X`1B`5BH`1B`5BJ`1B(B`1B`5B0m X`1B`5B1;1H`1B#3`1B`5B7m 3 `1B`5B0m MULTI-USER TANK `1B`5B7m 3 V `1B`5B2;1H`1B#4 3 `1B`5B0m MULTI-USER TANK `1B`5B7m 3 `20 X`1B`5B3;1H`1B#4`1B`5B3;13H`1B`5B0m`1B(0`60`60`60`60`60`60`60`60`60`60`60`60` V60`60`60`1B`5B5;1H`1B#6 C`1B(Bommands`1B`5B5;27HScoring`1B`5B6;1H`1B#6 `1B V(0oooooooo`1B`5B6;27Hooooooo X`1B`5B7;1Hlqqqqqqqwqqqqqqqwqqqqqqqk`1B`5B7;43Hlqqqqqqqqqqqqqqqqqqqqqqqqqqqqq Vqqqqqqqk`1B`5B8;1Hx x N`1B(Bo X`1B`5B8;13Hrth `1B(0x x `60 `1B(B- You `1B(0x `1B(Bo 64 points V for destroying tank. `1B(0x X`1B`5B9;1Hx 7 x 8 x 9 x`1B`5B9;43Hx `1B`5B9;80Hx`1B`5B10;1Hx V x x x 1`1B(B..8 - Ot X`1B`5B10;38Hhers `1B(0x `1B(Bo -1 points for firing laser. `1B(0x`1B`5B V11;1Htqqqqqqqnqqqqqqqnqqqqqqqu`1B`5B11;43H X`1B`5B11;43Hx`1B`5B11;80Hx`1B`5B12;1Hx x L`1B(Baser `1B(0x x X V`1B(B,x - Mines `1B(0x `1B(Bo 5 points for X`1B`5B12;60H destroying mines. `1B(0x`1B`5B13;1Hx 4 x 5 x 6 x`1 VB`5B13;43Hx`1B`5B13;80Hx X`1B`5B14;1Hx E`1B(Bast `1B(0x L`1B(Baser `1B(0x W`1B(Best `1B(0x `1B(B+ V - Shield `1B(0x `1B(Bo Mines kill immedia X`1B`5B14;66Htely.`1B`5B14;80H`1B(0x`1B`5B15;1Htqqqqqqqnqqqqqqqnqqqqqqqu `1B V`5B15;40H x `1B`5B15;80Hx X`1B`5B16;1Hx x x x O `1B(B- Base `1B(0x `1B(Bo On V first phaser hit, shield is `1B(0x X`1B`5B17;1Hx 1 x 2 x 3 x `1B`5B17;43Hx `1B(Blost.Retrieve by V passing over it`1B(0x X`1B`5B18;1Hx x S`1B(Bouth `1B(0x x `1B`5B7m `1B`5B0m V x `1B`5B18;80Hx`1B`5B19;1Hmqqqqqqqvqqqqqqqvqq X`1B`5B19;20Hqqqqqj `1B`5B7m `1B`5B0m x `1B(Bo Laser charges w Vith time. `1B(0x X`1B`5B20;43Hmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj`1B`5B21;1Hlqqqqqqqqqqqq M V`1B(Bessages `1B(0qqqqqqqqqqqqqqqk`20 X`1B`5B21;41H lqqqqqqqqqqqqq N`1B(Bame `1B(0qqqqqqqqqqqqqqqqqk`1B`5B22;1Hx`1 VB`5B22;39Hx x `1B(B*`1B(0`7E `1B`5B22;70H`7E* X`1B`5B22;72H x`1B`5B23;1Hmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj mq Vqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq`1B`5B1;1H X`1B`5B23;76H`1B`5B23;76Hqqqqj`1B`5B1;1H X`1B* $ CALL UNPACK TANK.SCN;1 759580851 $ create 'f' XC X`09SUBROUTINE`09HELP_SCREEN XC X`09PARAMETER ESC = 27 X`09CHARACTER Line*256 X BYte REP X`09INTEGER Len_Line,ErrNum XC X`09CALL image_dir() XC X Write(5,111)esc X111 Format(X,A1,'<') X1`09OPEN(UNIT=4,FILE='IMAGE_DIR:TANK.SCN',ReadOnly, X`091 STATUS='OLD',IoStat=ErrNum) X If (ERRNUM.EQ.30) Goto 50 X If (ERRNUM.NE.0 ) Goto 999 X100 READ(4,110,END=200) LEN_LINE, LINE(:LEN_LINE) X110 FORMAT(Q,A) X WRITE(5,120) LINE(:LEN_LINE) X120 FORMAT(1X,A) X GOTO 100 X200`09close (unit = 4) X999`09RETURN XC X50`09Write(5,51),Esc,Esc X51 FORMAT(X,A1,'`5B2J',A1,'`5B1;1HPlease wait...') X Call Sleep(4) X Goto 1 XC X END $ CALL UNPACK TANKH.FOR;1 656812248 $ create 'f' X`09.title`09TANKM Tank Game X X$$tank = 1`09`09`09; say that this is TANK game X X;+ X;`09or`09TANKM`09Tank Game X;`09if $$TANK is defined X;- X X`09$dibdef X`09$iodef X`09$qiodef X`09$secdef X`09$jpidef X;`09$ssdef Xesc`09`09= 27 X Xsnake`09`09= 8`09`09; number of snakes X X;`09meaning of event flags in cluster 2 X Xflag$v_master`09= 0`09`09; set if a master snake exists Xflag$v_read`09= 1`09`09; set if all snakes should read command Xflag$v_update`09= 2`09`09; set if all snakes should update screen Xflag$v_game`09= 3`09`09; set if game is in progress Xflag$v_endofgame= 4`09`09; set if we have reached the end of the game Xflag$v_synch`09= 5 Xflag$v_done`09= 8`09`09; set if operation (read,update) is complete X Xcheck_timer`09= 13`09`09; check timer id X X X`09.psect`09$rodata`09nowrt, noexe, shr, pic, long X Xttname_descr: X`09.ascid`09/TT/ X Xmbxcnv: X`09.ascid`09/_MBA!UW:/`09; convert mbx unit number to physical name X Xmbxbuf_descr: X`09.word`09mbxbuf_siz, 0 X`09.long`09mbxbuf X Xdibbuf_descr: X`09.word`09dib$k_length, 0 X`09.long`09dibbuf X X`09.align long Xsnake_desc_2: X.if ndf $$tank X`09.ascid`09/SNAKE_1/`09`09; name of snake event flags X.iff X`09.ascid`09/TANK_1/ X.endc X X`09.align`09long Xsnake_map_name: X.if ndf $$tank X`09.ascid`09/SNAKE_DATA/ X.iff X`09.ascid`09/TANK_DATA/ X.endc X Xtext = . X`09.ascii`09'<'`09`09; enter ANSI mode X`09.ascii`09'(B'`09`09; select ascii character set X`09.ascii`09'`5B2J'`09`09; erase entire screen +-+-+-+-+-+-+-+- END OF PART 3 +-+-+-+-+-+-+-+-