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

📄 npc_scheduleman.c

📁 石器时代3.0源代码 2008.08.27最新版 完全可编译开服!
💻 C
📖 第 1 页 / 共 2 页
字号:
            NPC_SavePKSchedule(meindex);          }        }      }    }    break;  }}void NPC_SchedulemanLoop(int meindex){//  int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;/*  print("Scheduleman: fmpks_pos=%d dueltime=%d host=%s guest=%s\n",       fmpks_pos, fmpks[fmpks_pos].dueltime, fmpks[fmpks_pos].host_name, fmpks[fmpks_pos].guest_name);*/  NPC_RemoveExpiredBattle(meindex);  NPC_ProcessTimeout(meindex);}// 移除过期的战斗void NPC_RemoveExpiredBattle(int meindex){  struct tm tm1;  int keeptime;  int i,expired=-1;  int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;  int prevckt = CHAR_getWorkInt(meindex, NPC_WORK_PREVIOUSCHECKTIME);  int fin = CHAR_getWorkInt(meindex, NPC_WORK_FIGHTINTERVAL);  int h,d;  // 以目前的时刻当标准去移除过期的排程  memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1));  if (tm1.tm_min<fin)    keeptime = (tm1.tm_hour-1)*100 + 60 - (fin - tm1.tm_min);  else    keeptime = tm1.tm_hour*100 + tm1.tm_min - fin;  CHAR_setWorkInt(meindex, NPC_WORK_PREVIOUSCHECKTIME, keeptime);  if (keeptime<prevckt) keeptime+=10000;	// 隔日  // 计算哪些是过期的  i=0;  while ((i<MAX_SCHEDULE) && (fmpks[fmpks_pos+i].dueltime<=keeptime)) {    expired=i;    i++;  }    // 如果第一项排程与目前时间差异太大, 则整个排程全部无效  if (expired==-1) {    for (i=0; i<3; i++) {	  // tolerance 是 3 个 fight interval      keeptime += fin;      if ((keeptime % 100)>=60) keeptime = keeptime + 100 - 60;    }    if (fmpks[fmpks_pos].dueltime > keeptime) expired=23;  }  if (expired>=0) {    // 移动後面的排程来取代已经失效的排程    for (i=expired+1; i<MAX_SCHEDULE; i++) {      memcpy(&fmpks[fmpks_pos+i-expired-1],             &fmpks[fmpks_pos+i],sizeof(FamilyPKSchedule));    }    // 将後面的排程设成未排程    for (i=MAX_SCHEDULE-expired-1; i<MAX_SCHEDULE; i++) {      memset(&fmpks[fmpks_pos+i], 0, sizeof(FamilyPKSchedule));      fmpks[fmpks_pos+i].flag=-1;// Terry add 2004/06/10 要把host_index 和 guest_index 设定为 -1			fmpks[fmpks_pos+i].host_index = -1;			fmpks[fmpks_pos+i].guest_index = -1;// end    }    // 重新定义时刻    if (expired==23)      fmpks[fmpks_pos].dueltime = tm1.tm_hour*100 + ((int)(tm1.tm_min/fin))*fin;    h=(fmpks[fmpks_pos].dueltime%10000);    d=0;    for (i=1; i<MAX_SCHEDULE; i++) {      h=h+fin;      if ( (h%100) >=60 ) h=h+100-60;      if (h>=2400) {        h = h-2400;        d = 10000;      }      fmpks[fmpks_pos+i].dueltime=d+h;    }        // 检查第一项排程, 如果不在排定的状况下则设为『无排程』    if (fmpks[fmpks_pos].flag < FMPKS_FLAG_SCHEDULED) {      fmpks[fmpks_pos].flag = FMPKS_FLAG_NONE;      fmpks[fmpks_pos+i].host_index=-1;      strcpy(fmpks[fmpks_pos+i].host_name,"");      fmpks[fmpks_pos+i].guest_index=-1;      strcpy(fmpks[fmpks_pos+i].guest_name,"");    }      }}// 处理 timeoutvoid NPC_ProcessTimeout(int meindex){  int i;  int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;  for (i=0; i<MAX_SCHEDULE; i++) {    if (fmpks[fmpks_pos+i].flag==FMPKS_FLAG_CHALLENGE) {      if (fmpks[fmpks_pos+i].challenge_timeout>=0) {        fmpks[fmpks_pos+i].challenge_timeout--;        if (fmpks[fmpks_pos+i].challenge_timeout<0) {	  fmpks[fmpks_pos+i].host_index = -1;	  strcpy(fmpks[fmpks_pos+i].host_name, "-1");	  fmpks[fmpks_pos+i].guest_index = -1;	  strcpy(fmpks[fmpks_pos+i].guest_name, "-1");	  fmpks[fmpks_pos+i].prepare_time = -1;	  fmpks[fmpks_pos+i].max_player = -1;          fmpks[fmpks_pos+i].flag=-1;          fmpks[fmpks_pos+i].win=-1;        }      }    }    if (fmpks[fmpks_pos+i].flag==FMPKS_FLAG_SETTING) {      if (fmpks[fmpks_pos+i].setting_timeout>=0) {        fmpks[fmpks_pos+i].setting_timeout--;        if (fmpks[fmpks_pos+i].setting_timeout<0) {	  fmpks[fmpks_pos+i].host_index = -1;	  strcpy(fmpks[fmpks_pos+i].host_name, "-1");	  fmpks[fmpks_pos+i].guest_index = -1;	  strcpy(fmpks[fmpks_pos+i].guest_name, "-1");	  fmpks[fmpks_pos+i].prepare_time = -1;	  fmpks[fmpks_pos+i].max_player = -1;          fmpks[fmpks_pos+i].flag=-1;          fmpks[fmpks_pos+i].win=-1;        }      }    }  }}// 检查, 一个家族只能安排一场战斗BOOL NPC_AlreadyScheduled(int meindex, int talkerindex){  int i;  int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;  int tkfmindex = CHAR_getWorkInt(talkerindex, CHAR_WORKFMINDEXI);  int flag=1;  for (i=0; i<MAX_SCHEDULE; i++) {    if (fmpks[fmpks_pos+i].flag>=FMPKS_FLAG_SCHEDULED) {      if (fmpks[fmpks_pos+i].host_index==tkfmindex) return TRUE;    } else if (fmpks[fmpks_pos+i].flag!=FMPKS_FLAG_NONE) {      if (flag==1) flag=0; else return TRUE;    }  }  return FALSE;}// 读取 schedule 档案void NPC_LoadPKSchedule(int meindex){  char filename[256],tmp[4096],token[256];  FILE *f;  int i;  int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;  snprintf(filename,sizeof(filename), "%s%d_%d_%d",           SCHEDULEFILEDIR, CHAR_getInt(meindex, CHAR_FLOOR),           CHAR_getInt(meindex, CHAR_X),           CHAR_getInt(meindex, CHAR_Y) );  if( ! (f=fopen( filename, "r" )) ){	// create new schedule file    f = fopen( filename, "w" );    if( !f ){      print( "ERROR:Can't create Schedule file %s!\n",filename );      return;    }    for (i=0; i<MAX_SCHEDULE; i++){      sprintf(tmp,"%d|-1|-1|-1|-1|-1|-1|-1\n",i);      fwrite( tmp, strlen(tmp), 1, f);    }  }  fseek(f, 0, SEEK_SET);	// 档案开头  for( i = 0; i < MAX_SCHEDULE; i++ ){    fgets(tmp, sizeof(tmp), f);    fmpks[fmpks_pos+i].flag=-1;    // 时间    if (getStringFromIndexWithDelim(tmp,"|",1,token,sizeof(token))) {      fmpks[fmpks_pos+i].dueltime=atoi(token);    } else continue;    // 主队 familyindex    if (getStringFromIndexWithDelim(tmp,"|",2,token,sizeof(token))) {      fmpks[fmpks_pos+i].host_index=atoi(token);    } else continue;    // 主队 家族名    if (getStringFromIndexWithDelim(tmp,"|",3,token,sizeof(token))) {      strcpy(fmpks[fmpks_pos+i].host_name,makeStringFromEscaped(token));    } else continue;    // 客队 familyindex    if (getStringFromIndexWithDelim(tmp,"|",4,token,sizeof(token))) {      fmpks[fmpks_pos+i].guest_index=atoi(token);    } else continue;    // 客队 家族名    if (getStringFromIndexWithDelim(tmp,"|",5,token,sizeof(token))) {      strcpy(fmpks[fmpks_pos+i].guest_name,makeStringFromEscaped(token));    } else continue;    // 准备时间    if (getStringFromIndexWithDelim(tmp,"|",6,token,sizeof(token))) {      fmpks[fmpks_pos+i].prepare_time=atoi(token);    } else continue;    // 最大人数    if (getStringFromIndexWithDelim(tmp,"|",7,token,sizeof(token))) {		//andy_reEdit 2003/06/17		int maxnum = atoi(token);		if( maxnum < 50 ) maxnum = 50;		fmpks[fmpks_pos+i].max_player = maxnum;    } else continue;    // 旗标    if (getStringFromIndexWithDelim(tmp,"|",8,token,sizeof(token))) {      fmpks[fmpks_pos+i].flag=atoi(token);    } else continue;    // 胜利条件    if (getStringFromIndexWithDelim(tmp,"|",9,token,sizeof(token))) {      fmpks[fmpks_pos+i].win=atoi(token);    } else continue;  }  fclose(f);  // 第 0 笔预约不算  fmpks[fmpks_pos].host_index=-1;  strcpy(fmpks[fmpks_pos].host_name,"");  fmpks[fmpks_pos].guest_index=-1;  strcpy(fmpks[fmpks_pos].guest_name,"");  fmpks[fmpks_pos].prepare_time=-1;  fmpks[fmpks_pos].max_player=-1;  fmpks[fmpks_pos].flag=-1;  fmpks[fmpks_pos].win=-1;    NPC_RemoveExpiredBattle(meindex);}void NPC_SavePKSchedule(int meindex){  char filename[256],tmp[4096],n1[256],n2[256];  FILE *f;  int i;  int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;  snprintf(filename,sizeof(filename), "%s%d_%d_%d",           SCHEDULEFILEDIR, CHAR_getInt(meindex, CHAR_FLOOR),           CHAR_getInt(meindex, CHAR_X),           CHAR_getInt(meindex, CHAR_Y) );             f=fopen(filename, "w");	// create new  for( i = 0; i < MAX_SCHEDULE; i++ ){    makeEscapeString(fmpks[fmpks_pos+i].host_name,n1,sizeof(n1));    makeEscapeString(fmpks[fmpks_pos+i].guest_name,n2,sizeof(n2));/*      print("SavePK:%s %s %s %s\n",fmpks[fmpks_pos+i].host_name,n1,                                 fmpks[fmpks_pos+i].guest_name,n2);*/    sprintf(tmp, "%d|%d|%s|%d|%s|%d|%d|%d|%d\n",    	fmpks[fmpks_pos+i].dueltime,    	fmpks[fmpks_pos+i].host_index,    	n1,    	fmpks[fmpks_pos+i].guest_index,    	n2,    	fmpks[fmpks_pos+i].prepare_time,    	fmpks[fmpks_pos+i].max_player,    	fmpks[fmpks_pos+i].flag,    	fmpks[fmpks_pos+i].win);      fwrite(tmp, strlen(tmp), 1, f);  }  fclose(f);}// 产生 WN_PKSCHEDULELIST 的 datavoid NPC_LIST_gendata(int meindex, int talkerindex, int page, char *buf, int size){  char tmp[4096], n1[256], n2[256];  int i,flag;  int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;  int tkfmindex = CHAR_getWorkInt(talkerindex, CHAR_WORKFMINDEXI);  int tkfmleader = CHAR_getInt(talkerindex, CHAR_FMLEADERFLAG);  struct tm tm1;  memset(buf, 0, size);		// clear buffer  if ((page<0)||(page>=MAX_SCHEDULE)) return;  // 记录目前的时间  memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1));  sprintf(buf, "%d|", tm1.tm_hour*100 + tm1.tm_min);    for (i=page; i<MAX_SCHEDULE && i<page+4; i++) {    if (i!=page) strcat(buf, "|");    makeEscapeString(fmpks[fmpks_pos+i].host_name,n1,sizeof(n1));    makeEscapeString(fmpks[fmpks_pos+i].guest_name,n2,sizeof(n2));    flag=-1;    switch (fmpks[fmpks_pos+i].flag) {    case FMPKS_FLAG_CHALLENGE:      if (tkfmindex==fmpks[fmpks_pos+i].host_index) {#ifdef _FMVER21              if (tkfmleader==FMMEMBER_LEADER) flag=FLAG_MODIFY; else flag=FLAG_CONFIRM;#else        if (tkfmleader==1) flag=FLAG_MODIFY; else flag=FLAG_CONFIRM;#endif              } else if (tkfmindex==fmpks[fmpks_pos+i].guest_index) {#ifdef _FMVER21              if (tkfmleader==FMMEMBER_LEADER) flag=FLAG_ACCEPT; else flag=FLAG_CONFIRM;#else        if (tkfmleader==1) flag=FLAG_ACCEPT; else flag=FLAG_CONFIRM;#endif              } else flag=FLAG_CONFIRM;      break;    case FMPKS_FLAG_SETTING:      flag=FLAG_SETTING;      break;    case FMPKS_FLAG_CONFIRMING:      flag=FLAG_CONFIRM;      break;    case FMPKS_FLAG_SCHEDULED:    case FMPKS_FLAG_DUEL:    case FMPKS_FLAG_HOSTWIN:    case FMPKS_FLAG_GUESTWIN:      flag=FLAG_SCHEDULED;      break;    }    sprintf(tmp, "%d|%s|%s|%d|%d|%d|%d",    	fmpks[fmpks_pos+i].dueltime,    	n1,    	n2,    	fmpks[fmpks_pos+i].prepare_time,    	fmpks[fmpks_pos+i].max_player,    	flag,    	fmpks[fmpks_pos+i].win);    if (strlen(buf)+strlen(tmp)<size) {      strcat(buf, tmp);    } else {      return;    }  }}// 产生 WN_PKSCHEDULESELECTFAMILY 的 datavoid NPC_SELECT_gendata(int meindex, int talkerindex, int page, char *buf, int size){  int i,j,cnt=0;  char token[4096];  char fmindex[256];  char fmname[256];  int tkfmindex = CHAR_getWorkInt(talkerindex, CHAR_WORKFMINDEXI);    memset(buf, 0, size);		// clear buffer  strcpy(buf,"0");  for (i=0,j=0; i<MAXFAMILYINONEWINDOW; i++,j++) {    if (getStringFromIndexWithDelim(familyListBuf,"|",page+j,token,sizeof(token))) {      if ( (getStringFromIndexWithDelim(token," ",1,fmindex,sizeof(fmindex))) &&           (getStringFromIndexWithDelim(token," ",2,fmname,sizeof(fmname))) ) {        if (tkfmindex!=atoi(fmindex)-1) {          sprintf(token,"|%d|%s",(atoi(fmindex)-1),fmname);          if (strlen(buf)+strlen(token)<size) {            strcat(buf, token);            cnt++;            buf[0]=cnt+'0';          } else return;        } else i=i-1;      }    }  }}// 产生 WN_PKSCHEDULEDETAIL 的 datavoid NPC_DETAIL_gendata(int meindex, char *buf, int size, int dueltime){  char n1[256], n2[256];  int i=0;  int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;  //  print("DETAIL: dueltime=%d\n",dueltime);    while ((i<MAX_SCHEDULE)&&(fmpks[fmpks_pos+i].dueltime!=dueltime))	  i++;  if (fmpks[fmpks_pos+i].dueltime==dueltime) {    makeEscapeString(fmpks[fmpks_pos+i].host_name,n1,sizeof(n1));    makeEscapeString(fmpks[fmpks_pos+i].guest_name,n2,sizeof(n2));    sprintf(buf, "%d|%s|%s|%d|%d|%d",    	fmpks[fmpks_pos+i].dueltime,    	n1,    	n2,    	fmpks[fmpks_pos+i].prepare_time,    	fmpks[fmpks_pos+i].max_player,    	fmpks[fmpks_pos+i].win);  } else {    strcpy(buf, "-1|??|??|0|0");    print("scheduleman: gen DETAIL error (%d).",dueltime);  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -