📄 map.c
字号:
# 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 + -