📄 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 + -