home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / MAGAZINE / MISC / COMP8809.ZIP / SOURCE.EXE / BBALL.C next >
Encoding:
C/C++ Source or Header  |  1988-05-25  |  20.2 KB  |  1,016 lines

  1. #include <graphics.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <fcntl.h>
  5. #include <math.h>
  6. #include <dos.h>
  7.  
  8. void initscreen();
  9. void setpage(int activepage, int visualpage);
  10. void fireworks(int runs, int eg);
  11. int atbat();
  12. int vx, vy, px, py, team, inning, game, screen, stat, hits[2], runs[2],
  13.     innruns[4][2], runner[4], holex[10], holey[10], holer[10], p[16], c[350],
  14.     dirx[4]={2,-2,-2,2}, diry[4]={-1,-1,1,1},
  15.     strtx[4]={316,382,316,250}, strty[4]={214,181,148,181};
  16. unsigned int x, y, page, prevx[2], prevy[2];
  17. char ch, *bases, *ball[4], *unball[2], *ballmask[4],
  18.      *unman[4][2], *man[4], *point[4];
  19. FILE *stream;
  20.  
  21. main()
  22. {
  23.  int i, j, graphdriver, graphmode;
  24.  
  25.  registerbgidriver(Herc_driver);
  26.  registerbgidriver(CGA_driver);
  27.  registerbgidriver(EGAVGA_driver);
  28.  if (_argc>1)
  29.  {
  30.   ch=toupper(_argv[1][0]);
  31.   if (ch=='E')
  32.   {
  33.    graphdriver=EGA;
  34.    graphmode=1;
  35.    screen=2;
  36.   }
  37.   if (ch=='H' || ch=='M')
  38.   {
  39.    graphdriver=HERCMONO;
  40.    graphmode=0;
  41.    screen=1;
  42.   }
  43.   if (ch=='C')
  44.   {
  45.    graphdriver=CGA;
  46.    graphmode=4;
  47.    screen=0;
  48.   }
  49.   initgraph(&graphdriver,&graphmode,"");
  50.   if (graphresult()<0)
  51.    screen=3;
  52.  }
  53.  else
  54.  {
  55.   detectgraph(&graphdriver,&graphmode);
  56.   if (graphdriver==EGA)
  57.   {
  58.    graphmode=1;
  59.    screen=2;
  60.   }
  61.   if (graphdriver==CGA)
  62.   {
  63.    graphmode=4;
  64.    screen=0;
  65.   }
  66.   if (graphdriver==HERCMONO)
  67.   {
  68.    graphmode=0;
  69.    screen=1;
  70.   }
  71.   initgraph(&graphdriver,&graphmode,"");
  72.   if (graphresult()<0)
  73.    screen=3;
  74.  }
  75.  if (screen!=3)
  76.  {
  77.   if (screen==0)
  78.   {
  79.    for (i=0; i<350; i++)
  80.     c[i]=((long)i*199)/349;
  81.   }
  82.   else
  83.    for (i=0; i<350; i++)
  84.     c[i]=i;
  85.   if (screen<2)
  86.    for (i=0; i<16; i++)
  87.     p[i]=(i>6)*3;
  88.   else
  89.    for (i=0; i<16; i++)
  90.     p[i]=i;
  91.   initscreen();
  92.   stat=peekb(0x40,0x17);
  93.   do
  94.   {
  95.    randomize();
  96.    i=atbat();
  97.    setpage(0,0);
  98.    if (i)
  99.    {
  100.     setcolor(p[10]);
  101.     outtextxy(276,c[20],"END OF GAME");
  102.    }
  103.    setcolor(p[15]);
  104.    outtextxy(252,c[55],"PLAY AGAIN (Y/N)?");
  105.    ch=0;
  106.    do
  107.    {
  108.     if (i)
  109.      fireworks(1+random(4),1);
  110.     if (kbhit())
  111.      ch=toupper(getch());
  112.    } while (ch!='N' && ch!='Y');
  113.   } while (ch=='Y');
  114.   pokeb(0x40,0x17,stat);
  115.   restorecrtmode();
  116.   closegraph();
  117.  }
  118. }
  119.  
  120. char *alloc(unsigned int size)
  121. {
  122.  char *buffer;
  123.  
  124.  buffer=malloc(size);
  125.  if (buffer==NULL)
  126.  {
  127.   printf("Out of memory./n/nPress any key to continue.");
  128.   getch();
  129.   exit(1);
  130.  }
  131.  return buffer;
  132. }
  133.  
  134. void setpage(int activepage, int visualpage)
  135. {
  136.  if (screen>0)
  137.  {
  138.   if (activepage!=-1)
  139.    setactivepage(activepage);
  140.   if (visualpage!=-1)
  141.    setvisualpage(visualpage);
  142.  }
  143. }
  144.  
  145. void scorehit()
  146. {
  147.  int tx, ty;
  148.  char hitstr[4];
  149.  
  150.  if (game)
  151.  {
  152.   itoa(hits[team],hitstr,10);
  153.   tx=232+(3-strlen(hitstr)<<3);
  154.   ty=c[324+14*team];
  155.   setpage(!page,-1);
  156.   setfillstyle(1,p[1]);
  157.   bar(232,ty,232+23,ty+7);
  158.   setcolor(p[15]);
  159.   outtextxy(tx,ty,hitstr);
  160.   setpage(page,-1);
  161.   bar(232,ty,232+23,ty+7);
  162.   outtextxy(tx,ty,hitstr);
  163.   setfillstyle(1,p[0]);
  164.  }
  165. }
  166.  
  167. void scorerun()
  168. {
  169.  int tx, tx1, tx2, ty;
  170.  char runstr[4], innrunstr[4];
  171.  
  172.  if (game)
  173.  {
  174.   itoa(runs[team],runstr,10);
  175.   itoa(innruns[inning][team],innrunstr,10);
  176.   tx1=72+(inning<<5);
  177.   tx2=tx1+(3-strlen(innrunstr)<<3);
  178.   tx=200+(3-strlen(runstr)<<3);
  179.   ty=c[324+14*team];
  180.   setpage(!page,-1);
  181.   setfillstyle(1,p[1]);
  182.   bar(tx1,ty,tx1+23,ty+7);
  183.   bar(200,ty,223,ty+7);
  184.   setcolor(p[15]);
  185.   outtextxy(tx2,ty,innrunstr);
  186.   outtextxy(tx,ty,runstr);
  187.   setpage(page,-1);
  188.   bar(tx1,ty,tx1+23,ty+7);
  189.   bar(200,ty,223,ty+7);
  190.   outtextxy(tx2,ty,innrunstr);
  191.   outtextxy(tx,ty,runstr);
  192.   setfillstyle(1,p[0]);
  193.  }
  194. }
  195.  
  196. void erascore()
  197. {
  198.  int i;
  199.  char ch;
  200.  
  201.  for (i=1; i>-1; i--)
  202.  {
  203.   setpage(i,-1);
  204.   setfillstyle(1,p[2]);
  205.   bar(254,c[20],252+135,c[20]+7);
  206.   bar(252,c[55],252+135,c[55]+7);
  207.   setfillstyle(1,p[1]);
  208.   bar(64,c[324],64+135,c[324]+7);
  209.   bar(64,c[338],64+135,c[338]+7);
  210.   bar(120,c[324],120+135,c[324]+7);
  211.   bar(120,c[338],120+135,c[338]+7);
  212.   bar(572,c[324],572+135,c[324]+7);
  213.   bar(572,c[338],572+135,c[338]+7);
  214.  }
  215.  setcolor(p[15]);
  216.  outtextxy(261,c[55],"PRACTICE (Y/N)?");
  217.  do
  218.  {
  219.   ch=toupper(getch());
  220.  } while (ch!='N' && ch!='Y');
  221.  setfillstyle(1,p[2]);
  222.  bar(252,c[55],252+136,c[55]+7);
  223.  game=(ch=='N');
  224.  setfillstyle(1,p[0]);
  225. }
  226.  
  227. double batrad(int deg)
  228. {
  229.  return (3.14159*(90+deg)/180);
  230. }
  231.  
  232. int ballhit(int angle)
  233. {
  234.  int deg, diff;
  235.  
  236.  if (y<320*64)
  237.  {
  238.   deg=(180*atan2((double)(320*64-y-4*64),(double)(x+5*85-295*85)))/3.14159;
  239.   deg+=deg;
  240.  }
  241.  else
  242.  {
  243.   deg=(180*atan2((double)(y+4*64-320*64),(double)(x+5*85-295*85)))/3.14159;
  244.   deg=-deg-deg;
  245.  }
  246.  diff=abs(deg-angle);
  247.  if (diff<20)
  248.   return(1);
  249.  if (diff<40)
  250.   return(2);
  251.  return(0);
  252. }
  253.  
  254. int getsign()
  255. {
  256.  do
  257.  {
  258.   if (game)
  259.   {
  260.    pokeb(0x40,0x17,stat|32);
  261.    ch=getch();
  262.   }
  263.   else
  264.    if (kbhit())
  265.     ch=getch();
  266.    else
  267.     ch='1'+random(9);
  268.   switch (ch)
  269.   {
  270.    case '1' : vy=468; vx=-18; break;
  271.    case '2' : vy=468; vx=0; break;
  272.    case '3' : vy=468; vx=18; break;
  273.    case '4' : vy=340; vx=-18; break;
  274.    case '5' : vy=340; vx=0; break;
  275.    case '6' : vy=340; vx=18; break;
  276.    case '7' : vy=212; vx=-18; break;
  277.    case '8' : vy=212; vx=0; break;
  278.    case '9' : vy=212; vx=18; break;
  279.    case 27 : return(0);
  280.   }
  281.  } while (vy==0);
  282.  vy-=random(40);
  283.  vx-=random(3);
  284.  return(1);
  285. }
  286.  
  287. int pitch0()
  288. {
  289.  int i, angle, pangle, swing, hit;
  290.  double rad;
  291.  char ch;
  292.  
  293.  setcolor(p[0]);
  294.  pieslice(295,c[320],45,0,45);
  295.  pieslice(295,c[320],315,360,45);
  296.  setlinestyle(0,0xFFFF,1);
  297.  pangle=pangle=angle=-55;
  298.  setcolor(p[7]);
  299.  prevx[0]=315; prevy[0]=c[188];
  300.  getimage(prevx[0],prevy[0],prevx[0]+11,prevy[0]+9,unball[0]);
  301.  pieslice(295,c[320],angle,angle+1,44);
  302.  swing=0;
  303.  hit=0;
  304.  x=((px=315)*85);
  305.  y=((py=190)<<6);
  306.  vy=0;
  307.  if (!getsign())
  308.   return(0);
  309.  do
  310.  {
  311.   putimage(prevx[0],prevy[0],unball[0],0);
  312.   prevx[0]=px; prevy[0]=c[py];
  313.   if (swing==1)
  314.   {
  315.    setcolor(p[0]);
  316.    pieslice(295,c[320],pangle,pangle+1,44);
  317.    setcolor(p[7]);
  318.    pieslice(295,c[320],angle,angle+1,44);
  319.    pangle=angle;
  320.    if ((angle+=10)>40)
  321.     swing=2;
  322.   }
  323.   getimage(px,c[py],px+11,c[py]+9,unball[0]);
  324.   putimage(px,c[py],ballmask[0],3);
  325.   putimage(px,c[py],ball[0],2);
  326.   if (swing!=1)
  327.    delay(20);
  328.   i=ballhit(pangle);
  329.   if (i!=0 && !hit)
  330.   {
  331.    setcolor(p[1]);
  332.    rad=batrad(pangle+(2-i)*5+random(5)-2);
  333.    vx=385*cos(rad);
  334.    vy=-(250+(vy>>3))*sin(rad);
  335.    hit=1;
  336.    if (swing==0)
  337.     swing=3;
  338.   }
  339.   if (kbhit() && swing<1)
  340.    swing=getch()==' ';
  341.   if (swing==2)
  342.   {
  343.    putimage(prevx[0],prevy[0],unball[0],0);
  344.    setcolor(p[0]);
  345.    pieslice(295,c[320],pangle,pangle+1,44);
  346.    setcolor(p[7]);
  347.    pieslice(295,c[320],pangle,pangle+1,44);
  348.    getimage(prevx[0],prevy[0],prevx[0]+11,prevy[0]+9,unball[0]);
  349.    swing=3;
  350.   }
  351.   px=((x+=vx)/85);
  352.   py=((y+=vy)>>6);
  353.  } while (swing<3 || !hit);
  354.  return(1);
  355. }
  356.  
  357. int pitch12()
  358. {
  359.  int i, angle, pangle[2], swing, hit;
  360.  double rad;
  361.  char ch;
  362.  
  363.  setcolor(p[0]);
  364.  for (page=0; page<2; page++)
  365.  {
  366.   setpage(page,-1);
  367.   pieslice(295,c[320],45,0,45);
  368.   pieslice(295,c[320],315,360,45);
  369.  }
  370.  setlinestyle(0,0xFFFF,3);
  371.  pangle[0]=pangle[1]=angle=-55;
  372.  setcolor(p[7]);
  373.  for (page=0; page<2; page++)
  374.  {
  375.   prevx[page]=315; prevy[page]=c[188-!page-!page];
  376.   getimage(prevx[page],prevy[page],prevx[page]+11,prevy[page]+9,unball[page]);
  377.   setpage(page,-1);
  378.   pieslice(295,c[320],angle,angle+1,44);
  379.  }
  380.  page=1;
  381.  swing=0;
  382.  hit=0;
  383.  x=((px=315)*85);
  384.  y=((py=190)<<6);
  385.  vy=0;
  386.  if (!getsign())
  387.   return(0);
  388.  do
  389.  {
  390.   putimage(prevx[page],prevy[page],unball[page],0);
  391.   prevx[page]=px; prevy[page]=c[py];
  392.   if (swing==1)
  393.   {
  394.    setcolor(p[0]);
  395.    pieslice(295,c[320],pangle[page],pangle[page]+1,44);
  396.    setcolor(p[7]);
  397.    pieslice(295,c[320],angle,angle+1,44);
  398.    pangle[page]=angle;
  399.    if ((angle+=10)>40)
  400.     swing=2;
  401.   }
  402.   else
  403.    delay(14);
  404.   getimage(px,c[py],px+11,c[py]+9,unball[page]);
  405.   putimage(px,c[py],ballmask[0],3);
  406.   putimage(px,c[py],ball[0],2);
  407.   i=ballhit(pangle[page]);
  408.   if (i!=0 && !hit)
  409.   {
  410.    setcolor(p[1]);
  411.    rad=batrad(pangle[page]+(2-i)*5+random(5)-2);
  412.    vx=385*cos(rad);
  413.    vy=-(250+(vy>>3))*sin(rad);
  414.    hit=1;
  415.    if (swing==0)
  416.     swing=3;
  417.   }
  418.   setpage(!page,page);
  419.   page=!page;
  420.   if (kbhit() && swing<1)
  421.    swing=getch()==' ';
  422.   if (swing==2)
  423.   {
  424.    putimage(prevx[page],prevy[page],unball[page],0);
  425.    setcolor(p[0]);
  426.    pieslice(295,c[320],pangle[page],pangle[page]+1,44);
  427.    setcolor(p[7]);
  428.    pieslice(295,c[320],pangle[!page],pangle[!page]+1,44);
  429.    getimage(prevx[page],prevy[page],prevx[page]+11,prevy[page]+9,unball[page]);
  430.    swing=3;
  431.   }
  432.   else
  433.    delay(2);
  434.   px=((x+=vx)/85);
  435.   py=((y+=vy)>>6);
  436.  } while (swing<3 || !hit);
  437.  return(1);
  438. }
  439.  
  440. int pitch()
  441. {
  442.  if (screen==0)
  443.   return(pitch0());
  444.  else
  445.   return(pitch12());
  446. }
  447.  
  448. void fireworks(int runs, int eg)
  449. {
  450.  int
  451.   i, j, k, p, sprd, cx[4], cy[4], ddrcx[4][10][50], ddrcy[4][10][50],
  452.   ci[4]={0,1,2,3};
  453.  
  454.  setpage(0,0);
  455.  if (eg)
  456.  {
  457.   p=random(10)+1;
  458.   for (i=0; i<4; i++)
  459.   {
  460.    cx[i]=random(241)+200;
  461.    cy[i]=random(150)+70;
  462.   }
  463.  }
  464.  else
  465.  {
  466.   p=10;
  467.   switch(runs)
  468.   {
  469.    case 1 : cx[0]=320; cy[0]=90; break;
  470.    case 2 : cx[0]=200; cy[0]=cy[1]=100; cx[1]=440; break;
  471.    case 3 : cx[0]=200; cy[0]=cy[2]=110; cx[1]=320; cy[1]=90; cx[2]=440;
  472.             break;
  473.    case 4 : cx[0]=200; cy[0]=cy[3]=110; cx[1]=280; cy[1]=cy[2]=90;
  474.             cx[2]=360; cx[3]=440; break;
  475.   }
  476.  }
  477.  for (i=0; i<4; i++)
  478.   ci[i]=random(4);
  479.  for (i=0; i<10; i++)
  480.  {
  481.   sprd=(i+1)*(random(5)+5);
  482.   for (k=0; k<runs; k++)
  483.    for (j=0; j<50; j++)
  484.    {
  485.     ddrcx[k][i][j]=abs(random(sprd)*((random(2)<<1)-1)+cx[k]);
  486.     ddrcy[k][i][j]=abs(random(sprd)*((random(2)<<1)-1)+cy[k]);
  487.     if (ddrcx[k][i][j]>638)
  488.      ddrcx[k][i][j]=1276-ddrcx[k][i][j];
  489.     if (ddrcy[k][i][j]>347)
  490.      ddrcy[k][i][j]=694-ddrcy[k][i][j];
  491.    }
  492.  }
  493.  for (j=0; j<50; j++)
  494.   for (k=0; k<runs; k++)
  495.    putimage(ddrcx[k][0][j],c[ddrcy[k][0][j]],point[ci[k]],1);
  496.  for (i=1; i<p; i++)
  497.  {
  498.   if (eg && kbhit())
  499.    break;
  500.   for (j=0; j<50; j++)
  501.    for (k=0; k<runs; k++)
  502.    {
  503.     putimage(ddrcx[k][i-1][j],c[ddrcy[k][i-1][j]],point[ci[k]],1);
  504.     putimage(ddrcx[k][i][j],c[ddrcy[k][i][j]],point[ci[k]],1);
  505.    }
  506.  }
  507.  for (j=0; j<50; j++)
  508.   for (k=0; k<runs; k++)
  509.    putimage(ddrcx[k][i-1][j],c[ddrcy[k][i-1][j]],point[ci[k]],1);
  510. }
  511.  
  512. void runbases12(int bases)
  513. {
  514.  int i, j, k, x, y;
  515.  
  516.  runner[0]=1;
  517.  setpage(1,-1);
  518.  getimage(strtx[0]+2,c[strty[0]]-1,strtx[0]+7,c[strty[0]]+6,unman[0][1]);
  519.  setpage(0,-1);
  520.  getimage(strtx[0],c[strty[0]],strtx[0]+5,c[strty[0]]+7,unman[0][0]);
  521.  for (k=0; k<bases; k++)
  522.  {
  523.   page=0;
  524.   setpage(1,1);
  525.   for (j=1; j<4; j++)
  526.    if (runner[j])
  527.     putimage(strtx[j],c[strty[j]],unman[j][0],0);
  528.   setpage(0,-1);
  529.   for (i=2; i<34; i++)
  530.   {
  531.    for (j=0; j<4; j++)
  532.     if (runner[j])
  533.     {
  534.      x=strtx[j]+i*dirx[j];
  535.      y=strty[j]+i*diry[j];
  536.      putimage(x-(dirx[j]<<1),c[y-(diry[j]<<1)],unman[j][page],0);
  537.      getimage(x,c[y],x+5,c[y]+7,unman[j][page]);
  538.      putimage(x,c[y],man[j],((screen==2)<<1)+1);
  539.     }
  540.    setpage(!page,page);
  541.    page=!page;
  542.    delay(10);
  543.    if (bases==4)
  544.     delay(18);
  545.   }
  546.   if (runner[3])
  547.   {
  548.    x=strtx[0]; y=strty[0];
  549.    putimage(x-dirx[3],c[y-diry[3]],unman[3][0],0);
  550.    setpage(1,-1);
  551.    putimage(x,c[y],unman[3][1],0);
  552.    innruns[inning][team]++;
  553.    runs[team]++;
  554.    scorerun();
  555.   }
  556.   for (j=3; j>0; j--)
  557.    runner[j]=runner[j-1];
  558.   runner[0]=0;
  559.   for (j=3; j>0; j--)
  560.    if (runner[j])
  561.    {
  562.     x=strtx[j]; y=strty[j];
  563.     setpage(0,-1);
  564.     putimage(x-dirx[j-1],c[y-diry[j-1]],unman[j-1][0],0);
  565.     getimage(x,c[y],x+5,c[y]+7,unman[j][0]);
  566.     putimage(x,c[y],man[j],((screen==2)<<1)+1);
  567.     setpage(1,-1);
  568.     putimage(x,c[y],unman[j-1][1],0);
  569.     getimage(x+dirx[j],c[y+diry[j]],x+5+dirx[j],c[y+diry[j]]+7,unman[j][1]);
  570.     putimage(x,c[y],man[j],((screen==2)<<1)+1);
  571.    }
  572.  }
  573. }
  574.  
  575. void runbases0(int bases)
  576. {
  577.  int i, j, k, x, y;
  578.  
  579.  runner[0]=1;
  580.  getimage(strtx[0],c[strty[0]],strtx[0]+5,c[strty[0]]+7,unman[0][0]);
  581.  for (k=0; k<bases; k++)
  582.  {
  583.   for (j=1; j<4; j++)
  584.    if (runner[j])
  585.     putimage(strtx[j],c[strty[j]],unman[j][0],0);
  586.   for (i=1; i<34; i++)
  587.   {
  588.    for (j=0; j<4; j++)
  589.     if (runner[j])
  590.     {
  591.      x=strtx[j]+i*dirx[j];
  592.      y=strty[j]+i*diry[j];
  593.      putimage(x-dirx[j],c[y-diry[j]],unman[j][0],0);
  594.      getimage(x,c[y],x+5,c[y]+7,unman[j][0]);
  595.      putimage(x,c[y],man[j],1);
  596.     }
  597.    delay(7);
  598.    if (bases==4)
  599.     delay(14);
  600.   }
  601.   if (runner[3])
  602.   {
  603.    x=strtx[0]; y=strty[0];
  604.    putimage(x,c[y],unman[3][0],0);
  605.    innruns[inning][team]++;
  606.    runs[team]++;
  607.    scorerun();
  608.   }
  609.   for (j=3; j>0; j--)
  610.    runner[j]=runner[j-1];
  611.   runner[0]=0;
  612.   for (j=3; j>0; j--)
  613.    if (runner[j])
  614.    {
  615.     x=strtx[j]; y=strty[j];
  616.     putimage(x,c[y],unman[j-1][0],0);
  617.     getimage(x,c[y],x+5,c[y]+7,unman[j][0]);
  618.     putimage(x,c[y],man[j],1);
  619.    }
  620.  }
  621. }
  622.  
  623. int hit()
  624. {
  625.  int i, j, k, q, ballindex, hole;
  626.  long dx, dy, dist;
  627.  
  628.  ballindex=0;
  629.  hole=5;
  630.  do
  631.  {
  632.   putimage(prevx[page],prevy[page],unball[page],0);
  633.   prevx[page]=px; prevy[page]=c[py];
  634.   getimage(px,c[py],px+11,c[py]+9,unball[page]);
  635.   if (ballindex<4)
  636.   {
  637.    putimage(px,c[py],ballmask[ballindex],3);
  638.    putimage(px,c[py],ball[ballindex],2);
  639.   }
  640.   setpage(!page,page);
  641.   if (screen !=0)
  642.    page=!page;
  643.   if (px<104 || px>525)
  644.    vx=-vx;
  645.   if (py<309)
  646.   {
  647.    j=px+5>>1;
  648.    if (px>356 && 494-j-py<5)
  649.    {
  650.     i=-(vx/85<<6);
  651.     vx=-(vy>>6)*85;
  652.     vy=i-(i>>5);
  653.     vx-=(vx>>6);
  654.     vx-=48;
  655.     y-=32;
  656.    }
  657.    if (px<284 && 174+j-py<5)
  658.    {
  659.     i=(vx/85<<6);
  660.     vx=(vy>>6)*85;
  661.     vy=i-(i>>5);
  662.     vx-=(vx>>6);
  663.     vx+=48;
  664.     y-=32;
  665.    }
  666.   }
  667.   k=(px>320)*5;
  668.   for (i=k; i<k+5; i++)
  669.   {
  670.    dx=holex[i]-px-5;
  671.    dy=holey[i]-py-4;
  672.    dist=dx*dx+dy*dy;
  673.    j=holer[i]*holer[i];
  674.    if (dist<j)
  675.    {
  676.     q=(dx>=0);
  677.     vx+=(25-abs(dx))*(q+q-1);
  678.     q=(dy>=0);
  679.     vy+=(((25-abs(dy))*(q+q-1)*85)>>6);
  680.    }
  681.    if (dist<j-500)
  682.    {
  683.     ballindex++;
  684.     vx>>=2;
  685.     vy>>=2;
  686.     hole=i%5;
  687.    }
  688.   }
  689.   if (py<12)
  690.   {
  691.    ballindex++;
  692.    vy=-128;
  693.    hole=-1;
  694.   }
  695.   px=((x+=vx)/85)+ballindex;
  696.   py=((y+=vy)>>6)+ballindex;
  697.   if (ballindex==0)
  698.    vy+=2;
  699.   delay(10);
  700.  } while (ballindex<4 && py<345);
  701.  setcolor(p[0]);
  702.  for (i=1; i>-1; i--)
  703.  {
  704.   setpage(i,-1);
  705.   putimage(prevx[i],prevy[i],unball[i],0);
  706.   pieslice(295,c[320],45,0,45);
  707.   pieslice(295,c[320],315,360,45);
  708.  }
  709.  if (hole<3)
  710.  {
  711.   if (hole==-1)
  712.   {
  713.    hole=3;
  714.    i=1+runner[1]+runner[2]+runner[3];
  715.   }
  716.   if (game)
  717.   {
  718.    if (screen==0)
  719.     runbases0(hole+1);
  720.    else
  721.     runbases12(hole+1);
  722.    hits[team]++;
  723.    scorehit();
  724.    if (hole==3)
  725.     fireworks(i,0);
  726.   }
  727.  }
  728.  else
  729.   hole=4;
  730.  setpage(-1,0);
  731.  if (hole<4)
  732.   return(1);
  733.  if (py>344)
  734.   return(0);
  735.  return(-1);
  736. }
  737.  
  738. void printchar(int x, int y, char ch)
  739. {
  740.  int i;
  741.  char osch[2]={0,0};
  742.  
  743.  if (game)
  744.  {
  745.   for (i=0; i<2; i++)
  746.   {
  747.    setpage(i,-1);
  748.    osch[0]=ch;
  749.    setfillstyle(1,p[1]);
  750.    bar(x,y,x+7,y+7);
  751.    setcolor(p[15]);
  752.    outtextxy(x,y,osch);
  753.   }
  754.   setfillstyle(1,p[0]);
  755.  }
  756. }
  757.  
  758. int atbat()
  759. {
  760.  int i, j, esc, out, strike, over;
  761.  
  762.  erascore();
  763.  for (i=0; i<4; i++)
  764.   for (j=0; j<2; j++)
  765.    innruns[i][j]=0;
  766.  for (team=0; team<2; team++)
  767.  {
  768.   runs[team]=hits[team]=0;
  769.  }
  770.  inning=team=over=0;
  771.  do
  772.  {
  773.   for (i=0; i<2; i++)
  774.   {
  775.    setpage(1-i,-1);
  776.    putimage(233,c[140],bases,0);
  777.   }
  778.   for (i=0; i<4; i++)
  779.    runner[i]=0;
  780.   out=strike=0;
  781.   scorerun();
  782.   scorehit();
  783.   printchar(572,c[324],out+48);
  784.   printchar(572,c[338],strike+48);
  785.   printchar(64,c[324],32+10*!team);
  786.   printchar(64,c[338],32+10*team);
  787.   do
  788.   {
  789.    if (team && inning>1 && runs[1]>runs[0])
  790.     break;
  791.    while (!pitch())
  792.    {
  793.     setpage(-1,page);
  794.     setcolor(p[15]);
  795.     outtextxy(276,c[55],"QUIT (Y/N)?");
  796.     do
  797.     {
  798.      ch=toupper(getch());
  799.     } while (ch!='N' && ch!='Y');
  800.     setfillstyle(1,p[2]);
  801.     bar(276,c[55],276+87,c[55]+7);
  802.     setfillstyle(1,p[0]);
  803.     if (ch=='Y')
  804.      return(0);
  805.     setpage(-1,!page);
  806.    }
  807.    i=hit();
  808.    if (i==0)
  809.    {
  810.     printchar(572,c[338],++strike+48);
  811.     if (strike==3)
  812.     {
  813.      printchar(572,c[324],++out+48);
  814.      printchar(572,c[338],(strike=0)+48);
  815.     }
  816.    }
  817.    else
  818.    {
  819.     if (i==-1)
  820.      printchar(572,c[324],++out+48);
  821.     printchar(572,c[338],(strike=0)+48);
  822.    }
  823.   } while (out<3);
  824.   if (game && team && inning<3)
  825.    inning++;
  826.   if (team && inning>2 && runs[0]!=runs[1])
  827.    over=1;
  828.   if (inning>2 && runs[1]>runs[0])
  829.    over=1;
  830.   team=!team;
  831.  } while (!over);
  832.  return(1);
  833. }
  834.  
  835. char *readimage()
  836. {
  837.  int size;
  838.  char *image;
  839.  
  840.  fread(&size,1,2,stream);
  841.  image=alloc(size);
  842.  fread(image,1,size,stream);
  843.  return image;
  844. }
  845.  
  846. void printcenter(int cx, int cy, char *str)
  847. {
  848.  outtextxy(cx-(textwidth(str)>>1)+1,cy-(textheight(str)>>1)+1,str);
  849. }
  850.  
  851. void hole(int cx, int cy, int r, char *str, int num)
  852. {
  853.  setcolor(p[10]);
  854.  setfillstyle(1,p[0]);
  855.  circle(cx,c[cy],r);
  856.  floodfill(cx,c[cy],p[10]);
  857.  setcolor(p[7]);
  858.  printcenter(cx,c[cy],str);
  859.  holex[num]=cx;
  860.  holey[num]=cy;
  861.  holer[num]=2+r;
  862. }
  863.  
  864. void holesym(int cx, int cy, int r, char *str, int num)
  865. {
  866.  hole(cx,cy,r,str,num);
  867.  hole(640-cx,cy,r,str,num+5);
  868. }
  869.  
  870. void initscreen()
  871. {
  872.  int
  873.   i, j,
  874.   fieldpts[14]={102,1,538,1,538,231,360,320,280,320,102,231,102,1},
  875.   hrpts[8]={102,1,538,1,538,12,102,12},
  876.   scrnpts[8]={0,0,639,0,639,349,0,349};
  877.  char *buffer;
  878.  
  879.  for (i=1; i<12; i+=2)
  880.   fieldpts[i]=c[fieldpts[i]];
  881.  for (i=1; i<8; i+=2)
  882.  {
  883.   hrpts[i]=c[hrpts[i]];
  884.   scrnpts[i]=c[scrnpts[i]];
  885.  }
  886.  if (screen!=0)
  887.  {
  888.   setcolor(p[1]);
  889.   setfillstyle(1,p[1]);
  890.   fillpoly(4,scrnpts);
  891.   setcolor(p[9]);
  892.   setfillstyle(1,p[2]);
  893.   fillpoly(6,fieldpts);
  894.   setfillstyle(1,p[4]);
  895.   fillpoly(4,hrpts);
  896.  }
  897.  else
  898.  {
  899.   setcolor(p[9]);
  900.   drawpoly(8,fieldpts);
  901.   drawpoly(4,hrpts);
  902.  }
  903.  setcolor(p[1]);
  904.  line(fieldpts[6],fieldpts[7],fieldpts[8],fieldpts[9]);
  905.  setcolor(p[0]);
  906.  printcenter(322,c[7],"H O M E  R U N");
  907.  setcolor(p[14]);
  908.  printcenter(320,c[6],"H O M E  R U N");
  909.  holesym(208,90,26,"1B",0);
  910.  holesym(230,40,24,"2B",1);
  911.  holesym(140,40,24,"3B",2);
  912.  holesym(285,90,30,"OUT",3);
  913.  holesym(165,130,26,"OUT",4);
  914.  setcolor(p[15]);
  915.  outtextxy(80,c[310]," 1   2   3   X   R   H");
  916.  outtextxy(8,c[324],"VISITOR");
  917.  outtextxy(8,c[338],"HOME");
  918.  outtextxy(500,c[324],"OUTS");
  919.  outtextxy(500,c[338],"STRIKES");
  920.  if (screen==2)
  921.  {
  922.   stream=fopen("bb.dat","rb");
  923.   if (stream==NULL)
  924.   {
  925.    printf("File 'BB.DAT' not found./n/nPress any key to continue.");
  926.    getch();
  927.    exit(1);
  928.   }
  929.   bases=readimage();
  930.   putimage(233,c[140],bases,0);
  931.   ball[0]=readimage();
  932.   ballmask[0]=readimage();
  933.   ball[1]=readimage();
  934.   ballmask[1]=readimage();
  935.   ball[2]=readimage();
  936.   ballmask[2]=readimage();
  937.   ball[3]=readimage();
  938.   ballmask[3]=readimage();
  939.   man[0]=readimage();
  940.   man[3]=man[0];
  941.   man[1]=readimage();
  942.   man[2]=man[1];
  943.   fclose(stream);
  944.  }
  945.  else
  946.  {
  947.   for (i=0; i<4; i++)
  948.   {
  949.    line(strtx[i],c[strty[i]]+6,strtx[(i+1)%4],c[strty[(i+1)%4]]+6);
  950.    setfillstyle(1,p[7]);
  951.    circle(5,3,5-i);
  952.    floodfill(5,3,p[7]);
  953.    ball[i]=alloc(imagesize(0,0,10-(i<<1),6));
  954.    ballmask[i]=alloc(imagesize(0,0,10-(i<<1),6));
  955.    getimage(i,i,10-i,6,ball[i]);
  956.    putimage(i,i,ball[i],4);
  957.    getimage(i,i,10-i,6,ballmask[i]);
  958.    setfillstyle(1,p[0]);
  959.    bar(0,0,10,6);
  960.   }
  961.   bases=alloc(imagesize(233,c[140],399,c[222]));
  962.   getimage(233,c[140],399,c[222],bases);
  963.   line(0,0,1,0);
  964.   line(0,1,1,1);
  965.   line(0,0,0,7);
  966.   line(0,3,5,7);
  967.   line(0,4,5,2);
  968.   man[0]=alloc(imagesize(0,0,5,7));
  969.   getimage(0,0,5,7,man[0]);
  970.   bar(0,0,5,7);
  971.   man[3]=man[0];
  972.   line(5,0,4,0);
  973.   line(5,1,4,1);
  974.   line(5,0,5,7);
  975.   line(5,3,0,7);
  976.   line(5,4,0,2);
  977.   man[1]=alloc(imagesize(0,0,5,7));
  978.   getimage(0,0,5,7,man[1]);
  979.   man[2]=man[1];
  980.   bar(0,0,5,7);
  981.  }
  982.  for (i=0; i<4; i++)
  983.  {
  984.   switch(i)
  985.   {
  986.    case 0 : j=8; break;
  987.    case 1 : j=11; break;
  988.    case 2 : j=12; break;
  989.    case 3 : j=14; break;
  990.   }
  991.   putpixel(0,0,p[j]);
  992.   point[i]=alloc(imagesize(0,0,1,1));
  993.   getimage(0,0,1,1,point[i]);
  994.   putpixel(0,0,p[1]);
  995.  }
  996.  if (screen!=0)
  997.  {
  998.   buffer=alloc(imagesize(0,0,639,88));
  999.   for (i=0; i<4; i++)
  1000.   {
  1001.    j=i*87;
  1002.    setpage(0,-1);
  1003.    getimage(0,j,639,j+88,buffer);
  1004.    setpage(1,-1);
  1005.    putimage(0,j,buffer,0);
  1006.   }
  1007.   free(buffer);
  1008.  }
  1009.  for (i=0; i<2; i++)
  1010.  {
  1011.   unball[i]=alloc(imagesize(0,0,11,9));
  1012.   for (j=0; j<4; j++)
  1013.    unman[j][i]=alloc(imagesize(0,0,5,7));
  1014.  }
  1015.  setfillstyle(1,p[0]);
  1016. }