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:
@@ -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
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user