home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 2: Collection B / 17Bit_Collection_B.iso / files / 1850.dms / in.adf / RUMMY / SOURCE / turn.c.pp / turn.c
Encoding:
C/C++ Source or Header  |  1990-10-30  |  11.8 KB  |  458 lines

  1. /* TURN.C
  2.  * This module has the functions to get user moves
  3.  */
  4.  
  5. #include    <proto/all.h>
  6. #include    <intuition/intuition.h>
  7. #include    <stdlib.h>
  8. #include    <string.h>
  9. #include    <math.h>
  10. #include    "defns.h"
  11. #include    "externs.h"
  12.  
  13. USHORT    fix;    /*used to pass by reference auto variables*/
  14.  
  15. VOID    manturn(cp,np,pp,nhp)
  16. struct    playerinfo    *cp,*np,*pp;    /* current, following, previous players */
  17. USHORT    nhp; /*number of human players.*/
  18. {
  19.     struct    IntuiMessage    *msg;
  20.     struct    card    c;
  21.     USHORT    fin=0,code,exch=0,temp; /*flag showing whether a card has been dropped*/
  22.     ULONG    class,gid,fdpvis=0;
  23.     struct    Gadget    *gaddr;
  24.     /* deselect fup,fdp*/
  25.     temp = RemoveGList(wind,&stdgad[FUPG],2);
  26.     RefreshGList(&stdgad[FUPG],wind,NULL,2);
  27.     stdgad[FUPG].Flags &= ~SELECTED;
  28.     stdgad[FDPG].Flags &= ~SELECTED;
  29.     DrawImage(wind->RPort,packim[0][0],FDPX,FDPY);
  30.     TXTOUT(180,21,1,0,cp->name)
  31.     if(nhp>1 && !cp->viewcard)
  32.     {/* change players at keyboard*/
  33.         OffMenu(wind,0x0020); /*reorder off*/
  34.         OffMenu(wind,0xf862); /*modmem off*/
  35.         OffMenu(wind,0x0040); /*about off*/
  36.         TXTOUT(MESX,MESY,3,0,"Press Continue to display cards")
  37.         WAITCONT;
  38.         OnMenu(wind,0x0020); /*reorder on*/
  39.         OnMenu(wind,0xf862); /*modmem on*/
  40.         OnMenu(wind,0x0040); /*about on*/
  41.     }
  42.     AddGList(wind,&stdgad[FUPG],temp,2,NULL);
  43.     disphand(cp);
  44.     handgads(cp->nchld,cp->yc);    /*place gadget over each card*/
  45.     TXTOUT(MESX,MESY,1,0,"Select Move                     ")
  46.     while(!fin && !exgm && !quit)
  47.     {
  48.         cont=0;
  49.         Wait(1l<<mp->mp_SigBit);
  50.         while(msg=(struct IntuiMessage *)GetMsg(mp))
  51.         {
  52.             class=msg->Class;
  53.             code=msg->Code;
  54.             gaddr=(struct Gadget *)(msg->IAddress);
  55.             ReplyMsg((struct Message *)msg);
  56.             switch(class)
  57.             {
  58.             case GADGETUP:
  59.                 gid=gaddr->GadgetID;
  60.                 if(gid>=HANDG1 && gid<=HANDG7 && gaddr->Flags&SELECTED && !exch)
  61.                 { /*card from selected*/
  62.                     if(stdgad[FUPG].Flags&SELECTED && !fdpvis)
  63.                     { /*exchange with top of fup*/
  64.                         gid = gid - HANDG1 +1;
  65.                         exch=1;
  66.                         c=NEXTFUP;
  67.                         PUTFUP((cp->hand[gid]));
  68.                         cp->hand[gid]=c;
  69.                         disphand(cp);
  70.                         RefreshGList(&hgads[1],wind,NULL,cp->nchld);
  71.                         DRAWFUP
  72.                         DrawImage(wind->RPort,packim[0][0],FDPX,FDPY);
  73.                         maintainmem(cp,pp,np,c,CURRPLRHOLDS);
  74.                         maintainmem(cp,pp,np,fup[fuptc],CURRPLRDROPD);
  75.                         TXTOUT(MESX,MESY,3,0,"Exchange made - hit continue")
  76.                     }
  77.                     else if(stdgad[FDPG].Flags&SELECTED)
  78.                         { /*exhange fdp top card*/
  79.                             exch=1;
  80.                             gid = gid - HANDG1 +1;
  81.                             maintainmem(cp,pp,np,fup[fuptc],GONEPAST);
  82.                             maintainmem(cp,pp,np,fup[fuptc],CURRPLRDROPD);
  83.                             c=NEXTFDP;
  84.                             PUTFUP((cp->hand[gid]));
  85.                             cp->hand[gid]=c;
  86.                             disphand(cp);
  87.                             RefreshGList(&hgads[1],wind,NULL,cp->nchld);
  88.                             DRAWFUP
  89.                             cp->mem[CARD2(c)] |= CURRPLRHOLDS;
  90.                             DrawImage(wind->RPort,packim[0][0],FDPX,FDPY);
  91.                             maintainmem(cp,pp,np,fup[fuptc],CURRPLRDROPD);
  92.                             TXTOUT(MESX,MESY,3,0,"Exchange made - hit continue")
  93.                         }
  94.                 }
  95.                 else if(gid==FDPG && !fdpvis && !exch)
  96.                     {/*make fdp visible*/
  97.                         DRAWFDP
  98.                         fdpvis=1; /*prevents use of fup*/
  99.                     }
  100.                 else if(gid>=SETGAD0 && gid<=SETGAD5) /*add to set*/
  101.                     if(addtofus(cp,gid-SETGAD0))
  102.                     {
  103.                         handgads(cp->nchld,cp->yc);
  104.                         REMHAND(cp)
  105.                         disphand(cp);
  106.                         if(!cp->nchld) fin=1; /*no card left*/
  107.                     }
  108.                     else ;
  109.                 else if(gid==SUBMITG) /*submit new set*/
  110.                     if(temp=submitset(cp))
  111.                     {
  112.                         handgads(cp->nchld,cp->yc);
  113.                         REMHAND(cp)
  114.                         disphand(cp);
  115.                         if(!cp->nchld) fin=1; /*no cards left*/
  116.                         TXTOUT(MESX,MESY,1,0,"Submission Accepted           ");
  117.                     }
  118.                     else
  119.                     {
  120.                         TXTOUT(MESX,MESY,2,0,"Submission Rejected             ");
  121.                     }
  122.                 else if(gid==FUPG && !exch && fdpvis)
  123.                     {    /*do not take fdp card*/
  124.                         TXTOUT(MESX,MESY,3,0,"Exchange made - hit continue")
  125.                         maintainmem(cp,pp,np,fup[fuptc],GONEPAST);
  126.                         maintainmem(cp,pp,np,fup[fuptc],CURRPLRDROPD);
  127.                         c=NEXTFDP;
  128.                         PUTFUP(c);
  129.                         maintainmem(cp,pp,np,fup[fuptc],CURRPLRDROPD);
  130.                         exch=1;
  131.                         DrawImage(wind->RPort,packim[0][0],FDPX,FDPY);
  132.                         DRAWFUP;
  133.                     }
  134.                 else 
  135.                 {
  136.                     if(cont && exch) fin=1; /*exchange must be made to finish move*/
  137.                     else if(cont && !exch && !fin)
  138.                     {
  139.                         TXTOUT(MESX,MESY,2,0,"No exchange made yet     ")
  140.                     }
  141.                 }
  142.                 break;
  143.             case MENUPICK:
  144.                 prgenmsg(class,code,(APTR)gaddr,cp);
  145.                 break;
  146.             }
  147.         }
  148.     }
  149.     handgads(0,0);
  150.     if(!cp->viewcard) hidecards(cp);
  151.     TXTOUT(180,21,1,0,"                 ") /*remove name*/
  152.     TXTOUT(MESX,MESY,3,0,"                              ")
  153. }
  154.  
  155.                         
  156. VOID    disphand(struct playerinfo *p)
  157. {
  158.     register    USHORT    i,x=HANDLEFT,y=p->yc+HANDTOP,v;
  159.     char    b[4];
  160.     for(i=1,v=0;i<=p->nchld;i++) v += p->hand[i].n;
  161.     TXTOUT(270,p->yc+HVTPY,1,0,"     ");
  162.     stci_d(out,v);
  163.     TXTOUT(270,p->yc+HVTPY,1,0,out);
  164.     stci_d(b,p->turn);
  165.     TXTOUT(270,p->yc+NWTPY+9,1,0,b);
  166.     if(p->nchld)
  167.     {
  168.         DrawImage(wind->RPort,packim[0][CARD2(p->hand[1])],x,y);
  169.         for(i=2;i<=p->nchld;i++)
  170.             DrawImage(wind->RPort,packim[1][CARD2(p->hand[i])],x-(i-1)*17,y);
  171.     }
  172.     else REMHAND(p);
  173. }
  174.  
  175. VOID    compacthand(struct card h[],USHORT *n)
  176. {
  177.     register    USHORT    s,d;
  178.     for(d=1;d!=*n && !CDEQU(h[d],nulcard);d++);    /*find first nulcard*/
  179.     if(d!=*n)
  180.     {
  181.         for(s=d+1;s<=*n;s++) 
  182.             if(!CDEQU(h[s],nulcard)) h[d++]=h[s];
  183.         *n=d-1;
  184.     }
  185.     if(CDEQU(h[*n],nulcard) && *n!=0) --*n;
  186. }
  187.  
  188. VOID    handgads(USHORT n,USHORT y)
  189. {/* put gadgets over users cards*/
  190.     static    USHORT    num=0;
  191.     register    USHORT    i;
  192.     y+=HANDTOP;
  193.     if(num) 
  194.     {
  195.         RemoveGList(wind,&hgads[1],num);
  196.         RefreshGList(&hgads[1],wind,NULL,num);
  197.     }
  198.     for(i=1;i<=n;i++)
  199.     { /*initialise next gadget*/
  200.         hgads[i-1].NextGadget = &hgads[i];
  201.         hgads[i].TopEdge = y;
  202.         hgads[i].Flags &= ~(SELECTED | GADGDISABLED);
  203.     }
  204.     hgads[i-1].NextGadget = NULL;
  205.     if(i!=1) AddGList(wind,&hgads[1],~0,i-1,NULL);
  206.     num=i-1;
  207. }
  208.  
  209. VOID    hidecards(struct playerinfo *p)
  210. {
  211.     register    USHORT    i;
  212.     char    b[4];
  213.     TXTOUT(270,p->yc+HVTPY,1,0,"     ");
  214.     stci_d(b,p->turn);
  215.     TXTOUT(270,p->yc+NWTPY+9,1,0,b);
  216.     if(p->nchld)
  217.     {
  218.         DrawImage(wind->RPort,packim[0][0],HANDLEFT,p->yc+HANDTOP);
  219.         for(i=2;i<=p->nchld;i++) DrawImage(wind->RPort,packim[1][0],HANDLEFT-(i-1)*17,p->yc+HANDTOP);
  220.     }
  221.     else REMHAND(p);
  222. }
  223.  
  224. USHORT    submitset(struct playerinfo *p)
  225. {/* submit set from user */
  226.     struct    card    t[10];
  227.     register    USHORT    i,d,n,samesuit=1,samenum=1;
  228.     for(i=1,d=0;i<=p->nchld;i++)
  229.         if(hgads[i].Flags&SELECTED) t[++d]=p->hand[i];    /*copy selected cards*/
  230.     for(i=2;i<=d;i++)
  231.     {
  232.         if(t[i-1].n!=t[i].n) samenum=0;    /*not same number*/
  233.         if(t[i-1].s!=t[i].s) samesuit=0;    /*not same suit*/
  234.     }
  235.     if(d<3 ||(!samesuit && !samenum)) return 0; /*rejected*/
  236.     if(samesuit)
  237.     {/*check set forms continuous sequence*/
  238.         fix=d; /*cannot pass address of d*/
  239.         ssortn(t,&fix);    /*sort on number only*/
  240.         d=fix;
  241.         for(i=2;i<=d;i++)
  242.             if((t[i-1].n!=t[i].n-1) && !(t[i-1].n==KING && t[i].n==ACE)) return 0; /*rejected*/
  243.     }
  244.     /*set accepted if this point reached*/
  245.     for(i=1;i<=p->nchld;i++) if(hgads[i].Flags&SELECTED) p->hand[i]=nulcard;
  246.     compacthand(p->hand,&p->nchld);
  247.     for(i=0;i<=5 && fupset[i]->ncard!=0;i++) ;/*find empty set*/
  248.     fupset[i]->ncard=d;
  249.     
  250.     if(samesuit)
  251.         for(n=1;n<=d;n++)
  252.         {
  253.             fupset[i]->cards[n+t[1].n-1]=t[n];
  254.             maintainmem(NULL,NULL,NULL,t[n],INFUPSET);
  255.         }
  256.         /*cards inserted so that card n is at fupset[i]->card[n] to simplify addition to both ends of the set*/
  257.     else
  258.         for(n=1;n<=d;n++)
  259.         {
  260.             fupset[i]->cards[n]=t[n];
  261.             maintainmem(NULL,NULL,NULL,t[n],INFUPSET);
  262.         }
  263.     sortdispset();
  264.     return 1;    /*accepted...tells program to redo gadgets for cards*/
  265. }
  266.  
  267. VOID    sortdispset()
  268. {
  269.     static    USHORT    num=0;
  270.     register    USHORT    i,j,f,e=1;
  271.     register    ULONG    l;
  272.     struct    set    *s;
  273.     if(num)
  274.     { /*remove any gadgets already in place*/
  275.         RemoveGList(wind,&setgads[0],num);
  276.         RefreshGList(&setgads[0],wind,NULL,num);
  277.     }
  278.     while(e) /*ensure largest set comes first*/
  279.         for(i=0,e=0;i<5;i++)
  280.         {
  281.             if(fupset[i]->ncard<fupset[i+1]->ncard)
  282.             {
  283.                 e=1; /*exchange made*/
  284.                 s=fupset[i];fupset[i]=fupset[i+1];fupset[i+1]=s;
  285.             }
  286.         }
  287.     num=0;
  288.     for(i=0;i<=5;i++)
  289.         if(fupset[i]->ncard!=0)
  290.         {
  291.             for(j=14;CDEQU(fupset[i]->cards[j],nulcard);j--) ;
  292.             f=j;
  293.             if(i<=2) l=566; else l=416;
  294.             DrawImage(wind->RPort,packim[0][CARD2(fupset[i]->cards[j])],l,setpos[i]);
  295.             j--;
  296.             for(;!CDEQU(fupset[i]->cards[j],nulcard) && j;j--) 
  297.                 DrawImage(wind->RPort,packim[1][CARD2(fupset[i]->cards[j])],l-(f-j)*17,setpos[i]);
  298.             if(i!=0) setgads[i-1].NextGadget = &setgads[i];
  299.             setgads[i].LeftEdge = l-17*(fupset[i]->ncard-1);
  300.             setgads[i].Width = (fupset[i]->ncard-1)*17+64;
  301.             setgads[i].NextGadget = NULL;
  302.             num++;    /*number of gadgets added*/
  303.         }
  304.     if(num) AddGList(wind,&setgads[0],~0,num,NULL);
  305. }
  306.     
  307. VOID    ssortn(struct card a[],USHORT *n)
  308. { /*selection sort a[] on card number only..Faster version for fupset*/
  309.     register    USHORT    i,j,minpos;
  310.     struct    card    t,minval;
  311.     for(i=1;i<*n;i++)
  312.     {
  313.         minval.n=15;minpos=0;
  314.         for(j=i;j<=*n;j++) if(a[j].n<=minval.n) minval=a[minpos=j];
  315.         a[minpos]=a[i];
  316.         a[i]=minval;
  317.     }
  318.     /*decide whether ace is high or low*/
  319.     if(a[1].n==ACE && (a[2].n!=2 || a[3].n!=3) && a[*n].n==KING && a[(*n)-1].n==QUEEN)
  320.     { /*put ace at end*/
  321.         t=a[1];a[1]=nulcard;
  322.         compacthand(a,n);
  323.         a[++(*n)]=t;
  324.     }
  325. }
  326.  
  327. VOID    hsort(struct card a[],USHORT n)
  328. { /* sort player cards.. sorts by number within suit */
  329.     register    USHORT    i,j,maxpos,max;
  330.     struct    card    maxval;
  331.     for(i=1;i<n;i++)
  332.     {
  333.         maxval.n=0;maxval.s=0;maxpos=0;max=0;
  334.         for(j=i;j<=n;j++) if(CARD2(a[j])>=max)
  335.         {
  336.             maxval=a[maxpos=j];
  337.             max=CARD2(maxval);
  338.         }
  339.         a[maxpos]=a[i];
  340.         a[i]=maxval;
  341.     }
  342. }
  343.  
  344.  
  345.  
  346. VOID    maintainmem(cp,pp,np,card,flag)
  347. struct    playerinfo    *cp,*pp,*np;
  348. struct    card    card;
  349. USHORT    flag;
  350. {
  351.     register    USHORT    n=CARD2(card);
  352.     switch(flag)
  353.     {
  354.     case CURRPLRHOLDS:
  355.         if(cp) cp->mem[n] |= flag;
  356.         if(pp) pp->mem[n] |= NEXTPLRHOLDS;
  357.         if(np) np->mem[n] |= PREVPLRHOLDS;
  358.         break;
  359.     case CURRPLRDROPD:
  360.         if(cp)
  361.         {
  362.             cp->mem[n] |= flag;
  363.             cp->mem[n] &= ~CURRPLRHOLDS;
  364.         }
  365.         if(pp)
  366.         {
  367.             pp->mem[n] |= NEXTPLRDROPD;
  368.             pp->mem[n] &= ~NEXTPLRHOLDS;
  369.         }
  370.         if(np)
  371.         {
  372.             np->mem[n] |= PREVPLRDROPD;
  373.             np->mem[n] &= ~PREVPLRHOLDS;
  374.         }
  375.         break;
  376.     case GONEPAST:
  377.     case INFUPSET:
  378.         plr[1]->mem[n] |= flag;
  379.         plr[1]->mem[n] &= ~(CURRPLRHOLDS | PREVPLRHOLDS | NEXTPLRHOLDS);
  380.         plr[2]->mem[n] |= flag;
  381.         plr[2]->mem[n] &= ~(CURRPLRHOLDS | PREVPLRHOLDS | NEXTPLRHOLDS);
  382.         plr[3]->mem[n] |= flag;
  383.         plr[3]->mem[n] &= ~(CURRPLRHOLDS | PREVPLRHOLDS | NEXTPLRHOLDS);
  384.         break;
  385.     }
  386. }
  387.  
  388.  
  389. USHORT    addtofus(struct playerinfo *p,ULONG set)
  390. {
  391.     register    struct    card    *fsc,*phc;
  392.     register    USHORT    *fsn,phn,nomore,i,f,l,c=0; /*change made flag*/
  393.     USHORT    ncrd=p->nchld;
  394.     char    b[4];
  395.     fsc=fupset[set]->cards;fsn=&fupset[set]->ncard;
  396.     phc=p->hand;phn=p->nchld;
  397.     for(f=1;CDEQU(fsc[f],nulcard);f++) ; /*find first card of set*/
  398.     l=f+(*fsn)-1; /*position of last card of set*/
  399.     if(fsc[f].s==fsc[f+1].s) /*same suit*/
  400.         for(nomore=0;!nomore && !quit && !exgm;)
  401.         {
  402.             for(nomore=1,i=1;i<=phn && !quit && !exgm;i++)
  403.             {
  404.                 if(hgads[i].Flags&SELECTED && !CDEQU(phc[i],nulcard))
  405.                 {
  406.                     if(fsc[f].n==phc[i].n+1 && fsc[f].s==phc[i].s)
  407.                     { /*add before first card of set*/
  408.                         fsc[--f]=phc[i];
  409.                         maintainmem(NULL,NULL,NULL,phc[i],INFUPSET);
  410.                         (*fsn)++;
  411.                         phc[i]=nulcard;
  412.                         c=1; /*change made*/
  413.                         nomore=0;
  414.                     }
  415.                     else if(((fsc[l].n==phc[i].n-1 && phc[i].n!=2) || (fsc[l].n==KING && phc[i].n==ACE))
  416.                         && fsc[l].s==phc[i].s)
  417.                     { /*add after last card*/
  418.                         fsc[++l]=phc[i];
  419.                         maintainmem(NULL,NULL,NULL,phc[i],INFUPSET);
  420.                         phc[i]=nulcard;
  421.                         c=1;
  422.                         (*fsn)++;
  423.                         nomore=0;
  424.                     }
  425.                 }
  426.             }
  427.         }
  428.     else /*same number set*/
  429.         for(i=1;i<=phn && !quit && !exgm;i++)
  430.             if(hgads[i].Flags&SELECTED && !CDEQU(p->hand[i],nulcard))
  431.             {
  432.                 if(fsc[l].n==phc[i].n)
  433.                 { /*insert after last card*/
  434.                     fsc[++l]=phc[i];
  435.                     maintainmem(NULL,NULL,NULL,phc[i],INFUPSET);
  436.                     (*fsn)++;
  437.                     phc[i]=nulcard;
  438.                     c=1;
  439.                 }
  440.             }
  441.     if(c)
  442.     {
  443.         sortdispset(); /*redisplay sets if changes made*/
  444.         compacthand(p->hand,&p->nchld);
  445.         ncrd-=p->nchld;
  446.         stci_d(b,ncrd);
  447.         TXTOUT(MESX,MESY,1,0,"                ");
  448.         TXTOUT(MESX,MESY,1,0,b);
  449.         TXTOUT(MESX+2*FWIDTH,MESY,1,0,"Cards Added                   ");
  450.     }
  451.     else
  452.     {
  453.         TXTOUT(MESX,MESY,2,0,"No cards added               ");
  454.     }
  455.  
  456.     return c;
  457. }
  458.