📄 gameio.cpp
字号:
switch (k)
{ case KEY_LEFT: i=0; break;
case KEY_RIGHT: i=1; break;
case KEY_ESC: case KEY_ALT: ok=-1; break;
case KEY_ENTER: case KEY_SPACE: case KEY_CTRL: ok=1; break;
}
}
layer.active(0);
while (game_key(0)||game_key(1)) world.noop(0);
while (lkpressed()) lkgetch(0);
if (ok==-1||i==1) return 0;
return 1;
}
int TEXPRESS::scr_save()
{ lBlitFast(&temp,0,0,0,0,319,239,&layer.layers[0],0);
return 0;
}
int TEXPRESS::scr_restore()
{ lBlitFast(&layer.layers[0],0,0,0,0,319,239,&temp,0);
return 0;
}
int TEXPRESS::scr_smooth(int mode)
{ int i,j,inc;
memcpy(pal,pal0,256*3);
if (mode==0) i=0,inc=-1;
else i=-63,inc=1;
for (j=0;j<63;j++)
{ laddPal(i,pal0,pal);
lsetPal(pal);
world.noop(game_delay/4);
i+=inc;
}
if (mode==1) lsetPal(pal0);
return 0;
}
///////////////////////////////////////////////////////////////////////////
// TACTOR MOVEMENTS PROCESS //
///////////////////////////////////////////////////////////////////////////
int TACTOR::call_actors(int search_len,int far_case)
{ int nx, ny, done, i, j, k, m;
int search_x,search_y;
static int search_dat[40][6]={
{ 0,0, -1,0, 1,0 },
{ 0,0, -1,0, 1,0 },
{ 0,0, 0,-1, 0,1 },
{ 0,0, 0,-1, 0,1 }
};
for (i=0,search_x=x,search_y=y,done=0;i<search_len&&done==0;i++)
{ search_x+=incx[towards];
search_y+=incy[towards];
for (m=0;m<3;m++) {
nx=search_x+search_dat[towards][m*2];
ny=search_y+search_dat[towards][m*2+1];
if (nx>=0&&ny>=0&&nx<map.len&&ny<map.wid)
if (map.actor[nx][ny]>=0)
{ k=game_findactor(map.actor[nx][ny]);
if (k>=0) {
if (far_case&&actor[k].event_callf>=0) {
world.MAKE_EVENT(actor[k].event_callf);
done=1;
}
if (far_case==0&&actor[k].event_calln>=0) {
world.MAKE_EVENT(actor[k].event_calln);
}
} else voc.regist_msg("Error find actor from call");
}
}
}
return (done)? 0 : -1;
}
int TACTOR::wait_for_cmd()
{ int auto_mode,nx,ny,t;
int auto_speed=5;
int i,j,k,follow,disp;
short call=0;
short search_len=5;
static int key_free=0;
static int walk_dec=0;
static int walk_step=0;
switch (act_mode)
{ case 0: auto_mode=move_data[0];
switch (auto_mode)
{ case 0: towards=move_data[1];
break;
case 2: towards=move_data[1];
if (move_data[2]>0) {
do_command(ACTOR_WALKING,act_speed,0);
move_data[2]--;
break;
}
world.MAKE_EVENT(move_data[3]);
move_data[0]=0;
break;
case 1: if (rand()%auto_speed) break;
t=rand()%4; towards=t;
nx=x+incx[t]; ny=y+incy[t];
if (nx<move_data[1]||ny<move_data[2]||
nx>move_data[3]||ny>move_data[4]) break;
do_command(ACTOR_WALKING,act_speed,0);
break;
}
break;
case 1: follow=game_findactor(move_data[0]);
if (follow<0) {
act_mode=0; move_data[0]=0; move_data[1]=0;
break;
} act_speed=actor[follow].act_speed;
if (move_data[2]==actor[follow].move_data[500]) break;
move_data[2]=actor[follow].move_data[500];
i=move_data[1]; i=actor[follow].move_data[501+i];
if (i<=0) break;
towards=i-1;
do_command(ACTOR_WALKING,act_speed,0);
break;
case 2: if (lKeyOn(KEY_UP)) { towards=NORTH; walk_dec=2; do_command(ACTOR_WALKING,act_speed,0); }
else if (lKeyOn(KEY_DOWN)) { towards=SOUTH; walk_dec=2; do_command(ACTOR_WALKING,act_speed,0); }
else if (lKeyOn(KEY_LEFT)) { towards=WEST; walk_dec=2; do_command(ACTOR_WALKING,act_speed,0); }
else if (lKeyOn(KEY_RIGHT)) { towards=EAST; walk_dec=2; do_command(ACTOR_WALKING,act_speed,0); }
if (walk_dec==2) if (world.data[1][700]>0) {
if (++walk_step>=world.data[1][699]) {
walk_step=0;
LGAME.FightStart(-1);
}
}
if (--walk_dec<=0) {
walk_dec=0;
if (walk_pic==1) walk_pic=2;
if (walk_pic==3) walk_pic=0;
}
if (lKeyOn(KEY_SPACE)==0&&lKeyOn(KEY_CTRL)==0&&lKeyOn(KEY_ESC)==0
&&lKeyOn(KEY_ENTER)==0&&lKeyOn(KEY_ALT)==0) key_free=1;
if ( key_free=1 && (lKeyOn(KEY_CTRL)||lKeyOn(KEY_SPACE)) ) call=1;
nx=x+incx[towards]; ny=y+incy[towards];
if (call==1) {
nx=x+incx[towards]; ny=y+incy[towards]; // check map
if (map.event[x][y]>=0&&EVENT_MODE(map.event[x][y]))
world.MAKE_EVENT(EVENT_NO(map.event[x][y]));
if (nx>=0&&ny>=0&&nx<map.len&&ny<map.wid) {
if (map.event[nx][ny]>=0&&EVENT_MODE(map.event[nx][ny]))
world.MAKE_EVENT(EVENT_NO(map.event[nx][ny]));
}
call_actors(2,0);
call_actors(search_len,1);
}
for (j=-search_len+y;j<=search_len+y;j++) // find nearby actors
for (i=-search_len+x;i<=search_len+x;i++)
if (i>=0&&j>=0&&i<map.len&&j<map.wid)
if ((i!=x||j!=y)&&map.actor[i][j]>=0) {
k=game_findactor(map.actor[i][j]);
if (k>=0) {
if (actor[k].event_near>=0) world.MAKE_EVENT(actor[k].event_near);
} else voc.regist_msg("(wait_for_cmd)find actor error");
}
break;
}
return 0;
}
int TACTOR::ACTIVING()
{ short pic=towards*3,nx,ny;
static char pic_off[4]={ 0, 1, 0, 2 };
if (towards<0||towards>3) towards=0;
if (id<0) return -1;
view_spirit(WORLDX(x),WORLDY(y)-2,express.syspic.LpcImage[23],-100);
switch (command)
{ case ACTOR_WAITING:
status=0;
if (act_mode!=1) map.actor[x][y]=id;
wx=WORLDX(x); wy=WORLDY(y);
view_spirit(wx,wy,pics[towards*3+pic_off[walk_pic]],wy);
if (map.event[x][y]>=0&&EVENT_MODE(map.event[x][y])==0&&act_mode==2)
world.MAKE_EVENT(EVENT_NO(map.event[x][y]));
if (move_delay>0) move_delay--;
else wait_for_cmd();
break;
case ACTOR_DOING:
command=ACTOR_WAITING;
break;
default: command=ACTOR_WAITING; break;
}
return 0;
}
int TACTOR::do_command(int cmd,int c1,int c2)
{ short result=0,nx,ny,i;
int up=10, down=20, left=15, right=25;
switch (cmd)
{ case ACTOR_WAITING: wx=WORLDX(x); wy=WORLDY(y);
if (act_mode!=1) map.actor[x][y]=id;
command=ACTOR_WAITING;
walk_pic=0;
break;
case ACTOR_WALKING: nx=x+incx[towards];
ny=y+incy[towards];
result=-1;
if (nx<0||ny<0||nx>=map.len||ny>=map.wid) break;
if ((map.actor[nx][ny]<0||act_mode==1)&&map.map[nx][ny]==0)
{ if (++walk_pic>=4||walk_pic<0) walk_pic=0;
if (act_mode!=1) {
map.actor[nx][ny]=id;
map.actor[x][y]=-1;
}
x=nx;
y=ny;
move_delay=c1;
command=ACTOR_WAITING;
result=0;
if (++move_data[500]>100) move_data[500]=0;
for (i=510;i>501;i--) move_data[i]=move_data[i-1];
move_data[501]=towards+1;
if (act_mode==2) {
if (y-map_sy<up) map_sy=y-up;
if (y-map_sy>down) map_sy=y-down;
if (x-map_sx<left) map_sx=x-left;
if (x-map_sx>right) map_sx=x-right;
if (map_sx<0) map_sx=0;
if (map_sy<0) map_sy=0;
if (map_sx>=map.len-320/8) map_sx=map.len-320/8;
if (map_sy>=map.wid-240/8) map_sy=map.wid-240/8;
}
}
break;
case ACTOR_MOVETO: result=-1;
if (c1<0||c2<0||c1>=map.len||c2>=map.wid) break;
if ((map.actor[c1][c2]<0||act_mode==1)&&map.map[c1][c2]==0)
{ if (act_mode!=1) {
map.actor[x][y]=-1;
map.actor[c1][c2]=id;
}
x=c1; y=c2; wx=WORLDX(x); wy=WORLDY(y);
command=ACTOR_WAITING;
walk_pic=0;
result=0;
} else result=-2;
break;
case ACTOR_DELETE: id=-1;
if (act_mode!=1) map.actor[x][y]=-1;
reset();
break;
}
return result;
}
///////////////////////////////////////////////////////////////////////////
// WORLD MOVEMENTS PROCESS //
///////////////////////////////////////////////////////////////////////////
TWORLD::TWORLD()
{ int rate=30,i;
time_delay=1193181L/rate;
map_floor.count=0;
map_pic.count=0;
map_floor.pageCount=1;
map_floor.pageList=new short[1];
map_floor.pageList[0]=0;
map_floor.pal=new RGB[256];
map_floor.LpcImage=new char *[400];
event=data[2];
for (i=0;i<1024;i++) dialog[i]=NULL;
RESET();
}
int TWORLD::map_loadpic()
{ static int flag[2]={ 0,0 };
char *img=NULL;
short len,wid,column,line;
int i,j,k;
char name[80];
LSURFACE temp;
if (flag[0]==1&&flag[1]==1) return 0;
if (flag[0]==0)
{ map_floor.count=0;
game_getfname(NAME_FLOOR,0,name);
img=lrPicFile(name,0,NULL);
if (!img) return -1;
lgetSize(&len,&wid,img);
if (!lCreateSurface(len,wid,&temp,NULL,LSM_MEMORY)) return -1;
column=len/16; line=wid/16;
lActiveSurface(&temp);
lputBlock(0,0,img);
for (j=0,k=0;j<line;j++)
for (i=0;i<column;i++,k++) {
if (k<400) map_floor.LpcImage[k]=new char[264];
if (k<400&&map_floor.LpcImage[k])
lgetBlock(i*16,j*16,i*16+15,j*16+15,map_floor.LpcImage[k]);
}
delete img;
lActiveSurface(NULL);
lDeleteSurface(&temp);
j=0; for (i=0;i<k;i++) if (map_floor.LpcImage[i]==NULL) j=-2;
if (j==0) {
flag[0]=1;
map_floor.count=line*column;
} else return -2;
}
if (flag[1]==0)
{ game_getfname(NAME_MAPPIC,0,name);
lLoadLpcImage(&map_pic,name,0);
if (map_pic.count>0) {
for (i=0;i<map_pic.count;i++) {
lgetSize(&len,&wid,map_pic.LpcImage[i]);
lsetHotXY(len/2,wid-1,map_pic.LpcImage[i]);
}
flag[1]=1;
} else voc.regist_msg("Error load map pic from %s",name);
}
if (flag[0]==1&&flag[1]==1) return 0;
return -2;
}
TWORLD::~TWORLD()
{ lDestroyLpc(&map_floor);
lDestroyLpc(&map_pic);
}
int TWORLD::view_world(int dbf,int link,int scr)
{ int i,j,k;
int up=8, down=30, left=15, right=15;
int column=320/8, line=240/8;
int x,y;
if (dbf>0) {
game_blit(1,-1);
layer.datas[1].x=map.x*8;
layer.datas[1].y=map.y*8;
layer.datas[2].x=map.x*4;
layer.datas[2].y=map.y*4;
if (map_bscroll==0)
layer.datas[2].x=layer.datas[2].y=0;
game_blit(1,-1);
}
if (link>0) {
for (j=map.y-up;j<map.y+line+down;j++)
for (i=map.x-left;i<map.x+column+right;i++)
{ if (i>=0&&j>=0&&i<map.len&&j<map.wid) k=map.pic[i][j];
else k=-1;
if (k>=0&&k<map_pic.count) view_spirit(i*8+8/2,j*8,map_pic.LpcImage[k],j*8);
}
layer.active(0);
view_link(1,1,1);
map.x=map_sx;
map.y=map_sy;
}
if (scr>0) game_blit(-1,1);
return 0;
}
int TWORLD::call_actor()
{ int i;
for (i=0;i<MAX_ACTOR;i++) if (actor[i].id>=0) actor[i].ACTIVING();
return 0;
}
int TWORLD::noop(int delay)
{ static int time=0;
static int colort=0,colord=1193181/20;
static int colorp=0,inc=2;
voc.update();
while (lt_clock(0)-time<delay)
{ while (lt_clock(0)-colort>=colord)
{ if (lt_clock(0)-colort>colord*10) colort=lt_clock(0);
else colort+=colord;
if (color_change) lsetPal(255,colorp,colorp,0);
colorp+=inc;
if (colorp>63) colorp=63,inc*=(-1);
if (colorp<22) colorp=22,inc*=(-1);
}
voc.update();
}
time=lt_clock(0);
return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -