chuyiwen_gmsv/battle/profession_skill.c

1394 lines
41 KiB
C
Raw Normal View History

2016-12-24 08:45:52 +08:00
#include "version.h"
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
2016-12-24 08:45:52 +08:00
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "buf.h"
#include "profession_skill.h"
#include "char_base.h"
#include "battle.h"
#include "magic_base.h"
#include "configfile.h"
#include "char.h"
#include "lssproto_serv.h"
#include "skill.h"
static Professionskill *PROFESSION_skill;
typedef struct tagProfessionskill_skillFunctionTable
{
char *functionname;
PROFESSION_SKILL_CALLFUNC func;
int hash;
// int status;
}PROFESSION_SKILL_skillFunctionTable;
static PROFESSION_SKILL_skillFunctionTable PROFESSION_SKILL_functbl[] = {
// 巫师技能
{ "PROFESSION_VOLCANO_SPRINGS", PROFESSION_volcano_springs, 0 }, // 火山泉
{ "PROFESSION_FIRE_BALL", PROFESSION_fire_ball, 0 }, // 火星球
{ "PROFESSION_FIRE_SPEAR", PROFESSION_fire_spear, 0 }, // 火龙枪
{ "PROFESSION_SUMMON_THUNDER", PROFESSION_summon_thunder, 0 }, // 召雷术
{ "PROFESSION_CURRENT", PROFESSION_current, 0 }, // 电流术
{ "PROFESSION_STORM", PROFESSION_storm, 0 }, // 暴风雨
{ "PROFESSION_ICE_ARROW", PROFESSION_ice_arrow, 0 }, // 冰箭术
{ "PROFESSION_ICE_CRACK", PROFESSION_ice_crack, 0 }, // 冰爆术
{ "PROFESSION_ICE_MIRROR", PROFESSION_ice_mirror, 0 }, // 冰镜术
{ "PROFESSION_DOOM", PROFESSION_doom, 0 }, // 世界末日
{ "PROFESSION_BLOOD", PROFESSION_blood, 0 }, // 嗜血成性
{ "PROFESSION_BLOOD_WORMS", PROFESSION_blood_worms, 0 }, // 嗜血蛊
{ "PROFESSION_SIGN", PROFESSION_sign, 0 }, // 一针见血
{ "PROFESSION_FIRE_ENCLOSE", PROFESSION_fire_enclose, 0 }, // 火附体
{ "PROFESSION_ICE_ENCLOSE", PROFESSION_ice_eclose, 0 }, // 冰附体
{ "PROFESSION_THUNDER_ENCLOSE", PROFESSION_thunder_enclose, 0 }, // 雷附体
{ "PROFESSION_FIRE_PRACTICE", PROFESSION_fire_practice, 0 }, // 火魔法熟练度
{ "PROFESSION_ICE_PRACTICE", PROFESSION_ice_practice, 0 }, // 冰魔法熟练度
{ "PROFESSION_THUNDER_PRACTICE",PROFESSION_thunder_practice,0 }, // 雷魔法熟练度
{ "PROFESSION_ENCLOSE", PROFESSION_enclose, 0 }, // 附身术
{ "PROFESSION_TRANSPOSE", PROFESSION_transpose, 0 }, // 移形换位
// { "PROFESSION_ALCHEMY", PROFESSION_alchemy, 0 }, // 炼金术
// 勇士技能
{ "PROFESSION_CHAIN_ATK", PROFESSION_chain_atk, 0 }, // 连环攻击
{ "PROFESSION_AVOID", PROFESSION_avoid, 0 }, // 回避
{ "PROFESSION_WEAPON_FOCUS", PROFESSION_weapon_focus, 0 }, // 武器专精
{ "PROFESSION_REBACK", PROFESSION_reback, 0 }, // 状态回复
{ "PROFESSION_BRUST", PROFESSION_brust, 0 }, // 爆击
{ "PROFESSION_CHAIN_ATK_2", PROFESSION_chain_atk_2, 0 }, // 双重攻击
{ "PROFESSION_SCAPEGOAT", PROFESSION_scapegoat, 0 }, // 舍已为友
{ "PROFESSION_ENRAGE", PROFESSION_enrage, 0 }, // 激化攻击
{ "PROFESSION_ENERGY_COLLECT", PROFESSION_energy_collect, 0 }, // 能量聚集
{ "PROFESSION_FOCUS", PROFESSION_focus, 0 }, // 专注战斗
{ "PROFESSION_SHIELD_ATTACK", PROFESSION_shield_attack, 0 }, // 盾击
{ "PROFESSION_DUAL_WEAPON", PROFESSION_dual_weapon, 0 }, // 二刀流
{ "PROFESSION_DEFLECT", PROFESSION_deflect, 0 }, // 格档
{ "PROFESSION_THROUGH_ATTACK", PROFESSION_through_attack, 0 }, // 贯穿攻击
{ "PROFESSION_CAVALRY", PROFESSION_cavalry, 0 }, // 座骑攻击
{ "PROFESSION_DEAD_ATTACK", PROFESSION_dead_attack, 0 }, // 濒死攻击
{ "PROFESSION_CONVOLUTE", PROFESSION_convolute, 0 }, // 回旋攻击
{ "PROFESSION_CHAOS", PROFESSION_chaos, 0 }, // 混乱攻击
// 猎人
{ "PROFESSION_TRACK", PROFESSION_track, 0 }, // 追寻敌踪
{ "PROFESSION_ESCAPE", PROFESSION_escape, 0 }, // 回避战斗
{ "PROFESSION_DOCILE", PROFESSION_docile, 0 }, // 驯伏宠物
{ "PROFESSION_TRAP", PROFESSION_trap, 0 }, // 陷阱
{ "PROFESSION_ENRAGE_PET", PROFESSION_enrage_pet, 0 }, // 激怒宠物
{ "PROFESSION_DRAGNET", PROFESSION_dragnet, 0 }, // 天罗地网
{ "PROFESSION_ENTWINE", PROFESSION_entwine, 0 }, // 树根缠绕
{ "PROFESSION_AUTARKY", PROFESSION_autarky, 0 }, // 自给自足
{ "PROFESSION_PLUNDER", PROFESSION_plunder, 0 }, // 屍体掠夺
{ "PROFESSION_TOXIN_WEAPON", PROFESSION_toxin_weapon, 0 }, // 毒素武器
{ "PROFESSION_RESIST_FIRE", PROFESSION_resist_fire, 0 }, // 火抗性
{ "PROFESSION_RESIST_ICE", PROFESSION_resist_ice, 0 }, // 冰抗性
{ "PROFESSION_RESIST_THUNDER", PROFESSION_resist_thunder, 0 }, // 雷抗性
2016-12-24 08:45:52 +08:00
#ifdef _PROFESSION_ADDSKILL
{ "PROFESSION_RESIST_F_I_T", PROFESSION_resist_f_i_t, 0 }, // 自然威能
{ "PROFESSION_CALL_NATURE", PROFESSION_call_nature, 0 }, // 号召自然
{ "PROFESSION_BOUNDARY", PROFESSION_boundary, 0 }, // 四属性结界
2016-12-24 08:45:52 +08:00
#endif
{ "PROFESSION_G_RESIST_FIRE", PROFESSION_g_resist_fire, 0 }, // 团体火抗性
{ "PROFESSION_G_RESIST_ICE", PROFESSION_g_resist_ice, 0 }, // 团体冰抗性
{ "PROFESSION_G_RESIST_THUNDER",PROFESSION_g_resist_thunder,0 }, // 团体雷抗性
{ "PROFESSION_ATTACK_WEAK", PROFESSION_attack_weak, 0 }, // 弱点攻击
{ "PROFESSION_INSTIGATE", PROFESSION_instigate, 0 }, // 挑拨
{ "PROFESSION_OBLIVION", PROFESSION_oblivion, 0 }, // 遗忘
// 共同技能
{ "PROFESSION_FULL_MP", PROFESSION_full_mp, 0 }, // 气力充沛
{ "PROFESSION_STRONG_BACK", PROFESSION_strong_back, 0 }, // 负重增加
{ "PROFESSION_STRENGTHEN", PROFESSION_strengthen, 0 }, // 自我强化
2016-12-24 08:45:52 +08:00
};
static int profession_skill_num; // 职业技能总数
2016-12-24 08:45:52 +08:00
// 将 profession.txt 载入
2016-12-24 08:45:52 +08:00
BOOL PROFESSION_initSkill( char *filename)
{
FILE* f;
char line[256];
int linenum=-1;
int skill_readlen=0;
int i, j;
int max_skillid = 0;
f = fopen(filename,"r");
if( f == NULL ){
print( "file open error\n");
return FALSE;
}
profession_skill_num=0;
while( fgets( line, sizeof( line ), f ) ){
char token[256];
linenum ++;
if( line[0] == '#' )continue;
if( line[0] == '\n' )continue;
chomp( line );
profession_skill_num++;
#ifdef _PROSKILL_OPTIMUM // Robin 取出最大职技ID
2016-12-24 08:45:52 +08:00
if( getStringFromIndexWithDelim( line, ",",
PROFESSION_SKILL_DATACHARNUM+PROFESSION_SKILL_ID+1,
token, sizeof(token)) == FALSE )
continue;
max_skillid = max( atoi( token), max_skillid);
#endif
}
if( fseek( f, 0, SEEK_SET ) == -1 ){
fprint( "Seek Error\n" );
fclose(f);
return FALSE;
}
#ifdef _PROSKILL_OPTIMUM // 职技Table数为 最大技能ID +1
2016-12-24 08:45:52 +08:00
profession_skill_num = max_skillid +1;
print("最大职技ID = %d ...", max_skillid);
2016-12-24 08:45:52 +08:00
#endif
PROFESSION_skill = allocateMemory( sizeof(struct tagProfessionkill) * profession_skill_num + 1 );
if( PROFESSION_skill == NULL ){
fprint( "无法分配内存 %d\n", sizeof(struct tagProfessionkill)*profession_skill_num);
2016-12-24 08:45:52 +08:00
fclose( f );
return FALSE;
}
// init skill
for( i = 0; i < profession_skill_num; i ++ ) {
for( j = 0; j < PROFESSION_SKILL_DATAINTNUM; j ++ )
PROFESSION_SKILL_setInt( i,j,-1);
for( j = 0; j < PROFESSION_SKILL_DATACHARNUM; j ++ )
PROFESSION_SKILL_setChar( i,j,"");
}
linenum = -1;
while( fgets( line, sizeof( line ), f ) ){
linenum ++;
if( line[0] == '#' )continue;
if( line[0] == '\n' )continue;
chomp( line );
replaceString( line, '\t' , ' ' );
{
char buf[256];
for( i = 0; i < strlen( line); i ++) {
if( line[i] != ' ' ) {
break;
}
strcpysafe( buf,sizeof(buf), &line[i]);
}
if( i != 0 ) {
strcpysafe( line,sizeof(line), buf);
}
}
{
char token[256];
int ret;
#ifdef _PROSKILL_OPTIMUM // 读取本行职技的ID, 直接以职技ID当Table index
2016-12-24 08:45:52 +08:00
ret = getStringFromIndexWithDelim( line, ",", PROFESSION_SKILL_DATACHARNUM+PROFESSION_SKILL_ID+1, token, sizeof(token));
if( ret==FALSE ){
//fprint("Syntax Error file:%s line:%d\n",filename,linenum);
break;
}
skill_readlen = atoi( token);
#endif
for( i = 0; i < PROFESSION_SKILL_DATACHARNUM; i ++ ) {
ret = getStringFromIndexWithDelim( line,",", i + 1, token,sizeof(token));
if( ret==FALSE ){
//fprint("Syntax Error file:%s line:%d\n",filename,linenum);
break;
}
PROFESSION_SKILL_setChar( skill_readlen, i, token);
}
for( i = 0; i < PROFESSION_SKILL_DATAINTNUM; i ++ ) {
ret = getStringFromIndexWithDelim( line, ",", i+PROFESSION_SKILL_DATACHARNUM+1, token, sizeof(token));
if( ret==FALSE ){
//fprint("文件语法错误:%s 第%d行\n",filename,linenum);
2016-12-24 08:45:52 +08:00
break;
}
if( strlen( token) != 0 ) {
PROFESSION_SKILL_setInt( skill_readlen, i , atoi( token ));
}
}
skill_readlen ++;
}
}
fclose(f);
profession_skill_num = skill_readlen;
for( i = 0; i < arraysizeof( PROFESSION_SKILL_functbl); i ++ ){
PROFESSION_SKILL_functbl[i].hash = hashpjw( PROFESSION_SKILL_functbl[i].functionname );
}
return TRUE;
}
// 重新载入 profession.txt
2016-12-24 08:45:52 +08:00
void rePROFESSION_initSkill()
{
freeMemory( PROFESSION_skill );
PROFESSION_initSkill(getProfession());
}
INLINE BOOL PROFESSION_SKILL_CHECKINDEX( int index )
{
if( profession_skill_num < index || index < 0 )return FALSE;
return TRUE;
}
static INLINE BOOL PROFESSION_SKILL_CHECKINTDATAINDEX( int index)
{
if( PROFESSION_SKILL_DATAINTNUM < index || index < 0 ) return FALSE;
return TRUE;
}
static INLINE BOOL PROFESSION_SKILL_CHECKCHARDATAINDEX( int index)
{
if( PROFESSION_SKILL_DATACHARNUM < index || index < 0 ) return FALSE;
return TRUE;
}
INLINE int PROFESSION_SKILL_getInt( int index, PROFESSION_SKILL_DATAINT element)
{
return PROFESSION_skill[index].data[element];
}
INLINE int PROFESSION_SKILL_setInt( int index, PROFESSION_SKILL_DATAINT element, int data)
{
int buf;
buf = PROFESSION_skill[index].data[element];
PROFESSION_skill[index].data[element]=data;
return buf;
}
INLINE char* PROFESSION_SKILL_getChar( int index, PROFESSION_SKILL_DATACHAR element)
{
if( !PROFESSION_SKILL_CHECKINDEX( index)) return "\0";
if( !PROFESSION_SKILL_CHECKCHARDATAINDEX( element)) return "\0";
return PROFESSION_skill[index].string[element].string;
}
INLINE BOOL PROFESSION_SKILL_setChar( int index ,PROFESSION_SKILL_DATACHAR element, char* new )
{
if(!PROFESSION_SKILL_CHECKINDEX(index))return FALSE;
if(!PROFESSION_SKILL_CHECKCHARDATAINDEX(element))return FALSE;
strcpysafe( PROFESSION_skill[index].string[element].string,
sizeof(PROFESSION_skill[index].string[element].string),
new );
return TRUE;
}
int PROFESSION_SKILL_getskillNum( void)
{
return profession_skill_num;
}
/*----------------------------------------------------------------------*/
int PROFESSION_SKILL_getskillArray( int skillid)
{
#ifdef _PROSKILL_OPTIMUM // 查询职技ID改为阵列式
2016-12-24 08:45:52 +08:00
if( skillid >= 0 && skillid < profession_skill_num )
return PROFESSION_skill[skillid].data[PROFESSION_SKILL_ID];
#else
int i;
for( i = 0; i <= profession_skill_num; i ++ ) { // 待优化
2016-12-24 08:45:52 +08:00
if( PROFESSION_skill[i].data[PROFESSION_SKILL_ID] == skillid )
return i;
}
#endif
return -1;
}
PROFESSION_SKILL_CALLFUNC PROFESSION_SKILL_getskillFuncPointer(char* name )
{
int i;
int hash = hashpjw( name );
for( i = 0; i< arraysizeof( PROFESSION_SKILL_functbl); i++ ){
if( PROFESSION_SKILL_functbl[i].hash == hash ){
if( strcmp( PROFESSION_SKILL_functbl[i].functionname, name ) == 0 ){
return PROFESSION_SKILL_functbl[i].func;
}
}
}
return NULL;
}
int _PROFESSION_SKILL_GetArray( char *file, int line, int charaindex, int skill )
{
int skillid,array;
skillid = CHAR_getCharSkill( charaindex, skill);
if( skillid < 0 ) return -1;
array = PROFESSION_SKILL_getskillArray( skillid );
return array;
}
/*----------------------------------------------------------------------*/
// 使用职业技能
2016-12-24 08:45:52 +08:00
int PROFESSION_SKILL_Use( int charaindex, int skill, int toNo, char *data )
{
int Pskillid, skillid;
int ret=-1, skill_level;
PROFESSION_SKILL_CALLFUNC func;
CHAR_HaveSkill* hskill;
int char_pskill, profession_skill;
skillid = CHAR_getCharSkill( charaindex, skill);
Pskillid = PROFESSION_SKILL_getskillArray( skillid);
//print("\n skillid:%d Pskillid:%d ", skillid, Pskillid); // Robin log
if( Pskillid == -1 ) {
// printf("\n 改封包??找不到该职技! ");
2016-12-24 08:45:52 +08:00
return ret;
}
#ifdef _PROSKILL_OPTIMUM // Robin fix 检查职业是否相符
2016-12-24 08:45:52 +08:00
char_pskill = CHAR_getInt( charaindex, PROFESSION_CLASS );
profession_skill = PROFESSION_SKILL_getInt( Pskillid, PROFESSION_SKILL_PROFESSION_CLASS);
if( (char_pskill <=0) || (char_pskill != profession_skill) ) {
// print("\n 改封包??职技的职业不正确!:%d:%d ", char_pskill, profession_skill);
2016-12-24 08:45:52 +08:00
return ret;
}
#endif
// 找寻对应 function
2016-12-24 08:45:52 +08:00
func = PROFESSION_SKILL_getskillFuncPointer( PROFESSION_SKILL_getChar( Pskillid, PROFESSION_SKILL_FUNCNAME) );
// 判断是否为人物
2016-12-24 08:45:52 +08:00
if( CHAR_getInt( charaindex, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ) return ret;
if( func ){
// 人物技能等级
2016-12-24 08:45:52 +08:00
hskill = CHAR_getCharHaveSkill( charaindex, skill );
skill_level = SKILL_getInt( &hskill->skill, SKILL_LEVEL);
// 耗损 MP
2016-12-24 08:45:52 +08:00
if( PROFESSION_SKILL_DEC_COST_MP( charaindex, skill, Pskillid, skill_level ) != 1 ) {
// print("\n Error:职技MP:%d:%d:%d ", skill, Pskillid, skill_level);
2016-12-24 08:45:52 +08:00
return ret;
}
// 使用职业技能
2016-12-24 08:45:52 +08:00
ret = func( charaindex, toNo, Pskillid, data, skill_level );
if( ret == -1 ){
int rands = rand()%10;
//andy_log
// print("ret = %d, rands:%d \n", ret, rands);
if( rands > 5 ) return ret;
}
if( Pskillid == 57 //激怒宠物 选宠物才有经验值
2016-12-24 08:45:52 +08:00
&& CHAR_getInt( BATTLE_No2Index( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEINDEX ), toNo ), CHAR_WHICHTYPE) != CHAR_TYPEPET )
return ret;
// 一般技能升级
2016-12-24 08:45:52 +08:00
PROFESSION_NORMAL_SKILL_LEVLE_UP( &hskill->skill, Pskillid, charaindex );
}
else {
//print("\n 错误!找不到职技func ");
2016-12-24 08:45:52 +08:00
}
return ret;
}
// 特殊技能升级
2016-12-24 08:45:52 +08:00
void PROFESSION_SKILL_LVEVEL_UP( int charaindex, char *name )
{
int skill=-1;
int skillid=0, Pskillid=0, i;
char *skill_name="\0";
CHAR_HaveSkill* hskill;
for( i=0; i<CHAR_SKILLMAXHAVE; i++ ){
// 技能ID
2016-12-24 08:45:52 +08:00
skillid = CHAR_getCharSkill( charaindex, i);
Pskillid = PROFESSION_SKILL_getskillArray( skillid);
if( Pskillid < 0 ) continue;
// 技能名称
2016-12-24 08:45:52 +08:00
skill_name = PROFESSION_SKILL_getChar( Pskillid, PROFESSION_SKILL_FUNCNAME);
if( skill_name == "\0" ) continue;
if( (strcmp( skill_name , name )) == 0 ){
skill = i; break;
}
}
if( (skill < 0) || (skill > CHAR_SKILLMAXHAVE) ) return;
skillid = CHAR_getCharSkill( charaindex, skill);
Pskillid = PROFESSION_SKILL_getskillArray( skillid);
if( Pskillid == -1 ) return;
// 人物技能等级
2016-12-24 08:45:52 +08:00
hskill = CHAR_getCharHaveSkill( charaindex, skill );
// 一般技能升级
2016-12-24 08:45:52 +08:00
PROFESSION_NORMAL_SKILL_LEVLE_UP( &hskill->skill, Pskillid, charaindex );
return;
}
// 二刀流技能升级
2016-12-24 08:45:52 +08:00
void PROFESSION_SKILL_DUAL_WEAPON_LVEVEL_UP( int charaindex, char *name )
{
int skill=-1, arm = 0, shield = 0;
int skillid=0, Pskillid=0, i;
char *skill_name="\0";
CHAR_HaveSkill* hskill;
// 检查左右手装备
2016-12-24 08:45:52 +08:00
for( i = 0 ; i < CHAR_EQUIPPLACENUM ; i ++ ){
int id = CHAR_getItemIndex(charaindex,i);
if( ITEM_CHECKINDEX(id) ){
if( i == CHAR_ARM ) arm = 1;
else if( i == CHAR_EQSHIELD ) shield = 1;
}
}
if( arm != 1 || shield != 1 ) return;
for( i=0; i<CHAR_SKILLMAXHAVE; i++ ){
// 技能ID
2016-12-24 08:45:52 +08:00
skillid = CHAR_getCharSkill( charaindex, i);
Pskillid = PROFESSION_SKILL_getskillArray( skillid);
if( Pskillid < 0 ) continue;
// 技能名称
2016-12-24 08:45:52 +08:00
skill_name = PROFESSION_SKILL_getChar( Pskillid, PROFESSION_SKILL_FUNCNAME);
if( skill_name == "\0" ) continue;
if( (strcmp( skill_name , name )) == 0 ){
skill = i; break;
}
}
if( (skill < 0) || (skill > CHAR_SKILLMAXHAVE) ) return;
skillid = CHAR_getCharSkill( charaindex, skill);
Pskillid = PROFESSION_SKILL_getskillArray( skillid);
if( Pskillid == -1 ) return;
// 人物技能等级
2016-12-24 08:45:52 +08:00
hskill = CHAR_getCharHaveSkill( charaindex, skill );
// 一般技能升级
2016-12-24 08:45:52 +08:00
PROFESSION_NORMAL_SKILL_LEVLE_UP( &hskill->skill, Pskillid, charaindex );
return;
}
// 武器专精技能升级
2016-12-24 08:45:52 +08:00
void PROFESSION_SKILL_WEAPON_FOCUS_LVEVEL_UP( int charaindex, char *name )
{
int skill = -1;
int skillid=0, Pskillid = 0, i;
char *skill_name="\0", *pszOption="\0", *pszP, diff[20];
int WeaponType = -1;
CHAR_HaveSkill* hskill;
memset( diff, -1, sizeof(diff) );
// 装备武器
2016-12-24 08:45:52 +08:00
WeaponType = BATTLE_GetWepon( charaindex );
switch( WeaponType ){
case ITEM_AXE:
sprintf( diff, "" ); break;
2016-12-24 08:45:52 +08:00
case ITEM_CLUB:
sprintf( diff, "" ); break;
2016-12-24 08:45:52 +08:00
case ITEM_SPEAR:
sprintf( diff, "" ); break;
2016-12-24 08:45:52 +08:00
case ITEM_BOW:
sprintf( diff, "" ); break;
case ITEM_BOOMERANG: // 回旋标
sprintf( diff, "" ); break;
case ITEM_BOUNDTHROW: // 投掷斧头
sprintf( diff, "" ); break;
case ITEM_BREAKTHROW: // 投掷石
sprintf( diff, "" ); break;
2016-12-24 08:45:52 +08:00
default:
sprintf( diff, "" ); break;
2016-12-24 08:45:52 +08:00
}
for( i=0; i<CHAR_SKILLMAXHAVE; i++ ){
// 技能ID
2016-12-24 08:45:52 +08:00
skillid = CHAR_getCharSkill( charaindex, i);
Pskillid = PROFESSION_SKILL_getskillArray( skillid);
if( Pskillid < 0 ) continue;
// 技能名称
2016-12-24 08:45:52 +08:00
skill_name = PROFESSION_SKILL_getChar( Pskillid, PROFESSION_SKILL_FUNCNAME);
if( skill_name == "\0" ) continue;
// 技能参数
2016-12-24 08:45:52 +08:00
pszOption = PROFESSION_SKILL_getChar( Pskillid, PROFESSION_SKILL_OPTION);
if( pszOption == "\0" ) continue;
if( (strcmp( skill_name , name )) == 0 ){
if( (pszP=strstr( pszOption, diff ))!=NULL ){
skill = i; break;
}
}
}
if( (skill < 0) || (skill > CHAR_SKILLMAXHAVE) ) return;
skillid = CHAR_getCharSkill( charaindex, skill);
Pskillid = PROFESSION_SKILL_getskillArray( skillid);
if( Pskillid == -1 ) return;
// 人物技能等级
2016-12-24 08:45:52 +08:00
hskill = CHAR_getCharHaveSkill( charaindex, skill );
// 一般技能升级
2016-12-24 08:45:52 +08:00
PROFESSION_NORMAL_SKILL_LEVLE_UP( &hskill->skill, Pskillid, charaindex );
return;
}
// 耗损 MP
2016-12-24 08:45:52 +08:00
int PROFESSION_SKILL_DEC_COST_MP( int charaindex, int skill, int Pskillid, int skill_level )
{
if(skill_level > 0){
int dec_mp;
int old_mp = CHAR_getInt( charaindex, CHAR_MP );
int mp=0;
// 取出耗损 MP
2016-12-24 08:45:52 +08:00
if( (dec_mp = PROFESSION_MAGIC_COST_MP( charaindex, skill )) == -1 )
dec_mp = PROFESSION_SKILL_getInt( Pskillid, PROFESSION_SKILL_COST_MP );
// 检查 MP量
2016-12-24 08:45:52 +08:00
if( old_mp < dec_mp ) return -1;
// 嗜血成性
2016-12-24 08:45:52 +08:00
if( Pskillid != 11
#ifdef _PROFESSION_ADDSKILL
// && Pskillid != 2 //针针相对不扣 MP
2016-12-24 08:45:52 +08:00
#endif
)
if( dec_mp <= 0 ) return -1;
// 扣掉人物 MP
2016-12-24 08:45:52 +08:00
mp = old_mp - dec_mp;
if( mp < 0 ) mp = 0;
CHAR_setInt( charaindex , CHAR_MP , mp );
CHAR_send_P_StatusString( charaindex , CHAR_P_STRING_MP);
return 1;
}
return -1;
}
// 一般技能升级
2016-12-24 08:45:52 +08:00
void PROFESSION_NORMAL_SKILL_LEVLE_UP(Skill *skill, int Pskillid, int charaindex )
{
int skill_level = 0, up_fix_value = 0;
int rand_num = RAND( 0, 10000 ), rand_num2 = 0;
// 技能等级到达上限不升级
2016-12-24 08:45:52 +08:00
skill_level = SKILL_getRealInt( skill, SKILL_LEVEL);
if( skill_level >= PROFESSION_SKILL_MAX_LEVEL * 100 ) return;
// 升级修正数值
2016-12-24 08:45:52 +08:00
up_fix_value = PROFESSION_SKILL_getInt( Pskillid, PROFESSION_SKILL_FIX_VALUE) * 100;
rand_num2 = RAND( 0, up_fix_value);
// 升级检定
2016-12-24 08:45:52 +08:00
if( rand_num > skill_level + rand_num2){
// 增加熟练度
2016-12-24 08:45:52 +08:00
skill_level += PROFESSION_SKILL_ADD_POINT;
SKILL_setInt( skill, SKILL_LEVEL, skill_level );
if( ( skill_level % 100 ) == 0 ){
char msg[256];
sprintf( msg, "%s技能熟练度上升为%d", PROFESSION_SKILL_getChar( Pskillid, PROFESSION_SKILL_NAME), skill_level/100 );
2016-12-24 08:45:52 +08:00
CHAR_talkToCli( charaindex, -1, msg, CHAR_COLORYELLOW);
CHAR_sendStatusString( charaindex , "S");
// 职业经验值增加
2016-12-24 08:45:52 +08:00
PROFESSION_LEVEL_CHECK_UP( charaindex );
}
}
return;
}
void PROFESSION_LEVEL_CHECK_UP( int charaindex )
{
int skill_level_add = 0, skill_level_sum = 0, i = 0;
int old_level = CHAR_getInt( charaindex, PROFESSION_LEVEL );
int next_level_need_point = 9999999;
CHAR_HaveSkill* hskill;
// 下一级职业升级点数
2016-12-24 08:45:52 +08:00
next_level_need_point = old_level * 70 * 100;
for( i=0; i<CHAR_SKILLMAXHAVE; i++ ){
int skillID = -1;
// 技能等级
2016-12-24 08:45:52 +08:00
hskill = CHAR_getCharHaveSkill( charaindex, i );
skillID = SKILL_getInt( &hskill->skill, SKILL_IDENTITY);
if( skillID <= 0 ) continue;
// 共通技能熟练度 50
2016-12-24 08:45:52 +08:00
if( (skillID == 63) || (skillID == 64) || (skillID == 65) ){
skill_level_add = 50*100;
}else{
skill_level_add = SKILL_getRealInt( &hskill->skill, SKILL_LEVEL);
}
skill_level_sum += skill_level_add;
}
// print("\n技能熟练度上升 ==> 当前熟练度点数(%d) 下一级熟练度升级点数(%d)", skill_level_sum, next_level_need_point );
2016-12-24 08:45:52 +08:00
// 技能熟练度达到下一级职业升级点数时,职业等级增加
2016-12-24 08:45:52 +08:00
if( skill_level_sum >= next_level_need_point ){
int old_skill_point = CHAR_getInt( charaindex, PROFESSION_SKILL_POINT );
int next_skill_point = old_skill_point+1;
char msg[64];
// print("\n职业等级上升 ==> 当前职业等级点数(%d) 下一级职业等级升级点数(%d)", old_skill_point, next_skill_point );
2016-12-24 08:45:52 +08:00
CHAR_setInt( charaindex, PROFESSION_LEVEL, old_level + 1 );
CHAR_setInt( charaindex, PROFESSION_SKILL_POINT, next_skill_point );
CHAR_sendStatusString( charaindex , "P");
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( charaindex , CHAR_WORKOBJINDEX ));
sprintf( msg, "职业等级上升为%d级技能点数上升", old_level + 1 );
2016-12-24 08:45:52 +08:00
CHAR_talkToCli( charaindex, -1, msg, CHAR_COLORYELLOW);
}
}
// 增加技能
2016-12-24 08:45:52 +08:00
int PROFESSION_SKILL_ADDSK( int charaindex, int skill, int level )
{
int i;
CHAR_HaveSkill *pSkil;
if( level > 100 ) level = 100;
else if( level < 1 ) level = 1;
for( i = 0; i < CHAR_SKILLMAXHAVE; i ++ ){
int skill_id = -1;
pSkil = CHAR_getCharHaveSkill( charaindex, i );
skill_id = SKILL_getInt( &pSkil->skill, SKILL_IDENTITY);
if( skill == skill_id && skill_id != -1 ){
CHAR_talkToCli(charaindex,-1, "你已经学习过此技能", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return -1;
}
if( pSkil == (CHAR_HaveSkill*)NULL )continue;
if( pSkil->use != 0 )continue;
break;
}
if( i >= CHAR_SKILLMAXHAVE ){
CHAR_talkToCli(charaindex,-1, "技能数量已达上限", CHAR_COLORYELLOW);
2016-12-24 08:45:52 +08:00
return -1;
}else{
level *= 100;
SKILL_makeSkillData( &pSkil->skill, skill, level);
pSkil->use = TRUE;
}
CHAR_sendStatusString( charaindex , "S");
return 1;
}
void profession_common_fun( int charaindex, int toNo, int skill_level, int array, int com1 )
{
CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM1, com1 );
CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM2, toNo );
CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_C_OK );
CHAR_SETWORKINT_HIGH( charaindex, CHAR_WORKBATTLECOM3, skill_level);
CHAR_SETWORKINT_LOW( charaindex, CHAR_WORKBATTLECOM3, array);
#ifdef _PROFESSION_ADDSKILL
if( com1 == BATTLE_COM_S_DOOM
/*&& CHAR_getWorkInt( charaindex, CHAR_DOOMTIME) == 0*/ ){
CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM1, BATTLE_COM_NONE );
CHAR_setWorkInt( charaindex, CHAR_WORK_com1, com1 );
CHAR_setWorkInt( charaindex, CHAR_WORK_toNo, toNo );
CHAR_setWorkInt( charaindex, CHAR_WORK_mode, BATTLE_CHARMODE_C_OK );
CHAR_setWorkInt( charaindex, CHAR_WORK_skill_level, skill_level );
CHAR_setWorkInt( charaindex, CHAR_WORK_array, array );
CHAR_setWorkInt( charaindex, CHAR_DOOMTIME, 3);
}
else if( com1 == BATTLE_COM_S_FIRE_SPEAR
/*&& CHAR_getWorkInt( charaindex, CHAR_DOOMTIME) == 0*/ ){
CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM1, BATTLE_COM_NONE );
CHAR_setWorkInt( charaindex, CHAR_WORK_com1, com1 );
CHAR_setWorkInt( charaindex, CHAR_WORK_toNo, toNo );
CHAR_setWorkInt( charaindex, CHAR_WORK_mode, BATTLE_CHARMODE_C_OK );
CHAR_setWorkInt( charaindex, CHAR_WORK_skill_level, skill_level );
CHAR_setWorkInt( charaindex, CHAR_WORK_array, array );
CHAR_setWorkInt( charaindex, CHAR_DOOMTIME, 2);
}
#endif
}
/*----------------------------------------------------------------------*/
// 以下为职业技能
2016-12-24 08:45:52 +08:00
// 巫师技能-火山泉
2016-12-24 08:45:52 +08:00
int PROFESSION_volcano_springs( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_VOLCANO_SPRINGS );
return TRUE;
}
// 巫师技能-火星球
2016-12-24 08:45:52 +08:00
int PROFESSION_fire_ball( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo<21)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_FIRE_BALL );
return TRUE;
}
// 巫师技能-火龙枪
2016-12-24 08:45:52 +08:00
int PROFESSION_fire_spear( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_FIRE_SPEAR );
return TRUE;
}
// 巫师技能-召雷术
2016-12-24 08:45:52 +08:00
int PROFESSION_summon_thunder( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_SUMMON_THUNDER );
return TRUE;
}
// 巫师技能-电流术
2016-12-24 08:45:52 +08:00
int PROFESSION_current( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo!=20 && toNo!=21)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_CURRENT );
return TRUE;
}
// 巫师技能-暴风雨
2016-12-24 08:45:52 +08:00
int PROFESSION_storm( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo!=20 && toNo!=21)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_STORM );
return TRUE;
}
// 巫师技能-冰箭术
2016-12-24 08:45:52 +08:00
int PROFESSION_ice_arrow( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_ICE_ARROW );
return TRUE;
}
// 巫师技能-冰爆术
2016-12-24 08:45:52 +08:00
int PROFESSION_ice_crack( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_ICE_CRACK );
return TRUE;
}
// 巫师技能-冰镜术
2016-12-24 08:45:52 +08:00
int PROFESSION_ice_mirror( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_ICE_MIRROR );
return TRUE;
}
// 巫师技能-世界末日
2016-12-24 08:45:52 +08:00
int PROFESSION_doom( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo!=20 && toNo!=21)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_DOOM );
return TRUE;
}
// 巫师技能-嗜血成性
2016-12-24 08:45:52 +08:00
int PROFESSION_blood( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_BLOOD );
return TRUE;
}
// 巫师技能-嗜血蛊
2016-12-24 08:45:52 +08:00
int PROFESSION_blood_worms( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_BLOOD_WORMS );
return TRUE;
}
// 巫师技能-一针见血
2016-12-24 08:45:52 +08:00
int PROFESSION_sign( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo!=20 && toNo!=21)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_SIGN );
return TRUE;
}
// 巫师技能-火附体
2016-12-24 08:45:52 +08:00
int PROFESSION_fire_enclose( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_FIRE_ENCLOSE );
return TRUE;
}
// 巫师技能-冰附体
2016-12-24 08:45:52 +08:00
int PROFESSION_ice_eclose( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_ICE_ENCLOSE );
return TRUE;
}
// 巫师技能-雷附体
2016-12-24 08:45:52 +08:00
int PROFESSION_thunder_enclose( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_THUNDER_ENCLOSE );
return TRUE;
}
// 巫师技能-火魔法熟练度
2016-12-24 08:45:52 +08:00
int PROFESSION_fire_practice( int charaindex, int toNo, int array, char *data, int skill_level )
{
return TRUE;
}
// 巫师技能-冰魔法熟练度
2016-12-24 08:45:52 +08:00
int PROFESSION_ice_practice( int charaindex, int toNo, int array, char *data, int skill_level )
{
return TRUE;
}
// 巫师技能-雷魔法熟练度
2016-12-24 08:45:52 +08:00
int PROFESSION_thunder_practice( int charaindex, int toNo, int array, char *data, int skill_level )
{
return TRUE;
}
// 巫师技能-附身术
2016-12-24 08:45:52 +08:00
int PROFESSION_enclose( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_ENCLOSE );
return TRUE;
}
// 巫师技能-移形换位
2016-12-24 08:45:52 +08:00
int PROFESSION_transpose( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_TRANSPOSE );
return TRUE;
}
/*----------------------------------------------------------------------*/
// 勇士技能-爆击
2016-12-24 08:45:52 +08:00
int PROFESSION_brust( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_BRUST );
return TRUE;
}
// 勇士技能-连环攻击
2016-12-24 08:45:52 +08:00
int PROFESSION_chain_atk( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_CHAIN_ATK );
return TRUE;
}
// 勇士技能-回避
2016-12-24 08:45:52 +08:00
int PROFESSION_avoid( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_AVOID );
return TRUE;
}
// 勇士技能-补血
2016-12-24 08:45:52 +08:00
int PROFESSION_recovery( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_RECOVERY );
return TRUE;
}
// 勇士技能-武器专精
2016-12-24 08:45:52 +08:00
int PROFESSION_weapon_focus( int charaindex, int toNo, int array, char *data, int skill_level )
{
return TRUE;
}
// 勇士技能-状态回复
2016-12-24 08:45:52 +08:00
int PROFESSION_reback( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_REBACK );
return TRUE;
}
// 勇士技能-双重攻击
2016-12-24 08:45:52 +08:00
int PROFESSION_chain_atk_2( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_CHAIN_ATK_2 );
return TRUE;
}
// 勇士技能-舍已为友
2016-12-24 08:45:52 +08:00
int PROFESSION_scapegoat( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_SCAPEGOAT );
return TRUE;
}
// 勇士技能-激化攻击
2016-12-24 08:45:52 +08:00
int PROFESSION_enrage( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_ENRAGE );
return TRUE;
}
// 勇士技能-能量聚集
2016-12-24 08:45:52 +08:00
int PROFESSION_energy_collect( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_COLLECT );
return TRUE;
}
// 勇士技能-专注战斗
2016-12-24 08:45:52 +08:00
int PROFESSION_focus( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_FOCUS );
return TRUE;
}
// 勇士技能-盾击
2016-12-24 08:45:52 +08:00
int PROFESSION_shield_attack( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_SHIELD_ATTACK );
return TRUE;
}
// 勇士技能-二刀流
2016-12-24 08:45:52 +08:00
int PROFESSION_dual_weapon( int charaindex, int toNo, int array, char *data, int skill_level )
{
return TRUE;
}
// 勇士技能-格档
2016-12-24 08:45:52 +08:00
int PROFESSION_deflect( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_DEFLECT );
return TRUE;
}
// 勇士技能-贯穿攻击
2016-12-24 08:45:52 +08:00
int PROFESSION_through_attack( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_THROUGH_ATTACK );
return TRUE;
}
// 勇士技能-座骑攻击
2016-12-24 08:45:52 +08:00
int PROFESSION_cavalry( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_CAVALRY );
return TRUE;
}
// 勇士技能-濒死攻击
2016-12-24 08:45:52 +08:00
int PROFESSION_dead_attack( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_DEAD_ATTACK );
return TRUE;
}
// 勇士技能-回旋攻击
2016-12-24 08:45:52 +08:00
int PROFESSION_convolute( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo<21)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_CONVOLUTE );
return TRUE;
}
// 勇士技能-混乱攻击
2016-12-24 08:45:52 +08:00
int PROFESSION_chaos( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_CHAOS );
return TRUE;
}
/*----------------------------------------------------------------------*/
// 猎人技能-陷阱
2016-12-24 08:45:52 +08:00
int PROFESSION_trap( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_TRAP );
return TRUE;
}
// 猎人技能-驯伏宠物
2016-12-24 08:45:52 +08:00
int PROFESSION_docile( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_DOCILE );
return TRUE;
}
// 猎人技能-激怒宠物
2016-12-24 08:45:52 +08:00
int PROFESSION_enrage_pet( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_ENRAGE_PET );
return TRUE;
}
// 猎人技能-天罗地网
2016-12-24 08:45:52 +08:00
int PROFESSION_dragnet( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_DRAGNET );
return TRUE;
}
// 猎人技能-树根缠绕
2016-12-24 08:45:52 +08:00
int PROFESSION_entwine( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_ENTWINE );
return TRUE;
}
// 猎人技能-自给自足
2016-12-24 08:45:52 +08:00
int PROFESSION_autarky( int charaindex, int toNo, int array, char *data, int skill_level )
{
return TRUE;
}
// 猎人技能-屍体掠夺
2016-12-24 08:45:52 +08:00
int PROFESSION_plunder( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_PLUNDER );
return TRUE;
}
// 猎人技能-毒素武器
2016-12-24 08:45:52 +08:00
int PROFESSION_toxin_weapon( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_TOXIN_WEAPON );
return TRUE;
}
// 猎人技能-火抗性提升
2016-12-24 08:45:52 +08:00
int PROFESSION_resist_fire( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_RESIST_FIRE );
return TRUE;
}
// 猎人技能-冰抗性提升
2016-12-24 08:45:52 +08:00
int PROFESSION_resist_ice( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_RESIST_ICE );
return TRUE;
}
// 猎人技能-雷抗性提升
2016-12-24 08:45:52 +08:00
int PROFESSION_resist_thunder( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_RESIST_THUNDER );
return TRUE;
}
#ifdef _PROFESSION_ADDSKILL
// 猎人技能-自然威能
2016-12-24 08:45:52 +08:00
int PROFESSION_resist_f_i_t( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_RESIST_F_I_T );
return TRUE;
}
// 猎人技能-号召自然
2016-12-24 08:45:52 +08:00
int PROFESSION_call_nature( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo!=20 && toNo!=21)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_CALL_NATURE );
return TRUE;
}
// 猎人技能-四属性结界
2016-12-24 08:45:52 +08:00
int PROFESSION_boundary( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo!=20 && toNo!=21)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_BOUNDARY );
return TRUE;
}
#endif
// 猎人技能-团体火抗性提升
2016-12-24 08:45:52 +08:00
int PROFESSION_g_resist_fire( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo!=20 && toNo!=21)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_G_RESIST_FIRE );
return TRUE;
}
// 猎人技能-团体冰抗性提升
2016-12-24 08:45:52 +08:00
int PROFESSION_g_resist_ice( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo!=20 && toNo!=21)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_G_RESIST_ICE );
return TRUE;
}
// 猎人技能-团体雷抗性提升
2016-12-24 08:45:52 +08:00
int PROFESSION_g_resist_thunder( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo!=20 && toNo!=21)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_G_RESIST_THUNDER );
return TRUE;
}
// 猎人技能-弱点攻击
2016-12-24 08:45:52 +08:00
int PROFESSION_attack_weak( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_ATTACK_WEAK );
return TRUE;
}
// 猎人技能-挑拨
2016-12-24 08:45:52 +08:00
int PROFESSION_instigate( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_INSTIGATE );
return TRUE;
}
// 猎人技能-遗忘
2016-12-24 08:45:52 +08:00
int PROFESSION_oblivion( int charaindex, int toNo, int array, char *data, int skill_level )
{
if(toNo>19)
toNo=0;
profession_common_fun( charaindex, toNo, skill_level, array, BATTLE_COM_S_OBLIVION );
return TRUE;
}
/*----------------------------------------------------------------------*/
// 非战斗技能
2016-12-24 08:45:52 +08:00
// 猎人技能-追寻敌踪
2016-12-24 08:45:52 +08:00
int PROFESSION_track( int charaindex, int toNo, int array, char *data, int skill_level )
{
char *pszP = NULL, *pszOption = "\0", msg[20];
int per=0, rate=0, img1, ret = 1;
skill_level /= 10;
if( CHAR_getWorkInt( charaindex, CHAR_ENCOUNT_NUM) >= (int)time(NULL) ){
ret = -1;
}
// 技能的参数
2016-12-24 08:45:52 +08:00
pszOption = PROFESSION_SKILL_getChar( array, PROFESSION_SKILL_OPTION);
// 技能等级 rate
if( (pszP = strstr( pszOption, "倍%" ) ) != NULL ) sscanf( pszP+3, "%d", &rate );
2016-12-24 08:45:52 +08:00
per = skill_level * rate;
// 准备期的动画
2016-12-24 08:45:52 +08:00
img1 = PROFESSION_SKILL_getInt( array, PROFESSION_SKILL_IMG_1 );
CHAR_setWorkInt( charaindex, CHAR_ENCOUNT_FIX, per);
CHAR_talkToCli( charaindex, -1, "遇敌率上升", CHAR_COLORRED);
2016-12-24 08:45:52 +08:00
CHAR_setWorkInt( charaindex, CHAR_ENCOUNT_NUM, (int)time(NULL) + (60 * 3) );
sprintf( msg, "%d", img1);
lssproto_BATTLESKILL_send ( getfdFromCharaIndex(charaindex), msg ) ;
return ret;
}
// 猎人技能-回避战斗
2016-12-24 08:45:52 +08:00
int PROFESSION_escape( int charaindex, int toNo, int array, char *data, int skill_level )
{
char *pszP = NULL, *pszOption = "\0", msg[20];
int per=0, rate=0, img1, ret =1;
skill_level /= 10;
if( CHAR_getWorkInt( charaindex, CHAR_ENCOUNT_NUM) >= (int)time(NULL) ){
ret = -1;
}
// 技能的参数
2016-12-24 08:45:52 +08:00
pszOption = PROFESSION_SKILL_getChar( array, PROFESSION_SKILL_OPTION);
// 技能等级 rate
if( (pszP = strstr( pszOption, "倍%" ) ) != NULL ) sscanf( pszP+3, "%d", &rate );
2016-12-24 08:45:52 +08:00
per = skill_level * rate;
// 准备期的动画
2016-12-24 08:45:52 +08:00
img1 = PROFESSION_SKILL_getInt( array, PROFESSION_SKILL_IMG_1 );
CHAR_setWorkInt( charaindex, CHAR_ENCOUNT_FIX, (-1) * per);
CHAR_talkToCli( charaindex, -1, "遇敌率下降", CHAR_COLORGREEN);
2016-12-24 08:45:52 +08:00
CHAR_setWorkInt( charaindex, CHAR_ENCOUNT_NUM, (int)time(NULL) + (60 * 3) );
sprintf( msg, "%d", img1);
lssproto_BATTLESKILL_send ( getfdFromCharaIndex(charaindex), msg ) ;
return ret;
}
// 共同技能-气力充沛
2016-12-24 08:45:52 +08:00
int PROFESSION_full_mp( int charaindex, int toNo, int array, char *data, int skill_level )
{
return TRUE;
}
// 共同技能-负重增加
2016-12-24 08:45:52 +08:00
int PROFESSION_strong_back( int charaindex, int toNo, int array, char *data, int skill_level )
{
char *pszP = NULL, *pszOption = "\0";
int rate=0;
// 技能的参数
2016-12-24 08:45:52 +08:00
pszOption = PROFESSION_SKILL_getChar( array, PROFESSION_SKILL_OPTION);
if( (pszP = strstr( pszOption, "倍%" ) ) != NULL ) sscanf( pszP+3, "%d", &rate );
2016-12-24 08:45:52 +08:00
int pile = CHAR_getWorkInt( charaindex, CHAR_WORKATTACHPILE);
pile = pile * rate;
CHAR_setWorkInt( charaindex, CHAR_WORKATTACHPILE,pile);
return TRUE;
}
// 共同技能-自我强化
2016-12-24 08:45:52 +08:00
int PROFESSION_strengthen( int charaindex, int toNo, int array, char *data, int skill_level )
{
return TRUE;
}
#endif