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

📄 game.c

📁 仙剑演示版源代码
💻 C
字号:
# include <dos.h>
# include <stdio.h>

# define  BYTE      unsigned char
# define  WORD      unsigned int
# define  DWORD     unsigned long
# define  TRUE      1
# define  FALSE     !TRUE
# define  DELAYTIME 100


# include "hz.h"

union set_addr
{

       WORD i[2];
       long t;
};

struct BLOCK
{
       unsigned num   : 15;
       unsigned reach :  1;
       unsigned hide  :  2;
       unsigned mode  :  2;
       unsigned event : 12;
       unsigned offx  :  2;
       unsigned offy  :  2;
       unsigned top   : 12;
};

struct para_table
{
       long  block_length;
       WORD  source_handle;
       union set_addr source_addr;
       WORD  targ_handle;
       union set_addr targ_addr;
};

int    calcnum(int x,int y);
BYTE   Inkey(void);
BYTE   xms_init();
WORD   test_xmssize();
WORD   alloc_xms(WORD b);
void   wait();
void   setmode();
void   refresh();
void   readpal();
void   far (*_p)();
void   setallpal();
void   closemode();
void   clearkeybuf();
void   get_xmsentry();
void   doevent(int no);
void   drawxms(int index);
void   drawtop(int index);
void   readsprite(WORD no);
void   showsmall(int x0,int y0);
void   bigbmp(char *fn,int pos);
void   readpat(int num,int mode);
void   pset(int x,int y,BYTE color);
void   drawsprite(int index,int face);
void   free_xmsblock(WORD describ_word);
void   move_xmsblock(struct para_table *q);

FILE   *pat;
FILE   *fp_map;
BYTE   pal[256][3];
BYTE   shape[256];
BYTE   shape2[256];
BYTE   sprite[2560];
BYTE   buf[20][20];
BYTE   chface=FALSE;
BYTE   IsDo=FALSE;
BYTE   DONE=FALSE;
WORD   handle;
WORD   sp_handle;
WORD   face=0;
int    sp=1;
int    VIEW_X=32;
int    VIEW_Y=8;
int    nowpos=654;
int    oldpos=654;
struct para_table xms;
struct BLOCK MAP[4090];

void main()
{
  int  i=4090;
  BYTE key;

  xms_init();
  get_xmsentry();
  handle=alloc_xms(1024);
  sp_handle=alloc_xms(120);

  pat=fopen("demo.dot","rb");
  hz_handle=fopen("hzk16","rb");
  fp_map=fopen("game.map","rb");
  fread(MAP,6,4090,fp_map);
  fclose(fp_map);

  setmode();
  readpal();

  while (i--)
  {
    readpat(MAP[i].num,0);
    drawxms(i);
    drawtop(i);
  }

  readsprite(sp);

  refresh(0,0);

  drawsprite(nowpos,3);

  bigbmp("222.bmp",1);
  hz(35,20,0,"韩光到哪里去了?这个疯子真是的,整天n在外面拈花惹草的,真让人放心不下,我还是n到处走走看看,去找找他,说不定他就在附近。n     >“韩光!回家吃饭了!”");
  wait();
  refresh(0,0);
  drawsprite(nowpos,3);

  key=Inkey();
  while (key!=1)
  {
    oldpos=nowpos;
    switch (key)
    {
      case 75:
	   face=0;
           chface=TRUE;
           IsDo=FALSE;
	   if (MAP[nowpos-41].reach)
	   {
	      VIEW_X-=16;
	      VIEW_Y-=8;
              nowpos-=41;
	   }
	   break;
      case 77:
           face=1;
           chface=TRUE;
           IsDo=FALSE;
	   if (MAP[nowpos+41].reach)
	   {
	      VIEW_X+=16;
	      VIEW_Y+=8;
              nowpos+=41;
           }
	   break;
      case 72:
           face=3;
           chface=TRUE;
           IsDo=FALSE;
	   if (MAP[nowpos-40].reach)
	   {
	      VIEW_X+=16;
	      VIEW_Y-=8;
              nowpos-=40;
	   }
	   break;
      case 80:
           face=2;
           chface=TRUE;
           IsDo=FALSE;
	   if (MAP[nowpos+40].reach)
	   {
	      VIEW_X-=16;
	      VIEW_Y+=8;
              nowpos+=40;
	   }
           break;
      case 12:
	   sp--;
	   if (sp<0) sp=3;
	   readsprite(sp);
	   break;
      case 13:
	   sp++;
	   if (sp>3) sp=0;
	   readsprite(sp);
    }
    if (oldpos!=nowpos)
    {
       refresh();
       drawsprite(nowpos,face*3);
       delay(DELAYTIME);
       refresh();
       drawsprite(nowpos,face*3+1);
       delay(DELAYTIME);
       refresh();
       drawsprite(nowpos,face*3+2);
       delay(DELAYTIME);
       oldpos=nowpos;
    }
    if (chface)
    {
       refresh();
       drawsprite(nowpos,face*3);
       chface=FALSE;
    }
    key=Inkey();
    if (MAP[nowpos].mode==2&&!IsDo) doevent(MAP[nowpos].event);
    if (MAP[nowpos].mode==1&&key==57&&!IsDo) doevent(MAP[nowpos].event);
  }
  closemode();
  free_xmsblock(sp_handle);
  free_xmsblock(handle);
  fclose(pat);
  fclose(hz_handle);
}

BYTE Inkey(void)
{
  int  start,end;
  WORD key=0;
  start=peek(0,0x41a);
  end=peek(0,0x41c);
  if (start==end) return(0);
  else
  {
    key=peek(0x40,start);
    start+=2;
    if (start==0x3e) start=0x1e;
    poke(0x40,0x1a,start);
    return(key/256);
  }
}

void clearkeybuf()
{
  poke(0,0x41a,peek(0,0x41c));
}
void setallpal()
{
  int i;
  outportb(0x3c8,0);
  for (i=0;i<256;i++)
  {
      outportb(0x3c9,pal[i][0]);
      outportb(0x3c9,pal[i][1]);
      outportb(0x3c9,pal[i][2]);
  }
}

BYTE xms_init()
{
  _AX=0x4300;
  geninterrupt(0x2f);
  if (_AL!=0x80) printf("\aNo XMS installed!\n");
  return (_AL);
}

void get_xmsentry()
{
  _AX=0x4310;
  geninterrupt(0x2f);
  _p=(void (far*)())MK_FP(_ES,_BX);
}

WORD test_xmssize()
{
  _AH=8;
  _p();
  return _AX;
}

WORD alloc_xms(WORD b)
{
  WORD a;
  _DX=b;
  _AH=9;
  _p();
  a=_DX;
  if(_AX!=1)
  {
    printf("XMS block allocation fail!\a");
    exit(1);
  }
  return a;
}

void move_xmsblock(struct para_table *q)
{
  _DS=FP_SEG(q);
  _SI=FP_OFF(q);
  _AH=0x0b;
  _p();
  if (_AX!=1)
  {
    closemode();
    printf("XMS move error!\nError no %xh.\n",(unsigned)_BL);
    wait();
    exit(1);
  }
}

void free_xmsblock(WORD describ_word)
{
  _DX=describ_word;
  _AH=0x0a;
  _p();
}

void showsmall(int x0,int y0)
{
  int i,j,p=0;
  int x,y;
  for (i=0;i<15;i++)
      for (j=0;j<32-abs(i-7)*4;j++)
      {
	  x=x0+abs(i-7)*2+j;
	  y=y0+i;
	  if (x>=0&&x<320&&y>=0&&y<200) pset(x,y,shape[p]);
	  p++;
      }
}

void readpal()
{
  FILE *p;
  int  x,y;

  p=fopen("test.pal","rb");
  outportb(0x3c8,0);
  for (y=0;y<256;y++)
  {
      for (x=0;x<3;x++)
      {
	  pal[y][x]=fgetc(p);
	  outportb(0x3c9,pal[y][x]);
      }
  }
  fclose(p);
}

void readpat(int num,int mode)
{
  fseek(pat,num*256l,SEEK_SET);
  if (mode)
     fread(shape2,256l,1,pat);
  else
     fread(shape,256l,1,pat);
}
void drawxms(int index)
{
  int   logicX,logicY;
  int   i,j,p=0;
  DWORD offset;

  if ((index<41)||(index>4048)) return;

  i=index/81;
  j=index%81;

  if ((j==40)||(j==80)) return;

  logicX=j*32+14;
  logicY=i*16-7;

  if (j>39)
  {
     logicX-=1296;
     logicY+=8;
  }
  offset=(DWORD)logicY*1280l+logicX;

  xms.source_handle=0;
  xms.targ_handle=handle;
  xms.source_addr.i[1]=FP_SEG(shape);

  for (i=1;i<9;i++)
  {
      xms.block_length=i*4l;
      xms.source_addr.i[0]=FP_OFF(&shape[p]);
      xms.targ_addr.t=offset;
      move_xmsblock(&xms);
      offset+=1278l;
      p+=i*4;
  }
  offset+=4l;
  for (i=7;i>0;i--)
  {
      xms.block_length=i*4l;
      xms.source_addr.i[0]=FP_OFF(&shape[p]);
      xms.targ_addr.t=offset;
      move_xmsblock(&xms);
      offset+=1282l;
      p+=i*4;
  }
}
void refresh()
{
  DWORD offset;
  WORD  lp;

  if (VIEW_X<0) VIEW_X=0;
  if (VIEW_Y<0) VIEW_Y=0;
  if (VIEW_X>960) VIEW_X=960;
  if (VIEW_Y>600) VIEW_Y=600;

  offset=VIEW_Y*1280l+VIEW_X;
  xms.block_length=320l;
  xms.source_handle=handle;
  xms.targ_handle=0;
  xms.targ_addr.i[1]=0xa000;
  for (lp=0;lp<200;lp++)
  {
      xms.source_addr.t=offset;
      xms.targ_addr.i[0]=(WORD)lp*320;
      move_xmsblock(&xms);
      offset+=1280l;
  }
}

int  calcnum(int x,int y)
{
  int i,j,x1,x2,y1,y2,d1,d2,cx,cy;

  i=x/16;
  j=y/8;
  y1=j*8;
  y2=j*8+8;
  if ((i+j)%2)
  {
     x1=i*16;
     x2=i*16+16;
  }
  else
  {
     x1=i*16+16;
     x2=i*16;
  }
  d1=(x1-x)*(x1-x)+(y1-y)*(y1-y);
  d2=(x2-x)*(x2-x)+(y2-y)*(y2-y);
  if (d1<d2)
  {
     cx=x1;
     cy=y1;
  }
  else
  {
     cx=x2;
     cy=y2;
  }
  if (cx%32)
  {
     j=(cx-16)/32;
     i=cy/16;
  }
  else
  {
     j=(cx+1280)/32;
     i=(cy-8)/16;
  }
  return (81*i+j);
}

void drawsprite(int index,int face)
{
  int   x,y;
  int   i,j,p=0;
  int   BX,BY;
  int   path[10]={40,1,40,40,1,40,40,1,40,0};
  int   lp;
  BYTE  IsFront=FALSE;

  index-=243;

  xms.block_length=2560l;
  xms.source_handle=sp_handle;
  xms.targ_handle=0;
  xms.source_addr.t=(WORD)face*2560l;
  xms.targ_addr.i[0]=FP_OFF(sprite);
  xms.targ_addr.i[1]=FP_SEG(sprite);
  move_xmsblock(&xms);

  for (lp=0;lp<10;lp++)
  {
      if ((index<41)||(index>4048)) return;

      i=index/81;
      j=index%81;

      if ((j==40)||(j==80)) return;

      if (nowpos>MAP[index].offx*40+MAP[index].offy*41+index)
	 IsFront=TRUE;
      else
	 IsFront=FALSE;

      BX=j*32;
      BY=i*16-7;

      if (j>39)
      {
	 BX-=1296;
	 BY+=8;
      }
      BX-=VIEW_X;
      BY-=VIEW_Y;
      readpat(MAP[index].top,1);

      if (MAP[index].hide!=2)
      {
	 for (i=0;i<15;i++)
             for (j=0;j<32-abs(i-7)*4;j++)
             {
                 x=BX+abs(i-7)*2+j;
                 y=BY+i;
                 if (sprite[p]!=15) pset(x,y,sprite[p]);
		 if (MAP[index].hide==1&&shape2[p%256]!=15&&!IsFront)
		    pset(x,y,shape2[p%256]);
                 p++;
             }
      }
      else
      {
	 for (i=0;i<15;i++)
             for (j=0;j<32-abs(i-7)*4;j++)
             {
                 x=BX+abs(i-7)*2+j;
                 y=BY+i;
                 if (sprite[p]!=15) pset(x,y,sprite[p]);
                 if (shape2[p%256]!=15)
		    pset(x,y,shape2[p%256]);
                 p++;
             }
      }
      index+=path[lp];
  }
  clearkeybuf();
}
void doevent(int no)
{
  int   path[10]={40,1,40,40,1,40,40,1,40,0};
  int   i,j;
  if (IsDo) return;
  switch (no)
  {
    case  1:
	  hz(50,120,0,">法雪妹妹:4咦?怎么两条路?先走左面的n吧!");
          bigbmp("222.bmp",0);
          IsDo=TRUE;
          break;
    case  2:
	  hz(50,120,0,">雪儿:2唉,怎么走4错2了!还是走1这2条!");
          bigbmp("222.bmp",0);
          IsDo=TRUE;
          break;
    case  3:
	  hz(50,120,0,">法雪妹妹:4啊!!!!!!!!!!");
          bigbmp("222.bmp",0);
          IsDo=TRUE;
          break;
    case  80:
	  if (!DONE) break;
	  bigbmp("222.bmp",0);
	  hz(30,140,0,">法雪妹妹:4萍萍,你以为你是谁!!");
	  wait();
	  refresh();
	  drawsprite(nowpos,face*3);
	  bigbmp("f4.bmp",1);
	  hz(10,10,0,">萍萍妹妹:4法雪,我劝你还是老实一点!!");
	  hz(50,30,0,"4韩光是个1疯子4!!");
          IsDo=TRUE;
          break;
    case  30:
	  if (DONE) break;
	  DONE=TRUE;
	  hz(50,40,0,">法雪妹妹:4韩光哥!我好想你!!");
	  bigbmp("222.bmp",1);
	  wait();
	  refresh();
	  drawsprite(nowpos,face*3);
	  hz(40,130,0,">韩光哥:4法雪妹妹!我也好想你!!");
          bigbmp("lxy.bmp",0);
	  wait();
	  refresh();
	  drawsprite(nowpos,face*3);

	  j=1034;
	  for (i=0;i<10;i++)
	  {
	      MAP[j].top+=30;
	      drawtop(j);
	      j+=path[i];
	  }
	  bigbmp("f4.bmp",1);
	  hz(50,40,0,">萍萍妹妹:4真够了你们!!2哼!");
          wait();
	  readsprite(3);
	  drawsprite(1196,3);
	  readsprite(sp);

	  IsDo=TRUE;
	  break;
    case  40:
	  hz(100,100,0,"9赵进港四了");
	  sound(4000);
	  delay(1000);
	  nosound();
          IsDo=TRUE;
          break;
    case  60:
	  hz(50,100,0,"恭喜您中了大奖!(奖品一张彩票。)");
          IsDo=TRUE;
          break;
    case  88:
	  hz(50,120,0,">萍萍妹妹:4啊?韩光啊韩光,果然不出我n所料!等着瞧!简直气死我了!!!");
          bigbmp("222.bmp",0);
          IsDo=TRUE;
          break;
    case  100:
	  hz(50,100,0,"4救命啊1!!!你踩死我了!!");
	  hz(100,160,0,"4SOS");
          IsDo=TRUE;
          break;
    case  89:
          sp--;
          if (sp<0) sp=3;
          readsprite(sp);
          IsDo=TRUE;
          break;
  }
}
void readsprite(WORD no)
{
  int  i;
  WORD offset=0;
  fseek(pat,(WORD)(245+no*120)*256l,SEEK_SET);
  xms.block_length=2560l;
  xms.source_addr.i[0]=FP_OFF(sprite);
  xms.source_addr.i[1]=FP_SEG(sprite);
  xms.source_handle=0;
  xms.targ_handle=sp_handle;

  for (i=0;i<12;i++)
  {
      fread(sprite,2560l,1,pat);
      xms.targ_addr.t=offset;
      move_xmsblock(&xms);
      offset+=2560l;
  }
  refresh();
  drawsprite(nowpos,face*3);
}
void drawtop(int index)
{
  int i,sh;
  if (MAP[index].hide)
  {
     readpat(MAP[index].top,1);
     readpat(MAP[index].num,0);
     for (i=0;i<256;i++)
     {
         sh=shape2[i];
         if (sh!=15) shape[i]=sh;
     }
     drawxms(index);
  }
}
void bigbmp(char *fn,int pos)
{
  int  x,y;
  int  c;
  int  x0=5,y0=5;
  FILE *ling;

  if (pos)
  {
     x0=204;
     y0=50;
  }
  ling=fopen(fn,"rb");
  fseek(ling,1078,SEEK_SET);
  for (y=0;y<130;y++)
  {
      for (x=0;x<106;x++)
      {
	  c=fgetc(ling);
	  if (c!=15) pset(x+x0,y+y0,c);
      }
      fseek(ling,2,SEEK_CUR);
  }
  fclose(ling);
}

void pset(int x,int y,BYTE color)
{
  pokeb(0xa000,y*320+x,color);
}

void wait()
{
  _AH=0;
  __int__(0x16);
}

void closemode()
{
  _AX=3;
  __int__(16);
}
void setmode()
{
  _AX=19;
  __int__(16);
}

⌨️ 快捷键说明

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