?? npc_manorsman.c
字號:
#endif
#ifndef _NEW_MANOR_LAW
#ifdef _MANOR_PKRULE
time_t timep;
struct tm *p;
time(&timep);
p = gmtime(&timep);
if( p->tm_hour+8 > 24)
p->tm_hour = p->tm_hour-16;
else
p->tm_hour = p->tm_hour+8;
if(p->tm_hour<18 && p->tm_hour>2){
sprintf(buf, "請於下午6:00至凌晨3:00再來約戰吧!");
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
WINDOW_BUTTONTYPE_OK,
CHAR_WINDOWTYPE_CHECKMAN_END,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),
buf);
break;
}
#endif
// WON ADD 修正家族pk場的約戰問題
if( fmpks[fmpks_pos+1].flag != FMPKS_FLAG_NONE ){
sprintf(buf, "這個莊園已經有人約戰了喔。");
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
WINDOW_BUTTONTYPE_OK,
CHAR_WINDOWTYPE_CHECKMAN_END,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),
buf);
return;
}
#endif
#ifdef _ACFMPK_LIST
#ifndef _NEW_MANOR_LAW
NPC_ManorSavePKSchedule(meindex, talkerindex, 0);
sprintf( buf, "莊園挑戰登陸確認中,請稍後。");
CHAR_talkToCli( talkerindex, meindex, buf, CHAR_COLORYELLOW);
#else
NPC_ManorAddToSchedule(meindex,talkerindex);
#endif
#else
memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1));
getStringFromIndexWithDelim(fmpointlist.pointlistarray[manorid-1], "|", 6, token, sizeof(token));
strcpy(hadfmname, token);
fmpks[fmpks_pos+1].dueltime = CHAR_getWorkInt(meindex, NPC_WORK_CHALLENGEWAIT) + NowTime.tv_sec
- tm1.tm_min*60 + 1800; // Arminius 11.1 改成一律 xx:30 開打
fmpks[fmpks_pos+1].host_index = hadfmindex-1;
strcpy(fmpks[fmpks_pos+1].host_name, hadfmname);
fmpks[fmpks_pos+1].guest_index = tkfmindex;
strcpy(fmpks[fmpks_pos+1].guest_name, CHAR_getChar(talkerindex, CHAR_FMNAME));
fmpks[fmpks_pos+1].prepare_time = 15;
fmpks[fmpks_pos+1].max_player = 50;
fmpks[fmpks_pos+1].win = -1;
fmpks[fmpks_pos+1].flag = FMPKS_FLAG_MANOR_OTHERPLANET;
strcpy(fmpks[fmpks_pos+2].host_name, getGameserverID());
#ifndef _NEW_MANOR_LAW
NPC_ManorSavePKSchedule(meindex, talkerindex, 0);
sprintf(buf, "莊園挑戰已經設定完成,請好好準備。");
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_MESSAGE,
WINDOW_BUTTONTYPE_OK,
CHAR_WINDOWTYPE_CHECKMAN_END,
CHAR_getWorkInt(meindex, CHAR_WORKOBJINDEX),
buf);
#else
NPC_ManorAddToSchedule(meindex,talkerindex);
#endif
fmpks[fmpks_pos+1].flag = FMPKS_FLAG_MANOR_PREPARE;
#endif
}
}
break;
}
}
void NPC_CleanPkList( int ti)
{
// Terry fix 要清為-1不能清為0
/* fmpks[ ti+1 ].host_index = 0;
fmpks[ ti+1].guest_index=0;
fmpks[ ti].host_index=0;
fmpks[ ti].guest_index=0;*/
fmpks[ ti+1 ].host_index = -1;
fmpks[ ti+1].guest_index=-1;
fmpks[ ti].host_index=-1;
fmpks[ ti].guest_index=-1;
strcpy(fmpks[ ti+1].host_name,"");
strcpy(fmpks[ ti+1].guest_name,"");
strcpy(fmpks[ ti].host_name,"");
strcpy(fmpks[ ti].guest_name,"");
strcpy(fmpks[ ti+2].host_name,"");
}
void NPC_ManorSmanLoop(int meindex)
{
struct tm tm1;
int fmpks_pos;
#ifdef _NEW_MANOR_LAW
int iOffsetTime;
#endif
if(CHAR_CHECKINDEX(meindex) == FALSE){
printf("\nNPC_ManorSmanLoop error!(meindex:%d)",meindex);
return;
}
fmpks_pos = CHAR_getWorkInt(meindex, NPC_WORK_ID)*MAX_SCHEDULE;
memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1));
switch (fmpks[fmpks_pos+1].flag) {
case FMPKS_FLAG_NONE:
#ifdef _NEW_MANOR_LAW
{
int hadfmindex,index,manorid;
char token[256];
//此時可以開始挑戰
manorid = CHAR_getWorkInt(meindex,NPC_WORK_MANORID);
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_ManorSmanLoop():save fm_momentum error(%d:%s)",hadfmindex,token);
break;
}
// 記錄這個時刻守莊家族的氣勢
else fmpointlist.fm_momentum[manorid-1] = fmdptop.fmMomentum[index];
// 進入下一個狀態
fmpks[fmpks_pos+1].flag = FMPKS_FLAG_WAIT;
// 挑戰期共4小時(1800~2200)
fmpks[fmpks_pos+1].dueltime = NowTime.tv_sec + 3600 * 4;
NPC_ManorSavePKSchedule(meindex, -1, FMPKS_FLAG_WAIT,fmpks[fmpks_pos+1].dueltime,tm1);
}
SortManorSchedule();
}
#endif
break;
#ifdef _NEW_MANOR_LAW
// 進入挑戰期,已記錄家族氣勢,等待挑戰排程
case FMPKS_FLAG_WAIT:
{
int manorid,i,iPlayerNum = CHAR_getPlayerMaxNum();
char szMsg[256];
manorid = CHAR_getWorkInt(meindex,NPC_WORK_MANORID);
// 還沒開打,氣勢改變要去向AC要即時資料
fmpointlist.fm_inwar[manorid-1] = TRUE;
if(fmpks[fmpks_pos+1].dueltime <= NowTime.tv_sec){
// 挑戰家族中氣勢最高的獲得挑戰權
int manorindex = CHAR_getWorkInt(meindex,NPC_WORK_MANORID) - 1;
int iNo1FmIndexSort = ManorSchedule[manorindex].iSort[0];
int index = ManorSchedule[manorindex].iFmIndex[iNo1FmIndexSort],iFmIndex1,iCharindex;
char token[256],fmname[256];
// 沒人挑戰
if(index < 0){
// 直接進入到挑戰結束
fmpks[fmpks_pos+1].flag = FMPKS_FLAG_MANOR_BATTLEEND;
CHAR_setWorkInt(meindex,NPC_WORK_BETTLETIME,tm1.tm_mday);
// 通知所有人
for(i=0;i<iPlayerNum;i++){
if(CHAR_getCharUse(i) != FALSE){
CHAR_talkToCli(i,-1,"由於無家族挑戰莊園,莊園進入休戰時期",CHAR_COLORBLUE2);
}
}
getStringFromIndexWithDelim(fmpointlist.pointlistarray[manorid-1],"|",5,token,sizeof(token));
iFmIndex1 = atoi(token) - 1;
if(iFmIndex1 != -1){
getStringFromIndexWithDelim(fmpointlist.pointlistarray[manorid-1],"|",6,fmname,sizeof(token));
saacproto_ACFixFMPoint_send(acfd,fmname,iFmIndex1 + 1,iFmIndex1,
fmname,iFmIndex1 + 1,iFmIndex1,CHAR_getWorkInt(meindex,NPC_WORK_ID));
// 增加莊園戰勝負Log
sprintf(token," (%d:%d) %d/%d/%d",tm1.tm_hour,tm1.tm_min,tm1.tm_year+1900,tm1.tm_mon+1,tm1.tm_mday);
Logfmpk(fmname,iFmIndex1,-1,"無人挑戰",-1,-1,token,"","",2);
// 原家族守住了莊園,家族成員可得到石幣
for(i=0;i<FAMILY_MAXMEMBER;i++){
iCharindex = familyMemberIndex[iFmIndex1][i];
// 若在線上才給錢
if(iCharindex >= 0 && CHAR_getCharUse(iCharindex)){
// 獲得金錢 = 個人氣勢 * 5000
int iAddGold = ((float)CHAR_getInt(iCharindex,CHAR_MOMENTUM)/100.0f) * 5000.0f;
int iGold = CHAR_getInt(iCharindex,CHAR_BANKGOLD),iMaxGold;
// 先放入個人銀行
if(iGold + iAddGold > CHAR_MAXBANKGOLDHAVE){
CHAR_setInt(iCharindex,CHAR_BANKGOLD,CHAR_MAXBANKGOLDHAVE);
// 個人銀行放不下了,放到個人身上
iAddGold = iGold + iAddGold - CHAR_MAXBANKGOLDHAVE;
iGold = CHAR_getInt(iCharindex,CHAR_GOLD);
iMaxGold = CHAR_getMaxHaveGold(iCharindex);
if(iGold + iAddGold > iMaxGold) CHAR_setInt(iCharindex,CHAR_GOLD,iMaxGold);
else CHAR_setInt(iCharindex,CHAR_GOLD,iGold + iAddGold);
LogFMPKGetMomey(CHAR_getChar(iCharindex,CHAR_FMNAME),
CHAR_getChar(iCharindex,CHAR_CDKEY),
CHAR_getChar(iCharindex,CHAR_NAME),
CHAR_getInt(iCharindex,CHAR_MOMENTUM),iAddGold,0);
}
else{
CHAR_setInt(iCharindex,CHAR_BANKGOLD,iGold + iAddGold);
LogFMPKGetMomey(CHAR_getChar(iCharindex,CHAR_FMNAME),
CHAR_getChar(iCharindex,CHAR_CDKEY),
CHAR_getChar(iCharindex,CHAR_NAME),
CHAR_getInt(iCharindex,CHAR_MOMENTUM),iAddGold,1);
}
CHAR_talkToCli(iCharindex,-1,"辛苦了!守護住莊園的獎金已匯入你的個人銀行",CHAR_COLORRED);
// 家族的個人及家族氣勢都要歸零
CHAR_setInt(iCharindex,CHAR_MOMENTUM,0);
CHAR_talkToCli(iCharindex,-1,"莊園戰後個人及家族氣勢歸零",CHAR_COLORRED);
}
}
}
}
else{
// 挑戰時間已過,選出的挑戰家族和守莊家族有約一天的時間可以準備
NPC_ManorSavePKSchedule(meindex,index,0,-1,ManorSchedule[manorindex].tm1[iNo1FmIndexSort]);
// 開打了,氣勢改變也不用去向AC要即時資料了
fmpointlist.fm_inwar[manorid-1] = FALSE;
// 通知所有人
sprintf(szMsg,"%s 家族獲得挑戰莊園資格",ManorSchedule[manorindex].szFmName[iNo1FmIndexSort]);
for(i=0;i<iPlayerNum;i++){
if(CHAR_getCharUse(i) != FALSE){
CHAR_talkToCli(i,-1,szMsg,CHAR_COLORBLUE2);
}
}
}
}
}
break;
#endif
case FMPKS_FLAG_MANOR_PREPARE:
if(fmpks[fmpks_pos+1].dueltime <= NowTime.tv_sec){
memcpy(&fmpks[fmpks_pos], &fmpks[fmpks_pos+1], sizeof(FamilyPKSchedule));
fmpks[fmpks_pos].dueltime = tm1.tm_hour * 100 + tm1.tm_min;
fmpks[fmpks_pos].flag = FMPKS_FLAG_SCHEDULED;
fmpks[fmpks_pos+1].dueltime = 0;
fmpks[fmpks_pos+1].flag = FMPKS_FLAG_MANOR_BATTLEBEGIN;
NPC_talkToFloor(CHAR_getInt(meindex, CHAR_FLOOR) , fmpks[fmpks_pos].host_index,
fmpks[fmpks_pos].guest_index, "莊園爭奪戰已經開始,請盡快入場!");
#ifdef _NEW_MANOR_LAW
CHAR_setWorkInt(meindex,NPC_WORK_BETTLETIME,tm1.tm_mday);
#endif
}
break;
case FMPKS_FLAG_MANOR_PEACE:
if (fmpks[fmpks_pos+1].dueltime <= NowTime.tv_sec) {
fmpks[fmpks_pos+1].dueltime = 0;
fmpks[fmpks_pos+1].flag = FMPKS_FLAG_NONE;
#ifndef _NEW_MANOR_LAW
NPC_ManorSavePKSchedule(meindex, -1, FMPKS_FLAG_NONE);
#else
NPC_ManorSavePKSchedule(meindex, -1, FMPKS_FLAG_NONE,fmpks[fmpks_pos+1].dueltime,tm1);
#endif
}
break;
case FMPKS_FLAG_MANOR_BATTLEBEGIN:
break;
case FMPKS_FLAG_MANOR_BATTLEEND:
{
#ifdef _NEW_MANOR_LAW
int manorindex = CHAR_getWorkInt(meindex,NPC_WORK_MANORID) - 1;
#endif
fmpks[fmpks_pos].flag = FMPKS_FLAG_NONE;
#ifndef _NEW_MANOR_LAW
fmpks[fmpks_pos+1].dueltime = CHAR_getWorkInt(meindex, NPC_WORK_PEACEWAIT) + NowTime.tv_sec;
#else
// 打完後要再過五天才能再挑戰
// 若開打的日期和結束戰斗的日期不一樣表示打超過了一天以上,以一天計
if(CHAR_getWorkInt(meindex,NPC_WORK_BETTLETIME) != tm1.tm_mday){
iOffsetTime = tm1.tm_hour * 3600 * -1; // 扣回00:00
}
else{ // 戰斗結束時未超過一天
iOffsetTime = (24 - tm1.tm_hour) * 3600; // 補成00:00
}
//#ifdef _75_TEST
fmpks[fmpks_pos+1].dueltime = NowTime.tv_sec - tm1.tm_min*60 + iOffsetTime + 172800 + (18 * 3600); // 二天
//#else
// fmpks[fmpks_pos+1].dueltime = NowTime.tv_sec - tm1.tm_min*60 + iOffsetTime + 432000 + (18 * 3600);
// |-----------取整點------------| |-補成00:00-| |-五天-| |18:00開始報名|
//#endif
#endif
fmpks[fmpks_pos+1].flag = FMPKS_FLAG_MANOR_PEACE_SAVE;
NPC_CleanPkList( fmpks_pos);
#ifndef _NEW_MANOR_LAW
NPC_ManorSavePKSchedule(meindex, -1, FMPKS_FLAG_MANOR_PEACE_SAVE);
#else
NPC_ManorSavePKSchedule(meindex, -1, FMPKS_FLAG_MANOR_PEACE_SAVE,fmpks[fmpks_pos+1].dueltime,tm1);
// 清空排程
memset(&ManorSchedule[manorindex],0,sizeof(ManorSchedule[manorindex]));
{
int i;
for(i=0;i<10;i++) ManorSchedule[manorindex].iSort[i] = ManorSchedule[manorindex].iFmIndex[i] = -1;
for(i=0;i<FAMILY_MAXHOME;i++) fmpointlist.fm_momentum[i] = -1;
}
}
#endif
break;
case FMPKS_FLAG_MANOR_PEACE_SAVE:
fmpks[fmpks_pos+1].flag = FMPKS_FLAG_MANOR_PEACE;
break;
case FMPKS_FLAG_MANOR_OTHERPLANET:
break;
case FMPKS_FLAG_MANOR_READYTOFIGHT:
case FMPKS_FLAG_MANOR_CLEANFLAG:
fmpks[fmpks_pos].flag = FMPKS_FLAG_NONE;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -