1070 lines
30 KiB
C
1070 lines
30 KiB
C
#include "version.h"
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <ctype.h>
|
||
#include <time.h>
|
||
#ifdef _REDHAT_V9
|
||
#include <errno.h>
|
||
#endif
|
||
|
||
#include "title.h"
|
||
#include "char.h"
|
||
#include "char_base.h"
|
||
#include "item.h"
|
||
#include "skill.h"
|
||
#include "buf.h"
|
||
#include "util.h"
|
||
#include "configfile.h"
|
||
|
||
|
||
/*====================称号表 ====================*/
|
||
static int TITLE_IntCheck( int charaindex,int elem, int *data, int flg);
|
||
static int TITLE_WorkIntCheck( int charaindex,int elem, int *data, int flg);
|
||
static int TITLE_ItemCheck( int charaindex,int elem, int *data, int flg);
|
||
static int TITLE_ItemEquipCheck( int charaindex,int elem, int *data, int flg);
|
||
static int TITLE_SkillCheck( int charaindex,int elem, int *data, int flg);
|
||
static int TITLE_SexCheck( int charaindex,int elem, int *data, int flg);
|
||
|
||
typedef enum
|
||
{
|
||
TITLE_FUNCTYPENONE, /* 関数生成しない */
|
||
TITLE_FUNCTYPEUSERFUNC, /* definefunction を使って名前を作る
|
||
* 関数の引数は
|
||
* int キャラインデックス
|
||
* buf 名前へのバッファ
|
||
* buflen そのバッファの長さ
|
||
*/
|
||
TITLE_USEFUNCTYPENUM
|
||
}TITLE_USEFUNCTYPE;
|
||
|
||
typedef struct tagTITLE_Table
|
||
{
|
||
int index; /* 旧データと互換を取るため。
|
||
* この番号でもってaddtitleとかやる
|
||
*/
|
||
char name[32];
|
||
TITLE_USEFUNCTYPE functype;
|
||
void (*definefunction)(int,char* buf,int buflen);
|
||
}TITLE_Table;
|
||
|
||
/* 使えるパラメータ
|
||
* STR,TGH,MAXMP,ATK,DEF
|
||
* LEVEL,CLASS,SKILL,ITEM,FIREREG,ICEREG,THUNDERREG
|
||
* KANJILV,TALKCNT,WALKCNT,DEADCNT,LOGINCNT,BASEIMAGENUMBER
|
||
* GOLD
|
||
*/
|
||
|
||
typedef struct tagTITLE_Compare {
|
||
char compare[8];;
|
||
} TITLE_COMPARE;
|
||
|
||
TITLE_COMPARE TITLE_compare[] = { {"<="}, {">="},{"<>"}, {">"},{"<"},{"="}};
|
||
|
||
typedef struct tagTITLE_PARAM
|
||
{
|
||
int element;
|
||
int (*checkfunc)( int charaindex,int elem, int *data, int flg );
|
||
char *paramname;
|
||
}TITLE_PARAM;
|
||
|
||
TITLE_PARAM TITLE_param[] =
|
||
{
|
||
/**** ここから ****/
|
||
{ -1, TITLE_ItemCheck, "ITEM" },
|
||
{ -1, TITLE_ItemEquipCheck,"EQUIPITEM" },
|
||
{ -1, NULL, "EQUIPEVENT" },
|
||
/**** ここまでは変更しないでください ****/
|
||
{ -1, TITLE_SkillCheck, "SKILL" },
|
||
{ CHAR_STR, TITLE_IntCheck, "STR" },
|
||
{ CHAR_TOUGH, TITLE_IntCheck, "TGH" },
|
||
{ CHAR_MAXMP, TITLE_IntCheck, "MAXMP" },
|
||
{ CHAR_WORKFIXSTR, TITLE_WorkIntCheck, "ATK" },
|
||
{ CHAR_WORKFIXTOUGH, TITLE_WorkIntCheck, "DEF" },
|
||
{ CHAR_LV, TITLE_IntCheck, "LEVEL" },
|
||
{ CHAR_TALKCOUNT, TITLE_IntCheck, "TALKCNT" },
|
||
{ CHAR_WALKCOUNT, TITLE_IntCheck, "WALKCNT" },
|
||
{ CHAR_DEADCOUNT, TITLE_IntCheck, "DEADCNT" },
|
||
{ CHAR_LOGINCOUNT, TITLE_IntCheck, "LOGINCNT" },
|
||
{ CHAR_BASEBASEIMAGENUMBER,TITLE_IntCheck, "BASEIMAGENUMBER" },
|
||
{ CHAR_GOLD, TITLE_IntCheck, "GOLD" },
|
||
{ -1, TITLE_SexCheck, "SEX" },
|
||
};
|
||
|
||
#define TITLE_PARAMSIZE 20
|
||
typedef struct tagTITLE_configTable
|
||
{
|
||
int paramindex[20]; /* TITLE_paramへの添字 */
|
||
int param[20][TITLE_PARAMSIZE]; /* 評価値 */
|
||
int compareflg[20]; /* ><=等どうするか */
|
||
int title;
|
||
BOOL equipcheckflg; /*
|
||
* アイテム移動イベントではこのフラグの立っている
|
||
* ものしか検索しない。
|
||
*/
|
||
}TITLE_CONFIGTABLE;
|
||
|
||
typedef struct tagTITLE_configbuf
|
||
{
|
||
int title;
|
||
int flg;
|
||
}TITLE_CONFIGBUF;
|
||
|
||
static TITLE_CONFIGTABLE *TITLE_ConfigTable;
|
||
static TITLE_Table *TITLE_table;
|
||
static TITLE_CONFIGBUF *TITLE_configbuf;
|
||
static int TITLE_titlenum;
|
||
static int TITLE_titlecfgnum;
|
||
|
||
/*------------------------------------------------------------
|
||
* index番号からTITLE_tableの添字を得る
|
||
------------------------------------------------------------*/
|
||
int TITLE_getTitleIndex( int index)
|
||
{
|
||
int i;
|
||
if( index < 0 ) return -1;
|
||
for( i = 0; i < TITLE_titlenum; i ++ ) {
|
||
if( TITLE_table[i].index == index ) {
|
||
return( i);
|
||
}
|
||
}
|
||
return -1;
|
||
}
|
||
|
||
/* バッファのサイズ */
|
||
#define TITLESTRINGBUFSIZ 256
|
||
/* クライアントに見せるスキルデータの文字列のバッファ */
|
||
static char TITLE_statusStringBuffer[TITLESTRINGBUFSIZ];
|
||
/*------------------------------------------------------------
|
||
* クライアントに見せる称号の文字列を作る
|
||
* 引数
|
||
* title Title* スキル
|
||
* charaindex int この称号を持っているキャラのインデックス
|
||
* 返り値
|
||
* char*
|
||
------------------------------------------------------------*/
|
||
char* TITLE_makeTitleStatusString( int charaindex,int havetitleindex )
|
||
{
|
||
int attach;
|
||
int index;
|
||
/* 関数表へのインデックスからデータを作成する */
|
||
index = CHAR_getCharHaveTitle( charaindex,havetitleindex );
|
||
|
||
attach = TITLE_getTitleIndex( index);
|
||
if( attach == -1 ) {
|
||
TITLE_statusStringBuffer[0] = '\0';
|
||
return TITLE_statusStringBuffer;
|
||
}
|
||
switch( TITLE_table[attach].functype ){
|
||
case TITLE_FUNCTYPENONE:
|
||
snprintf( TITLE_statusStringBuffer,
|
||
sizeof(TITLE_statusStringBuffer ),"%s" ,
|
||
TITLE_table[attach].name );
|
||
break;
|
||
|
||
case TITLE_FUNCTYPEUSERFUNC:
|
||
{
|
||
char string[256]={""};
|
||
void (*function)(int,char* buf,int buflen);
|
||
function = TITLE_table[attach].definefunction;
|
||
if( function )
|
||
function( charaindex,string,sizeof(string) );
|
||
|
||
strcpysafe( TITLE_statusStringBuffer,
|
||
sizeof(TITLE_statusStringBuffer ),string );
|
||
}
|
||
break;
|
||
default:
|
||
TITLE_statusStringBuffer[0] = '\0';
|
||
return TITLE_statusStringBuffer;
|
||
break;
|
||
}
|
||
return TITLE_statusStringBuffer;
|
||
}
|
||
|
||
/*------------------------------------------------------------
|
||
* ない称号の文字列データを返す
|
||
* 引数
|
||
* なし
|
||
* 返り値
|
||
* char*
|
||
------------------------------------------------------------*/
|
||
char* TITLE_makeSkillFalseString( void )
|
||
{
|
||
TITLE_statusStringBuffer[0]= '\0';
|
||
return TITLE_statusStringBuffer;
|
||
}
|
||
|
||
|
||
/*------------------------------------------------------------
|
||
* 指定された番号の称号を追加する。重さなっていたら、追加しない
|
||
* 引数
|
||
* charaindex int キャラインデックス
|
||
* titleindex int 称号インデックス
|
||
* 返り値
|
||
* 追加したindex
|
||
* 追加しなかった FALSE(0)
|
||
------------------------------------------------------------*/
|
||
BOOL TITLE_addtitle( int charaindex, int titleindex )
|
||
{
|
||
int i;
|
||
int firstfindempty=-1;
|
||
|
||
if( CHAR_CHECKINDEX(charaindex) == FALSE )return FALSE;
|
||
/*if( TITLE_CHECKTABLEINDEX(titleindex) == FALSE )return FALSE;*/
|
||
if( TITLE_getTitleIndex( titleindex) == -1 ) return FALSE;
|
||
|
||
for( i=0 ; i < CHAR_TITLEMAXHAVE ; i++ ){
|
||
if( CHAR_getCharHaveTitle( charaindex,i ) == titleindex )
|
||
/* すでに持っているから何もしない */
|
||
return FALSE;
|
||
if( firstfindempty == -1
|
||
&& CHAR_getCharHaveTitle(charaindex,i) == -1 ){
|
||
firstfindempty = i;
|
||
}
|
||
}
|
||
return CHAR_setCharHaveTitle( charaindex,firstfindempty,titleindex );
|
||
}
|
||
|
||
|
||
/*------------------------------------------------------------
|
||
* 指定された番号の称号があったら削除する。なかったら何もしない。
|
||
* 複数個あったら全部消す。
|
||
* 引数
|
||
* charaindex int キャラインデックス
|
||
* titleindex int 称号インデックス
|
||
* 返り値
|
||
* 削除した TRUE(1)
|
||
* 削除しなかった FALSE(0)
|
||
------------------------------------------------------------*/
|
||
BOOL TITLE_deltitle( int charaindex, int titleindex )
|
||
{
|
||
int i;
|
||
BOOL del=FALSE;
|
||
int index;
|
||
if( CHAR_CHECKINDEX(charaindex) == FALSE )return FALSE;
|
||
/*if( TITLE_CHECKTABLEINDEX(titleindex) == FALSE )return FALSE;*/
|
||
index = TITLE_getTitleIndex( titleindex);
|
||
if( index == -1 ) return FALSE;
|
||
|
||
for( i=0 ; i < CHAR_TITLEMAXHAVE ; i++ )
|
||
if( CHAR_getCharHaveTitle( charaindex,i ) == titleindex ){
|
||
/* 自分が使っていたやつならば、それもなしにする */
|
||
if( CHAR_getInt(charaindex, CHAR_INDEXOFEQTITLE) == i ){
|
||
CHAR_setInt(charaindex, CHAR_INDEXOFEQTITLE, -1 );
|
||
}
|
||
/* 持っているから消す */
|
||
CHAR_setCharHaveTitle( charaindex,i,-1);
|
||
|
||
del = TRUE;
|
||
}
|
||
|
||
return del;
|
||
}
|
||
/*------------------------------------------------------------
|
||
* 称号の初期化をする。
|
||
* 引数
|
||
* filename char* 設定ファイル名
|
||
* 返り値
|
||
* 成功 TRUE(1)
|
||
* 失敗 FALSE(0)
|
||
*------------------------------------------------------------*/
|
||
BOOL TITLE_initTitleName( char* filename )
|
||
{
|
||
FILE* f;
|
||
char line[256];
|
||
int linenum=0;
|
||
int title_readlen=0;
|
||
|
||
f = fopen(filename,"r");
|
||
if( f == NULL ){
|
||
errorprint;
|
||
return FALSE;
|
||
}
|
||
|
||
TITLE_titlenum=0;
|
||
|
||
/* まず有効な行が何行あるかどうか調べる */
|
||
while( fgets( line, sizeof( line ), f ) ){
|
||
linenum ++;
|
||
if( line[0] == '#' )continue; /* comment */
|
||
if( line[0] == '\n' )continue; /* none */
|
||
chomp( line );
|
||
|
||
TITLE_titlenum++;
|
||
}
|
||
|
||
if( fseek( f, 0, SEEK_SET ) == -1 ){
|
||
fprint( "寻找错误\n" );
|
||
fclose(f);
|
||
return FALSE;
|
||
}
|
||
|
||
TITLE_table = allocateMemory( sizeof(struct tagTITLE_Table)
|
||
* TITLE_titlenum );
|
||
if( TITLE_table == NULL ){
|
||
fprint( "无法分配内存 %d\n" ,
|
||
sizeof(TITLE_table)*TITLE_titlenum);
|
||
fclose( f );
|
||
return FALSE;
|
||
}
|
||
/* 初期化 */
|
||
{
|
||
int i;
|
||
for( i = 0; i < TITLE_titlenum; i ++ ) {
|
||
TITLE_table[i].index = -1;
|
||
TITLE_table[i].name[0] = '\0';
|
||
TITLE_table[i].functype = TITLE_FUNCTYPENONE;
|
||
TITLE_table[i].definefunction = NULL;
|
||
}
|
||
|
||
}
|
||
|
||
/* また読み直す */
|
||
linenum = 0;
|
||
while( fgets( line, sizeof( line ), f ) ){
|
||
linenum ++;
|
||
if( line[0] == '#' )continue; /* comment */
|
||
if( line[0] == '\n' )continue; /* none */
|
||
chomp( line );
|
||
|
||
/* 行を整形する */
|
||
/* まず tab を " " に置き換える */
|
||
replaceString( line, '\t' , ' ' );
|
||
/* 先頭のスペースを取る。*/
|
||
|
||
{
|
||
int i;
|
||
char buf[256];
|
||
for( i = 0; i < strlen( line); i ++) {
|
||
if( line[i] != ' ' ) {
|
||
break;
|
||
}
|
||
strcpy( buf, &line[i]);
|
||
}
|
||
if( i != 0 ) {
|
||
strcpy( line, buf);
|
||
}
|
||
}
|
||
{
|
||
char token[256];
|
||
int ret;
|
||
|
||
/* ひとつめのトークンを見る */
|
||
ret = getStringFromIndexWithDelim( line,",",1,token,
|
||
sizeof(token));
|
||
if( ret==FALSE ){
|
||
fprint("文件语法错误:%s 第%d行\n",filename,linenum);
|
||
continue;
|
||
}
|
||
TITLE_table[title_readlen].index = atoi(token);
|
||
|
||
/* 2つめのトークンを見る */
|
||
ret = getStringFromIndexWithDelim( line,",",2,token,
|
||
sizeof(token));
|
||
if( ret==FALSE ){
|
||
fprint("文件语法错误:%s 第%d行\n",filename,linenum);
|
||
continue;
|
||
}
|
||
if( strlen( token) > sizeof( TITLE_table[title_readlen].name)-1) {
|
||
fprint("警告! 头衔名称结束文件:%s 第%d行\n",
|
||
filename, linenum);
|
||
}
|
||
strcpysafe( TITLE_table[title_readlen].name,
|
||
sizeof( TITLE_table[title_readlen].name),
|
||
token);
|
||
|
||
title_readlen ++;
|
||
}
|
||
}
|
||
fclose(f);
|
||
|
||
TITLE_titlenum = title_readlen;
|
||
|
||
print( "有效头衔名称数是 %d...", TITLE_titlenum );
|
||
|
||
#ifdef DEBUG
|
||
|
||
{
|
||
int i;
|
||
for( i=0; i <TITLE_titlenum ; i++ )
|
||
print( "头衔索引[%d] 名称[%s] \n",
|
||
TITLE_table[i].index,
|
||
TITLE_table[i].name);
|
||
}
|
||
#endif
|
||
return TRUE;
|
||
}
|
||
/*------------------------------------------------------------
|
||
* 称号の再初期化をする。
|
||
* 引数
|
||
* filename char* 設定ファイル名
|
||
* 返り値
|
||
* 成功 TRUE(1)
|
||
* 失敗 FALSE(0)
|
||
*------------------------------------------------------------*/
|
||
BOOL TITLE_reinitTitleName( void)
|
||
{
|
||
freeMemory( TITLE_table);
|
||
return(TITLE_initTitleName( getTitleNamefile()));
|
||
}
|
||
/*------------------------------------------------------------
|
||
* 称号設定の初期化をする。
|
||
* 引数
|
||
* filename char* 設定ファイル名
|
||
* 返り値
|
||
* 成功 TRUE(1)
|
||
* 失敗 FALSE(0)
|
||
*------------------------------------------------------------*/
|
||
static void TITLE_initTitleData( int array)
|
||
{
|
||
int j,k;
|
||
for( j = 0; j < arraysizeof( TITLE_ConfigTable[array].paramindex); j ++) {
|
||
for( k = 0; k < TITLE_PARAMSIZE; k++) {
|
||
TITLE_ConfigTable[array].param[j][k] = -1;
|
||
}
|
||
TITLE_ConfigTable[array].paramindex[j] = -1;
|
||
TITLE_ConfigTable[array].compareflg[j] = -1;
|
||
}
|
||
TITLE_ConfigTable[array].title = -1;
|
||
TITLE_ConfigTable[array].equipcheckflg = FALSE;
|
||
|
||
}
|
||
/*------------------------------------------------------------
|
||
* 複数行設定をまとめて1行にしてやる。読むのもここでする。
|
||
*------------------------------------------------------------*/
|
||
static int TITLE_getConfigOneLine( FILE *fp, char *line, int linelen)
|
||
{
|
||
char buf[1024];
|
||
int startflg = FALSE;
|
||
int linenum=0;
|
||
line[0] = '\0';
|
||
|
||
while( fgets( buf, sizeof( buf ), fp )){
|
||
linenum ++;
|
||
if( buf[0] == '#' )continue; /* comment */
|
||
if( buf[0] == '\n' )continue; /* none */
|
||
/* 行を整形する */
|
||
/* まず tab を " " に置き換える */
|
||
replaceString( buf, '\t' , ' ' );
|
||
/* スペース削除 */
|
||
deleteCharFromString( buf, " ");
|
||
|
||
if( buf[0] == '{' ) {
|
||
if( startflg == TRUE ) {
|
||
print( "titleconfig:明明没有关闭「{」却出现了: %d \n",linenum);
|
||
/* } */
|
||
return -1;
|
||
}
|
||
startflg = TRUE;
|
||
}
|
||
else if( buf[0] == '}' ) {
|
||
if( startflg == FALSE) {
|
||
print( "titleconfig:明明没有关闭「{」却出现了: %d \n",linenum);
|
||
/* } */
|
||
return -1;
|
||
}
|
||
return 1;
|
||
}
|
||
else {
|
||
/* "{"で既に始まっていたら }*/
|
||
if( startflg == TRUE ) {
|
||
if( strlen( line) != 0 ) {
|
||
if( line[strlen(line) -1] != ',' ) {
|
||
strcatsafe( line, linelen, ",");
|
||
}
|
||
}
|
||
/* 1行にまとめていく*/
|
||
chompex( buf );
|
||
strcatsafe( line,linelen, buf);
|
||
}
|
||
/* 有効行だが"{"ではじまってない場合はそのまま1行で返す }*/
|
||
else {
|
||
chompex( buf );
|
||
strcatsafe( line,linelen, buf);
|
||
return 1;
|
||
}
|
||
}
|
||
}
|
||
/* ここにくると言う事はEOF (好きじゃないコードだ) */
|
||
return 0;
|
||
}
|
||
static int TITLE_getParamData( int readarray, int array,char *src)
|
||
{
|
||
int cnt;
|
||
int ret;
|
||
char wk[64];
|
||
|
||
|
||
for( cnt = 1; ; cnt ++ ) {
|
||
ret = getStringFromIndexWithDelim( src,"|",cnt,wk, sizeof(wk));
|
||
if( ret ) {
|
||
TITLE_ConfigTable[readarray].param[array][cnt-1] = atoi(wk);
|
||
}
|
||
else {
|
||
break;
|
||
}
|
||
}
|
||
if( cnt == 1 ) {
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
char *getlocaltime()
|
||
{
|
||
static char timestr[40];
|
||
time_t t;
|
||
struct tm *nowtime;
|
||
time(&t);
|
||
nowtime = localtime(&t);
|
||
strftime(timestr,sizeof(timestr),"%Y-%m-%d %H:%M:%S",nowtime);
|
||
return timestr;
|
||
}
|
||
|
||
/*------------------------------------------------------------
|
||
* 称号設定の初期化をする。
|
||
* 引数
|
||
* filename char* 設定ファイル名
|
||
* 返り値
|
||
* 成功 TRUE(1)
|
||
* 失敗 FALSE(0)
|
||
*------------------------------------------------------------*/
|
||
BOOL TITLE_initTitleConfig( char* filename )
|
||
{
|
||
FILE* f;
|
||
char line[1024];
|
||
int linenum=0;
|
||
int titlecfg_readlen=0;
|
||
|
||
f = fopen(filename,"r");
|
||
if( f == NULL ){
|
||
errorprint;
|
||
return FALSE;
|
||
}
|
||
|
||
TITLE_titlecfgnum=0;
|
||
|
||
/* まず有効な行が何行あるかどうか調べる */
|
||
/*while( fgets( line, sizeof( line ), f ) ){}*/
|
||
while( 1 ) {
|
||
int rc;
|
||
rc = TITLE_getConfigOneLine( f, line, sizeof(line));
|
||
if( rc == 0 ) break;
|
||
if( rc == -1 ) continue;
|
||
|
||
TITLE_titlecfgnum++;
|
||
}
|
||
|
||
if( fseek( f, 0, SEEK_SET ) == -1 ){
|
||
fprint( "Seek Error\n" );
|
||
fclose(f);
|
||
return FALSE;
|
||
}
|
||
|
||
TITLE_ConfigTable = allocateMemory( sizeof(struct tagTITLE_configTable)
|
||
* TITLE_titlecfgnum );
|
||
if( TITLE_ConfigTable == NULL ){
|
||
fprint( "Can't allocate Memory %d\n" ,
|
||
sizeof(TITLE_ConfigTable)*TITLE_titlecfgnum);
|
||
fclose( f );
|
||
return FALSE;
|
||
}
|
||
/* 初期化 */
|
||
{
|
||
int i;
|
||
for( i = 0; i < TITLE_titlecfgnum; i ++ ) {
|
||
TITLE_initTitleData( i);
|
||
}
|
||
}
|
||
TITLE_configbuf = allocateMemory( sizeof(TITLE_CONFIGBUF) * TITLE_titlecfgnum );
|
||
if( TITLE_configbuf == NULL ){
|
||
fprint( "Can't allocate Memory %d\n" ,
|
||
sizeof(TITLE_CONFIGBUF)*TITLE_titlecfgnum);
|
||
fclose( f );
|
||
return FALSE;
|
||
}
|
||
|
||
/* また読み直す */
|
||
linenum = 0;
|
||
/*while( fgets( line, sizeof( line ), f ) ){}*/
|
||
while( 1) {
|
||
int rc;
|
||
rc = TITLE_getConfigOneLine( f, line, sizeof(line));
|
||
if( rc == 0 ) break;
|
||
if( rc == -1 ) continue;
|
||
|
||
linenum ++;
|
||
|
||
{
|
||
char token[256];
|
||
int ret;
|
||
int i , j ;
|
||
int comppos;
|
||
BOOL errflg =FALSE;
|
||
for( i = 1; ; i ++ ){
|
||
/* トークンを見る */
|
||
ret = getStringFromIndexWithDelim( line,",",i,token,
|
||
sizeof(token));
|
||
if( ret == FALSE ){
|
||
break;
|
||
}
|
||
/* 大文字に変換 */
|
||
for( j = 0; j < strlen( token); j ++ ) {
|
||
token[j] = toupper( token[j]);
|
||
}
|
||
/* 称号指定を調べる */
|
||
if( strncmp( "TITLE", token, 5) == 0 ) {
|
||
char buf[64];
|
||
ret = getStringFromIndexWithDelim( token,"=",2,buf,
|
||
sizeof(buf));
|
||
if( ret == FALSE) {
|
||
fprint("文件语法错误:%s 第%d行\n",filename,linenum);
|
||
TITLE_initTitleData( titlecfg_readlen);
|
||
errflg = TRUE;
|
||
break;
|
||
}
|
||
TITLE_ConfigTable[titlecfg_readlen].title = atoi( buf);
|
||
}
|
||
else {
|
||
/*パラメータ指定を読む */
|
||
for( j = 0; j < arraysizeof( TITLE_param); j ++ ) {
|
||
if( strncmp( TITLE_param[j].paramname,
|
||
token,
|
||
strlen( TITLE_param[j].paramname))
|
||
== 0 )
|
||
{
|
||
TITLE_ConfigTable[titlecfg_readlen].paramindex[i-1] = j;
|
||
/* 装備イベントで称号をチェックするフラグを立てる。 */
|
||
if( j == 0 || j == 1 || j == 2) {
|
||
TITLE_ConfigTable[titlecfg_readlen].equipcheckflg = TRUE;
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
/* パラメータが変なのを指定された */
|
||
if( j == arraysizeof( TITLE_param) ) {
|
||
fprint("文件语法错误:%s 第%d行\n",
|
||
filename,linenum);
|
||
TITLE_initTitleData( titlecfg_readlen);
|
||
errflg = TRUE;
|
||
break;
|
||
}
|
||
/* 等号,不等号が存在するか調べる */
|
||
comppos = charInclude( token, "<>=");
|
||
if( comppos == -1 ) {
|
||
fprint("文件语法错误:%s 第%d行\n",filename,linenum);
|
||
TITLE_initTitleData( titlecfg_readlen);
|
||
errflg = TRUE;
|
||
break;;
|
||
}
|
||
/* 等号,不等号が2つ以上有るとき */
|
||
if( charInclude( &token[comppos+1], "<>=") != -1 ) {
|
||
/* どんな比較かを読む */
|
||
for( j = 0; j < 3; j ++ ) {
|
||
if( memcmp( TITLE_compare[j].compare, &token[comppos], 2 ) == 0 ) {
|
||
break;
|
||
}
|
||
}
|
||
if( j == 3 ) {
|
||
fprint("文件语法错误:%s 第%d行\n",filename,linenum);
|
||
TITLE_initTitleData( titlecfg_readlen);
|
||
errflg = TRUE;
|
||
break;
|
||
}
|
||
else {
|
||
ret = TITLE_getParamData( titlecfg_readlen,i-1,&token[comppos+2]);
|
||
if( !ret ) {
|
||
fprint("文件语法错误:%s 第%d行\n",filename,linenum);
|
||
TITLE_initTitleData( titlecfg_readlen);
|
||
errflg = TRUE;
|
||
break;
|
||
}
|
||
|
||
/*TITLE_ConfigTable[titlecfg_readlen].param[i-1]
|
||
= atoi( &token[comppos+2]);*/
|
||
TITLE_ConfigTable[titlecfg_readlen].compareflg[i-1] = j;
|
||
}
|
||
}
|
||
else {
|
||
ret = TITLE_getParamData( titlecfg_readlen,i-1,&token[comppos+1]);
|
||
if( !ret ) {
|
||
fprint("文件语法错误:%s 第%d行\n",filename,linenum);
|
||
TITLE_initTitleData( titlecfg_readlen);
|
||
errflg = TRUE;
|
||
break;
|
||
}
|
||
/*TITLE_ConfigTable[titlecfg_readlen].param[i-1]
|
||
= atoi( &token[comppos+1]);*/
|
||
/* どんな比較かを読む */
|
||
for( j = 3; j < 6; j ++ ) {
|
||
if( memcmp( TITLE_compare[j].compare, &token[comppos], 1 ) == 0 ) {
|
||
TITLE_ConfigTable[titlecfg_readlen].compareflg[i-1] = j;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
/* 称号名指定が無かった or なんかしらのエラー*/
|
||
if( errflg || TITLE_ConfigTable[titlecfg_readlen].title == -1 ) {
|
||
fprint("文件语法错误:%s 第%d行\n",filename,linenum);
|
||
TITLE_initTitleData( titlecfg_readlen);
|
||
}
|
||
else {
|
||
titlecfg_readlen ++;
|
||
}
|
||
}
|
||
}
|
||
fclose(f);
|
||
|
||
TITLE_titlecfgnum = titlecfg_readlen;
|
||
|
||
print( "有效头衔配置数是 %d...", TITLE_titlecfgnum );
|
||
|
||
return TRUE;
|
||
}
|
||
/*------------------------------------------------------------
|
||
* 称号設定に合うか調べて称号を与える。
|
||
* 引数
|
||
* charaindex int キャラインデックス
|
||
* mode BOOL TRUE:item=のもののみ調べる FALSE:全部
|
||
* 返り値
|
||
* TRUE: 称号に変化有り。
|
||
* FALSE:何も無かった。
|
||
*------------------------------------------------------------*/
|
||
static BOOL TITLE_TitleCheck_Main( int charaindex, BOOL mode, int *addcnt, int *delcnt)
|
||
{
|
||
int i, j,k, ret;
|
||
|
||
/* 初期化 */
|
||
{
|
||
int i;
|
||
for( i = 0; i < TITLE_titlecfgnum && TITLE_configbuf[i].title != -1; i ++ ) {
|
||
TITLE_configbuf[i].title = -1;
|
||
TITLE_configbuf[i].flg = 0;
|
||
}
|
||
}
|
||
*addcnt = 0;
|
||
*delcnt = 0;
|
||
|
||
for( i = 0; i < TITLE_titlecfgnum; i ++ ) {
|
||
int rc = TRUE;
|
||
int title = TITLE_ConfigTable[i].title;
|
||
if( mode == TRUE ) {
|
||
if( TITLE_ConfigTable[i].equipcheckflg != TRUE ) {
|
||
continue;
|
||
}
|
||
}
|
||
for( j = 0;
|
||
j < arraysizeof( TITLE_ConfigTable[i].param) &&
|
||
TITLE_ConfigTable[i].param[j][0] != -1 ;
|
||
j ++ )
|
||
{
|
||
int index = TITLE_ConfigTable[i].paramindex[j];
|
||
if( TITLE_param[index].checkfunc != NULL ) {
|
||
rc = TITLE_param[index].checkfunc(
|
||
charaindex,
|
||
TITLE_param[index].element,
|
||
TITLE_ConfigTable[i].param[j],
|
||
TITLE_ConfigTable[i].compareflg[j]
|
||
);
|
||
if( rc != TRUE ) break;
|
||
}
|
||
}
|
||
/* 複数条件に同じ称号が割り当てられている時の為に,
|
||
* 一旦バッファに貯めてその結果からadd,deltileする
|
||
*/
|
||
for( k = 0; k < TITLE_titlecfgnum; k ++ ) {
|
||
if( TITLE_configbuf[k].title == title ) {
|
||
if( rc ) {
|
||
TITLE_configbuf[k].flg = 1;
|
||
}
|
||
break;
|
||
}
|
||
else if( TITLE_configbuf[k].title == -1 ) {
|
||
TITLE_configbuf[k].title = title;
|
||
TITLE_configbuf[k].flg = rc ? 1: -1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
ret = FALSE;
|
||
for( i = 0; i < TITLE_titlecfgnum && TITLE_configbuf[i].title != -1; i ++ ) {
|
||
if( TITLE_configbuf[i].flg == -1 ) {
|
||
*delcnt += TITLE_deltitle( charaindex, TITLE_configbuf[i].title);
|
||
}
|
||
else {
|
||
*addcnt += TITLE_addtitle( charaindex, TITLE_configbuf[i].title) ? 1:0;
|
||
}
|
||
}
|
||
if( *delcnt > 0 || *addcnt > 0) {
|
||
ret = TRUE;
|
||
}
|
||
return ret;
|
||
|
||
}
|
||
/*------------------------------------------------------------
|
||
* 称号設定に合うか調べて称号を与える。
|
||
* 引数
|
||
* charaindex int キャラインデックス
|
||
* mode BOOL TRUE:item=のもののみ調べる FALSE:全部
|
||
* 返り値
|
||
* TRUE: 称号に変化有り。
|
||
* FALSE:何も無かった。
|
||
*------------------------------------------------------------*/
|
||
BOOL TITLE_TitleCheck( int charaindex, BOOL mode)
|
||
{
|
||
#define TITLE_MSGUNIT1 "TSU"
|
||
#define TITLE_MSGUNIT2 "KO"
|
||
int addcnt,delcnt;
|
||
BOOL rc;
|
||
char msgbuf[64];
|
||
rc = TITLE_TitleCheck_Main( charaindex, mode, &addcnt,&delcnt);
|
||
if( rc ) {
|
||
if( delcnt > 0 ) {
|
||
snprintf( msgbuf, sizeof( msgbuf),
|
||
"失去%d%s 称号!", delcnt,
|
||
delcnt < 10 ? TITLE_MSGUNIT1:TITLE_MSGUNIT2);
|
||
CHAR_talkToCli( charaindex, -1, msgbuf, CHAR_COLORYELLOW);
|
||
}
|
||
if( addcnt > 0 ) {
|
||
snprintf( msgbuf, sizeof( msgbuf),
|
||
"获得%d%s 称号!", addcnt,
|
||
addcnt < 10 ? TITLE_MSGUNIT1:TITLE_MSGUNIT2);
|
||
CHAR_talkToCli( charaindex, -1, msgbuf, CHAR_COLORYELLOW);
|
||
}
|
||
}
|
||
return rc;
|
||
}
|
||
/*------------------------------------------------------------
|
||
* 称号設定に合うか調べて称号を与える。
|
||
* 引数
|
||
* charaindex int キャラインデックス
|
||
* mode BOOL TRUE:item=のもののみ調べる FALSE:全部
|
||
* 返り値
|
||
* TRUE: 称号に変化有り。
|
||
* FALSE:何も無かった。
|
||
*------------------------------------------------------------*/
|
||
BOOL TITLE_TitleCheck_Nomsg( int charaindex, BOOL mode, int *addcnt, int *delcnt)
|
||
{
|
||
return( TITLE_TitleCheck_Main( charaindex, mode, addcnt,delcnt));
|
||
}
|
||
|
||
|
||
static int TITLE_IntCheck( int charaindex, int elem, int *data, int flg)
|
||
{
|
||
int rc = FALSE;
|
||
int i;
|
||
for( i = 0; i < TITLE_PARAMSIZE && *(data+i) != -1; i ++ ) {
|
||
switch( flg) {
|
||
case 0: /* "<=" */
|
||
if( CHAR_getInt( charaindex, elem) <= *(data+i) ) rc = TRUE;
|
||
break;
|
||
case 1: /* ">=" */
|
||
if( CHAR_getInt( charaindex, elem) >= *(data+i) ) rc = TRUE;
|
||
break;
|
||
case 2: /* "<>" */
|
||
if( CHAR_getInt( charaindex, elem) != *(data+i) ) rc = TRUE;
|
||
break;
|
||
case 3: /* ">" */
|
||
if( CHAR_getInt( charaindex, elem) > *(data+i) ) rc = TRUE;
|
||
break;
|
||
case 4: /* "<" */
|
||
if( CHAR_getInt( charaindex, elem) < *(data+i) ) rc = TRUE;
|
||
break;
|
||
case 5: /* "=" */
|
||
if( CHAR_getInt( charaindex, elem) == *(data+i) ) rc = TRUE;
|
||
break;
|
||
default:
|
||
rc= FALSE;
|
||
break;
|
||
}
|
||
if( rc) break;
|
||
}
|
||
return rc;
|
||
}
|
||
static int TITLE_WorkIntCheck( int charaindex,int elem, int *data, int flg)
|
||
{
|
||
int rc = FALSE;
|
||
int i;
|
||
for( i = 0; i < TITLE_PARAMSIZE && *(data+i) != -1; i ++ ) {
|
||
switch( flg) {
|
||
case 0: /* "<=" */
|
||
if( CHAR_getWorkInt( charaindex, elem) <= *(data+i) ) rc = TRUE;
|
||
break;
|
||
case 1: /* ">=" */
|
||
if( CHAR_getWorkInt( charaindex, elem) >= *(data+i) ) rc = TRUE;
|
||
break;
|
||
case 2: /* "<>" */
|
||
if( CHAR_getWorkInt( charaindex, elem) != *(data+i) ) rc = TRUE;
|
||
break;
|
||
case 3: /* ">" */
|
||
if( CHAR_getWorkInt( charaindex, elem) > *(data +i)) rc = TRUE;
|
||
break;
|
||
case 4: /* "<" */
|
||
if( CHAR_getWorkInt( charaindex, elem) < *(data+i) ) rc = TRUE;
|
||
break;
|
||
case 5: /* "=" */
|
||
if( CHAR_getWorkInt( charaindex, elem) == *(data+i) ) rc = TRUE;
|
||
break;
|
||
default:
|
||
rc= FALSE;
|
||
break;
|
||
}
|
||
if( rc ) break;
|
||
}
|
||
return rc;
|
||
}
|
||
/* --------------------------------------
|
||
* 指定されたdataと持っているアイテムを比較する
|
||
* -------------------------------------*/
|
||
static int TITLE_ItemCheckMain( int charaindex, int itemhaveindex, int *data, int flg)
|
||
{
|
||
int i,j;
|
||
int rc = FALSE;
|
||
|
||
if( flg == 2 ) rc = TRUE;
|
||
|
||
for( j = 0; j < TITLE_PARAMSIZE && *(data+j) != -1; j ++ ) {
|
||
for( i =0; i < itemhaveindex; i ++ ) {
|
||
int itemindex = CHAR_getItemIndex(charaindex,i);
|
||
if( ITEM_CHECKINDEX(itemindex) ) {
|
||
switch( flg) {
|
||
case 0: /* "<=" */
|
||
if( ITEM_getInt( itemindex, ITEM_ID) <= *(data+j) ) rc = TRUE;
|
||
break;
|
||
case 1: /* ">=" */
|
||
if( ITEM_getInt( itemindex, ITEM_ID) >= *(data+j) ) rc = TRUE;
|
||
break;
|
||
case 3: /* ">" */
|
||
if( ITEM_getInt( itemindex, ITEM_ID) > *(data +j)) rc = TRUE;
|
||
break;
|
||
case 4: /* "<" */
|
||
if( ITEM_getInt( itemindex, ITEM_ID) < *(data +j)) rc = TRUE;
|
||
break;
|
||
case 5: /* "=" */
|
||
if( ITEM_getInt( itemindex, ITEM_ID) == *(data +j)) rc = TRUE;
|
||
break;
|
||
/* これだけ特別扱い。
|
||
* アイテム全部を見てそれを持っていなかったら真とする。
|
||
* ここでは持っている事を偽としてチェック
|
||
*/
|
||
case 2: /* "<>" */
|
||
if( ITEM_getInt( itemindex, ITEM_ID) == *(data +j)) rc = FALSE;
|
||
break;
|
||
default:
|
||
rc= FALSE;
|
||
break;
|
||
}
|
||
if( rc && flg != 2) break;
|
||
}
|
||
}
|
||
if( rc) break;
|
||
}
|
||
return rc;
|
||
}
|
||
|
||
|
||
static int TITLE_ItemCheck( int charaindex,int elem, int *data, int flg)
|
||
{
|
||
return( TITLE_ItemCheckMain( charaindex, CHAR_MAXITEMHAVE,data,flg));
|
||
}
|
||
|
||
static int TITLE_ItemEquipCheck( int charaindex,int elem, int *data, int flg)
|
||
{
|
||
return( TITLE_ItemCheckMain( charaindex, CHAR_EQUIPPLACENUM,data,flg));
|
||
}
|
||
|
||
static int TITLE_SkillCheck( int charaindex,int elem, int *data, int flg)
|
||
{
|
||
int i;
|
||
int rc = FALSE;
|
||
CHAR_HaveSkill* hskill;
|
||
|
||
for( i = 0 ; i < CHAR_SKILLMAXHAVE ; i ++ ){
|
||
hskill = CHAR_getCharHaveSkill( charaindex, i );
|
||
if( hskill != NULL && hskill->use == TRUE ) {
|
||
|
||
if( *(data + 1) != -2 ) {
|
||
if( SKILL_getInt( &hskill->skill, SKILL_IDENTITY) == *data) {
|
||
rc = TRUE;
|
||
break;
|
||
}
|
||
}
|
||
|
||
else {
|
||
if( SKILL_getInt( &hskill->skill, SKILL_IDENTITY) == *data) {
|
||
rc = FALSE;
|
||
break;
|
||
}
|
||
else {
|
||
rc = TRUE;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if( rc ) {
|
||
|
||
if( *(data+1) != -1 && *(data+1) != -2) {
|
||
rc = FALSE;
|
||
switch( flg) {
|
||
case 0: /* "<=" */
|
||
if( SKILL_getInt( &hskill->skill, SKILL_LEVEL) <= *(data+1) ) rc = TRUE;
|
||
break;
|
||
case 1: /* ">=" */
|
||
if( SKILL_getInt( &hskill->skill, SKILL_LEVEL) >= *(data+1) ) rc = TRUE;
|
||
break;
|
||
case 2: /* "<>" */
|
||
if( SKILL_getInt( &hskill->skill, SKILL_LEVEL) != *(data+1) ) rc = TRUE;
|
||
break;
|
||
case 3: /* ">" */
|
||
if( SKILL_getInt( &hskill->skill, SKILL_LEVEL) > *(data +1)) rc = TRUE;
|
||
break;
|
||
case 4: /* "<" */
|
||
if( SKILL_getInt( &hskill->skill, SKILL_LEVEL) < *(data+1) ) rc = TRUE;
|
||
break;
|
||
case 5: /* "=" */
|
||
if( SKILL_getInt( &hskill->skill, SKILL_LEVEL) == *(data+1) ) rc = TRUE;
|
||
break;
|
||
default:
|
||
rc= FALSE;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return rc;
|
||
}
|
||
/* --------------------------------------
|
||
* 男キャラか女キャラかチェックする。
|
||
* -------------------------------------*/
|
||
static int TITLE_SexCheck( int charaindex,int elem, int *data, int flg)
|
||
{
|
||
int i,j;
|
||
struct {
|
||
int sex[25];
|
||
}s_sex[] =
|
||
{ { { 30008,30009,30010,30011,30012,30013,30014,30015,
|
||
30020,30021,30022,30023,30024,30025,30026,30027,
|
||
30028,30029,30030,30031,30032,30033,30034,30035,-1}
|
||
},
|
||
{ {30000,30001,30002,30003,30004,30005,30006,30007,
|
||
30016,30017,30018,30019,30036,30037,30038,30039,
|
||
-1, -1, -1, -1, -1, -1, -1, -1, -1}
|
||
}
|
||
};
|
||
for( i = 0; i < 2; i ++ ) {
|
||
for( j = 0; s_sex[i].sex[j] != -1 ; j ++ ) {
|
||
if( CHAR_getInt( charaindex, CHAR_BASEBASEIMAGENUMBER )
|
||
== s_sex[i].sex[j] )
|
||
{
|
||
if( i == *data ) return TRUE;
|
||
else return FALSE;
|
||
}
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
|