uox3/source/combat.h
Dragon Slayer d86725cd43 feat(magic): support configurable spellbook expansions
Make spell and spellbook ranges data-driven so custom schools can extend beyond the original Magery limits.

- add SPELLBOOKDATA persistence and use configured spell/scroll ranges across book lookup, display, packets, scroll drops, and casting
- load spell definitions by their highest configured ID and widen spell IDs through core and JavaScript event paths
- support section-based custom reagents with optional amounts and colors, including JavaScript inspection
- add script-owned temporary effects with pause, resume, removal, and expiration callbacks
2026-07-22 16:01:21 -05:00

86 lines
2.9 KiB
C++

#ifndef __COMBAT_H__
#define __COMBAT_H__
enum WeaponTypes
{
DEF_SWORDS = 1,
SLASH_SWORDS,
ONEHND_LG_SWORDS,
TWOHND_LG_SWORDS,
BARDICHE,
ONEHND_AXES,
TWOHND_AXES,
DEF_MACES,
LG_MACES,
BOWS,
XBOWS,
DEF_FENCING,
TWOHND_FENCING,
DUAL_SWORD,
DUAL_FENCING_STAB,
DUAL_FENCING_SLASH,
BLOWGUNS,
THROWN
};
class CHandleCombat
{
private:
bool HandleCombat( CSocket *mSock, CChar& mChar, CChar *ourTarg );
bool CastSpell( CChar *mChar, CChar *ourTarg, SI32 spellNum );
SI16 CalcDamage( CChar *mChar, CChar *ourTarg, UI08 getFightSkill, UI08 hitLoc );
void PlaySwingAnimations( CChar *mChar );
void PlayHitAnimations( CChar *mChar );
void PlayHitSoundEffect( CChar *mChar, CItem *mWeapon );
void PlayMissedSoundEffect( CChar *mChar );
void HandleNPCSpellAttack( CChar *mChar, CChar *ourTarg, UI16 playerDistance );
CItem * CheckDef( CItem *checkItem, CItem *currItem, SI32 &currDef, WeatherType resistType, bool excludeMedableArmor = false );
CItem * GetArmorDef( CChar *mChar, SI32 &totalDef, UI08 bodyLoc, bool findTotal = false, WeatherType resistType = NONE, bool excludeMedableArmor = false, bool includeShield = false );
public:
bool StartAttack( CChar *mChar, CChar *ourTarg );
void InvalidateAttacker( CChar *mChar );
R64 GetCombatTimeout( CChar *mChar );
void PlayerAttack( CSocket *s );
void AttackTarget( CChar *mChar, CChar *ourTarg );
void PetGuardAttack( CChar *mChar, CChar *owner, CBaseObject *guarded, CChar *petGuard = nullptr );
void CombatLoop( CSocket *mSock, CChar& mChar );
void Kill( CChar *mChar, CChar *ourTarg );
void DoHitMessage( CChar *mChar, CChar *ourTarg, SI08 hitLoc, SI16 damage );
SI08 CalculateHitLoc( void );
UI16 CalcDef( CChar *mChar, UI08 hitLoc, bool doDamage = false, WeatherType element = PHYSICAL, bool excludeMedableArmor = false, bool includeShield = false );
SI16 CalcAttackPower( CChar *mChar, bool doDamage = false );
SI16 CalcLowDamage( CChar *p );
SI16 CalcHighDamage( CChar *p );
UI08 GetCombatSkill( CItem *wItem );
UI08 GetBowType( CItem *bItem );
UI08 GetWeaponType( CItem *i );
CItem * GetShield( CChar *mChar );
CItem * GetWeapon( CChar *mChar );
SI16 ApplyDamageBonuses( WeatherType damageType, CChar *mChar, CChar *ourTarg, UI08 getFightSkill, UI08 hitLoc, SI16 baseDamage );
SI16 ApplyDefenseModifiers( WeatherType damageType, CChar *mChar, CChar *ourTarg, UI08 getFightSkill, UI08 hitLoc, SI16 baseDamage, bool doArmorDamage );
SI16 AdjustRaceDamage( CChar *attack, CChar *defend, CItem *weapon, SI16 bDamage, UI08 hitLoc, UI08 getFightSkill );
SI16 AdjustArmorClassDamage( CChar *attack, CChar *defend, CItem *weapon, SI16 bDamage, UI08 hitLoc );
void SpawnGuard( CChar *mChar, CChar *targChar, SI16 x, SI16 y, SI08 z );
// Combat Animations & Sound Effects
void CombatAnimsNew( CChar *mChar );
void CombatOnHorse( CChar *mChar );
void CombatOnFoot( CChar *mChar );
};
extern CHandleCombat *Combat;
#endif