chuyiwen_gmsv/npc/npc_welfare.c

391 lines
10 KiB
C
Raw Permalink Normal View History

2016-12-24 08:45:52 +08:00
#include "version.h"
#ifdef _NPC_WELFARE
2017-01-13 23:37:03 +08:00
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
2016-12-24 08:45:52 +08:00
#include <string.h>
#include "char.h"
#include "object.h"
#include "char_base.h"
#include "npcutil.h"
#include "lssproto_serv.h"
#include "pet_skill.h"
#include "readmap.h"
#include "battle.h"
#include "profession_skill.h"
#include "chatmagic.h"
#include "npc_welfare.h"
#include "npc_exchangeman.h"
static void NPC_Welfare_selectWindow(int meindex, int toindex, int num, int select);
2017-01-13 23:37:03 +08:00
//载入好康NPC的初始化
2016-12-24 08:45:52 +08:00
BOOL NPC_WelfareInit( int meindex )
{
CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEWELFARE);
2017-01-13 23:37:03 +08:00
//print("名称:%s\n",CHAR_getChar( meindex, CHAR_NAME));
2016-12-24 08:45:52 +08:00
return TRUE;
}
2017-01-13 23:37:03 +08:00
//对话时的处理
2016-12-24 08:45:52 +08:00
void NPC_WelfareTalked( int meindex , int talkerindex , char *szMes ,int color )
{
if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) {
return;
}
if(NPC_Util_isFaceToFace(talkerindex,meindex,2 )==FALSE){
if( NPC_Util_CharDistance( talkerindex, meindex ) > 1) return;
}
NPC_Welfare_selectWindow( meindex, talkerindex,0,-1);
}
static void NPC_Welfare_selectWindow( int meindex, int toindex, int num,int select)
{
switch(num){
case 0:
//free
NPC_WelfareMakeStr(meindex, toindex, select);
break;
case 1:
break;
}
}
void NPC_WelfareWindowTalked( int meindex, int talkerindex,
int seqno, int select, char *data)
{
int skill, i, j;
int cost;
int skillID=0;
char buf[64];
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char msg[512];
char message[64];
int fd = getfdFromCharaIndex( talkerindex );
double rate= 1.0;
int skillarray;
int p_class=0, need_class=0;
int profession_skill_point;
memset( message, -1, sizeof(message) );
if( NPC_Util_CharDistance( talkerindex, meindex ) > 2) {
return;
}
if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){
print("GetArgStrErr");
return;
}
makeStringFromEscaped( data);
getStringFromIndexWithDelim(data,"|",1,buf,sizeof(buf));
skill=atoi(buf);
getStringFromIndexWithDelim(data,"|",2,buf,sizeof(buf));
cost=atoi(buf);
if( NPC_Util_GetStrFromStrWithDelim( argstr, "profession_skill", msg, sizeof( msg)) != NULL){
getStringFromIndexWithDelim(msg,",",skill,buf,sizeof(buf));
skillID=atoi(buf);
}
if(skillID < 0) return ;
if( CHAR_getWorkInt( CONNECT_getCharaindex(fd), CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) return ;
if( NPC_Util_GetStrFromStrWithDelim( argstr, "skill_rate", msg, sizeof( msg)) != NULL){
rate = atof( msg);
}
skillarray = PROFESSION_SKILL_getskillArray( skillID );
if(skillarray == -1){
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
return ;
}
2017-01-13 23:37:03 +08:00
// 判断职业
2016-12-24 08:45:52 +08:00
{
if( NPC_Util_GetStrFromStrWithDelim( argstr, "profession_class", msg, sizeof(msg) ) == NULL){
return ;
}else{
p_class = atoi(msg);
}
2017-01-13 23:37:03 +08:00
// 技能所需职业
2016-12-24 08:45:52 +08:00
need_class = PROFESSION_SKILL_getInt( skillarray, PROFESSION_SKILL_PROFESSION_CLASS );
if( CHAR_getInt( talkerindex, PROFESSION_CLASS ) == 0 ){
char token[256];
memset(token, -1, sizeof(token) );
2017-01-13 23:37:03 +08:00
sprintf( token, "您尚未就职!" );
2016-12-24 08:45:52 +08:00
CHAR_talkToCli( talkerindex, meindex, token, CHAR_COLORYELLOW);
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
return;
}
if( CHAR_getInt( talkerindex, PROFESSION_CLASS ) != need_class && need_class != 4 ){
char token[256];
memset(token, -1, sizeof(token) );
2017-01-13 23:37:03 +08:00
sprintf( token, "此技能你不能学喔!" );
2016-12-24 08:45:52 +08:00
CHAR_talkToCli( talkerindex, meindex, token, CHAR_COLORYELLOW);
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
return;
}
}
2017-01-13 23:37:03 +08:00
// 判断剩余点数
2016-12-24 08:45:52 +08:00
{
profession_skill_point = CHAR_getInt( talkerindex, PROFESSION_SKILL_POINT );
if( profession_skill_point <= 0 ){
char token[256];
memset(token, -1, sizeof(token) );
2017-01-13 23:37:03 +08:00
sprintf( token, "你目前没有学习点数!" );
2016-12-24 08:45:52 +08:00
CHAR_talkToCli( talkerindex, meindex, token, CHAR_COLORYELLOW);
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
return;
}
}
2017-01-13 23:37:03 +08:00
// 判断是否达成学习的条件
2016-12-24 08:45:52 +08:00
{
int temp[4] = {0}, count = 0, flag = -1 , need_percent = -1, need_count = 0;
for( i=0; i<4; i++){
int limit = -1;
flag = -1;
limit = PROFESSION_SKILL_getInt( skillarray, PROFESSION_SKILL_LIMIT1+i*2 );
need_percent = PROFESSION_SKILL_getInt( skillarray, PROFESSION_SKILL_LIMIT1+i*2 + 1 );
if( limit!= 0 && need_percent == 0 ) need_count++;
if( limit == 0 ){
continue;
}else if( limit == -1 ){
for( j=0; j<PROFESSION_MAX_LEVEL; j++ ){
if( CHAR_getCharSkill( talkerindex, j) > 0 ) break;
}
if( j >= PROFESSION_MAX_LEVEL ){
char token[256];
2017-01-13 23:37:03 +08:00
sprintf( token, "需先学会任1种战斗技能才能学习!");
2016-12-24 08:45:52 +08:00
CHAR_talkToCli( talkerindex, meindex, token, CHAR_COLORYELLOW);
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
return;
}
}else{
flag = -1;
for( j=0; j<PROFESSION_MAX_LEVEL; j++ ){
2017-01-13 23:37:03 +08:00
// 判断技能
2016-12-24 08:45:52 +08:00
if( CHAR_getCharSkill( talkerindex, j) == limit ){
int skill_level = -1;
CHAR_HaveSkill* hskill;
flag = -2;
hskill = CHAR_getCharHaveSkill( talkerindex, j );
skill_level = SKILL_getInt( &hskill->skill, SKILL_LEVEL);
2017-01-13 23:37:03 +08:00
// 判断熟练度
2016-12-24 08:45:52 +08:00
if( skill_level >= need_percent ){
flag = 1; break;
}
}
}
2017-01-13 23:37:03 +08:00
// 未达成条件
2016-12-24 08:45:52 +08:00
if( flag == -1 && need_percent == 0 ){
temp[count] = limit;
count ++;
}else if( flag == -1 ){
char token[256];
memset(token, -1, sizeof(token) );
2017-01-13 23:37:03 +08:00
sprintf( token, "尚未学会%s!", PROFESSION_SKILL_getChar( limit, PROFESSION_SKILL_NAME) );
2016-12-24 08:45:52 +08:00
CHAR_talkToCli( talkerindex, -1, token, CHAR_COLORYELLOW);
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
return;
}else if( flag == -2 ){
char token[256];
memset(token, -1, sizeof(token) );
2017-01-13 23:37:03 +08:00
sprintf( token, "%s熟练度不足%d!", PROFESSION_SKILL_getChar( limit, PROFESSION_SKILL_NAME), need_percent );
2016-12-24 08:45:52 +08:00
CHAR_talkToCli( talkerindex, -1, token, CHAR_COLORYELLOW);
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
return;
}
}
}
if( count == need_count && need_count != 0 ){
char msg[256] = {0};
2017-01-13 23:37:03 +08:00
sprintf( msg, "需先学会 " );
2016-12-24 08:45:52 +08:00
for( i = 0; i< count; i++ ){
if( temp[i] != 0 ){
char token[50] = {0};
sprintf( token, "%s ", PROFESSION_SKILL_getChar( temp[i], PROFESSION_SKILL_NAME) );
strcat( msg, token );
}
}
2017-01-13 23:37:03 +08:00
sprintf( msg, "%s 任一种技能", msg );
2016-12-24 08:45:52 +08:00
CHAR_talkToCli( talkerindex, -1, msg, CHAR_COLORYELLOW);
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
return;
}
}
2017-01-13 23:37:03 +08:00
// 判断金钱
2016-12-24 08:45:52 +08:00
{
cost = PROFESSION_SKILL_getInt( skillarray, PROFESSION_SKILL_COST );
cost = cost * rate;
if(CHAR_getInt(talkerindex,CHAR_GOLD) < cost){
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
return;
}
}
#ifdef _NPC_ProfessionTrans
2017-01-13 23:37:03 +08:00
//判断转生
2016-12-24 08:45:52 +08:00
{
if( NPC_Util_GetStrFromStrWithDelim( argstr, "trans", msg, sizeof(msg) ) != NULL){
int trans = atoi(msg);
2017-01-13 23:37:03 +08:00
print("\n转生要求:%d,%d",CHAR_getInt( talkerindex, CHAR_TRANSMIGRATION),trans);
2016-12-24 08:45:52 +08:00
if( CHAR_getInt( talkerindex, CHAR_TRANSMIGRATION) < trans){
if( NPC_Util_GetStrFromStrWithDelim( argstr, "trans_msg", msg, sizeof(msg) ) != NULL){
CHAR_talkToCli( talkerindex, meindex, msg, CHAR_COLORYELLOW);
return;
}
else{
2017-01-13 23:37:03 +08:00
CHAR_talkToCli( talkerindex, meindex, "您的转生次数不够哦。", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return;
}
}
}
}
#endif
2017-01-13 23:37:03 +08:00
// 增加技能
2016-12-24 08:45:52 +08:00
{
int skill_level = 0;
2017-01-13 23:37:03 +08:00
// 共通技能熟练度给50其余给10
2016-12-24 08:45:52 +08:00
if( (skillID == 63) || (skillID == 64) || (skillID == 65) ){
int Pskillid = -1;
skill_level = 50;
Pskillid = PROFESSION_SKILL_getskillArray( skillID );
}else{
skill_level = 10;
}
if( PROFESSION_SKILL_ADDSK( talkerindex, skillID, skill_level ) == -1 ) return;
CHAR_DelGold( talkerindex, cost );
CHAR_sendStatusString( talkerindex , "S");
NPC_Welfare_selectWindow( meindex, talkerindex,0,-1);
}
2017-01-13 23:37:03 +08:00
// 传送讯息
2016-12-24 08:45:52 +08:00
{
char token[256];
int next_profession_skill_point = profession_skill_point-1;
CHAR_setInt( talkerindex, PROFESSION_SKILL_POINT, next_profession_skill_point );
memset(token, -1, sizeof(token) );
2017-01-13 23:37:03 +08:00
sprintf( token, "您学习了 %s剩余学习点数 %d"
2016-12-24 08:45:52 +08:00
,PROFESSION_SKILL_getChar( skillarray, PROFESSION_SKILL_NAME )
,next_profession_skill_point );
CHAR_talkToCli( talkerindex, -1, token, CHAR_COLORYELLOW);
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( talkerindex , CHAR_WORKOBJINDEX ));
}
}
void NPC_WelfareMakeStr(int meindex,int toindex,int select)
{
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char msg[256];
double rate=1.0;
int i=0;
char token[65530];
int fd = getfdFromCharaIndex( toindex);
if(select==0){
sprintf(token,"0|0");
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_PETSKILLSHOP,
WINDOW_BUTTONTYPE_NONE,
CHAR_WINDOWTYPE_WINDOWPETSKILLSHOP,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
token);
}
if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){
print("GetArgStrErr");
return;
}
if( NPC_Util_GetStrFromStrWithDelim( argstr, "main_msg", msg, sizeof( msg)) == NULL){
print("mainERR");
return ;
}
sprintf(token,"1|%s|%s", CHAR_getChar(meindex,CHAR_NAME), msg);
if( NPC_Util_GetStrFromStrWithDelim( argstr, "skill_rate", msg, sizeof( msg)) != NULL){
rate=atof(msg);
}
if( NPC_Util_GetStrFromStrWithDelim( argstr, "profession_skill", msg, sizeof( msg) ) != NULL){
int skillarray;
int skillID;
int cost;
char token2[265];
char buf[64];
i=1;
while( getStringFromIndexWithDelim(msg,",",i,buf,sizeof(buf)) !=FALSE ){
i++;
skillID=atoi(buf);
skillarray = PROFESSION_SKILL_getskillArray( skillID );
if( PROFESSION_SKILL_CHECKINDEX( skillarray ) == FALSE ) continue;
cost = PROFESSION_SKILL_getInt( skillarray, PROFESSION_SKILL_COST );
cost = (int)cost*rate;
sprintf(token2,"|%s|%d|%s|%d",
2017-01-13 23:37:03 +08:00
PROFESSION_SKILL_getChar( skillarray, PROFESSION_SKILL_NAME ), // 技能名称
cost, // 金额
PROFESSION_SKILL_getChar( skillarray, PROFESSION_SKILL_TXT ), // 说明
PROFESSION_SKILL_getInt( skillarray, PROFESSION_SKILL_ICON ) // 图示
2016-12-24 08:45:52 +08:00
);
strcat(token,token2);
}
}
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_PROFESSIONSHOP,
WINDOW_BUTTONTYPE_NONE,
WINDOW_MESSAGETYPE_PROFESSIONSHOP,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
token);
return;
}
#endif
#endif