-+-+-+-+-+-+-+-+ START OF PART 2 -+-+-+-+-+-+-+-+ X smg$create_virtual_display(4,33,disp`5B5`5D,smg$m_border); X smg$paste_virtual_display(disp`5B5`5D,paste,2,2); X exist := true; X end; X smg$put_line(disp`5B5`5D,line,,,,smg$m_wrap_word); X end else begin X smg$delete_virtual_display(disp`5B5`5D); X exist := false; X end; Xend; X Xprocedure winner; Xvar X scorestr : varstr := ' '; Xbegin X smg$create_virtual_display(22,78,disp`5B1`5D); X smg$create_pasteboard(paste); X smg$set_cursor_mode(paste,smg$m_cursor_off); X smg$set_broadcast_trapping(paste); X smg$paste_virtual_display(disp`5B1`5D,paste,2,2); X if (myscore > yourscore) then begin X smg$put_chars_highwide(disp`5B1`5D,me.city,2,20,smg$m_blink); X smg$put_chars_highwide(disp`5B1`5D,me.name,4,20,smg$m_blink); X smg$put_chars_highwide(disp`5B1`5D,you.city,14,20); X smg$put_chars_highwide(disp`5B1`5D,you.name,16,20); X convert(myscore,scorestr,xlen); X smg$put_chars_highwide(disp`5B1`5D,scorestr,4,8,smg$m_blink); X convert(yourscore,scorestr,xlen); X smg$put_chars_highwide(disp`5B1`5D,scorestr,16,8); X end else if (yourscore > myscore ) then begin X smg$put_chars_highwide(disp`5B1`5D,you.city,2,20,smg$m_blink); X smg$put_chars_highwide(disp`5B1`5D,you.name,4,20,smg$m_blink); X smg$put_chars_highwide(disp`5B1`5D,me.city,14,20); X smg$put_chars_highwide(disp`5B1`5D,me.name,16,20); X convert(yourscore,scorestr,xlen); X smg$put_chars_highwide(disp`5B1`5D,scorestr,4,8,smg$m_blink); X convert(myscore,scorestr,xlen); X smg$put_chars_highwide(disp`5B1`5D,scorestr,16,8); X end else begin X smg$put_chars_highwide(disp`5B1`5D,me.city,2,20,smg$m_blink); X smg$put_chars_highwide(disp`5B1`5D,me.name,4,20,smg$m_blink); X smg$put_chars_highwide(disp`5B1`5D,you.city,14,20,smg$m_blink); X smg$put_chars_highwide(disp`5B1`5D,you.name,16,20,smg$m_blink); X convert(yourscore,scorestr,xlen); X smg$put_chars_highwide(disp`5B1`5D,scorestr,4,8,smg$m_blink); X convert(myscore,scorestr,xlen); X smg$put_chars_highwide(disp`5B1`5D,scorestr,16,8,smg$m_blink); X end; X lib$wait(7.5); X smg$set_cursor_mode(paste,smg$m_cursor_on); X smg$delete_virtual_display(disp`5B1`5D); X smg$delete_pasteboard(paste); Xend; X Xprocedure teamlight; Xbegin X if (mestart) then begin X smg$put_chars(disp`5B1`5D,me.city,1,9,,smg$m_bold); X smg$put_chars(disp`5B1`5D,me.name,2,9,,smg$m_bold); X smg$put_chars(disp`5B1`5D,you.city,4,9); X smg$put_chars(disp`5B1`5D,you.name,5,9); X end else begin X smg$put_chars(disp`5B1`5D,me.city,1,9); X smg$put_chars(disp`5B1`5D,me.name,2,9); X smg$put_chars(disp`5B1`5D,you.city,4,9,,smg$m_bold); X smg$put_chars(disp`5B1`5D,you.name,5,9,,smg$m_bold); X end; Xend; X Xprocedure printscore; Xvar X str1, str2 : varying`5B6`5D of char; Xbegin X writev(str1, myscore:0); X writev(str2, yourscore:0); X if (mestart) then begin X smg$put_chars(disp`5B1`5D,str1,2,2,,smg$m_bold); X smg$put_chars(disp`5B1`5D,str2,5,2); X end else begin X smg$put_chars(disp`5B1`5D,str1,2,2); X smg$put_chars(disp`5B1`5D,str2,5,2,,smg$m_bold); X end; Xend; `20 X Xprocedure place (loc: integer); Xbegin X smg$put_chars(disp`5B2`5D,'0',8,cv(loc),,smg$m_bold) Xend; X Xprocedure restore (loc: integer); Xbegin X case (loc) of X 0,10,20,30,40,50,60,70,80,90,100: X smg$draw_line(disp`5B2`5D,7,cv(loc),8,cv(loc)); X otherwise X smg$put_chars(disp`5B2`5D,' ',8,cv(loc)); X end; Xend; X`20 Xprocedure menu_select(num: integer; var option: integer); Xvar X choice : $uword; Xbegin X if (num=1) then begin X smg$create_virtual_display(max_of,25,disp`5B3`5D,smg$m_block_border); X smg$paste_virtual_display(disp`5B3`5D,paste,9,27); X smg$create_menu(disp`5B3`5D,%descr of_table,smg$k_vertical); X end else if (num=2) then begin X smg$create_virtual_display(max_op,25,disp`5B3`5D,smg$m_block_border); X smg$paste_virtual_display(disp`5B3`5D,paste,9,27); X smg$create_menu(disp`5B3`5D,%descr op_table,smg$k_vertical); X end else if (num=3) then begin X smg$create_virtual_display(max_df,25,disp`5B3`5D,smg$m_block_border); X smg$paste_virtual_display(disp`5B3`5D,paste,9,27); X smg$create_menu(disp`5B3`5D,%descr df_table,smg$k_vertical); X end else if (num=4) then begin X smg$create_virtual_display(max_dp,25,disp`5B3`5D,smg$m_block_border); X smg$paste_virtual_display(disp`5B3`5D,paste,9,27); X smg$create_menu(disp`5B3`5D,%descr dp_table,smg$k_vertical); X end; X smg$select_from_menu(keyb,disp`5B3`5D,choice,,,%descr helplib,,,,smg$m_bol Vd); X smg$delete_virtual_display(disp`5B3`5D); X option := choice; Xend; X Xprocedure create_screen; Xvar X yrdstr : varstr := ' '; Xbegin X smg$create_virtual_display(6,78,disp`5B1`5D); X smg$create_virtual_display(15,77,disp`5B2`5D,smg$m_block_border); X smg$create_pasteboard(paste); X smg$create_virtual_keyboard(keyb); X smg$set_cursor_mode(paste,smg$m_cursor_off); X smg$set_broadcast_trapping(paste); X smg$paste_virtual_display(disp`5B1`5D,paste,2,2); X smg$paste_virtual_display(disp`5B2`5D,paste,9,2); X X smg$put_chars(disp`5B1`5D,me.city,1,9); X smg$put_chars(disp`5B1`5D,me.name,2,9); X smg$put_chars(disp`5B1`5D,you.city,4,9); X smg$put_chars(disp`5B1`5D,you.name,5,9); X smg$put_chars(disp`5B1`5D,'0',2,2); X smg$put_chars(disp`5B1`5D,'0',5,2); X X for i := 1 to 77 do begin X if (odd(i)) then begin X smg$put_chars(disp`5B2`5D,'_',5,i); X smg$put_chars(disp`5B2`5D,'_',10,i); X end else begin X smg$put_chars(disp`5B2`5D,' ',5,i); X smg$put_chars(disp`5B2`5D,' ',10,i); X end; X end; X smg$draw_line(disp`5B2`5D,1,9,15,9); X smg$put_chars(disp`5B2`5D,'G',14,8); X for i := 1 to 9 do begin X smg$draw_line(disp`5B2`5D,1,9+i*6,15,9+i*6); X if (i<6) then X convert(i,yrdstr,xlen) X else X convert(10-i,yrdstr,xlen); X smg$put_chars(disp`5B2`5D,yrdstr,14,cv(i*10-1)); X smg$put_chars(disp`5B2`5D,chr(48),14,cv(i*10+1)); X end; X smg$draw_line(disp`5B2`5D,1,69,15,69); X smg$put_chars(disp`5B2`5D,'G',14,70); Xend; X Xfunction pid_check (pid : unsigned): boolean; Xvar X sysstatus : integer := 1; X dummy : unsigned := 1; Xbegin X sysstatus := lib$getjpi(jpi$_pid,pid,,dummy); X case (sysstatus) of X ss$_nopriv : pid_check := true; `7B Process exists, no privilege to v View `7D X ss$_nonexpr : pid_check := false; `7B Process no longer exists `7D X ss$_normal : pid_check := true; `7B Process exists, privilege to view V `7D X otherwise X lib$signal(sysstatus); X end; Xend; X Xprocedure initiate; Xvar X master_pid : unsigned; X hudstr : packed array `5B1..1`5D of char; Xbegin X writeln(chr(27)+'`5B2J'+chr(27)+'`5B1;1H'); X lib$get_foreign(you.userid,,alen); X if ((alen = 0) or (you.userid = ' ')) then begin X repeat X lib$get_input(you.userid,'What is the username of your opponent? ',ale Vn); X until ((alen > 0) and (you.userid <> ' ')); X if (not(odd($asctoid(you.userid,,)))) then X lib$signal(iaddress(football_baduser)); X end; X lib$getjpi(jpi$_username,,,,me.userid); X lib$getjpi(jpi$_master_pid,,,master_pid); X lib$getjpi(jpi$_pid,,,me.pid); X str$upcase(you.userid,you.userid); X str$upcase(me.userid,me.userid); X if (master_pid = me.pid) then lib$signal(iaddress(football_notspawn)); X if (you.userid = me.userid) then lib$signal(iaddress(football_lonely)); X X (* Open the playerfile and write your record *) X X open(playfile, boothfile, history := unknown, access_method := keyed, X organization := indexed, record_type := fixed, X sharing := readwrite, user_action := rms_open); X lib$get_input(%descr me.city,%stdescr 'What city is your team from? '); X lib$get_input(%descr me.name,%stdescr 'What is the name of your team? '); X str$upcase(me.name,me.name); X str$upcase(me.city,me.city); X writeln(' '); X me.formation := 0; X me.play := 0; X me.count := 0; X me.time := gametime; X me.pos := 0; X me.gained := 0; X me.quarter := 1; X me.down := 1; X me.iswaiting := true; X me.dir := true; X rbf := iaddress(me); X rmsstatus := rms_put(pas$rab(playfile)`5E); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X X (* Get the other player's record from the player file *) X X kbf := iaddress(you.userid); X ubf := iaddress(you); X rmsstatus := rms_get(pas$rab(playfile)`5E,false); X if (rmsstatus = rms$_rnf) then begin X repeat X lib$wait(4.0); X wait := wait + 1; X rmsstatus := rms_get(pas$rab(playfile)`5E,false); X until ((odd(rmsstatus)) or (wait >= 10)); X end; X X (* The other player's record was not found - timeout period reached *) X X if (not(odd(rmsstatus))) then begin X`20 X (* Delete my record *) X X kbf := iaddress(me.userid); X ubf := iaddress(me); X rmsstatus := rms_get(pas$rab(playfile)`5E,true); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X rmsstatus := rms_delete(pas$rab(playfile)`5E); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X lib$signal(iaddress(football_absent)); X end; X X (* Other player's record was found - check to see if current *) X X if (not(pid_check(you.pid))) then begin X X (* Delete my record *) X X kbf := iaddress(me.userid); X ubf := iaddress(me); X rmsstatus := rms_get(pas$rab(playfile)`5E,true); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X rmsstatus := rms_delete(pas$rab(playfile)`5E); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X X (* Delete other record *) X X kbf := iaddress(you.userid); X ubf := iaddress(you); X rmsstatus := rms_get(pas$rab(playfile)`5E,true); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X rmsstatus := rms_delete(pas$rab(playfile)`5E); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X lib$signal(iaddress(football_badrecord)); X end; X X (* Other player unghosted - is he playing or waiting to play? *) X X if (not(you.iswaiting)) then begin X X (* Delete my record *) X X kbf := iaddress(me.userid); X ubf := iaddress(me); X rmsstatus := rms_get(pas$rab(playfile)`5E,true); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X rmsstatus := rms_delete(pas$rab(playfile)`5E); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X lib$signal(iaddress(football_playing)); X end; X X (* The other player is waiting for me - set his ISWAITING to false *) X X kbf := iaddress(you.userid); X ubf := iaddress(you); X rmsstatus := rms_get(pas$rab(playfile)`5E,true); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X you.iswaiting := false; X rmsstatus := rms_update(pas$rab(playfile)`5E); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X X (* One of these people has to go first - compare entry times *) X X if (you.pid > me.pid) then X istarted := true X else X istarted := false; X if (istarted) then begin X kbf := iaddress(me.userid); X ubf := iaddress(me); X rmsstatus := rms_get(pas$rab(playfile)`5E,true); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X mestart := true; X me.first := true; X rmsstatus := rms_update(pas$rab(playfile)`5E); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X end else begin X kbf := iaddress(me.userid); X ubf := iaddress(me); X rmsstatus := rms_get(pas$rab(playfile)`5E,true); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X you.first := true; X rmsstatus := rms_update(pas$rab(playfile)`5E); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X end; X X (* Find out each player's offensive strategy *) X X writeln('OFFENSIVE STRATEGIES'); X writeln; X writeln('1) No huddle (very long game)'); X writeln('2) Short huddle (long game)'); X writeln('3) Regular huddle (short game)'); X writeln('4) Long huddle (very short game)'); X writeln; X repeat `20 X lib$get_input(hudstr,'Choice> ',alen); X readv(hudstr,huddle,error:=continue); X until (statusv = 0) and (huddle >= 1) and (huddle <= 4); X writeln; X X writeln('TEAM STRENGTH'); X writeln; X writeln('1) running'); X writeln('2) passing'); X writeln; X repeat `20 X lib$get_input(hudstr,'Choice> ',alen); X readv(hudstr,huddle,error:=continue); X until (statusv = 0) and (huddle >= 1) and (huddle <= 2); X if (huddle = 1) then X running := true X else if (huddle = 2) then X passing := true; X writeln; X X (* Coin toss - means absolutely nothing, and is totally fake *) X`20 X if (rnd(100) > 50) then X writeln('Heads has won the toss, I think.') X else X writeln('Tails has won the toss, I think.'); X if (mestart) then begin X ctrim(me.city,alen); X writeln(substr(me.city,1,alen)+' will receive the ball first!'); X end else begin X ctrim(you.city,alen); X writeln(substr(you.city,1,alen)+' will receive the ball first!'); X end; X lib$wait(3.0); Xend; X Xprocedure finitiate; Xbegin X kbf := iaddress(me.userid); X ubf := iaddress(me); X rmsstatus := rms_get(pas$rab(playfile)`5E,true); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X rmsstatus := rms_delete(pas$rab(playfile)`5E); X if (not(odd(rmsstatus))) then lib$signal(rmsstatus); X smg$set_cursor_mode(paste,smg$m_cursor_on); X smg$delete_virtual_keyboard(keyb); X smg$delete_virtual_display(disp`5B1`5D); X smg$delete_virtual_display(disp`5B2`5D); X smg$delete_pasteboard(paste); X close(playfile); Xend; X Xprocedure statcard; Xvar X xstr : varstr; Xbegin X convert(gtime,xstr,xlen); X if (gtime >= 1000) then X xstr := substr(xstr,1,2)+'.'+substr(xstr,3,2) X else if (gtime >= 100) then X xstr := ' '+substr(xstr,1,1)+'.'+substr(xstr,2,2) X else if (gtime >= 10) then X xstr := ' .'+xstr X else X xstr := ' .0'+xstr; X smg$put_chars(disp`5B1`5D,' ',1,60); X smg$put_chars(disp`5B1`5D,'TIME: '+xstr,1,60); X convert(quarter,xstr,xlen); X smg$put_chars(disp`5B1`5D,'QUARTER: '+xstr,2,60); X if (where < 51) then X convert(where,xstr,xlen) X else X convert(100-where,xstr,xlen); X smg$put_chars(disp`5B1`5D,' ',3,60); X if (xstr.length = 1) then X smg$put_chars(disp`5B1`5D,'BALL ON: '+xstr,3,60) X else X smg$put_chars(disp`5B1`5D,'BALL ON: '+xstr,3,60); X convert(ydstogo,xstr,xlen); X smg$put_chars(disp`5B1`5D,' ',4,60); +-+-+-+-+-+-+-+- END OF PART 2 +-+-+-+-+-+-+-+-