forked from metin2/server
101 lines
3.3 KiB
C
101 lines
3.3 KiB
C
#ifndef __INC_METIN_II_GAME_BATTLE_H__
|
|
#define __INC_METIN_II_GAME_BATTLE_H__
|
|
|
|
#include "char.h"
|
|
|
|
enum EBattleTypes // »ó´ë¹æ ±âÁØ
|
|
{
|
|
BATTLE_NONE,
|
|
BATTLE_DAMAGE,
|
|
BATTLE_DEFENSE,
|
|
BATTLE_DEAD
|
|
};
|
|
|
|
extern int CalcAttBonus(LPCHARACTER pkAttacker, LPCHARACTER pkVictim, int iAtk);
|
|
extern int CalcBattleDamage(int iDam, int iAttackerLev, int iVictimLev);
|
|
extern int CalcMeleeDamage(LPCHARACTER pAttacker, LPCHARACTER pVictim, bool bIgnoreDefense = false, bool bIgnoreTargetRating = false);
|
|
extern int CalcMagicDamage(LPCHARACTER pAttacker, LPCHARACTER pVictim);
|
|
extern int CalcArrowDamage(LPCHARACTER pkAttacker, LPCHARACTER pkVictim, LPITEM pkBow, LPITEM pkArrow, bool bIgnoreDefense = false);
|
|
extern float CalcAttackRating(LPCHARACTER pkAttacker, LPCHARACTER pkVictim, bool bIgnoreTargetRating = false);
|
|
|
|
extern bool battle_is_attackable(LPCHARACTER ch, LPCHARACTER victim);
|
|
extern int battle_melee_attack(LPCHARACTER ch, LPCHARACTER victim);
|
|
extern void battle_end(LPCHARACTER ch);
|
|
|
|
extern bool battle_distance_valid_by_xy(long x, long y, long tx, long ty);
|
|
extern bool battle_distance_valid(LPCHARACTER ch, LPCHARACTER victim);
|
|
extern int battle_count_attackers(LPCHARACTER ch);
|
|
|
|
extern void NormalAttackAffect(LPCHARACTER pkAttacker, LPCHARACTER pkVictim);
|
|
|
|
// Ư¼º °ø°Ý
|
|
inline void AttackAffect(LPCHARACTER pkAttacker,
|
|
LPCHARACTER pkVictim,
|
|
BYTE att_point,
|
|
DWORD immune_flag,
|
|
DWORD affect_idx,
|
|
BYTE affect_point,
|
|
long affect_amount,
|
|
DWORD affect_flag,
|
|
int time,
|
|
const char* name)
|
|
{
|
|
if (pkAttacker->GetPoint(att_point) && !pkVictim->IsAffectFlag(affect_flag))
|
|
{
|
|
if (number(1, 100) <= pkAttacker->GetPoint(att_point) && !pkVictim->IsImmune(immune_flag))
|
|
{
|
|
pkVictim->AddAffect(affect_idx, affect_point, affect_amount, affect_flag, time, 0, true);
|
|
|
|
if (test_server)
|
|
{
|
|
pkVictim->ChatPacket(CHAT_TYPE_PARTY, "%s %s(%ld%%) SUCCESS", pkAttacker->GetName(), name, pkAttacker->GetPoint(att_point));
|
|
}
|
|
}
|
|
else if (test_server)
|
|
{
|
|
pkVictim->ChatPacket(CHAT_TYPE_PARTY, "%s %s(%ld%%) FAIL", pkAttacker->GetName(), name, pkAttacker->GetPoint(att_point));
|
|
}
|
|
}
|
|
}
|
|
|
|
inline void SkillAttackAffect(LPCHARACTER pkVictim,
|
|
int success_pct,
|
|
DWORD immune_flag,
|
|
DWORD affect_idx,
|
|
BYTE affect_point,
|
|
long affect_amount,
|
|
DWORD affect_flag,
|
|
int time,
|
|
const char* name)
|
|
{
|
|
if (success_pct && !pkVictim->IsAffectFlag(affect_flag))
|
|
{
|
|
if (number(1, 1000) <= success_pct && !pkVictim->IsImmune(immune_flag))
|
|
{
|
|
pkVictim->AddAffect(affect_idx, affect_point, affect_amount, affect_flag, time, 0, true);
|
|
|
|
// SKILL_ATTACK_NO_LOG_TARGET_NAME_FIX
|
|
if (test_server)
|
|
pkVictim->ChatPacket(CHAT_TYPE_PARTY,
|
|
"%s(%d%%) -> %s SUCCESS", name, success_pct, name);
|
|
// END_OF_SKILL_ATTACK_LOG_NO_TARGET_NAME_FIX
|
|
}
|
|
else if (test_server)
|
|
{
|
|
// SKILL_ATTACK_NO_LOG_TARGET_NAME_FIX
|
|
pkVictim->ChatPacket(CHAT_TYPE_PARTY, "%s(%d%%) -> %s FAIL", name, success_pct, name);
|
|
// END_OF_SKILL_ATTACK_LOG_NO_TARGET_NAME_FIX
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
#define GET_SPEED_HACK_COUNT(ch) ((ch)->m_speed_hack_count)
|
|
#define INCREASE_SPEED_HACK_COUNT(ch) (++GET_SPEED_HACK_COUNT(ch))
|
|
DWORD GET_ATTACK_SPEED(LPCHARACTER ch);
|
|
void SET_ATTACK_TIME(LPCHARACTER ch, LPCHARACTER victim, DWORD current_time);
|
|
void SET_ATTACKED_TIME(LPCHARACTER ch, LPCHARACTER victim, DWORD current_time);
|
|
bool IS_SPEED_HACK(LPCHARACTER ch, LPCHARACTER victim, DWORD current_time);
|
|
|
|
#endif
|