?? npc_manorsman.c
字號:
#include "version.h"
#include <time.h>
#include "char.h"
#include "object.h"
#include "lssproto_serv.h"
#include "npcutil.h"
#include "handletime.h"
#include "npc_scheduleman.h"
#include "family.h"
#include "npc_manorsman.h"
#include "saacproto_cli.h"
#include "net.h"
#include "configfile.h"
#include "log.h"
/*
* 莊園 PK 登記員
*
*/
#define MAX_MANORSMAN 22
static int FMPK_ManorsmanList[MAX_MANORSMAN]={
-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,
-1,-1,-1,-1,-1,
-1,-1 };
enum {
NPC_WORK_ID = CHAR_NPCWORKINT1, // 登記員 ID, 從 0 開始
NPC_WORK_MANORID = CHAR_NPCWORKINT2, // 莊園編號
NPC_WORK_CHALLENGEWAIT = CHAR_NPCWORKINT3, // 挑戰等待時間
NPC_WORK_PEACEWAIT = CHAR_NPCWORKINT4, // 休戰時間
NPC_WORK_PREVLOOPTIME = CHAR_NPCWORKINT5, // 前一次處理 Loop 的時間
#ifdef _NEW_MANOR_LAW
NPC_WORK_BETTLETIME = CHAR_NPCWORKINT6 // 記錄開打時的日期
#endif
};
#define SCHEDULEFILEDIR "./Schedule/"
#ifdef _FIX_FAMILY_PK_LIMIT // WON ADD 將可挑戰莊園的由前十大改為前二十大
#define PK_LIMIT 20
#endif
extern struct FM_POINTLIST fmpointlist;
extern void NPC_talkToFloor(int floor, int index1, int index2, char *data);
#ifdef _MANOR_PKRULE
extern struct FMS_DPTOP fmdptop;
#endif
void NPC_ManorLoadPKSchedule(int meindex); // Load schedule from disk
#ifdef _NEW_MANOR_LAW
void SortManorSchedule();
int SortManorScheduleMomentum(const void *indexa, const void *indexb);
extern int familyMemberIndex[FAMILY_MAXNUM][FAMILY_MAXMEMBER];
int g_iSortManor;
#endif
int NPC_getManorsmanListIndex( int ID)
{
if( ID < 0 || ID >= MAX_MANORSMAN ){
return FMPK_ManorsmanList[ ID];
}
return -1;
}
BOOL NPC_ManorSmanInit( int meindex )
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
int meid;
int a;
CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_TYPEMANORSCHEDULEMAN );
// 參數
NPC_Util_GetArgStr(meindex, argstr, sizeof(argstr));
meid = NPC_Util_GetNumFromStrWithDelim(argstr, "id" );
if ((meid<0) || (meid>=MAX_SCHEDULEMAN)) {
print("MANORSMAN init error: invalid ID(%d)\n",meid);
meid=0;
}
CHAR_setWorkInt(meindex, NPC_WORK_ID, meid);
a = NPC_Util_GetNumFromStrWithDelim(argstr, "loop" );
if ((a<100) || (a>10000)) a=1000;
CHAR_setInt(meindex, CHAR_LOOPINTERVAL, a);
a = NPC_Util_GetNumFromStrWithDelim(argstr, "manorid" );
if ((a<1) || (a>/*4*/MANORNUM)) {// CoolFish 2002/2/25
print("MANORSMAN init error: invalid manor id(%d).", a);
a=1;
}
CHAR_setWorkInt(meindex, NPC_WORK_MANORID, a);
a = NPC_Util_GetNumFromStrWithDelim(argstr, "challengewait");
if ((a<1) || (a>259200)) {
print("MANORSMAN init error: invalid challengewait(%d).",a);
a=259200;
}
CHAR_setWorkInt(meindex, NPC_WORK_CHALLENGEWAIT, a);
a = NPC_Util_GetNumFromStrWithDelim(argstr, "peacewait");
if ((a<1) || (a>432000)) {
print("MANORSMAN init error: invalid peacewait(%d).",a);
a=604800;
}
CHAR_setWorkInt(meindex, NPC_WORK_PEACEWAIT, a);
NPC_ManorLoadPKSchedule(meindex);
CHAR_setWorkInt(meindex, NPC_WORK_PREVLOOPTIME, NowTime.tv_sec);
#ifdef _NEW_MANOR_LAW
CHAR_setWorkInt(meindex,NPC_WORK_BETTLETIME,0);
#endif
if( CHAR_getWorkInt( meindex, NPC_WORK_ID) >= 0 &&
CHAR_getWorkInt( meindex, NPC_WORK_ID) <MAX_MANORSMAN ){
FMPK_ManorsmanList[ CHAR_getWorkInt( meindex, NPC_WORK_ID)] = meindex;
}
return TRUE;
}
#ifndef _NEW_MANOR_LAW
void NPC_ManorSmanTalked(int meindex, int talkerindex, char *msg, int color)
{
char buf[4096];
int fd;
int fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;
if (NPC_Util_CharDistance(meindex, talkerindex) > 2) return;
if (!NPC_Util_isFaceToFace(meindex, talkerindex, 2)) return;
fd = getfdFromCharaIndex(talkerindex);
if (fd == -1) return;
switch (fmpks[fmpks_pos+1].flag) {
case FMPKS_FLAG_NONE:
// 沒有約定戰斗,此時可以下戰書
saacproto_ACFMPointList_send(acfd);
#ifdef _MANOR_PKRULE
sprintf(buf, "莊園所有權爭奪戰的挑戰資格\n\n"
"一、沒有擁有莊園的家族\n"
#ifdef _FIX_FAMILY_PK_LIMIT // WON ADD 將可挑戰莊園的由前十大改為前二十大
"二、家族排行必需為前二十大家族\n"
#else
"二、家族排行必需為前十大家族\n"
#endif
"叁、踢館時間:下午六點至凌晨叁點\n\n"
"請稍待,我將確認你的資格。");
#else
sprintf(buf, "莊園所有權爭奪戰的挑戰資格\n\n"
"一、沒有擁有莊園的家族\n"
"二、家族的聲望高於莊園家族的聲望\n\n"
"請稍待,我將確認你的資格。");
#endif
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
WINDOW_BUTTONTYPE_YESNO,
CHAR_WINDOWTYPE_CHECKMAN_START,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),
buf);
break;
case FMPKS_FLAG_MANOR_PREPARE:
// 目前已經定好戰斗,準備中
{
int timeleft=fmpks[fmpks_pos+1].dueltime-NowTime.tv_sec;
int dd,hh,mm;
char buf2[4096];
dd = /*fmpks[fmpks_pos+1].dueltime*/ timeleft / 86400;
hh = /*fmpks[fmpks_pos+1].dueltime*/ timeleft / 3600 - dd*24;
mm = /*fmpks[fmpks_pos+1].dueltime*/ timeleft / 60 - dd*24*60 - hh*60;
memset(buf2,0,sizeof(buf2));
if (dd>0) sprintf(buf, " %d 天", dd); else strcpy(buf, "");
strcat(buf2, buf);
if (hh>0) sprintf(buf, " %d 小時", hh); else strcpy(buf, "");
strcat(buf2, buf);
if (mm>0) sprintf(buf, " %d 分鍾", mm); else strcpy(buf, "");
strcat(buf2, buf);
if (strlen(buf2)==0)
sprintf(buf, "莊園所有權爭奪戰\n『%s VS %s』\n\n"
"即將開始,請準備入場。",
fmpks[fmpks_pos+1].guest_name,
fmpks[fmpks_pos+1].host_name);
else
sprintf(buf, "莊園所有權爭奪戰\n『%s VS %s』\n\n"
"預定將在%s後開始。",
fmpks[fmpks_pos+1].guest_name,
fmpks[fmpks_pos+1].host_name,
buf2);
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
WINDOW_BUTTONTYPE_OK,
CHAR_WINDOWTYPE_CHECKMAN_END,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),
buf);
}
break;
case FMPKS_FLAG_MANOR_PEACE:
// 戰斗已經結束的和平時期
{
int timeleft=fmpks[fmpks_pos+1].dueltime-NowTime.tv_sec;
int dd,hh,mm;
char buf2[4096];
dd = /*fmpks[fmpks_pos+1].dueltime*/ timeleft / 86400;
hh = /*fmpks[fmpks_pos+1].dueltime*/ timeleft / 3600 - dd*24;
mm = /*fmpks[fmpks_pos+1].dueltime*/ timeleft / 60 - dd*24*60 - hh*60;
strcpy(buf2,"");
if (dd>0) sprintf(buf, " %d 天", dd); else strcpy(buf, "");
strcat(buf2, buf);
if (hh>0) sprintf(buf, " %d 小時", hh); else strcpy(buf, "");
strcat(buf2, buf);
if (mm>0) sprintf(buf, " %d 分鍾", mm); else strcpy(buf, "");
strcat(buf2, buf);
if (strlen(buf2)==0)
strcpy(buf, "請稍等,讓我準備一下申請踢館的表格。");
else
sprintf(buf, "現在是休戰時期,要踢館的話\n請%s後再來申請。",buf2);
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
WINDOW_BUTTONTYPE_OK,
CHAR_WINDOWTYPE_CHECKMAN_END,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX), buf);
}
break;
case FMPKS_FLAG_MANOR_BATTLEBEGIN:
// 目前正在進行踢館
sprintf(buf, "莊園所有權爭奪戰\n『%s VS %s』\n\n"
"開~打~羅~\n還沒進場的人趕快進場吧。",
fmpks[fmpks_pos+1].guest_name,
fmpks[fmpks_pos+1].host_name);
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
WINDOW_BUTTONTYPE_OK,
CHAR_WINDOWTYPE_CHECKMAN_END,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),
buf);
break;
case FMPKS_FLAG_MANOR_OTHERPLANET:
// 在別的星球進行戰斗
sprintf(buf, "莊園所有權爭奪戰\n『%s VS %s』\n\n"
"決斗地點在 %s 。",
fmpks[fmpks_pos+1].guest_name,
fmpks[fmpks_pos+1].host_name,
fmpks[fmpks_pos+2].host_name);
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
WINDOW_BUTTONTYPE_OK,
CHAR_WINDOWTYPE_CHECKMAN_END,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),
buf);
break;
}
}
#else
void NPC_ManorSmanTalked(int meindex, int talkerindex, char *msg, int color)
{
char buf[4096];
int fd;
int fmpks_pos = CHAR_getWorkInt(meindex,NPC_WORK_ID)*MAX_SCHEDULE;
int manorid = CHAR_getWorkInt(meindex,NPC_WORK_MANORID);
if(CHAR_CHECKINDEX(meindex) == FALSE){
printf("\nNPC_ManorSmanTalked error!(meindex:%d)",meindex);
return;
}
if(NPC_Util_CharDistance(meindex,talkerindex) > 2) return;
if(!NPC_Util_isFaceToFace(meindex,talkerindex,2)) return;
fd = getfdFromCharaIndex(talkerindex);
if(fd == -1) return;
if(fmpks[fmpks_pos+1].flag == FMPKS_FLAG_CHALLENGE) fmpks[fmpks_pos+1].flag = FMPKS_FLAG_NONE;
switch(fmpks[fmpks_pos+1].flag){
// 挑戰期 1800~2200
case FMPKS_FLAG_NONE:
case FMPKS_FLAG_WAIT:
saacproto_ACFMPointList_send(acfd);
sprintf(buf,"莊園所有權爭奪戰的挑戰資格\n\n"
"一、沒有莊園的家族\n"
"二、家族的氣勢高於莊園家族的氣勢\n"
"叁、約戰時間終止時,氣勢排名第一者獲得挑戰資格\n"
"四、氣勢相同者以最先報名者獲得資格\n"
"按 OK 我將確認你的資格,按 NO 觀看挑戰排名");
lssproto_WN_send(fd,WINDOW_MESSAGETYPE_MESSAGE,WINDOW_BUTTONTYPE_YESNO,CHAR_WINDOWTYPE_CHECKMAN_START,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),buf);
if(fmpointlist.fm_momentum[manorid-1] <= -1){
int hadfmindex,index;
char token[256];
getStringFromIndexWithDelim(fmpointlist.pointlistarray[manorid-1],"|",5,token,sizeof(token));
hadfmindex = atoi(token);
if(hadfmindex != -1){
for(index=0;index<FAMILY_MAXNUM;index++){
// 找出守莊家族的索引
if(fmdptop.fmtopid[index] == (hadfmindex - 1)) break;
}
if(index >= FAMILY_MAXNUM){
getStringFromIndexWithDelim(fmpointlist.pointlistarray[manorid-1],"|",6,token,sizeof(token));
printf("\nNPC_ManorSmanTalked():save fm_momentum error(%d:%s)",hadfmindex,token);
break;
}
// 記錄這個時刻守莊家族的氣勢
else fmpointlist.fm_momentum[manorid-1] = fmdptop.fmMomentum[index];
}
}
SortManorSchedule();
break;
// 挑戰準備期 2200~取得挑戰資格的家族當時挑戰的時間(隔天的 1800~2200 之間)
case FMPKS_FLAG_MANOR_PREPARE:
// 目前已經定好戰斗,準備中
{
int timeleft = fmpks[fmpks_pos+1].dueltime - NowTime.tv_sec;
int mm,hh,dd;
char buf2[4096];
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -