📄 gameio.cpp
字号:
TACTOR::~TACTOR()
{ reset();
}
int game_findactor(int id)
{ int i;
for (i=0;actor[i].id!=id&&i<MAX_ACTOR;i++);
if (i==MAX_ACTOR) return -1;
return i;
}
///////////////////////////////////////////////////////////////////////////
// DRAWING PROCESS //
///////////////////////////////////////////////////////////////////////////
struct
{ short x,y,disp;
char *spirit;
} swap_link,_spirit_link[1000]={ { 0,0,0, NULL } };
// int game_draw(int dbg,int scr)
// dbf stands for whether draw to double buffer
// scr stands for whether draw to screen
int game_blit(int dbf,int scr)
{ static int double_buf=0;
layer.datas[2].key_color=0;
layer.datas[1].key_color=(layer.datas[2].flag)? 1 : 0;
if (dbf>0) {
if (layer.datas[2].flag==1) layer.blit(double_buf,2);
if (layer.datas[1].flag==1) layer.blit(double_buf,1);
}
if (scr>0) layer.blit_to_scr(double_buf);
return 0;
}
static int insert_mode=0;
int view_spirit(short x,short y,char *spr,short disp)
{ short rx,ry,len,wid,hotx,hoty,count;
lgetSize(&len,&wid,spr); lgetHotXY(&hotx,&hoty,spr);
x-=map.x*8; y-=map.y*8; rx=x-hotx; ry=y-hoty;
if (rx>320||ry>240||rx+len<0||ry+wid<0) return -1;
if (insert_mode==0) {
if (disp<0) lg_insert_spirit(&spirit_link[0],x,y,spr,disp);
else if (disp<10000L) lg_insert_spirit(&spirit_link[1],x,y,spr,disp);
else lg_insert_spirit(&spirit_link[2],x,y,spr,disp);
} else {
for (count=0;_spirit_link[count].spirit;count++);
if (count>=1000) return -1;
_spirit_link[count].x=x,
_spirit_link[count].y=y;
_spirit_link[count].disp=disp;
_spirit_link[count].spirit=spr;
_spirit_link[count+1].spirit=NULL;
}
return 0;
}
int view_link(int l0,int l1,int l2)
{ short i,j,count;
TlgSpiritLink *p;
if (insert_mode==0) {
if (l0) {
//lg_view_spirit(&spirit_link[0]);
for (p=spirit_link[0];p;p=p->next) {
lgetSize(&i,&j,p->img);
express.draw_mix(p->x-i/2,p->y-j+1,p->img);
}
lg_delete_link(&spirit_link[0]);
}
if (l1) { lg_view_spirit(&spirit_link[1]); lg_delete_link(&spirit_link[1]); }
if (l2) { lg_view_spirit(&spirit_link[2]); lg_delete_link(&spirit_link[2]); }
} else {
for (count=0;_spirit_link[count].spirit;count++);
for (i=0;i<count-1;i++)
for (j=i+1;j<count;j++)
if (_spirit_link[i].disp>_spirit_link[j].disp) {
memcpy(&swap_link,&_spirit_link[i],sizeof(_spirit_link[0]));
memcpy(&_spirit_link[i],&_spirit_link[j],sizeof(_spirit_link[0]));
memcpy(&_spirit_link[j],&swap_link,sizeof(_spirit_link[0]));
}
for (i=0;i<count;i++) lputSpirit(_spirit_link[i].x,_spirit_link[i].y,_spirit_link[i].spirit);
_spirit_link[0].spirit=NULL;
}
return 0;
}
int game_clear_map()
{ int i,j;
for (j=0;j<LMAP_MAX_WID;j++) for (i=0;i<LMAP_MAX_LEN;i++) {
map.map[i][j]=0;
map.pic[i][j]=-1;
map.event[i][j]=-1;
map.actor[i][j]=-1;
}
map.len=MAPX(320);
map.wid=MAPY(240);
return 0;
}
int TWORLD::map_load(int index)
{ int i,j;
char fname[80];
char *back;
FILE *f;
for (j=0;j<LMAP_MAX_WID;j++) for (i=0;i<LMAP_MAX_LEN;i++) {
map.map[i][j]=0;
map.pic[i][j]=-1;
map.event[i][j]=-1;
map.actor[i][j]=-1;
}
map.x=0;
map.y=0;
map.len=MAPX(320);
map.wid=MAPY(240);
map_sx=0;
map_sy=0;
if (index<0) return -1;
game_getfname(NAME_MAP,index,fname);
if ((f=fopen(fname,"rb"))==NULL) {
sprintf(msg,"Error in reading %s",fname);
voc.regist_msg("%s",msg);
return -2;
}
fseek(f,3,SEEK_SET);
fread(&map.len,2,1,f);
fread(&map.wid,2,1,f);
fread(&map_bpic,4,1,f);
fread(&map_bscroll,4,1,f);
for (j=0;j<map.wid;j++) for (i=0;i<map.len;i++) {
fread(&map.map[i][j],1,1,f);
fread(&map.pic[i][j],2,1,f);
fread(&map.event[i][j],2,1,f);
}
for (i=0;i<3;i++) lClearSurface(&layer.layers[i],0);
layer.active(1);
for (j=0;j<map.wid;j++) for (i=0;i<map.len;i++) {
if (map.event[i][j]>=0) lputBlock(i*8,j*8,map_floor.LpcImage[map.event[i][j]]);
map.event[i][j]=-1;
}
layer.active(0);
LGAME.map=index;
LGAME.place_name[0]=0;
fread(LGAME.place_name,1,80,f);
fclose(f);
if (map_bpic>1000) map_bpic=-1;
if (map_bpic<0||map_bpic>1000) return 0;
game_getfname(NAME_BACKPIC,map_bpic,fname);
back=lrPicFile(fname,0,NULL);
if (back) {
layer.active(2);
lsetColor(0);
lbar(0,0,319,239);
lgPutImage(0,0,319,239,back);
layer.active(0);
delete back;
} else voc.regist_msg("error load background %s",fname);
return 0;
}
///////////////////////////////////////////////////////////////////////////
// EXPRESS PROCESS //
///////////////////////////////////////////////////////////////////////////
TEXPRESS::TEXPRESS()
{ text_speed=6;
picflag=0;
main_bx=106;
main_by=14;
}
TEXPRESS::~TEXPRESS()
{ syspic_free();
}
int TEXPRESS::syspic_load()
{ short i,j,len,wid,k;
char name[80];
FILE *f;
if (picflag) return 0;
game_getfname(NAME_SYSTEM,0,name);
lLoadLpcImage(&syspic,name,0);
if (syspic.count<=0) {
voc.regist_msg("error load system pic %s",name);
return -1;
}
button=syspic.pageList[1];
goods=syspic.pageList[2];
for (i=goods;i<syspic.count;i++)
{ lgetSize(&len,&wid,syspic.LpcImage[i]);
k=syspic.LpcImage[i][4];
for (j=0;j<len*wid;j++)
if (syspic.LpcImage[i][4+j]==k) syspic.LpcImage[i][4+j]=0;
}
for (i=0;i<8;i++) {
lgetSize(&len,&wid,syspic.LpcImage[button+i]);
lsetHotXY(1+len/2,1+wid/2,syspic.LpcImage[button+i]);
}
for (i=0;i<4;i++) {
lgetSize(&len,&wid,syspic.LpcImage[13+i]);
lsetHotXY(1+len/2,1+wid/2,syspic.LpcImage[13+i]);
}
lgetSize(&len,&wid,syspic.LpcImage[17]);
lsetHotXY(len/2+1,wid-1,syspic.LpcImage[17]);
lgetSize(&len,&wid,syspic.LpcImage[18]);
lsetHotXY(len/2+1,wid-1,syspic.LpcImage[18]);
lCreateSurface(320,240,&temp,NULL,LSM_MEMORY);
for (i=0;i<90;i++) goods_dat[i].mode=-1;
game_getfname(NAME_GOODS,0,name);
if ((f=fopen(name,"r"))==NULL) {
voc.regist_msg("error opening %s",name);
return -1;
}
for (i=0;!feof(f);i++)
{ fscanf(f,"%d %s %d %d %d %d %d %s",&goods_dat[i].pic,goods_dat[i].name,
&goods_dat[i].mode,&goods_dat[i].buy,&goods_dat[i].sell,&goods_dat[i].ahp,
&goods_dat[i].dmp,goods_dat[i].inst);
}
fclose(f);
picflag=1;
return 0;
}
int TEXPRESS::syspic_free()
{ if (!picflag) return 0;
lDestroyLpc(&syspic);
lDeleteSurface(&temp);
picflag=0;
return 0;
}
int TEXPRESS::outtextxy(int x,int y,char *word,int shadow)
{ int i,j,color=c_white;
char s[3];
s[2]=0;
for (i=0,j=0;word[0]&&j<200;j++) {
s[0]=word[0]; s[1]=word[1]; s[2]=0;
if (s[0]=='\r') x=0, word++; else
if (s[0]=='\\'&&(s[1]=='n'||s[1]=='N')) x=0, y+=17, word+=2; else
if (s[0]=='\n') x=0, y+=17, word++; else
if (s[0]=='|') color=c_white, word++; else
if (s[0]=='#') color=c_yellow, word++; else
if (s[0]=='~') color=c_red, word++; else
if (s[0]=='*') color=c_dark, word++; else
if (s[0]=='$') color=c_blue, word++; else
if (s[0]<='z') {
s[1]=0;
lsetColor(c_dark); if (shadow) louttextxy(x+1,y+1,s);
lsetColor(color); louttextxy(x,y,s);
x+=8; word++; i++;
} else {
lsetColor(c_dark); if (shadow) louttextxy(x+1,y+1,s);
lsetColor(color); louttextxy(x,y,s);
x+=16; word+=2; i++;
}
}
return 0;
}
int TEXPRESS::ptext(int *win,int *step,char *word,int shadow)
{ int i,j,color=c_white;
int x=win[0],y=win[1]+8;
char s[10]="";
for (i=0,j=0;i<=*step&&word[0]&&j<200;j++) {
s[0]=word[0]; s[1]=word[1]; s[2]=0;
if (s[0]=='\r') x=win[0], word++; else
if (s[0]=='\\'&&(s[1]=='n'||s[1]=='N')) x=win[0], y+=17, word+=2; else
if (s[0]=='\n') x=win[0], y+=17, word++; else
if (s[0]=='|') color=c_white, word++; else
if (s[0]=='#') color=c_yellow, word++; else
if (s[0]=='~') color=c_red, word++; else
if (s[0]=='*') color=c_dark, word++; else
if (s[0]=='$') color=c_blue, word++; else
if (s[0]<='z') {
s[1]=0;
if (x+8>win[2]) x=win[0], y+=17;
if (i==*step) {
lsetColor(c_dark);
if (shadow) louttextxy(x+1,y+1,s);
lsetColor(color);
louttextxy(x,y,s);
}
x+=8; word++; i++;
} else {
s[2]=0;
if (x+16>win[2]) x=win[0], y+=17;
if (i==*step) {
lsetColor(c_dark);
if (shadow) louttextxy(x+1,y+1,s);
lsetColor(color);
louttextxy(x,y,s);
}
x+=16; word+=2; i++;
}
}
(*step)++;
if (j==200) {
voc.regist_msg("Error put text");
return -1;
}
return (word[0])? 1 : 0;
}
int TEXPRESS::text(int *win,char *word,int shadow,int speed)
{ int i,j,step;
int fast_speed=100;
int start=0, chg=0;
int overfollow[1024];
lsetPal(pal0);
if (speed<0) speed=text_speed;
for (i=0,j=1,step=0;i<200&&j==1;i++) {
while (lt_clock(0)-start<=1193181L/speed) {
if (!game_key(0)) chg=1;
if (chg&&game_key(0)) speed=fast_speed;
world.noop(0);
}
start=lt_clock(0);
j=ptext(win,&step,word,shadow);
}
return (i>=200)? -1 : 0;
}
int TEXPRESS::out_say(int pos,int pics,char *word)
{ static int win[10][4]={
{ 160-90,30,160+90,200 },
{ 20, 20, 300, 120 },
{ 20, 140, 300, 220 },
{ 80, 20, 300, 120 },
{ 20, 140, 240, 220 },
{ 160,0,320,240 }, { 24+10,144,296-10,232-14 },
{ -1,-1,-1,-1 }, { -1,-1,-1,-1 },
};
int *w=win[pos];
int key_flag,ok;
int i,x=24,y=130;
static char demo[102400];
if (w[0]==-1||pos>6||pos<0) w=win[6],pos=6;
lActiveSurface(NULL);
win[5][0]=160-strlen(word)*4;
win[5][1]=win[0][1]+50;
if (pos==6) {
put_box(x,y,8,3);
sprintf(demo,"*%s",word);
text(w,demo,0);
} else text(w,word,1);
for (key_flag=0,ok=0,i=0;ok==0;i++)
{ world.noop(game_delay);
if (key_flag==0&&game_key(0)==0) key_flag=1;
if (key_flag==1&&game_key(0)==1) key_flag=2;
if (key_flag==2&&game_key(0)==0) ok=1;
if (pos!=6) lputSpirit(ld_x+10,ld_y,syspic.LpcImage[13+(i/4)%4]);
}
layer.active(0);
return 0;
}
int TEXPRESS::draw_shadow()
{ short len,wid,i;
short x,y;
for (i=0;i<MAX_ACTOR;i++) if (actor[i].id>=0)
{ lgetSize(&len,&wid,syspic.LpcImage[23]);
x=WORLDX(actor[i].x)-map_sx*8;
y=WORLDY(actor[i].y)-map_sy*8-4;
layer.active(0);
draw_mix(x-len/2,y-wid+1,syspic.LpcImage[23]);
}
return 0;
}
int TEXPRESS::draw_mix(int x,int y,char *p)
{ lgPutMapImage(x,y,p,&color_map);
return 0;
}
int TEXPRESS::yes_no()
{ short i,k,ok,len,wid;
lActiveSurface(NULL);
while (game_key(0)||game_key(1));
while (lkpressed()) lkgetch(0);
for (i=0,ok=0;ok==0;)
{ lgetSize(&len,&wid,syspic.LpcImage[button+8]);
lputImage(160-len/2,120,syspic.LpcImage[button+8+i]);
while (!lkpressed()) world.noop(game_delay);
lkgetch(&k);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -