chuyiwen_gmsv/char/skill.c
chuyiwen e53aa766d9 2017/1/13
battle文件夹-日语注释修改完毕
2017-01-13 06:24:03 +09:00

645 lines
19 KiB
C

#include "version.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "skill.h"
#include "util.h"
#include "char.h"
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
#include "battle.h"
#include "profession_skill.h"
#endif
static SKILL_intDataSetting SKILL_setint[SKILL_DATAINTNUM]={
{"lv"}, /* SKILL_LEVEL */
{"id"}, /* SKILL_ID */
};
static SKILL_charDataSetting SKILL_setchar[SKILL_DATACHARNUM]={
};
static char SKILL_dataString[STRINGBUFSIZ];
char* SKILL_makeStringFromSkillData( Skill* sk )
{
int i;
int strlength=0;
for( i = 0 ; i < SKILL_DATAINTNUM ; i ++ ){
char linedata[128];
snprintf( linedata , sizeof(linedata),
"%s=%d" NONCHAR_DELIMITER,
SKILL_setint[i].dumpskill, sk->data[i] );
strcpysafe( &SKILL_dataString[strlength],
sizeof( SKILL_dataString ) - strlength,
linedata );
strlength += strlen( linedata );
if( strlength > sizeof( SKILL_dataString ) )goto RETURN;
}
for( i = 0 ; i < SKILL_DATACHARNUM ; i ++ ){
char linedata[128];
char escapebuffer[128];
snprintf( linedata, sizeof(linedata),
"%s=%s" NONCHAR_DELIMITER,
SKILL_setchar[i].dumpskill,
makeEscapeString(sk->string[i].string,escapebuffer,
sizeof(escapebuffer)));
strcpysafe( &SKILL_dataString[strlength],
sizeof( SKILL_dataString ) - strlength,
linedata );
strlength += strlen( linedata );
if( strlength > sizeof( SKILL_dataString ) )goto RETURN;
}
RETURN:
dchop( SKILL_dataString , NONCHAR_DELIMITER );
return SKILL_dataString;
}
BOOL SKILL_makeSkillFromStringToArg( char* src, Skill* sk )
{
int readindex=1;
while( 1 ){
BOOL ret;
char linebuf[512];
char first[256];
char second[256];
int i;
ret = getStringFromIndexWithDelim( src ,NONCHAR_DELIMITER ,
readindex,
linebuf, sizeof( linebuf ) );
if( ret == FALSE )
break;
ret = getStringFromIndexWithDelim( linebuf ,"=", 1,
first, sizeof( first ) );
if( ret == FALSE ) return FALSE;
strcpysafe( second , sizeof( second ),
linebuf + strlen(first) + strlen("=") );
for( i = 0 ; i < SKILL_DATAINTNUM ; i ++ ){
if( strcmp(first ,SKILL_setint[i].dumpskill) == 0 ){
sk->data[i] = atoi( second );
goto NEXT;
}
}
for( i = 0 ; i < SKILL_DATACHARNUM ; i ++ ){
if( strcmp(first ,SKILL_setchar[i].dumpskill) == 0 ){
strcpysafe( sk->string[i].string,
sizeof(sk->string[i].string),
makeStringFromEscaped(second) );
goto NEXT;
}
}
fprint( "??? : %s[%s]\n" , linebuf, first );
NEXT:
readindex++;
}
return TRUE;
}
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
INLINE int SKILL_getRealInt( Skill* skill, int element)
{
return skill->data[element];
}
#endif
INLINE int SKILL_getInt( Skill* skill, int element)
{
int value = skill->data[element];
if( element == SKILL_LEVEL ) value /= 100;
return value;
}
INLINE int SKILL_setInt( Skill* skill, int element, int new)
{
int buf = SKILL_getInt( skill, element );
skill->data[element] = new;
return buf;
}
#ifndef _PROFESSION_SKILL // WON ADD 人物职业技能
static void SKILL_setitemlimit( int charaindex, Skill* sk );
static void SKILL_setmerchant( int charaindex, Skill* sk );
static void SKILL_setlevel( int charaindex, Skill* sk );
#endif
static SKILL_table SKILL_tbl[]={
#ifdef _PROFESSION_SKILL // WON ADD 人物职业技能
{ 100, NULL}, // 1
{ 100, NULL},
{ 100, NULL},
{ 100, NULL},
{ 100, NULL},
{ 100, NULL},
{ 100, NULL},
{ 100, NULL},
{ 100, NULL},
{ 100, NULL},
{ 100, NULL},
{ 100, NULL},
{ 100, NULL},
{ 100, NULL},
{ 100, NULL},
{ 100, NULL}, // 16
#else
{8,SKILL_setlevel}, /* SKILL_FIRE */
{4,NULL}, /* SKILL_MAGICIAN */
{4,NULL}, /* SKILL_PREIST */
{8,SKILL_setitemlimit}, /* SKILL_ALOTOFTHINGS */
{8,NULL}, /* SKILL_AVOIDRATEUP */
{4,SKILL_setlevel}, /* SKILL_DETERMINEITEM */
{5,SKILL_setlevel}, /* SKILL_DETERMINEOTHERS */
{8,SKILL_setmerchant}, /* SKILL_MERCHANT */
{8,SKILL_setlevel}, /* SKILL_HEALER */
{8,SKILL_setlevel}, /* SKILL_LARGEVOICE */
#endif
};
#ifndef _PROFESSION_SKILL // WON ADD 人物职业技能
static void SKILL_setitemlimit( int charaindex, Skill* sk )
{
static int itemlimit[9]={
7 + 8 + 4*0,
7 + 8 + 4*1,
7 + 8 + 4*2,
7 + 8 + 4*3,
7 + 8 + 4*4,
7 + 8 + 4*5,
7 + 8 + 4*6,
7 + 8 + 4*7,
7 + 8 + 4*8,
};
int level;
if( !CHAR_CHECKINDEX(charaindex) )return;
if( sk->data[SKILL_IDENTITY] != SKILL_ALOTOFTHINGS )return;
level = sk->data[SKILL_LEVEL];
if( level < 0 )level = 0;
if( level>=arraysizeof(itemlimit) ) level=arraysizeof(itemlimit) - 1;
}
static void SKILL_setmerchant( int charaindex, Skill* sk )
{
int level;
int merchantlevel=0;
if( !CHAR_CHECKINDEX(charaindex) )return;
if( sk->data[SKILL_IDENTITY] != SKILL_MERCHANT )return;
level = sk->data[SKILL_LEVEL];
if( level < 0 )level = 0;
if( level >= SKILL_tbl[sk->data[SKILL_IDENTITY]].maxlevel )
level = SKILL_tbl[sk->data[SKILL_IDENTITY]].maxlevel;
SETHIGHVALUE(merchantlevel,(100 - level*5));
SETLOWVALUE(merchantlevel,(20 + level*5));
CHAR_setInt( charaindex,CHAR_MERCHANTLEVEL,merchantlevel );
}
static void SKILL_setlevel( int charaindex, Skill* sk )
{
static struct skillvalset
{
SKILL_ID id;
CHAR_DATAINT charadataindex;
} skvalset[] = {
{ SKILL_DETERMINEITEM, CHAR_DETERMINEITEM },
{ SKILL_DETERMINEOTHERS, CHAR_RADARSTRENGTH },
{ SKILL_HEALER, CHAR_HEALERLEVEL },
{ SKILL_LARGEVOICE, CHAR_CHATVOLUME },
};
int id;
int i;
int index=-1;
int level;
if( !CHAR_CHECKINDEX(charaindex) )return;
id = sk->data[SKILL_IDENTITY];
for( i=0 ; i<arraysizeof(skvalset) ; i ++ )
if( skvalset[i].id == id )
index = i;
if( index == -1 )return;
level = sk->data[SKILL_LEVEL];
if( level < 0 )level = 0;
if( level >= SKILL_tbl[id].maxlevel )
level = SKILL_tbl[id].maxlevel;
CHAR_setInt(charaindex,skvalset[index].charadataindex,level );
}
#endif
#define SKILLSTRINGBUFSIZ 256
static char ITEM_statusStringBuffer[SKILLSTRINGBUFSIZ];
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
char* SKILL_makeSkillStatusString( Skill* skill, int charaindex, int skill_num )
{
int skillindex=SKILL_getInt( skill,SKILL_IDENTITY);
int Pskill=PROFESSION_SKILL_getskillArray( skillindex);
int skill_level=0, cost_mp=0;
// 人物技能等级
skill_level = SKILL_getInt( skill, SKILL_LEVEL);
// 耗费MP
if( (cost_mp = PROFESSION_MAGIC_COST_MP( charaindex, skill_num )) == -1 )
cost_mp = PROFESSION_SKILL_getInt( Pskill, PROFESSION_SKILL_COST_MP);
snprintf( ITEM_statusStringBuffer, sizeof( ITEM_statusStringBuffer ),
"%d|%d|%d|%d|%d|%d|%d|%s|%s",
PROFESSION_SKILL_getInt( Pskill, PROFESSION_SKILL_USE_FLAG),
SKILL_getInt(skill,SKILL_IDENTITY),
PROFESSION_SKILL_getInt( Pskill, PROFESSION_SKILL_TARGET),
PROFESSION_SKILL_getInt( Pskill, PROFESSION_SKILL_KIND),
PROFESSION_SKILL_getInt( Pskill, PROFESSION_SKILL_ICON),
cost_mp,
skill_level,
PROFESSION_SKILL_getChar( Pskill, PROFESSION_SKILL_NAME),
PROFESSION_SKILL_getChar( Pskill, PROFESSION_SKILL_TXT) );
return ITEM_statusStringBuffer;
}
#else
char* SKILL_makeSkillStatusString( Skill* skill )
{
snprintf( ITEM_statusStringBuffer,
sizeof( ITEM_statusStringBuffer ),
"%d|%d",
SKILL_getInt(skill,SKILL_IDENTITY),
SKILL_getInt(skill,SKILL_LEVEL) );
return ITEM_statusStringBuffer;
}
#endif
char* SKILL_makeSkillFalseString( void )
{
snprintf( ITEM_statusStringBuffer,
sizeof( ITEM_statusStringBuffer ),
"|" );
return ITEM_statusStringBuffer;
}
BOOL SKILL_CHECKID( int skillid )
{
if( SKILL_NUM <= skillid && skillid > 0 )return FALSE;
return TRUE;
}
BOOL SKILL_makeSkillData( Skill* sk ,int skid, int lev )
{
sk->data[SKILL_LEVEL] = lev;
sk->data[SKILL_IDENTITY] = skid;
return TRUE;
}
int SKILL_levelup( Skill* sk )
{
int id = sk->data[SKILL_IDENTITY];
if( !SKILL_CHECKID(id) )return -1;
sk->data[SKILL_LEVEL] ++;
sk->data[SKILL_LEVEL] = min( sk->data[SKILL_LEVEL],
SKILL_tbl[id].maxlevel );
return TRUE;
}
int SKILL_getLevelFromSkillID( int charaindex, SKILL_ID id )
{
int i;
if( !CHAR_CHECKINDEX(charaindex) )return -1;
for( i=0 ; i<CHAR_SKILLMAXHAVE ; i++ ){
CHAR_HaveSkill* sk;
sk = CHAR_getCharHaveSkill(charaindex,i);
if( sk && sk->use && sk->skill.data[SKILL_IDENTITY] == id )
return sk->skill.data[SKILL_LEVEL];
}
return -1;
}
BOOL SKILL_getUpableSkillID( int charaindex,char* buf, int buflen )
{
int i;
if( !CHAR_CHECKINDEX(charaindex)) return FALSE;
if( buflen <= 0 )return FALSE;
buf[0] = '\0';
for( i=0 ; i<CHAR_SKILLMAXHAVE ; i++ ){
CHAR_HaveSkill* chsk;
chsk = CHAR_getCharHaveSkill(charaindex,i);
if( chsk && chsk->use
&& SKILL_CHECKID(chsk->skill.data[SKILL_IDENTITY])
&& chsk->skill.data[SKILL_LEVEL]
< SKILL_tbl[chsk->skill.data[SKILL_IDENTITY]].maxlevel ){
char tmpbuf[512];
snprintf( tmpbuf,sizeof(tmpbuf),"%d|",
chsk->skill.data[SKILL_IDENTITY] );
strcatsafe( buf, buflen,tmpbuf );
}
}
dchop(buf,"|");
return TRUE;
}
void SKILL_skillEffect( int charaindex )
{
int i;
if( !CHAR_CHECKINDEX(charaindex) )return;
if( CHAR_getInt(charaindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER)
return;
for( i=0 ; i<CHAR_SKILLMAXHAVE ; i ++ ){
typedef void (*SKILLEFFECTFUNC)(int,Skill*);
SKILLEFFECTFUNC skfunc;
CHAR_HaveSkill* cskill;
Skill* skill;
int id;
cskill = CHAR_getCharHaveSkill(charaindex,i);
if( cskill == NULL || cskill->use == FALSE )continue;
skill = &cskill->skill;
id = skill->data[SKILL_IDENTITY];
if( !SKILL_CHECKID(id) )continue;
skfunc = (SKILLEFFECTFUNC)SKILL_tbl[id].effectfunc;
if( skfunc )skfunc(charaindex,skill);
}
}
#ifdef _CHAR_PROFESSION // WON ADD 人物职业
// 取使用魔法耗费MP
int PROFESSION_MAGIC_COST_MP( int charaindex, int skill_num )
{
int skill_level=0, dec_mp=0;
int Pskillid, skillid;
char *skill_name;
CHAR_HaveSkill* hskill;
// 人物技能
skillid = CHAR_getCharSkill( charaindex, skill_num);
Pskillid = PROFESSION_SKILL_getskillArray( skillid);
if( Pskillid == -1 ) return FALSE;
// 技能名称
skill_name = PROFESSION_SKILL_getChar( Pskillid, PROFESSION_SKILL_FUNCNAME);
// 技能等级
hskill = CHAR_getCharHaveSkill( charaindex, skill_num );
skill_level = SKILL_getInt( &hskill->skill, SKILL_LEVEL);
skill_level = PROFESSION_CHANGE_SKILL_LEVEL_M( skill_level );
if( (strcmp( skill_name, "PROFESSION_VOLCANO_SPRINGS" )) == 0 ){ // 火山泉
if( skill_level >= 10 ) dec_mp = 35;
else if( skill_level >= 7 ) dec_mp = 30;
else if( skill_level >= 5 ) dec_mp = 20;
else if( skill_level >= 3 ) dec_mp = 15;
else dec_mp = 10;
}else
if( (strcmp( skill_name, "PROFESSION_FIRE_BALL" )) == 0 ){ // 火星球
if( skill_level >= 9 ) dec_mp = 50;
else if( skill_level >= 7 ) dec_mp = 45;
else if( skill_level >= 5 ) dec_mp = 40;
else if( skill_level >= 3 ) dec_mp = 35;
else dec_mp = 30;
}else
if( (strcmp( skill_name, "PROFESSION_SUMMON_THUNDER" )) == 0 ){ // 召雷术
if( skill_level >= 8 ) dec_mp = 30;
else if( skill_level >= 5 ) dec_mp = 25;
else if( skill_level >= 3) dec_mp = 20;
else dec_mp = 10;
}else
if( (strcmp( skill_name, "PROFESSION_CURRENT" )) == 0 ){ // 电流术
#ifdef _PROFESSION_ADDSKILL
if( skill_level >= 10 ) dec_mp = 100;
else if( skill_level > 9 ) dec_mp = 90;
else if( skill_level > 8 ) dec_mp = 80;
else if( skill_level > 7 ) dec_mp = 70;
else if( skill_level > 6 ) dec_mp = 60;
else if( skill_level > 4 ) dec_mp = 50;
else if( skill_level > 2 ) dec_mp = 40;
else dec_mp = 30;
#else
if( skill_level >= 9 ) dec_mp = 80;
else if( skill_level >= 7 ) dec_mp = 60;
else if( skill_level >= 5 ) dec_mp = 50;
else if( skill_level >= 3 ) dec_mp = 40;
else dec_mp = 30;
#endif
}else
if( (strcmp( skill_name, "PROFESSION_STORM" )) == 0 ){ // 暴风雨
#ifdef _PROFESSION_ADDSKILL
if( skill_level > 8 ) dec_mp = 50;
else if( skill_level > 6 ) dec_mp = 45;
else if( skill_level > 4 ) dec_mp = 40;
else if( skill_level > 2 ) dec_mp = 35;
else dec_mp = 30;
#else
if( skill_level >= 10 ) dec_mp = 80;
else if( skill_level >= 6 ) dec_mp = 70;
else if( skill_level >= 5 ) dec_mp = 60;
else dec_mp = 50;
#endif
}else
if( (strcmp( skill_name, "PROFESSION_ICE_ARROW" )) == 0 ){ // 冰箭术
if( skill_level >= 8) dec_mp = 20;
else if( skill_level >= 4 ) dec_mp = 15;
else dec_mp = 10;
}else
if( (strcmp( skill_name, "PROFESSION_ICE_CRACK" )) == 0 ){ // 冰爆术
#ifdef _PROFESSION_ADDSKILL
if( skill_level >= 10 ) dec_mp = 80;
else if( skill_level > 8 ) dec_mp = 70;
else if( skill_level > 6 ) dec_mp = 60;
else if( skill_level > 4 ) dec_mp = 50;
else if( skill_level > 2 ) dec_mp = 40;
else dec_mp = 30;
#else
if( skill_level >= 9 ) dec_mp = 70;
else if( skill_level >= 7 ) dec_mp = 60;
else if( skill_level >= 5 ) dec_mp = 50;
else if( skill_level >= 3 ) dec_mp = 40;
else dec_mp = 30;
#endif
}else
if( (strcmp( skill_name, "PROFESSION_DOOM" )) == 0 ){ // 世界末日
if( skill_level > 8 ) dec_mp = 150;
else if( skill_level > 4 ) dec_mp = 100;
else dec_mp = 50;
}else
if( (strcmp( skill_name, "PROFESSION_FIRE_SPEAR" )) == 0 ){ // 火龙枪
if( skill_level > 8 ) dec_mp = 80;
else if( skill_level > 6 ) dec_mp = 70;
else if( skill_level > 4 ) dec_mp = 60;
else if( skill_level > 2 ) dec_mp = 40;
else dec_mp = 30;
}else
if( (strcmp( skill_name, "PROFESSION_BLOOD_WORMS" )) == 0 ){ // 嗜血蛊
if( skill_level >= 10 ) dec_mp = 15;
else if( skill_level >= 5 ) dec_mp = 10;
else dec_mp = 5;
}else
if( (strcmp( skill_name, "PROFESSION_SIGN" )) == 0 ){ // 一针见血
if( skill_level >= 8 ) dec_mp = 10;
else dec_mp = 5;
}else
if( (strcmp( skill_name, "PROFESSION_ENCLOSE" )) == 0 ){ // 附身术
if( skill_level >= 10 ) dec_mp = 80;
else if( skill_level >= 8 ) dec_mp = 70;
else if( skill_level >= 5) dec_mp = 60;
else dec_mp = 50;
}else
if( (strcmp( skill_name, "PROFESSION_ICE_MIRROR" )) == 0 ){ // 冰镜术
if( skill_level >= 9 ) dec_mp = 40;
else if( skill_level >= 7 ) dec_mp = 35;
else if( skill_level >= 5 ) dec_mp = 30;
else if( skill_level >= 3 ) dec_mp = 25;
else dec_mp = 20;
}else
if( (strcmp( skill_name, "PROFESSION_FIRE_ENCLOSE" )) == 0 ){ // 火附体
if( skill_level >= 10 ) dec_mp = 50;
else if( skill_level >= 7 ) dec_mp = 40;
else if( skill_level >= 4 ) dec_mp = 30;
else dec_mp = 20;
}else
if( (strcmp( skill_name, "PROFESSION_ICE_ENCLOSE" )) == 0 ){ // 冰附体
if( skill_level >= 10 ) dec_mp = 50;
else if( skill_level >= 7 ) dec_mp = 40;
else if( skill_level >= 4 ) dec_mp = 30;
else dec_mp = 20;
}else
if( (strcmp( skill_name, "PROFESSION_THUNDER_ENCLOSE" )) == 0 ){ // 雷附体
if( skill_level >= 10 ) dec_mp = 50;
else if( skill_level >= 7 ) dec_mp = 40;
else if( skill_level >= 4 ) dec_mp = 30;
else dec_mp = 20;
}else
if( (strcmp( skill_name, "PROFESSION_TRANSPOSE" )) == 0 ){ // 移形换位
if( skill_level >= 10 ) dec_mp = 50;
else if( skill_level >= 9 ) dec_mp = 40;
else if( skill_level >= 7 ) dec_mp = 30;
else if( skill_level >= 4 ) dec_mp = 20;
else dec_mp = 10;
}else
#ifdef _PROFESSION_ADDSKILL
if( (strcmp( skill_name, "PROFESSION_RESIST_F_I_T" )) == 0 ){ // 自然威能
if( skill_level >= 10 ) dec_mp = 20;
else if( skill_level >= 9 ) dec_mp = 15;
else if( skill_level >= 6 ) dec_mp = 10;
else dec_mp = 5;
}else
if( (strcmp( skill_name, "PROFESSION_CALL_NATURE" )) == 0 ){ // 号召自然
/*skill_level = SKILL_getInt( &hskill->skill, SKILL_LEVEL);
if( skill_level >= 100 ) dec_mp = 50;
else if( skill_level > 95 ) dec_mp = 50;
else if( skill_level > 90 ) dec_mp = 50;
else if( skill_level > 85 ) dec_mp = 50;
else if( skill_level > 80 ) dec_mp = 50;
else if( skill_level > 60 ) dec_mp = 50;
else if( skill_level > 40 ) dec_mp = 50;
else if( skill_level > 20 ) dec_mp = 50;
else dec_mp = 50;*/
dec_mp = 50;
}else
if( (strcmp( skill_name, "PROFESSION_BOUNDARY" )) == 0 ){ // 四属性结界
char *pszP=NULL;
if( skill_level > 9 ) dec_mp = 20;
else if( skill_level > 6 ) dec_mp = 15;
else dec_mp = 10;
//破除结界耗损mp与其他结界不同
if( (pszP = strstr( PROFESSION_SKILL_getChar( Pskillid, PROFESSION_SKILL_OPTION), "破结界" ) ) != NULL ){// 技能的参数
if( skill_level >= 9 ) dec_mp = 20;
else if( skill_level > 4 ) dec_mp = 15;
else if( skill_level > 2 ) dec_mp = 10;
else dec_mp = 5;
}
}else
#endif
{
return -1;
}
return dec_mp;
}
INLINE int PROFESSION_CHANGE_SKILL_LEVEL_M( int skill_level )
{
if( skill_level > 90 )skill_level = 10;
else if( skill_level > 80 ) skill_level = 9;
else if( skill_level > 70 ) skill_level = 8;
else if( skill_level > 60 ) skill_level = 7;
else if( skill_level > 50 ) skill_level = 6;
else if( skill_level > 40 ) skill_level = 5;
else if( skill_level > 30 ) skill_level = 4;
else if( skill_level > 20 ) skill_level = 3;
else if( skill_level > 10 ) skill_level = 2;
else skill_level = 1;
return skill_level;
}
INLINE int PROFESSION_CHANGE_SKILL_LEVEL_A( int skill_level )
{
if( skill_level >= 100 ) skill_level = 10;
else if( skill_level > 90 ) skill_level = 9;
else if( skill_level > 80 ) skill_level = 8;
else if( skill_level > 70 ) skill_level = 7;
else if( skill_level > 60 ) skill_level = 6;
else if( skill_level > 50 ) skill_level = 5;
else if( skill_level > 40 ) skill_level = 4;
else if( skill_level > 30 ) skill_level = 3;
else if( skill_level > 20 ) skill_level = 2;
else if( skill_level > 10 ) skill_level = 1;
else skill_level = 0;
return skill_level;
}
#endif