#define _FAMILY_C_
#include "version.h"
#include "main.h"
#include "acfamily.h"
#include "util.h"
#include "saacproto_serv.h"
#include <malloc.h>
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
// 家族 Int 資料
static char* FAMILY_INTDATA[familymaxint] =
{
"fmindex",
"fmleadergrano",
"fmnum",
"fmjoinnum",
"fmacceptflag",
"fmsetupflag",
"fmsprite",
"fmpointindex",
"fmpopular",
"fmgold",
"fmmemberindexmaxnum",
"apply_time",
"setup_time",
"predel_time",
"memonowwritenum",
"memonum",
"fmadv",
"fmfeed",
"fmsynthesize",
"fmdealfood",
"fmpk",
#ifdef _NEW_MANOR_LAW
"fmmomentum",
#endif
};
// 家族 char 資料
static char* FAMILY_CHARDATA[familymaxchar] =
{
"fmname",
"fmleadername",
"fmleaderid",
"petname",
"petattr",
"fmrule",
};
// 家族成員 int 資料
static char* MEMBER_INTDATA[memberdatamaxint] =
{
"charlv",
"charflag",
"onlineflag",
"charfdid",
"predeltime",
"popular",
#ifdef _FMVER21
"eventflag",
#endif
#ifdef _NEW_MANOR_LAW
"momentum",
#endif
};
// 家族成員 char 資料
static char* MEMBER_CHARDATA[memberdatamaxchar] =
{
"charname",
"charid",
};
// 成員種類 char 資料
static char* MEMBERKIND_INTDATA[FMMEMBER_KINDNUM] =
{
"無",
"一般成員",
"申請中",
"族長",
"長老",
};
// 家族之間留言板
struct FMSMEMO
{
int num; // 留言數量
int fmsnowwritenum; // 目前留言位置
char memodata[FMSMEMONUM][FAMILY_MEMOLEN]; // 留言內容
};
// 莊園
struct FMPOINT
{
int fl; // 莊園進入圖層
int x; // 莊園進入X座標
int y; // 莊園進入Y座標
int fmfl; // 莊園族長圖層
int village; // 莊園鄰近之村莊
int hadfmindex; // 佔領莊園之家族 index
char hadfmname[CHARNAME_MAX]; // 佔領莊園之家族 name
int hadfmpopular; // 佔領莊園之家族綜合聲望值
#ifdef _ADD_FAMILY_TAX // WON ADD 增加莊園稅收
int hadfmtax; // 佔領莊園之家族稅率
#endif
};
// 家族成員資料
typedef struct
{
char charname[CHARNAME_MAX]; // 成員名字
char charid[USERID_MAX]; // 成員帳號
int charlv; // 成員等級
int charflag; /*
FMMEMBER_NONE 清空資料
FMMEMBER_MEMBER 家族成員
FMMEMBER_APPLY 申請中
FMMEMBER_LEADER 族長
FMMEMBER_ELDER 長老
*/
int onlineflag; // 0:offline; gmsv index
int charfdid; // 成員在 gmsv 的 fd
int predeltime; // 預計刪除成員時間
int popular; // 成員的聲望
#ifdef _FMVER21
int eventflag; // 是否擁有族長資格
#endif
#ifdef _NEW_MANOR_LAW
int momentum; // 成員氣勢
#endif
#ifdef _FM_MODIFY
int gsnum; // 記錄玩家是在那一個game server
#endif
} MEMBERDATA;
struct FAMILY
{
int fmindex; // 家族 index
char fmname[CHARNAME_MAX]; // 家族名稱
char fmleadername[CHARNAME_MAX]; // 族長名稱
char fmleaderid[USERID_MAX]; // 族長帳號
int fmleadergrano; // 族長照片
char petname[CHARNAME_MAX]; // 守護獸名稱
char petattr[256]; // 守護獸資料
int fmnum; // 家族人數,包含申請退出、加入人數
int fmjoinnum; // 真正加入家族人數
int fmacceptflag; // 是否接收成員 0:不接受 1:接受
int fmsetupflag; // 0:尚未成立 1:已成立
char fmrule[256]; // 家族主旨
int fmsprite; // 0:光明精靈 1:黑暗精靈
int fmpointindex; // 家族據點 index
int fmpopular; // 家族綜合聲望
#ifdef _PERSONAL_FAME // Arminius: 家族個人聲望
int fmtotalfame; // 家族綜合 + 家族個人聲望總合
#endif
#ifdef _NEW_MANOR_LAW
int fmmomentum; // 家族氣勢
#endif
int fmgold; // 家族基金
int fmmemberindexmaxnum; // 家族目前最大人數
int apply_time; // 家族申請時間
int setup_time; // 家族成立時間
int predel_time; // 預計刪除家族時間
int memonowwritenum; // 目前留言位置
int memonum; // 留言數量
int fmadv; // 冒險任務聲望
int fmfeed; // 飼育聲望
int fmsynthesize; // 合成加工聲望
int fmdealfood; // 料理聲望
int fmpk; // PK聲望
char memolist[FAMILY_MEMONUM][FAMILY_MEMOLEN]; // 留言內容
MEMBERDATA fmmemberindex[MAX_MEMBERNUM]; // 成員資料
};
int db_familyupdate[MAX_FAMILY];
int db_fmpointupdate = 0;
int db_fmsmemoupdate = 0;
int fmnownum = 0;
int fmindexmaxnum = 0;
extern gmsv gs[MAXCONNECTION];
struct FAMILY family[MAX_FAMILY];
int fmpopularindex[MAX_FAMILY]; // Arminius: sort family
#ifdef _PERSONAL_FAME // Arminius: 家族個人聲望
int fmtotalfameindex[MAX_FAMILY];
#endif
#ifdef _NEW_MANOR_LAW
int fmMomentumIndex[MAX_FAMILY];
#endif
int fmadvindex[MAX_FAMILY];
int fmfeedindex[MAX_FAMILY];
int fmsynthesizeindex[MAX_FAMILY];
int fmdealfoodindex[MAX_FAMILY];
int fmpkindex[MAX_FAMILY];
struct FMPOINT fmpoint[MAX_FMPOINT];
struct FMSMEMO fmsmemo;
// Arminius: sort family & output the sorted list
// Make a sorted index (fmindex) for the family data (family)
#ifdef _NEW_MANOR_LAW
int fmMomentumcompar(const void *indexa, const void *indexb);
#endif
#ifdef _PERSONAL_FAME // Arminius: 家族個人聲望
int fmtotalfamecompar(const void *indexa, const void *indexb);
#endif
int fmpopularcompar(const void *indexa, const void *indexb);
int fmadvcompar(const void *indexa, const void *indexb);
int fmfeedcompar(const void *indexa, const void *indexb);
int fmsynthesizecompar(const void *indexa, const void *indexb);
int fmdealfoodcompar(const void *indexa, const void *indexb);
int fmpkcompar(const void *indexa, const void *indexb);
int CheckFM(int *index, char *fmname, int fmindex);
int CheckFMUse(int index);
void setFamilyFileDataToArg(int index, char *data);
void setMemberFileDataToArg(int index, int memberindex, char *databuf);
// sortFamily: call this after family loaded
void sortFamily(void)
{
int i;
for(i = 0; i < MAX_FAMILY; i++)
{
#ifdef _PERSONAL_FAME // Arminius: 家族個人聲望
fmtotalfameindex[i] = i;
#endif
#ifdef _NEW_MANOR_LAW
fmMomentumIndex[i] = i;
#endif
fmpopularindex[i] = i;
fmadvindex[i] = i;
fmfeedindex[i] = i;
fmsynthesizeindex[i] = i;
fmdealfoodindex[i] = i;
fmpkindex[i] = i;
}
#ifdef _PERSONAL_FAME // Arminius: 家族個人聲望
qsort(fmtotalfameindex, MAX_FAMILY, sizeof(int), &fmtotalfamecompar);
#endif
qsort(fmpopularindex, MAX_FAMILY, sizeof(int), &fmpopularcompar);
qsort(fmadvindex, MAX_FAMILY, sizeof(int), &fmadvcompar);
qsort(fmfeedindex, MAX_FAMILY, sizeof(int), &fmfeedcompar);
qsort(fmsynthesizeindex, MAX_FAMILY, sizeof(int), &fmsynthesizecompar);
qsort(fmdealfoodindex, MAX_FAMILY, sizeof(int), &fmdealfoodcompar);
qsort(fmpkindex, MAX_FAMILY, sizeof(int), &fmpkcompar);
#ifdef _NEW_MANOR_LAW
qsort(fmMomentumIndex,MAX_FAMILY,sizeof(int),&fmMomentumcompar);
#endif
}
#ifdef _PERSONAL_FAME // Arminius: 家族個人聲望
int fmtotalfamecompar(const void *indexa, const void *indexb)
{
int famea,fameb;
if ( CheckFMUse(* (int*) indexa)==0 ) return 1; // empty record
if ( CheckFMUse(* (int*) indexb)==0 ) return -1;
famea = family[ * (int*) indexa ].fmtotalfame;
fameb = family[ * (int*) indexb ].fmtotalfame;
return (famea>fameb)? -1 : 1;
}
#endif
#ifdef _NEW_MANOR_LAW
int fmMomentumcompar(const void *indexa, const void *indexb)
{
int momentumA,momentumB;
if(CheckFMUse(*(int*)indexa) == 0) return 1; // empty record
if(CheckFMUse(*(int*)indexb) == 0) return -1;
momentumA = family[*(int*)indexa].fmmomentum;
momentumB = family[*(int*)indexb].fmmomentum;
return (momentumA > momentumB) ? -1:1;
}
#endif
int fmpopularcompar(const void *indexa, const void *indexb)
{
int fmpopulara,fmpopularb;
if ( CheckFMUse(* (int*) indexa)==0 ) return 1; // empty record
if ( CheckFMUse(* (int*) indexb)==0 ) return -1;
fmpopulara = family[ * (int*) indexa ].fmpopular;
fmpopularb = family[ * (int*) indexb ].fmpopular;
re
评论1