SMBFUNC.C
上传用户:hanguang
上传日期:2007-04-01
资源大小:93k
文件大小:22k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //SET UP ALL OF THE GRAPHICS AND OTHER JUNK//////////////////////////////////
  2. void init()
  3. {
  4.   int loop;
  5.   x_set_mode(X_MODE_320x240,320); //SET MODE X//
  6.   x_set_tripplebuffer(240); //INSTALL TRIPPLE BUFFER//
  7.   install_new_key_handler(); //INSTALL KEYBOARD HANDLER//
  8.   x_install_vsync_handler(1); //INSTALL VSYNC HANDLER//
  9.   for (loop=0;loop<52;loop++) //ALLOCATE MEM FOR GRAPHICS//
  10.     if ((data.block[loop]=(char far *)malloc(258))==NULL)
  11.       exitgame();
  12.   for (loop=0;loop<3;loop++)
  13.     if ((data.coin[loop]=(char far *)malloc(258))==NULL)
  14.       exitgame();
  15.   if ((bcoin=(cointype *)malloc(sizeof(cointype)))==NULL)
  16.     exitgame();
  17.   bcoin->next=NULL;
  18.   if ((bscore=(scoretype *)malloc(sizeof(scoretype)))==NULL)
  19.     exitgame();
  20.   bscore->next=NULL;
  21.   for (loop=0;loop<2;loop++)
  22.   {
  23.     player[loop].lives=3;
  24.     player[loop].level=1;
  25.     player[loop].screenx=0;
  26.   }
  27. }
  28. //FILL SCREEN ///////////////////////////////////////////////////////////////
  29. void fillscreen(int color)
  30. {
  31.   x_rect_fill(32,0,288,224,HiddenPageOffs,color);
  32. }
  33. //GET INPUTS FROM DATA FILES/////////////////////////////////////////////////
  34. int getinputs()
  35. {
  36.   FILE *in;
  37.   int count,loop1,loop2,loop3,yinit,blocknum,backnum;
  38.   char *temp,ch,levelfile[13],graphfile[13];
  39.   char far *tempbm;
  40.   strcpy(levelfile,"LEVEL000.DAT");
  41.   levelfile[7]=player[curplay].level%10+48;
  42.   if (player[curplay].level>9)
  43.     levelfile[6]=player[curplay].level/10+48;
  44.   if ((in=fopen(levelfile,"r"))==NULL)
  45.   {
  46.     exitgame();
  47.     printf("%s could not be found!n",levelfile);
  48.     exit(1);
  49.   }
  50.   data.maxlength=(int)fgetc(in);
  51.   yinit=(int)fgetc(in);
  52.   data.startpos[0]=(int)fgetc(in);
  53.   data.startpos[1]=(int)fgetc(in);
  54.   blocknum=(int)fgetc(in);
  55.   backnum=(int)fgetc(in);
  56.   fseek(in,0,SEEK_SET);
  57.   for (loop1=0;loop1<14;loop1++)
  58.     for (loop2=0;loop2<=data.maxlength;loop2++)
  59.     {
  60.       ch=getc(in);
  61.       if(ch<='0')
  62. data.world[loop1][loop2]=0;
  63.       if (ch>='a' && ch<='z')
  64. data.world[loop1][loop2]=ch-70;
  65.       if (ch>='A' && ch<='Z')
  66. data.world[loop1][loop2]=ch-64;
  67.       if (loop1==0)
  68. data.world[loop1][loop2]=0;
  69.     }
  70.   fclose(in);
  71.   strcpy(graphfile,"BLOCK000.PCX");
  72.   graphfile[7]=blocknum;
  73.   if ((in=fopen(graphfile,"rb"))==NULL)
  74.   {
  75.     exitgame();
  76.     printf("%s could not be found!n",graphfile);
  77.     exit(1);
  78.   }
  79.   temp=getpcx(in,temp,6000);
  80.   tempbm=(char far *)farmalloc(258);
  81.   tempbm[0]=tempbm[1]=16;
  82.   for (loop1=0;loop1<26;loop1++)
  83.   {
  84.     count=2;
  85.     for (loop2=0;loop2<16;loop2++)
  86.       for (loop3=0;loop3<16;loop3++)
  87. tempbm[count++]=temp[loop1*17+(loop2+1)*320+loop3+1];
  88.     x_bm_to_pbm(tempbm,data.block[loop1+26]);
  89.   }
  90.   free(temp);
  91.   fseek(in,-768,SEEK_END);
  92.   for (loop1=0;loop1<256;loop1++)
  93.   {
  94.     data.palette[loop1].red=(getc(in)>>2);
  95.     data.palette[loop1].green=(getc(in)>>2);
  96.     data.palette[loop1].blue=(getc(in)>>2);
  97.   }
  98.   fclose(in);
  99.   strcpy(graphfile,"BGRND000.PCX");
  100.   graphfile[7]=backnum;
  101.   if ((in=fopen(graphfile,"rb"))==NULL)
  102.   {
  103.     exitgame();
  104.     printf("%s could not be found!n",graphfile);
  105.     exit(1);
  106.   }
  107.   temp=getpcx(in,temp,6000);
  108.   for (loop1=0;loop1<26;loop1++)
  109.   {
  110.     count=2;
  111.     for (loop2=0;loop2<16;loop2++)
  112.       for (loop3=0;loop3<16;loop3++)
  113. tempbm[count++]=temp[loop1*17+(loop2+1)*320+loop3+1];
  114.     x_bm_to_pbm(tempbm,data.block[loop1]);
  115.   }
  116.   free(temp);
  117.   fclose(in);
  118.   strcpy(graphfile,"COIN.PCX");
  119.   if ((in=fopen(graphfile,"rb"))==NULL)
  120.   {
  121.     exitgame();
  122.     printf("%s could not be found!n",graphfile);
  123.     exit(1);
  124.   }
  125.   temp=getpcx(in,temp,6000);
  126.   for (loop1=0;loop1<3;loop1++)
  127.   {
  128.     count=2;
  129.     for (loop2=0;loop2<16;loop2++)
  130.       for (loop3=0;loop3<16;loop3++)
  131. tempbm[count++]=temp[loop1*17+(loop2+1)*320+loop3];
  132.     x_bm_to_pbm(tempbm,data.coin[loop1]);
  133.   }
  134.   farfree(tempbm);
  135.   free(temp);
  136.   fclose(in);
  137.   for (loop1=0;loop1<256;loop1++)
  138.     setpalette(loop1,data.palette[loop1]);
  139.   return(yinit);
  140. }
  141. //GET MARIO DATA/////////////////////////////////////////////////////////////
  142. void getmario()
  143. {
  144.   FILE *marioin;
  145.   int loop1,loop2,loop3;
  146.   char *temp;
  147.   if ((marioin=fopen("MARIO.PCX","rb"))==NULL)
  148.   {
  149.     exitgame();
  150.     printf("MARIO.PCX could not be found!n");
  151.     exit(1);
  152.   }
  153.   fseek(marioin,128,SEEK_SET);
  154.   temp=(char *)malloc(6000);
  155.   temp=getpcx(marioin,temp,6000);
  156.   for (loop1=0;loop1<7;loop1++)
  157.     for (loop2=0;loop2<=15;loop2++)
  158.       for (loop3=0;loop3<=15;loop3++)
  159. data.mario[loop1][loop2][loop3]=temp[loop1*17+(loop2+1)*320+loop3+1];
  160.   fseek(marioin,-765,SEEK_END);
  161.   for (loop1=0;loop1<2;loop1++)
  162.   {
  163.     data.marioc[loop1].red=(getc(marioin)>>2);
  164.     data.marioc[loop1].green=(getc(marioin)>>2);
  165.     data.marioc[loop1].blue=(getc(marioin)>>2);
  166.   }
  167.   fseek(marioin,-750,SEEK_END);
  168.   for (loop1=0;loop1<2;loop1++)
  169.   {
  170.     data.luigic[loop1].red=(getc(marioin)>>2);
  171.     data.luigic[loop1].green=(getc(marioin)>>2);
  172.     data.luigic[loop1].blue=(getc(marioin)>>2);
  173.   }
  174.   fclose(marioin);
  175.   free(temp);
  176. }
  177. char *getpcx(FILE *file, char *temp, int length)
  178. {
  179.   long int count=0;
  180.   int numbytes,loop;
  181.   unsigned char ch;
  182.   fseek(file,128,SEEK_SET);
  183.   temp=(char *)malloc(length);
  184.   while(count<length)
  185.   {
  186.     ch=fgetc(file);
  187.     if ((ch>=192 && ch<=255))
  188.     {
  189.       numbytes=ch-192;
  190.       ch=fgetc(file);
  191.       for(loop=0;loop<numbytes;loop++)
  192. temp[count++]=ch;
  193.     }
  194.     else
  195.       temp[count++]=ch;
  196.   }
  197.   return(temp);
  198. }
  199. //SET PALETTE////////////////////////////////////////////////////////////////
  200. void setpalette(int index, colorpal color)
  201. {
  202.   outp(0x3c6,0xff);
  203.   outp(0x3c8,index);
  204.   outp(0x3c9,color.red);
  205.   outp(0x3c9,color.green);
  206.   outp(0x3c9,color.blue);
  207. }
  208. //CALCULATE CURRENT SCREEN///////////////////////////////////////////////////
  209. void drawscreen(int x)
  210. {
  211.   int loop1,loop2,back,x2;
  212.   static int dy;
  213.   status();
  214.   x2=x;
  215.   back=0;
  216.   while(x2>=16)
  217.   {
  218.     x2-=16;
  219.     back++;
  220.   }
  221.   for (loop1=1;loop1<=13;loop1++)
  222.     for (loop2=back;loop2<=back+16;loop2++)
  223.       if (data.world[loop1][loop2]>0)
  224.       {
  225. if (data.bumped[0]==loop2 && data.bumped[1]==loop1)
  226. {
  227.   dy+=data.bumploop;
  228.   x_put_masked_pbm((loop2<<4)-x+32,(loop1<<4)+dy,HiddenPageOffs,data.block[data.world[loop1][loop2]-1]);
  229.   data.bumploop++;
  230.   if(data.bumploop==3)
  231.   {
  232.     data.bumploop=0;
  233.     data.bumped[0]=0;
  234.     data.bumped[1]=0;
  235.     dy=0;
  236.   }
  237. }
  238. else
  239.   x_put_masked_pbm((loop2<<4)-x+32,(loop1<<4),HiddenPageOffs,data.block[data.world[loop1][loop2]-1]);
  240.       }
  241.   drawcoin(x);
  242.   drawscore(x);
  243.   x_rect_fill(15,0,32,224,HiddenPageOffs,0);
  244.   x_rect_fill(288,0,306,224,HiddenPageOffs,0);
  245. }
  246. //DRAW INFO ON TOP OF SCREEN/////////////////////////////////////////////////
  247. void status()
  248. {
  249.   static char pscore[7]="000000";
  250.   char pscore2[7];
  251.   char slevel[4]="1-1";
  252.   char scoins[3]="00";
  253.   static char stime[4]="   ";
  254.   int loop1,loop2;
  255.   if (curplay==0)
  256.     graphstring(34,1,"MARIO",TEXTCOLOR,HiddenPageOffs);
  257.   else
  258.     graphstring(34,1,"LUIGI",TEXTCOLOR,HiddenPageOffs);
  259.   graphstring(180,1,"WORLD",TEXTCOLOR,HiddenPageOffs);
  260.   graphstring(254,1,"TIME",TEXTCOLOR,HiddenPageOffs);
  261.   if(player[curplay].score[1]!=player[curplay].score[0])
  262.   {
  263.     itoa(player[curplay].score[1],pscore2,10);
  264.     loop2=5;
  265.     for(loop1=strlen(pscore2)-1;loop1>=0;loop1--)
  266. pscore[loop2--]=pscore2[loop1];
  267.     graphstring(34,9,pscore,BACKGROUND,HiddenPageOffs);
  268.   }
  269.   strcpy(pscore,"000000");
  270.   itoa(player[curplay].score[0],pscore2,10);
  271.   loop2=5;
  272.   for(loop1=strlen(pscore2)-1;loop1>=0;loop1--)
  273.     pscore[loop2--]=pscore2[loop1];
  274.   graphstring(34,9,pscore,TEXTCOLOR,HiddenPageOffs);
  275.   player[curplay].score[1]=player[curplay].score[0];
  276.   if (times[1]!=times[2])
  277.   {
  278.     itoa(times[0],stime,10);
  279.     graphstring(260,9,stime,BACKGROUND,HiddenPageOffs);
  280.     times[2]=times[1];
  281.     times[0]--;
  282.     itoa(times[0],stime,10);
  283.   }
  284.   graphstring(260,9,stime,TEXTCOLOR,HiddenPageOffs);
  285.   slevel[0]=(char)(player[curplay].level/5+1-208);
  286.   slevel[2]=(char)(player[curplay].level%5-208);
  287.   graphstring(188,9,slevel,TEXTCOLOR,HiddenPageOffs);
  288.   if (player[curplay].coins[0]!=player[curplay].coins[1])
  289.   {
  290.     itoa(player[curplay].coins[1],scoins,10);
  291.     if (player[curplay].coins[1]<10)
  292.     {
  293.       scoins[1]=scoins[0];
  294.       scoins[0]='0';
  295.     }
  296.     graphstring(116,9,scoins,BACKGROUND,HiddenPageOffs);
  297.     player[curplay].coins[1]=player[curplay].coins[0];
  298.   }
  299.   itoa(player[curplay].coins[0],scoins,10);
  300.   if (player[curplay].coins[0]<10)
  301.   {
  302.     scoins[1]=scoins[0];
  303.     scoins[0]='0';
  304.   }
  305.   graphchar(108,9,'x',TEXTCOLOR,HiddenPageOffs);
  306.   graphstring(116,9,scoins,TEXTCOLOR,HiddenPageOffs);
  307.   x_line(100,8,101,8,20,HiddenPageOffs);
  308.   x_put_pix(102,8,HiddenPageOffs,0);
  309.   x_line(100,15,101,15,20,HiddenPageOffs);
  310.   x_put_pix(102,15,HiddenPageOffs,0);
  311.   for(loop1=0;loop1<6;loop1++)
  312.   {
  313.     x_line(99,9+loop1,102,9+loop1,20,HiddenPageOffs);
  314.     x_put_pix(103,9+loop1,HiddenPageOffs,0);
  315.   }
  316. }
  317. //CALCULATE AND DRAW MARIO///////////////////////////////////////////////////
  318. void drawmario(int x, int y)
  319. {
  320.   int loop1,loop2;
  321.   for (loop1=0;loop1<=15;loop1++)
  322.     for (loop2=0;loop2<=15;loop2++)
  323.       if (data.mario[abs(data.sprite/2)][loop1][loop2]>=0)
  324. if (y-15+loop1>=0 && y-15+loop1<224)
  325. {
  326.   if (data.direction==0)
  327.     x_put_pix(x+loop2+32,y-15+loop1,HiddenPageOffs,data.mario[data.sprite/2][loop1][loop2]);
  328.   else x_put_pix(x+15-loop2+32,y-15+loop1,HiddenPageOffs,data.mario[data.sprite/2][loop1][loop2]);
  329. }
  330. }
  331. //DRAW CHARACTERS////////////////////////////////////////////////////////////
  332. void graphchar(int xc, int yc, char c,int color, unsigned offset)
  333. {
  334.   int x,y;
  335.   unsigned char data;
  336.   unsigned char far *work;
  337.   unsigned char bitmask=0x80;
  338.   work=charset+(c<<3);
  339.   for(y=0;y<8;y++)
  340.   {
  341.     bitmask=0x80;
  342.     for(x=0;x<8;x++)
  343.     {
  344.       if((*work & bitmask))
  345. x_put_pix(x+xc,y+yc,offset,color);
  346.       bitmask=(bitmask>>1);
  347.     }
  348.   work++;
  349.   }
  350. }
  351. //DRAW A STRING//////////////////////////////////////////////////////////////
  352. void graphstring(int x,int y,char *string,int color, unsigned offset)
  353. {
  354.   int loop;
  355.   for(loop=0;loop<strlen(string);loop++)
  356.     graphchar(x+loop*8,y,string[loop],color,offset);
  357. }
  358. //DRAW SCREEN SHOWING LEVEL AND NUMBER OF LIVES//////////////////////////////
  359. void levelscreen()
  360. {
  361.   int x=75;
  362.   int y=110;
  363.   int wait[3];
  364.   char print[3];
  365.   data.sprite=0;
  366.   data.direction=0;
  367.   fillscreen(0);
  368.   status();
  369.   drawmario(x,y);
  370.   graphstring(100,82,"WORLD",TEXTCOLOR,HiddenPageOffs);
  371.   graphchar(132,100,'x',TEXTCOLOR,HiddenPageOffs);
  372.   graphchar(156,82,'-',TEXTCOLOR,HiddenPageOffs);
  373.   print[0]=(char)(player[curplay].level/5+1-208);
  374.   graphchar(148,82,print[0],TEXTCOLOR,HiddenPageOffs);
  375.   print[0]=(char)(player[curplay].level%5-208);
  376.   graphchar(164,82,print[0],TEXTCOLOR,HiddenPageOffs);
  377.   itoa(player[curplay].lives,print,10);
  378.   graphstring(148,100,print,TEXTCOLOR,HiddenPageOffs);
  379.   x_page_flip(0,0);
  380.   gettime(&t);
  381.   wait[0]=t.ti_sec;
  382.   wait[1]=wait[0];
  383.   wait[2]=0;
  384.   while(wait[2]!=3)
  385.   {
  386.     gettime(&t);
  387.     wait[0]=t.ti_sec;
  388.     if(wait[0]!=wait[1])
  389.     {
  390.       wait[1]=wait[0];
  391.       wait[2]++;
  392.     }
  393.   }
  394. }
  395. //TITLE SCREEN AND CHOOSING NUMBER OF PLAYERS////////////////////////////////
  396. int startscreen()
  397. {
  398.   int x=40;
  399.   int y=191;
  400.   int choice,screenx,offset,numplayers=1;
  401.   FILE *logoin;
  402.   int count,loop1,loop2;
  403.   char *temp;
  404.   data.sprite=0;
  405.   screenx=0;
  406.   if ((logoin=fopen("LOGO.PCX","rb"))==NULL)
  407.   {
  408.     exitgame();
  409.     printf("LOGO.PCX not found!n");
  410.     exit(1);
  411.   }
  412.   fseek(logoin,128,SEEK_SET);
  413.   temp=getpcx(logoin,temp,31040);
  414.   count=-111;
  415.   fillscreen(BACKGROUND);
  416.   drawscreen(screenx);
  417.   drawmario(x,y);
  418.   for (loop1=0;loop1<97;loop1++)
  419.   {
  420.     count+=111;
  421.     for (loop2=0;loop2<209;loop2++)
  422.       x_put_pix(loop2+55,loop1+20,HiddenPageOffs,temp[count++]);
  423.   }
  424.   free(temp);
  425.   fclose(logoin);
  426.   graphstring(160,118,"1985 NINTENDO",TEXTCOLOR,HiddenPageOffs);
  427.   graphstring(120,130,"1 PLAYER GAME",TEXTCOLOR,HiddenPageOffs);
  428.   graphstring(120,146,"2 PLAYER GAME",TEXTCOLOR,HiddenPageOffs);
  429.   graphstring(120,162,"TOP - 000000",TEXTCOLOR,HiddenPageOffs);
  430.   x_page_flip(0,0);
  431.   while(!keybuf[KEY_ENTER])
  432.   {
  433.     if (keybuf[KEY_DOWN])
  434.     {
  435.       x_rect_fill(108,129,117,137,VisiblePageOffs,BACKGROUND);
  436.       numplayers=2;
  437.     }
  438.     if (keybuf[KEY_UP])
  439.     {
  440.       x_rect_fill(108,145,117,153,VisiblePageOffs,BACKGROUND);
  441.       numplayers=1;
  442.     }
  443.     if (numplayers==1)
  444.       offset=129;
  445.     else
  446.       offset=145;
  447.     x_line(110,offset,113,offset,21,VisiblePageOffs);
  448.     x_line(109,offset+1,114,offset+1,21,VisiblePageOffs);
  449.     x_line(109,offset+2,114,offset+2,21,VisiblePageOffs);
  450.     x_line(108,offset+3,115,offset+3,21,VisiblePageOffs);
  451.     x_line(108,offset+4,115,offset+4,21,VisiblePageOffs);
  452.     x_line(108,offset+5,115,offset+5,21,VisiblePageOffs);
  453.     x_put_pix(109,offset+6,VisiblePageOffs,21);
  454.     x_put_pix(114,offset+6,VisiblePageOffs,21);
  455.     x_line(110,offset+6,113,offset+6,20,VisiblePageOffs);
  456.     x_line(110,offset+7,113,offset+7,20,VisiblePageOffs);
  457.   }
  458.   return(numplayers);
  459. }
  460. //CHANGE COLORS FOR MARIO OR LUIGI///////////////////////////////////////////
  461. void setcolors()
  462. {
  463.   if (curplay==0)
  464.   {
  465.     setpalette(1,data.marioc[0]);
  466.     setpalette(2,data.marioc[1]);
  467.   }
  468.   else
  469.   {
  470.     setpalette(1,data.luigic[0]);
  471.     setpalette(2,data.luigic[1]);
  472.   }
  473. }
  474. void rotatepal(int *palloopp, colorpal *tempcp)
  475. {
  476.   int palloop=*palloopp;
  477.   colorpal tempc=*tempcp;
  478.   int loop;
  479.   if (palloop>=16 && palloop%4==0)
  480.   {
  481.     if (palloop<=24)
  482.     {
  483.       tempc=data.palette[20];
  484.       data.palette[20]=data.palette[21];
  485.       data.palette[21]=data.palette[22];
  486.       data.palette[22]=data.palette[23];
  487.       data.palette[23]=tempc;
  488.     }
  489.     else
  490.     {
  491.       tempc=data.palette[23];
  492.       data.palette[23]=data.palette[22];
  493.       data.palette[22]=data.palette[21];
  494.       data.palette[21]=data.palette[20];
  495.       data.palette[20]=tempc;
  496.     }
  497.     for(loop=20;loop<=23;loop++)
  498.       setpalette(loop,data.palette[loop]);
  499.     if (palloop==36)
  500.       palloop=0;
  501.   }
  502.   palloop++;
  503.   *tempcp=tempc;
  504.   *palloopp=palloop;
  505. }
  506. void check_keybuf(int *movep, int *finishp, int *upp, int *downp, int *jumpp)
  507. {
  508.   int move=*movep;
  509.   int finish=*finishp;
  510.   int up=*upp;
  511.   int down=*downp;
  512.   int jumploop=*jumpp;
  513.   if (keybuf[KEY_RIGHT] && !keybuf[KEY_LEFT])
  514.   {
  515.    if (keybuf[KEY_CTRL])
  516.    {
  517.      if (move<16)
  518.        move++;
  519.    }
  520.    else
  521.    {
  522.      if (move>8)
  523.        move--;
  524.      if (move<8)
  525.        move++;
  526.    }
  527.    if (landed) //(data.world[(marioy+1)/16][(mariox+player[curplay].screenx+8)/16]>26)
  528.      data.direction=0;
  529.    }
  530.    if (keybuf[KEY_LEFT] && !keybuf[KEY_RIGHT])
  531.    {
  532.      if (keybuf[KEY_CTRL])
  533.      {
  534.        if (move>-16)
  535.  move--;
  536.      }
  537.      else
  538.      {
  539.        if (move<-8)
  540.  move++;
  541.        if (move>-8)
  542.  move--;
  543.      }
  544.      if (landed) //(data.world[(marioy+1)/16][(mariox+player[curplay].screenx+8)/16]>26)
  545.        data.direction=1;
  546.      }
  547.    if (keybuf[KEY_ALT] && !down)
  548.    {
  549.      up=-17;
  550.      data.sprite=12;
  551.      jumploop++;
  552.      if (jumploop>10)
  553.      {
  554.        down=1;
  555.        jumploop=0;
  556.      }
  557.    }
  558.    if (keybuf[KEY_P])
  559.    {
  560.      graphstring(140,100,"Pause",TEXTCOLOR,VisiblePageOffs);
  561.      clear_key_buffer();
  562.      while(!keybuf[KEY_P]);
  563.      clear_key_buffer();
  564.      graphstring(140,100,"Pause",BACKGROUND,VisiblePageOffs);
  565.    }
  566.    if(keybuf[KEY_Q])
  567.    {
  568.      graphstring(130,100,"Quit(Y/N)",TEXTCOLOR,VisiblePageOffs);
  569.      clear_key_buffer();
  570.      while(!keybuf[KEY_Y] && !keybuf[KEY_N]);
  571.      if (keybuf[KEY_Y] && !keybuf[KEY_N])
  572.        finish=3;
  573.      clear_key_buffer();
  574.      graphstring(130,100,"Quit(Y/N)",BACKGROUND,VisiblePageOffs);
  575.    }
  576.    if ((!keybuf[KEY_RIGHT] && !keybuf[KEY_LEFT]) || (keybuf[KEY_RIGHT] && keybuf[KEY_LEFT]))
  577.    {
  578.     if (move>0)
  579.       move--;
  580.     if (move<0)
  581.       move++;
  582.    }
  583.   *movep=move;
  584.   *finishp=finish;
  585.   *upp=up;
  586.   *downp=down;
  587.   *jumpp=jumploop;
  588. }
  589. void animate_mario(int move)
  590. {
  591.   if (landed)
  592.   {
  593.     if (data.sprite==10 && ((move>0 && data.direction==0) || (move<0 && data.direction==1)))
  594.       data.sprite=1;
  595.     if (move==0)
  596.       data.sprite=0;
  597.     if ((move>0 && data.direction==0) || (move<0 && data.direction==1))
  598.     {
  599.       if(abs(move)<16)
  600. data.sprite++;
  601.       else
  602. data.sprite+=2;
  603.       if (data.sprite>=10)
  604. data.sprite=2;
  605.     }
  606.     if ((move>0 && data.direction==1) || (move<0 && data.direction==0))
  607.       data.sprite=10;
  608.   }
  609. }
  610. void move_mario(int *movep)
  611. {
  612.   int move=*movep;
  613.   int loop1,loop2;
  614.   if (marioy>16)
  615.   {
  616.     if (move>0)
  617.       for (loop1=0;loop1<16;loop1++)
  618. for (loop2=0;loop2<=move;loop2++)
  619.   if (data.world[(marioy-loop1)/16][(mariox+player[curplay].screenx+13+loop2/4)/16]>26)
  620.     move=loop2;
  621.     if (move<0)
  622.       for (loop1=0;loop1<16;loop1++)
  623. for (loop2=0;loop2>=move;loop2--)
  624.   if (data.world[(marioy-loop1)/16][(mariox+player[curplay].screenx+2+loop2/4)/16]>26 || (mariox+loop1/2)<=0)
  625.     move=loop2;
  626.   }
  627.   if(mariox>100 && move>0)
  628.     player[curplay].screenx+=move/4;
  629.   else
  630.     if (mariox+move/4>0)
  631.       mariox+=move/4;
  632.   *movep=move;
  633. }
  634. void addcoin(int x, int y)
  635. {
  636.   cointype *temp,*c;
  637.   c=bcoin;
  638.   while ((c->next)!=NULL)
  639.     c=c->next;
  640.   temp=(cointype *)malloc(sizeof(cointype));
  641.   temp->next=NULL;
  642.   temp->coinx=x;
  643.   temp->coiny=y;
  644.   temp->coinloop=-10;
  645.   temp->dy=0;
  646.   c->next=temp;
  647. }
  648. void removecoin()
  649. {
  650.   cointype *temp;
  651.   cointype *c=bcoin;
  652.   temp=c->next;
  653.   c->next=c->next->next;
  654.   addscore(temp->coinx,temp->coiny,"200");
  655.   free(temp);
  656. }
  657. void drawcoin(int x)
  658. {
  659.   cointype *c=bcoin;
  660.   int loop,num=0;
  661.   while ((c->next)!=NULL)
  662.   {
  663.     num++;
  664.     c=c->next;
  665.   }
  666.   c=bcoin;
  667.   for (loop=0;loop<num;loop++)
  668.   {
  669.     c=c->next;
  670.     if (((c->coinx)*16+32-x)>16)
  671.       x_put_masked_pbm((c->coinx)*16+32-x,(c->coiny)*16+c->dy,HiddenPageOffs,data.coin[abs((c->coinloop)%3)]);
  672.     c->coinloop++;
  673.     c->dy+=c->coinloop;
  674.     if (c->coinloop>=10)
  675.        removecoin();
  676.   }
  677. }
  678. void addscore(int x, int y, char *pscore)
  679. {
  680.   scoretype *temp,*s;
  681.   s=bscore;
  682.   while ((s->next)!=NULL)
  683.     s=s->next;
  684.   temp=(scoretype *)malloc(sizeof(scoretype));
  685.   temp->next=NULL;
  686.   temp->scorex=x;
  687.   temp->scorey=y;
  688.   temp->scoreloop=0;
  689.   strcpy(temp->num,pscore);
  690.   s->next=temp;
  691. }
  692. void removescore()
  693. {
  694.   scoretype *temp;
  695.   scoretype *s=bscore;
  696.   temp=s->next;
  697.   s->next=s->next->next;
  698.   free(temp);
  699. }
  700. void drawscore(int x)
  701. {
  702.   scoretype *s=bscore;
  703.   while ((s->next)!=NULL)
  704.   {
  705.     s=s->next;
  706.     if (((s->scorex)*16+32-x)>16)
  707.       graphstring((s->scorex)*16+32-x,(s->scorey)*16+(s->scoreloop),s->num,TEXTCOLOR,HiddenPageOffs);
  708.     s->scoreloop--;
  709.     if (s->scoreloop<=-20)
  710.        removescore();
  711.   }
  712. }
  713. void exitgame()
  714. {
  715.   int loop;
  716.   for (loop=0;loop<52;loop++)
  717.     farfree(data.block[loop]);
  718.   for (loop=0;loop<3;loop++)
  719.     farfree(data.coin[loop]);
  720.   free(bcoin);
  721.   free(bscore);
  722.   uninstall_new_key_handler();
  723.   x_remove_vsync_handler();
  724.   x_text_mode();
  725. }
  726. void check_jump(int *upp, int *downp, int *jumploopp)
  727. {
  728.   int loop1,loop2;
  729.   int up=*upp;
  730.   int down=*downp;
  731.   int jumploop=*jumploopp;
  732.   loop1=3;
  733.   landed=0;
  734.   while (loop1<13 && landed==0)
  735.   {
  736.     if (data.world[(marioy+1)/16][(mariox+player[curplay].screenx+loop1)/16]>26)
  737.       landed=1;
  738.     else
  739.       landed=0;
  740.     loop1++;
  741.   }
  742.   if (!landed || marioy<16)
  743.     if (up<17)
  744.       up+=1;
  745.   if (up>0) //CHECK IF MARIO LANDED//
  746.   {
  747.     down=1;
  748.     loop1=marioy;
  749.     if (marioy<207)
  750.     {
  751.       while(loop1++<marioy+up/4)
  752.       {
  753. for (loop2=3;loop2<14;loop2+=9)
  754.   if (data.world[loop1/16][(mariox+player[curplay].screenx+loop2)/16]>26)
  755.   {
  756.     marioy=loop1-1;
  757.     loop1=marioy+up/4;
  758.     loop2=13;
  759.     up=0;
  760.     down=0;
  761.     data.sprite=0;
  762.   }
  763.       }
  764.     }
  765.     marioy+=up/4;
  766.   }
  767.   if (up<0) //CHECK IF MARIO HIT A BLOCK/
  768.   {
  769.     if (!keybuf[KEY_ALT])
  770.     {
  771.       down=1;
  772.       jumploop=0;
  773.     }
  774.     loop1=marioy;
  775.     marioy+=up/4;
  776.     if (marioy>24)
  777.     {
  778.       while(loop1-->=marioy+up/4)
  779.       {
  780. if(data.world[loop1/16-1][(mariox+player[curplay].screenx+8)/16]>26 ||data.world[loop1/16-1][(mariox+player[curplay].screenx+8)/16]==18)
  781. {
  782.   marioy=loop1;
  783.   loop1=marioy+up/4-1;
  784.   up=-up;
  785.   down=1;
  786.   jumploop=0;
  787.   if (data.bumped[0]==0 && data.bumped[1]==0)
  788.   {
  789.     data.bumped[0]=(mariox+player[curplay].screenx+8)/16;
  790.     data.bumped[1]=marioy/16-1;
  791.     data.bumploop=-3;
  792.   }
  793. }
  794. if (data.world[loop1/16-1][(mariox+player[curplay].screenx+12)/16]>26 && data.world[loop1/16-1][(mariox+player[curplay].screenx+8)/16]<26)
  795.   mariox-=1;
  796. if (data.world[loop1/16-1][(mariox+player[curplay].screenx+3)/16]>26 && data.world[loop1/16-1][(mariox+player[curplay].screenx+8)/16]<26)
  797.   mariox+=1;
  798.       }
  799.     }
  800.   }
  801.   *upp=up;
  802.   *downp=down;
  803.   *jumploopp=jumploop;
  804. }
  805. void check_blocks()
  806. {
  807.   int bumpedblock=0;
  808.   if (data.world[(marioy-8)/16][(mariox+player[curplay].screenx+8)/16]==10)
  809.   {
  810.     data.world[(marioy-8)/16][(mariox+player[curplay].screenx+8)/16]=0;
  811.     player[curplay].score[0]+=200;
  812.     player[curplay].coins[0]++;
  813.   }
  814.   if (data.bumploop==-3)
  815.   {
  816.     bumpedblock=data.world[marioy/16-1][(mariox+player[curplay].screenx+8)/16];
  817.     switch (bumpedblock)
  818.     {
  819.       case 18:
  820.       case 28:
  821. data.world[marioy/16-1][(mariox+player[curplay].screenx+8)/16]=27;
  822. player[curplay].score[0]+=200;
  823. player[curplay].coins[0]++;
  824. addcoin(data.bumped[0],data.bumped[1]-1);
  825.       case 29:
  826. if (data.world[data.bumped[1]-1][data.bumped[0]]==10)
  827. {
  828.   data.world[data.bumped[1]-1][data.bumped[0]]=0;
  829.   player[curplay].score[0]+=200;
  830.   player[curplay].coins[0]++;
  831.   addcoin(data.bumped[0],data.bumped[1]-1);
  832. }
  833. break;
  834.       default:
  835. data.bumped[0]=data.bumped[1]=0;
  836. data.bumploop=0;
  837. break;
  838.     }
  839.   }
  840.   if (player[curplay].coins[0]==100)
  841.   {
  842.     player[curplay].lives++;
  843.     player[curplay].coins[0]=0;
  844.   }
  845. }
  846. void check_finish(int *finishp)
  847. //CHECK FOR END OF CURRENT PLAYER LOOP///////////////////////////////////////
  848. {
  849.   int finish=*finishp;
  850.   if (marioy>=250)
  851.     finish=1;
  852.   if ((mariox+player[curplay].screenx+16)/16==data.maxlength-13)
  853.     finish=2;
  854.   if (times[0]==0)
  855.     finish=1;
  856.   *finishp=finish;
  857. }
  858. //END////////////////////////////////////////////////////////////////////////