⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gameio.cpp

📁 轩辕2源代码.rar
💻 CPP
📖 第 1 页 / 共 4 页
字号:
}
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 + -