www.pudn.com > supermary.rar > SMBFUNC.C


//SET UP ALL OF THE GRAPHICS AND OTHER JUNK////////////////////////////////// 
void init() 
{ 
  int loop; 
  x_set_mode(X_MODE_320x240,320);	//SET MODE X// 
  x_set_tripplebuffer(240);		//INSTALL TRIPPLE BUFFER// 
  install_new_key_handler();		//INSTALL KEYBOARD HANDLER// 
  x_install_vsync_handler(1);		//INSTALL VSYNC HANDLER// 
  for (loop=0;loop<52;loop++)		//ALLOCATE MEM FOR GRAPHICS// 
    if ((data.block[loop]=(char far *)malloc(258))==NULL) 
      exitgame(); 
  for (loop=0;loop<3;loop++) 
    if ((data.coin[loop]=(char far *)malloc(258))==NULL) 
      exitgame(); 
  if ((bcoin=(cointype *)malloc(sizeof(cointype)))==NULL) 
    exitgame(); 
  bcoin->next=NULL; 
  if ((bscore=(scoretype *)malloc(sizeof(scoretype)))==NULL) 
    exitgame(); 
  bscore->next=NULL; 
  for (loop=0;loop<2;loop++) 
  { 
    player[loop].lives=3; 
    player[loop].level=1; 
    player[loop].screenx=0; 
  } 
} 
 
//FILL SCREEN /////////////////////////////////////////////////////////////// 
void fillscreen(int color) 
{ 
  x_rect_fill(32,0,288,224,HiddenPageOffs,color); 
} 
 
//GET INPUTS FROM DATA FILES///////////////////////////////////////////////// 
int getinputs() 
{ 
  FILE *in; 
  int count,loop1,loop2,loop3,yinit,blocknum,backnum; 
  char *temp,ch,levelfile[13],graphfile[13]; 
  char far *tempbm; 
  strcpy(levelfile,"LEVEL000.DAT"); 
  levelfile[7]=player[curplay].level%10+48; 
  if (player[curplay].level>9) 
    levelfile[6]=player[curplay].level/10+48; 
  if ((in=fopen(levelfile,"r"))==NULL) 
  { 
    exitgame(); 
    printf("%s could not be found!\n",levelfile); 
    exit(1); 
  } 
  data.maxlength=(int)fgetc(in); 
  yinit=(int)fgetc(in); 
  data.startpos[0]=(int)fgetc(in); 
  data.startpos[1]=(int)fgetc(in); 
  blocknum=(int)fgetc(in); 
  backnum=(int)fgetc(in); 
  fseek(in,0,SEEK_SET); 
  for (loop1=0;loop1<14;loop1++) 
    for (loop2=0;loop2<=data.maxlength;loop2++) 
    { 
      ch=getc(in); 
      if(ch<='0') 
	data.world[loop1][loop2]=0; 
      if (ch>='a' && ch<='z') 
	data.world[loop1][loop2]=ch-70; 
      if (ch>='A' && ch<='Z') 
	data.world[loop1][loop2]=ch-64; 
      if (loop1==0) 
	data.world[loop1][loop2]=0; 
    } 
  fclose(in); 
  strcpy(graphfile,"BLOCK000.PCX"); 
  graphfile[7]=blocknum; 
  if ((in=fopen(graphfile,"rb"))==NULL) 
  { 
    exitgame(); 
    printf("%s could not be found!\n",graphfile); 
    exit(1); 
  } 
  temp=getpcx(in,temp,6000); 
  tempbm=(char far *)farmalloc(258); 
  tempbm[0]=tempbm[1]=16; 
  for (loop1=0;loop1<26;loop1++) 
  { 
    count=2; 
    for (loop2=0;loop2<16;loop2++) 
      for (loop3=0;loop3<16;loop3++) 
	tempbm[count++]=temp[loop1*17+(loop2+1)*320+loop3+1]; 
    x_bm_to_pbm(tempbm,data.block[loop1+26]); 
  } 
  free(temp); 
  fseek(in,-768,SEEK_END); 
  for (loop1=0;loop1<256;loop1++) 
  { 
    data.palette[loop1].red=(getc(in)>>2); 
    data.palette[loop1].green=(getc(in)>>2); 
    data.palette[loop1].blue=(getc(in)>>2); 
  } 
  fclose(in); 
  strcpy(graphfile,"BGRND000.PCX"); 
  graphfile[7]=backnum; 
  if ((in=fopen(graphfile,"rb"))==NULL) 
  { 
    exitgame(); 
    printf("%s could not be found!\n",graphfile); 
    exit(1); 
  } 
  temp=getpcx(in,temp,6000); 
  for (loop1=0;loop1<26;loop1++) 
  { 
    count=2; 
    for (loop2=0;loop2<16;loop2++) 
      for (loop3=0;loop3<16;loop3++) 
	tempbm[count++]=temp[loop1*17+(loop2+1)*320+loop3+1]; 
    x_bm_to_pbm(tempbm,data.block[loop1]); 
  } 
  free(temp); 
  fclose(in); 
  strcpy(graphfile,"COIN.PCX"); 
  if ((in=fopen(graphfile,"rb"))==NULL) 
  { 
    exitgame(); 
    printf("%s could not be found!\n",graphfile); 
    exit(1); 
  } 
  temp=getpcx(in,temp,6000); 
  for (loop1=0;loop1<3;loop1++) 
  { 
    count=2; 
    for (loop2=0;loop2<16;loop2++) 
      for (loop3=0;loop3<16;loop3++) 
	tempbm[count++]=temp[loop1*17+(loop2+1)*320+loop3]; 
    x_bm_to_pbm(tempbm,data.coin[loop1]); 
  } 
  farfree(tempbm); 
  free(temp); 
  fclose(in); 
  for (loop1=0;loop1<256;loop1++) 
    setpalette(loop1,data.palette[loop1]); 
  return(yinit); 
} 
 
//GET MARIO DATA///////////////////////////////////////////////////////////// 
void getmario() 
{ 
  FILE *marioin; 
  int loop1,loop2,loop3; 
  char *temp; 
  if ((marioin=fopen("MARIO.PCX","rb"))==NULL) 
  { 
    exitgame(); 
    printf("MARIO.PCX could not be found!\n"); 
    exit(1); 
  } 
  fseek(marioin,128,SEEK_SET); 
  temp=(char *)malloc(6000); 
  temp=getpcx(marioin,temp,6000); 
  for (loop1=0;loop1<7;loop1++) 
    for (loop2=0;loop2<=15;loop2++) 
      for (loop3=0;loop3<=15;loop3++) 
	data.mario[loop1][loop2][loop3]=temp[loop1*17+(loop2+1)*320+loop3+1]; 
  fseek(marioin,-765,SEEK_END); 
  for (loop1=0;loop1<2;loop1++) 
  { 
    data.marioc[loop1].red=(getc(marioin)>>2); 
    data.marioc[loop1].green=(getc(marioin)>>2); 
    data.marioc[loop1].blue=(getc(marioin)>>2); 
  } 
  fseek(marioin,-750,SEEK_END); 
  for (loop1=0;loop1<2;loop1++) 
  { 
    data.luigic[loop1].red=(getc(marioin)>>2); 
    data.luigic[loop1].green=(getc(marioin)>>2); 
    data.luigic[loop1].blue=(getc(marioin)>>2); 
  } 
  fclose(marioin); 
  free(temp); 
} 
 
char *getpcx(FILE *file, char *temp, int length) 
{ 
  long int count=0; 
  int numbytes,loop; 
  unsigned char ch; 
  fseek(file,128,SEEK_SET); 
  temp=(char *)malloc(length); 
  while(count=192 && ch<=255)) 
    { 
      numbytes=ch-192; 
      ch=fgetc(file); 
      for(loop=0;loop=16) 
  { 
    x2-=16; 
    back++; 
  } 
  for (loop1=1;loop1<=13;loop1++) 
    for (loop2=back;loop2<=back+16;loop2++) 
      if (data.world[loop1][loop2]>0) 
      { 
	if (data.bumped[0]==loop2 && data.bumped[1]==loop1) 
	{ 
	  dy+=data.bumploop; 
	  x_put_masked_pbm((loop2<<4)-x+32,(loop1<<4)+dy,HiddenPageOffs,data.block[data.world[loop1][loop2]-1]); 
	  data.bumploop++; 
	  if(data.bumploop==3) 
	  { 
	    data.bumploop=0; 
	    data.bumped[0]=0; 
	    data.bumped[1]=0; 
	    dy=0; 
	  } 
	} 
	else 
	  x_put_masked_pbm((loop2<<4)-x+32,(loop1<<4),HiddenPageOffs,data.block[data.world[loop1][loop2]-1]); 
      } 
  drawcoin(x); 
  drawscore(x); 
  x_rect_fill(15,0,32,224,HiddenPageOffs,0); 
  x_rect_fill(288,0,306,224,HiddenPageOffs,0); 
} 
 
//DRAW INFO ON TOP OF SCREEN///////////////////////////////////////////////// 
void status() 
{ 
  static char pscore[7]="000000"; 
  char pscore2[7]; 
  char slevel[4]="1-1"; 
  char scoins[3]="00"; 
  static char stime[4]="   "; 
  int loop1,loop2; 
  if (curplay==0) 
    graphstring(34,1,"MARIO",TEXTCOLOR,HiddenPageOffs); 
  else 
    graphstring(34,1,"LUIGI",TEXTCOLOR,HiddenPageOffs); 
  graphstring(180,1,"WORLD",TEXTCOLOR,HiddenPageOffs); 
  graphstring(254,1,"TIME",TEXTCOLOR,HiddenPageOffs); 
  if(player[curplay].score[1]!=player[curplay].score[0]) 
  { 
    itoa(player[curplay].score[1],pscore2,10); 
    loop2=5; 
    for(loop1=strlen(pscore2)-1;loop1>=0;loop1--) 
	pscore[loop2--]=pscore2[loop1]; 
    graphstring(34,9,pscore,BACKGROUND,HiddenPageOffs); 
  } 
  strcpy(pscore,"000000"); 
  itoa(player[curplay].score[0],pscore2,10); 
  loop2=5; 
  for(loop1=strlen(pscore2)-1;loop1>=0;loop1--) 
    pscore[loop2--]=pscore2[loop1]; 
  graphstring(34,9,pscore,TEXTCOLOR,HiddenPageOffs); 
  player[curplay].score[1]=player[curplay].score[0]; 
  if (times[1]!=times[2]) 
  { 
    itoa(times[0],stime,10); 
    graphstring(260,9,stime,BACKGROUND,HiddenPageOffs); 
    times[2]=times[1]; 
    times[0]--; 
    itoa(times[0],stime,10); 
  } 
  graphstring(260,9,stime,TEXTCOLOR,HiddenPageOffs); 
  slevel[0]=(char)(player[curplay].level/5+1-208); 
  slevel[2]=(char)(player[curplay].level%5-208); 
  graphstring(188,9,slevel,TEXTCOLOR,HiddenPageOffs); 
  if (player[curplay].coins[0]!=player[curplay].coins[1]) 
  { 
    itoa(player[curplay].coins[1],scoins,10); 
    if (player[curplay].coins[1]<10) 
    { 
      scoins[1]=scoins[0]; 
      scoins[0]='0'; 
    } 
    graphstring(116,9,scoins,BACKGROUND,HiddenPageOffs); 
    player[curplay].coins[1]=player[curplay].coins[0]; 
  } 
  itoa(player[curplay].coins[0],scoins,10); 
  if (player[curplay].coins[0]<10) 
  { 
    scoins[1]=scoins[0]; 
    scoins[0]='0'; 
  } 
  graphchar(108,9,'x',TEXTCOLOR,HiddenPageOffs); 
  graphstring(116,9,scoins,TEXTCOLOR,HiddenPageOffs); 
  x_line(100,8,101,8,20,HiddenPageOffs); 
  x_put_pix(102,8,HiddenPageOffs,0); 
  x_line(100,15,101,15,20,HiddenPageOffs); 
  x_put_pix(102,15,HiddenPageOffs,0); 
  for(loop1=0;loop1<6;loop1++) 
  { 
    x_line(99,9+loop1,102,9+loop1,20,HiddenPageOffs); 
    x_put_pix(103,9+loop1,HiddenPageOffs,0); 
  } 
} 
 
//CALCULATE AND DRAW MARIO/////////////////////////////////////////////////// 
void drawmario(int x, int y) 
{ 
  int loop1,loop2; 
  for (loop1=0;loop1<=15;loop1++) 
    for (loop2=0;loop2<=15;loop2++) 
      if (data.mario[abs(data.sprite/2)][loop1][loop2]>=0) 
	if (y-15+loop1>=0 && y-15+loop1<224) 
	{ 
	  if (data.direction==0) 
	    x_put_pix(x+loop2+32,y-15+loop1,HiddenPageOffs,data.mario[data.sprite/2][loop1][loop2]); 
	  else x_put_pix(x+15-loop2+32,y-15+loop1,HiddenPageOffs,data.mario[data.sprite/2][loop1][loop2]); 
	} 
} 
 
//DRAW CHARACTERS//////////////////////////////////////////////////////////// 
void graphchar(int xc, int yc, char c,int color, unsigned offset) 
{ 
  int x,y; 
  unsigned char data; 
  unsigned char far *work; 
  unsigned char bitmask=0x80; 
  work=charset+(c<<3); 
  for(y=0;y<8;y++) 
  { 
    bitmask=0x80; 
    for(x=0;x<8;x++) 
    { 
      if((*work & bitmask)) 
	x_put_pix(x+xc,y+yc,offset,color); 
      bitmask=(bitmask>>1); 
    } 
  work++; 
  } 
} 
 
//DRAW A STRING////////////////////////////////////////////////////////////// 
void graphstring(int x,int y,char *string,int color, unsigned offset) 
{ 
  int loop; 
  for(loop=0;loop=16 && palloop%4==0) 
  { 
    if (palloop<=24) 
    { 
      tempc=data.palette[20]; 
      data.palette[20]=data.palette[21]; 
      data.palette[21]=data.palette[22]; 
      data.palette[22]=data.palette[23]; 
      data.palette[23]=tempc; 
    } 
    else 
    { 
      tempc=data.palette[23]; 
      data.palette[23]=data.palette[22]; 
      data.palette[22]=data.palette[21]; 
      data.palette[21]=data.palette[20]; 
      data.palette[20]=tempc; 
    } 
    for(loop=20;loop<=23;loop++) 
      setpalette(loop,data.palette[loop]); 
    if (palloop==36) 
      palloop=0; 
  } 
  palloop++; 
  *tempcp=tempc; 
  *palloopp=palloop; 
} 
 
void check_keybuf(int *movep, int *finishp, int *upp, int *downp, int *jumpp) 
{ 
  int move=*movep; 
  int finish=*finishp; 
  int up=*upp; 
  int down=*downp; 
  int jumploop=*jumpp; 
  if (keybuf[KEY_RIGHT] && !keybuf[KEY_LEFT]) 
  { 
   if (keybuf[KEY_CTRL]) 
   { 
     if (move<16) 
       move++; 
   } 
   else 
   { 
     if (move>8) 
       move--; 
     if (move<8) 
       move++; 
   } 
   if (landed) //(data.world[(marioy+1)/16][(mariox+player[curplay].screenx+8)/16]>26) 
     data.direction=0; 
   } 
   if (keybuf[KEY_LEFT] && !keybuf[KEY_RIGHT]) 
   { 
     if (keybuf[KEY_CTRL]) 
     { 
       if (move>-16) 
	 move--; 
     } 
     else 
     { 
       if (move<-8) 
	 move++; 
       if (move>-8) 
	 move--; 
     } 
     if (landed) //(data.world[(marioy+1)/16][(mariox+player[curplay].screenx+8)/16]>26) 
       data.direction=1; 
     } 
   if (keybuf[KEY_ALT] && !down) 
   { 
     up=-17; 
     data.sprite=12; 
     jumploop++; 
     if (jumploop>10) 
     { 
       down=1; 
       jumploop=0; 
     } 
   } 
   if (keybuf[KEY_P]) 
   { 
     graphstring(140,100,"Pause",TEXTCOLOR,VisiblePageOffs); 
     clear_key_buffer(); 
     while(!keybuf[KEY_P]); 
     clear_key_buffer(); 
     graphstring(140,100,"Pause",BACKGROUND,VisiblePageOffs); 
   } 
   if(keybuf[KEY_Q]) 
   { 
     graphstring(130,100,"Quit(Y/N)",TEXTCOLOR,VisiblePageOffs); 
     clear_key_buffer(); 
     while(!keybuf[KEY_Y] && !keybuf[KEY_N]); 
     if (keybuf[KEY_Y] && !keybuf[KEY_N]) 
       finish=3; 
     clear_key_buffer(); 
     graphstring(130,100,"Quit(Y/N)",BACKGROUND,VisiblePageOffs); 
   } 
   if ((!keybuf[KEY_RIGHT] && !keybuf[KEY_LEFT]) || (keybuf[KEY_RIGHT] && keybuf[KEY_LEFT])) 
   { 
    if (move>0) 
      move--; 
    if (move<0) 
      move++; 
   } 
  *movep=move; 
  *finishp=finish; 
  *upp=up; 
  *downp=down; 
  *jumpp=jumploop; 
} 
 
void animate_mario(int move) 
{ 
  if (landed) 
  { 
    if (data.sprite==10 && ((move>0 && data.direction==0) || (move<0 && data.direction==1))) 
      data.sprite=1; 
    if (move==0) 
      data.sprite=0; 
    if ((move>0 && data.direction==0) || (move<0 && data.direction==1)) 
    { 
      if(abs(move)<16) 
	data.sprite++; 
      else 
	data.sprite+=2; 
      if (data.sprite>=10) 
	data.sprite=2; 
    } 
    if ((move>0 && data.direction==1) || (move<0 && data.direction==0)) 
      data.sprite=10; 
  } 
} 
 
void move_mario(int *movep) 
{ 
  int move=*movep; 
  int loop1,loop2; 
  if (marioy>16) 
  { 
    if (move>0) 
      for (loop1=0;loop1<16;loop1++) 
	for (loop2=0;loop2<=move;loop2++) 
	  if (data.world[(marioy-loop1)/16][(mariox+player[curplay].screenx+13+loop2/4)/16]>26) 
	    move=loop2; 
    if (move<0) 
      for (loop1=0;loop1<16;loop1++) 
	for (loop2=0;loop2>=move;loop2--) 
	  if (data.world[(marioy-loop1)/16][(mariox+player[curplay].screenx+2+loop2/4)/16]>26 || (mariox+loop1/2)<=0) 
	    move=loop2; 
  } 
  if(mariox>100 && move>0) 
    player[curplay].screenx+=move/4; 
  else 
    if (mariox+move/4>0) 
      mariox+=move/4; 
  *movep=move; 
} 
 
void addcoin(int x, int y) 
{ 
  cointype *temp,*c; 
  c=bcoin; 
  while ((c->next)!=NULL) 
    c=c->next; 
  temp=(cointype *)malloc(sizeof(cointype)); 
  temp->next=NULL; 
  temp->coinx=x; 
  temp->coiny=y; 
  temp->coinloop=-10; 
  temp->dy=0; 
  c->next=temp; 
} 
 
void removecoin() 
{ 
  cointype *temp; 
  cointype *c=bcoin; 
  temp=c->next; 
  c->next=c->next->next; 
  addscore(temp->coinx,temp->coiny,"200"); 
  free(temp); 
} 
 
void drawcoin(int x) 
{ 
  cointype *c=bcoin; 
  int loop,num=0; 
  while ((c->next)!=NULL) 
  { 
    num++; 
    c=c->next; 
  } 
  c=bcoin; 
  for (loop=0;loopnext; 
    if (((c->coinx)*16+32-x)>16) 
      x_put_masked_pbm((c->coinx)*16+32-x,(c->coiny)*16+c->dy,HiddenPageOffs,data.coin[abs((c->coinloop)%3)]); 
    c->coinloop++; 
    c->dy+=c->coinloop; 
    if (c->coinloop>=10) 
       removecoin(); 
  } 
} 
 
void addscore(int x, int y, char *pscore) 
{ 
  scoretype *temp,*s; 
  s=bscore; 
  while ((s->next)!=NULL) 
    s=s->next; 
  temp=(scoretype *)malloc(sizeof(scoretype)); 
  temp->next=NULL; 
  temp->scorex=x; 
  temp->scorey=y; 
  temp->scoreloop=0; 
  strcpy(temp->num,pscore); 
  s->next=temp; 
} 
 
void removescore() 
{ 
  scoretype *temp; 
  scoretype *s=bscore; 
  temp=s->next; 
  s->next=s->next->next; 
  free(temp); 
} 
 
void drawscore(int x) 
{ 
  scoretype *s=bscore; 
  while ((s->next)!=NULL) 
  { 
    s=s->next; 
    if (((s->scorex)*16+32-x)>16) 
      graphstring((s->scorex)*16+32-x,(s->scorey)*16+(s->scoreloop),s->num,TEXTCOLOR,HiddenPageOffs); 
    s->scoreloop--; 
    if (s->scoreloop<=-20) 
       removescore(); 
  } 
} 
 
void exitgame() 
{ 
  int loop; 
  for (loop=0;loop<52;loop++) 
    farfree(data.block[loop]); 
  for (loop=0;loop<3;loop++) 
    farfree(data.coin[loop]); 
  free(bcoin); 
  free(bscore); 
  uninstall_new_key_handler(); 
  x_remove_vsync_handler(); 
  x_text_mode(); 
} 
 
void check_jump(int *upp, int *downp, int *jumploopp) 
{ 
  int loop1,loop2; 
  int up=*upp; 
  int down=*downp; 
  int jumploop=*jumploopp; 
  loop1=3; 
  landed=0; 
  while (loop1<13 && landed==0) 
  { 
    if (data.world[(marioy+1)/16][(mariox+player[curplay].screenx+loop1)/16]>26) 
      landed=1; 
    else 
      landed=0; 
    loop1++; 
  } 
  if (!landed || marioy<16) 
    if (up<17) 
      up+=1; 
  if (up>0)	//CHECK IF MARIO LANDED// 
  { 
    down=1; 
    loop1=marioy; 
    if (marioy<207) 
    { 
      while(loop1++26) 
	  { 
	    marioy=loop1-1; 
	    loop1=marioy+up/4; 
	    loop2=13; 
	    up=0; 
	    down=0; 
	    data.sprite=0; 
	  } 
      } 
    } 
    marioy+=up/4; 
  } 
  if (up<0)	//CHECK IF MARIO HIT A BLOCK/ 
  { 
    if (!keybuf[KEY_ALT]) 
    { 
      down=1; 
      jumploop=0; 
    } 
    loop1=marioy; 
    marioy+=up/4; 
    if (marioy>24) 
    { 
      while(loop1-->=marioy+up/4) 
      { 
	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) 
	{ 
	  marioy=loop1; 
	  loop1=marioy+up/4-1; 
	  up=-up; 
	  down=1; 
	  jumploop=0; 
	  if (data.bumped[0]==0 && data.bumped[1]==0) 
	  { 
	    data.bumped[0]=(mariox+player[curplay].screenx+8)/16; 
	    data.bumped[1]=marioy/16-1; 
	    data.bumploop=-3; 
	  } 
	} 
	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) 
	  mariox-=1; 
	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) 
	  mariox+=1; 
      } 
    } 
  } 
  *upp=up; 
  *downp=down; 
  *jumploopp=jumploop; 
} 
 
void check_blocks() 
{ 
  int bumpedblock=0; 
  if (data.world[(marioy-8)/16][(mariox+player[curplay].screenx+8)/16]==10) 
  { 
    data.world[(marioy-8)/16][(mariox+player[curplay].screenx+8)/16]=0; 
    player[curplay].score[0]+=200; 
    player[curplay].coins[0]++; 
  } 
  if (data.bumploop==-3) 
  { 
    bumpedblock=data.world[marioy/16-1][(mariox+player[curplay].screenx+8)/16]; 
    switch (bumpedblock) 
    { 
      case 18: 
      case 28: 
	data.world[marioy/16-1][(mariox+player[curplay].screenx+8)/16]=27; 
	player[curplay].score[0]+=200; 
	player[curplay].coins[0]++; 
	addcoin(data.bumped[0],data.bumped[1]-1); 
      case 29: 
	if (data.world[data.bumped[1]-1][data.bumped[0]]==10) 
	{ 
	  data.world[data.bumped[1]-1][data.bumped[0]]=0; 
	  player[curplay].score[0]+=200; 
	  player[curplay].coins[0]++; 
	  addcoin(data.bumped[0],data.bumped[1]-1); 
	} 
	break; 
      default: 
	data.bumped[0]=data.bumped[1]=0; 
	data.bumploop=0; 
	break; 
    } 
  } 
  if (player[curplay].coins[0]==100) 
  { 
    player[curplay].lives++; 
    player[curplay].coins[0]=0; 
  } 
} 
 
void check_finish(int *finishp) 
//CHECK FOR END OF CURRENT PLAYER LOOP/////////////////////////////////////// 
{ 
  int finish=*finishp; 
  if (marioy>=250) 
    finish=1; 
  if ((mariox+player[curplay].screenx+16)/16==data.maxlength-13) 
    finish=2; 
  if (times[0]==0) 
    finish=1; 
  *finishp=finish; 
} 
//END////////////////////////////////////////////////////////////////////////