home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 126 / af126a.adf / Football.lzx / football / user / EndOfSeason.rexx < prev    next >
OS/2 REXX Batch file  |  1999-05-22  |  20KB  |  678 lines

  1. /* ***********************************************************************
  2.  
  3.    END OF SEASON PROGRAM FOR FOOTBALL REXX SUITE
  4.   -----------------------------------------------
  5.                    Copyright  Mark Naughton 1997
  6.  
  7.  
  8. Version    Date     History
  9. --------------------------------------------------------------------------
  10.  1.0       061097   First release - after about 10 days and loads of
  11.                     hassle and numerous variations in the method for
  12.                     swapping/deleting teams between divisions.
  13.  
  14. **************************************************************************
  15.  
  16. Procedure
  17. ---------
  18.  
  19. 1. Check files exist.
  20. 2. Read number of divisions and divisions. Then store.
  21. 3. Search all leagues/divisions to see if all matches have been played,
  22.    if not, then give error and exit.
  23. 4. Create all league/division tables and save to temporary files.
  24. 5. Display the winner, teams relegated and teams promoted for each
  25.    division.
  26. 6. Loop. Read teams from division then swap/delete those teams that have
  27.    been relegated/promoted between adjoining leagues/divisions. Write to
  28.    temporary file when complete. End loop.
  29. 7. Loop. Read previous '.df' file and using data from temporary files
  30.    created in (6), create '_NewData.df' files for each league/division.
  31.    End loop.
  32. 8. Display message about '_NewData.df' files.
  33. 9. Display final league/division tables.
  34. 10.Erase temporary files. Exit.
  35.  
  36. ************************************************************************** */
  37. PARSE ARG league_stuff
  38.  
  39. version      = 1
  40. input_file   = '.df'
  41. input2_file  = '.sf'
  42. league_file  = "Data/" || league_stuff
  43. stored_divs. = '???'
  44. league_title = '*LEAGUE_NAME='
  45. num_divs     = '*NUM_DIVISIONS='
  46. divisions    = '*DIVISIONS='
  47. releg        = '*RELEGATION='
  48. promoted     = '*PROMOTED='
  49. not_played   = '__   __'
  50. ndivs        = 1
  51. divs         = ''
  52. promo        = 0
  53. relg         = 2
  54. separator    = '*'
  55.  
  56. defcts.      = '???'
  57. titles.      = '???'
  58. names.       = '???'
  59. defs.        = '???'
  60. div1.        = '???'
  61.  
  62.  
  63. if exists(league_file || input_file) = 0  then exit
  64. if exists(league_file || input2_file) = 0 then exit
  65.  
  66.  
  67. if open(datafile,league_file || input_file,'r') then do
  68.    do while ~eof(datafile)
  69.       line = readln(datafile)
  70.       if pos(num_divs,line) > 0 then     ndivs = delstr(line,1,15)
  71.       if pos(divisions,line) > 0 then    divs  = delstr(line,1,11)
  72.    end
  73.    close(datafile)
  74. end
  75. else do
  76.    say
  77.    say "ERROR :    (EndOfSeason)"
  78.    say
  79.    say "Unable to open '"league_file || input_file"' file."
  80.    exit
  81. end
  82.  
  83. stored_divs.1 = league_file
  84.  
  85. do i=2 to ndivs
  86.    stored_divs.i = "Data/"||word(divs,i-1)
  87. end
  88.  
  89. access = "NONE"
  90. do i=1 to ndivs
  91.    if open(datafile,stored_divs.i || input2_file,'r') then do
  92.       do while ~eof(datafile)
  93.          line = readln(datafile)
  94.          if pos(not_played,line) > 0 then do
  95.             access = stored_divs.i
  96.             leave
  97.          end
  98.       end
  99.       close(datafile)
  100.    end
  101.    if pos("NONE",access) = 0 then do
  102.       say "League '"access"' has not finished. Enter the scores then"
  103.       say "run this program again to close the season."
  104.       exit
  105.    end
  106.    access = "NONE"
  107. end
  108.  
  109. /* All matches have been played in the league, so the program continues... */
  110.  
  111.                                 /* create league tables */
  112. do i=1 to ndivs
  113.    call create_table(stored_divs.i)
  114. end
  115.                               /* print title and winners/losers */
  116. say
  117. say "                                End Of Season"
  118. say "                               ---------------"
  119. say
  120. say
  121. defcnt = 0
  122. do i=1 to ndivs
  123.    if open(datafile,stored_divs.i || input_file,'r') then do
  124.       do while ~eof(datafile)
  125.          line = readln(datafile)
  126.          if pos(league_title,line) > 0 then  title = delstr(line,1,13)
  127.          if pos(releg,line) > 0 then         relg  = delstr(line,1,12)
  128.          if pos(promoted,line) > 0 then      promo = delstr(line,1,10)
  129.       end
  130.       close(datafile)
  131.    end
  132.    else do
  133.       say
  134.       say "ERROR :    (EndOfSeason)"
  135.       say
  136.       say "Unable to open '"stored_divs.i || input_file"' file."
  137.       exit
  138.    end
  139.  
  140.    parse var stored_divs.i . "/" name .
  141.    a = 0
  142.    if open(datafile,"RAM:"||name||".final_table",'r') then do
  143.       do while ~eof(datafile)
  144.          line = readln(datafile)
  145.          a = a + 1
  146.          div1.a = line
  147.       end
  148.       close(datafile)
  149.    end
  150.    else do
  151.       say
  152.       say "ERROR :    (EndOfSeason)"
  153.       say
  154.       say "Unable to open 'RAM:"name".final_table' file."
  155.       exit
  156.    end
  157.    say "           League    : "title
  158.    titles.i = title
  159.    say
  160.    defcnt = defcnt + 1
  161.    if i=1 then do
  162.       say "           Winner    : "substr(div1.1,1,35)
  163.       defs.defcnt = name" WINR "trim(substr(div1.1,1,35))
  164.    end
  165.    else do
  166.       do b=1 to promo
  167.          if b=1 then do
  168.             say "           Promoted  : "substr(div1.b,1,35)
  169.             defs.defcnt = name" PROM * "trim(substr(div1.b,1,35))
  170.          end
  171.          else do
  172.             say "                       "substr(div1.b,1,35)
  173.             defs.defcnt = defs.defcnt" * "trim(substr(div1.b,1,35))
  174.          end
  175.       end
  176.    end
  177.    defcnt = defcnt + 1
  178.    say
  179.    start= a - relg         /* was start+1 */
  180.    do b = start to a
  181.       if b = start then do
  182.          say "           Relegated : "substr(div1.b,1,35)
  183.          defs.defcnt = name" RELG * "trim(substr(div1.b,1,35))
  184.       end
  185.       else do
  186.          say "                       "substr(div1.b,1,35)
  187.          defs.defcnt = defs.defcnt" * "trim(substr(div1.b,1,35))
  188.       end
  189.    end
  190.    say
  191.    say
  192. end
  193.  
  194. say "                             ---------------------"
  195.  
  196. /* swap/delete teams between divisions, write new files */
  197.  
  198. do i=1 to ndivs
  199.    parse var stored_divs.i . "/" name .           /* read teams into memory */
  200.    n = 0
  201.    if open(datafile,"RAM:"||name||".final_table",'r') then do
  202.       do while ~eof(datafile)
  203.          line = readln(datafile)
  204.          n = n + 1
  205.          div1.n = trim(substr(line,1,35))
  206.       end
  207.       close(datafile)
  208.    end
  209.    else do
  210.       say
  211.       say "ERROR :    (EndOfSeason)"
  212.       say
  213.       say "Unable to open 'RAM:"name".final_table' file."
  214.       exit
  215.    end
  216.  
  217.    b = 0
  218.    do a=1 to defcnt
  219.       if pos(name,defs.a) = 0 then
  220.          iterate
  221.       if pos("RELG",defs.a) > 0 then do         /* Check for relegation code */
  222.          b = a + 1
  223.          if pos("PROM",defs.b) = 0 then do
  224.             do m=1 to n
  225.                if pos(div1.m,defs.a) > 0 then         /* delete relegated teams */
  226.                   div1.m = "Deleted Team"
  227.             end
  228.          end
  229.          else do
  230.             do m=1 to n
  231.                if pos(div1.m,defs.a) > 0 then          /* delete relegated teams... */
  232.                   div1.m = "Deleted Team"
  233.             end
  234.             parse var defs.b . "* " names.1 " * " names.2 " * " names.3 " * " names.4 " * " names.5 " * " names.6 " *"
  235.             c = 1
  236.             if div1.n = '' then
  237.                n = n - 1
  238.             do while names.c ~=''           /* ...then add the newly promoted ones! */
  239.                n = n + 1
  240.                div1.n = names.c
  241.                c = c + 1
  242.             end
  243.          end
  244.          if open(datafile2,"RAM:"word(defs.a,1)".teams",'w') then do
  245.             do p=1 to n
  246.                if pos("Deleted Team",div1.p) = 0 then       /* create teams file in RAM: */
  247.                   writeln(datafile2,div1.p)
  248.             end
  249.             close(datafile2)
  250.          end
  251.          else do
  252.             say
  253.             say "ERROR :    (EndOfSeason)"
  254.             say
  255.             say "Cannot write to 'RAM:"word(defs.a,1)".teams'."
  256.             exit
  257.          end
  258.       end
  259.       else do
  260.          if pos("PROM",defs.a) > 0 then do         /* Check for promotion code */
  261.             b = a - 1
  262.             if b=0 then
  263.                iterate
  264.             if pos("RELG",defs.b) = 0 then do
  265.                do m=1 to n
  266.                   if pos(div1.m,defs.a) > 0 then   /* delete promoted teams */
  267.                      div1.m = "Deleted Team"
  268.                end
  269.             end
  270.             else do
  271.                do m=1 to n                           /* delete promoted teams... */
  272.                   if pos(div1.m,defs.a) > 0 then
  273.                      div1.m = "Deleted Team"
  274.                end
  275.                parse var defs.b . "* " names.1 " * " names.2 " * " names.3 " * " names.4 " * " names.5 " * " names.6 " *"
  276.                c = 1
  277.                if div1.n = '' then
  278.                   n = n - 1
  279.                do while names.c ~=''           /* ...then add the newly relegated ones! */
  280.                   n = n + 1
  281.                   div1.n = names.c
  282.                   c = c + 1
  283.                end
  284.             end
  285.             if open(datafile2,"RAM:"word(defs.a,1)".teams",'w') then do
  286.                do p=1 to n
  287.                   if pos("Deleted Team",div1.p) = 0 then
  288.                      writeln(datafile2,div1.p)
  289.                end
  290.                close(datafile2)                      /* write teams file */
  291.             end
  292.             else do
  293.                say
  294.                say "ERROR :    (EndOfSeason)"
  295.                say
  296.                say "Cannot write to 'RAM:"word(defs.a,1)".teams'."
  297.                exit
  298.             end
  299.          end
  300.       end
  301.    end
  302. end
  303.                                          /* read each league and rewrite 'df' file with new teams */
  304. do i=1 to ndivs
  305.    parse var stored_divs.i . "/" name .
  306.  
  307.    if open(datafile2,"Data/"name"_NewData"input_file,'w') then do
  308.       if open(datafile,"Data/"name||input_file,'r') then do
  309.          do while ~eof(datafile)
  310.             line = readln(datafile)
  311.             if pos(separator,line) > 0 then
  312.                writeln(datafile2,line)
  313.          end
  314.          close(datafile)
  315.       end
  316.       else do
  317.          say
  318.          say "ERROR :    (EndOfSeason)"
  319.          say
  320.          say "Unable to read 'Data/"name||input_file"' file."
  321.          exit
  322.       end
  323.       if open(datafile,"RAM:"name".teams",'r') then do
  324.          do while ~eof(datafile)
  325.             line = readln(datafile)
  326.             writeln(datafile2,line)
  327.          end
  328.          close(datafile)
  329.       end
  330.       else do
  331.          say
  332.          say "ERROR :    (EndOfSeason)"
  333.          say
  334.          say "Unable to read 'RAM:"name".teams'."
  335.          exit
  336.       end
  337.       close(datafile2)
  338.    end
  339.    else do
  340.      say
  341.      say "ERROR :    (EndOfSeason)"
  342.      say
  343.      say "Unable to write to 'Data/"name"_NewData"input_file"' file."
  344.      exit
  345.    end
  346. end
  347.                         /* display message */
  348. say
  349. say
  350. say "        The related Leagues/Divisions have been adjusted and"
  351. say "        promotions and relegations have been made. The new "
  352. say "        League/Divisions for next season are :"
  353. say
  354. do i=1 to ndivs
  355.    parse var stored_divs.i . "/" name .
  356.    say "                   '"name"_NewData"input_file"'"
  357. end
  358. say
  359. say "        These files will have to be imported into 'Create League'"
  360. say "        and then saved, ideally with a new filename. Since they contain"
  361. say "        the right teams, they might be renamed using the year/season"
  362. say "        and used as the new '.df' files. Or they can just be used to"
  363. say "        import into 'Create League' to create new files completely."
  364. say
  365. say "        External script 'DeleteNewDataFiles' can be used to delete/cleanup"
  366. say "        these files."
  367. say
  368. say "                             ---------------------"
  369.  
  370. /* display final league tables */
  371.  
  372. say
  373. say
  374. say "                              Final League Tables"
  375. say "                             ---------------------"
  376. say
  377. say
  378. do i=1 to ndivs
  379.    uline = ''
  380.    do c=1 to length(titles.i)
  381.       uline = insert('-',uline,c,1)
  382.    end
  383.    uline = strip(uline)
  384.    say "    League   : "titles.i
  385.    say "               "uline
  386.    say
  387.    say "    Team                               Pl Won Drw Lst GoalsF GoalsA    Pts     GoalDiff"
  388.    say "-----------------------------------------------------------------------------------------"
  389.    a = 1
  390.    parse var stored_divs.i . "/" name .
  391.    if open(datafile,"RAM:"||name||".final_table",'r') then do
  392.       do while ~eof(datafile)
  393.          line = readln(datafile)
  394.          if line ~= '' then do
  395.             if strip(substr(line,76,5)) = 0 then line=overlay("",line,76,5," ")
  396.             if a<10 then do
  397.                if a = 1 then line = upper(line)
  398.                say " "a") "line
  399.             end
  400.             else
  401.                say a") "line
  402.             a = a + 1
  403.          end
  404.       end
  405.       close(datafile)
  406.    end
  407.    else do
  408.       say
  409.       say "ERROR :    (EndOfSeason)"
  410.       say
  411.       say "Unable to open 'RAM:"name".final_table' file."
  412.       exit
  413.    end
  414.    say
  415.    say
  416. end
  417. say "                             ---------------------"
  418. say
  419.                      /* erase all temporary files */
  420. do i=1 to ndivs
  421.    parse var stored_divs.i . "/" name .
  422.    filen = "RAM:"||name||".final_table"
  423.    address command 'delete >NIL: 'filen
  424.    filen = "RAM:"||name||".teams"
  425.    address command 'delete >NIL: 'filen
  426. end
  427.  
  428. exit
  429.  
  430. /* Procedure --------------------------------------------------------- */
  431.  
  432. create_table : procedure
  433. parse arg league_table
  434.  
  435. input_file   = '.df'
  436. input2_file  = '.sf'
  437. not_played   = '__   __'
  438. input3_file   = '.stats'
  439. output_file  = 'Data/League.output'
  440. points_win   = '*POINTS_PER_WIN='
  441. points_drw   = '*POINTS_PER_DRW='
  442. points_lse   = '*POINTS_PER_LSE='
  443. points_gls   = '*POINTS_PER_GLS='
  444. team         = '*TEAM='
  445. played       = '*PLY='
  446. won          = '*WIN='
  447. drawn        = '*DRW='
  448. lost         = '*LST='
  449. goalsf       = '*GOF='
  450. goalsa       = '*GOA='
  451. points       = '*PTS='
  452. separator    = '*'
  453. teams.       = '???'
  454. teams2.      = '???'
  455. m_ply.       = '???'
  456. m_win.       = '???'
  457. m_drw.       = '???'
  458. m_lost.      = '???'
  459. m_gof.       = '???'
  460. m_goa.       = '???'
  461. m_pts.       = '???'
  462. ptsgls       = 0
  463. ptswin       = 2
  464. ptsdrw       = 1
  465. ptslse       = 0
  466.  
  467.  
  468. if exists(league_table || input3_file) = 0 then do
  469.    say
  470.    say "ERROR :    (EndOfSeason)"
  471.    say
  472.    say "Cannot find '"league_table||input3_file"' for table creation."
  473.    exit
  474. end
  475.  
  476. tcount = 0
  477. if open(datafile,league_table || input_file,'r') then do
  478.    do while ~eof(datafile)
  479.       line = readln(datafile)
  480.       if pos(points_win,line) > 0 then   ptswin=delstr(line,1,16)
  481.       if pos(points_drw,line) > 0 then   ptsdrw=delstr(line,1,16)
  482.       if pos(points_lse,line) > 0 then   ptslse=delstr(line,1,16)
  483.       if pos(points_gls,line) > 0 then   ptsgls=delstr(line,1,16)
  484.       if pos(separator,line) = 0 then do
  485.          line = strip(line)
  486.          tcount       = tcount + 1
  487.          teams.tcount = line
  488.       end
  489.    end
  490.    close(datafile)
  491. end
  492. else do
  493.    say
  494.    say "ERROR :    (EndOfSeason)"
  495.    say
  496.    say "Unable to open '"league_table || input_file"' file."
  497.    exit
  498. end
  499.  
  500. team_ctr = 0
  501. if open(datafile,league_table || input3_file,'r') then do
  502.    do while ~eof(datafile)
  503.       line = readln(datafile)
  504.       if pos(team,line) > 0 then    team_ctr = team_ctr + 1
  505.       if pos(played,line) > 0 then  m_ply.team_ctr  = delstr(line,1,5)
  506.       if pos(won,line) > 0 then     m_won.team_ctr  = delstr(line,1,5)
  507.       if pos(drawn,line) > 0 then   m_drw.team_ctr  = delstr(line,1,5)
  508.       if pos(lost,line) > 0 then    m_lost.team_ctr = delstr(line,1,5)
  509.       if pos(goalsf,line) > 0 then  m_gof.team_ctr  = delstr(line,1,5)
  510.       if pos(goalsa,line) > 0 then  m_goa.team_ctr  = delstr(line,1,5)
  511.       if pos(points,line) > 0 then  m_pts.team_ctr  = delstr(line,1,5)
  512.    end
  513.    close(datafile)
  514. end
  515. else do
  516.    say
  517.    say "ERROR :    (EndOfSeason)"
  518.    say
  519.    say "Unable to open '"league_table || input3_file"'."
  520.    exit
  521. end
  522.  
  523. if open(datafile,league_table || input2_file,'r') then do
  524.    do while ~eof(datafile)
  525.       line = readln(datafile)
  526.       if pos(separator,line) = 0 then do
  527.          if pos(not_played,line) = 0 then do
  528.             home_team = strip(substr(line,1,30))
  529.             goals_for = substr(line,32,2)
  530.             goals_aga = substr(line,37,2)
  531.             away_team = strip(substr(line,41,30))
  532.  
  533.             do i=1 to tcount
  534.                if home_team = teams.i then do
  535.                   m_ply.i = m_ply.i + 1
  536.                   m_gof.i = m_gof.i + goals_for
  537.                   m_goa.i = m_goa.i + goals_aga
  538.                   if goals_for = goals_aga then do
  539.                      m_drw.i = m_drw.i + 1
  540.                      m_pts.i = m_pts.i + ptsdrw
  541.                   end
  542.                   if goals_for < goals_aga then do
  543.                      m_lost.i= m_lost.i + 1
  544.                      m_pts.i = m_pts.i + ptslse
  545.                   end
  546.                   if goals_for > goals_aga then do
  547.                      m_won.i = m_won.i + 1
  548.                      m_pts.i = m_pts.i + ptswin
  549.                   end
  550.                   m_pts.i = m_pts.i + (goals_for * ptsgls)
  551.                end
  552.             end
  553.             do i=1 to tcount
  554.                if away_team = teams.i then do
  555.                   m_ply.i = m_ply.i + 1
  556.                   m_gof.i = m_gof.i + goals_aga
  557.                   m_goa.i = m_goa.i + goals_for
  558.                   if goals_for = goals_aga then do
  559.                      m_drw.i = m_drw.i + 1
  560.                      m_pts.i = m_pts.i + ptsdrw
  561.                   end
  562.                   if goals_for < goals_aga then do
  563.                      m_won.i = m_won.i + 1
  564.                      m_pts.i = m_pts.i + ptswin
  565.                   end
  566.                   if goals_for > goals_aga then do
  567.                      m_lost.i= m_lost.i + 1
  568.                      m_pts.i = m_pts.i + ptslse
  569.                   end
  570.                   m_pts.i = m_pts.i + (goals_aga * ptsgls)
  571.                end
  572.             end
  573.          end
  574.       end
  575.    end
  576.    close(datafile)
  577. end
  578. else do
  579.    say
  580.    say "ERROR :    (EndOfSeason)"
  581.    say
  582.    say "Unable to open '"league_table || input2_file"'."
  583.    exit
  584. end
  585.  
  586. if open(outfile,output_file,"w") then do
  587.    do i=1 to tcount
  588.       line = teams.i
  589.       line = insert(" ",line,length(line)+1,30-length(line))
  590.       mp = right(m_ply.i,3)
  591.       mw = right(m_won.i,3)
  592.       md = right(m_drw.i,3)
  593.       ml = right(m_lost.i,3)
  594.       mgf = right(m_gof.i,5)
  595.       mga = right(m_goa.i,5)
  596.       mpts = right(m_pts.i,7)
  597.       writech(outfile,line"   "mp" "mw" "md" "ml" "mgf" "mga"  "mpts"      ")
  598.       itemp=mgf-mga
  599.       if itemp>0 then
  600.          itemp=insert("+",itemp,0,1)
  601.       itemp=right(itemp,4)
  602.       writeln(outfile,itemp)
  603.    end
  604.    close(outfile)
  605. end
  606. else do
  607.    say
  608.    say "ERROR :    (EndOfSeason)"
  609.    say
  610.    say "Unable to update the League. Cannot write to '"output_file"'."
  611.    exit
  612. end
  613.  
  614. address command 'Exec/footsort '
  615.  
  616. if open(datafile2,output_file,'r') then do
  617.    do i=1 to tcount
  618.       line = readln(datafile2)
  619.       teams.i  = line
  620.       teams2.i = line
  621.    end
  622.    close(datafile2)
  623. end
  624. else do
  625.    say
  626.    say "ERROR :    (EndOfSeason)"
  627.    say
  628.    say "Cannot read '"output_file"'."
  629.    exit
  630. end
  631.  
  632. ctr = 0
  633. do while swapctr > 0
  634.    swapctr=9
  635.    do i=1 to tcount-1                               /* was 64,4 and 77,4 */
  636.       swapdone=0
  637.       j = i + 1
  638.       if strip(substr(teams.i,64,7)) = strip(substr(teams.j,64,7)) then do
  639.          goaldiffa = strip(substr(teams.i,77,5))
  640.          goaldiffb = strip(substr(teams.j,77,5))
  641.          if goaldiffa < goaldiffb then do
  642.             teams.i = teams2.j
  643.             teams.j = teams2.i
  644.             teams2.i= teams.i
  645.             teams2.j= teams.j
  646.             swapdone= 1
  647.             ctr = ctr + 1
  648.          end
  649.       end
  650.       if swapdone = 1 then
  651.          break
  652.    end
  653.    if ctr = 0 then
  654.       swapctr = 0
  655.    else
  656.       ctr = 0
  657. end
  658.  
  659. parse var league_table . "/" name .
  660.  
  661. if open(datafile2,"RAM:"||name||".final_table",'w') then do
  662.    do i=1 to tcount
  663.       if strip(substr(teams.i,76,5)) = 0 then teams.i=overlay("",teams.i,76,5," ")
  664.       writeln(datafile2,teams.i)
  665.    end
  666.    close(datafile2)
  667. end
  668. else do
  669.    say
  670.    say "ERROR :    (EndOfSeason)"
  671.    say
  672.    say "Cannot write to 'RAM:"name".final_table'."
  673.    exit
  674. end
  675.  
  676. return
  677.  
  678. /*******************************************************************************/