📄 npc_scheduleman.c
字号:
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 + -