1
0
forked from metin2/server
server/game/src/battle.h
2022-03-05 12:44:06 +02:00

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