StoneAge/gmsv/item/item_contract.c
2018-08-07 00:51:35 -07:00

252 lines
6.8 KiB
C

#include "version.h"
#ifdef _CONTRACT
#include <string.h> /* strstr */
#include <ctype.h> /* isdigit, isalnum */
#include "common.h"
#include "char.h"
#include "char_base.h"
#include "char_data.h"
#include "configfile.h"
#include "item.h"
#include "item_event.h"
#include "object.h"
#include "anim_tbl.h"
#include "magic.h"
#include "handletime.h"
#include "log.h"
#include "util.h"
#include "encount.h"
#include "battle.h"
#include "battle_item.h"
#include "lssproto_serv.h"
#include "net.h"
#include "pet.h"
#include "npcutil.h"
#include "enemy.h"
typedef struct{
int used;
char name[32];
char fmname[32];
} contractSignTag;
//ITEM_contractTable ITEM_contractTbl[MAX_CONTRACTTABLE];
static ITEM_contractTable *ITEM_contractTbl;
BOOL ITEM_initContractTable( )
{
//
FILE *fp;
char data[2048];
int i;
print("\读取 contract.txt ....");
ITEM_contractTbl = (ITEM_contractTable *)allocateMemory( sizeof(struct tagITEM_contract) * MAX_CONTRACTTABLE );
if( ITEM_contractTbl == NULL ){
fprint( "无法分配内存 %d\n" ,
sizeof(struct tagITEM_contract)*MAX_CONTRACTTABLE);
fclose( fp );
return FALSE;
}
memset( ITEM_contractTbl, 0 , sizeof(struct tagITEM_contract) * MAX_CONTRACTTABLE);
fp = fopen("data/contract.txt", "r");
if( fp == NULL ) {
print("\n无法读取 contract.txt!! ");
return FALSE;
}
for( i =0; i >MAX_CONTRACTTABLE; i++) {
ITEM_contractTbl[i].used = FALSE;
}
while(1) {
int ret;
int index;
char token[2048];
ret = fgets( data, sizeof(data), fp);
if( ret == NULL || ret == EOF)
break;
if( getStringFromIndexWithDelim( data, "|", 1, token, sizeof(token)) == TRUE) {
index = atoi( token);
if( index <0 || index >= MAX_CONTRACTTABLE) continue;
}
else { continue; }
if( getStringFromIndexWithDelim( data, "|", 2, token, sizeof(token)) == TRUE) {
ITEM_contractTbl[index].argnum = atoi( token);
}
else { continue; }
if( getStringFromIndexWithDelim( data, "|", 3, token, sizeof(token)) == TRUE) {
strcpy( ITEM_contractTbl[index].detail, token);
}
else { continue; }
ITEM_contractTbl[i].used = TRUE;
print("\n契约[%d] %d %s", index, ITEM_contractTbl[index].argnum, ITEM_contractTbl[index].detail);
}
fclose( fp);
return TRUE;
}
void ITEM_contract( int charaindex, int toindex, int haveitemindex)
{
int itemindex;
int conindex;
char data[2048+1024];
if( !CHAR_CHECKINDEX( charaindex ) ) return;
itemindex = CHAR_getItemIndex( charaindex, haveitemindex);
if( !ITEM_CHECKINDEX(itemindex) ) return;
//conindex = atoi( ITEM_getChar( itemundex, ITEM_CONTRACTNUM));
conindex = atoi( ITEM_getChar( itemindex, ITEM_ARGUMENT));
sprintf( data, "%s|%d|%s|%s", ITEM_contractTbl[conindex].detail,
ITEM_contractTbl[conindex].argnum,
ITEM_getChar( itemindex, ITEM_CONTRACTARG),
ITEM_getChar( itemindex, ITEM_CONTRACTTIME) );
print("\n contract_send:%s\n", data);
lssproto_WN_send( getfdFromCharaIndex( charaindex), WINDOW_MESSAGETYPE_CONTRACT,
WINDOW_BUTTONTYPE_YESNO,
CHAR_WINDOWTYPE_CONTRACT_ANSWER,
itemindex,
data );
}
void ITEM_contractSign( int fd, int itemindex, int signindex)
{
int charaindex;
int i;
int conIndex;
int complete =0;
int item_id;
char contractSignData[512];
contractSignTag contractSign[4];
print("\n contractSign:%d:%d ", itemindex, signindex);
charaindex = CONNECT_getCharaindex( fd );
if( !CHAR_CHECKINDEX(charaindex)) return;
if( signindex <0 || signindex >=4) return;
for( i=0 ; i<CHAR_MAXITEMHAVE ; i++ ){
if( CHAR_getItemIndex( charaindex,i ) == itemindex )
break;
}
if( i >= CHAR_MAXITEMHAVE ) return;
if( strcmp( ITEM_getChar( itemindex, ITEM_USEFUNC), "ITEM_contract") ) return;
conIndex = atoi( ITEM_getChar( itemindex, ITEM_ARGUMENT));
if( signindex >= ITEM_contractTbl[conIndex].argnum ) return;
strcpy( contractSignData, ITEM_getChar( itemindex, ITEM_CONTRACTARG) );
for( i=0; i<4; i++) contractSign[i].used = FALSE;
for( i=0; i<4; i++) {
int index;
char buf[512];
char token[32];
if( getStringFromIndexWithDelim( contractSignData, ",", i+1, buf, sizeof( buf )-1) == FALSE )
break;
if( strlen( buf) == 0) break;
getStringFromIndexWithDelim( buf, ":", 1, token, sizeof( token )-1 );
index = atoi( token);
if( index <0 || index >=4) break;
getStringFromIndexWithDelim( buf, ":", 2, contractSign[index].name, sizeof( contractSign[index].name )-1 );
getStringFromIndexWithDelim( buf, ":", 3, contractSign[index].fmname, sizeof( contractSign[index].fmname )-1 );
contractSign[index].used = TRUE;
}
if( contractSign[signindex].used == TRUE) return;
strcpy( contractSign[signindex].name, CHAR_getChar( charaindex, CHAR_NAME) );
strcpy( contractSign[signindex].fmname, CHAR_getChar( charaindex, CHAR_FMNAME) );
contractSign[signindex].used = TRUE;
// 检查是否完成契约
for( i =0; i<4; i++) {
if( contractSign[i].used == TRUE)
complete++;
}
if( complete >= ITEM_contractTbl[conIndex].argnum ) {
char buf[512];
if( CHAR_findEmptyItemBoxNo( charaindex ) < ITEM_contractTbl[conIndex].argnum -1 ) {
sprintf( buf, "要完成这个契约,请先准备%d个空道具栏位。", ITEM_contractTbl[conIndex].argnum -1);
CHAR_talkToCli( charaindex, -1, buf, CHAR_COLORYELLOW);
return;
}
}
strcpy( contractSignData, "");
for( i=0; i<4; i++) {
char buf[512];
if( contractSign[i].used == FALSE) continue;
sprintf( buf, "%d:%s:%s,", i, contractSign[i].name, contractSign[i].fmname);
strcat( contractSignData, buf);
}
ITEM_setChar( itemindex, ITEM_CONTRACTARG, contractSignData);
CHAR_talkToCli( charaindex, -1, "完成契约签名。", CHAR_COLORYELLOW);
// 完成契约
if( complete >= ITEM_contractTbl[conIndex].argnum ) {
struct tm *nowtime;
char timebuf[512];
// 纪录日期
nowtime = localtime( (time_t *)&NowTime.tv_sec );
sprintf( timebuf, "%04d年%02d月%02d日",
nowtime->tm_year +1900, nowtime->tm_mon+1, nowtime->tm_mday);
ITEM_setChar( itemindex, ITEM_CONTRACTTIME, timebuf);
CHAR_talkToCli( charaindex, -1, "完成所有签名,契约成立!", CHAR_COLORYELLOW);
// 复制契约
item_id = ITEM_getInt( itemindex, ITEM_ID);
for( i =0 ; i < ITEM_contractTbl[conIndex].argnum -1 ; i++)
{
int emptyindex;
int newitemindex;
emptyindex = CHAR_findEmptyItemBox( charaindex );
if( emptyindex < 0 ){
CHAR_talkToCli( charaindex, -1, "空间栏位不足。", CHAR_COLORYELLOW);
break;
}
newitemindex = ITEM_makeItemAndRegist( item_id );
if( newitemindex != -1 ){
CHAR_setItemIndex( charaindex, emptyindex, newitemindex );
ITEM_setWorkInt( newitemindex, ITEM_WORKOBJINDEX, -1);
ITEM_setWorkInt( newitemindex, ITEM_WORKCHARAINDEX, charaindex);
CHAR_sendItemDataOne( charaindex, emptyindex);
ITEM_setChar( newitemindex, ITEM_CONTRACTARG, contractSignData);
ITEM_setChar( newitemindex, ITEM_CONTRACTTIME, timebuf);
}
CHAR_talkToCli( charaindex, -1, "复制契约书。", CHAR_COLORYELLOW);
}
}
}
#endif