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

📄 gameio.cpp

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