#include "version.h"
#include <string.h>
#include <math.h>
#include "char.h"
#include "char_event.h"
#include "battle.h"
#include "battle_event.h"
#include "configfile.h"
#include "pet.h"
#include "log.h"
#include "lssproto_serv.h"
#include "anim_tbl.h"
#include "battle_magic.h"
#include "util.h"
#include "enemy.h"
#include "pet_skill.h"
#include "char_base.h"
#include "item_event.h"
#ifdef _PROFESSION_SKILL // WON ADD 人物職業技能
#include "profession_skill.h"
#include "item.h"
#include "skill.h"
#endif
#ifdef _PETSKILL_LER
#include "magic_base.h"
#endif
#define DEFENSE_RATE (0.5)
#define DAMAGE_RATE (2.0)
#define CRITICAL_RATE (1.0)
#define KAWASHI_MAX_RATE (75)
#define AJ_SAME (1.0)
#define AJ_UP (1.5)
#define AJ_DOWN (0.6)
#define ATTR_MAX 100
#define D_ATTR (1.0/(ATTR_MAX*ATTR_MAX))
#define D_16 (1.0/16)
#define D_8 (1.0/8)
float gKawashiPara = 0.02;
float gCounterPara = 0.08;
float gCriticalPara = 0.09;
float gBattleDamageModyfy;
int gBattleDuckModyfy;
int gBattleStausChange;
int gBattleStausTurn;
float gDuckPer;
int gCriper;
int gBattleBadStatusTbl[BATTLE_ENTRY_MAX*2];
#ifdef _OTHER_MAGICSTAUTS
#ifdef _MAGICSTAUTS_RESIST
char MagicStatus[MAXSTATUSTYPE][36] = { "NULL","魔抗","鐵壁","火抗","電抗","冰抗"};
int MagicTbl[] = { -1, CHAR_DEFMAGICSTATUS, CHAR_MAGICSUPERWALL, CHAR_MAGICFIRE, CHAR_MAGICTHUNDER, CHAR_MAGICICE };
#else
char MagicStatus[MAXSTATUSTYPE][36] = { "NULL","魔抗","鐵壁"};
int MagicTbl[] = { -1, CHAR_DEFMAGICSTATUS, CHAR_MAGICSUPERWALL };
#endif //_MAGICSTAUTS_RESIST
#endif
char *aszStatus[] = { "全", "毒", "麻", "眠", "石", "醉", "亂", "虛", "劇", "障", "默"
#ifdef _PET_SKILL_SARS // WON ADD 毒煞蔓延
,"煞"
#endif
#ifdef _PROFESSION_SKILL // WON ADD 人物職業技能
,"暈","纏","羅","爆","忘","箭","蠱","針","挑","燒","霜","電","專","火","冰","雷","炎","凍","擊"
#endif
#ifdef _PROFESSION_ADDSKILL
,"抗"
#endif
};
char *aszStatusFull[] = { "全快", "毒", "麻痺", "睡眠", "石化", "酒醉", "混亂", "虛弱", "劇毒", "魔障", "沉默"
#ifdef _PET_SKILL_SARS // WON ADD 毒煞蔓延
,"毒煞"
#endif
#ifdef _PROFESSION_SKILL // WON ADD 人物職業技能
,"暈眩","纏繞","天羅","冰爆","遺忘","冰箭","嗜血蠱","一針見血","挑撥","火附體",
"冰附體","雷附體","專注戰鬥","火抗","冰抗","雷抗","火附","冰附","雷附"
#endif
};
int StatusTbl[] = { -1, CHAR_WORKPOISON, CHAR_WORKPARALYSIS,
CHAR_WORKSLEEP, CHAR_WORKSTONE,
CHAR_WORKDRUNK, CHAR_WORKCONFUSION,
CHAR_WORKWEAKEN, CHAR_WORKDEEPPOISON,
CHAR_WORKBARRIER, CHAR_WORKNOCAST
#ifdef _PET_SKILL_SARS // WON ADD 毒煞蔓延
,CHAR_WORKSARS
#endif
#ifdef _PROFESSION_SKILL // WON ADD 人物職業技能
,CHAR_WORKDIZZY, CHAR_WORKENTWINE
,CHAR_WORKDRAGNET, CHAR_WORKICECRACK
,CHAR_WORKOBLIVION, CHAR_WORKICEARROW
,CHAR_WORKBLOODWORMS, CHAR_WORKSIGN
,CHAR_WORKINSTIGATE, CHAR_WORK_F_ENCLOSE
,CHAR_WORK_I_ENCLOSE, CHAR_WORK_T_ENCLOSE
,CHAR_WORK_FOCUS, CHAR_WORKRESIST_F
,CHAR_WORKRESIST_I, CHAR_WORKRESIST_T
,CHAR_WORK_F_ENCLOSE_2, CHAR_WORK_I_ENCLOSE_2
,CHAR_WORK_T_ENCLOSE_2
#endif
#ifdef _PROFESSION_ADDSKILL
,CHAR_WORKERSIST_F_I_T, CHAR_WORKWATER//水附體
,CHAR_WORKANNEX//附身
,CHAR_WORKFEAR//恐懼
,CHAR_WORKICECRACK2
,CHAR_WORKICECRACK3
,CHAR_WORKICECRACK4
,CHAR_WORKICECRACK5
,CHAR_WORKICECRACK6
,CHAR_WORKICECRACK7
,CHAR_WORKICECRACK8
,CHAR_WORKICECRACK9
,CHAR_WORKICECRACK10
#endif
};
int RegTbl[] = { -1, CHAR_WORKMODPOISON, CHAR_WORKMODPARALYSIS,
CHAR_WORKMODSLEEP, CHAR_WORKMODSTONE,
CHAR_WORKMODDRUNK, CHAR_WORKMODCONFUSION,
CHAR_WORKMODWEAKEN, CHAR_WORKMODDEEPPOISON,
CHAR_WORKMODBARRIER, CHAR_WORKMODNOCAST
#ifdef _PET_SKILL_SARS // WON ADD 毒煞蔓延
,CHAR_WORKMODSARS
#endif
#ifdef _PROFESSION_SKILL // WON ADD 人物職業技能
,CHAR_WORKMODDIZZY, CHAR_WORKMODENTWINE
,CHAR_WORKMODDRAGNET, CHAR_WORKMODICECRACK
,CHAR_WORKMODOBLIVION, CHAR_WORKMODICEARROW
,CHAR_WORKMODBLOODWORMS, CHAR_WORKMODSIGN
,CHAR_WORKMODINSTIGATE, CHAR_WORKMOD_F_ENCLOSE
,CHAR_WORKMOD_I_ENCLOSE, CHAR_WORKMOD_T_ENCLOSE
,CHAR_WORKMOD_FOCUS, CHAR_WORKMODRESIST_F
,CHAR_WORKMODRESIST_I, CHAR_WORKMODRESIST_T
,CHAR_WORKMOD_F_ENCLOSE_2, CHAR_WORKMOD_I_ENCLOSE_2
,CHAR_WORKMOD_T_ENCLOSE_2
#endif
};
char *aszMagicDef[] = { "常", "吸", "反", "無"
#ifdef _PROFESSION_SKILL // WON ADD 人物職業技能
,"陷"
#endif
#ifdef _PETSKILL_ACUPUNCTURE
,"刺"
#endif
};
char *aszMagicDefFull[] = { "通常", "吸收", "反射", "無效化"
#ifdef _PROFESSION_SKILL // WON ADD 人物職業技能
,"陷阱"
#endif
#ifdef _PETSKILL_ACUPUNCTURE
,"針刺"
#endif
};
int MagicDefTbl[] = { -1, CHAR_WORKDAMAGEABSROB, CHAR_WORKDAMAGEREFLEC, CHAR_WORKDAMAGEVANISH
#ifdef _PROFESSION_SKILL // WON ADD 人物職業技能
,CHAR_WORKTRAP
#endif
#ifdef _PETSKILL_ACUPUNCTURE
,CHAR_WORKACUPUNCTURE
#endif
};
char *aszParamChange[] = { "無", "攻", "防", "早", "魅", "捕" };
char *aszParamChangeFull[] = { "無", "攻擊力", "防禦力", "速度", "魅力", "捕獲率" };
int aParamChangeTbl[] = { -1, CHAR_WORKMODATTACK, CHAR_WORKMODDEFENCE,
CHAR_WORKMODQUICK, CHAR_WORKMODCHARM, CHAR_WORKMODCAPTURE };
// Robin 0727 Ride Pet
// 取得騎寵的index
int BATTLE_getRidePet( int charaindex )
{
int petindex = -1;
if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER )
return -1;
else
{
int rideIndex = CHAR_getInt( charaindex, CHAR_RIDEPET );
if( rideIndex == -1 )
return -1;
petindex = CHAR_getCharPet( charaindex, rideIndex );
if( !CHAR_CHECKINDEX( petindex ) ) return -1;
}
return petindex;
}
#ifdef _BACK_VERSION // 復刻版騎寵公式修改
// Robin 0727 Ride Pet
// 取得騎寵時的三圍 復刻版
float BATTLE_adjustRidePet3A( int charaindex, int petindex, int workindex, int action )
{
float ret = CHAR_getWorkInt( charaindex, workindex );
BOOL throwweapon = BATTLE_IsThrowWepon(CHAR_getItemIndex( charaindex, CHAR_ARM ) );
switch( workindex ) {
case CHAR_WORKATTACKPOWER : // 攻擊力
if( throwweapon ) // 投擲
ret = CHAR_getWorkInt( charaindex, CHAR_WORKATTACKPOWER );//間接攻擊:人物
else // 近戰
ret = CHAR_getWorkInt( petindex, CHAR_WORKATTACKPOWER );//直接攻擊:寵物
break;
case CHAR_WORKDEFENCEPOWER : // 防禦力
ret = ( CHAR_getWorkInt( charaindex, CHAR_WORKDEFENCEPOWER ) + CHAR_getWorkInt( petindex, CHAR_WORKDEFENCEPOWER ) ) / 2;
break;
case CHAR_WORKQUICK : // 敏捷力
if( action == ATTACKSIDE ) {
if( throwweapon ) {
ret = CHAR_getWorkInt( charaindex, CHAR_WORKQUICK );
}else {
ret = CHAR_getWorkInt( petindex, CHAR_WORKQUICK );
}
}else if( action == DEFFENCESIDE ){
ret = CHAR_getWorkInt( petindex, CHAR_WORKQUICK );
}
break;
default :
ret = CHAR_getWorkInt( charaindex, workindex );
}
//print(" adj3A_Old:%d:%d=%f ", charaindex, workindex, ret);
return ret;
}
#else
// 取得騎寵時的三圍 正常版
float BATTLE_adjustRidePet3A( int charaindex, int petindex, int workindex, int action )
{
float ret = CHAR_getWorkInt( charaindex, workindex );
BOOL throwweapon = BATTLE_IsThrowWepon(CHAR_getItemIndex( charaindex, CHAR_ARM ) );
switch( workindex ) {
case CHAR_WORKATTACKPOWER : // 攻擊力
if( throwweapon ) // 投擲
ret = CHAR_getWorkInt( charaindex, CHAR_WORKATTACKPOWER )
#ifdef _BATTLE_NEWPOWER //andy 1/24 reEdit
+ CHAR_getWorkInt( petindex, CHAR_WORKATTACKPOWER )*0.4;
#else
+ CHAR_getWorkInt( petindex, CHAR_WORKATTACKPOWER )*0.2;
#endif
else // 近戰
ret = CHAR_getWorkInt( charaindex, CHAR_WORKATTACKPOWER )*0.8
+ CHAR_getWorkInt( petindex, CHAR_WORKATTACKPOWER )*0.8;
break;