📄 gameio.cpp
字号:
}
int TWORLD::dialog_clear()
{ int i;
for (i=0;i<1024;i++) if (dialog[i]) delete dialog[i];
for (i=0;i<1024;i++) dialog[i]=NULL;
dialog_p=0;
return 0;
}
int TWORLD::dialog_put(char *s)
{ int len=strlen(s);
if (dialog_p>=2024) return 2023;
dialog[dialog_p]=new char[len+2];
strcpy(dialog[dialog_p],s);
dialog_p++;
return dialog_p-1;
}
char *TWORLD::dialog_get(int w)
{ if (w>=dialog_p||w<0) return NULL;
return dialog[w];
}
int TWORLD::debug_info()
{ char line[400],c[22];
int i,t=game_findactor(0);
if (t>=0) {
sprintf(line,"INDEX %d (%d,%d) ->%d,%d",t,actor[t].x,actor[t].y,actor[t].towards,actor[t].walk_pic);
} else sprintf(line,"No main actor");
layer.active(0);
lsetColor(c_yellow);
louttextxy(0,8,line);
if (lKeyOn(KEY_F10)) LGAME.MovieEnd();
if (lKeyOn(KEY_F11)) LGAME.FightStart(0);
if (lKeyOn(KEY_F12)) LGAME.MovieShip();
return 0;
}
///////////////////////////////////////////////////////////////////////////
// WORLD EVENT PROCESS //
///////////////////////////////////////////////////////////////////////////
int TWORLD::MAKE_EVENT(int i)
{ if (event!=data[2]) voc.regist_msg("Error event point");
event=data[2];
event[i]=1;
return 0;
}
int TWORLD::proc_loadmap(int map)
{ return map_load(map);
}
int TWORLD::proc_createactor(int a,int x,int y)
{ int i,j,k;
i=game_findactor(-1);
if (i==-1) {
voc.regist_msg("Space full");
return -1;
}
actor[i].reset();
j=actor[i].load_dat(a);
if (j||actor[i].id<0) {
voc.regist_msg("Load actor error %d(%s)",j,msg);
actor[i].reset();
return -1;
}
j=actor[i].do_command(ACTOR_MOVETO,x,y);
for (k=0;k<100&&j;k++) j=actor[i].do_command(ACTOR_MOVETO,x+(rand()%10)-5,y+(rand()%10)-5);
if (k==100) {
voc.regist_msg("Can not put actor to (%d,%d)-code=%d",x,y,j);
actor[i].reset();
return -2;
}
return 0;
}
int TWORLD::proc_delactor(int a)
{ int i=game_findactor(a);
if (i>=0) actor[i].do_command(ACTOR_DELETE,0,0);
else voc.regist_msg("cannot del actor %d",a);
return (i>=0)? 0 : -1;
}
int TWORLD::proc_actormove(int a,short *move,int data_len)
{ int i=game_findactor(a),j,ret,k;
if (i>=0) {
actor[i].act_mode=move[0];
for (j=0;j<data_len;j++) actor[i].move_data[j]=move[j+1];
if (actor[i].act_mode==0&&actor[i].move_data[0]==0) actor[i].walk_pic=0;
if (actor[i].act_mode==1) {
map.actor[actor[i].x][actor[i].y]=-1;
actor[i].act_speed=actor[j].act_speed;
j=game_findactor(move[1]);
if (j>=0) {
for (k=0;k<20;k++) actor[j].move_data[500+k]=0;
actor[i].do_command(ACTOR_MOVETO,actor[j].x,actor[j].y);
actor[i].x=actor[j].x; actor[i].y=actor[j].y;
}
} else
if (actor[i].act_mode==0) {
if (move[1]==0) actor[i].towards=move[2];
}
} else voc.regist_msg("(actormove)cannot find actor");
return (i>=0)? 0 : -1;
}
int TWORLD::proc_actorevent(int a,int *event_list)
{ int i=game_findactor(a);
if (i>=0) {
actor[i].event_near=event_list[0];
actor[i].event_callf=event_list[1];
actor[i].event_calln=event_list[2];
} else voc.regist_msg("(proc_actorevent)cannot find actor");
return (i>=0)? 0 : -1;
}
int TWORLD::proc_mapevent(int x1,int y1,int x2,int y2,int ev,int mode)
{ int i,j;
if (x1>x2) i=x1, x1=x2, x2=i;
if (y1>y2) i=y1, y1=y2, y2=i;
if (x1<0) x1=0; if (y1<0) y1=0;
if (x2>=map.len) x2=map.len-1;
if (y2>=map.wid) y2=map.wid-1;
for (j=y1;j<=y2;j++) for (i=x1;i<=x2;i++)
map.event[i][j]=EVENT_DATA(ev,mode);
return 0;
}
int TWORLD::proc_say(int pos,int head,int word)
{ char *p=dialog_get(word);
if (p) express.out_say(pos,head,p);
else voc.regist_msg("proc say error in get dialog %d",word);
return (p)? 0 : -1;
}
short *TWORLD::proc_get_num(short *num)
{ short *p=NULL;
data[1][990]=LGAME.money;
if (num[0]==0&&num[1]==1&&num[2]>=900&&num[2]<970) {
if (LGAME.goods_find(num[2]-900)>=0) data[1][num[2]]=1;
else data[1][num[2]]=0;
}
data[1][980]=LGAME.money;
switch (num[0])
{ case 0: if (num[1]<3&&num[2]<1000&&num[1]>=0&&num[2]>=0) p=&data[num[1]][num[2]];
break;
case 1: p=&num[1]; break;
}
return p;
}
int TWORLD::proc_if(short *judge)
{ int date,ret;
short *p[2];
p[0]=proc_get_num(&judge[0]);
p[1]=proc_get_num(&judge[4]);
if (p[0]==NULL||p[1]==NULL) {
voc.regist_msg("Error point from(proc_if)");
return -1;
}
date=(*p[0])-(*p[1]);
ret=0;
switch (judge[3])
{ case 0: if (date==0) ret=1; break;
case 1: if (date>0) ret=1; break;
case 2: if (date<0) ret=1; break;
case 3: if (date>=0) ret=1; break;
case 4: if (date<=0) ret=1; break;
}
return ret;
}
int TWORLD::proc_set(short *judge)
{ short *d[2];
int p1,p2;
int error=0;
d[0]=proc_get_num(&judge[0]);
d[1]=proc_get_num(&judge[3]);
if (d[0]==NULL||d[1]==NULL) voc.regist_msg("(SET)point error 1");
switch (judge[6])
{ case '=': (*d[0])=(*d[1]); break;
case '+': (*d[0])+=(*d[1]); break;
case '-': (*d[0])-=(*d[1]); break;
case '*': (*d[0])*=(*d[1]); break;
case '/': if ((*d[1])!=0) {
(*d[0])/=(*d[1]);
} else voc.regist_msg("Error calculator %d/%d",*d[0],*d[1]);
break;
default: voc.regist_msg("Error calculator command %c",judge[6]);
break;
}
return error;
}
///////////////////////////////////////////////////////
int TWORLD::RESET()
{ int i;
for (i=0;i<1000;i++) {
data[0][i]=0;
data[1][i]=0;
data[2][i]=0;
}
for (i=0;i<1024;i++) if (dialog[i]) delete dialog[i];
for (i=0;i<1024;i++) dialog[i]=NULL;
for (i=0;i<0x10000;i++) chapter[i]=0;
ip=0;
dialog_p=0;
smooth=-1;
CHAPTER_DELAY=0;
dialog_clear();
return 0;
}
int TWORLD::main_loop()
{ int i;
looping=1;
time_pass=0;
for (i=0;i<1000;i++) event[i]=0;
memset(pal,0,256*3);
lsetPal(pal);
while (looping==1)
{ noop(time_delay);
call_actor(); // call actors
view_world(1,1,-1);
i=CHAPTER(); if (i) looping=100;
i=LGAME.GameControl(); if (i) looping=101;
if (game_debug) debug_info();
view_world(-1,-1,1);
if (smooth<2) smooth++;
else if (smooth==2) {
express.scr_smooth(1);
lsetPal(pal0);
smooth=3;
}
}
express.scr_smooth(0);
return looping;
}
///////////////////////////////////////////////////////////////////////////
/* START GAME */
int TWORLD::START_GAME(int load)
{ int r,new_load=1;
LGAME.DataReset();
main_loop:
if (load>=0&&new_load) if (LOAD_GAME(load)) {
sprintf(msg,"error load data");
voc.regist_msg("%s",msg);
return -1;
}
if (load<0) {
if (NEW_CHAPTER(LGAME.chapter,0)) {
voc.regist_msg("%s",msg);
sprintf(msg,"error load chapter");
return -2;
}
}
new_load=0;
r=main_loop();
if (r>=0) goto exit_place;
if (r<0) load=(r*(-1))-1;
goto main_loop;
exit_place:
if (r>=100) return r;
if (r==2) LGAME.MovieGameOver();
return 0;
}
int TWORLD::SAVE_GAME(int save)
{ int i,j,len;
int maxlevel;
char fname[80],*p;
FILE *f;
game_getfname(NAME_SAVE,save,fname);
if ((f=fopen(fname,"wb"))==NULL) voc.regist_msg("error open save file");
for (i=0,maxlevel=-1;i<6;i++)
if (LGAME.ac[i].level>maxlevel) maxlevel=LGAME.ac[i].level;
fwrite(&LGAME.money,4,1,f);
fwrite(&LGAME.chapter,4,1,f);
fwrite(&maxlevel,4,1,f);
fwrite(LGAME.place_name,1,80,f);
fwrite(LGAME.goods,4,MAX_GOODS,f);
fwrite(LGAME.ac,sizeof(LGAME.ac[0]),6,f);
fwrite(&voc.music,sizeof(voc.music),1,f);
fwrite(&LGAME.map,sizeof(LGAME.map),1,f);
for (i=0;i<MAX_ACTOR;i++) {
fwrite(&actor[i].id,4,1,f);
fwrite(&actor[i].command,4,1,f);
fwrite(&actor[i].x,4,1,f);
fwrite(&actor[i].y,4,1,f);
fwrite(&actor[i].towards,4,1,f);
fwrite(&actor[i].act_mode,4,1,f);
fwrite(&actor[i].act_speed,4,1,f);
fwrite(actor[i].move_data,2,1000,f);
fwrite(&actor[i].event_near,4,1,f);
fwrite(&actor[i].event_callf,4,1,f);
fwrite(&actor[i].event_calln,4,1,f);
}
fwrite(data,2,3*1000,f);
fwrite(chapter,2,65536,f);
fwrite(&ip,4,1,f);
fwrite(&map_sx,4,1,f);
fwrite(&map_sy,4,1,f);
for (j=0;j<map.wid;j++) for (i=0;i<map.len;i++) {
fwrite(&map.map[i][j],1,1,f);
fwrite(&map.pic[i][j],2,1,f);
fwrite(&map.event[i][j],2,1,f);
fwrite(&map.actor[i][j],2,1,f);
}
fwrite(&dialog_p,4,1,f);
for (i=0;i<dialog_p;i++) {
p=dialog_get(i);
if (p) {
len=strlen(p)+1;
fwrite(&len,4,1,f);
fwrite(p,1,len,f);
}
}
fclose(f);
return 0;
}
int TWORLD::LOAD_GAME(int load)
{ int i,j,len;
int maxlevel;
int dialog_num=0;
char fname[80];
static char d_msg[2048];
FILE *f;
game_getfname(NAME_SAVE,load,fname);
if ((f=fopen(fname,"rb"))==NULL) {
voc.regist_msg("error opening save file");
return -1;
}
express.scr_smooth(0);
LGAME.DataReset();
fread(&LGAME.money,4,1,f);
fread(&LGAME.chapter,4,1,f);
fread(&maxlevel,4,1,f);
fread(LGAME.place_name,1,80,f);
fread(&LGAME.goods,4,MAX_GOODS,f);
fread(LGAME.ac,sizeof(LGAME.ac[0]),6,f);
fread(&voc.music,4,1,f);
voc.playmidi(voc.music,1);
fread(&LGAME.map,4,1,f);
if (map_load(LGAME.map)) {
voc.regist_msg("load error in map");
fclose(f);
return -2;
}
for (i=0;i<MAX_ACTOR;i++) {
fread(&actor[i].id,4,1,f);
actor[i].load_dat(actor[i].id);
fread(&actor[i].command,4,1,f);
fread(&actor[i].x,4,1,f);
fread(&actor[i].y,4,1,f);
fread(&actor[i].towards,4,1,f);
fread(&actor[i].act_mode,4,1,f);
fread(&actor[i].act_speed,4,1,f);
fread(actor[i].move_data,2,1000,f);
fread(&actor[i].event_near,4,1,f);
fread(&actor[i].event_callf,4,1,f);
fread(&actor[i].event_calln,4,1,f);
}
fread(data,2,3*1000,f);
fread(chapter,2,65536,f);
fread(&ip,4,1,f);
fread(&map_sx,4,1,f);
fread(&map_sy,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);
fread(&map.actor[i][j],2,1,f);
}
fread(&dialog_num,4,1,f);
for (i=0;i<dialog_num;i++)
{ d_msg[0]=0;
fread(&len,4,1,f);
fread(d_msg,1,len,f);
dialog_put(d_msg);
}
fclose(f);
looping=(load+1)*(-1);
CHAPTER_DELAY=0;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -