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

📄 gameio.cpp

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