📄 game.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 + -