azeroth-shell 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -2
- package/bin/azsh.mjs +19 -0
- package/docs/aifid/eventai-texts.json +4414 -0
- package/docs/dungeons/atlas/atlas-rows-dungeons.json +8989 -0
- package/docs/dungeons/survey/pack-id-migration.json +2418 -0
- package/package.json +35 -4
- package/src/autopilot/bossSkip.ts +26 -0
- package/src/autopilot/combatRotation.ts +824 -0
- package/src/autopilot/config.ts +533 -0
- package/src/autopilot/consumables.ts +58 -0
- package/src/autopilot/encounterStand.ts +121 -0
- package/src/autopilot/objectGatePlan.ts +53 -0
- package/src/autopilot/pathEngage.ts +229 -0
- package/src/autopilot/plan.ts +1643 -0
- package/src/autopilot/questPolicy.ts +274 -0
- package/src/autopilot/routeStep.ts +69 -0
- package/src/autopilot/sessionReport.ts +88 -0
- package/src/autopilot/topOffPower.ts +26 -0
- package/src/autopilot/view.ts +476 -0
- package/src/cli/bootCheck.mjs +34 -0
- package/src/cli/bootData.mjs +57 -0
- package/src/cli/combatLogFilter.ts +153 -0
- package/src/cli/combatLogFormat.ts +613 -0
- package/src/cli/fileRepository.mjs +105 -0
- package/src/cli/gzLoader.mjs +31 -0
- package/src/cli/liveGauntletEscort.ts +978 -0
- package/src/cli/liveStratUndead.ts +305 -0
- package/src/cli/macroHostCombat.ts +545 -0
- package/src/cli/macroHostWorld.ts +330 -0
- package/src/cli/prefs.mjs +31 -0
- package/src/cli/register.mjs +4 -0
- package/src/cli/repl.mjs +693 -0
- package/src/cli/rotationText.mjs +226 -0
- package/src/cli/squad.mjs +105 -0
- package/src/cli/term.mjs +144 -0
- package/src/cli/text.mjs +122 -0
- package/src/cli/tui.mjs +626 -0
- package/src/cli/tuiArena.mjs +109 -0
- package/src/cli/tuiAutopilotSettings.mjs +93 -0
- package/src/cli/tuiBags.mjs +180 -0
- package/src/cli/tuiBars.mjs +133 -0
- package/src/cli/tuiBg.mjs +243 -0
- package/src/cli/tuiBulk.mjs +162 -0
- package/src/cli/tuiCheck.mjs +1882 -0
- package/src/cli/tuiCity.mjs +396 -0
- package/src/cli/tuiCompanionKit.mjs +300 -0
- package/src/cli/tuiCompanions.mjs +471 -0
- package/src/cli/tuiDev.mjs +62 -0
- package/src/cli/tuiDungeon.mjs +606 -0
- package/src/cli/tuiEnchantTarget.mjs +120 -0
- package/src/cli/tuiFight.mjs +577 -0
- package/src/cli/tuiFightPanes.mjs +228 -0
- package/src/cli/tuiFloor.mjs +506 -0
- package/src/cli/tuiGear.mjs +158 -0
- package/src/cli/tuiHonor.mjs +74 -0
- package/src/cli/tuiLoot.mjs +97 -0
- package/src/cli/tuiMacros.mjs +144 -0
- package/src/cli/tuiOutfitter.mjs +115 -0
- package/src/cli/tuiPet.mjs +116 -0
- package/src/cli/tuiProfessions.mjs +800 -0
- package/src/cli/tuiRaid.mjs +127 -0
- package/src/cli/tuiRep.mjs +65 -0
- package/src/cli/tuiSaves.mjs +69 -0
- package/src/cli/tuiSearch.mjs +363 -0
- package/src/cli/tuiSettings.mjs +151 -0
- package/src/cli/tuiSimLab.mjs +80 -0
- package/src/cli/tuiTalents.mjs +60 -0
- package/src/cli/tuiViews.mjs +1178 -0
- package/src/cli/tuiWiki.mjs +181 -0
- package/src/cli/tuiWorld.mjs +361 -0
- package/src/cli/wikiIndex.ts +259 -0
- package/src/cli/wikiSources.ts +355 -0
- package/src/data/alteracValley.ts +176 -0
- package/src/data/appearanceOptions.ts +534 -0
- package/src/data/applyLootChanceSanity.ts +21 -0
- package/src/data/createFlavor.ts +96 -0
- package/src/data/customItems.ts +33 -0
- package/src/data/dataStore.ts +1904 -0
- package/src/data/dungeonGameObjects.ts +84 -0
- package/src/data/dungeonPlateCover.ts +66 -0
- package/src/data/dungeonSpawns.ts +294 -0
- package/src/data/dungeons/alterac-valley.ts +135 -0
- package/src/data/dungeons/apply-dungeon-rooms.ts +29 -0
- package/src/data/dungeons/apply-encounter-outdoors.ts +72 -0
- package/src/data/dungeons/apply-instance-geometry.ts +65 -0
- package/src/data/dungeons/apply-spawn-placement.ts +171 -0
- package/src/data/dungeons/blackfathom-deeps.ts +539 -0
- package/src/data/dungeons/blackrock-depths.ts +1410 -0
- package/src/data/dungeons/blackwing-lair.ts +129 -0
- package/src/data/dungeons/boss-eventai.ts +8 -0
- package/src/data/dungeons/deadmines.ts +410 -0
- package/src/data/dungeons/dire-maul-east.ts +980 -0
- package/src/data/dungeons/dire-maul-north.ts +661 -0
- package/src/data/dungeons/dire-maul-west.ts +785 -0
- package/src/data/dungeons/dungeon-rooms.json +5479 -0
- package/src/data/dungeons/encounter-outdoors.json +359 -0
- package/src/data/dungeons/eventai/blackfathom-deeps.ts +308 -0
- package/src/data/dungeons/eventai/blackrock-depths.ts +1257 -0
- package/src/data/dungeons/eventai/deadmines.ts +264 -0
- package/src/data/dungeons/eventai/dire-maul-east.ts +320 -0
- package/src/data/dungeons/eventai/gnomeregan.ts +213 -0
- package/src/data/dungeons/eventai/helpers.ts +79 -0
- package/src/data/dungeons/eventai/index.ts +133 -0
- package/src/data/dungeons/eventai/lbrs.ts +372 -0
- package/src/data/dungeons/eventai/maraudon.ts +323 -0
- package/src/data/dungeons/eventai/ragefire-chasm.ts +108 -0
- package/src/data/dungeons/eventai/razorfen-downs.ts +207 -0
- package/src/data/dungeons/eventai/razorfen-kraul.ts +326 -0
- package/src/data/dungeons/eventai/scholomance.ts +680 -0
- package/src/data/dungeons/eventai/shadowfang-keep.ts +230 -0
- package/src/data/dungeons/eventai/sm-cathedral.ts +75 -0
- package/src/data/dungeons/eventai/sm-graveyard.ts +150 -0
- package/src/data/dungeons/eventai/sm-library.ts +55 -0
- package/src/data/dungeons/eventai/stratholme-undead.ts +127 -0
- package/src/data/dungeons/eventai/sunken-temple.ts +582 -0
- package/src/data/dungeons/eventai/the-stockade.ts +228 -0
- package/src/data/dungeons/eventai/ubrs.ts +225 -0
- package/src/data/dungeons/eventai/uldaman.ts +355 -0
- package/src/data/dungeons/eventai/wailing-caverns.ts +396 -0
- package/src/data/dungeons/eventai/zul-farrak.ts +591 -0
- package/src/data/dungeons/gnomeregan.ts +909 -0
- package/src/data/dungeons/index.ts +126 -0
- package/src/data/dungeons/instance-geometry.json +5233 -0
- package/src/data/dungeons/key-sources.json +169 -0
- package/src/data/dungeons/lbrs.ts +996 -0
- package/src/data/dungeons/maraudon.ts +786 -0
- package/src/data/dungeons/molten-core.ts +194 -0
- package/src/data/dungeons/naxxramas.ts +173 -0
- package/src/data/dungeons/onyxias-lair.ts +71 -0
- package/src/data/dungeons/pack-from-clusters.ts +1256 -0
- package/src/data/dungeons/ragefire-chasm.ts +238 -0
- package/src/data/dungeons/razorfen-downs.ts +698 -0
- package/src/data/dungeons/razorfen-kraul.ts +766 -0
- package/src/data/dungeons/ruins-of-ahnqiraj.ts +121 -0
- package/src/data/dungeons/scholomance.ts +1076 -0
- package/src/data/dungeons/shadowfang-keep.ts +740 -0
- package/src/data/dungeons/sm-armory.ts +266 -0
- package/src/data/dungeons/sm-cathedral.ts +430 -0
- package/src/data/dungeons/sm-graveyard.ts +482 -0
- package/src/data/dungeons/sm-library.ts +337 -0
- package/src/data/dungeons/stratholme-live.ts +808 -0
- package/src/data/dungeons/stratholme-undead.ts +1164 -0
- package/src/data/dungeons/sunken-temple.ts +931 -0
- package/src/data/dungeons/temple-of-ahnqiraj.ts +119 -0
- package/src/data/dungeons/the-stockade.ts +282 -0
- package/src/data/dungeons/ubrs.ts +1286 -0
- package/src/data/dungeons/uldaman.ts +685 -0
- package/src/data/dungeons/wailing-caverns.ts +356 -0
- package/src/data/dungeons/zul-farrak.ts +686 -0
- package/src/data/dungeons/zul-gurub.ts +142 -0
- package/src/data/dungeons.ts +42 -0
- package/src/data/fixtures.ts +446 -0
- package/src/data/gameobject-data.json.gz +0 -0
- package/src/data/item-data.json.gz +0 -0
- package/src/data/loot-data.json.gz +0 -0
- package/src/data/maps/atlas-approach-maps.json +1425 -0
- package/src/data/maps/atlas-landmarks.json +1711 -0
- package/src/data/maps/dungeon-viewports.json +392 -0
- package/src/data/materializeModDamagePercentTaken.ts +70 -0
- package/src/data/materializeModHealthRegen.ts +89 -0
- package/src/data/materializeSpellReputation.ts +26 -0
- package/src/data/pageTexts.ts +19 -0
- package/src/data/profession-data.json.gz +0 -0
- package/src/data/raid-plans/blackfathom-deeps.json +86 -0
- package/src/data/raid-plans/blackrock-depths.json +419 -0
- package/src/data/raid-plans/blackwing-lair.json +328 -0
- package/src/data/raid-plans/deadmines.json +55 -0
- package/src/data/raid-plans/dire-maul-east.json +94 -0
- package/src/data/raid-plans/dire-maul-north.json +70 -0
- package/src/data/raid-plans/dire-maul-west.json +75 -0
- package/src/data/raid-plans/gnomeregan.json +131 -0
- package/src/data/raid-plans/lbrs.json +176 -0
- package/src/data/raid-plans/maraudon.json +102 -0
- package/src/data/raid-plans/molten-core.json +169 -0
- package/src/data/raid-plans/naxxramas.json +354 -0
- package/src/data/raid-plans/onyxias-lair.json +18 -0
- package/src/data/raid-plans/ragefire-chasm.json +30 -0
- package/src/data/raid-plans/razorfen-downs.json +75 -0
- package/src/data/raid-plans/razorfen-kraul.json +53 -0
- package/src/data/raid-plans/ruins-of-ahnqiraj.json +110 -0
- package/src/data/raid-plans/scholomance.json +170 -0
- package/src/data/raid-plans/shadowfang-keep.json +87 -0
- package/src/data/raid-plans/sm-armory.json +53 -0
- package/src/data/raid-plans/sm-cathedral.json +72 -0
- package/src/data/raid-plans/sm-graveyard.json +63 -0
- package/src/data/raid-plans/sm-library.json +23 -0
- package/src/data/raid-plans/stratholme-live.json +129 -0
- package/src/data/raid-plans/stratholme-undead.json +73 -0
- package/src/data/raid-plans/sunken-temple.json +159 -0
- package/src/data/raid-plans/temple-of-ahnqiraj.json +163 -0
- package/src/data/raid-plans/the-stockade.json +42 -0
- package/src/data/raid-plans/ubrs.json +53 -0
- package/src/data/raid-plans/uldaman.json +131 -0
- package/src/data/raid-plans/wailing-caverns.json +90 -0
- package/src/data/raid-plans/zul-farrak.json +156 -0
- package/src/data/raid-plans/zul-gurub.json +307 -0
- package/src/data/raidInstanceCreatures.mjs +473 -0
- package/src/data/rotations/index.ts +152 -0
- package/src/data/rotations/layout.mjs +72 -0
- package/src/data/rotations/pve/druid/balance.json +754 -0
- package/src/data/rotations/pve/druid/feral-tank.json +2448 -0
- package/src/data/rotations/pve/druid/feral.json +2660 -0
- package/src/data/rotations/pve/druid/restoration.json +424 -0
- package/src/data/rotations/pve/hunter/beast-mastery.json +1288 -0
- package/src/data/rotations/pve/hunter/marksmanship.json +1260 -0
- package/src/data/rotations/pve/hunter/survival.json +1373 -0
- package/src/data/rotations/pve/mage/arcane-leveling.json +1798 -0
- package/src/data/rotations/pve/mage/fire-leveling.json +2003 -0
- package/src/data/rotations/pve/mage/frost-leveling.json +1912 -0
- package/src/data/rotations/pve/paladin/holy.json +755 -0
- package/src/data/rotations/pve/paladin/protection.json +962 -0
- package/src/data/rotations/pve/paladin/retribution.json +924 -0
- package/src/data/rotations/pve/priest/discipline.json +772 -0
- package/src/data/rotations/pve/priest/holy.json +707 -0
- package/src/data/rotations/pve/priest/shadow.json +787 -0
- package/src/data/rotations/pve/rogue/assassination.json +2477 -0
- package/src/data/rotations/pve/rogue/combat.json +2483 -0
- package/src/data/rotations/pve/rogue/subtlety.json +2523 -0
- package/src/data/rotations/pve/shaman/elemental.json +1157 -0
- package/src/data/rotations/pve/shaman/enhancement.json +1085 -0
- package/src/data/rotations/pve/shaman/restoration.json +592 -0
- package/src/data/rotations/pve/warlock/affliction.json +1185 -0
- package/src/data/rotations/pve/warlock/demonology.json +1165 -0
- package/src/data/rotations/pve/warlock/destruction.json +1177 -0
- package/src/data/rotations/pve/warrior/arms.json +3020 -0
- package/src/data/rotations/pve/warrior/fury.json +2996 -0
- package/src/data/rotations/pve/warrior/protection.json +2509 -0
- package/src/data/rotations/pvp/druid/balance.json +593 -0
- package/src/data/rotations/pvp/druid/feral.json +3276 -0
- package/src/data/rotations/pvp/druid/restoration.json +662 -0
- package/src/data/rotations/pvp/hunter/beast-mastery.json +665 -0
- package/src/data/rotations/pvp/hunter/marksmanship.json +2406 -0
- package/src/data/rotations/pvp/hunter/survival.json +635 -0
- package/src/data/rotations/pvp/mage/arcane.json +574 -0
- package/src/data/rotations/pvp/mage/fire.json +570 -0
- package/src/data/rotations/pvp/mage/frost.json +4048 -0
- package/src/data/rotations/pvp/paladin/holy.json +1498 -0
- package/src/data/rotations/pvp/paladin/protection.json +567 -0
- package/src/data/rotations/pvp/paladin/retribution.json +1110 -0
- package/src/data/rotations/pvp/priest/discipline.json +1848 -0
- package/src/data/rotations/pvp/priest/holy.json +6340 -0
- package/src/data/rotations/pvp/priest/shadow.json +2329 -0
- package/src/data/rotations/pvp/rogue/assassination.json +1322 -0
- package/src/data/rotations/pvp/rogue/combat.json +5258 -0
- package/src/data/rotations/pvp/rogue/subtlety.json +586 -0
- package/src/data/rotations/pvp/shaman/elemental.json +1404 -0
- package/src/data/rotations/pvp/shaman/enhancement.json +1277 -0
- package/src/data/rotations/pvp/shaman/restoration.json +2490 -0
- package/src/data/rotations/pvp/warlock/affliction.json +1017 -0
- package/src/data/rotations/pvp/warlock/demonology.json +1503 -0
- package/src/data/rotations/pvp/warlock/destruction.json +638 -0
- package/src/data/rotations/pvp/warrior/arms.json +5665 -0
- package/src/data/rotations/pvp/warrior/fury.json +850 -0
- package/src/data/rotations/pvp/warrior/protection.json +777 -0
- package/src/data/schema/bundle.ts +511 -0
- package/src/data/schema/constants.ts +49 -0
- package/src/data/schema/creature.ts +454 -0
- package/src/data/schema/encounter.ts +155 -0
- package/src/data/schema/faction.ts +48 -0
- package/src/data/schema/item.ts +297 -0
- package/src/data/schema/itemEnchant.ts +105 -0
- package/src/data/schema/npc.ts +44 -0
- package/src/data/schema/primitives.ts +295 -0
- package/src/data/schema/profession.ts +226 -0
- package/src/data/schema/quest.ts +154 -0
- package/src/data/schema/spell.ts +1149 -0
- package/src/data/schema/talent.ts +74 -0
- package/src/data/schema/world.ts +124 -0
- package/src/data/schema.ts +19 -0
- package/src/data/skinNodeGapFill.ts +68 -0
- package/src/data/spell-data.json.gz +0 -0
- package/src/data/spell-script-targets.json +1 -0
- package/src/data/tables/ahItemValues.json.gz +0 -0
- package/src/data/tables/alteracValley.json.gz +0 -0
- package/src/data/tables/areatriggerTeleports.json.gz +0 -0
- package/src/data/tables/botNames.json.gz +0 -0
- package/src/data/tables/botPopulation.json.gz +0 -0
- package/src/data/tables/botSpecs.json.gz +0 -0
- package/src/data/tables/classLevelStats.json.gz +0 -0
- package/src/data/tables/combatConditions.json.gz +0 -0
- package/src/data/tables/combatSkillMeta.json.gz +0 -0
- package/src/data/tables/conditions.json.gz +0 -0
- package/src/data/tables/createInfo.json.gz +0 -0
- package/src/data/tables/creatureAggroGroups.json.gz +0 -0
- package/src/data/tables/creatureClassLevelStats.json.gz +0 -0
- package/src/data/tables/creaturePatrolPacks.json.gz +0 -0
- package/src/data/tables/creatureWeapons.json.gz +0 -0
- package/src/data/tables/creatures.json.gz +0 -0
- package/src/data/tables/dbScripts.json.gz +0 -0
- package/src/data/tables/dungeonAuthoredRoutes.json.gz +0 -0
- package/src/data/tables/dungeonCensus.json.gz +0 -0
- package/src/data/tables/dungeonGameObjects.json.gz +0 -0
- package/src/data/tables/dungeonPacks.json.gz +0 -0
- package/src/data/tables/dungeonPlateCover.json.gz +0 -0
- package/src/data/tables/dungeonSpawns.json.gz +0 -0
- package/src/data/tables/dungeonSurvey.json.gz +0 -0
- package/src/data/tables/durabilityCosts.json.gz +0 -0
- package/src/data/tables/durabilityQuality.json.gz +0 -0
- package/src/data/tables/enchantApplicators.json.gz +0 -0
- package/src/data/tables/entranceYards.json.gz +0 -0
- package/src/data/tables/explorationBasexp.json.gz +0 -0
- package/src/data/tables/factionTemplates.json.gz +0 -0
- package/src/data/tables/factions.json.gz +0 -0
- package/src/data/tables/gameEvents.json.gz +0 -0
- package/src/data/tables/gameObjects.json.gz +0 -0
- package/src/data/tables/gossipMenus.json.gz +0 -0
- package/src/data/tables/graveyards.json.gz +0 -0
- package/src/data/tables/instanceMaps.json.gz +0 -0
- package/src/data/tables/itemEnchantmentTemplates.json.gz +0 -0
- package/src/data/tables/itemEnchants.json.gz +0 -0
- package/src/data/tables/itemRandomProperties.json.gz +0 -0
- package/src/data/tables/itemSets.json.gz +0 -0
- package/src/data/tables/items.json.gz +0 -0
- package/src/data/tables/levelStats.json.gz +0 -0
- package/src/data/tables/locks.json.gz +0 -0
- package/src/data/tables/map-pin-overrides.json.gz +0 -0
- package/src/data/tables/nonCombatTrash.json.gz +0 -0
- package/src/data/tables/npcTexts.json.gz +0 -0
- package/src/data/tables/pageTexts.json.gz +0 -0
- package/src/data/tables/petAbilityTP.json.gz +0 -0
- package/src/data/tables/petGenericSpells.json.gz +0 -0
- package/src/data/tables/petLevelStats.json.gz +0 -0
- package/src/data/tables/playerbot-weightscales.json.gz +0 -0
- package/src/data/tables/pools.json.gz +0 -0
- package/src/data/tables/quests.json.gz +0 -0
- package/src/data/tables/races.json.gz +0 -0
- package/src/data/tables/reputationRanks.json.gz +0 -0
- package/src/data/tables/reputationRates.json.gz +0 -0
- package/src/data/tables/reputationSpillover.json.gz +0 -0
- package/src/data/tables/ridingSpells.json.gz +0 -0
- package/src/data/tables/scriptTexts.json.gz +0 -0
- package/src/data/tables/soundClipVolume.json.gz +0 -0
- package/src/data/tables/spellChain.json.gz +0 -0
- package/src/data/tables/spellTeleports.json.gz +0 -0
- package/src/data/tables/spells.json.gz +0 -0
- package/src/data/tables/talents.json.gz +0 -0
- package/src/data/tables/tavernTriggers.json.gz +0 -0
- package/src/data/tables/taxiNodes.json.gz +0 -0
- package/src/data/tables/taxiRoutes.json.gz +0 -0
- package/src/data/tables/trainers.json.gz +0 -0
- package/src/data/tables/transports.json.gz +0 -0
- package/src/data/tables/travelAnchors.json.gz +0 -0
- package/src/data/tables/travelEdges.json.gz +0 -0
- package/src/data/tables/unitConditions.json.gz +0 -0
- package/src/data/tables/vendors.json.gz +0 -0
- package/src/data/tables/weaponEnchantProcs.json.gz +0 -0
- package/src/data/tables/xp.json.gz +0 -0
- package/src/data/tables/zoneWeather.json.gz +0 -0
- package/src/data/tables/zones.json.gz +0 -0
- package/src/data/world-data.ts +56 -0
- package/src/data/zone-music-sets.json +2751 -0
- package/src/dev/etl/lib/loot-chance-sanity.mjs +180 -0
- package/src/domain/audioQuality.mjs +145 -0
- package/src/domain/bg/ab.ts +433 -0
- package/src/domain/bg/arenaComps.ts +644 -0
- package/src/domain/bg/arenaLab.ts +695 -0
- package/src/domain/bg/arenaPace.ts +31 -0
- package/src/domain/bg/arenaRating.ts +110 -0
- package/src/domain/bg/av.ts +758 -0
- package/src/domain/bg/avEnemyPush.ts +219 -0
- package/src/domain/bg/avField.ts +283 -0
- package/src/domain/bg/avInstanceNodes.ts +197 -0
- package/src/domain/bg/avInstanceScore.ts +123 -0
- package/src/domain/bg/avQuestItems.ts +55 -0
- package/src/domain/bg/avQuests.ts +210 -0
- package/src/domain/bg/avSession.ts +196 -0
- package/src/domain/bg/bgConsumes.ts +269 -0
- package/src/domain/bg/bgPrebuff.ts +153 -0
- package/src/domain/bg/bgRest.ts +91 -0
- package/src/domain/bg/bgRoster.ts +305 -0
- package/src/domain/bg/bgTier.ts +61 -0
- package/src/domain/bg/bgWorld.ts +862 -0
- package/src/domain/bg/match.ts +215 -0
- package/src/domain/bg/strategies.ts +552 -0
- package/src/domain/bg/types.ts +291 -0
- package/src/domain/bg/wsg.ts +264 -0
- package/src/domain/bots/actionProviderSpec.ts +38 -0
- package/src/domain/bots/autoConsumables.ts +285 -0
- package/src/domain/bots/betweenPullRest.ts +239 -0
- package/src/domain/bots/botGear.ts +248 -0
- package/src/domain/bots/botInventory.ts +486 -0
- package/src/domain/bots/botPet.ts +535 -0
- package/src/domain/bots/botPool.ts +291 -0
- package/src/domain/bots/botProfessions.ts +334 -0
- package/src/domain/bots/companionActionBar.ts +209 -0
- package/src/domain/bots/companionHireCost.ts +236 -0
- package/src/domain/bots/companionMissions.ts +582 -0
- package/src/domain/bots/companionPrep.ts +254 -0
- package/src/domain/bots/companionQuests.ts +270 -0
- package/src/domain/bots/companionRep.ts +75 -0
- package/src/domain/bots/companionRotation.ts +708 -0
- package/src/domain/bots/companionXp.ts +66 -0
- package/src/domain/bots/consumableShare.ts +811 -0
- package/src/domain/bots/dpsMate.ts +1072 -0
- package/src/domain/bots/groupCompReport.ts +132 -0
- package/src/domain/bots/healthstoneSupply.ts +198 -0
- package/src/domain/bots/outfitter.ts +1056 -0
- package/src/domain/bots/paladinPrePull.ts +231 -0
- package/src/domain/bots/partyRole.ts +40 -0
- package/src/domain/bots/playerbotEquipCache.ts +412 -0
- package/src/domain/bots/playerbotItemEligibility.ts +60 -0
- package/src/domain/bots/playerbotStatWeight.ts +853 -0
- package/src/domain/bots/playerbotUnavailableItems.ts +147 -0
- package/src/domain/bots/prePullBuffs.ts +219 -0
- package/src/domain/bots/prePullStealth.ts +82 -0
- package/src/domain/bots/runSupply.ts +251 -0
- package/src/domain/bots/runSupplyPrefs.ts +28 -0
- package/src/domain/bots/sendTradeGoods.ts +394 -0
- package/src/domain/bots/soulShardCap.ts +35 -0
- package/src/domain/bots/squad.ts +842 -0
- package/src/domain/bots/squadRun.ts +81 -0
- package/src/domain/character/actionbar.ts +346 -0
- package/src/domain/character/appearance.ts +165 -0
- package/src/domain/character/buildCombatant.ts +1726 -0
- package/src/domain/character/character.ts +356 -0
- package/src/domain/character/characterName.ts +43 -0
- package/src/domain/character/characterRatings.ts +424 -0
- package/src/domain/character/characterSpells.ts +282 -0
- package/src/domain/character/characterStats.ts +1559 -0
- package/src/domain/character/characterTalents.ts +398 -0
- package/src/domain/character/combatSkills.ts +994 -0
- package/src/domain/character/displayForm.ts +72 -0
- package/src/domain/character/formTalentAuras.ts +171 -0
- package/src/domain/character/forms.ts +499 -0
- package/src/domain/character/races.ts +40 -0
- package/src/domain/character/resurrectionSickness.ts +49 -0
- package/src/domain/character/spellbook.ts +169 -0
- package/src/domain/character/stanceBar.ts +354 -0
- package/src/domain/character/stancePrereq.ts +70 -0
- package/src/domain/character/talentBuilds.ts +63 -0
- package/src/domain/character/talentImport.ts +130 -0
- package/src/domain/character/talentLink.ts +123 -0
- package/src/domain/character/talents.ts +201 -0
- package/src/domain/core/conditionSnapshot.ts +92 -0
- package/src/domain/core/hover.ts +14 -0
- package/src/domain/core/ids.ts +58 -0
- package/src/domain/core/internalNameTags.ts +5 -0
- package/src/domain/core/runtimeDataPatches.ts +357 -0
- package/src/domain/creature/aiTargeting.ts +588 -0
- package/src/domain/creature/combatCondition.ts +157 -0
- package/src/domain/creature/creatureAggro.ts +804 -0
- package/src/domain/creature/creatureAi.ts +206 -0
- package/src/domain/creature/creatureAiConstants.ts +661 -0
- package/src/domain/creature/creatureCastList.ts +1007 -0
- package/src/domain/creature/creatureEventAi.ts +1409 -0
- package/src/domain/creature/creatureGroups.ts +144 -0
- package/src/domain/creature/creatureLinking.ts +333 -0
- package/src/domain/creature/creatureScaling.ts +320 -0
- package/src/domain/creature/creatureTrigger.ts +53 -0
- package/src/domain/creature/creatureWander.ts +74 -0
- package/src/domain/creature/eventAiTexts.ts +145 -0
- package/src/domain/creature/faction.ts +287 -0
- package/src/domain/creature/forcedReaction.ts +48 -0
- package/src/domain/creature/outdoorHuntable.ts +74 -0
- package/src/domain/creature/patrolPacks.ts +210 -0
- package/src/domain/creature/reputation.ts +967 -0
- package/src/domain/creature/unitFlags.ts +74 -0
- package/src/domain/creature/worldBosses.ts +393 -0
- package/src/domain/dungeonMusic.mjs +48 -0
- package/src/domain/economy/auction.ts +282 -0
- package/src/domain/economy/auctionBot.ts +1060 -0
- package/src/domain/economy/honorPrice.ts +100 -0
- package/src/domain/economy/mail.ts +958 -0
- package/src/domain/economy/money.ts +42 -0
- package/src/domain/economy/syntheticClassTrainers.ts +62 -0
- package/src/domain/economy/trading.ts +296 -0
- package/src/domain/economy/vendorSellAll.ts +252 -0
- package/src/domain/economy/vendorStock.ts +146 -0
- package/src/domain/items/ammo.ts +817 -0
- package/src/domain/items/bank.ts +162 -0
- package/src/domain/items/consumableFamily.ts +205 -0
- package/src/domain/items/craftUpgrades.ts +83 -0
- package/src/domain/items/createItem.ts +93 -0
- package/src/domain/items/durability.ts +581 -0
- package/src/domain/items/equipment.ts +441 -0
- package/src/domain/items/equipmentHelper.ts +767 -0
- package/src/domain/items/inventory.ts +561 -0
- package/src/domain/items/itemBonding.ts +93 -0
- package/src/domain/items/itemContainer.ts +245 -0
- package/src/domain/items/itemDisplayName.ts +33 -0
- package/src/domain/items/itemInstance.ts +181 -0
- package/src/domain/items/itemRandomEnchantOutcomes.ts +315 -0
- package/src/domain/items/itemRandomProps.ts +77 -0
- package/src/domain/items/itemRestrictions.ts +329 -0
- package/src/domain/items/itemTeaches.ts +82 -0
- package/src/domain/items/itemUseCooldown.ts +52 -0
- package/src/domain/items/itemUseTarget.ts +90 -0
- package/src/domain/items/junkCategories.ts +174 -0
- package/src/domain/items/junkFilter.ts +368 -0
- package/src/domain/items/keyring.ts +131 -0
- package/src/domain/items/loot.ts +221 -0
- package/src/domain/items/mounts.ts +190 -0
- package/src/domain/items/onUsePayload.ts +102 -0
- package/src/domain/items/pendingLoot.ts +107 -0
- package/src/domain/items/relic.ts +105 -0
- package/src/domain/items/rocketBoots.ts +36 -0
- package/src/domain/items/sortContainer.ts +139 -0
- package/src/domain/items/spareContainers.ts +71 -0
- package/src/domain/items/spellReagentIndex.ts +131 -0
- package/src/domain/items/staleConsumables.ts +66 -0
- package/src/domain/items/weaponSpender.ts +110 -0
- package/src/domain/listDungeonIds.mjs +28 -0
- package/src/domain/macro/compose.ts +239 -0
- package/src/domain/macro/conditions.ts +260 -0
- package/src/domain/macro/creatureTypes.ts +40 -0
- package/src/domain/macro/describe.ts +169 -0
- package/src/domain/macro/icon.ts +60 -0
- package/src/domain/macro/index.ts +20 -0
- package/src/domain/macro/normalize.ts +112 -0
- package/src/domain/macro/parse.ts +316 -0
- package/src/domain/macro/plan.ts +288 -0
- package/src/domain/macro/rotation.ts +590 -0
- package/src/domain/macro/rotationEnv.ts +173 -0
- package/src/domain/macro/slots.ts +101 -0
- package/src/domain/macro/snapshot.ts +114 -0
- package/src/domain/macro/templates.ts +446 -0
- package/src/domain/macro/types.ts +70 -0
- package/src/domain/macro/units.ts +93 -0
- package/src/domain/macro/weaponTypes.ts +83 -0
- package/src/domain/nav/cityTeleports.ts +10 -0
- package/src/domain/nav/mounting.ts +113 -0
- package/src/domain/nav/nav.ts +43 -0
- package/src/domain/nav/navCollision.ts +606 -0
- package/src/domain/nav/navOutdoors.ts +91 -0
- package/src/domain/nav/navRegistry.ts +179 -0
- package/src/domain/nav/navRoomGraph.ts +302 -0
- package/src/domain/nav/navTypes.ts +43 -0
- package/src/domain/nav/navmesh.ts +1715 -0
- package/src/domain/nav/speed.ts +200 -0
- package/src/domain/nav/storey.ts +10 -0
- package/src/domain/nav/travel.ts +725 -0
- package/src/domain/nav/travelTypes.ts +75 -0
- package/src/domain/pet/pet.ts +1150 -0
- package/src/domain/pet/petActionBar.ts +180 -0
- package/src/domain/pet/petSpellbook.ts +39 -0
- package/src/domain/pet/petStable.ts +81 -0
- package/src/domain/professions/autoDisenchant.ts +236 -0
- package/src/domain/professions/characterEnchants.ts +176 -0
- package/src/domain/professions/craftCooldown.ts +52 -0
- package/src/domain/professions/enchantApply.ts +62 -0
- package/src/domain/professions/enchantTargets.ts +114 -0
- package/src/domain/professions/enchanting.ts +236 -0
- package/src/domain/professions/gatherFilter.ts +149 -0
- package/src/domain/professions/gearEnchant.ts +137 -0
- package/src/domain/professions/heldTools.ts +29 -0
- package/src/domain/professions/learnAllRecipes.ts +146 -0
- package/src/domain/professions/miningHarvest.ts +69 -0
- package/src/domain/professions/partyDisenchant.ts +294 -0
- package/src/domain/professions/partyWork.ts +83 -0
- package/src/domain/professions/pickpocket.ts +172 -0
- package/src/domain/professions/poisons.ts +240 -0
- package/src/domain/professions/professions.ts +677 -0
- package/src/domain/professions/rareNodes.ts +45 -0
- package/src/domain/professions/skinLoot.ts +27 -0
- package/src/domain/professions/vendorReagents.ts +152 -0
- package/src/domain/professions/weaponImbueHand.ts +171 -0
- package/src/domain/questFarmFilter.mjs +42 -0
- package/src/domain/quests/doQuest.ts +1204 -0
- package/src/domain/quests/gossip.ts +308 -0
- package/src/domain/quests/gossipTalk.ts +298 -0
- package/src/domain/quests/interpreter/canComplete.ts +150 -0
- package/src/domain/quests/interpreter/claim.ts +137 -0
- package/src/domain/quests/interpreter/dbscript/handlers.ts +1371 -0
- package/src/domain/quests/interpreter/dbscript/handlersBatch.ts +1251 -0
- package/src/domain/quests/interpreter/dbscript/hooks.ts +331 -0
- package/src/domain/quests/interpreter/dbscript/index.ts +212 -0
- package/src/domain/quests/interpreter/dbscript/opcodes.ts +257 -0
- package/src/domain/quests/interpreter/dbscript/registry.ts +1194 -0
- package/src/domain/quests/interpreter/dbscript/registryAreatriggerScripts.ts +539 -0
- package/src/domain/quests/interpreter/dbscript/registryAshenvale.ts +553 -0
- package/src/domain/quests/interpreter/dbscript/registryAzshara.ts +272 -0
- package/src/domain/quests/interpreter/dbscript/registryDarkshore.ts +637 -0
- package/src/domain/quests/interpreter/dbscript/registryDesolace.ts +501 -0
- package/src/domain/quests/interpreter/dbscript/registryDustwallowMarsh.ts +735 -0
- package/src/domain/quests/interpreter/dbscript/registryFelwood.ts +493 -0
- package/src/domain/quests/interpreter/dbscript/registryFeralas.ts +485 -0
- package/src/domain/quests/interpreter/dbscript/registryGoScripts.ts +203 -0
- package/src/domain/quests/interpreter/dbscript/registryMoonglade.ts +288 -0
- package/src/domain/quests/interpreter/dbscript/registryNpcProfessions.ts +230 -0
- package/src/domain/quests/interpreter/dbscript/registryNpcsSpecial.ts +545 -0
- package/src/domain/quests/interpreter/dbscript/registryRazorfenDowns.ts +293 -0
- package/src/domain/quests/interpreter/dbscript/registryRazorfenKraul.ts +221 -0
- package/src/domain/quests/interpreter/dbscript/registryRedridge.ts +112 -0
- package/src/domain/quests/interpreter/dbscript/registrySearingGorge.ts +125 -0
- package/src/domain/quests/interpreter/dbscript/registrySiblings.ts +51 -0
- package/src/domain/quests/interpreter/dbscript/registrySilverpineForest.ts +172 -0
- package/src/domain/quests/interpreter/dbscript/registryStonetalonMountains.ts +180 -0
- package/src/domain/quests/interpreter/dbscript/registryStormwindCity.ts +369 -0
- package/src/domain/quests/interpreter/dbscript/registryStranglethornVale.ts +115 -0
- package/src/domain/quests/interpreter/dbscript/registryStratholme.ts +146 -0
- package/src/domain/quests/interpreter/dbscript/registrySunkenTemple.ts +149 -0
- package/src/domain/quests/interpreter/dbscript/registrySwampOfSorrows.ts +163 -0
- package/src/domain/quests/interpreter/dbscript/registryTanaris.ts +318 -0
- package/src/domain/quests/interpreter/dbscript/registryTeldrassil.ts +120 -0
- package/src/domain/quests/interpreter/dbscript/registryTheBarrens.ts +603 -0
- package/src/domain/quests/interpreter/dbscript/registryThousandNeedles.ts +499 -0
- package/src/domain/quests/interpreter/dbscript/registryTirisfalGlades.ts +222 -0
- package/src/domain/quests/interpreter/dbscript/registryUngoroCrater.ts +291 -0
- package/src/domain/quests/interpreter/dbscript/registryWarEffort.ts +773 -0
- package/src/domain/quests/interpreter/dbscript/registryWesternPlaguelands.ts +206 -0
- package/src/domain/quests/interpreter/dbscript/registryWestfall.ts +190 -0
- package/src/domain/quests/interpreter/dbscript/registryWetlands.ts +186 -0
- package/src/domain/quests/interpreter/dbscript/registryWinterspring.ts +235 -0
- package/src/domain/quests/interpreter/dbscript/types.ts +817 -0
- package/src/domain/quests/interpreter/dbscript/vm.ts +171 -0
- package/src/domain/quests/interpreter/diff.ts +349 -0
- package/src/domain/quests/interpreter/fixtures/oracle-questlog-qi2.json +2417 -0
- package/src/domain/quests/interpreter/flags.ts +101 -0
- package/src/domain/quests/interpreter/index.ts +113 -0
- package/src/domain/quests/interpreter/live.ts +178 -0
- package/src/domain/quests/interpreter/types.ts +81 -0
- package/src/domain/quests/interpreter/updaters.ts +412 -0
- package/src/domain/quests/questCorpseUse.ts +155 -0
- package/src/domain/quests/questDialog.ts +43 -0
- package/src/domain/quests/questFight.ts +34 -0
- package/src/domain/quests/questObjectiveLabel.ts +39 -0
- package/src/domain/quests/questRewardChoice.ts +85 -0
- package/src/domain/quests/questScriptCredit.ts +26 -0
- package/src/domain/quests/questScriptItemUse.ts +74 -0
- package/src/domain/quests/questTameRods.ts +79 -0
- package/src/domain/quests/questlog.ts +1545 -0
- package/src/domain/quests/talkDeliver.ts +170 -0
- package/src/domain/raid/globalActionBar.ts +195 -0
- package/src/domain/raid/instanceRoster.ts +194 -0
- package/src/domain/raid/partySummon.ts +198 -0
- package/src/domain/raid/partyVault.ts +320 -0
- package/src/domain/raid/raidBossAbilities.ts +268 -0
- package/src/domain/raid/raidComp.ts +335 -0
- package/src/domain/raid/raidCustomRows.ts +453 -0
- package/src/domain/raid/raidEncounterGear.ts +298 -0
- package/src/domain/raid/raidEncounterTactics.ts +412 -0
- package/src/domain/raid/raidPlan.ts +509 -0
- package/src/domain/raid/raidPlanEdits.ts +98 -0
- package/src/domain/raid/raidPlanPacks.ts +480 -0
- package/src/domain/raid/raidRecovery.ts +183 -0
- package/src/domain/raid/raidRosterTemplate.ts +138 -0
- package/src/domain/rotation/auraSide.ts +68 -0
- package/src/domain/rotation/build.ts +3031 -0
- package/src/domain/rotation/classes/druid.ts +58 -0
- package/src/domain/rotation/classes/hooks.ts +59 -0
- package/src/domain/rotation/classes/hunter.ts +156 -0
- package/src/domain/rotation/classes/index.ts +104 -0
- package/src/domain/rotation/classes/mage.ts +99 -0
- package/src/domain/rotation/classes/paladin.ts +296 -0
- package/src/domain/rotation/classes/priest.ts +94 -0
- package/src/domain/rotation/classes/pullOpener.ts +92 -0
- package/src/domain/rotation/classes/rogue.ts +69 -0
- package/src/domain/rotation/classes/shaman.ts +29 -0
- package/src/domain/rotation/classes/supportSpec.ts +94 -0
- package/src/domain/rotation/classes/warlock.ts +81 -0
- package/src/domain/rotation/classes/warrior.ts +402 -0
- package/src/domain/rotation/classify.ts +1381 -0
- package/src/domain/rotation/condMetricPicker.ts +379 -0
- package/src/domain/rotation/consumables.ts +242 -0
- package/src/domain/rotation/evaluate.ts +1115 -0
- package/src/domain/rotation/finisherLadder.ts +145 -0
- package/src/domain/rotation/invent.ts +938 -0
- package/src/domain/rotation/killOrder.ts +30 -0
- package/src/domain/rotation/openerForm.ts +22 -0
- package/src/domain/rotation/paladinBuffs.ts +568 -0
- package/src/domain/rotation/prebuff.ts +283 -0
- package/src/domain/rotation/raidRowTuning.ts +34 -0
- package/src/domain/rotation/rotation.ts +11 -0
- package/src/domain/rotation/rotationProfiles.ts +180 -0
- package/src/domain/rotation/rotationSuggestions.ts +851 -0
- package/src/domain/rotation/ruleAfterChain.ts +49 -0
- package/src/domain/rotation/spec.ts +70 -0
- package/src/domain/rotation/spellPicker.ts +140 -0
- package/src/domain/rotation/stand.ts +143 -0
- package/src/domain/rotation/types.ts +718 -0
- package/src/domain/run/battlegroundRun.ts +111 -0
- package/src/domain/run/canEnterContext.ts +32 -0
- package/src/domain/run/death.ts +561 -0
- package/src/domain/run/deathRecovery.ts +289 -0
- package/src/domain/run/duel.ts +141 -0
- package/src/domain/run/dungeonRun.ts +344 -0
- package/src/domain/run/floorRest.ts +159 -0
- package/src/domain/run/honor.ts +557 -0
- package/src/domain/run/honorWeek.ts +180 -0
- package/src/domain/run/whenMap.ts +977 -0
- package/src/domain/scriptdev/arathiHighlands.ts +445 -0
- package/src/domain/scriptdev/ashenvale.ts +635 -0
- package/src/domain/scriptdev/ashenvaleHelpers.ts +1215 -0
- package/src/domain/scriptdev/azshara.ts +892 -0
- package/src/domain/scriptdev/blackfathomDeeps.ts +212 -0
- package/src/domain/scriptdev/blackrockDepths.ts +1434 -0
- package/src/domain/scriptdev/blackrockSpire.ts +730 -0
- package/src/domain/scriptdev/blackwingLair.ts +521 -0
- package/src/domain/scriptdev/burningSteppes.ts +62 -0
- package/src/domain/scriptdev/classFilter.ts +43 -0
- package/src/domain/scriptdev/darkshore.ts +817 -0
- package/src/domain/scriptdev/darkshoreHelpers.ts +853 -0
- package/src/domain/scriptdev/deadmines.ts +331 -0
- package/src/domain/scriptdev/desolace.ts +1239 -0
- package/src/domain/scriptdev/direMaul.ts +859 -0
- package/src/domain/scriptdev/durotar.ts +532 -0
- package/src/domain/scriptdev/dustwallowMarsh.ts +758 -0
- package/src/domain/scriptdev/dustwallowMarshHelpers.ts +994 -0
- package/src/domain/scriptdev/easternPlaguelands.ts +21 -0
- package/src/domain/scriptdev/felwood.ts +1055 -0
- package/src/domain/scriptdev/feralas.ts +571 -0
- package/src/domain/scriptdev/feralasHelpers.ts +838 -0
- package/src/domain/scriptdev/gnomeregan.ts +466 -0
- package/src/domain/scriptdev/guards.ts +616 -0
- package/src/domain/scriptdev/hinterlands.ts +693 -0
- package/src/domain/scriptdev/host.ts +1134 -0
- package/src/domain/scriptdev/index.ts +123 -0
- package/src/domain/scriptdev/instanceRaids.ts +136 -0
- package/src/domain/scriptdev/itemScripts.ts +37 -0
- package/src/domain/scriptdev/lochModan.ts +283 -0
- package/src/domain/scriptdev/maraudon.ts +232 -0
- package/src/domain/scriptdev/moltenCore.ts +831 -0
- package/src/domain/scriptdev/moonglade.ts +659 -0
- package/src/domain/scriptdev/moongladeHelpers.ts +933 -0
- package/src/domain/scriptdev/naxxramas.ts +577 -0
- package/src/domain/scriptdev/naxxramasConstruct.ts +364 -0
- package/src/domain/scriptdev/naxxramasFrostwyrm.ts +378 -0
- package/src/domain/scriptdev/naxxramasMilitary.ts +276 -0
- package/src/domain/scriptdev/npcProfessions.ts +1025 -0
- package/src/domain/scriptdev/npcsSpecial.ts +1379 -0
- package/src/domain/scriptdev/onyxiasLair.ts +313 -0
- package/src/domain/scriptdev/orgrimmar.ts +147 -0
- package/src/domain/scriptdev/professionSpecConsumer.ts +481 -0
- package/src/domain/scriptdev/razorfenDowns.ts +468 -0
- package/src/domain/scriptdev/razorfenKraul.ts +410 -0
- package/src/domain/scriptdev/redridgeMountains.ts +163 -0
- package/src/domain/scriptdev/registry.ts +945 -0
- package/src/domain/scriptdev/ruinsOfAhnqiraj.ts +356 -0
- package/src/domain/scriptdev/scarletMonastery.ts +713 -0
- package/src/domain/scriptdev/scholomance.ts +682 -0
- package/src/domain/scriptdev/searingGorge.ts +295 -0
- package/src/domain/scriptdev/shadowfangKeep.ts +181 -0
- package/src/domain/scriptdev/silithus.ts +71 -0
- package/src/domain/scriptdev/silverpineForest.ts +662 -0
- package/src/domain/scriptdev/stonetalonMountains.ts +493 -0
- package/src/domain/scriptdev/stormwindCity.ts +1192 -0
- package/src/domain/scriptdev/stranglethornVale.ts +402 -0
- package/src/domain/scriptdev/stratholme.ts +650 -0
- package/src/domain/scriptdev/stratholmeScripts.ts +505 -0
- package/src/domain/scriptdev/sunkenTemple.ts +736 -0
- package/src/domain/scriptdev/swampOfSorrows.ts +22 -0
- package/src/domain/scriptdev/tanaris.ts +391 -0
- package/src/domain/scriptdev/tanarisHelpers.ts +661 -0
- package/src/domain/scriptdev/teldrassil.ts +143 -0
- package/src/domain/scriptdev/templeOfAhnqiraj.ts +1013 -0
- package/src/domain/scriptdev/theBarrens.ts +709 -0
- package/src/domain/scriptdev/theBarrensHelpers.ts +1026 -0
- package/src/domain/scriptdev/thousandNeedles.ts +426 -0
- package/src/domain/scriptdev/thousandNeedlesHelpers.ts +566 -0
- package/src/domain/scriptdev/tirisfalGlades.ts +533 -0
- package/src/domain/scriptdev/types.ts +1026 -0
- package/src/domain/scriptdev/uldaman.ts +437 -0
- package/src/domain/scriptdev/ungoroCrater.ts +549 -0
- package/src/domain/scriptdev/ungoroCraterHelpers.ts +1006 -0
- package/src/domain/scriptdev/wailingCaverns.ts +700 -0
- package/src/domain/scriptdev/warEffort.ts +371 -0
- package/src/domain/scriptdev/westernPlaguelands.ts +952 -0
- package/src/domain/scriptdev/westfall.ts +767 -0
- package/src/domain/scriptdev/wetlands.ts +660 -0
- package/src/domain/scriptdev/winterspring.ts +482 -0
- package/src/domain/scriptdev/winterspringHelpers.ts +801 -0
- package/src/domain/scriptdev/worldBosses.ts +605 -0
- package/src/domain/scriptdev/zulfarrak.ts +478 -0
- package/src/domain/scriptdev/zulgurub.ts +1152 -0
- package/src/domain/sim/dummySim.ts +408 -0
- package/src/domain/sim/targetDummy.ts +29 -0
- package/src/domain/social/guild.ts +148 -0
- package/src/domain/spells/areaAuraMembership.ts +93 -0
- package/src/domain/spells/breakableStunCc.ts +166 -0
- package/src/domain/spells/cancelAura.ts +80 -0
- package/src/domain/spells/diminishing.ts +167 -0
- package/src/domain/spells/dispel.ts +149 -0
- package/src/domain/spells/dispelMechanic.ts +105 -0
- package/src/domain/spells/equipSpells.ts +247 -0
- package/src/domain/spells/learnOnTargets.ts +260 -0
- package/src/domain/spells/mergeSchoolImmunityFromRaw.ts +66 -0
- package/src/domain/spells/resurrectSpell.ts +124 -0
- package/src/domain/spells/spellPushback.ts +39 -0
- package/src/domain/spells/spellReflect.ts +43 -0
- package/src/domain/spells/stealth.ts +183 -0
- package/src/domain/spells/totem.ts +394 -0
- package/src/domain/spells/worldCast.ts +187 -0
- package/src/domain/world/areaTriggerLocks.ts +177 -0
- package/src/domain/world/dungeonMusic.ts +108 -0
- package/src/domain/world/gameEvents.ts +119 -0
- package/src/domain/world/gameObjects.ts +1030 -0
- package/src/domain/world/goEventFire.ts +234 -0
- package/src/domain/world/goMoTransport.ts +74 -0
- package/src/domain/world/goTransport.ts +81 -0
- package/src/domain/world/hazards.ts +459 -0
- package/src/domain/world/openLock.ts +398 -0
- package/src/domain/world/pools.ts +470 -0
- package/src/domain/world/restArea.ts +37 -0
- package/src/domain/world/weather.ts +201 -0
- package/src/domain/zoneAmbience.mjs +87 -0
- package/src/domain/zoneMusic.mjs +62 -0
- package/src/domain/zoneMusicQueue.mjs +7 -0
- package/src/engine/combat/activeSeal.ts +39 -0
- package/src/engine/combat/aiTargetResolve.ts +64 -0
- package/src/engine/combat/aoeCast.ts +289 -0
- package/src/engine/combat/applyConsumeAura.ts +74 -0
- package/src/engine/combat/applyDemonicSacrifice.ts +70 -0
- package/src/engine/combat/applyDispelMechanic.ts +30 -0
- package/src/engine/combat/applyHealEffect.ts +301 -0
- package/src/engine/combat/applySchoolAbsorb.ts +114 -0
- package/src/engine/combat/applySpell.ts +3169 -0
- package/src/engine/combat/applySpellLate.ts +2026 -0
- package/src/engine/combat/applySpellLateBag.ts +144 -0
- package/src/engine/combat/areaAura.ts +283 -0
- package/src/engine/combat/attackTable.ts +508 -0
- package/src/engine/combat/battleRez.ts +87 -0
- package/src/engine/combat/castAction.ts +36 -0
- package/src/engine/combat/castTargetGates.ts +75 -0
- package/src/engine/combat/castableKit.ts +68 -0
- package/src/engine/combat/ccMirrorUpgrade.ts +39 -0
- package/src/engine/combat/chainFan.ts +210 -0
- package/src/engine/combat/channel.ts +423 -0
- package/src/engine/combat/chaseCloseness.ts +95 -0
- package/src/engine/combat/cmangosCastGates.ts +129 -0
- package/src/engine/combat/combatFlag.ts +77 -0
- package/src/engine/combat/combatGeometry.ts +1329 -0
- package/src/engine/combat/combustion.ts +68 -0
- package/src/engine/combat/context.ts +730 -0
- package/src/engine/combat/createSession.ts +1165 -0
- package/src/engine/combat/creatureLeash.ts +38 -0
- package/src/engine/combat/crowdControl.ts +1259 -0
- package/src/engine/combat/dispelDuty.ts +54 -0
- package/src/engine/combat/dispelReflect.ts +609 -0
- package/src/engine/combat/displaceFloor.ts +113 -0
- package/src/engine/combat/duelBounds.ts +47 -0
- package/src/engine/combat/equippedItemGate.ts +297 -0
- package/src/engine/combat/evadeLifecycle.ts +63 -0
- package/src/engine/combat/eventAi.ts +2220 -0
- package/src/engine/combat/facing.ts +74 -0
- package/src/engine/combat/fearFlee.ts +137 -0
- package/src/engine/combat/fighterFactory.ts +1144 -0
- package/src/engine/combat/forceDespawnAction.ts +51 -0
- package/src/engine/combat/formulas.ts +807 -0
- package/src/engine/combat/friendlyFan.ts +55 -0
- package/src/engine/combat/groundPoolTick.ts +210 -0
- package/src/engine/combat/hazards.ts +114 -0
- package/src/engine/combat/healTargets.ts +226 -0
- package/src/engine/combat/heartbeatResist.ts +49 -0
- package/src/engine/combat/hostileItemUse.ts +75 -0
- package/src/engine/combat/interruptAuras.ts +66 -0
- package/src/engine/combat/itemRescue.ts +49 -0
- package/src/engine/combat/itemUse.ts +260 -0
- package/src/engine/combat/kitById.ts +23 -0
- package/src/engine/combat/knockBack.ts +201 -0
- package/src/engine/combat/leap.ts +89 -0
- package/src/engine/combat/mitigation.ts +587 -0
- package/src/engine/combat/modTaunt.ts +43 -0
- package/src/engine/combat/motionClaim.ts +268 -0
- package/src/engine/combat/motionGate.ts +150 -0
- package/src/engine/combat/motionGenerator.ts +27 -0
- package/src/engine/combat/navSight.ts +138 -0
- package/src/engine/combat/perfSink.ts +28 -0
- package/src/engine/combat/periodicDue.ts +55 -0
- package/src/engine/combat/petAuras.ts +86 -0
- package/src/engine/combat/pickAction.ts +3449 -0
- package/src/engine/combat/powerForm.ts +735 -0
- package/src/engine/combat/powerPools.ts +49 -0
- package/src/engine/combat/predicates.ts +538 -0
- package/src/engine/combat/procsDamage.ts +1823 -0
- package/src/engine/combat/reactiveGates.ts +135 -0
- package/src/engine/combat/roles.ts +389 -0
- package/src/engine/combat/rotationSubject.ts +78 -0
- package/src/engine/combat/ruleAfter.ts +106 -0
- package/src/engine/combat/seedDisplayAuras.ts +203 -0
- package/src/engine/combat/seedOocEffects.ts +317 -0
- package/src/engine/combat/seedSchoolImmunities.ts +45 -0
- package/src/engine/combat/session-types.ts +458 -0
- package/src/engine/combat/sessionApi.ts +1785 -0
- package/src/engine/combat/sessionCharge.ts +124 -0
- package/src/engine/combat/sessionChase.ts +869 -0
- package/src/engine/combat/sessionDeaths.ts +469 -0
- package/src/engine/combat/sessionFocus.ts +506 -0
- package/src/engine/combat/sessionFollow.ts +167 -0
- package/src/engine/combat/sessionGeometry.ts +188 -0
- package/src/engine/combat/sessionHome.ts +75 -0
- package/src/engine/combat/sessionInject.ts +719 -0
- package/src/engine/combat/sessionMechanicMove.ts +555 -0
- package/src/engine/combat/sessionMotion.ts +1553 -0
- package/src/engine/combat/sessionMotionKit.ts +247 -0
- package/src/engine/combat/sessionMoveIntent.ts +49 -0
- package/src/engine/combat/sessionMoveOrder.ts +200 -0
- package/src/engine/combat/sessionPathTo.ts +657 -0
- package/src/engine/combat/sessionPools.ts +688 -0
- package/src/engine/combat/sessionSteer.ts +144 -0
- package/src/engine/combat/sessionStepBack.ts +151 -0
- package/src/engine/combat/sessionStepWrap.ts +116 -0
- package/src/engine/combat/sessionView.ts +442 -0
- package/src/engine/combat/simEffects.ts +32 -0
- package/src/engine/combat/simFacade.ts +620 -0
- package/src/engine/combat/simPump.ts +264 -0
- package/src/engine/combat/simSnapshot.ts +165 -0
- package/src/engine/combat/simThreadPool.ts +35 -0
- package/src/engine/combat/skeramImages.ts +57 -0
- package/src/engine/combat/slowUpdate.ts +178 -0
- package/src/engine/combat/snapToFloor.ts +42 -0
- package/src/engine/combat/speedAura.ts +29 -0
- package/src/engine/combat/spellReagents.ts +71 -0
- package/src/engine/combat/stealthDetect.ts +93 -0
- package/src/engine/combat/stepBackMotion.ts +171 -0
- package/src/engine/combat/stepSession.ts +3102 -0
- package/src/engine/combat/summonCast.ts +243 -0
- package/src/engine/combat/thaddiusPolarity.ts +97 -0
- package/src/engine/combat/threat.ts +388 -0
- package/src/engine/combat/threatOps.ts +272 -0
- package/src/engine/combat/tickWorkerBody.ts +211 -0
- package/src/engine/combat/totemAuras.ts +122 -0
- package/src/engine/combat/triggerPayload.ts +42 -0
- package/src/engine/combat/triggeredCompanion.ts +63 -0
- package/src/engine/combat/types.ts +1897 -0
- package/src/engine/combat/useObjectTrap.ts +140 -0
- package/src/engine/combat/walkSurface.ts +54 -0
- package/src/engine/combat/weapon.ts +1248 -0
- package/src/engine/combat/worldFrame.ts +43 -0
- package/src/engine/combat.solo-golden.json +2242 -0
- package/src/engine/combat.ts +84 -0
- package/src/engine/core/detMath.ts +289 -0
- package/src/engine/core/events.ts +357 -0
- package/src/engine/core/rng.ts +36 -0
- package/src/engine/game/actionBars.ts +124 -0
- package/src/engine/game/activateObjectFromSpell.ts +320 -0
- package/src/engine/game/applyActiveObjectFromDbScript.ts +98 -0
- package/src/engine/game/applyDeathAndSpellScripts.ts +268 -0
- package/src/engine/game/applyDoorFromDbScript.ts +388 -0
- package/src/engine/game/applyEscortFromDbScript.ts +290 -0
- package/src/engine/game/applyGoSpellcasterCast.ts +40 -0
- package/src/engine/game/applyHoverFromDbScript.ts +110 -0
- package/src/engine/game/applyOocResurrect.ts +71 -0
- package/src/engine/game/applySpellDurability.ts +115 -0
- package/src/engine/game/applyTailFromDbScript.ts +478 -0
- package/src/engine/game/applyTerminateFromDbScript.ts +95 -0
- package/src/engine/game/auctionMail.ts +269 -0
- package/src/engine/game/bagOverflow.ts +130 -0
- package/src/engine/game/bank.ts +110 -0
- package/src/engine/game/barAutofill.ts +26 -0
- package/src/engine/game/battleground.ts +369 -0
- package/src/engine/game/combatEnemySpec.ts +216 -0
- package/src/engine/game/combatObjectTraps.ts +167 -0
- package/src/engine/game/combatSeed.ts +320 -0
- package/src/engine/game/combatSession.ts +3241 -0
- package/src/engine/game/combatSessionClock.ts +62 -0
- package/src/engine/game/companionQuestActions.ts +242 -0
- package/src/engine/game/companionTraining.ts +40 -0
- package/src/engine/game/consumables.ts +624 -0
- package/src/engine/game/context.ts +53 -0
- package/src/engine/game/createHealthstone.ts +45 -0
- package/src/engine/game/deathFlow.ts +127 -0
- package/src/engine/game/devGrant.ts +117 -0
- package/src/engine/game/dynamicObject.ts +365 -0
- package/src/engine/game/enchantItem.ts +177 -0
- package/src/engine/game/equipmentHelper.ts +806 -0
- package/src/engine/game/factionState.ts +108 -0
- package/src/engine/game/garmentsOoc.ts +69 -0
- package/src/engine/game/globalActionBar.ts +179 -0
- package/src/engine/game/goInteractQuestCredit.ts +51 -0
- package/src/engine/game/goMoTransportUse.ts +61 -0
- package/src/engine/game/goTransportUse.ts +60 -0
- package/src/engine/game/healthstoneUpkeep.ts +59 -0
- package/src/engine/game/killSkin.ts +124 -0
- package/src/engine/game/learnFromItem.ts +118 -0
- package/src/engine/game/loadReconcile.ts +551 -0
- package/src/engine/game/loot.ts +294 -0
- package/src/engine/game/macros.ts +125 -0
- package/src/engine/game/mail.ts +293 -0
- package/src/engine/game/meetingStoneQueue.ts +75 -0
- package/src/engine/game/meetingStoneUse.ts +54 -0
- package/src/engine/game/newGameState.ts +363 -0
- package/src/engine/game/oocAuraInterrupt.ts +92 -0
- package/src/engine/game/oocCast.ts +241 -0
- package/src/engine/game/oocCastEffects.ts +803 -0
- package/src/engine/game/oocCastMethods.ts +1077 -0
- package/src/engine/game/openLockFromSpell.ts +174 -0
- package/src/engine/game/outdoorPvp.ts +187 -0
- package/src/engine/game/outfitter.ts +644 -0
- package/src/engine/game/paladinBoard.ts +393 -0
- package/src/engine/game/partyAuras.ts +121 -0
- package/src/engine/game/persistCombatAuras.ts +91 -0
- package/src/engine/game/pets.ts +459 -0
- package/src/engine/game/prePullHealthstones.ts +154 -0
- package/src/engine/game/professions.ts +2227 -0
- package/src/engine/game/pruneStaleRuntime.ts +39 -0
- package/src/engine/game/questFightCredit.ts +36 -0
- package/src/engine/game/questItemOnCorpse.ts +166 -0
- package/src/engine/game/questItemOnCreature.ts +103 -0
- package/src/engine/game/questLog.ts +879 -0
- package/src/engine/game/questSpellComplete.ts +21 -0
- package/src/engine/game/questTurnIn.ts +598 -0
- package/src/engine/game/raidParty.ts +32 -0
- package/src/engine/game/reagentBuyIn.ts +39 -0
- package/src/engine/game/regenRest.ts +186 -0
- package/src/engine/game/rotation.ts +425 -0
- package/src/engine/game/runFullDungeon.ts +611 -0
- package/src/engine/game/runSupply.ts +80 -0
- package/src/engine/game/sanitizeDriftedItems.ts +135 -0
- package/src/engine/game/scriptDevGoUse.ts +397 -0
- package/src/engine/game/scriptDevInnkeeper.ts +150 -0
- package/src/engine/game/scriptDevProfessionSpec.ts +99 -0
- package/src/engine/game/sendEventFromSpell.ts +87 -0
- package/src/engine/game/sortContainers.ts +85 -0
- package/src/engine/game/spellReputation.ts +69 -0
- package/src/engine/game/squad/squadDungeonSeating.ts +197 -0
- package/src/engine/game/squadDungeon.ts +4222 -0
- package/src/engine/game/squadQuestShare.ts +260 -0
- package/src/engine/game/summonObjectSlot.ts +69 -0
- package/src/engine/game/summonObjectWild.ts +73 -0
- package/src/engine/game/summoningRitualUse.ts +141 -0
- package/src/engine/game/talents.ts +356 -0
- package/src/engine/game/tamingRodUse.ts +66 -0
- package/src/engine/game/tempSpawnCreature.ts +136 -0
- package/src/engine/game/tickDungeonPatrolScripts.ts +205 -0
- package/src/engine/game/tickTimedQuests.ts +28 -0
- package/src/engine/game/trade.ts +586 -0
- package/src/engine/game/travel.ts +1155 -0
- package/src/engine/game/types.ts +1855 -0
- package/src/engine/game/vendorOffers.ts +244 -0
- package/src/engine/game/weaponImbueItem.ts +281 -0
- package/src/engine/game/worldSession.ts +183 -0
- package/src/engine/game/worldState.ts +166 -0
- package/src/engine/game.ts +968 -0
- package/src/engine/spells/GAP.md +67 -0
- package/src/engine/spells/absorbs.ts +376 -0
- package/src/engine/spells/addTargetTrigger.ts +53 -0
- package/src/engine/spells/auraPerSecondCost.ts +50 -0
- package/src/engine/spells/auraStacking.ts +497 -0
- package/src/engine/spells/cmangos-special-cases-combustion.ts +13 -0
- package/src/engine/spells/cmangos-special-cases-s18.ts +445 -0
- package/src/engine/spells/cmangos-special-cases-s19.ts +324 -0
- package/src/engine/spells/cmangos-special-cases-s20.ts +385 -0
- package/src/engine/spells/cmangos-special-cases-s21.ts +116 -0
- package/src/engine/spells/cmangos-special-cases-s22.ts +24 -0
- package/src/engine/spells/cmangos-special-cases-s23.ts +52 -0
- package/src/engine/spells/cmangos-special-cases.ts +1570 -0
- package/src/engine/spells/conditions.ts +718 -0
- package/src/engine/spells/effects.ts +203 -0
- package/src/engine/spells/fixtures/oracle-effects-lock9a.json +1 -0
- package/src/engine/spells/immunity.ts +942 -0
- package/src/engine/spells/intentEffects.ts +351 -0
- package/src/engine/spells/interpreter/GAPS.md +21 -0
- package/src/engine/spells/interpreter/amount.ts +109 -0
- package/src/engine/spells/interpreter/class-scripts-kit.ts +478 -0
- package/src/engine/spells/interpreter/diff.ts +246 -0
- package/src/engine/spells/interpreter/duration.ts +90 -0
- package/src/engine/spells/interpreter/form-attrs.json +1 -0
- package/src/engine/spells/interpreter/form-attrs.ts +95 -0
- package/src/engine/spells/interpreter/handlers/aura-remove.ts +113 -0
- package/src/engine/spells/interpreter/handlers/auras-control.ts +1547 -0
- package/src/engine/spells/interpreter/handlers/auras-core.ts +1583 -0
- package/src/engine/spells/interpreter/handlers/auras-misc.ts +1774 -0
- package/src/engine/spells/interpreter/handlers/effect-disenchant.ts +17 -0
- package/src/engine/spells/interpreter/handlers/effect-skinning.ts +20 -0
- package/src/engine/spells/interpreter/handlers/effects-action-utility.ts +1455 -0
- package/src/engine/spells/interpreter/handlers/effects-core.ts +432 -0
- package/src/engine/spells/interpreter/handlers/effects-remainder.ts +105 -0
- package/src/engine/spells/interpreter/handlers/effects-summon-item.ts +687 -0
- package/src/engine/spells/interpreter/handlers/mod-increase-energy-percent.ts +36 -0
- package/src/engine/spells/interpreter/handlers/mod-increase-energy.ts +36 -0
- package/src/engine/spells/interpreter/handlers/periodic-trigger-zero.ts +327 -0
- package/src/engine/spells/interpreter/handlers/procs.ts +131 -0
- package/src/engine/spells/interpreter/handlers/registry.ts +975 -0
- package/src/engine/spells/interpreter/handlers/shared.ts +667 -0
- package/src/engine/spells/interpreter/handlers.ts +9 -0
- package/src/engine/spells/interpreter/hunter-kit.ts +202 -0
- package/src/engine/spells/interpreter/index.ts +525 -0
- package/src/engine/spells/interpreter/item-triggers.ts +1121 -0
- package/src/engine/spells/interpreter/lift-consume-energy.ts +37 -0
- package/src/engine/spells/interpreter/mage-portals.ts +37 -0
- package/src/engine/spells/interpreter/materialize-charm.ts +88 -0
- package/src/engine/spells/interpreter/materialize-dispel-mechanic.ts +25 -0
- package/src/engine/spells/interpreter/materialize-rating-buffs.ts +81 -0
- package/src/engine/spells/interpreter/materialize-speed.ts +109 -0
- package/src/engine/spells/interpreter/materialize-spell-magnet.ts +22 -0
- package/src/engine/spells/interpreter/opcodes.ts +789 -0
- package/src/engine/spells/interpreter/paladin-kit.ts +95 -0
- package/src/engine/spells/interpreter/paladin-seals.ts +499 -0
- package/src/engine/spells/interpreter/priest-warlock-kit.ts +135 -0
- package/src/engine/spells/interpreter/proc.ts +443 -0
- package/src/engine/spells/interpreter/registry/helpers.ts +16 -0
- package/src/engine/spells/interpreter/registry/index.ts +216 -0
- package/src/engine/spells/interpreter/registry/packs/class-abilities.ts +304 -0
- package/src/engine/spells/interpreter/registry/packs/dire-maul.ts +44 -0
- package/src/engine/spells/interpreter/registry/packs/dummy-script-tail.ts +1065 -0
- package/src/engine/spells/interpreter/registry/packs/ex-wave-m.ts +70 -0
- package/src/engine/spells/interpreter/registry/packs/life-tap.ts +107 -0
- package/src/engine/spells/interpreter/registry/packs/paladin.ts +246 -0
- package/src/engine/spells/interpreter/registry/packs/raid-script-summons.ts +26 -0
- package/src/engine/spells/interpreter/registry/packs/raid-threat-wipe.ts +22 -0
- package/src/engine/spells/interpreter/registry/packs/shaman.ts +214 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-a.ts +269 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-b.ts +370 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-c.ts +172 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-hunter.ts +60 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-warrior.ts +31 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-a.ts +114 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-b.ts +249 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-c.ts +233 -0
- package/src/engine/spells/interpreter/registry/types.ts +48 -0
- package/src/engine/spells/interpreter/talent-scripted.ts +329 -0
- package/src/engine/spells/interpreter/targeting.ts +90 -0
- package/src/engine/spells/interpreter/types-intent.ts +1501 -0
- package/src/engine/spells/interpreter/types.ts +419 -0
- package/src/engine/spells/interpreter/warrior-druid-kit.ts +314 -0
- package/src/engine/spells/interpreter/weapon-imbue-kit.ts +384 -0
- package/src/engine/spells/interrupt.ts +217 -0
- package/src/engine/spells/meleeAttackReset.ts +60 -0
- package/src/engine/spells/oocTriggerSpell.ts +49 -0
- package/src/engine/spells/overrideClassScripts.ts +319 -0
- package/src/engine/spells/parryHaste.ts +20 -0
- package/src/engine/spells/procs.ts +300 -0
- package/src/engine/spells/recovery.ts +203 -0
- package/src/engine/spells/scriptTargetDest.ts +76 -0
- package/src/engine/spells/scriptTargets.ts +85 -0
- package/src/engine/spells/singleTargetAura.ts +82 -0
- package/src/engine/spells/specialCasePayloads.ts +57 -0
- package/src/engine/spells/spellAttributes.ts +249 -0
- package/src/engine/spells/spellBonus.ts +143 -0
- package/src/engine/spells/spellModIntents.ts +419 -0
- package/src/engine/spells/spellMods.ts +283 -0
- package/src/engine/spells/spellRadius.ts +15 -0
- package/src/engine/spells/trapObjects.ts +26 -0
- package/src/json.d.ts +7 -0
- package/src/persistence/memoryRepository.ts +23 -0
- package/src/persistence/saveBackups.ts +162 -0
- package/src/persistence/saveFile.ts +68 -0
- package/src/persistence/saveRepository.ts +11 -0
- package/src/persistence/saveShape.ts +668 -0
- package/src/progression/leveling.ts +89 -0
- package/src/progression/rest.ts +1434 -0
- package/src/progression/training.ts +226 -0
- package/src/progression/xpGain.ts +369 -0
- package/src/quests/quests.ts +1580 -0
- package/src/world/aoePull.ts +198 -0
- package/src/world/areaTableDbc.ts +39 -0
- package/src/world/areaTableMapIdPairs.ts +141 -0
- package/src/world/bakeSlug.ts +43 -0
- package/src/world/continuousDungeon.ts +1250 -0
- package/src/world/dungeonBakeProjection.ts +190 -0
- package/src/world/dungeonMapDensity.ts +342 -0
- package/src/world/dungeonMapProjection.ts +135 -0
- package/src/world/dungeonNav.ts +904 -0
- package/src/world/dungeonNpcSim.ts +147 -0
- package/src/world/dungeonObjectives.ts +234 -0
- package/src/world/dungeonPreset.ts +35 -0
- package/src/world/dungeonRoute.ts +311 -0
- package/src/world/dungeonRouteGeometry.ts +732 -0
- package/src/world/dungeonRouteOrder.ts +1037 -0
- package/src/world/dungeonWingRooms.ts +426 -0
- package/src/world/escort.ts +296 -0
- package/src/world/goPoolRoll.ts +75 -0
- package/src/world/instanceObjects.ts +785 -0
- package/src/world/instances.ts +1572 -0
- package/src/world/meetingStones.ts +56 -0
- package/src/world/navmeshFloors.ts +145 -0
- package/src/world/nearGrid.ts +167 -0
- package/src/world/packBudget.ts +613 -0
- package/src/world/rareRoll.ts +335 -0
- package/src/world/routeAuthoring.ts +132 -0
- package/src/world/routeEdit.ts +209 -0
- package/src/world/world.ts +812 -0
- package/src/world/zoneHazards.ts +47 -0
|
@@ -0,0 +1,807 @@
|
|
|
1
|
+
// Pure numeric helpers and tunable constants for combat and progression. Callers pass roll values in,
|
|
2
|
+
// so everything stays testable. The armor and partial-resist tables live in mitigation.ts.
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
effectiveMagicResistancePercent,
|
|
6
|
+
spellMissChancePercent,
|
|
7
|
+
SPELL_DAMAGE_CLASS,
|
|
8
|
+
} from './mitigation.ts';
|
|
9
|
+
|
|
10
|
+
// Re-export armor mitigation so existing `from './formulas'` imports keep working.
|
|
11
|
+
export { armorMitigation } from './mitigation.ts';
|
|
12
|
+
|
|
13
|
+
// Attack table (skill-based CMaNGOS port) — see attackTable.ts for gap notes + citations.
|
|
14
|
+
export {
|
|
15
|
+
skillMaxForLevel,
|
|
16
|
+
canGlanceInCombat,
|
|
17
|
+
canCrushInCombat,
|
|
18
|
+
calculateEffectiveMissChance,
|
|
19
|
+
calculateEffectiveDodgeChance,
|
|
20
|
+
calculateEffectiveParryChance,
|
|
21
|
+
calculateEffectiveBlockChance,
|
|
22
|
+
calculateEffectiveCrushChance,
|
|
23
|
+
calculateEffectiveDazeChance,
|
|
24
|
+
calculateAbilityDeflectChance,
|
|
25
|
+
SPELL_RANGE_IDX,
|
|
26
|
+
calculateEffectiveGlanceChance,
|
|
27
|
+
calculateEffectiveCritChance,
|
|
28
|
+
glanceDamageMultiplier,
|
|
29
|
+
glanceDamageMultiplierFromContext,
|
|
30
|
+
meleeAttackTable,
|
|
31
|
+
pickMeleeOutcome,
|
|
32
|
+
pickMeleeSpellLand,
|
|
33
|
+
remapRangedWhiteOutcome,
|
|
34
|
+
meleeOutcomeMultiplier,
|
|
35
|
+
resolveMeleeAttack,
|
|
36
|
+
type AttackResult,
|
|
37
|
+
type AttackTypeKind,
|
|
38
|
+
type AttackContext,
|
|
39
|
+
type AttackTable,
|
|
40
|
+
} from './attackTable.ts';
|
|
41
|
+
|
|
42
|
+
export const TUNING = {
|
|
43
|
+
tickMs: 100,
|
|
44
|
+
// A runaway safety bound only, not a product time limit. Real pulls run longer than a couple of
|
|
45
|
+
// minutes, and ending those as a timeout made the resolver treat them as a player death.
|
|
46
|
+
maxMs: 30 * 60 * 1000, // 30 min combat-sim time
|
|
47
|
+
gcdMs: 1500,
|
|
48
|
+
|
|
49
|
+
meleeHitChance: 0.95, // vs an even-level target (miss folds in dodge/parry for MVP)
|
|
50
|
+
spellHitChance: 0.96,
|
|
51
|
+
baseCritChance: 0.05,
|
|
52
|
+
meleeCritMult: 2,
|
|
53
|
+
spellCritMult: 1.5,
|
|
54
|
+
|
|
55
|
+
// Haste floor (cast times floor separately or not at all).
|
|
56
|
+
// Melee crit/dodge from agi: use meleeCritFromAgility / dodgeFromAgility (class curves), not flat rates.
|
|
57
|
+
minGcdMs: 1000,
|
|
58
|
+
|
|
59
|
+
// Energy regen (CMaNGOS Player.cpp POWER_ENERGY): addvalue = uint32(diff/100) * Rate.Energy
|
|
60
|
+
// with REGEN_TIME_FULL = 2000 ms → 20 energy / 2 s at rate 1.0 → 10 energy/sec in and out of combat.
|
|
61
|
+
energyPerSec: 10,
|
|
62
|
+
/** Combo point cap (Unit.cpp AddComboPoints clamps to 5). */
|
|
63
|
+
comboPointsMax: 5,
|
|
64
|
+
|
|
65
|
+
// Sitting / not standing: health (and OOC paths that still apply it) ×1.5. source: Player.cpp
|
|
66
|
+
// RegenerateHealth — `if (!IsStandState()) addvalue *= 1.5`
|
|
67
|
+
sitRegenMult: 1.5,
|
|
68
|
+
|
|
69
|
+
// Legacy fallback only when pet_levelstats is absent (fixtures / pre-3A bake). Wave 3A: real HP from
|
|
70
|
+
// pet_levelstats via petInitStats.
|
|
71
|
+
petHealthFrac: 0.7,
|
|
72
|
+
mendPetThreshold: 0.6, // the AI/rotation casts Mend Pet below this pet-health fraction
|
|
73
|
+
/** Legacy mana scale when pet_levelstats is absent. Wave 3A: summon mana from table row. */
|
|
74
|
+
petManaPerLevel: 15,
|
|
75
|
+
// Hunter pet focus: 24 per 4 s quantum at the default rate, so 6 a second to a max of 100. Used in
|
|
76
|
+
// combat and out of it. Cite: Pet.cpp:698–707; Creature.cpp:836–837.
|
|
77
|
+
focusPer4Sec: 24,
|
|
78
|
+
focusRegenPeriodMs: 4000,
|
|
79
|
+
hpPerStamina: 10, // combat HP granted per point of a `stamina` buff (Imp's Blood Pact); WoW's 1:10
|
|
80
|
+
|
|
81
|
+
// ---- crowd control / resistances (all tunable) ----
|
|
82
|
+
drSteps: [1, 0.5, 0.25, 0], // diminishing returns per category: full, ½, ¼, then immune
|
|
83
|
+
drResetMs: 15_000, // a DR category resets this long after its last application wears off
|
|
84
|
+
// Pause between flee legs. Cite: RandomMovementGenerator.cpp:234 FleeingMovementGenerator
|
|
85
|
+
// → AbstractRandomMovementGenerator(…, 500, 1500); Update ~99–108 urand(min,max).
|
|
86
|
+
fearFleeRepickMinMs: 500,
|
|
87
|
+
fearFleeRepickMaxMs: 1_500,
|
|
88
|
+
resistCcFactor: 0.5, // fraction of average magic mitigation that becomes CC full-resist chance
|
|
89
|
+
} as const;
|
|
90
|
+
|
|
91
|
+
// Quarantined constants — NOT used by combat. Rage on swing and on hit are now the reward function,
|
|
92
|
+
// rage decay is its own, and the threat shares are the manager's sticky victim. Do not re-export.
|
|
93
|
+
export const DEPRECATED_TUNING = {
|
|
94
|
+
rageOnSwing: 8,
|
|
95
|
+
rageOnTakeHit: 4,
|
|
96
|
+
rageDecayPerSec: 2,
|
|
97
|
+
petThreatShare: 0.35,
|
|
98
|
+
stoneclawThreatShare: 0.65,
|
|
99
|
+
} as const;
|
|
100
|
+
|
|
101
|
+
// The chance one damaging hit shakes a FEAR or a ROOT off early, measured against a cap built from
|
|
102
|
+
// the VICTIM's level. Both auras route to the SAME handler, and DoT ticks do roll it.
|
|
103
|
+
export function ccDamageBreakChance(victimLevel: number, damage: number): number {
|
|
104
|
+
if (!(damage > 0)) return 0;
|
|
105
|
+
const lvl = victimLevel | 0;
|
|
106
|
+
const maxDmg = lvl > 8 ? 25 * lvl - 150 : 50;
|
|
107
|
+
return Math.min(1, damage / maxDmg);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** @deprecated Name predates roots sharing the handler — use {@link ccDamageBreakChance}. */
|
|
111
|
+
export const fearBreakChance = ccDamageBreakChance;
|
|
112
|
+
|
|
113
|
+
/** 5-second rule window after a mana spend (Unit.h SetLastManaUse / m_lastManaUseTimer = 5000). */
|
|
114
|
+
export const LAST_MANA_USE_MS = 5000;
|
|
115
|
+
|
|
116
|
+
// Power / regen (CMaNGOS Classic 1.12) — docs/cmangos_mapping/combat/rage.md,
|
|
117
|
+
// docs/cmangos_mapping/stats/regen.md, docs/cmangos_mapping/pets/mechanics.md
|
|
118
|
+
|
|
119
|
+
// Rage conversion coefficient at `level` (denominator in RewardRage). source: Player.cpp RewardRage
|
|
120
|
+
// ~2270–2274; docs/cmangos_mapping/combat/rage.md
|
|
121
|
+
export function rageConversion(level: number): number {
|
|
122
|
+
const L = Math.max(1, level);
|
|
123
|
+
return (0.0091107836 * L * L) + (3.225598133 * L) + 4.2652911;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Rage gained from damage dealt or taken, in UI units. There is NO weapon-speed hit factor and no
|
|
127
|
+
// halving in the classic core — that shape is community theorycraft CMaNGOS does not implement.
|
|
128
|
+
export function rewardRage(
|
|
129
|
+
damage: number,
|
|
130
|
+
level: number,
|
|
131
|
+
isAttacker: boolean,
|
|
132
|
+
rateIncome = 1,
|
|
133
|
+
/** Berserker Rage 18499: ×1.3 on *taken* rage only (Player.cpp:2284–2286). */
|
|
134
|
+
berserkerRage = false,
|
|
135
|
+
): number {
|
|
136
|
+
if (damage <= 0 || level <= 0) return 0;
|
|
137
|
+
let addRage = damage / rageConversion(level) * (isAttacker ? 7.5 : 2.5);
|
|
138
|
+
if (!isAttacker && berserkerRage) addRage *= 1.3;
|
|
139
|
+
addRage *= rateIncome;
|
|
140
|
+
// Match C++ uint32(addRage * 10) then map internal → UI (/10).
|
|
141
|
+
return Math.floor(addRage * 10) / 10;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// UI rage lost over an interval while out of combat. At the default rate that is 2.5 rage per 2 s,
|
|
145
|
+
// about 1.25 a second. Cite: Player.cpp:2335–2340.
|
|
146
|
+
export function rageDecayAmount(diffMs: number, rateLoss = 1): number {
|
|
147
|
+
if (diffMs <= 0) return 0;
|
|
148
|
+
const internal = Math.floor(diffMs / 200) * 2.5 * rateLoss;
|
|
149
|
+
return internal / 10;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Health per second from spirit, on the class OCT coefficients — a class-switched linear curve.
|
|
153
|
+
// Negative results are clamped by the callers. Cite: Unit.cpp OCTRegenHPPerSpirit ~11863.
|
|
154
|
+
export function octRegenHpPerSpirit(classId: number, spirit: number): number {
|
|
155
|
+
// Coefficients from Unit.cpp:Unit::OCTRegenHPPerSpirit switch (hardcoded, not invented).
|
|
156
|
+
const Spirit = spirit;
|
|
157
|
+
switch (classId) {
|
|
158
|
+
case 11: return Spirit * 0.11 + 1; // CLASS_DRUID
|
|
159
|
+
case 3: return Spirit * 0.43 - 5.5; // CLASS_HUNTER
|
|
160
|
+
case 8: return Spirit * 0.11 + 1; // CLASS_MAGE
|
|
161
|
+
case 2: return Spirit * 0.25; // CLASS_PALADIN
|
|
162
|
+
case 5: return Spirit * 0.15 + 1.4; // CLASS_PRIEST
|
|
163
|
+
case 4: return Spirit * 0.84 - 13; // CLASS_ROGUE
|
|
164
|
+
case 7: return Spirit * 0.28 - 3.6; // CLASS_SHAMAN
|
|
165
|
+
case 9: return Spirit * 0.12 + 1.5; // CLASS_WARLOCK
|
|
166
|
+
case 1: return Spirit * 1.26 - 22.6; // CLASS_WARRIOR
|
|
167
|
+
default: return 0;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Mana per second from spirit, on the class OCT coefficients; a class with no mana pool returns 0.
|
|
172
|
+
// The C++ hardcodes these rather than reading a runtime DBC. Cite: Unit.cpp ~11886.
|
|
173
|
+
export function octRegenMpPerSpirit(classId: number, spirit: number): number {
|
|
174
|
+
// Coefficients from Unit.cpp:Unit::OCTRegenMPPerSpirit switch (hardcoded, not invented).
|
|
175
|
+
const Spirit = spirit;
|
|
176
|
+
let addvalue = 0;
|
|
177
|
+
switch (classId) {
|
|
178
|
+
case 11: // DRUID
|
|
179
|
+
case 3: // HUNTER
|
|
180
|
+
case 2: // PALADIN
|
|
181
|
+
case 9: // WARLOCK
|
|
182
|
+
addvalue = Spirit / 5 + 15;
|
|
183
|
+
break;
|
|
184
|
+
case 8: // MAGE
|
|
185
|
+
case 5: // PRIEST
|
|
186
|
+
addvalue = Spirit / 4 + 12.5;
|
|
187
|
+
break;
|
|
188
|
+
case 7: // SHAMAN
|
|
189
|
+
addvalue = Spirit / 5 + 17;
|
|
190
|
+
break;
|
|
191
|
+
default:
|
|
192
|
+
return 0; // warrior / rogue — no mana
|
|
193
|
+
}
|
|
194
|
+
// source: Unit.cpp:Unit::OCTRegenMPPerSpirit — "per tick which occurs every 2 seconds"
|
|
195
|
+
return addvalue / 2.0;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// UpdateManaRegen — the spirit OCT term, the mp5 aura and the five-second-rule interrupt percent,
|
|
199
|
+
// returned per second. The regen multiplier is the product of the percent auras, default 1.
|
|
200
|
+
export function updateManaRegen(
|
|
201
|
+
classId: number,
|
|
202
|
+
spirit: number,
|
|
203
|
+
mp5FromAuras = 0,
|
|
204
|
+
interruptPct = 0,
|
|
205
|
+
powerRegenMultiplier = 1,
|
|
206
|
+
): { modManaRegen: number; modManaRegenInterrupt: number } {
|
|
207
|
+
let power_regen = octRegenMpPerSpirit(classId, spirit);
|
|
208
|
+
// Cite: StatSystem.cpp:551–552 power_regen *= GetTotalAuraMultiplierByMiscValue(110, POWER_MANA).
|
|
209
|
+
if (powerRegenMultiplier > 0 && powerRegenMultiplier !== 1) {
|
|
210
|
+
power_regen *= powerRegenMultiplier;
|
|
211
|
+
}
|
|
212
|
+
const power_regen_mp5 = mp5FromAuras / 5.0;
|
|
213
|
+
const pct = Math.min(100, Math.max(0, interruptPct));
|
|
214
|
+
return {
|
|
215
|
+
modManaRegen: power_regen_mp5 + power_regen,
|
|
216
|
+
modManaRegenInterrupt: power_regen_mp5 + power_regen * pct / 100.0,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Product of (100+amount)/100 for SPELL_AURA_MOD_POWER_REGEN_PERCENT amounts. Cite: Unit.cpp:4611–4622
|
|
221
|
+
// GetTotalAuraMultiplierByMiscValue.
|
|
222
|
+
export function powerRegenPercentMultiplier(amounts: readonly number[]): number {
|
|
223
|
+
let mult = 1;
|
|
224
|
+
for (const a of amounts) {
|
|
225
|
+
if (!a) continue;
|
|
226
|
+
mult *= (100 + a) / 100;
|
|
227
|
+
}
|
|
228
|
+
return mult;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Focus gained over `diffMs` for hunter pets (24 * Rate.Focus every 4s quantum). source:
|
|
232
|
+
// Creature.cpp:836–837; Pet.cpp RegenerateAll ~698–707
|
|
233
|
+
function focusRegenAmount(diffMs: number, rateFocus = 1): number {
|
|
234
|
+
if (diffMs <= 0) return 0;
|
|
235
|
+
const periods = Math.floor(diffMs / TUNING.focusRegenPeriodMs);
|
|
236
|
+
return periods * TUNING.focusPer4Sec * rateFocus;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Combat mana a PET gains over an interval while not under the five-second rule. The max-mana
|
|
240
|
+
// fallback is gated on not being a pet, so an unresolvable OCT returns 0 rather than a made-up rate.
|
|
241
|
+
export function petCombatManaRegenAmount(
|
|
242
|
+
diffMs: number,
|
|
243
|
+
intellect: number,
|
|
244
|
+
spirit: number,
|
|
245
|
+
classId?: number | null,
|
|
246
|
+
rateMana = 1,
|
|
247
|
+
): number {
|
|
248
|
+
if (diffMs <= 0 || intellect <= 0) return 0;
|
|
249
|
+
const periods = Math.floor(diffMs / TUNING.focusRegenPeriodMs);
|
|
250
|
+
if (periods <= 0) return 0;
|
|
251
|
+
// OCTRegenMPPerSpirit is class-switched (Unit.cpp:11886–11906). Pets use
|
|
252
|
+
// their creature UnitClass (or fallback from scaling / mana).
|
|
253
|
+
const oct = classId != null && classId > 0 ? octRegenMpPerSpirit(classId, spirit) : 0;
|
|
254
|
+
if (oct <= 0) return 0;
|
|
255
|
+
// Per 4s tick: sqrt(int) * OCT * rate / 5 * timerMultiplier(4)
|
|
256
|
+
const perPeriod = Math.sqrt(intellect) * oct * rateMana / 5 * 4;
|
|
257
|
+
return periods * perPeriod;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// OOC pet mana regen per second: maxValue/3.0 per Pet::RegenerateAll 4s quantum. Converted to a continuous
|
|
261
|
+
// per-second rate for `rest.ts` (same pattern as focus OOC). source: Creature.cpp:830; Pet.cpp:698–708
|
|
262
|
+
export function petOocManaRegenPerSec(maxMana: number): number {
|
|
263
|
+
if (maxMana <= 0) return 0;
|
|
264
|
+
return (maxMana / 3) / (TUNING.focusRegenPeriodMs / 1000);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Out-of-combat health regen per second, preferring the class OCT curve when the class is known. The
|
|
268
|
+
// sitting multiplier is the caller's. Deprecated without a class — a generic fallback only.
|
|
269
|
+
export function healthRegenPerSec(spirit: number, level: number, classId?: number): number {
|
|
270
|
+
if (classId != null && classId > 0) {
|
|
271
|
+
return Math.max(0, octRegenHpPerSpirit(classId, spirit));
|
|
272
|
+
}
|
|
273
|
+
// Legacy generic (pre-OCT); pets without a class id still use this path.
|
|
274
|
+
return spirit * 0.12 + level * 0.2 + 0.5;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Mana per second at FULL spirit, with no five-second rule. Deprecated and class-agnostic: prefer
|
|
278
|
+
// updateManaRegen, which takes the class, the mp5 and the interrupt percent.
|
|
279
|
+
function manaRegenPerSec(spirit: number, classId?: number, mp5 = 0): number {
|
|
280
|
+
if (classId != null && classId > 0) {
|
|
281
|
+
return updateManaRegen(classId, spirit, mp5, 0).modManaRegen;
|
|
282
|
+
}
|
|
283
|
+
return spirit * 0.18 + 1.5;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/** Linear interpolation between min and max by a [0,1) roll. */
|
|
287
|
+
export function rollBetween(min: number, max: number, roll01: number): number {
|
|
288
|
+
return min + (max - min) * roll01;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const clamp = (x: number, lo: number, hi: number): number => Math.max(lo, Math.min(hi, x));
|
|
292
|
+
|
|
293
|
+
// Attack table: see attackTable.ts (re-exported above).
|
|
294
|
+
|
|
295
|
+
// Apply shield block absorb to physical damage: the blocked amount is the block value capped at the
|
|
296
|
+
// damage, and what remains may be 0 on a full block. Cite: Unit.cpp MELEE_HIT_BLOCK ~2033.
|
|
297
|
+
export function applyShieldBlockAbsorb(damage: number, blockValue: number, blockValuePct: number = 0): number {
|
|
298
|
+
if (damage <= 0) return 0;
|
|
299
|
+
let bv = Math.max(0, blockValue | 0);
|
|
300
|
+
if (blockValuePct > 0) {
|
|
301
|
+
bv = (bv * (100 + blockValuePct)) / 100;
|
|
302
|
+
} else if (blockValuePct < 0) {
|
|
303
|
+
bv = (bv * Math.max(0, 100 + blockValuePct)) / 100;
|
|
304
|
+
}
|
|
305
|
+
const blocked = Math.min(bv, damage);
|
|
306
|
+
return Math.max(0, damage - blocked);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// Spell hit chance on the magic path — a 4% base miss plus the level gap. The `base` argument is kept
|
|
310
|
+
// for call-site compatibility; a custom value falls back to the old level-gap shape.
|
|
311
|
+
export function spellHitChance(atkLevel: number, defLevel: number, base = 0.96): number {
|
|
312
|
+
if (base !== 0.96) {
|
|
313
|
+
const gap = defLevel - atkLevel;
|
|
314
|
+
return clamp(base - 0.02 * Math.max(0, gap) - (gap >= 3 ? 0.01 : 0), 0.1, 1);
|
|
315
|
+
}
|
|
316
|
+
// Equal level: 4% miss → 0.96 hit. +3 vs NPC: 17% miss → 0.83 hit.
|
|
317
|
+
const missPct = spellMissChancePercent({ atkLevel, defLevel, victimPlayerControlled: false });
|
|
318
|
+
return clamp(1 - missPct / 100, 0.01, 1);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/** Spell crit. MAGIC/NONE skip level suppression; MELEE/RANGED (or omitted) keep 1%/level. Cite: Unit.cpp:3814–3823. */
|
|
322
|
+
export function spellCritChance(
|
|
323
|
+
baseCrit: number,
|
|
324
|
+
atkLevel: number,
|
|
325
|
+
defLevel: number,
|
|
326
|
+
dmgClass?: number,
|
|
327
|
+
): number {
|
|
328
|
+
if (dmgClass === SPELL_DAMAGE_CLASS.MAGIC || dmgClass === SPELL_DAMAGE_CLASS.NONE) {
|
|
329
|
+
return clamp(baseCrit, 0, 1);
|
|
330
|
+
}
|
|
331
|
+
return clamp(baseCrit - 0.01 * Math.max(0, defLevel - atkLevel), 0, 1);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Stamina -> bonus health. Classic: 1 health per point up to 20, then 10 per point. `baseHp`
|
|
335
|
+
// (player_classlevelstats) is "before the stamina bonus".
|
|
336
|
+
export function staminaToHealth(baseHp: number, sta: number): number {
|
|
337
|
+
const bonus = sta <= 20 ? sta : 20 + (sta - 20) * 10;
|
|
338
|
+
return Math.round(baseHp + bonus);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/** Intellect -> bonus mana. Classic: 1 mana per point up to 20, then 15 per point. */
|
|
342
|
+
export function intellectToMana(baseMana: number, intel: number): number {
|
|
343
|
+
const bonus = intel <= 20 ? intel : 20 + (intel - 20) * 15;
|
|
344
|
+
return Math.round(baseMana + bonus);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Haste percent to the speed factor the timer scaler divides by. Positive haste shortens; NEGATIVE
|
|
348
|
+
// haste lengthens by that percent instead of the symmetric form, which is what the C++ does.
|
|
349
|
+
export function hasteFactor(haste: number): number {
|
|
350
|
+
if (!haste) return 1;
|
|
351
|
+
if (haste > 0) return 1 + haste / 100;
|
|
352
|
+
// Slow: time *= (100 + |haste|) / 100 → factor = 100 / (100 + |haste|).
|
|
353
|
+
// Cap |haste| at 99.99 so factor never reaches 0 (CMaNGOS −100 guard).
|
|
354
|
+
const slowPct = Math.min(-haste, 99.99);
|
|
355
|
+
return 100 / (100 + slowPct);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// The unarmed band and attack time a DISARM falls back to. Disarm does NOT stop the swing: the C++
|
|
359
|
+
// substitutes the base damage band and forces the base attack time. Off hand and ranged are exempt.
|
|
360
|
+
export const UNARMED_DMG_MIN = 1;
|
|
361
|
+
export const UNARMED_DMG_MAX = 2;
|
|
362
|
+
export const BASE_ATTACK_TIME_MS = 2000;
|
|
363
|
+
|
|
364
|
+
/** Same profile with the unarmed band and BASE_ATTACK_TIME. Generic so WeaponProfile survives. */
|
|
365
|
+
export function disarmedWeaponProfile<T extends {
|
|
366
|
+
dmgMin: number;
|
|
367
|
+
dmgMax: number;
|
|
368
|
+
speedMs: number;
|
|
369
|
+
}>(w: T): T {
|
|
370
|
+
return {
|
|
371
|
+
...w,
|
|
372
|
+
dmgMin: UNARMED_DMG_MIN,
|
|
373
|
+
dmgMax: UNARMED_DMG_MAX,
|
|
374
|
+
speedMs: BASE_ATTACK_TIME_MS,
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
export function scaleTime(baseMs: number, haste: number, floorMs = 0): number {
|
|
379
|
+
if (baseMs <= 0) return 0;
|
|
380
|
+
const scaled = Math.round(baseMs / hasteFactor(haste));
|
|
381
|
+
return floorMs > 0 ? Math.max(floorMs, scaled) : scaled;
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// ---- CMaNGOS Classic 1.12 stats pipeline (pure ports) ---------------------
|
|
385
|
+
// Cite: Player.cpp GetMeleeCritFromAgility / GetDodgeFromAgility; StatSystem.cpp UpdateAttackPower.
|
|
386
|
+
|
|
387
|
+
/** Linear class-rate interpolation used by crit/dodge from agi (lvl 1 ↔ 60 tables). */
|
|
388
|
+
function classRateAtLevel(valLevel1: number, valLevel60: number, level: number): number {
|
|
389
|
+
const lvl = Math.max(1, level);
|
|
390
|
+
return valLevel1 * (60.0 - lvl) / 59.0 + valLevel60 * (lvl - 1.0) / 59.0;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// Melee crit % from agility (percentage points, e.g. 5.0 = 5%). source: Player.cpp GetMeleeCritFromAgility;
|
|
394
|
+
// docs/cmangos_mapping/stats/derived-crit-dodge-spellcrit.md
|
|
395
|
+
export function meleeCritFromAgility(classId: number, level: number, agi: number): number {
|
|
396
|
+
let valLevel1 = 0.0;
|
|
397
|
+
let valLevel60 = 0.0;
|
|
398
|
+
switch (classId) {
|
|
399
|
+
case 2: case 7: case 11: // paladin, shaman, druid
|
|
400
|
+
valLevel1 = 4.6; valLevel60 = 20.0; break;
|
|
401
|
+
case 8: // mage
|
|
402
|
+
valLevel1 = 12.9; valLevel60 = 20.0; break;
|
|
403
|
+
case 4: // rogue
|
|
404
|
+
valLevel1 = 2.2; valLevel60 = 29.0; break;
|
|
405
|
+
case 3: // hunter
|
|
406
|
+
valLevel1 = 3.5; valLevel60 = 53.0; break;
|
|
407
|
+
case 5: // priest
|
|
408
|
+
valLevel1 = 11.0; valLevel60 = 20.0; break;
|
|
409
|
+
case 9: // warlock
|
|
410
|
+
valLevel1 = 8.4; valLevel60 = 20.0; break;
|
|
411
|
+
case 1: // warrior
|
|
412
|
+
valLevel1 = 3.9; valLevel60 = 20.0; break;
|
|
413
|
+
default:
|
|
414
|
+
return 0.0;
|
|
415
|
+
}
|
|
416
|
+
const classrate = classRateAtLevel(valLevel1, valLevel60, level);
|
|
417
|
+
if (classrate <= 0) return 0.0;
|
|
418
|
+
return agi / classrate;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// Dodge percentage points from agility alone; the class base is added separately by the caller.
|
|
422
|
+
// Cite: Player.cpp GetDodgeFromAgility, with the base array in StatSystem.cpp.
|
|
423
|
+
export function dodgeFromAgility(classId: number, level: number, agi: number): number {
|
|
424
|
+
let valLevel1 = 0.0;
|
|
425
|
+
let valLevel60 = 0.0;
|
|
426
|
+
switch (classId) {
|
|
427
|
+
case 2: case 7: case 11: // paladin, shaman, druid
|
|
428
|
+
valLevel1 = 4.6; valLevel60 = 20.0; break;
|
|
429
|
+
case 8: // mage
|
|
430
|
+
valLevel1 = 12.9; valLevel60 = 20.0; break;
|
|
431
|
+
case 4: // rogue
|
|
432
|
+
valLevel1 = 1.1; valLevel60 = 14.5; break;
|
|
433
|
+
case 3: // hunter
|
|
434
|
+
valLevel1 = 1.8; valLevel60 = 26.5; break;
|
|
435
|
+
case 5: // priest
|
|
436
|
+
valLevel1 = 11.0; valLevel60 = 20.0; break;
|
|
437
|
+
case 9: // warlock
|
|
438
|
+
valLevel1 = 8.4; valLevel60 = 20.0; break;
|
|
439
|
+
case 1: // warrior
|
|
440
|
+
valLevel1 = 3.9; valLevel60 = 20.0; break;
|
|
441
|
+
default:
|
|
442
|
+
return 0.0;
|
|
443
|
+
}
|
|
444
|
+
const classrate = classRateAtLevel(valLevel1, valLevel60, level);
|
|
445
|
+
if (classrate <= 0) return 0.0;
|
|
446
|
+
return agi / classrate;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// Class base dodge % (percentage points). Indexed by class id; unused slots 0. source: StatSystem.cpp
|
|
450
|
+
// PLAYER_BASE_DODGE[MAX_CLASSES]
|
|
451
|
+
export const PLAYER_BASE_DODGE: readonly number[] = [
|
|
452
|
+
0.00, // [0] unused
|
|
453
|
+
0.00, // [1] warrior
|
|
454
|
+
0.75, // [2] paladin
|
|
455
|
+
0.64, // [3] hunter
|
|
456
|
+
0.00, // [4] rogue
|
|
457
|
+
3.00, // [5] priest
|
|
458
|
+
0.00, // [6] unused
|
|
459
|
+
1.75, // [7] shaman
|
|
460
|
+
3.25, // [8] mage
|
|
461
|
+
2.00, // [9] warlock
|
|
462
|
+
0.00, // [10] unused
|
|
463
|
+
0.75, // [11] druid
|
|
464
|
+
] as const;
|
|
465
|
+
|
|
466
|
+
/** Total dodge % from class base + agility (percentage points). */
|
|
467
|
+
export function dodgeChancePercent(classId: number, level: number, agi: number): number {
|
|
468
|
+
const base = (classId >= 0 && classId < PLAYER_BASE_DODGE.length) ? PLAYER_BASE_DODGE[classId]! : 0;
|
|
469
|
+
return base + dodgeFromAgility(classId, level, agi);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// Spell crit % from intellect (percentage points). chance = base + INT / (rate0 + rate1 * LEVEL) source:
|
|
473
|
+
// Player.cpp GetSpellCritFromIntellect; docs/cmangos_mapping/stats/derived-crit-dodge-spellcrit.md
|
|
474
|
+
const SPELL_CRIT_DATA: readonly { base: number; rate0: number; rate1: number }[] = [
|
|
475
|
+
{ base: 0.0, rate0: 0.0, rate1: 10.0 }, // 0 unused
|
|
476
|
+
{ base: 0.0, rate0: 0.0, rate1: 10.0 }, // 1 warrior
|
|
477
|
+
{ base: 3.70, rate0: 14.77, rate1: 0.65 }, // 2 paladin
|
|
478
|
+
{ base: 0.0, rate0: 0.0, rate1: 10.0 }, // 3 hunter (FIXME in CMaNGOS)
|
|
479
|
+
{ base: 0.0, rate0: 0.0, rate1: 10.0 }, // 4 rogue
|
|
480
|
+
{ base: 2.97, rate0: 10.03, rate1: 0.82 }, // 5 priest
|
|
481
|
+
{ base: 0.0, rate0: 0.0, rate1: 10.0 }, // 6 unused
|
|
482
|
+
{ base: 3.54, rate0: 11.51, rate1: 0.80 }, // 7 shaman
|
|
483
|
+
{ base: 3.70, rate0: 14.77, rate1: 0.65 }, // 8 mage
|
|
484
|
+
{ base: 3.18, rate0: 11.30, rate1: 0.82 }, // 9 warlock
|
|
485
|
+
{ base: 0.0, rate0: 0.0, rate1: 10.0 }, // 10 unused
|
|
486
|
+
{ base: 3.33, rate0: 12.41, rate1: 0.79 }, // 11 druid
|
|
487
|
+
];
|
|
488
|
+
|
|
489
|
+
export function spellCritFromIntellect(classId: number, level: number, intellect: number): number {
|
|
490
|
+
if (classId < 0 || classId >= SPELL_CRIT_DATA.length) return 0.0;
|
|
491
|
+
const d = SPELL_CRIT_DATA[classId]!;
|
|
492
|
+
const critRatio = d.rate0 + d.rate1 * Math.max(1, level);
|
|
493
|
+
if (critRatio <= 0) return d.base;
|
|
494
|
+
return d.base + intellect / critRatio;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// The shapeshift flag for the agility attack bonus, extracted from the 1.12.1 client DBC: Cat carries
|
|
498
|
+
// it and no other playable form does.
|
|
499
|
+
export const SHAPESHIFT_FLAG_AGILITY_ATTACK_BONUS = 0x00000020;
|
|
500
|
+
|
|
501
|
+
/** Form ids whose DBC flags1 include AGILITY_ATTACK_BONUS (only Cat in 1.12.1). */
|
|
502
|
+
export const FORMS_WITH_AGI_ATTACK_BONUS: ReadonlySet<number> = new Set([1]);
|
|
503
|
+
|
|
504
|
+
export function formHasAgiAttackBonus(formId: number | undefined | null): boolean {
|
|
505
|
+
if (formId == null || formId === 0) return false;
|
|
506
|
+
return FORMS_WITH_AGI_ATTACK_BONUS.has(formId | 0);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
// Melee attack power base, before the unit-mod flat and multiplier, on the per-class curves. A form
|
|
510
|
+
// carrying the agility attack bonus adds full agility on top.
|
|
511
|
+
export function meleeAttackPowerFromStats(
|
|
512
|
+
classId: number,
|
|
513
|
+
level: number,
|
|
514
|
+
str: number,
|
|
515
|
+
agi: number,
|
|
516
|
+
formAgiAttackBonus = false,
|
|
517
|
+
): number {
|
|
518
|
+
const lvl = level;
|
|
519
|
+
let val2 = 0.0;
|
|
520
|
+
switch (classId) {
|
|
521
|
+
case 1: // warrior — StatSystem.cpp:246
|
|
522
|
+
case 2: // paladin — StatSystem.cpp:247
|
|
523
|
+
val2 = lvl * 3.0 + str * 2.0 - 20.0;
|
|
524
|
+
break;
|
|
525
|
+
case 4: // rogue — StatSystem.cpp:248
|
|
526
|
+
case 3: // hunter — StatSystem.cpp:249
|
|
527
|
+
val2 = lvl * 2.0 + str + agi - 20.0;
|
|
528
|
+
break;
|
|
529
|
+
case 7: // shaman — StatSystem.cpp:250
|
|
530
|
+
val2 = lvl * 2.0 + str * 2.0 - 20.0;
|
|
531
|
+
break;
|
|
532
|
+
case 11: // druid — StatSystem.cpp:253: level * 3 + str * 2 - 20, plus AGI when SHAPESHIFT_FLAG_AGILITY_ATTACK_BONUS (Cat).
|
|
533
|
+
val2 = lvl * 3.0 + str * 2.0 - 20.0 + (formAgiAttackBonus ? agi : 0);
|
|
534
|
+
break;
|
|
535
|
+
case 8: // mage — StatSystem.cpp:260
|
|
536
|
+
case 5: // priest — StatSystem.cpp:261
|
|
537
|
+
case 9: // warlock — StatSystem.cpp:262
|
|
538
|
+
val2 = str - 10.0;
|
|
539
|
+
break;
|
|
540
|
+
default:
|
|
541
|
+
val2 = 0.0;
|
|
542
|
+
break;
|
|
543
|
+
}
|
|
544
|
+
return val2;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// Ranged attack power base, before the unit-mod flat and multiplier: hunters double both terms,
|
|
548
|
+
// rogues and warriors take one each, and the cat and bear forms take none at all.
|
|
549
|
+
export function rangedAttackPowerFromStats(
|
|
550
|
+
classId: number,
|
|
551
|
+
level: number,
|
|
552
|
+
agi: number,
|
|
553
|
+
formId = 0,
|
|
554
|
+
): number {
|
|
555
|
+
const lvl = level;
|
|
556
|
+
switch (classId) {
|
|
557
|
+
case 3: // hunter — StatSystem.cpp:225
|
|
558
|
+
return lvl * 2.0 + agi * 2.0 - 10.0;
|
|
559
|
+
case 4: // rogue — StatSystem.cpp:226
|
|
560
|
+
case 1: // warrior — StatSystem.cpp:227
|
|
561
|
+
return lvl + agi - 10.0;
|
|
562
|
+
case 11: { // druid — StatSystem.cpp:228–237
|
|
563
|
+
// FORM_CAT=1, FORM_BEAR=5, FORM_DIREBEAR=8 (SpellDefines.h / schema SHAPESHIFT_FORM)
|
|
564
|
+
if (formId === 1 || formId === 5 || formId === 8) return 0.0;
|
|
565
|
+
return agi - 10.0;
|
|
566
|
+
}
|
|
567
|
+
default: // StatSystem.cpp:239
|
|
568
|
+
return agi - 10.0;
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// The strength contribution coefficient to melee AP, for equipment scoring and mid-fight strength
|
|
573
|
+
// buffs — 1 or 2, derived from the same per-class curve.
|
|
574
|
+
export function meleeApPerStrength(classId: number): number {
|
|
575
|
+
switch (classId) {
|
|
576
|
+
case 1: case 2: case 7: case 11: return 2; // warrior, paladin, shaman, druid
|
|
577
|
+
case 3: case 4: case 5: case 8: case 9: return 1; // hunter, rogue, priest, mage, warlock
|
|
578
|
+
default: return 0;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
// Shield block VALUE, the flat damage absorbed on a successful block, not the block chance:
|
|
583
|
+
// (flat + strength / 20 − 1) × percent, floored at 0. Cite: Player.cpp GetShieldBlockValue ~4878.
|
|
584
|
+
export function shieldBlockValue(str: number, auraFlat = 0, auraPct = 1): number {
|
|
585
|
+
// source: Player.cpp:Player::GetShieldBlockValue — str/20 - 1, clamp 0, uint32 truncate
|
|
586
|
+
let value = (auraFlat + str / 20 - 1) * auraPct;
|
|
587
|
+
if (value < 0) value = 0;
|
|
588
|
+
return Math.floor(value);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
// The layered unit-mod total: (base + create) × base percent, plus the total value, × the total
|
|
592
|
+
// percent. Both percentages default to 1, as the C++ initialises them.
|
|
593
|
+
export function unitModValue(
|
|
594
|
+
baseValue: number,
|
|
595
|
+
create: number,
|
|
596
|
+
basePct = 1,
|
|
597
|
+
totalValue = 0,
|
|
598
|
+
totalPct = 1,
|
|
599
|
+
): number {
|
|
600
|
+
if (totalPct <= 0) return 0;
|
|
601
|
+
let value = baseValue + create;
|
|
602
|
+
value *= basePct;
|
|
603
|
+
value += totalValue;
|
|
604
|
+
value *= totalPct;
|
|
605
|
+
return value;
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
// Final attack power from the class base, the flat total and the multiplier. The multiplier here is
|
|
609
|
+
// the full factor, where 1.0 is no change, matching the layered helper above.
|
|
610
|
+
export function totalAttackPower(baseAp: number, totalValue = 0, basePct = 1, totalPct = 1): number {
|
|
611
|
+
const v = unitModValue(baseAp, 0, basePct, totalValue, totalPct);
|
|
612
|
+
return Math.max(0, Math.floor(v));
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
// Armor from total agility doubled, plus the gear, enchant and aura flats. Cite: StatSystem.cpp
|
|
616
|
+
// UpdateArmor; Player.cpp InitStatsForLevel SetArmor(createAgi*2).
|
|
617
|
+
export function armorFromAgiAndGear(agi: number, gearAndAuraArmor: number): number {
|
|
618
|
+
return Math.floor(agi * 2.0 + gearAndAuraArmor);
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// The DISPLAY-only percentage bonus from skill over the level cap. CMaNGOS applies it to the printed
|
|
622
|
+
// value alone — combat reads the pre-skill number, so this must never reach a roll.
|
|
623
|
+
export function skillDisplayBonusPercentPoints(skill: number, level: number): number {
|
|
624
|
+
const cap = Math.max(1, Math.floor(level)) * 5; // Unit.h GetSkillMaxForLevel
|
|
625
|
+
return (skill - cap) * 0.04;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
/** @deprecated Prefer meleeCritFromAgility(classId, level, agi) / 100. A thin warrior-L60-shaped
|
|
629
|
+
* fallback, kept only for call sites with no class context. */
|
|
630
|
+
function critChanceFromAgi(agi: number): number {
|
|
631
|
+
// Warrior L60 rate is 20 agi per 1% — historical TUNING.agiPerCrit shape, not authoritative.
|
|
632
|
+
return meleeCritFromAgility(1, 60, agi) / 100;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/** @deprecated Prefer dodgeChancePercent(classId, level, agi) / 100. */
|
|
636
|
+
function dodgeChanceFromAgi(agi: number): number {
|
|
637
|
+
return dodgeFromAgility(1, 60, agi) / 100;
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/** @deprecated Prefer meleeAttackPowerFromStats(classId, level, str, agi). A warrior-shaped curve for
|
|
641
|
+
* call sites that only have a level and strength. */
|
|
642
|
+
function attackPowerFromStats(level: number, str: number): number {
|
|
643
|
+
return Math.max(0, meleeAttackPowerFromStats(1, level, str, 0));
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
// ---- Resistances & crowd control ------------------------------------------
|
|
647
|
+
// The average-resist helpers are rng-free, for CC land rolls; combat DAMAGE uses the partial table.
|
|
648
|
+
|
|
649
|
+
// The average fraction of magic damage resistance removes, with no partial table. For CC, the UI and
|
|
650
|
+
// tests only — combat damage must roll the table. Returns 0 at or below zero resistance.
|
|
651
|
+
export function resistMitigation(resistance: number, casterLevel: number): number {
|
|
652
|
+
if (resistance <= 0) return 0;
|
|
653
|
+
const pct = effectiveMagicResistancePercent({
|
|
654
|
+
school: 'fire', // school-agnostic average of a raw resistance amount
|
|
655
|
+
resistance,
|
|
656
|
+
attackerLevel: casterLevel,
|
|
657
|
+
victimLevel: casterLevel,
|
|
658
|
+
binary: false,
|
|
659
|
+
victimIsNpc: false,
|
|
660
|
+
});
|
|
661
|
+
return Math.max(0, pct) / 100;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
// The legacy CC full-resist roll. applySpell no longer uses it, since hostile CC shares the cast's own
|
|
665
|
+
// hit result; it survives for the inline proc CC path.
|
|
666
|
+
export function ccResistChance(resistance: number, atkLevel: number, defLevel: number): number {
|
|
667
|
+
const level = 1 - spellHitChance(atkLevel, defLevel); // same level-gap shape as a spell miss
|
|
668
|
+
const fromRes = resistMitigation(resistance, atkLevel) * TUNING.resistCcFactor;
|
|
669
|
+
return clamp(level + fromRes, 0, 0.9);
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
// Diminishing-returns duration multiplier for the Nth application in a category (0 → full, 1 → ½, 2 → ¼, ≥3
|
|
673
|
+
// → immune). Pure arithmetic — DR draws no rng.
|
|
674
|
+
export function drFactor(step: number): number {
|
|
675
|
+
const s = TUNING.drSteps;
|
|
676
|
+
return s[Math.min(Math.max(0, step), s.length - 1)];
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
// Off-hand physical damage TOTAL_PCT default (50% weapon+AP). source: Unit.cpp constructor ~375–376
|
|
680
|
+
// `m_auraModifiersGroup[UNIT_MOD_DAMAGE_OFFHAND][TOTAL_PCT] = 0.5f`
|
|
681
|
+
export const OFFHAND_DAMAGE_TOTAL_PCT = 0.5;
|
|
682
|
+
|
|
683
|
+
// The off-hand total percent after the off-hand damage aura. That percent is a MOD of the 0.5 default,
|
|
684
|
+
// so a full Dual Wield Specialization gives 0.625, not 0.75.
|
|
685
|
+
export function offhandDamageTotalPct(pctBonus: number | undefined): number {
|
|
686
|
+
const pct = Number(pctBonus) || 0;
|
|
687
|
+
return OFFHAND_DAMAGE_TOTAL_PCT * (100 + pct) / 100;
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
// The crit multiplier after the versus-creature-type aura: the base times one plus the bonus, when the
|
|
691
|
+
// victim's type matches. Heals never take it — the C++ guards the whole block.
|
|
692
|
+
export function critMultiplierWithVersus(
|
|
693
|
+
base: number,
|
|
694
|
+
rows: ReadonlyArray<{ creatureTypeMask: number; amount: number }> | undefined,
|
|
695
|
+
creatureType: number | undefined,
|
|
696
|
+
): number {
|
|
697
|
+
const type = (creatureType ?? 0) | 0;
|
|
698
|
+
if (!rows?.length || type < 1) return base;
|
|
699
|
+
const typeMask = 1 << (type - 1);
|
|
700
|
+
let bonus = 0;
|
|
701
|
+
for (const r of rows) if (((r.creatureTypeMask ?? 0) | 0) & typeMask) bonus += r.amount;
|
|
702
|
+
return bonus ? base * (1 + bonus / 100) : base;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
/** Unarmed fallback when !CanUseEquippedWeapon (Unit.h BASE_MINDAMAGE / BASE_MAXDAMAGE). */
|
|
706
|
+
export const BASE_MINDAMAGE = 1;
|
|
707
|
+
export const BASE_MAXDAMAGE = 2;
|
|
708
|
+
|
|
709
|
+
// Inputs for CalculateMinMaxDamage. The defaults match the C++ unit-mod init, except that an off-hand
|
|
710
|
+
// caller should pass the off-hand total percent.
|
|
711
|
+
export interface MinMaxDamageArgs {
|
|
712
|
+
weaponMin: number;
|
|
713
|
+
weaponMax: number;
|
|
714
|
+
attackPower: number;
|
|
715
|
+
/** Attack time in ms; att_speed = speedMs/1000 when !normalized. */
|
|
716
|
+
speedMs: number;
|
|
717
|
+
/** UNIT_MOD_* BASE_VALUE (usually 0 for players). */
|
|
718
|
+
baseValueMod?: number;
|
|
719
|
+
basePct?: number;
|
|
720
|
+
totalValue?: number;
|
|
721
|
+
/** UNIT_MOD_* TOTAL_PCT; off-hand default is 0.5 in Unit.cpp. */
|
|
722
|
+
totalPct?: number;
|
|
723
|
+
// GetEnchantmentModifier flat — only applied on the equipped-weapon branch. Gap: Phonecraft item/enchant
|
|
724
|
+
// data has no baked weapon-damage flat today → pass 0.
|
|
725
|
+
enchantFlat?: number;
|
|
726
|
+
/** Ranged ammo DPS (min/max) × att_speed added to weapon. Gap: no ammo DPS in schema → 0. */
|
|
727
|
+
ammoDpsMin?: number;
|
|
728
|
+
ammoDpsMax?: number;
|
|
729
|
+
/** IsAttackSpeedOverridenShapeShift — form level×speed weapon bands. */
|
|
730
|
+
formOverride?: boolean;
|
|
731
|
+
/** Level for form override (clamped ≤60). */
|
|
732
|
+
level?: number;
|
|
733
|
+
/** CanUseEquippedWeapon; false → BASE_MINDAMAGE/BASE_MAXDAMAGE. Default true. */
|
|
734
|
+
canUseWeapon?: boolean;
|
|
735
|
+
// Multi-damage-line index. When index ≠ 0 on equipped branch, base_value and total_value are zeroed
|
|
736
|
+
// (secondary weapon damage lines carry no AP/enchant).
|
|
737
|
+
index?: number;
|
|
738
|
+
// Normalized ability path: use normalizedSpeedSec as att_speed (GetAPMultiplier). White attacks leave
|
|
739
|
+
// this false.
|
|
740
|
+
normalized?: boolean;
|
|
741
|
+
/** Seconds; required when normalized=true (dagger 1.7 / 1H 2.4 / 2H 3.3 / ranged 2.8). */
|
|
742
|
+
normalizedSpeedSec?: number;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
// The CalculateMinMaxDamage structure, giving min and max before the damage roll: the base value is
|
|
746
|
+
// attack power over 14 times the attack speed, then the weapon band through both percent layers.
|
|
747
|
+
export function calculateMinMaxDamage(args: MinMaxDamageArgs): { min: number; max: number } {
|
|
748
|
+
const attSpeed = args.normalized && args.normalizedSpeedSec != null
|
|
749
|
+
? Math.max(0, args.normalizedSpeedSec)
|
|
750
|
+
: Math.max(0, args.speedMs) / 1000;
|
|
751
|
+
|
|
752
|
+
let baseValue = (args.baseValueMod ?? 0) + (args.attackPower / 14) * attSpeed;
|
|
753
|
+
const basePct = args.basePct ?? 1;
|
|
754
|
+
let totalValue = args.totalValue ?? 0;
|
|
755
|
+
const totalPct = args.totalPct ?? 1;
|
|
756
|
+
|
|
757
|
+
let weaponMin = args.weaponMin;
|
|
758
|
+
let weaponMax = args.weaponMax;
|
|
759
|
+
|
|
760
|
+
if (args.formOverride) {
|
|
761
|
+
let lvl = (args.level ?? 1) | 0;
|
|
762
|
+
if (lvl > 60) lvl = 60;
|
|
763
|
+
if (lvl < 1) lvl = 1;
|
|
764
|
+
weaponMin = lvl * 0.85 * attSpeed;
|
|
765
|
+
weaponMax = lvl * 1.25 * attSpeed;
|
|
766
|
+
} else if (args.canUseWeapon === false) {
|
|
767
|
+
weaponMin = BASE_MINDAMAGE;
|
|
768
|
+
weaponMax = BASE_MAXDAMAGE;
|
|
769
|
+
} else {
|
|
770
|
+
totalValue += args.enchantFlat ?? 0;
|
|
771
|
+
if (args.ammoDpsMin != null && args.ammoDpsMin !== 0) {
|
|
772
|
+
weaponMin += args.ammoDpsMin * attSpeed;
|
|
773
|
+
}
|
|
774
|
+
if (args.ammoDpsMax != null && args.ammoDpsMax !== 0) {
|
|
775
|
+
weaponMax += args.ammoDpsMax * attSpeed;
|
|
776
|
+
}
|
|
777
|
+
if ((args.index ?? 0) !== 0) {
|
|
778
|
+
baseValue = 0;
|
|
779
|
+
totalValue = 0;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
return {
|
|
784
|
+
min: ((baseValue + weaponMin) * basePct + totalValue) * totalPct,
|
|
785
|
+
max: ((baseValue + weaponMax) * basePct + totalValue) * totalPct,
|
|
786
|
+
};
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
// Roll raw white or ability weapon damage between that min and max. The options select the off-hand
|
|
790
|
+
// half, a form override and the enchant or ammo hooks; omitted, it matches the prior shape.
|
|
791
|
+
export function meleeBaseDamage(
|
|
792
|
+
weaponMin: number,
|
|
793
|
+
weaponMax: number,
|
|
794
|
+
attackPower: number,
|
|
795
|
+
speedMs: number,
|
|
796
|
+
roll01: number,
|
|
797
|
+
opts?: Omit<MinMaxDamageArgs, 'weaponMin' | 'weaponMax' | 'attackPower' | 'speedMs'>,
|
|
798
|
+
): number {
|
|
799
|
+
const range = calculateMinMaxDamage({
|
|
800
|
+
weaponMin,
|
|
801
|
+
weaponMax,
|
|
802
|
+
attackPower,
|
|
803
|
+
speedMs,
|
|
804
|
+
...opts,
|
|
805
|
+
});
|
|
806
|
+
return rollBetween(range.min, range.max, roll01);
|
|
807
|
+
}
|