⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smbfunc.c

📁 本资源由代码秀(39g.com
💻 C
📖 第 1 页 / 共 2 页
字号:
  {
    if (keybuf[KEY_DOWN])
    {
      x_rect_fill(108,129,117,137,VisiblePageOffs,BACKGROUND);
      numplayers=2;
    }
    if (keybuf[KEY_UP])
    {
      x_rect_fill(108,145,117,153,VisiblePageOffs,BACKGROUND);
      numplayers=1;
    }
    if (numplayers==1)
      offset=129;
    else
      offset=145;
    x_line(110,offset,113,offset,21,VisiblePageOffs);
    x_line(109,offset+1,114,offset+1,21,VisiblePageOffs);
    x_line(109,offset+2,114,offset+2,21,VisiblePageOffs);
    x_line(108,offset+3,115,offset+3,21,VisiblePageOffs);
    x_line(108,offset+4,115,offset+4,21,VisiblePageOffs);
    x_line(108,offset+5,115,offset+5,21,VisiblePageOffs);
    x_put_pix(109,offset+6,VisiblePageOffs,21);
    x_put_pix(114,offset+6,VisiblePageOffs,21);
    x_line(110,offset+6,113,offset+6,20,VisiblePageOffs);
    x_line(110,offset+7,113,offset+7,20,VisiblePageOffs);
  }
  return(numplayers);
}

//CHANGE COLORS FOR MARIO OR LUIGI///////////////////////////////////////////
void setcolors()
{
  if (curplay==0)
  {
    setpalette(1,data.marioc[0]);
    setpalette(2,data.marioc[1]);
  }
  else
  {
    setpalette(1,data.luigic[0]);
    setpalette(2,data.luigic[1]);
  }
}

void rotatepal(int *palloopp, colorpal *tempcp)
{
  int palloop=*palloopp;
  colorpal tempc=*tempcp;
  int loop;
  if (palloop>=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;loop<num;loop++)
  {
    c=c->next;
    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++<marioy+up/4)
      {
	for (loop2=3;loop2<14;loop2+=9)
	  if (data.world[loop1/16][(mariox+player[curplay].screenx+loop2)/16]>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////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -