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

📄 map.c

📁 仙剑演示版源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
# include <dir.h>
# include <dos.h>
# include <stdio.h>
# include "vga13h.h"

FILE  *pat;
FILE  *fp_map;
BYTE  pal[256][3];
BYTE  shape[256];
BYTE  shape2[256];
BYTE  buf[20][20];
BYTE  Reach;
BYTE  Hide;
BYTE  Mode;
BYTE  Root;
BYTE  key=0;
BYTE  COMMON=TRUE;
BYTE  CONT  =FALSE;
BYTE  TOP   =FALSE;
int   VIEW_X=0;
int   VIEW_Y=0;
int   nowx=160,nowy=100;
int   offx=0  ,offy=0;
int   oldx,oldy;
int   button=0;
int   nowpat=0;
int   Num;
int   MAX;

# include "mouse.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;
};

void   far (*_p)();
WORD   handle;
WORD   menu_handle;
struct para_table xms;
BYTE   OP[400];
struct BLOCK MAP[4090];

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 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);
    waitkey();
    exit(1);
  }
}

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

void scr2xms()
{
  xms.block_length=64000l;
  xms.source_handle=0;
  xms.targ_handle=menu_handle;
  xms.source_addr.i[0]=0;
  xms.source_addr.i[1]=0xa000;
  xms.targ_addr.t=0l;
  move_xmsblock(&xms);
}

void xms2scr()
{
  xms.block_length=64000l;
  xms.source_handle=menu_handle;
  xms.targ_handle=0;
  xms.source_addr.t=0l;
  xms.targ_addr.i[0]=0;
  xms.targ_addr.i[1]=0xa000;
  move_xmsblock(&xms);
}

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;
  int   x,y;
  BYTE  color;
  BYTE  sh;
  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 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 refresh(int viewx,int viewy)
{
  DWORD offset;
  WORD  lp;
  hide();
  offset=viewy*1280l+viewx;
  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;
  }
  readpat(nowpat,0);
  showsmall(288,184);
  if (COMMON) fill(0,190,9,199,4);
  if (CONT)   fill(10,190,19,199,2);
  if (TOP)    fill(20,190,29,199,1);
  show();
}

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 savemap()
{
  rewind(fp_map);
  fwrite(MAP,6,4090,fp_map);
}
void initmenu()
{
  FILE *bin;
  int x,y;
  bin=fopen("1","rb");
  for (y=0;y<200;y++)
      for (x=0;x<320;x++)
          pset(x,y,fgetc(bin));
  fclose(bin);
  getpic(9,64,OP);
  fill(9,64,28,83,134);
  scr2xms();
}
int input(int col)
{
  int  len=0;
  BYTE in[4];
  int  n;
  int  i;
  hide();
  if (col==9)
     fill(70,170,110,187,0);
  else
     fill(230,170,270,187,0);
  locate(22,col);
  while (1)
  {
    key=InKey();
    if (key==13) break;
    if (key==8) len--;
    if (len<0) len=0;
    if (key>47&&key<58)
    {
       in[len]=key-48;
       len++;
       putchar(key);
    }
    if (len==4) break;
  }
  n=0;
  for (i=0;i<len;i++)
  {
     n*=10;
     n+=in[i];
  }
  if (col==9)
     fill(70,170,110,187,0);
  else
     fill(230,170,270,187,0);
  locate(22,col);
  if (n>4095) n=0;
  printf("%d",n);
  show();
  return n;
}
void control(int button)
{
  int diff;
  int root;
  if (button==1)
  {
     if (nowx>40&&nowx<90&&nowy>65&&nowy<83&&Hide)
     {
	fill(9,64+20*Hide,28,83+20*Hide,134);
	Hide=0;
        putpic(9,64+20*Hide,OP);
     }
     else if (nowx>40&&nowx<90&&nowy>85&&nowy<103&&Hide!=1)
     {
        fill(9,64+20*Hide,28,83+20*Hide,134);
	Hide=1;
        putpic(9,64+20*Hide,OP);
     }
     else if (nowx>40&&nowx<90&&nowy>105&&nowy<123&&Hide!=2)
     {
        fill(9,64+20*Hide,28,83+20*Hide,134);
	Hide=2;
        putpic(9,64+20*Hide,OP);
     }
     else if (nowx>200&&nowx<266&&nowy>65&&nowy<83&&Mode)
     {
	fill(169,64+20*Mode,188,83+20*Mode,134);
	Mode=0;
	putpic(169,64+20*Mode,OP);
     }
     else if (nowx>200&&nowx<266&&nowy>85&&nowy<103&&Mode!=1)
     {
	fill(169,64+20*Mode,188,83+20*Mode,134);
        Mode=1;
	putpic(169,64+20*Mode,OP);
     }
     else if (nowx>200&&nowx<266&&nowy>105&&nowy<123&&Mode!=2)
     {
	fill(169,64+20*Mode,188,83+20*Mode,134);
        Mode=2;
	putpic(169,64+20*Mode,OP);
     }
     else if (nowx>40&&nowx<140&&nowy>140&&nowy<156)
     {
	Reach=!Reach;
	if (Reach)
	   putpic(9,138,OP);
	else
	   fill(9,128,38,157,134);
	waitmouse();
     }
     /* input event num */
     else if (nowx>70&&nowx<110&&nowy>170&&nowy<187)

⌨️ 快捷键说明

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