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

📄 smbfunc.c

📁 supermario游戏源码。
💻 C
📖 第 1 页 / 共 2 页
字号:
//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<length)
  {
    ch=fgetc(file);
    if ((ch>=192 && ch<=255))
    {
      numbytes=ch-192;
      ch=fgetc(file);
      for(loop=0;loop<numbytes;loop++)
	temp[count++]=ch;
    }
    else
      temp[count++]=ch;
  }
  return(temp);
}

//SET PALETTE////////////////////////////////////////////////////////////////
void setpalette(int index, colorpal color)
{
  outp(0x3c6,0xff);
  outp(0x3c8,index);
  outp(0x3c9,color.red);
  outp(0x3c9,color.green);
  outp(0x3c9,color.blue);
}

//CALCULATE CURRENT SCREEN///////////////////////////////////////////////////
void drawscreen(int x)
{
  int loop1,loop2,back,x2;
  static int dy;
  status();
  x2=x;
  back=0;
  while(x2>=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<strlen(string);loop++)
    graphchar(x+loop*8,y,string[loop],color,offset);
}

//DRAW SCREEN SHOWING LEVEL AND NUMBER OF LIVES//////////////////////////////
void levelscreen()
{
  int x=75;
  int y=110;
  int wait[3];
  char print[3];
  data.sprite=0;
  data.direction=0;
  fillscreen(0);
  status();
  drawmario(x,y);
  graphstring(100,82,"WORLD",TEXTCOLOR,HiddenPageOffs);
  graphchar(132,100,'x',TEXTCOLOR,HiddenPageOffs);
  graphchar(156,82,'-',TEXTCOLOR,HiddenPageOffs);
  print[0]=(char)(player[curplay].level/5+1-208);
  graphchar(148,82,print[0],TEXTCOLOR,HiddenPageOffs);
  print[0]=(char)(player[curplay].level%5-208);
  graphchar(164,82,print[0],TEXTCOLOR,HiddenPageOffs);
  itoa(player[curplay].lives,print,10);
  graphstring(148,100,print,TEXTCOLOR,HiddenPageOffs);
  x_page_flip(0,0);
  gettime(&t);
  wait[0]=t.ti_sec;
  wait[1]=wait[0];
  wait[2]=0;
  while(wait[2]!=3)
  {
    gettime(&t);
    wait[0]=t.ti_sec;
    if(wait[0]!=wait[1])
    {
      wait[1]=wait[0];
      wait[2]++;
    }
  }
}

//TITLE SCREEN AND CHOOSING NUMBER OF PLAYERS////////////////////////////////
int startscreen()
{
  int x=40;
  int y=191;
  int choice,screenx,offset,numplayers=1;
  FILE *logoin;
  int count,loop1,loop2;
  char *temp;
  data.sprite=0;
  screenx=0;
  if ((logoin=fopen("LOGO.PCX","rb"))==NULL)
  {
    exitgame();
    printf("LOGO.PCX not found!\n");
    exit(1);
  }
  fseek(logoin,128,SEEK_SET);
  temp=getpcx(logoin,temp,31040);
  count=-111;
  fillscreen(BACKGROUND);
  drawscreen(screenx);
  drawmario(x,y);
  for (loop1=0;loop1<97;loop1++)
  {
    count+=111;
    for (loop2=0;loop2<209;loop2++)
      x_put_pix(loop2+55,loop1+20,HiddenPageOffs,temp[count++]);
  }
  free(temp);
  fclose(logoin);
  graphstring(160,118,"1985 NINTENDO",TEXTCOLOR,HiddenPageOffs);
  graphstring(120,130,"1 PLAYER GAME",TEXTCOLOR,HiddenPageOffs);
  graphstring(120,146,"2 PLAYER GAME",TEXTCOLOR,HiddenPageOffs);
  graphstring(120,162,"TOP - 000000",TEXTCOLOR,HiddenPageOffs);
  x_page_flip(0,0);
  while(!keybuf[KEY_ENTER])

⌨️ 快捷键说明

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