-+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+ X If Max_player_number = 0 Then`20 X Max_player_number := play ;`7B The Highest Numbered Player `7D X end else begin X Quit`5BPlay`5D := True; `7B Bit Not Set Not Playing ie Quit `7D X end; X Mult := Mult div 2; Xend; X XNum_Moved_Last_Round := 0; X X`7B If You are PLaying Then You Havnt Died `7D XFor Play := 1 to Max_Num_Players Do Begin X If Not Quit`5BPlay`5D Then Begin X Died`5BPlay`5D := False; X Num_Moved_Last_Round := Num_Moved_Last_Round + 1; X end else X Died`5Bplay`5D := True; X responce`5BPlay`5D := ' '; `7B Initalise First Responce Should Not BE N Veeded `7D Xend; XMove_Count := 0; XFor PLay := 1 to Max_Num_PLayers do`20 X Game`5BPLay`5D := Game`5BPLay`5D + 1; XFor X := 1 To Screen_Dim_X do`20 X For Y := 1 to Screen_Dim_Y do X Screen`5BX,y`5D := ' '; XFor Y := 1 To Screen_Dim_Y do Begin X Screen`5B1,Y`5D := 'q'; X Screen`5BScreen_Dim_X,Y`5D := 'q'; Xend; XFor X := 1 To Screen_Dim_X Do Begin X Screen`5BX,1`5D := 'x'; X Screen`5BX,Screen_Dim_Y`5D := 'x';`20 Xend; XScreen`5B1,1`5D := 'l'; XScreen`5B1,Screen_Dim_Y`5D := 'k'; XScreen`5BScreen_Dim_X,1`5D := 'm'; XScreen`5BScreen_Dim_X,Screen_Dim_y`5D := 'j'; XHead_Sym`5B1`5D := chr(128+ord('1')); `7B Set The Bits In The Chars `7D XHead_Sym`5B2`5D := chr(128+ord('2')); XHead_Sym`5B3`5D := chr(128+ord('3')); XHead_Sym`5B4`5D := chr(128+ord('4')); XHead_Sym`5B5`5D := chr(128+ord('5')); XHead_Sym`5B6`5D := chr(128+ord('6')); XHead_Sym`5B7`5D := chr(128+ord('7')); XHead_Sym`5B8`5D := chr(128+ord('8')); X XFor Play := 1 to Max_Num_PLayers do`20 X Screen`5BHead_X`5BPlay`5D,Head_Y`5BPlay`5D`5D := 'O'; X`7B Note If This Procedure Is Only Called When You Are Master Snake`20 X Draw Screen Should Be In The Mainlkine Before Init_Pos X And The Writing Of The PLayers Pos Should Be To The Buffer`20 X And Then Written To All Who Are PLaying `7D X XDraw_screen; `20 X X`7B Pos Inital Player Positions `7D XFor Play := 1 to Max_Num_PLayers do `20 X If ( Not Quit`5BPlay`5D ) and ( Play <> You ) Then `20 X Writeln(at(Head_X`5BPlay`5D,Head_Y`5BPlay`5D),Head_sym`5BPlay`5D) X Else`20 X If Play = You Then`20 X Writeln(at(Head_X`5BYou`5D,Head_Y`5BYou`5D),'`60') X Else`20 X Writeln(at(Head_X`5Bplay`5D,Head_Y`5BPlay`5D),'O'); XSleep(1); Xend; X XProcedure Initalise_Mainline; X XVar Zero,Init_Rep,PLay,Name_Pos,Game_Going : Integer; X XProcedure Verify_name(VAr Name : Name_Line ); X XVar I : INteger; X X XBegin X For I := 1 to Max_Name_length do `7B Remove All Invalid Chars From The V Name`7D X If ( Name`5Bi`5D < ' ' ) Then Begin X Write(chr(7)); X Name`5Bi`5D := ' '; X end; Xend; X X XBegin X Esc := Chr(27); X Back_Space := CHr(8); X Line_Feed := Chr(10); X Up_Line := 'A' `7B Used With A For Move up One Line `7D; X Seed := Clock; X TT_Len := 0; X `20 X X `7B set where Each Player Starts `7D X X Init_Pos_X`5B1`5D := 2; X Init_Pos_Y`5B1`5D := 2; X `20 X Init_Pos_X`5B2`5D := Screen_dim_x - 1; X Init_Pos_Y`5B2`5D := Screen_dim_Y - 1; X `20 X Init_Pos_X`5B3`5D := 2; X Init_Pos_Y`5B3`5D := Screen_dim_y - 1; X `20 X Init_Pos_X`5B4`5D := Screen_dim_x - 1; X Init_Pos_Y`5B4`5D := 2; X `20 X Init_Pos_X`5B5`5D := 2; X Init_Pos_Y`5B5`5D := Screen_dim_Y div 2; X `20 X Init_Pos_X`5B6`5D := Screen_dim_x - 1 ; X Init_Pos_Y`5B6`5D := Screen_dim_Y div 2; X `20 X Init_Pos_X`5B7`5D := Screen_dim_x div 2 + 1; X Init_Pos_Y`5B7`5D := 2; X `20 X Init_Pos_X`5B8`5D := Screen_dim_x div 2 + 1; X Init_Pos_Y`5B8`5D := Screen_dim_Y - 1; X X Writeln(Esc,'<'); `7B Vt52 Mode `7D X Writeln(Esc,'`5B1;1H',Esc,'`5BJ'); `7B Clear Screen `7D X Init_rep := Snake_Init(You,Game_going); X You := You + 1; `20 X If Init_rep = 1 Then Begin X `7B you are the First Person to play zero all the scores `7D X For Play := 1 to Max_Num_PLayers do begin X Zero := 0; X Score_Set(Play,Zero,zero,zero); X end; X Help_Screen; X Writeln(esc,'`5B1;1H',Esc,'`5B?2l'); X Writeln(at(22,3),' Please Enter Your Name Player #',You:1); X Write(at(22,51)); X Readln(Name`5BYou`5D); X Verify_Name(Name`5BYou`5D); X Name_set(Name`5BYou`5D); X Write(at(22,3), ' Hit < Return > When Others Ready '); X Readln; X Writeln; X Write(at(22,3), ' Please Wait For Game To Start '); X Writeln; X end Else Begin X If You = 0 Then Begin X Writeln(esc,'`5B1;18H',Esc,'#3TANK'); X Writeln(esc,'`5B2;18H',Esc,'#4TANK'); X Writeln(esc,'`5B4;8H' ,Esc,'#6 Sorry No Tanks Available'); X`09 Sleep(3); X goto 9999; X end else begin `7B Init_rep = 0 `7D`20 X Help_Screen; X Writeln(esc,'`5B1;1H',Esc,'`5B?2l'); X Writeln(at(22,3),' Please Enter Your Name Player # ',You:1); X Write(at(22,51)); X Readln(Name`5BYou`5D); X Verify_name(Name`5BYou`5D); X Name_set(Name`5BYou`5D); X Writeln; X Write(at(22,3), ' Please Wait For Game To Start '); X Writeln; X If Game_Going = 1 Then`20 X Snake_Game_End; X end; X end; X Game`5BYou`5D := 0; Xend `7B Initalise Mainline `7D; X X`5BGLOBAL`5D Function Add_head( Var Responce : Player_responce ):Integer; X Xconst Max_num_Hazzards = 32; X Moves_Per_Player = 75; X Gap_Around = 1; X XVar Play, Dir_X, num_Moved, Dir_Y, Pos_x, Pos_Y ,X,Y,Num_Hazzards : Integer; X Died_This_Round`09`09`09`09`09 : Died_TYpe; X XProcedure Remove_Phaser; X Xvar X,y,play : Integer; X Xbegin XFor Play := 1 to max_num_players do Begin X If Fired`5Bplay`5D Then begin X Buff_Pos(Start_X`5BPlay`5D,Start_Y`5BPLay`5D); X IF Start_X`5Bplay`5D = End_X`5Bplay`5D Then Begin `7B Right Or L VEft `7D X If Start_Y`5Bplay`5D < End_y`5BPlay`5D Then `7B Right `7D X For Y := start_y`5Bplay`5D to End_Y`5Bplay`5D do begin X Buff_Char_1(' '); X end X Else `7B Left `7D X For Y := start_y`5Bplay`5D downto End_Y`5Bplay`5D do begin X Buff_Char_3(' ',Back_space,Back_Space); X end; X End Else Begin `7B Up or Down `7D X Y := Start_Y`5BPLay`5D; X If Start_X`5Bplay`5D < End_X`5BPlay`5D Then `7B Down `7D X For X := start_X`5Bplay`5D to End_X`5Bplay`5D do Begin X Buff_Char_3(' ',Back_Space,Line_Feed); X End X Else `7B Up `7D X For X := start_X`5Bplay`5D downto End_X`5Bplay`5D do begin X`09 Buff_Char_3(' ',Esc,Up_Line); X Buff_Char_1(Back_Space); X end; X end; X Fired`5Bplay`5D := False; X End; Xend; `20 Xend; X XProcedure Player_Died(play : Integer; By_Phaser_Shot : Boolean); X XBegin X If Not Died_This_round`5Bplay`5D Then begin X Died_This_Round`5BPlay`5D := True; X If ( Not Shields`5Bplay`5D ) or ( Not By_Phaser_Shot ) Then Begin X Buff_Pos_Char_1(Head_X`5BPlay`5D,Head_Y`5BPLay`5D,'*'); X Screen`5BHead_X`5BPlay`5D,Head_Y`5BPlay`5D`5D := ' '; `7B Revo Vve Player Form Screen So Can't Die Again `7D X If Not Shields`5Bplay`5D Then Begin X If Num_PLayers <> Num_Moved_Last_Round Then `20 X Score`5BPlay`5D := Score`5BPlay`5D +`20 X (( Num_PLayers - Num_Moved_Last_Round + 1 )**2 * 100 ) V`20 X div ( NUm_Players**2); X Snake_Dead(play);`20 X End; X End Else Begin X Buff_Pos_Char_1(Head_X`5BPlay`5D,Head_Y`5BPLay`5D,'+'); X Screen`5BHead_X`5BPlay`5D,Head_Y`5BPlay`5D`5D := '+'; `7B Revo Vve Player Form Screen So Can't Die Again `7D X End; X End; Xend; X XProcedure Fire_Phaser(Dir_x,Dir_y,Pos_x,Pos_Y,play: Integer); X XConst Max_Len_shot = 10; X X XVar at_x,at_y,len_shot,Max_Len_this_Shot: Integer; X XProcedure Check_end_of_Shot; X XConst Points_For_Killing = 64; X XBegin X Case Screen`5Bat_x,At_Y`5D of X '1','2','3','4', X '5','6','7','8' : Begin X Score`5BPlay`5D := Score`5BPlay`5D + Points_for_K Villing; X PLayer_died(Ord(Screen`5Bat_x,at_y`5D) - Ord('0') V,True); X end; X 'X'`09 :`20 X`09`09`09 Begin X Buff_Char_3(Esc,'G','x'); X Buff_char_1(Esc); X Buff_char_1('F'); X Screen`5Bat_x,At_Y`5D := 'H'; X Score`5BPlay`5D := Score`5BPLay`5D + 2; X`09 end; X 'H'`09 : Begin X Buff_char_1(' '); X Screen`5Bat_x,At_Y`5D := ' '; X Score`5BPlay`5D := Score`5Bplay`5D + 3; X end; X otherwise `7B Nothing `7D; X end `7B Case `7D XEnd; X X XBegin X If Laser_Charge`5BPlay`5D >= Max_Len_Shot Then begin X Max_Len_This_Shot := Max_len_Shot; X Laser_Charge`5Bplay`5D := Laser_charge`5Bplay`5D - Max_len_Shot; X end Else begin X Max_Len_This_Shot := Laser_Charge`5Bplay`5D; X Laser_Charge`5Bplay`5D := 0; X end; X Fired`5Bplay`5D := True; X Case (( Dir_X + 1 ) + ( Dir_Y+1)*4 ) of`20 X `7B Right `7D`20 X 9 : Begin X at_X := Pos_X; X at_Y := Pos_Y + 1; X Start_X`5Bplay`5D := at_X; X Start_Y`5Bplay`5D := at_Y; X Len_Shot := 0; X `09 Buff_Pos(at_x,At_Y); X While ( Screen`5Bat_X,At_Y`5D = ' ' ) and ( Len_shot < Max_Len_This V_Shot ) do begin X Buff_Char_1('q'); X Len_shot := Len_shot + 1; X at_y := at_y + 1; X end; X Check_End_Of_Shot; X End_X`5BPlay`5D := At_X; X End_Y`5BPlay`5D := At_Y-1; X end; X `7B Left `7D X 1 : Begin X at_X := Pos_X; X at_y := Pos_Y - 1; X Start_X`5Bplay`5D := at_X; X Start_Y`5Bplay`5D := at_Y; X Len_Shot := 0; X Buff_Pos(at_x,at_Y); X While ( Screen`5Bat_X,At_Y`5D = ' ' ) and ( Len_shot < Max_Len_This V_Shot ) do begin X Buff_Char_3('q',Back_space,Back_Space); X Len_shot := Len_shot + 1; X at_y := at_y - 1; X end; X`09 Check_End_Of_Shot; X End_X`5BPlay`5D := At_X; X End_Y`5BPlay`5D := At_Y+1; X end; X `7B Up `7D X 4 : Begin X at_X := Pos_X - 1 ; X at_y := Pos_Y; X Start_X`5Bplay`5D := at_X; X Start_Y`5Bplay`5D := at_Y; X Len_Shot := 0; X Buff_Pos(at_X,at_Y); X While ( Screen`5Bat_X,At_Y`5D = ' ' ) and ( Len_shot < Max_Len_This V_Shot ) do begin X Buff_Char_3('x',esc,Up_Line); X Buff_Char_1(Back_Space); X Len_shot := Len_shot + 1; X at_x := at_x - 1; X end; X`09 Check_End_Of_Shot; X End_X`5BPlay`5D := At_X+1; X End_Y`5BPlay`5D := At_Y; X end; X `7B Down `7D X 6 : Begin X at_X := Pos_X + 1 ; X at_y := Pos_Y; X Start_X`5Bplay`5D := at_X; X Start_Y`5Bplay`5D := at_Y; X Len_Shot := 0; X`09 Buff_Pos(at_x,at_Y); X While ( Screen`5Bat_X,At_Y`5D = ' ' ) and ( Len_shot < Max_Len_This V_Shot ) do begin X Buff_Char_3('x',Back_Space,Line_Feed); X Len_shot := Len_shot + 1; X At_x := At_x + 1; X end; X`09 Check_End_Of_Shot; X End_X`5BPlay`5D := At_X - 1; X End_Y`5BPlay`5D := At_Y; X end; X end `7Bcase`7D; X If Len_Shot = 0 Then`20 X Fired`5Bplay`5D := False; Xend; `20 X XProcedure Fire_This_players_Phaser; X XBegin X If (( Ord(Responce`5Bplay`5D) > 16 ) Or ( Ord(responce`5BPlay`5D) = 5 )) V and`20 X ( Not Died`5BPlay`5D ) `7B Could Of Died By Hitting Wall `7D Then Begi Vn X Score`5BPlay`5D := Score`5BPlay`5D - 1; X responce`5Bplay`5D := Chr(1); `7B Change Responce So Does Not Kee Vp On Firing `7D X Fire_Phaser(Move_X`5Bplay`5D,Move_Y`5Bplay`5D,Head_X`5Bplay`5D,Head_Y` V5Bplay`5D,Play); `20 X end; Xend; X X XProcedure Add_This_Players_Head; X Xvar Player_On : integer; X XProcedure Draw_Head; X XBegin XCase ( Dir_X + 1 ) + ( Dir_Y + 1)*4 of`20 X 6 `7B Down `7D : Buff_Char_3(Back_Space,Line_Feed,Head_Sym`5Bplay`5D); X 9 `7B Right`7D : Buff_Char_1(Head_sym`5BPlay`5D); X 1 `7B Left `7D : Buff_Char_3(Back_space,Back_space,Head_sym`5Bplay`5D); X 4 `7B Up `7D : Begin X Buff_Char_3(Esc,Up_Line,Back_Space); X Buff_Char_1(Head_sym`5BPlay`5D); X End; X End`7BCase`7D; Xend; X Xbegin X If Not Quit`5BPlay`5D And (Ord(Responce`5BPLay`5D) = 0 ) Then begin X Died`5BPLay`5D := True; `7B If PLayer quit Then`20 X Quit`5BPLay`5D := True; Initalise all Variables `7D X Game`5BPlay`5D := 0; X Score`5BPlay`5D := 0; X Games_Won`5BPLay`5D := 0; X Score_Set(Play,Score`5BPlay`5D,Game`5BPLay`5D,Games_Won`5BPLay`5D); X end else`20 X If Not Died`5BPlay`5D Then Begin X Laser_Charge`5Bplay`5D := Laser_Charge`5Bplay`5D + 1; `20 X Dir_X := Move_X`5BPlay`5D; X Dir_Y := Move_Y`5BPLay`5D; X`09 Pos_X := Head_X`5BPlay`5D; X Pos_Y := Head_Y`5BPlay`5D; X `7B Change Direction Of The Position You Move To is Not A Wall ie = V '.' `7D X Case Ord(responce`5BPlay`5D) Mod 16 Of`20 X 8 : If Not ( Screen`5BPos_x-1,Pos_Y`5D in `5B'X','H','q','x'`5D V ) Then Begin X Dir_X := -1 ; X Dir_Y := 0 ; `7B Moving Up `7D X end; X 2 : If Not ( Screen`5BPos_X+1,Pos_Y`5D in `5B'X','H','q','x'`5D V ) Then Begin X Dir_X := 1; X Dir_Y := 0; `7B Moving Down `7D X end; X 4 : If Not ( Screen`5BPos_X,Pos_Y-1`5D in `5B'X','H','q','x'`5D V ) Then Begin X Dir_X := 0; `7B Moving Left `7D X Dir_Y := -1; X end; X 6 : If Not ( Screen`5BPos_X,Pos_Y+1`5D in `5B'X','H','q','x'`5D V ) Then Begin X Dir_X := 0; `7B Moving Right `7D +-+-+-+-+-+-+-+- END OF PART 2 +-+-+-+-+-+-+-+-