Pet Battles: Fix BattlePetState IDs from DB2, add per-type weather damage

Cross-referenced BattlePetState.db2 via wago.tools/WoWDBDefs and fixed
wrong state IDs: Stat_Accuracy is 41 (was 22=Mechanic_IsStunned),
Mod_HealingDealtPercent is 65 (was 26=Ramping_DamageID),
Mod_HealingTakenPercent is 66 (was 27=Ramping_DamageUses).

Added per-type weather damage bonus using the 3-state mechanism from
DB2: Mod_PetTypeDamageDealtPercent(87) + Mod_PetType_ID(89) restricts
damage bonuses to matching ability types (e.g. Rain = +25% Aquatic
only, not all damage). Also added Add_FlatDamageTaken(71) for
Sandstorm-style damage shields.

Expanded enum to 43 states covering weather markers (53-63, 316),
mechanics, cosmetics, and combat modifiers — all verified against
BattlePetState.db2 LuaName field.
This commit is contained in:
luis
2026-03-20 01:23:39 -03:00
parent 8f9c7c3de8
commit ad0637b126
2 changed files with 51 additions and 9 deletions
+31 -9
View File
@@ -99,26 +99,48 @@ namespace BattlePets
FLAGS_CONTROL_TYPE_REMOVE = 2
};
// taken from BattlePetState.db2 - it seems to store some initial values for battle pets
// there are only values used in BattlePetSpeciesState.db2 and BattlePetBreedState.db2
// TODO: expand this enum if needed
// BattlePetState.db2 ? LuaName-based IDs (verified via wago.tools/WoWDBDefs)
enum BattlePetState
{
STATE_IS_DEAD = 1,
STATE_MAX_HEALTH_BONUS = 2,
STATE_INTERNAL_INITIAL_LEVEL = 17,
STATE_STAT_POWER = 18,
STATE_STAT_STAMINA = 19,
STATE_STAT_SPEED = 20,
STATE_STAT_ACCURACY = 22,
STATE_MECHANIC_IS_POISONED = 21,
STATE_MECHANIC_IS_STUNNED = 22,
STATE_MOD_DAMAGE_DEALT_PERCENT = 23,
STATE_MOD_DAMAGE_TAKEN_PERCENT = 24,
STATE_MOD_SPEED_PERCENT = 25,
STATE_MOD_HEALING_DEALT_PERCENT = 26,
STATE_MOD_HEALING_TAKEN_PERCENT = 27,
STATE_GENDER = 78, // 1 - male, 2 - female
STATE_STAT_CRIT_CHANCE = 40,
STATE_STAT_ACCURACY = 41,
STATE_WEATHER_BURNT_EARTH = 53,
STATE_WEATHER_ARCANE_STORM = 54,
STATE_WEATHER_MOONLIGHT = 55,
STATE_WEATHER_DARKNESS = 56,
STATE_WEATHER_SANDSTORM = 57,
STATE_WEATHER_BLIZZARD = 58,
STATE_WEATHER_MUD = 59,
STATE_WEATHER_RAIN = 60,
STATE_WEATHER_SUNLIGHT = 61,
STATE_WEATHER_LIGHTNING_STORM = 62,
STATE_WEATHER_WINDY = 63,
STATE_MOD_HEALING_DEALT_PERCENT = 65,
STATE_MOD_HEALING_TAKEN_PERCENT = 66,
STATE_ADD_FLAT_DAMAGE_TAKEN = 71,
STATE_ADD_FLAT_DAMAGE_DEALT = 72,
STATE_STAT_DODGE = 73,
STATE_GENDER = 78,
STATE_MECHANIC_IS_BLIND = 82,
STATE_COSMETIC_WATER_BUBBLED = 85,
STATE_MOD_PET_TYPE_DAMAGE_DEALT_PCT = 87,
STATE_MOD_PET_TYPE_DAMAGE_TAKEN_PCT = 88,
STATE_MOD_PET_TYPE_ID = 89,
STATE_SPECIAL_IS_COCKROACH = 93,
STATE_MOD_MAX_HEALTH_PERCENT = 99,
STATE_COSMETIC_FLY_TIER = 128,
STATE_SPECIAL_IS_CLEANSING = 141,
STATE_COSMETIC_BIGGLESWORTH = 144,
STATE_PASSIVE_ELITE = 153,
STATE_PASSIVE_BOSS = 162,
@@ -126,8 +148,8 @@ namespace BattlePets
// these are not in BattlePetState.db2 but are used in BattlePetSpeciesState.db2
STATE_START_WITH_BUFF = 183,
STATE_START_WITH_BUFF_2 = 184,
//
STATE_COSMETIC_SPECTRAL_BLUE = 196
STATE_COSMETIC_SPECTRAL_BLUE = 196,
STATE_WEATHER_TOXIC_GAS = 316,
};
enum BattlePetSaveInfo
+20
View File
@@ -1578,12 +1578,24 @@ namespace PetBattles
int32 envDmgDealMod = _environments[PET_BATTLE_WEATHER_ENV_SLOT].GetState(BattlePets::STATE_MOD_DAMAGE_DEALT_PERCENT);
if (envDmgDealMod != 0)
rawDamage *= (1.0f + envDmgDealMod / 100.0f);
// Per-type weather damage bonus: only applies if ability type matches Mod_PetType_ID
int32 petTypeBonus = _environments[PET_BATTLE_WEATHER_ENV_SLOT].GetState(BattlePets::STATE_MOD_PET_TYPE_DAMAGE_DEALT_PCT);
int32 petTypeID = _environments[PET_BATTLE_WEATHER_ENV_SLOT].GetState(BattlePets::STATE_MOD_PET_TYPE_ID);
if (petTypeBonus != 0 && int32(abilityType) == petTypeID)
rawDamage *= (1.0f + petTypeBonus / 100.0f);
}
if (defender.PetType != PET_TYPE_ELEMENTAL)
{
int32 envDmgTakeMod = _environments[PET_BATTLE_WEATHER_ENV_SLOT].GetState(BattlePets::STATE_MOD_DAMAGE_TAKEN_PERCENT);
if (envDmgTakeMod != 0)
rawDamage *= (1.0f + envDmgTakeMod / 100.0f);
// Per-type weather damage taken: only applies if ability type matches Mod_PetType_ID
int32 petTypeTaken = _environments[PET_BATTLE_WEATHER_ENV_SLOT].GetState(BattlePets::STATE_MOD_PET_TYPE_DAMAGE_TAKEN_PCT);
int32 petTypeID = _environments[PET_BATTLE_WEATHER_ENV_SLOT].GetState(BattlePets::STATE_MOD_PET_TYPE_ID);
if (petTypeTaken != 0 && int32(abilityType) == petTypeID)
rawDamage *= (1.0f + petTypeTaken / 100.0f);
}
// Beast passive: +25% damage when below 50% HP
@@ -1612,6 +1624,14 @@ namespace PetBattles
int32 damage = std::max(1, int32(std::round(rawDamage)));
// Flat damage taken modifier from environment (e.g. Sandstorm damage shield)
if (defender.PetType != PET_TYPE_ELEMENTAL)
{
int32 flatDmgTaken = _environments[PET_BATTLE_WEATHER_ENV_SLOT].GetState(BattlePets::STATE_ADD_FLAT_DAMAGE_TAKEN);
if (flatDmgTaken != 0)
damage = std::max(1, damage + flatDmgTaken);
}
// Magic passive: cannot take more than 35% max HP in a single hit
if (defender.PetType == PET_TYPE_MAGIC)
damage = std::min(damage, int32(defender.MaxHealth * PASSIVE_MAGIC_DAMAGE_CAP_PCT));