import { PlayerCtor } from '@rpgjs/common'; import { RpgPlayer } from './Player'; import { SkillData } from './SkillManager'; export interface DamageResult { damage: number; critical: boolean; elementVulnerable: boolean; guard: boolean; superGuard: boolean; } export type BattleParameterSet = Record; export interface DamageFormulas { damageSkill?: (attacker: BattleParameterSet, defender: BattleParameterSet, skill: SkillData) => number; damagePhysic?: (attacker: BattleParameterSet, defender: BattleParameterSet) => number; damageCritical?: (damage: number, attacker: BattleParameterSet, defender: BattleParameterSet) => number; damageGuard?: (damage: number, attacker: BattleParameterSet, defender: BattleParameterSet) => number; coefficientElements?: (attacker: { rate: number; }, defender: { rate: number; }, defenderBase: { rate: number; }) => number; } export interface IBattleManager { /** * Apply damage. Player will lose HP. the `attackerPlayer` parameter is the other player, the one who attacks. * * If you don't set the skill parameter, it will be a physical attack. * The attack formula is already defined but you can customize it in the server options. * This method handles all aspects of damage calculation including critical hits, * elemental vulnerabilities, guard effects, and applies the final damage to HP. * * @param attackerPlayer - The attacking player who deals the damage * @param skill - Optional skill object for magical attacks, if not provided uses physical attack * @returns Object containing damage details and special effects that occurred * * @example * ```ts * // Physical attack * const result = player.applyDamage(attackerPlayer); * console.log(`Physical damage: ${result.damage}, Critical: ${result.critical}`); * * // Magical attack with skill * const fireSkill = { id: 'fire', power: 50, element: 'fire' }; * const magicResult = player.applyDamage(attackerPlayer, fireSkill); * console.log(`Magic damage: ${magicResult.damage}, Vulnerable: ${magicResult.elementVulnerable}`); * * // Check for guard effects * if (result.guard) { * console.log('Attack was partially blocked!'); * } * if (result.superGuard) { * console.log('Attack was heavily reduced by super guard!'); * } * ``` */ applyDamage(attackerPlayer: RpgPlayer, skill?: SkillData): DamageResult; } export declare function WithBattleManager(Base: TBase): new (...args: ConstructorParameters) => InstanceType & IBattleManager;