?? npc_fmchallenge.c
字號:
CHAR_getWorkInt(meindex, NPC_WORK_CHALLENGETIMEOUT);
CHAR_talkToCli(talkerindex, meindex,
"家族挑戰設定完成。", CHAR_COLORWHITE);
}
break;
case WINDOW_BUTTONTYPE_CANCEL:
fmpks[fmpks_pos+i].flag=FMPKS_FLAG_NONE;
CHAR_talkToCli(talkerindex, meindex,
"清除家族挑戰。", CHAR_COLORWHITE);
break;
}
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_hour==0)
keeptime=0;
else
keeptime=(tm1.tm_hour-1)*100 + tm1.tm_min;
*/
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>=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
}
// 重新定義時刻
/*
h=(fmpks[fmpks_pos].dueltime%10000)/100;
d=0;
for (i=0; i<MAX_SCHEDULE; i++) {
fmpks[fmpks_pos+i].dueltime=d+h*100;
if (h==23) {
h=0;
d=10000;
} else h++;
}
*/
if (expired==23)
fmpks[fmpks_pos].dueltime = tm1.tm_hour*100 + ((int)(tm1.tm_min/fin)+1)*fin;
print("scheduleman: dueltime[0] = %d\n", fmpks[fmpks_pos].dueltime);
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;
}
}
}
// 處理 timeout
void 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;
}
}
}
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;
}
}
}
}
}
// 檢查, 一個家族只能安排一場戰斗
BOOL NPC_AlreadyScheduled(int meindex, int talkerindex)
{
int i;
int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;
int tkfmindex = CHAR_getInt(talkerindex, CHAR_FMINDEX);
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))) {
fmpks[fmpks_pos+i].max_player=atoi(token);
} else continue;
// 旗標
if (getStringFromIndexWithDelim(tmp,"|",8,token,sizeof(token))) {
fmpks[fmpks_pos+i].flag=atoi(token);
} else continue;
}
fclose(f);
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));
sprintf(tmp, "%d|%d|%s|%d|%s|%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);
fwrite(tmp, strlen(tmp), 1, f);
}
fclose(f);
}
// 產生 WN_PKSCHEDULELIST 的 data
void 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_getInt(talkerindex, CHAR_FMINDEX);
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
}
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
}
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",
fmpks[fmpks_pos+i].dueltime,
n1,
n2,
fmpks[fmpks_pos+i].prepare_time,
fmpks[fmpks_pos+i].max_player,
flag);
if (strlen(buf)+strlen(tmp)<size) {
strcat(buf, tmp);
} else {
return;
}
}
}
// 產生 WN_PKSCHEDULESELECTFAMILY 的 data
void NPC_SELECT_gendata(int meindex, int page, char *buf, int size)
{
int i,cnt=0;
char token[4096];
char fmindex[256];
char fmname[256];
memset(buf, 0, size); // clear buffer
strcpy(buf,"0");
for (i=0; i<MAXFAMILYINONEWINDOW; i++) {
if (getStringFromIndexWithDelim(familyListBuf,"|",page+i,token,sizeof(token))) {
if ( (getStringFromIndexWithDelim(token," ",1,fmindex,sizeof(fmindex))) &&
(getStringFromIndexWithDelim(token," ",2,fmname,sizeof(fmname))) ) {
sprintf(token,"|%s|%s",fmindex,fmname);
if (strlen(buf)+strlen(token)<size) {
strcat(buf, token);
cnt++;
buf[0]=cnt+'0';
} else return;
}
}
}
}
// 產生 WN_PKSCHEDULEDETAIL 的 data
void 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",
fmpks[fmpks_pos+i].dueltime,
n1,
n2,
fmpks[fmpks_pos+i].prepare_time,
fmpks[fmpks_pos+i].max_player);
} else {
strcpy(buf, "-1|??|??|0|0");
print("scheduleman: gen DETAIL error (%d).",dueltime);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -