diff --git a/README.md b/README.md index d2605cf..25f7af1 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Export Settings - by pressing the Export Settings button, the current settings f * Alt+I: Disable Hero Attachments(floating cooldowns beside hero Healthplates) * ALT+U: Move the Hero Health Label Display Setting Up(the percentage of health at which Hero Health will display as a number in their Healthplate) * ALT+Y: Move the Hero Health Label Display Setting Down(the percentage of health at which Hero Health will display as a number in their Healthplate) - * Alt+T: Disable talents in the Top Bar + * Alt+T: Minimal Mode: Disables showing non-heroic talents in the top bar, and changes a number of other settings to reduce visual clutter * Alt+R: Disable Basic Abilities in the Top bar * Alt+K: Disable Structure Health in Healthplates * Alt+1: Open Timestamped Statitsics in the Bottom Panel diff --git a/changelog.md b/changelog.md index d4241fa..77b327a 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,39 @@ +**v0.23** + +Statistics +* Expanded Support for Dehaka +* Fixed numerous issues where something that was listed as Damage to Neutral Mercenaries would include Monsters as Neutral Mercenaries +* Updates to support changes in the 2.54.2 Patch, as well as some other minor adjustments & fixes + +UI +* Updated the overall visual style & minor layout adjustments of the Top Bar +* Added new options to disable talent displaying in the Top Bar piecemeal - if you only want to see talents that grant an active, you can do that on a tier-by-tier basis, as well as disabling quests and buff tracking tier-by-tier +* The Show Talents Hotkey(ALT+T) has been replaced with a "Minimal Mode" hotkey, which will change a number of settings to make the UI less crowded. This is intended for use in caster scenarios. +* Added a new option to use an alternate talent layout in the Top Bar. This is recommended to be used when all non-heroic talents are set to not be visible, but compatability is maintained when those settings are not present +* Energy now supports displaying energy-over-time effects in the Top Bar(Energy preview, same as Healing previews) +* Tracer's Pulse Bomb Charge is now placed over hero the Heroic talent slot in the Top Bar, and the icon updates to the icon of her selected Heroic talent and the charge background becomes partially transparent +* Deathwing's Cataclysm cooldown will no longer be displayed in the "Core Ability Slot" if Burn Beneath My Shadow(Cataclysm upgrade) is selected at level 10, as the cooldown is shown there. +* Xul's Bone Armor has been readded to his Basic Ability cooldown listings in the Top Bar, and will no longer display the cooldown in the Bottom Panel +* Medivh's Portal Mastery no longer adds the Portal Cooldown to the talent in the Top Bar, and will no longer display the cooldown in the Bottom Panel +* Added Johanna's Steed Charge cooldown to the Top Bar & Bottom Panel +* Added Lunara's Galloping Gait cooldown to the Top Bar & Bottom Panel +* Heroic Talents that feature charges now feature them in the Top Bar & Bottom Panel +* When you select a Storm Talent that adds charges to a Heroic talent option, charge counters are now added to the Heroic slot in the Top Bar & Bottom Panel +* Artanis Reactive Parry is now displayed as buff is selected in the Top Bar +* Dehaka's Paralyzing Enzymes Gambit Talent progress now displays in the Top Bar & Bottom Panel +* Samuro's Mirror Image display in the Top Bar has been reworked to more closely match the overall visual presentation of baseline bonuses, and can now be disabled by disabling baseline buffs & stacks +* The options menu has seen a redesign in button design & some button placement to accomadate the need for more space +* Hero Health Labels as part of their Healthplates now uses a Pulldown menu to select the perctage of health to display the health label +* Numerous Heroes have had their attachment settings redesigned to support display abilities granted by talents. More Heroes will be added to this "V2" over time, right now Artanis, Anduin, Li-Ming, Alarak, Deckard, Johanna, D.Va, Maiev, E.T.C., Alexstrasza, Garrosh, Ana, Auriel, Anub'arak, Chromie, Arthas, Azmodan, Blaze, Brightwing, Cassia, Zeratul, Sonya and Abathur have been updated +* Fixed an issue where Illidan's Health Bar was not the correct size in the Top Bar +* Fixed an issue where Fenix's Health Bar & Shields Bar did not behavior properly in the Top Bar +* Fixed an issue where Cursed Hollow's Sandbox Battleground would not be supported properly when displaying total potential owned Forts in the Top Bar +* Fixed an issue where Valla's Fire At Will quest progress would not display after she reached 20 stacks in the Top Bar & Bottom Panel +* Fixed an issue where Blizzard's Target Info Panel would not display correctly after being dragged +* Hopefully finally fixed an issue causing some ability cooldown text to be truncated when the value is too high at certain screen resolutions +* Fixed a typo in one of Johanna's score listings +* Updated ability tooltips in the Top Bar to match those seen in version 2.54.2 + **v0.22** Statistics diff --git a/conversion/AlteracPass/replay.details b/conversion/AlteracPass/replay.details index 0548541..ec6058b 100644 Binary files a/conversion/AlteracPass/replay.details and b/conversion/AlteracPass/replay.details differ diff --git a/conversion/BattlefieldofEternity/replay.details b/conversion/BattlefieldofEternity/replay.details index e56bfc4..7479b0a 100644 Binary files a/conversion/BattlefieldofEternity/replay.details and b/conversion/BattlefieldofEternity/replay.details differ diff --git a/conversion/BlackheartsBay/replay.details b/conversion/BlackheartsBay/replay.details index 590f1af..c76927f 100644 Binary files a/conversion/BlackheartsBay/replay.details and b/conversion/BlackheartsBay/replay.details differ diff --git a/conversion/BraxisHoldout/replay.details b/conversion/BraxisHoldout/replay.details index 20461c0..290e61d 100644 Binary files a/conversion/BraxisHoldout/replay.details and b/conversion/BraxisHoldout/replay.details differ diff --git a/conversion/BraxisOutpost/replay.details b/conversion/BraxisOutpost/replay.details index 9e0d991..eed5550 100644 Binary files a/conversion/BraxisOutpost/replay.details and b/conversion/BraxisOutpost/replay.details differ diff --git a/conversion/CursedHollow/replay.details b/conversion/CursedHollow/replay.details index 56a12fc..8176738 100644 Binary files a/conversion/CursedHollow/replay.details and b/conversion/CursedHollow/replay.details differ diff --git a/conversion/DragonShire/replay.details b/conversion/DragonShire/replay.details index c747103..5d6a7c5 100644 Binary files a/conversion/DragonShire/replay.details and b/conversion/DragonShire/replay.details differ diff --git a/conversion/GardenofTerror/replay.details b/conversion/GardenofTerror/replay.details index 355beb6..09ebe0c 100644 Binary files a/conversion/GardenofTerror/replay.details and b/conversion/GardenofTerror/replay.details differ diff --git a/conversion/HanamuraTemple/replay.details b/conversion/HanamuraTemple/replay.details index ebe83d4..50187de 100644 Binary files a/conversion/HanamuraTemple/replay.details and b/conversion/HanamuraTemple/replay.details differ diff --git a/conversion/HauntedMines/replay.details b/conversion/HauntedMines/replay.details index 0e80d3d..642bacb 100644 Binary files a/conversion/HauntedMines/replay.details and b/conversion/HauntedMines/replay.details differ diff --git a/conversion/InfernalShrines/replay.details b/conversion/InfernalShrines/replay.details index 29f48ab..3acc2a0 100644 Binary files a/conversion/InfernalShrines/replay.details and b/conversion/InfernalShrines/replay.details differ diff --git a/conversion/LostCavern/replay.details b/conversion/LostCavern/replay.details index 0437c86..7cbb451 100644 Binary files a/conversion/LostCavern/replay.details and b/conversion/LostCavern/replay.details differ diff --git a/conversion/SilverCity/replay.details b/conversion/SilverCity/replay.details index ef401be..c51d958 100644 Binary files a/conversion/SilverCity/replay.details and b/conversion/SilverCity/replay.details differ diff --git a/conversion/SkyTemple/replay.details b/conversion/SkyTemple/replay.details index 4d35557..26ac323 100644 Binary files a/conversion/SkyTemple/replay.details and b/conversion/SkyTemple/replay.details differ diff --git a/conversion/TomboftheSpiderQueen/replay.details b/conversion/TomboftheSpiderQueen/replay.details index fda683a..fbe6ecc 100644 Binary files a/conversion/TomboftheSpiderQueen/replay.details and b/conversion/TomboftheSpiderQueen/replay.details differ diff --git a/conversion/TowersofDoom/replay.details b/conversion/TowersofDoom/replay.details index 765c4f7..74acf98 100644 Binary files a/conversion/TowersofDoom/replay.details and b/conversion/TowersofDoom/replay.details differ diff --git a/conversion/VolskayaFoundry/replay.details b/conversion/VolskayaFoundry/replay.details index 69efafa..cacac6d 100644 Binary files a/conversion/VolskayaFoundry/replay.details and b/conversion/VolskayaFoundry/replay.details differ diff --git a/conversion/WarheadJunction/replay.details b/conversion/WarheadJunction/replay.details index 17762fb..3430338 100644 Binary files a/conversion/WarheadJunction/replay.details and b/conversion/WarheadJunction/replay.details differ diff --git a/interface/SpazzoObs v23.StormInterface b/interface/SpazzoObs v23.StormInterface new file mode 100644 index 0000000..0dd0dc1 Binary files /dev/null and b/interface/SpazzoObs v23.StormInterface differ diff --git a/maps/Heroes/CustomReplayMaps/AlteracPass.StormMap b/maps/Heroes/CustomReplayMaps/AlteracPass.StormMap index 46a9628..8df4294 100644 Binary files a/maps/Heroes/CustomReplayMaps/AlteracPass.StormMap and b/maps/Heroes/CustomReplayMaps/AlteracPass.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/BattlefieldofEternity.StormMap b/maps/Heroes/CustomReplayMaps/BattlefieldofEternity.StormMap index 52a3a70..17be10b 100644 Binary files a/maps/Heroes/CustomReplayMaps/BattlefieldofEternity.StormMap and b/maps/Heroes/CustomReplayMaps/BattlefieldofEternity.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/BlackheartsBay.StormMap b/maps/Heroes/CustomReplayMaps/BlackheartsBay.StormMap index 7c1f134..3f1878b 100644 Binary files a/maps/Heroes/CustomReplayMaps/BlackheartsBay.StormMap and b/maps/Heroes/CustomReplayMaps/BlackheartsBay.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/BraxisHoldout.StormMap b/maps/Heroes/CustomReplayMaps/BraxisHoldout.StormMap index c1e2626..c475484 100644 Binary files a/maps/Heroes/CustomReplayMaps/BraxisHoldout.StormMap and b/maps/Heroes/CustomReplayMaps/BraxisHoldout.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/BraxisOutpost.StormMap b/maps/Heroes/CustomReplayMaps/BraxisOutpost.StormMap index a91478e..6f62c7a 100644 Binary files a/maps/Heroes/CustomReplayMaps/BraxisOutpost.StormMap and b/maps/Heroes/CustomReplayMaps/BraxisOutpost.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/CursedHollow.StormMap b/maps/Heroes/CustomReplayMaps/CursedHollow.StormMap index f741038..a7daa8e 100644 Binary files a/maps/Heroes/CustomReplayMaps/CursedHollow.StormMap and b/maps/Heroes/CustomReplayMaps/CursedHollow.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameDataHelperLib.galaxy b/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameDataHelperLib.galaxy index a205e44..2c486b3 100644 --- a/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameDataHelperLib.galaxy +++ b/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameDataHelperLib.galaxy @@ -158,6 +158,8 @@ void libGDHL_InitVariables () { libGDHL_gv_lostVikingsUI.lv_erikDeathStatusFrame = c_invalidDialogControlId; libGDHL_gv_lostVikingsUI.lv_allDeathStatusFrame = c_invalidDialogControlId; libGDHL_gv_bALHeroMalfurionDruidsGiftManaCostReduction = 0.1; + libGDHL_gv_healingBeamUI.lv_healingBeamTargetDisplayName = c_invalidDialogControlId; + libGDHL_gv_healingBeamUI.lv_healingBeamTargetPortrait = c_invalidDialogControlId; libGDHL_gv_medicUI.lv_mainPanel = c_invalidDialogControlId; libGDHL_gv_medicUI.lv_medivacAlert = c_invalidDialogControlId; libGDHL_gv_medicUI.lv_medivacCountdownNumber = c_invalidDialogControlId; @@ -2579,7 +2581,8 @@ void libGDHL_gf_HeroMedicIncrementHeroCountFunction () { TriggerEnable(libGDHL_gt_HeroMedicMedivacDropshipOverlay, true); TriggerEnable(libGDHL_gt_HeroMedicMedivacDropshipCountdownSound, true); TriggerEnable(libGDHL_gt_HeroMedicMedivacBeingBoarded, true); - TriggerEnable(libGDHL_gt_HeroMedicHealingBeamLookAt, true); + TriggerEnable(libGDHL_gt_HeroMedicHealingBeamTargetActions, true); + TriggerEnable(libGDHL_gt_HeroMedicHealingBeamUIReset, true); TriggerEnable(libGDHL_gt_HeroMedicHearthCleanup, true); TriggerEnable(libGDHL_gt_HeroMedicHealingBeamAllyRangeVisibility, true); TriggerEnable(libGDHL_gt_HeroMedicSafeguardVanadiumPlatingTalentProc, true); @@ -2608,7 +2611,8 @@ void libGDHL_gf_HeroMedicDecrementHeroCountFunction () { TriggerEnable(libGDHL_gt_HeroMedicMedivacDropshipOverlay, false); TriggerEnable(libGDHL_gt_HeroMedicMedivacDropshipCountdownSound, false); TriggerEnable(libGDHL_gt_HeroMedicMedivacBeingBoarded, false); - TriggerEnable(libGDHL_gt_HeroMedicHealingBeamLookAt, false); + TriggerEnable(libGDHL_gt_HeroMedicHealingBeamTargetActions, false); + TriggerEnable(libGDHL_gt_HeroMedicHealingBeamUIReset, false); TriggerEnable(libGDHL_gt_HeroMedicHearthCleanup, false); TriggerEnable(libGDHL_gt_HeroMedicHealingBeamAllyRangeVisibility, false); TriggerEnable(libGDHL_gt_HeroMedicSafeguardVanadiumPlatingTalentProc, false); @@ -2619,6 +2623,59 @@ void libGDHL_gf_HeroMedicDecrementHeroCountFunction () { } +string libGDHL_gf_HealingBeamGetPortraitPathforUnit (unit lp_unit) { + // Automatic Variable Declarations + string auto0CC21378_val; + + // Implementation + auto0CC21378_val = UnitGetType(lp_unit); + if (auto0CC21378_val == "HeroChenStorm") { + return "Assets\\Textures\\storm_ui_ingame_targetinfopanel_unit_chen_storm.dds"; + } + else if (auto0CC21378_val == "HeroChenEarth") { + return "Assets\\Textures\\storm_ui_ingame_targetinfopanel_unit_chen_earth.dds"; + } + else if (auto0CC21378_val == "HeroChenFire") { + return "Assets\\Textures\\storm_ui_ingame_targetinfopanel_unit_chen_fire.dds"; + } + else { + return libUIUI_gf_KillLogGetPortraitPathforUnit(lp_unit); + } +} + +void libGDHL_gf_MedicUIHealingBeam (bool lp_reset, int lp_medicPlayer, unit lp_healingBeamTarget) { + // Automatic Variable Declarations + // Implementation + if ((lp_reset == true)) { + libNtve_gf_SetDialogItemImage(libGDHL_gv_healingBeamUI.lv_healingBeamTargetPortrait, "Assets\\Textures\\storm_ui_icon_medic_healingbeam.dds", PlayerGroupSingle(lp_medicPlayer)); + DialogControlSetVisible(libGDHL_gv_healingBeamUI.lv_healingBeamTargetDisplayName, PlayerGroupSingle(lp_medicPlayer), false); + } + else { + DialogControlSetVisible(libGDHL_gv_healingBeamUI.lv_healingBeamTargetDisplayName, PlayerGroupSingle(lp_medicPlayer), true); + libNtve_gf_SetDialogItemText(libGDHL_gv_healingBeamUI.lv_healingBeamTargetDisplayName, libGDHL_gf_MedicUIUnitDisplayName(lp_healingBeamTarget), PlayerGroupSingle(lp_medicPlayer)); + libNtve_gf_SetDialogItemImage(libGDHL_gv_healingBeamUI.lv_healingBeamTargetPortrait, libGDHL_gf_HealingBeamGetPortraitPathforUnit(lp_healingBeamTarget), PlayerGroupSingle(lp_medicPlayer)); + } +} + +text libGDHL_gf_MedicUIUnitDisplayName (unit lp_unit) { + // Variable Declarations + int lv_unitOwner; + + // Automatic Variable Declarations + // Variable Initialization + lv_unitOwner = UnitGetOwner(lp_unit); + + // Implementation + if ((UnitGetType(lp_unit) == "HeroCho")) { + return StringExternal("Param/Value/lib_GDHL_1F065CDD"); + } + else { + return UnitGetName(lp_unit); + } +} + + + trigger auto_libGDHL_gf_UIHeroSpecificStatusFrameShowHideMedivacUI_Trigger = null; bool auto_libGDHL_gf_UIHeroSpecificStatusFrameShowHideMedivacUI_lp_showHide; int auto_libGDHL_gf_UIHeroSpecificStatusFrameShowHideMedivacUI_lp_player; @@ -15973,6 +16030,44 @@ void libGDHL_gt_HeroMalfurionTenaciousRootsProc_Init () { TriggerAddEventUnitBehaviorChangeFromCategory(libGDHL_gt_HeroMalfurionTenaciousRootsProc, null, c_behaviorCategoryStun, c_unitBehaviorChangeRefresh); } +//-------------------------------------------------------------------------------------------------- +// Trigger: Healing Beam UI Initialize +//-------------------------------------------------------------------------------------------------- +bool libGDHL_gt_HealingBeamUIInitialize_Func (bool testConds, bool runActions) { + int init_i; + + // Variable Declarations + int[6] lv_panels; + int lv_currentPanelLayer; + + // Automatic Variable Declarations + // Variable Initialization + for (init_i = 0; init_i <= 5; init_i += 1) { + lv_panels[init_i] = c_invalidDialogControlId; + } + + // Actions + if (!runActions) { + return true; + } + + DialogControlHookup(libUIUI_gv_heroSpecificStatusContainer, c_triggerControlTypeImage, "MedicFrame/UnitStatusFrame0/MechanicTexture"); + libGDHL_gv_healingBeamUI.lv_healingBeamTargetPortrait = DialogControlLastCreated(); + DialogControlHookup(libUIUI_gv_heroSpecificStatusContainer, c_triggerControlTypeLabel, "MedicFrame/UnitStatusFrame0/MedicHealingBeamName"); + libGDHL_gv_healingBeamUI.lv_healingBeamTargetDisplayName = DialogControlLastCreated(); + lv_currentPanelLayer += 1; + lv_panels[lv_currentPanelLayer] = DialogControlLastCreated(); + + return true; +} + +//-------------------------------------------------------------------------------------------------- +void libGDHL_gt_HealingBeamUIInitialize_Init () { + libGDHL_gt_HealingBeamUIInitialize = TriggerCreate("libGDHL_gt_HealingBeamUIInitialize_Func"); + libCore_gf_IncludeModInitialization(libGDHL_gt_HealingBeamUIInitialize); +} + + //-------------------------------------------------------------------------------------------------- // Trigger: Medic UI Initialize //-------------------------------------------------------------------------------------------------- @@ -16587,37 +16682,77 @@ void libGDHL_gt_HeroMedicMedivacGameOverHide_Init () { } //-------------------------------------------------------------------------------------------------- -// Trigger: Hero - Medic - Healing Beam LookAt +// Trigger: Hero - Medic - Healing Beam Target Actions //-------------------------------------------------------------------------------------------------- -bool libGDHL_gt_HeroMedicHealingBeamLookAt_Func (bool testConds, bool runActions) { - // Variable Declarations - unit lv_medic; - unit lv_target; +bool libGDHL_gt_HeroMedicHealingBeamTargetActions_Func (bool testConds, bool runActions) { + // Variable Declarations + unit lv_medic; + unit lv_target; - // Automatic Variable Declarations - // Variable Initialization - lv_medic = EventPlayerEffectUsedUnit(c_effectUnitCaster); - lv_target = EventPlayerEffectUsedUnit(c_effectUnitTarget); + // Automatic Variable Declarations + // Variable Initialization + lv_medic = EventPlayerEffectUsedUnit(c_effectUnitCaster); + lv_target = EventPlayerEffectUsedUnit(c_effectUnitTarget); - // Actions - if (!runActions) { - return true; - } + // Actions + if (!runActions) { + return true; + } - Wait(0.125, c_timeGame); - libNtve_gf_MakeUnitLookAtUnit(lv_medic, "RobotArmsOnly", lv_target, "Ref_Center"); - while (!((UnitBehaviorCount(lv_medic, "MedicCastingHealingBeamBuff") == 0))) { - Wait(0.0625, c_timeGame); - } - libNtve_gf_SimpleLookAtStop(lv_medic, "RobotArmsOnly"); - return true; + if ((UnitFilterMatch(lv_target, UnitGetOwner(lv_target), UnitFilter((1 << c_targetFilterHeroic), 0, (1 << c_targetFilterEnemy) | (1 << c_targetFilterImmuneToFriendlyAbilities) | (1 << c_targetFilterMissile), (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterHidden - 32)))) == true)) { + libGDHL_gf_MedicUIHealingBeam(false, UnitGetOwner(lv_medic), lv_target); + } + else { + libGDHL_gf_MedicUIHealingBeam(true, UnitGetOwner(lv_medic), lv_target); + } + Wait(0.125, c_timeGame); + libNtve_gf_MakeUnitLookAtUnit(lv_medic, "RobotArmsOnly", lv_target, "Ref_Center"); + while (!((UnitBehaviorCount(lv_medic, "MedicCastingHealingBeamBuff") == 0))) { + Wait(0.0625, c_timeGame); + } + libNtve_gf_SimpleLookAtStop(lv_medic, "RobotArmsOnly"); + return true; +} + +//-------------------------------------------------------------------------------------------------- +void libGDHL_gt_HeroMedicHealingBeamTargetActions_Init () { + libGDHL_gt_HeroMedicHealingBeamTargetActions = TriggerCreate("libGDHL_gt_HeroMedicHealingBeamTargetActions_Func"); + TriggerEnable(libGDHL_gt_HeroMedicHealingBeamTargetActions, false); + TriggerAddEventPlayerEffectUsed(libGDHL_gt_HeroMedicHealingBeamTargetActions, c_playerAny, "MedicHealingBeamCreatePersistent"); +} + +//-------------------------------------------------------------------------------------------------- +// Trigger: Hero - Medic - Healing Beam UI Reset +//-------------------------------------------------------------------------------------------------- +bool libGDHL_gt_HeroMedicHealingBeamUIReset_Func (bool testConds, bool runActions) { + // Variable Declarations + unit lv_medic; + unit lv_target; + + // Automatic Variable Declarations + // Variable Initialization + lv_medic = EventPlayerEffectUsedUnit(c_effectUnitCaster); + lv_target = EventPlayerEffectUsedUnit(c_effectUnitTarget); + + // Actions + if (!runActions) { + return true; + } + + Wait(0.0625, c_timeGame); + if ((UnitBehaviorCount(lv_medic, "MedicCastingHealingBeamBuff") == 1)) { + } + else { + libGDHL_gf_MedicUIHealingBeam(true, UnitGetOwner(lv_medic), lv_target); + } + return true; } //-------------------------------------------------------------------------------------------------- -void libGDHL_gt_HeroMedicHealingBeamLookAt_Init () { - libGDHL_gt_HeroMedicHealingBeamLookAt = TriggerCreate("libGDHL_gt_HeroMedicHealingBeamLookAt_Func"); - TriggerEnable(libGDHL_gt_HeroMedicHealingBeamLookAt, false); - TriggerAddEventPlayerEffectUsed(libGDHL_gt_HeroMedicHealingBeamLookAt, c_playerAny, "MedicHealingBeamCreatePersistent"); +void libGDHL_gt_HeroMedicHealingBeamUIReset_Init () { + libGDHL_gt_HeroMedicHealingBeamUIReset = TriggerCreate("libGDHL_gt_HeroMedicHealingBeamUIReset_Func"); + TriggerEnable(libGDHL_gt_HeroMedicHealingBeamUIReset, false); + TriggerAddEventPlayerEffectUsed(libGDHL_gt_HeroMedicHealingBeamUIReset, c_playerAny, "MedicHealingBeamFinalSet"); } //-------------------------------------------------------------------------------------------------- @@ -17299,7 +17434,7 @@ bool libGDHL_gt_HeroMuradinResetFreePiercingStormbolt_Func (bool testConds, bool //-------------------------------------------------------------------------------------------------- void libGDHL_gt_HeroMuradinResetFreePiercingStormbolt_Init () { libGDHL_gt_HeroMuradinResetFreePiercingStormbolt = TriggerCreate("libGDHL_gt_HeroMuradinResetFreePiercingStormbolt_Func"); - TriggerAddEventUnitBehaviorChange(libGDHL_gt_HeroMuradinResetFreePiercingStormbolt, null, "MuradinItsHammerTimeQuestCompletionCarry", c_unitBehaviorChangeCreate); + TriggerAddEventUnitBehaviorChange(libGDHL_gt_HeroMuradinResetFreePiercingStormbolt, null, "MuradinItsHammerTimeTokenCounter", c_unitBehaviorChangeCreate); } //-------------------------------------------------------------------------------------------------- @@ -26546,6 +26681,7 @@ void libGDHL_InitTriggers () { libGDHL_gt_HeroMalfurionTwilightDreamSilenceEnd_Init(); libGDHL_gt_HeroMalfurionInnervateCDR_Init(); libGDHL_gt_HeroMalfurionTenaciousRootsProc_Init(); + libGDHL_gt_HealingBeamUIInitialize_Init(); libGDHL_gt_MedicUIInitialize_Init(); libGDHL_gt_HeroMedicStimDroneFullscreenOverlayOn_Init(); libGDHL_gt_HeroMedicStimDroneFullscreenOverlayOff_Init(); @@ -26559,7 +26695,8 @@ void libGDHL_InitTriggers () { libGDHL_gt_HeroMedicMedivacDropshipCountdownSound_Init(); libGDHL_gt_HeroMedicMedivacBeingBoarded_Init(); libGDHL_gt_HeroMedicMedivacGameOverHide_Init(); - libGDHL_gt_HeroMedicHealingBeamLookAt_Init(); + libGDHL_gt_HeroMedicHealingBeamTargetActions_Init(); + libGDHL_gt_HeroMedicHealingBeamUIReset_Init(); libGDHL_gt_HeroMedicHearthCleanup_Init(); libGDHL_gt_HeroMedicHealingBeamAllyRangeVisibility_Init(); libGDHL_gt_HeroMedicSafeguardVanadiumPlatingTalentProc_Init(); diff --git a/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameDataHelperLib_h.galaxy b/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameDataHelperLib_h.galaxy index 2284747..38b1958 100644 --- a/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameDataHelperLib_h.galaxy +++ b/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameDataHelperLib_h.galaxy @@ -185,6 +185,11 @@ struct libGDHL_gs_LostVikingsUI { int lv_allDeathStatusFrame; }; +struct libGDHL_gs_HealingBeamUI { + int lv_healingBeamTargetDisplayName; + int lv_healingBeamTargetPortrait; +}; + struct libGDHL_gs_MedicUI { int lv_mainPanel; int lv_medivacAlert; @@ -313,6 +318,7 @@ libGDHL_gs_LostVikingsUI libGDHL_gv_lostVikingsUI; int libGDHL_gv_heroMalfurionTriggerRegistrationVariable; fixed libGDHL_gv_bALHeroMalfurionDruidsGiftManaCostReduction; int libGDHL_gv_heroMedicTriggerRegistrationVariable; +libGDHL_gs_HealingBeamUI libGDHL_gv_healingBeamUI; libGDHL_gs_MedicUI libGDHL_gv_medicUI; int[libCore_gv_bALMaxPlayers + 1] libGDHL_gv_medivacTransmissionPortraitOverride; int[libCore_gv_bALMaxPlayers + 1] libGDHL_gv_medicSafeguardCasterOwner; @@ -498,6 +504,9 @@ void libGDHL_gf_HeroMalfurionIncrementHeroCountFunction (); void libGDHL_gf_HeroMalfurionDecrementHeroCountFunction (); void libGDHL_gf_HeroMedicIncrementHeroCountFunction (); void libGDHL_gf_HeroMedicDecrementHeroCountFunction (); +string libGDHL_gf_HealingBeamGetPortraitPathforUnit (unit lp_unit); +void libGDHL_gf_MedicUIHealingBeam (bool lp_reset, int lp_medicPlayer, unit lp_healingBeamTarget); +text libGDHL_gf_MedicUIUnitDisplayName (unit lp_unit); void libGDHL_gf_UIHeroSpecificStatusFrameShowHideMedivacUI (bool lp_showHide, int lp_player); void libGDHL_gf_HeroMonkIncrementHeroCountFunction (); void libGDHL_gf_HeroMonkDecrementHeroCountFunction (); @@ -798,6 +807,7 @@ trigger libGDHL_gt_HeroMalfurionTwilightDreamSilenceTarget; trigger libGDHL_gt_HeroMalfurionTwilightDreamSilenceEnd; trigger libGDHL_gt_HeroMalfurionInnervateCDR; trigger libGDHL_gt_HeroMalfurionTenaciousRootsProc; +trigger libGDHL_gt_HealingBeamUIInitialize; trigger libGDHL_gt_MedicUIInitialize; trigger libGDHL_gt_HeroMedicStimDroneFullscreenOverlayOn; trigger libGDHL_gt_HeroMedicStimDroneFullscreenOverlayOff; @@ -811,7 +821,8 @@ trigger libGDHL_gt_HeroMedicMedivacDropshipOverlay; trigger libGDHL_gt_HeroMedicMedivacDropshipCountdownSound; trigger libGDHL_gt_HeroMedicMedivacBeingBoarded; trigger libGDHL_gt_HeroMedicMedivacGameOverHide; -trigger libGDHL_gt_HeroMedicHealingBeamLookAt; +trigger libGDHL_gt_HeroMedicHealingBeamTargetActions; +trigger libGDHL_gt_HeroMedicHealingBeamUIReset; trigger libGDHL_gt_HeroMedicHearthCleanup; trigger libGDHL_gt_HeroMedicHealingBeamAllyRangeVisibility; trigger libGDHL_gt_HeroMedicSafeguardVanadiumPlatingTalentProc; diff --git a/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameLib.galaxy b/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameLib.galaxy index 3c4b678..e454a2e 100644 --- a/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameLib.galaxy +++ b/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameLib.galaxy @@ -14334,16 +14334,30 @@ void libGame_gf_HeroSpecificStatTrackerAbsorbed (fixed lp_preventedValue, string } if ((UnitGetType(libGame_gv_players[lp_casterPlayer].lv_heroUnit) == "HeroMedic")) { if ((lp_behavior == "MedicMedivacDropshipSafeZoneTalentProtectedBuff")) { - // lv_primaryScoreString = "TalentTwenty"; if ((lv_externalPlayer >= 1) && (lv_externalPlayer <= libCore_gv_bALMaxPlayers)) { + lv_primaryScoreString = "TalentSixteen"; + } + else { lv_primaryScoreString = "TalentTwenty"; } + } + if ((lp_behavior == "MedicSafeguardHospiceCareTalentUnkillable")) { + if ((lv_externalPlayer >= 1) && (lv_externalPlayer <= libCore_gv_bALMaxPlayers)) { + lv_primaryScoreString = "TalentSixteen"; + } else { lv_primaryScoreString = "TalentSixteen"; } + // lv_secondaryScoreString = "TalentTwenty"; + // lv_secondaryScoreOverride = 1.0; } if ((lp_behavior == "MedicDisplacementGrenadeBlastShieldTalentShield")) { - lv_primaryScoreString = "TalentSeven"; + if ((lv_externalPlayer >= 1) && (lv_externalPlayer <= libCore_gv_bALMaxPlayers)) { + lv_primaryScoreString = "TalentSeven"; + } + else { + lv_primaryScoreString = "TalentTen"; + } } } if ((UnitGetType(libGame_gv_players[lp_casterPlayer].lv_heroUnit) == "HeroArthas")) { @@ -14387,7 +14401,12 @@ void libGame_gf_HeroSpecificStatTrackerAbsorbed (fixed lp_preventedValue, string lv_primaryScoreString = "TalentFour"; } if ((lp_behavior == "ArtanisShieldOverloadImprovedNewShieldSurge")) { - lv_primaryScoreString = "TalentFour"; + if ((lv_externalPlayer >= 1) && (lv_externalPlayer <= libCore_gv_bALMaxPlayers)) { + lv_primaryScoreString = "TalentOne"; + } + else { + lv_primaryScoreString = "TalentFour"; + } } if ((lp_behavior == "ArtanisShieldOverload")) { // lv_primaryScoreString = "BaselineOne"; @@ -15541,7 +15560,7 @@ void libGame_gf_HeroSpecificStatTrackerHealed (fixed lp_healedValue, string lp_h } else { UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("cannot determine who gave Ancient Blessings, giving up. soz")); - return; + lv_primaryScoreString = "Discard"; } } } @@ -16174,9 +16193,15 @@ void libGame_gf_HeroSpecificStatTrackerHealed (fixed lp_healedValue, string lp_h else { lv_primaryScoreString = "BaselineThree"; } + if (PlayerHasTalent(lp_casterPlayer, "MonkTranscendence") == false) { + lv_primaryScoreString = "ScoreTwelve"; + } } if ((lp_healEffect == "MonkComboWeaponInsightRegenMana")) { lv_primaryScoreString = "BaselineThree"; + if (PlayerHasTalent(lp_casterPlayer, "MonkInsight") == false) { + lv_primaryScoreString = "ScoreTen"; + } } if ((lp_healEffect == "MonkDivinePalmCreateHealer")) { // lv_primaryScoreString = "TalentTen"; @@ -16695,17 +16720,23 @@ void libGame_gf_HeroSpecificStatTrackerHealed (fixed lp_healedValue, string lp_h } } if ((UnitGetType(libGame_gv_players[lp_casterPlayer].lv_heroUnit) == "HeroDehaka")) { - if ((lp_healEffect == "DehakaAdaptationCreateHealer")) { - lv_primaryScoreString = "TalentTen"; - } if ((lp_healEffect == "DehakaEssenceCollectionCreateHealer")) { - lv_primaryScoreString = "BaselineOne"; + lv_primaryScoreString = "ScoreEleven"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "SupportFifteen"; } if ((lp_healEffect == "DehakaEssenceCollectionCatalogCreateHealer")) { - lv_primaryScoreString = "BaselineOne"; + lv_primaryScoreString = "ScoreEleven"; } if ((lp_healEffect == "DehakaAdaptationDummyTrackerCreateHealer")) { - lv_primaryScoreString = "TalentTen"; + lv_primaryScoreString = "BaselineTwo"; + } + if ((lp_healEffect == "DehakaAdaptationCreateHealer")) { + lv_primaryScoreString = "BaselineTwo"; + if ((UnitIsAlive(lp_casterUnit) == true) && (UnitHasBehavior2(lp_casterUnit, "DehakaAdaptationHealTrackerBehavior") == false)) { + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "AccuracyThree"; + } } } if ((UnitGetType(libGame_gv_players[lp_casterPlayer].lv_heroUnit) == "HeroDiablo")) { @@ -17182,6 +17213,9 @@ void libGame_gf_HeroSpecificStatTrackerHealed (fixed lp_healedValue, string lp_h if ((lp_healEffect == "MedicCellularReactorCreateHealer")) { lv_primaryScoreString = "TalentSeven"; } + if ((lp_healEffect == "MedicSafeguardCellularReactorTalentModifyMana")) { + lv_primaryScoreString = "TalentTen"; + } if ((lp_healEffect == "MedicDisplacementGrenadeBlastShieldTalentModifyMana")) { lv_primaryScoreString = "TalentTen"; } @@ -17197,12 +17231,23 @@ void libGame_gf_HeroSpecificStatTrackerHealed (fixed lp_healedValue, string lp_h if ((lp_healEffect == "MedicCaduceusReactorCreateEnergyHealer")) { lv_primaryScoreString = "BaselineThree"; } - if ((lp_healEffect == "MedicSafeguardLifeSupportTalentModifyMana")) { + // if ((lp_healEffect == "MedicSafeguardLifeSupportTalentModifyMana")) { + // lv_primaryScoreString = "TalentFour"; + // } + if ((lp_healEffect == "MedicHeroWeaponCaduceusFeedbackTalentHeroModifyMana")) { lv_primaryScoreString = "TalentFour"; } - if ((lp_healEffect == "MedicHeroWeaponCaduceusFeedbackTalentHeroModifyMana")) { + if ((lp_healEffect == "MedicDisplacementGrenadeClearTalentModifyMana")) { lv_primaryScoreString = "TalentFour"; } + if ((lp_healEffect == "MedicSafeguardHospiceCareTalentProcHeal")) { + lv_primaryScoreString = "TalentTwenty"; + lv_secondaryScoreString = "SupportEleven"; + lv_secondaryScoreOverride = 1.0; + } + if ((lp_healEffect == "MedicHealingBeamExtendedCareTalentCreateHealer")) { + lv_primaryScoreString = "ScoreEleven"; + } } if ((UnitGetType(libGame_gv_players[lp_casterPlayer].lv_heroUnit) == "HeroDryad")) { if ((lp_healEffect == "DryadNaturesToxinSiphoningToxinMasteryBonusCreateHealer")) { @@ -17344,18 +17389,13 @@ void libGame_gf_HeroSpecificStatTrackerHealed (fixed lp_healedValue, string lp_h lv_primaryScoreString = "BaselineTwo"; } } - if ((lp_healEffect == "TyrandeHuntersMarkMarkofMendingTalentHeal")) { - if ((UnitGetOwner(lp_targetUnit) != lp_casterPlayer)) { - lv_primaryScoreString = "TalentOne"; - } - else { - lv_primaryScoreString = "TalentFour"; - } - } if ((lp_healEffect == "TyrandeElunesChosenCreateHealer")) { lv_primaryScoreString = "TalentOne"; } - if ((lp_healEffect == "TyrandeHuntersMarkMarkofMendingTalentSelfHeal")) { + if ((lp_healEffect == "TyrandeHuntersMarkNormalHeal") || (lp_healEffect == "TyrandeHuntersMarkMarkedHeal")) { + lv_primaryScoreString = "BaselineThree"; + } + if ((lp_healEffect == "TyrandeHuntersMarkMarkOfMendingMarkedHeal")) { if ((UnitGetOwner(lp_targetUnit) != lp_casterPlayer)) { lv_primaryScoreString = "TalentOne"; } @@ -17363,6 +17403,22 @@ void libGame_gf_HeroSpecificStatTrackerHealed (fixed lp_healedValue, string lp_h lv_primaryScoreString = "TalentFour"; } } + // if ((lp_healEffect == "TyrandeHuntersMarkMarkofMendingTalentHeal")) { + // if ((UnitGetOwner(lp_targetUnit) != lp_casterPlayer)) { + // lv_primaryScoreString = "TalentOne"; + // } + // else { + // lv_primaryScoreString = "TalentFour"; + // } + // } + // if ((lp_healEffect == "TyrandeHuntersMarkMarkofMendingTalentSelfHeal")) { + // if ((UnitGetOwner(lp_targetUnit) != lp_casterPlayer)) { + // lv_primaryScoreString = "TalentOne"; + // } + // else { + // lv_primaryScoreString = "TalentFour"; + // } + // } if ((lp_healEffect == "TyrandeShadowstalkCreateHealer")) { // lv_primaryScoreString = "TalentTen"; if ((UnitGetOwner(lp_targetUnit) != lp_casterPlayer)) { @@ -19338,7 +19394,7 @@ fixed libGame_gv_GetHealDealtAsFixed (unit lp_contextUnit) { } -fixed libGame_gv_DamageDealtFractionBasic (unit lp_contextUnit, string lp_damageEffect, bool lp_cap) { +fixed libGame_gv_DamageDealtFractionBasic (unit lp_contextUnit, string lp_damageEffect, bool lp_cap, bool lp_includeAlreadyTracked) { int lv_casterPlayer; unit lv_unit; string lv_behavior; @@ -19357,18 +19413,6 @@ fixed libGame_gv_DamageDealtFractionBasic (unit lp_contextUnit, string lp_damage lv_unit = libGame_gv_players[lv_casterPlayer].lv_heroUnit; } - // if ((UnitHasBehavior2(lv_unit, "NexusBladesCarryBehavior") == true)) { - // lv_behavior = "NexusBladesCarryBehavior"; - // lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)) - // } - // if ((UnitHasBehavior2(lv_unit, "TalentBucketFollowThroughCooldown") == true)) { - // lv_behavior = "TalentBucketFollowThrough"; - // lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, "TalentBucketFollowThroughCooldown", c_effectPlayerCaster, 0)) - // } - // if ((UnitHasBehavior2(lv_unit, "HeroGenericExecutioner30DamageBuff") == true)) { - // lv_behavior = "HeroGenericExecutioner30DamageBuff"; - // lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)) - // } if ((UnitHasBehavior2(lv_unit, "TalentBucketShrinkRayDamageReduction") == true)) { lv_behavior = "TalentBucketShrinkRayDamageReduction"; lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)); @@ -19485,10 +19529,6 @@ fixed libGame_gv_DamageDealtFractionBasic (unit lp_contextUnit, string lp_damage lv_behavior = "TyraelArchangelsWrathDebuffEnemyBehaviorAfter"; lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)); } - if ((UnitHasBehavior2(lv_unit, "AnduinChastisePiercingLightTalentCarry") == true)) { - lv_behavior = "AnduinChastisePiercingLightTalentCarry"; - lv_netDamageDealtFraction += (UnitGetTokenCount(lv_unit, "AnduinChastisePiercingLightTalentTokenCounter") * CatalogFieldValueGetAsFixed(c_gameCatalogAccumulator, "AnduinPiercingLightTalentDamageAccumulator", "Scale", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0))); - } if ((UnitHasBehavior2(lv_unit, "StitchesDevourDigestiveJuicesTalentDebuff") == true)) { lv_behavior = "StitchesDevourDigestiveJuicesTalentDebuff"; lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)); @@ -19497,6 +19537,30 @@ fixed libGame_gv_DamageDealtFractionBasic (unit lp_contextUnit, string lp_damage lv_behavior = "CrusaderCondemnShrinkingVacuumTalentDamageReduction"; lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)); } + if ((UnitHasBehavior2(lv_unit, "NexusBladesCarryBehavior") == true) && (lp_includeAlreadyTracked == true)) { + lv_behavior = "NexusBladesCarryBehavior"; + lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)); + } + if ((UnitHasBehavior2(lv_unit, "TalentBucketFollowThroughCooldown") == true) && (lp_includeAlreadyTracked == true)) { + lv_behavior = "TalentBucketFollowThrough"; + lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, "TalentBucketFollowThroughCooldown", c_effectPlayerCaster, 0)); + } + if ((UnitHasBehavior2(lv_unit, "HeroGenericExecutioner30DamageBuff") == true) && (lp_includeAlreadyTracked == true)) { + lv_behavior = "HeroGenericExecutioner30DamageBuff"; + lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)); + } + if ((UnitHasBehavior2(lv_unit, "DVaBoostersInForTheKillTalentBuff") == true) && (lp_includeAlreadyTracked == true)) { + lv_behavior = "DVaBoostersInForTheKillTalentBuff"; + lv_netDamageDealtFraction += (UnitBehaviorCount(lv_unit, lv_behavior) * CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0))); + } + if ((UnitHasBehavior2(lv_unit, "BarbarianWrathoftheBerserkerBase") == true) && (lp_includeAlreadyTracked == true)) { + lv_behavior = "BarbarianWrathoftheBerserkerBase"; + lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)); + } + if ((UnitHasBehavior2(lv_unit, "ArtanisFinalCutBuff") == true) && (lp_includeAlreadyTracked == true)) { + lv_behavior = "ArtanisFinalCutBuff"; + lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)); + } if ((lv_netDamageDealtFraction <= 0.25) && (lp_cap == true)) { lv_netDamageDealtFraction = 0.25; @@ -19505,7 +19569,7 @@ fixed libGame_gv_DamageDealtFractionBasic (unit lp_contextUnit, string lp_damage return lv_netDamageDealtFraction; } -fixed libGame_gv_DamageDealtFractionAbility (unit lp_contextUnit, string lp_damageEffect, bool lp_cap) { +fixed libGame_gv_DamageDealtFractionAbility (unit lp_contextUnit, string lp_damageEffect, bool lp_cap, bool lp_includeAlreadyTracked) { int lv_casterPlayer; unit lv_unit; string lv_behavior; @@ -19524,18 +19588,6 @@ fixed libGame_gv_DamageDealtFractionAbility (unit lp_contextUnit, string lp_dama lv_unit = libGame_gv_players[lv_casterPlayer].lv_heroUnit; } - // if ((UnitHasBehavior2(lv_unit, "NexusBladesCarryBehavior") == true)) { - // lv_behavior = "NexusBladesCarryBehavior"; - // lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)) - // } - // if ((UnitHasBehavior2(lv_unit, "TalentBucketFollowThroughCooldown") == true)) { - // lv_behavior = "TalentBucketFollowThrough"; - // lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, "TalentBucketFollowThroughCooldown", c_effectPlayerCaster, 0)) - // } - // if ((UnitHasBehavior2(lv_unit, "HeroGenericExecutioner30DamageBuff") == true)) { - // lv_behavior = "HeroGenericExecutioner30DamageBuff"; - // lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)) - // } if ((UnitHasBehavior2(lv_unit, "TalentBucketShrinkRayDamageReduction") == true)) { lv_behavior = "TalentBucketShrinkRayDamageReduction"; lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeAbility) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)); @@ -19712,6 +19764,27 @@ fixed libGame_gv_DamageDealtFractionAbility (unit lp_contextUnit, string lp_dama lv_behavior = "CrusaderCondemnShrinkingVacuumTalentDamageReduction"; lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeAbility) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)); } + if ((UnitHasBehavior2(lv_unit, "SylvanasMightOfTheBansheeQueenWitheringFireAttackSpeedAndAbilityPowerBuff") == true)) { + lv_behavior = "SylvanasMightOfTheBansheeQueenWitheringFireAttackSpeedAndAbilityPowerBuff"; + lv_netDamageDealtFraction += (UnitBehaviorCount(lv_unit, lv_behavior) * CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeAbility) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0))); + } + if ((UnitHasBehavior2(lv_unit, "HanzoTheDragonHungers") == true)) { + lv_behavior = "HanzoTheDragonHungers"; + lv_netDamageDealtFraction += (UnitBehaviorCount(lv_unit, lv_behavior) * CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeAbility) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0))); + } + if ((UnitHasBehavior2(lv_unit, "WizardPowerHungryBuff") == true) && (lp_includeAlreadyTracked == true)) { + lv_behavior = "WizardPowerHungryBuff"; + lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeAbility) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)); + } + if ((UnitHasBehavior2(lv_unit, "WizardGlassCannon") == true) && (lp_includeAlreadyTracked == true)) { + lv_behavior = "WizardGlassCannon"; + lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeAbility) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)); + } + if ((UnitHasBehavior2(lv_unit, "BarbarianWrathoftheBerserkerBase") == true) && (lp_includeAlreadyTracked == true)) { + lv_behavior = "BarbarianWrathoftheBerserkerBase"; + lv_netDamageDealtFraction += CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, lv_behavior, "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeAbility) + "]", UnitBehaviorEffectPlayer(lv_unit, lv_behavior, c_effectPlayerCaster, 0)); + } + if ((lv_netDamageDealtFraction <= 0.25) && (lp_cap == true)) { lv_netDamageDealtFraction = 0.25; @@ -19767,6 +19840,14 @@ void libGame_gv_TallyDamageDealtFraction (string lp_damageEffect, fixed lp_damag if (lp_damageEffect == "DemonHunterMultishot") { lv_baseDamageValue = CatalogFieldValueGetAsFixed(c_gameCatalogEffect, lp_damageEffect, "AmountArray[Quest]", lp_casterPlayer); } + if (lp_damageEffect == "DVaMechSelfDestructDetonationSearchDamage") { + lv_baseDamageValue = (CatalogFieldValueGetAsFixed(c_gameCatalogEffect, lp_damageEffect, "Amount", lp_casterPlayer) - CatalogFieldValueGetAsFixed(c_gameCatalogAccumulator, "DVaSelfDestructDistanceAccumulator", "MinAccumulation", lp_casterPlayer)); + } + if (lp_damageEffect == "JunkratRIPTireDamage") { + lv_baseDamageValue = (CatalogFieldValueGetAsFixed(c_gameCatalogEffect, lp_damageEffect, "Amount", lp_casterPlayer) - CatalogFieldValueGetAsFixed(c_gameCatalogAccumulator, "JunkratRIPTireDistanceAccumulator", "MinAccumulation", lp_casterPlayer)); + } + + if (UnitTypeTestAttribute(lv_targetUnitType, c_unitAttributeCreep) == true) { lv_baseDamageModifier = (lv_baseDamageModifier + CatalogFieldValueGetAsFixed(c_gameCatalogEffect, lp_damageEffect, "AttributeFactor[" + IntToString(c_unitAttributeCreep) + "]", lp_casterPlayer)); } @@ -19995,6 +20076,88 @@ void libGame_gv_TallyDamageDealtFraction (string lp_damageEffect, fixed lp_damag // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("damage modified by: ") + FixedToText(lv_scoreResult, 5))); } +void libGame_gv_TallyArmorModified (string lp_damageEffect, string lp_attackerType, fixed lp_damageValue, fixed lp_damageMitigated, fixed lp_damageAttempted, int lp_attackedPlayer, int lp_attackingPlayer, unit lp_attackedUnit) { + fixed lv_previousArmor; + fixed lv_currentArmor; + fixed lv_actualArmor; + fixed lv_previousNegativeArmorAccuracy; + fixed lv_previousPositiveArmorAccuracy; + fixed lv_currentNegativeArmorAccuracy; + fixed lv_currentPositiveArmorAccuracy; + fixed lv_actualNegativeArmorAccuracy; + fixed lv_actualPositiveArmorAccuracy; + int lv_damageType; + int lv_attackerType; + + + if ((CatalogFieldValueGet(c_gameCatalogEffect, lp_damageEffect, "Kind", EventUnitDamageSourcePlayer()) == "Basic")) { + lv_damageType = c_unitDamageTypeBasic; + } + else { + lv_damageType = c_unitDamageTypeAbility; + } + + if (CatalogFieldValueGet(c_gameCatalogUnit, lp_attackerType, "UnitDamageType", lp_attackingPlayer) == "Structure") { + lv_attackerType = c_unitDamageTypeStructure; + } + else if (CatalogFieldValueGet(c_gameCatalogUnit, lp_attackerType, "UnitDamageType", lp_attackingPlayer) == "Hero") { + lv_attackerType = c_unitDamageTypeHero; + } + else if (CatalogFieldValueGet(c_gameCatalogUnit, lp_attackerType, "UnitDamageType", lp_attackingPlayer) == "Merc") { + lv_attackerType = c_unitDamageTypeMerc; + } + else if (CatalogFieldValueGet(c_gameCatalogUnit, lp_attackerType, "UnitDamageType", lp_attackingPlayer) == "Monster") { + lv_attackerType = c_unitDamageTypeMonster; + } + else if (CatalogFieldValueGet(c_gameCatalogUnit, lp_attackerType, "UnitDamageType", lp_attackingPlayer) == "Summon") { + lv_attackerType = c_unitDamageTypeSummon; + } + else if (CatalogFieldValueGet(c_gameCatalogUnit, lp_attackerType, "UnitDamageType", lp_attackingPlayer) == "Minion") { + lv_attackerType = c_unitDamageTypeMinion; + } + + lv_previousArmor = libGame_gv_timeTravelValues[lp_attackedPlayer][libGame_gv_timeTravelPreviousLoop].lv_armor[libGame_gv_timeTravelActiveUnit[lp_attackedPlayer]][lv_attackerType][lv_damageType]; + lv_currentArmor = libGame_gv_timeTravelValues[lp_attackedPlayer][libGame_gv_timeTravelActiveLoop].lv_armor[libGame_gv_timeTravelActiveUnit[lp_attackedPlayer]][lv_attackerType][lv_damageType]; + lv_actualArmor = UnitGetArmorValue(lp_attackedUnit, lv_attackerType, lv_damageType); + + lv_previousNegativeArmorAccuracy = (lv_previousArmor / (0 - (100 * (1.0 - ((lp_damageAttempted) / (lp_damageAttempted - lp_damageMitigated)))))); + if (lv_previousNegativeArmorAccuracy < 0.0) { + lv_previousNegativeArmorAccuracy = AbsF(lv_previousNegativeArmorAccuracy); + } + lv_previousPositiveArmorAccuracy = (lv_previousArmor / (100.0 * (lp_damageMitigated / (lp_damageAttempted + lp_damageMitigated)))); + if (lv_previousPositiveArmorAccuracy < 0.0) { + lv_previousPositiveArmorAccuracy = AbsF(lv_previousPositiveArmorAccuracy); + } + lv_currentNegativeArmorAccuracy = (lv_currentArmor / (0 - (100 * (1.0 - ((lp_damageAttempted) / (lp_damageAttempted - lp_damageMitigated)))))); + if (lv_currentNegativeArmorAccuracy < 0.0) { + lv_currentNegativeArmorAccuracy = AbsF(lv_currentNegativeArmorAccuracy); + } + lv_currentPositiveArmorAccuracy = (lv_currentArmor / (100.0 * (lp_damageMitigated / (lp_damageAttempted + lp_damageMitigated)))); + if (lv_currentPositiveArmorAccuracy < 0.0) { + lv_currentPositiveArmorAccuracy = AbsF(lv_currentPositiveArmorAccuracy); + } + lv_actualNegativeArmorAccuracy = (lv_actualArmor / (0 - (100 * (1.0 - ((lp_damageAttempted) / (lp_damageAttempted - lp_damageMitigated)))))); + if (lv_actualNegativeArmorAccuracy < 0.0) { + lv_actualNegativeArmorAccuracy = AbsF(lv_actualNegativeArmorAccuracy); + } + lv_actualPositiveArmorAccuracy = (lv_actualArmor / (100.0 * (lp_damageMitigated / (lp_damageAttempted + lp_damageMitigated)))); + if (lv_actualPositiveArmorAccuracy < 0.0) { + lv_actualPositiveArmorAccuracy = AbsF(lv_actualPositiveArmorAccuracy); + } + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Damage Tried: ") + FixedToText(lp_damageAttempted, 2) + StringToText(" Damage Mitigated: ") + FixedToText(lp_damageMitigated, 2))); + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Last Loop Armor: ") + FixedToText(lv_previousArmor, 2) + StringToText(" This Loop Armor: ") + FixedToText(lv_currentArmor, 2))); + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Unit Armor: ") + FixedToText(lv_actualArmor, 2))); + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Last Loop Accuracy(Neg): ") + FixedToText(lv_previousNegativeArmorAccuracy, 5))); + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Last Loop Accuracy(Pos): ") + FixedToText(lv_previousPositiveArmorAccuracy, 5))); + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("This Loop Accuracy(Neg): ") + FixedToText(lv_currentNegativeArmorAccuracy, 5))); + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("This Loop Accuracy(Pos): ") + FixedToText(lv_currentPositiveArmorAccuracy, 5))); + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Unit Loop Accuracy(Neg): ") + FixedToText(lv_actualNegativeArmorAccuracy, 5))); + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Unit Loop Accuracy(Pos): ") + FixedToText(lv_actualPositiveArmorAccuracy, 5))); + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Last Loop Time: ") + FixedToText(libGame_gv_timeTravelValues[lp_attackedPlayer][libGame_gv_timeTravelPreviousLoop].lv_timeStored, 5))); + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("This Loop Time: ") + FixedToText(libGame_gv_timeTravelValues[lp_attackedPlayer][libGame_gv_timeTravelActiveLoop].lv_timeStored, 5))); + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Actual Time: ") + FixedToText(GameGetMissionTime(), 5))); + +} void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_damageValue, fixed lp_damageAttempted, unit lp_targetUnit, unit lp_casterUnit, int lp_casterPlayer, int lp_targetPlayer) { @@ -20324,43 +20487,45 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((lp_damageEffect == "CursedHollowCoreCurseDamage")) { lv_primaryScoreString = "Discard"; } - if ((lp_damageEffect == "FirebatBunkerDropFlamethrowerDamage")) { + if ((lp_damageEffect == "FirebatBunkerDropFlamethrowerDamage") || (lp_damageEffect == "FirebatOilSpillIgnitedDamage")) { lv_primaryScoreString = "Discard"; // This could also be done through a separate function, but this works. Because it's using libCore_gv_filtersHeroicAllyandnotHallucination, don't need to worry about that damnable slug lv_secondaryPlayerOverride = UnitGetOwner(UnitGroupUnit(libNtve_gf_UnitsInRegionWithAllianceToPlayerMatchingCondition("HeroFirebat", "", "", lv_casterPlayer, c_unitAllianceAlly, RegionEntireMap(), libCore_gv_filtersHeroicAllyandnotHallucination, 1), 1)); - if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 1)) { - lv_secondaryScoreString = "DamageToOne"; - } - else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 2)) { - lv_secondaryScoreString = "DamageToTwo"; - } - else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 3)) { - lv_secondaryScoreString = "DamageToThree"; - } - else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 4)) { - lv_secondaryScoreString = "DamageToFour"; - } - else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 5)) { - lv_secondaryScoreString = "DamageToFive"; - } - else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 6)) { - lv_secondaryScoreString = "DamageToSix"; - } - else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 7)) { - lv_secondaryScoreString = "DamageToSeven"; - } - else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 8)) { - lv_secondaryScoreString = "DamageToEight"; - } - else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 9)) { - lv_secondaryScoreString = "DamageToNine"; - } - else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 10)) { - lv_secondaryScoreString = "DamageToTen"; - } - else { - // This probably doesn't need to be here becauase the score is only declared when the caster is between 1 and 10, but it's here anyway. Reason being that if the bunker expires or is destroyed, the caster player becomes player 16, so we can't determine who the caster was, so don't bother. - lv_secondaryScoreString = "Discard"; + if (PlayerHasTalent(lv_secondaryPlayerOverride, "FirebatHeroicAbilityBunkerDrop") == true) { + if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 1)) { + lv_secondaryScoreString = "DamageToOne"; + } + else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 2)) { + lv_secondaryScoreString = "DamageToTwo"; + } + else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 3)) { + lv_secondaryScoreString = "DamageToThree"; + } + else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 4)) { + lv_secondaryScoreString = "DamageToFour"; + } + else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 5)) { + lv_secondaryScoreString = "DamageToFive"; + } + else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 6)) { + lv_secondaryScoreString = "DamageToSix"; + } + else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 7)) { + lv_secondaryScoreString = "DamageToSeven"; + } + else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 8)) { + lv_secondaryScoreString = "DamageToEight"; + } + else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 9)) { + lv_secondaryScoreString = "DamageToNine"; + } + else if ((libGame_gv_players[lv_casterPlayer].lv_rosterSlot == 10)) { + lv_secondaryScoreString = "DamageToTen"; + } + else { + // This probably doesn't need to be here becauase the score is only declared when the caster is between 1 and 10, but it's here anyway. Reason being that if the bunker expires or is destroyed, the caster player becomes player 16, so we can't determine who the caster was, so don't bother. + lv_secondaryScoreString = "Discard"; + } } // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Flame Debug: ") + StringToText(" Caster#: ") + IntToText(lv_casterPlayer) + StringToText(" Bunker Owner: ") + IntToText(UnitGetOwner(UnitGroupUnit(libNtve_gf_UnitsInRegionWithAllianceToPlayerMatchingCondition("HeroFirebat", "", "", lv_casterPlayer, c_unitAllianceAlly, RegionEntireMap(), libCore_gv_filtersHeroicAllyandnotHallucination, 1), 1))))); } @@ -21569,7 +21734,7 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreOne"; } - else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeCreep) == true)) { + else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeCreep) == true) && (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMapCreature) == false)) { lv_primaryScoreString = "ScoreTwo"; } else { @@ -21645,7 +21810,7 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeStructure) == true)) { lv_primaryScoreString = "ScoreNine"; } - else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeCreep) == true)) { + else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeCreep) == true) && (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMapCreature) == false)) { lv_primaryScoreString = "ScoreTen"; } else { @@ -22933,13 +23098,13 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ } if (libCore_gf_IsAbilityOnCooldown(lp_casterUnit, "CrusaderCondemn") == true) { // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Condemn is on cooldown: ") + libNtve_gf_ConvertBooleanToText(libCore_gf_IsAbilityOnCooldown(lp_casterUnit, "CrusaderCondemn")))); - lv_tertiaryScoreOverride = 1.0; - lv_tertiaryScoreString = "SupportEleven"; + lv_quaternaryScoreOverride = 1.0; + lv_quaternaryScoreString = "SupportEleven"; } if (UnitAbilityChargeInfo(lp_casterUnit, AbilityCommand("CrusaderShieldGlare", 0), c_unitAbilChargeCountLeft) != UnitAbilityChargeInfo(lp_casterUnit, AbilityCommand("CrusaderShieldGlare", 0), c_unitAbilChargeCountMax)) { // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Shield Glare Charges: ") + FixedToText(UnitAbilityChargeInfo(lp_casterUnit, AbilityCommand("CrusaderShieldGlare", 0), c_unitAbilChargeCountLeft), 1))); - lv_tertiaryScoreOverride = 1.0; - lv_tertiaryScoreString = "SupportTwelve"; + lv_quinaryScoreOverride = 1.0; + lv_quinaryScoreString = "SupportTwelve"; } } } @@ -23685,6 +23850,11 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((UnitBehaviorCount(lp_casterUnit, "OrpheaEldritchConduit") == 0)) { libGame_gv_HeroSpecificStoredValue5[lv_casterPlayer] = 0.0; } + if (libGame_gv_HeroSpecificStoredValue8[lv_casterPlayer] != GameGetMissionTime()) { + lv_tertiaryScoreOverride = 1.0; + lv_tertiaryScoreString = "AccuracyEight"; + } + libGame_gv_HeroSpecificStoredValue8[lv_casterPlayer] = GameGetMissionTime(); } else { lv_primaryScoreString = "BaselineOne"; @@ -23707,6 +23877,11 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((UnitBehaviorCount(lp_casterUnit, "OrpheaEldritchConduit") == 0)) { libGame_gv_HeroSpecificStoredValue5[lv_casterPlayer] = 0.0; } + if (libGame_gv_HeroSpecificStoredValue8[lv_casterPlayer] != GameGetMissionTime()) { + lv_tertiaryScoreOverride = 1.0; + lv_tertiaryScoreString = "AccuracyEight"; + } + libGame_gv_HeroSpecificStoredValue8[lv_casterPlayer] = GameGetMissionTime(); } else { lv_primaryScoreString = "BaselineOne"; @@ -23742,6 +23917,13 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((UnitHasBehavior2(lp_targetUnit, "OrpheaLurkingTerrorSlow") == true)) { lv_secondaryScoreString = "ScoreEleven"; } + lv_quaternaryScoreOverride = 1.0; + lv_quaternaryScoreString = "AccuracyNine"; + if (libGame_gv_HeroSpecificStoredValue9[lv_casterPlayer] != GameGetMissionTime()) { + lv_tertiaryScoreOverride = 1.0; + lv_tertiaryScoreString = "AccuracyTen"; + } + libGame_gv_HeroSpecificStoredValue9[lv_casterPlayer] = GameGetMissionTime(); } else { lv_primaryScoreString = "BaselineTwo"; @@ -23784,6 +23966,11 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((UnitBehaviorCount(lp_casterUnit, "OrpheaEldritchConduit") == 0)) { libGame_gv_HeroSpecificStoredValue5[lv_casterPlayer] = 0.0; } + if (libGame_gv_HeroSpecificStoredValue10[lv_casterPlayer] != GameGetMissionTime()) { + lv_quaternaryScoreOverride = 1.0; + lv_quaternaryScoreString = "AccuracyEleven"; + } + libGame_gv_HeroSpecificStoredValue10[lv_casterPlayer] = GameGetMissionTime(); } else { lv_primaryScoreString = "BaselineThree"; @@ -23858,6 +24045,11 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((PlayerHasTalent(lv_casterPlayer, "OrpheaMonsterWithin"))) { libGame_gv_HeroSpecificStoredValue3[lv_casterPlayer] = UnitGetTokenCount(lp_casterUnit, "OrpheaOverflowingChaosToken"); } + if (libGame_gv_HeroSpecificStoredValue7[lv_casterPlayer] != GameGetMissionTime()) { + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "AccuracyTwelve"; + } + libGame_gv_HeroSpecificStoredValue7[lv_casterPlayer] = GameGetMissionTime(); } else { lv_primaryScoreString = "TalentOne"; @@ -25010,25 +25202,50 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ } } if ((UnitGetType(libGame_gv_players[lv_casterPlayer].lv_heroUnit) == "HeroArtanis")) { - if ((lp_damageEffect == "ArtanisWeaponDamage")) { + if ((lp_damageEffect == "ArtanisWeaponDamage") || (lp_damageEffect == "ArtanisTwinBladesAmateurOpponentDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreOne"; } else { lv_primaryScoreString = "ScoreTwo"; } + if (libGame_gv_HeroSpecificStoredValue1[lv_casterPlayer] == 1.0) { + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Final Cut Present!")); + libGame_gv_HeroSpecificStoredValue1[lv_casterPlayer] = 0.0; + lv_secondaryScoreOverride = libGame_gv_DamageCalculateMMDDFAF(lp_damageEffect, lp_damageValue, lp_damageAttempted, lp_casterUnit, lp_targetUnit, "ArtanisFinalCut"); + if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { + lv_secondaryScoreString = "ScoreSix"; + } + else { + lv_secondaryScoreString = "ScoreSeven"; + } + } } if ((lp_damageEffect == "ArtanisBladeDashFirstDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreThree"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "AccuracySeven"; } else { lv_primaryScoreString = "ScoreFour"; } + if (PlayerHasTalent(lv_casterPlayer, "ArtanisBladeDashSolariteReaper") == true) { + lv_secondaryScoreOverride = libGame_gv_DamageCalculateMMDDFAF(lp_damageEffect, lp_damageValue, lp_damageAttempted, lp_casterUnit, lp_targetUnit, "ArtanisSolariteReaper"); + if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { + lv_secondaryScoreString = "ScoreSix"; + } + else { + lv_secondaryScoreString = "ScoreSeven"; + } + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Solarite Bonus DMG: ") + FixedToText(lv_secondaryScoreOverride, 5))); + } } if ((lp_damageEffect == "ArtanisBladeDashSecondDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreThree"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "AccuracyEight"; } else { lv_primaryScoreString = "ScoreFour"; @@ -25036,38 +25253,41 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ } if ((lp_damageEffect == "ArtanisPhasePrismDamage")) { lv_primaryScoreString = "ScoreFive"; - } - if ((lp_damageEffect == "ArtanisTwinBladesAmateurOpponentDamage")) { - lv_primaryScoreString = "ScoreSix"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "AccuracyNine"; } if ((lp_damageEffect == "ArtanisSpearofAdunPurifierBeamDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { - lv_primaryScoreString = "ScoreSeven"; + lv_primaryScoreString = "ScoreEight"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "AccuracyTen"; } else { - lv_primaryScoreString = "ScoreEight"; + lv_primaryScoreString = "ScoreNine"; } } if ((lp_damageEffect == "ArtanisSpearofAdunSuppressionPulseDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { - lv_primaryScoreString = "ScoreSeven"; + lv_primaryScoreString = "ScoreEight"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "AccuracyTen"; } else { - lv_primaryScoreString = "ScoreEight"; + lv_primaryScoreString = "ScoreNine"; } } if ((lp_damageEffect == "ArtanisTwinBladesTitanKillerWeaponDamage")) { - lv_primaryScoreString = "ScoreNine"; + lv_primaryScoreString = "ScoreTen"; } if ((lp_damageEffect == "ArtanisTwinBladesTitanKillerTwinBladesDamage")) { - lv_primaryScoreString = "ScoreNine"; + lv_primaryScoreString = "ScoreTen"; } if ((lp_damageEffect == "ArtanisShieldOverloadPlasmaBurnTalentDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { - lv_primaryScoreString = "ScoreTen"; + lv_primaryScoreString = "ScoreEleven"; } else { - lv_primaryScoreString = "ScoreEleven"; + lv_primaryScoreString = "ScoreTwelve"; } } if ((lp_damageEffect == "ArtanisSpearofAdunPurifierBeamTargetPurifiedDestroyPreviousBeam")) { @@ -25759,38 +25979,148 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((lp_damageEffect == "DehakaHeroWeaponDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreOne"; + if ((PlayerHasTalent(lv_casterPlayer, "DehakaEssenceClaws") == true) && (lp_damageValue != 0.0) && (UnitAbilityChargeInfo(lp_casterUnit, AbilityCommand("DehakaEssenceCollection", 0), c_unitAbilChargeCountLeft) != UnitAbilityChargeInfo(lp_casterUnit, AbilityCommand("DehakaEssenceCollection", 0), c_unitAbilChargeCountMax))) { + lv_secondaryScoreString = "TalentTen"; + lv_secondaryScoreOverride = 1.0; + } + if ((PlayerHasTalent(lv_casterPlayer, "DehakaDragTalentFeedingFrenzy") == true) && (libCore_gf_IsAbilityOnCooldown(lp_casterUnit, "DehakaDrag") == true)) { + lv_tertiaryScoreOverride = 1.0; + lv_tertiaryScoreString = "ScoreFifteen"; + } } - else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMinion) == true)) { + else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMinion) == true) || (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMerc) == true)) { lv_primaryScoreString = "ScoreTwo"; } else { lv_primaryScoreString = "ScoreThree"; } + if ((PlayerHasTalent(lv_casterPlayer, "DehakaPrimalRage") == true)) { + lv_quaternaryScoreOverride = libGame_gv_DamageCalculateMMDDFAF(lp_damageEffect, lp_damageValue, lp_damageAttempted, lp_casterUnit, lp_targetUnit, "DehakaPrimalRage"); + if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { + lv_quaternaryScoreString = "BaselineThree"; + } + else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMinion) == true) || (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMerc) == true)) { + lv_quaternaryScoreString = "TalentOne"; + } + else { + lv_quaternaryScoreString = "TalentFour"; + } + } } if ((lp_damageEffect == "DehakaDragDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreFour"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "TalentSixteen"; + if (PlayerHasTalent(lv_casterPlayer, "DehakaDragTalentFeedingFrenzy") == true) { + lv_tertiaryScoreString = "ScoreSixteen"; + lv_tertiaryScoreOverride = 1.0; + } + if (PlayerHasTalent(lv_casterPlayer, "DehakaDragTalentParalyzingEnzymes") == true) { + lv_quaternaryScoreString = "ScoreOne"; + lv_quaternaryScoreOverride = 1.0; + } } - else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMinion) == true)) { + else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMinion) == true) || (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMerc) == true)) { lv_primaryScoreString = "ScoreFive"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "TalentTwenty"; } else { lv_primaryScoreString = "ScoreSix"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "SupportEleven"; } } if ((lp_damageEffect == "DehakaDarkSwarmDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreSeven"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "SupportTwelve"; + if ((PlayerHasTalent(lv_casterPlayer, "DehakaEssenceCollectionTalentHeroStalker") == true) && (UnitAbilityChargeInfo(lp_casterUnit, AbilityCommand("DehakaEssenceCollection", 0), c_unitAbilChargeCountLeft) != UnitAbilityChargeInfo(lp_casterUnit, AbilityCommand("DehakaEssenceCollection", 0), c_unitAbilChargeCountMax))) { + lv_tertiaryScoreString = "ScoreTwelve"; + lv_tertiaryScoreOverride = 1.0; + } + if ((libCore_gf_IsAbilityOnCooldown(lp_casterUnit, "DehakaDarkSwarm") == true) && (PlayerHasTalent(lv_casterPlayer, "DehakaDarkSwarmTalentSymbiosis") == true)) { + lv_quinaryScoreOverride = 1.0; + lv_quinaryScoreString = "ScoreFifteen"; + } } - else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMinion) == true)) { + else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMinion) == true) || (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMerc) == true)) { lv_primaryScoreString = "ScoreEight"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "SupportThirteen"; } else { lv_primaryScoreString = "ScoreNine"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "SupportFourteen"; + } + if (((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMerc) == true) || (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeCreep) == true)) && (PlayerHasTalent(lv_casterPlayer, "DehakaEssenceCollectionOneWhoCollectsTalent") == true)) { + lv_quaternaryScoreOverride = libGame_gv_DamageCalculateMMDDFAF(lp_damageEffect, lp_damageValue, lp_damageAttempted, lp_casterUnit, lp_targetUnit, "DehakaOneWhoCollects"); + if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMerc) == true)) { + lv_quaternaryScoreString = "ScoreTwelve"; + } + else if (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMapCreature) == false) { + lv_quaternaryScoreString = "ScoreThirteen"; + } + else { + lv_quaternaryScoreString = "Discard"; + } + } + if ((PlayerHasTalent(lv_casterPlayer, "DehakaBrushstalkerFerociousStalker") == true) && (UnitHasBehavior2(lp_casterUnit, "DehakaBrushstalkerShrubMoveSpeedBuff") == true)) { + lv_senaryScoreOverride = libGame_gv_DamageCalculateMMDDFAF(lp_damageEffect, lp_damageValue, lp_damageAttempted, lp_casterUnit, lp_targetUnit, "DehakaFerociousStalker"); + if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { + lv_senaryScoreString = "BaselineThree"; + } + else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMinion) == true) || (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMerc) == true)) { + lv_senaryScoreString = "TalentOne"; + } + else { + lv_senaryScoreString = "TalentFour"; + } + } + } + if ((lp_damageEffect == "DehakaBurrowLurkerStrainTalentDamage")) { + if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { + lv_primaryScoreString = "ScoreTwelve"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "SupportSixteen"; + } + else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMinion) == true) || (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMerc) == true)) { + lv_primaryScoreString = "ScoreThirteen"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "AccuracyOne"; + } + else { + lv_primaryScoreString = "ScoreFourteen"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "AccuracyTwo"; + } + } + if ((lp_damageEffect == "DehakaDragParalyzingEnzymesTalentDamage")) { + if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { + lv_primaryScoreString = "ScoreFifteen"; + } + else { + lv_primaryScoreString = "ScoreSixteen"; } } if ((lp_damageEffect == "DehakaIsolationDamage")) { - lv_primaryScoreString = "ScoreTen"; + lv_primaryScoreString = "ScoreTwo"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "AccuracyThree"; + if (PlayerHasTalent(lv_casterPlayer, "DehakaIsolationTalentContagion") == true) { + if ((GameGetMissionTime() - libGame_gv_HeroSpecificStoredValue1[lv_casterPlayer]) < 5.0) { + lv_primaryScoreString = "TalentTen"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "AccuracyFour"; + } + else { + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Isolation was not dealt by Contagion: ") + FixedToText(libGame_gv_HeroSpecificStoredValue1[lv_casterPlayer], 4))); + } + libGame_gv_HeroSpecificStoredValue1[lv_casterPlayer] = GameGetMissionTime(); + } } if ((lp_damageEffect == "DehakaDragSuicideRemove")) { lv_primaryScoreString = "Discard"; @@ -25922,7 +26252,7 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ } // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Damage source is Apocalypse")); } - else if (((PlayerHasTalent(lv_casterPlayer, "DiabloHellgate") == true) && ((GameGetMissionTime() - libGame_gv_HeroSpecificStoredValue2[lv_casterPlayer]) == 1.8125)) || (PlayerHasTalent(lv_casterPlayer, "DiabloHeroicAbilityApocalypse") == false)) { + else if (((PlayerHasTalent(lv_casterPlayer, "DiabloHellgate") == true) && (((GameGetMissionTime() - libGame_gv_HeroSpecificStoredValue2[lv_casterPlayer]) == 1.8125) || (GameGetMissionTime() - libGame_gv_HeroSpecificStoredValue2[lv_casterPlayer]) == 1.75)) || (PlayerHasTalent(lv_casterPlayer, "DiabloHeroicAbilityApocalypse") == false)) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreTen"; } @@ -25940,6 +26270,12 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ } // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Damage source is Dying Breath")); } + else { + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Apoc Damage Source Unknown")); + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Time: ") + FixedToText(GameGetMissionTime(), 5))); + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Apoc Time: ") + FixedToText(libGame_gv_HeroSpecificStoredValue1[lv_casterPlayer], 5))); + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Hellgate Time: ") + FixedToText(libGame_gv_HeroSpecificStoredValue2[lv_casterPlayer], 5))); + } } if ((lp_damageEffect == "DiabloFireStompHellfireDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { @@ -26796,6 +27132,11 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((lp_damageEffect == "JunkratRIPTireKillUnit")) { lv_primaryScoreString = "Discard"; } + if ((lp_damageEffect == "StormSuicide") && (UnitGetType(lp_targetUnit) == "JunkratFragLauncherMissile")) { + // lv_primaryScoreString = ""; + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Extra Wound Timer Behavior Count: ") + IntToText(UnitBehaviorCount(lp_targetUnit, "JunkratFragLauncherExtraWoundTimersMissileMarker")))); + // Only works on direct hit-impacts, not on impacts after bouncing or on expiration + } } if ((UnitGetType(libGame_gv_players[lv_casterPlayer].lv_heroUnit) == "HeroKaelthas")) { if ((lp_damageEffect == "KaelthasWeaponDamage")) { @@ -27106,7 +27447,7 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreOne"; } - else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeCreep) == true)) { + else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeCreep) == true) && (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMapCreature) == false)) { lv_primaryScoreString = "ScoreTwo"; } else { @@ -27117,17 +27458,21 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreSeven"; } - else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeCreep) == true)) { + else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeCreep) == true) && (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMapCreature) == false)) { lv_primaryScoreString = "ScoreEight"; } else { lv_primaryScoreString = "ScoreNine"; } } - if ((UnitBehaviorCount(lp_casterUnit, "MonkComboWeaponComboPoints") == 0.0) && (PlayerHasTalent(lv_casterPlayer, "MonkIronFists"))) { + if ((UnitBehaviorCount(lp_casterUnit, "MonkComboWeaponComboPoints") == 0.0) && (PlayerHasTalent(lv_casterPlayer, "MonkIronFists") == true)) { lv_secondaryScoreString = "ScoreFour"; lv_secondaryScoreOverride = libGame_gv_DamageCalculateMMDDFAF(lp_damageEffect, lp_damageValue, lp_damageAttempted, lp_casterUnit, lp_targetUnit, "MonkIronFist"); } + if ((UnitBehaviorCount(lp_casterUnit, "MonkComboWeaponComboPoints") == 0.0) && (PlayerHasTalent(lv_casterPlayer, "MonkIronFists") == false) && ((PlayerHasTalent(lv_casterPlayer, "MonkFistsofLegendTrait") == true))) { + lv_secondaryScoreString = "ScoreEleven"; + lv_secondaryScoreOverride = libGame_gv_DamageCalculateMMDDFAF(lp_damageEffect, lp_damageValue, lp_damageAttempted, lp_casterUnit, lp_targetUnit, "MonkIronFistFistofLegend"); + } // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Hundred Fist Duration: ") + FixedToText(UnitBehaviorDuration(lp_casterUnit, "MonkDashWayoftheHundredFistsCasterBehavior"), 4))); // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Trait Count: ") + FixedToText(UnitBehaviorCount(lp_casterUnit, "MonkComboWeaponComboPoints"), 0))); } @@ -27135,7 +27480,7 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ lv_primaryScoreString = "ScoreFive"; // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Sevensided Duration: ") + FixedToText(UnitBehaviorDuration(lp_casterUnit, "MonkSevenSidedStrikeCasterBehavior"), 4))); if ((PlayerHasTalent(lv_casterPlayer, "MonkElevenSidedStrikeSevenSidedStrike")) && (UnitBehaviorDuration(lp_casterUnit, "MonkSevenSidedStrikeCasterBehavior") <= 1.0)) { - lv_secondaryScoreString = "ScoreTen"; + lv_primaryScoreString = "ScoreTen"; } // UIDisplayMessage UnitBehaviorDuration(lp_casterUnit, "MonkSevenSidedStrikeCasterBehavior") } @@ -27377,6 +27722,44 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((lp_damageEffect == "MedicDisplacementGrenadeDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreFour"; + if (libGame_gv_HeroSpecificStoredValue1[lv_casterPlayer] != GameGetMissionTime()) { + lv_secondaryScoreString = "AccuracyEight"; + lv_secondaryScoreOverride = 1.0; + libGame_gv_HeroSpecificStoredValue2[lv_casterPlayer] = 1.0; + } + else { + if (libGame_gv_HeroSpecificStoredValue2[lv_casterPlayer] == 4.0) { + lv_secondaryScoreString = "AccuracyTwelve"; + lv_secondaryScoreOverride = 1.0; + libGame_gv_HeroSpecificStoredValue2[lv_casterPlayer] = 5.0; + } + else if (libGame_gv_HeroSpecificStoredValue2[lv_casterPlayer] == 3.0) { + lv_secondaryScoreString = "AccuracyEleven"; + lv_secondaryScoreOverride = 1.0; + libGame_gv_HeroSpecificStoredValue2[lv_casterPlayer] = 4.0; + } + else if (libGame_gv_HeroSpecificStoredValue2[lv_casterPlayer] == 2.0) { + lv_secondaryScoreString = "AccuracyTen"; + lv_secondaryScoreOverride = 1.0; + libGame_gv_HeroSpecificStoredValue2[lv_casterPlayer] = 3.0; + } + else if (libGame_gv_HeroSpecificStoredValue2[lv_casterPlayer] == 1.0) { + lv_secondaryScoreString = "AccuracyNine"; + lv_secondaryScoreOverride = 1.0; + libGame_gv_HeroSpecificStoredValue2[lv_casterPlayer] = 2.0; + if (PlayerHasTalent(lv_casterPlayer, "MedicSecondOpinion") == true) { + lv_quaternaryScoreOverride = 1.0; + lv_quaternaryScoreString = "ScoreTwelve"; + } + } + else { + } + } + libGame_gv_HeroSpecificStoredValue1[lv_casterPlayer] = GameGetMissionTime(); + if (PlayerHasTalent(lv_casterPlayer, "MedicBedsideManner") == true) { + lv_tertiaryScoreOverride = 1.0; + lv_tertiaryScoreString = "ScoreEight"; + } } else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMinion) == true)) { lv_primaryScoreString = "ScoreFive"; @@ -27399,6 +27782,14 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((lp_damageEffect == "MedicDisplacementGrenadeEMPGrenadeTalentShieldDamage")) { lv_primaryScoreString = "ScoreTen"; } + if ((lp_damageEffect == "MedicHeroWeaponBedsideMannerTalentDamage")) { + lv_primaryScoreString = "ScoreSeven"; + } + if ((lp_damageEffect == "MedicDisplacementGrenadeBedsideMannerTalentProcDamage")) { + lv_primaryScoreString = "ScoreNine"; + lv_secondaryScoreOverride = 1.0; + lv_secondaryScoreString = "ScoreTen"; + } } if ((UnitGetType(libGame_gv_players[lv_casterPlayer].lv_heroUnit) == "HeroLucio")) { if ((lp_damageEffect == "LucioWeaponDamage")) { @@ -30669,7 +31060,7 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMerc) == true) || (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMinion) == true)) { lv_primaryScoreString = "SupportThirteen"; } - else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeCreep) == true)) { + else if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeCreep) == true) && (UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeMapCreature) == false)) { lv_primaryScoreString = "SupportFourteen"; } else { @@ -33510,7 +33901,7 @@ int libGame_gf_unitGroupCountRaynorInspire (unitgroup lp_generatedUnitGroup, str void libGame_gf_exportStatsForPlayer (int lp_player) { string lv_scoreString; - lv_scoreString = "Version 0.22 " + "[ " + "PlayerNumber: " + IntToString(lp_player) + " Handle: " + PlayerHandle(lp_player) + " , " + UnitGetType(libGame_gv_players[lp_player].lv_heroUnit) + " ] , " + libGame_gf_statsForPlayerHeroSpecificString(lp_player); + lv_scoreString = "Version 0.23 " + "[ " + "PlayerNumber: " + IntToString(lp_player) + " Handle: " + PlayerHandle(lp_player) + " , " + UnitGetType(libGame_gv_players[lp_player].lv_heroUnit) + " ] , " + libGame_gf_statsForPlayerHeroSpecificString(lp_player); lv_scoreString += " ,[ HSPrimary: "; lv_scoreString += FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreOne, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreTwo, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreThree, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreFour, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreFive, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreSix, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreSeven, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreEight, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreNine, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreTen, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreEleven, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreTwelve, 1); lv_scoreString += " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreThirteen, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreFourteen, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreFifteen, 1) + " , " + FixedToString(libGame_gv_heroSpecificScoreValues[lp_player].lv_scoreSixteen, 1); @@ -34664,6 +35055,12 @@ void libGame_gf_trackHeroCooldowns () { lv_abilityName[lv_playerIterator][lv_heroAbilCount[lv_playerIterator]] = "ZuljinYouWantAxeProgressDetector"; lv_abilityChargeCount[lv_playerIterator][lv_heroAbilCount[lv_playerIterator]] = libGame_gf_FetchAbilityCooldownTime(libGame_gv_players[lv_playerIterator].lv_heroUnit, "ZuljinYouWantAxeProgressDetector", lv_playerIterator, false); } + if ((UnitGetType(libGame_gv_players[lv_playerIterator].lv_heroUnit) == "HeroDehaka")) { + lv_heroAbilCount[lv_playerIterator] += 1; + lv_abilityName[lv_playerIterator][lv_heroAbilCount[lv_playerIterator]] = "DehakaBrushstalkerDetector"; + lv_abilityChargeCount[lv_playerIterator][lv_heroAbilCount[lv_playerIterator]] = libGame_gf_FetchAbilityCooldownTime(libGame_gv_players[lv_playerIterator].lv_heroUnit, "DehakaBrushstalkerDetector", lv_playerIterator, false); + } + lv_heroAbilCount[lv_playerIterator] += 1; lv_abilityName[lv_playerIterator][lv_heroAbilCount[lv_playerIterator]] = "MedivhPortalDetector"; lv_heroAbilCount[lv_playerIterator] += 1; @@ -35075,7 +35472,10 @@ fixed libGame_gf_FetchAbilityCooldownTime (unit lp_unit, string lp_ability, int lv_cooldownTime = GameGetMissionTime(); lv_method = "HoggerRagePercentageMonitor"; } - + if ((lp_ability == "DehakaBrushstalkerDetector")) { + lv_cooldownTime = GameGetMissionTime(); + lv_method = "BrushStalkerDetector"; + } if ((lp_ability == "GiddyUp")) { if ((PlayerHasTalent(lp_player, "RaynorInspireGiddyUp") == true) && (UnitHasBehaviorWithCategoryFlag(lp_unit, c_behaviorCategoryMount) == true)) { @@ -35462,9 +35862,13 @@ void libGame_gv_trackHeroCooldowns (unit lp_casterUnit, string lp_abilityName, f else if ((lv_heroUnitType == "HeroArtanis")) { if ((lp_abilityName == "ArtanisBladeDash")) { lv_scoreString = "AccuracyOne"; + libGame_gv_HeroQButtonTimestamp[lv_casterPlayerOverride] = GameGetMissionTime(); + libGame_gv_HeroSpecificStoredValue1[lv_casterPlayerOverride] = UnitBehaviorCount(lp_casterUnit, "ArtanisFinalCutBuff"); } if ((lp_abilityName == "ArtanisTwinBlades")) { lv_scoreString = "Discard"; + libGame_gv_HeroWButtonTimestamp[lv_casterPlayerOverride] = GameGetMissionTime(); + libGame_gv_HeroSpecificStoredValue1[lv_casterPlayerOverride] = UnitBehaviorCount(lp_casterUnit, "ArtanisFinalCutBuff"); if ((UnitHasBehavior2(lp_casterUnit, "ArtanisTwinBladesPrimed") == false)) { lv_scoreString = "AccuracyTwo"; // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Artanis Twin Blades Check")); @@ -35477,6 +35881,8 @@ void libGame_gv_trackHeroCooldowns (unit lp_casterUnit, string lp_abilityName, f } if ((lp_abilityName == "ArtanisPhasePrism")) { lv_scoreString = "AccuracyThree"; + libGame_gv_HeroEButtonTimestamp[lv_casterPlayerOverride] = GameGetMissionTime(); + libGame_gv_HeroSpecificStoredValue1[lv_casterPlayerOverride] = UnitBehaviorCount(lp_casterUnit, "ArtanisFinalCutBuff"); } if ((lp_abilityName == "ArtanisShieldOverloadDummy")) { lv_scoreString = "AccuracyFour"; @@ -35486,6 +35892,7 @@ void libGame_gv_trackHeroCooldowns (unit lp_casterUnit, string lp_abilityName, f } if ((lp_abilityName == "ArtanisSpearofAdunPurifierBeam") || (lp_abilityName == "ArtanisSpearofAdunSuppressionPulse")) { lv_scoreString = "AccuracySix"; + libGame_gv_HeroSpecificStoredValue1[lv_casterPlayerOverride] = UnitBehaviorCount(lp_casterUnit, "ArtanisFinalCutBuff"); } } else if ((lv_heroUnitType == "HeroArthas")) { @@ -36050,13 +36457,22 @@ void libGame_gv_trackHeroCooldowns (unit lp_casterUnit, string lp_abilityName, f } else if ((lv_heroUnitType == "HeroDehaka")) { if ((lp_abilityName == "DehakaDrag")) { - lv_scoreString = "AccuracyOne"; + lv_scoreString = "AccuracyFive"; + if ((PlayerHasTalent(lv_casterPlayerOverride, "DehakaDragTalentFeedingFrenzy") == true) || (PlayerHasTalent(lv_casterPlayerOverride, "DehakaDragTalentParalyzingEnzymes") == true)) { + lv_secondaryScoreString = "BaselineOne"; + } } if ((lp_abilityName == "DehakaDarkSwarm")) { - lv_scoreString = "AccuracyTwo"; + lv_scoreString = "AccuracySix"; + if (PlayerHasTalent(lv_casterPlayerOverride, "DehakaEssenceCollectionTalentHeroStalker") == true) { + lv_secondaryScoreString = "ScoreThirteen"; + } + if (PlayerHasTalent(lv_casterPlayerOverride, "DehakaDarkSwarmTalentSymbiosis") == true) { + lv_tertiaryScoreString = "ScoreSixteen"; + } } if ((lp_abilityName == "DehakaBurrow")) { - lv_scoreString = "AccuracyThree"; + lv_scoreString = "AccuracySeven"; if ((UnitHasBehavior2(lp_casterUnit, "DehakaBurrowChannel") == false)) { lv_scoreString = "Discard"; } @@ -36066,7 +36482,10 @@ void libGame_gv_trackHeroCooldowns (unit lp_casterUnit, string lp_abilityName, f lv_scoreString = "Discard"; } else { - lv_scoreString = "AccuracyFour"; + lv_scoreString = "AccuracyEight"; + if (PlayerHasTalent(lv_casterPlayerOverride, "DehakaBrushstalkerApexPredator") == true) { + lv_secondaryScoreString = "TalentTen"; + } } } if ((lp_abilityName == "DehakaCancelBurrow")) { @@ -36074,7 +36493,7 @@ void libGame_gv_trackHeroCooldowns (unit lp_casterUnit, string lp_abilityName, f } if ((lp_abilityName == "DehakaEssenceCollection")) { if ((lp_cooldownNewValue < 1.5)) { - lv_scoreString = "AccuracyFive"; + lv_scoreString = "AccuracyNine"; } else { lv_scoreString = "Discard"; @@ -36085,7 +36504,21 @@ void libGame_gv_trackHeroCooldowns (unit lp_casterUnit, string lp_abilityName, f lv_scoreString = "Discard"; } else { - lv_scoreString = "AccuracySix"; + lv_scoreString = "AccuracyTen"; + if (lp_abilityName == "DehakaIsolation") { + if (PlayerHasTalent(lv_casterPlayerOverride, "DehakaIsolationTalentContagion") == true) { + lv_secondaryScoreString = "TalentThirteen"; + } + } + } + } + if ((lp_abilityName == "DehakaBrushstalkerDetector")) { + lv_scoreString = "Discard"; + if (UnitHasBehavior2(lp_casterUnit, "DehakaBrushstalkerShrubMoveSpeedBuff") == true) { + libGame_gf_HeroSpecificStatTrackerOther(0.0625, lv_casterPlayerOverride, lv_casterPlayerOverride, "Passthrough", null, "ScoreTen"); + } + if (UnitHasBehavior2(lp_casterUnit, "DehakaBrushstalkerPackLeaderArmorBehavior") == true) { + libGame_gf_HeroSpecificStatTrackerOther(0.0625, lv_casterPlayerOverride, lv_casterPlayerOverride, "Passthrough", null, "TalentSeven"); } } } @@ -36847,6 +37280,9 @@ void libGame_gv_trackHeroCooldowns (unit lp_casterUnit, string lp_abilityName, f } if ((lp_abilityName == "MedicSafeguard")) { lv_scoreString = "AccuracyTwo"; + if ((PlayerHasTalent(lv_casterPlayerOverride, "MedicHospiceCare") == true)) { + lv_secondaryScoreString = "SupportTwelve"; + } } if ((lp_abilityName == "MedicDisplacementGrenade")) { lv_scoreString = "AccuracyThree"; @@ -37299,6 +37735,9 @@ void libGame_gv_trackHeroCooldowns (unit lp_casterUnit, string lp_abilityName, f lv_scoreString = "Discard"; } } + if (lp_abilityName == "StukovSpineLauncher") { + lv_scoreString = "Discard"; + } } else if ((lv_heroUnitType == "HeroTassadar")) { if ((lp_abilityName == "TassadarShockRay")) { @@ -39113,7 +39552,7 @@ void libGame_gv_initializeOBSUI () { if ((libGame_gv_heroSpecificDebugString != "Ignore")) { UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Initialising Mercenary Tracker")); - UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Stats Version: v0.22 ") + StringToText("Interface Version: ") + StringExternal("UI/Spazzo/UIVersion")); + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Stats Version: v0.23 ") + StringToText("Interface Version: ") + StringExternal("UI/Spazzo/UIVersion")); // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Order core tag: ") + IntToText(UnitGetTag(libGame_gv_teams[1].lv_core)) + StringToText(" Chaos core tag: ") + IntToText(UnitGetTag(libGame_gv_teams[2].lv_core))); // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("player 1 unit tag: ") + IntToText(UnitGetTag(libGame_gv_players[1].lv_heroUnit))); // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("player 2 unit tag: ") + IntToText(UnitGetTag(libGame_gv_players[2].lv_heroUnit))); @@ -39406,10 +39845,10 @@ fixed libGame_gv_DamageCalculateDifferentEntryOrAccumulator(string lp_damageEffe if ((CatalogFieldValueGetAsFixed(c_gameCatalogEffect, lp_damageEffect, "Flags[" + "NoFractionDealtBonus" + "]", lv_casterPlayer) == 0.0)) { if ((CatalogFieldValueGet(c_gameCatalogEffect, lp_damageEffect, "Kind", lv_casterPlayer) == "Basic")) { - lv_damageResult = (lv_damageResult * (lv_heroSpecificDamageDealtFraction + libGame_gv_DamageDealtFractionBasic(lp_casterUnit, lp_damageEffect, true))); + lv_damageResult = (lv_damageResult * (lv_heroSpecificDamageDealtFraction + libGame_gv_DamageDealtFractionBasic(lp_casterUnit, lp_damageEffect, true, false))); } else { - lv_damageResult = (lv_damageResult * (lv_heroSpecificDamageDealtFraction + libGame_gv_DamageDealtFractionAbility(lp_casterUnit, lp_damageEffect, true))); + lv_damageResult = (lv_damageResult * (lv_heroSpecificDamageDealtFraction + libGame_gv_DamageDealtFractionAbility(lp_casterUnit, lp_damageEffect, true, false))); } } @@ -40486,6 +40925,13 @@ fixed libGame_gv_DamageCalculateMMDDFAF(string lp_damageEffect, fixed lp_damageV lv_damageResult = ((lv_damageValuePerCatalog * (1.0 + CatalogFieldValueGetAsFixed(c_gameCatalogEffect, "MonkWeaponDamage", "MultiplicativeModifierArray[" + "MonkIronFists" + "].Modifier", lv_casterPlayer))) - lv_damageValuePerCatalog); } + if ((lp_inputData == "MonkIronFistFistofLegend")) { + if ((lp_damageEffect == "MonkWeaponDamage")) { + lv_flatDamageModifier = 0.0; + } + + lv_damageResult = ((lv_damageValuePerCatalog * (1.0 + CatalogFieldValueGetAsFixed(c_gameCatalogEffect, "MonkWeaponDamage", "MultiplicativeModifierArray[" + "FistsOfLegend" + "].Modifier", lv_casterPlayer))) - lv_damageValuePerCatalog); + } if ((lp_inputData == "MaievBondsofJusticeAA")) { if ((lp_damageEffect == "MaievWeaponDamage")) { @@ -40667,6 +41113,23 @@ fixed libGame_gv_DamageCalculateMMDDFAF(string lp_damageEffect, fixed lp_damageV lv_damageResult = ((lv_damageValuePerCatalog * (1.0 + CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, "BarbarianWrathoftheBerserkerBase", "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", lv_casterPlayer))) - lv_damageValuePerCatalog); } + if ((lp_inputData == "ArtanisFinalCut")) { + if ((lp_damageEffect == "ArtanisWeaponDamage")) { + lv_flatDamageModifier = 0.0; + } + if ((lp_damageEffect == "ArtanisTwinBladesAmateurOpponentDamage")) { + lv_flatDamageModifier = 0.0; + } + + lv_damageResult = ((lv_damageValuePerCatalog * (1.0 + CatalogFieldValueGetAsFixed(c_gameCatalogBehavior, "ArtanisFinalCutBuff", "Modification.DamageDealtFraction[" + IntToString(c_unitDamageTypeBasic) + "]", lv_casterPlayer))) - lv_damageValuePerCatalog); + } + if ((lp_inputData == "ArtanisSolariteReaper")) { + if ((lp_damageEffect == "ArtanisBladeDashFirstDamage")) { + lv_flatDamageModifier = 0.0; + } + lv_damageResult = ((lv_damageValuePerCatalog * (1.0 + CatalogFieldValueGetAsFixed(c_gameCatalogTalent, "ArtanisBladeDashSolariteReaper", "AbilityModificationArray[" + IntToString(0) + "].Modifications[" + IntToString(0) + "].Value", lv_casterPlayer))) - lv_damageValuePerCatalog); + } + if ((lp_inputData == "CrusaderHolyFury")) { if ((lp_damageEffect == "CrusaderHolyFuryDamage")) { lv_flatDamageModifier = 0.0; @@ -40835,8 +41298,23 @@ fixed libGame_gv_DamageCalculateMMDDFAF(string lp_damageEffect, fixed lp_damageV lv_damageResult = (((lv_damageValuePerCatalog + lv_flatDamageModifier) * (1.0 + CatalogFieldValueGetAsFixed(c_gameCatalogEffect, lp_damageEffect, "MultiplicativeModifierArray[" + "Snowstorm1Tokens" + "].Modifier", lv_casterPlayer))) - (lv_damageValuePerCatalog + lv_flatDamageModifier)); } } + + if ((lp_inputData == "DehakaOneWhoCollects")) { + lv_flatDamageModifier = 0.0; - + lv_damageResult = (((lv_damageValuePerCatalog + lv_flatDamageModifier) * (1.0 + CatalogFieldValueGetAsFixed(c_gameCatalogEffect, lp_damageEffect, "MultiplicativeModifierArray[" + "OneWhoCollects" + "].Modifier", lv_casterPlayer))) - (lv_damageValuePerCatalog + lv_flatDamageModifier)); + } + + if ((lp_inputData == "DehakaFerociousStalker")) { + lv_flatDamageModifier = 0.0; + + lv_damageResult = (((lv_damageValuePerCatalog + lv_flatDamageModifier) * (1.0 + CatalogFieldValueGetAsFixed(c_gameCatalogEffect, lp_damageEffect, "MultiplicativeModifierArray[" + "FerociousStalker" + "].Modifier", lv_casterPlayer))) - (lv_damageValuePerCatalog + lv_flatDamageModifier)); + } + if ((lp_inputData == "DehakaPrimalRage")) { + lv_flatDamageModifier = 0.0; + + lv_damageResult = (((lv_damageValuePerCatalog + lv_flatDamageModifier) * (1.0 + (UnitGetTokenCount(lp_casterUnit, "DehakaEssenceCollectionPrimalRageTalentTokenCounter") * CatalogFieldValueGetAsFixed(c_gameCatalogAccumulator, "DehakaPrimalRageTalentDamageAccumulator", "Scale", lv_casterPlayer)))) - (lv_damageValuePerCatalog + lv_flatDamageModifier)); + } if ((lp_damageEffect == "SiegeWeaponSplashDamage") && (UnitHasBehavior2(lp_casterUnit, "SgtHammerSiegeDamageSplashDamage") == true)) { @@ -40876,6 +41354,102 @@ fixed libGame_gv_DamageCalculateMMDDFAF(string lp_damageEffect, fixed lp_damageV return lv_damageResult; } + +void libGame_gf_travelThroughTime () { + // Variable Declarations + int lv_playerIterator; + int lv_activeLoop; + int lv_activeUnit; + int[libCore_gv_bALMaxPlayers + 1] lv_activeUnits; + unit[libCore_gv_bALMaxPlayers + 1][4] lv_contextUnit; + + // Automatic Variable Declarations + int autoAAAAAF_ae; + + // Variable Initialization + + // Implementation + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Tracking Hero Cooldowns in 6.5 Seconds")); + // Wait(6.5, c_timeGame); + libGame_gv_timeTravelling = true; + lv_activeLoop = 1; + libGame_gv_timeTravelActiveLoop = lv_activeLoop; + lv_activeUnit = 1; + libGame_gv_timeTravelPreviousLoop = 1; + while ((libGame_gv_gameStarted == false) && (libCore_gv_sYSGameMode != libCore_ge_GameModes_TryMe)) { + if ((libGame_gv_heroSpecificDebugString != "Ignore")) { + // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Game has yet to start, checking for gates open in 1 second")); + } + Wait(1.0, c_timeGame); + } + + if ((libGame_gv_heroSpecificDebugString != "Ignore")) { + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Started travelling through time")); + } + autoAAAAAF_ae = libCore_gv_bALMaxPlayers; + lv_playerIterator = 1; + for ( ; lv_playerIterator <= autoAAAAAF_ae ; lv_playerIterator += 1 ) { + if (UnitGetType(libGame_gv_players[lv_playerIterator].lv_heroUnit) == "HeroDVaPilot") { + lv_activeUnits[lv_playerIterator] = 2; + if ((libNtve_gf_UnitIsInsideTransport(libGame_gv_players[lv_playerIterator].lv_heroUnit) == true) && (UnitGetType(UnitTransport(libGame_gv_players[lv_playerIterator].lv_heroUnit)) == "HeroDVaMech")) { + lv_activeUnit = 2; + lv_contextUnit[lv_playerIterator][lv_activeUnit] = UnitTransport(libGame_gv_players[lv_playerIterator].lv_heroUnit); + } + else { + lv_activeUnit = 1; + lv_contextUnit[lv_playerIterator][lv_activeUnit] = libGame_gv_players[lv_playerIterator].lv_heroUnit; + } + } + else if (UnitGetType(libGame_gv_players[lv_playerIterator].lv_heroUnit) == "HeroLostVikingsController") { + lv_activeUnit = 1; + lv_activeUnits[lv_playerIterator] = 3; + } + else { + lv_activeUnit = 1; + lv_activeUnits[lv_playerIterator] = 1; + libGame_gv_timeTravelActiveUnit[lv_playerIterator] = lv_activeUnit; + lv_contextUnit[lv_playerIterator][lv_activeUnit] = libGame_gv_players[lv_playerIterator].lv_heroUnit; + } + } + + autoAAAAAF_ae = libCore_gv_bALMaxPlayers; + lv_playerIterator = 1; + while ((libGame_gv_timeTravelling == true)) { + if (lv_activeLoop == 1) { + libGame_gv_timeTravelPreviousLoop = lv_activeLoop; + lv_activeLoop = 2; + libGame_gv_timeTravelActiveLoop = lv_activeLoop; + } + else { + libGame_gv_timeTravelPreviousLoop = lv_activeLoop; + lv_activeLoop = 1; + libGame_gv_timeTravelActiveLoop = lv_activeLoop; + } + lv_playerIterator = 1; + for ( ; lv_playerIterator <= autoAAAAAF_ae ; lv_playerIterator += 1 ) { + // iterate here + libGame_gv_timeTravelValues[lv_playerIterator][lv_activeLoop].lv_armor[lv_activeUnit][c_unitDamageTypeHero][c_unitDamageTypeAbility] = UnitGetArmorValue(lv_contextUnit[lv_playerIterator][lv_activeUnit], c_unitDamageTypeHero, c_unitDamageTypeAbility); + libGame_gv_timeTravelValues[lv_playerIterator][lv_activeLoop].lv_armor[lv_activeUnit][c_unitDamageTypeHero][c_unitDamageTypeBasic] = UnitGetArmorValue(lv_contextUnit[lv_playerIterator][lv_activeUnit], c_unitDamageTypeHero, c_unitDamageTypeBasic); + libGame_gv_timeTravelValues[lv_playerIterator][lv_activeLoop].lv_armor[lv_activeUnit][c_unitDamageTypeMerc][c_unitDamageTypeAbility] = UnitGetArmorValue(lv_contextUnit[lv_playerIterator][lv_activeUnit], c_unitDamageTypeMerc, c_unitDamageTypeAbility); + libGame_gv_timeTravelValues[lv_playerIterator][lv_activeLoop].lv_armor[lv_activeUnit][c_unitDamageTypeMerc][c_unitDamageTypeBasic] = UnitGetArmorValue(lv_contextUnit[lv_playerIterator][lv_activeUnit], c_unitDamageTypeMerc, c_unitDamageTypeBasic); + libGame_gv_timeTravelValues[lv_playerIterator][lv_activeLoop].lv_armor[lv_activeUnit][c_unitDamageTypeMonster][c_unitDamageTypeAbility] = UnitGetArmorValue(lv_contextUnit[lv_playerIterator][lv_activeUnit], c_unitDamageTypeMonster, c_unitDamageTypeAbility); + libGame_gv_timeTravelValues[lv_playerIterator][lv_activeLoop].lv_armor[lv_activeUnit][c_unitDamageTypeMonster][c_unitDamageTypeBasic] = UnitGetArmorValue(lv_contextUnit[lv_playerIterator][lv_activeUnit], c_unitDamageTypeMonster, c_unitDamageTypeBasic); + libGame_gv_timeTravelValues[lv_playerIterator][lv_activeLoop].lv_armor[lv_activeUnit][c_unitDamageTypeStructure][c_unitDamageTypeAbility] = UnitGetArmorValue(lv_contextUnit[lv_playerIterator][lv_activeUnit], c_unitDamageTypeStructure, c_unitDamageTypeAbility); + libGame_gv_timeTravelValues[lv_playerIterator][lv_activeLoop].lv_armor[lv_activeUnit][c_unitDamageTypeStructure][c_unitDamageTypeBasic] = UnitGetArmorValue(lv_contextUnit[lv_playerIterator][lv_activeUnit], c_unitDamageTypeStructure, c_unitDamageTypeBasic); + libGame_gv_timeTravelValues[lv_playerIterator][lv_activeLoop].lv_armor[lv_activeUnit][c_unitDamageTypeMinion][c_unitDamageTypeAbility] = UnitGetArmorValue(lv_contextUnit[lv_playerIterator][lv_activeUnit], c_unitDamageTypeMinion, c_unitDamageTypeAbility); + libGame_gv_timeTravelValues[lv_playerIterator][lv_activeLoop].lv_armor[lv_activeUnit][c_unitDamageTypeMinion][c_unitDamageTypeBasic] = UnitGetArmorValue(lv_contextUnit[lv_playerIterator][lv_activeUnit], c_unitDamageTypeMinion, c_unitDamageTypeBasic); + libGame_gv_timeTravelValues[lv_playerIterator][lv_activeLoop].lv_armor[lv_activeUnit][c_unitDamageTypeSummon][c_unitDamageTypeAbility] = UnitGetArmorValue(lv_contextUnit[lv_playerIterator][lv_activeUnit], c_unitDamageTypeSummon, c_unitDamageTypeAbility); + libGame_gv_timeTravelValues[lv_playerIterator][lv_activeLoop].lv_armor[lv_activeUnit][c_unitDamageTypeSummon][c_unitDamageTypeBasic] = UnitGetArmorValue(lv_contextUnit[lv_playerIterator][lv_activeUnit], c_unitDamageTypeSummon, c_unitDamageTypeBasic); + libGame_gv_timeTravelValues[lv_playerIterator][lv_activeLoop].lv_timeStored = GameGetMissionTime(); + } + Wait(0.0625, c_timeGame); + } + if ((libGame_gv_heroSpecificDebugString != "Ignore")) { + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Stopped travelling through time")); + } +} + + // End // ---------------------- @@ -48093,6 +48667,7 @@ bool libGame_gt_CoreDiesGameOver_Func (bool testConds, bool runActions) { libGame_gf_exportStatsForPlayer(10); libGame_gv_isCustomReplayLogic = true; libGame_gv_trackingHeroCooldowns = false; + libGame_gv_timeTravelling = false; TimerPause(libGame_gv_gameTimer, true); TimerPause(libGame_gv_matchGameplayTimer, true); @@ -48225,13 +48800,13 @@ bool libGame_gt_OnFireEnableMessaging_Func (bool testConds, bool runActions) { } else { if ((EventUnitTotalDamageMitigated() > 0.0) && (UnitTypeTestAttribute(UnitGetType(EventUnit()), c_unitAttributeHeroic) == true) && (UnitTestState(EventUnit(), c_unitStateHallucination) == false) && (UnitGetOwner(EventUnit()) >= 1) && (UnitGetOwner(EventUnit()) <= libCore_gv_bALMaxPlayers) && (UnitHasBehavior2(EventUnit(), "GenericVehicleBehaviorEmpty") == false) && (UnitHasBehavior2(EventUnit(), "GenericVehicleBehaviorOccupied") == false)) { - if ((UnitGetArmorValue(EventUnit(), c_unitDamageTypeHero, c_unitDamageTypeBasic) >= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMerc, c_unitDamageTypeBasic) >= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMonster, c_unitDamageTypeBasic) >= 0.0) + if ((UnitGetArmorValue(EventUnit(), c_unitDamageTypeHero, c_unitDamageTypeBasic) >= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMerc, c_unitDamageTypeBasic) >= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMonster, c_unitDamageTypeBasic) >= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeSummon, c_unitDamageTypeBasic) >= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeStructure, c_unitDamageTypeBasic) >= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMinion, c_unitDamageTypeBasic) >= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeHero, c_unitDamageTypeAbility) >= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMerc, c_unitDamageTypeAbility) >= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMonster, c_unitDamageTypeAbility) >= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeSummon, c_unitDamageTypeAbility) >= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeStructure, c_unitDamageTypeAbility) >= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMinion, c_unitDamageTypeAbility) >= 0.0)) { // libGame_gf_HeroSpecificStatTrackerOther(EventUnitTotalDamageMitigated(), UnitGetOwner(EventUnit()), UnitGetOwner(EventUnit()), "ArmorPositive", null, ""); } - else if ((UnitGetArmorValue(EventUnit(), c_unitDamageTypeHero, c_unitDamageTypeBasic) <= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMerc, c_unitDamageTypeBasic) <= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMonster, c_unitDamageTypeBasic) <= 0.0) + else if ((UnitGetArmorValue(EventUnit(), c_unitDamageTypeHero, c_unitDamageTypeBasic) <= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMerc, c_unitDamageTypeBasic) <= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMonster, c_unitDamageTypeBasic) <= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeSummon, c_unitDamageTypeBasic) <= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeStructure, c_unitDamageTypeBasic) <= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMinion, c_unitDamageTypeBasic) <= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeHero, c_unitDamageTypeAbility) <= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMerc, c_unitDamageTypeAbility) <= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMonster, c_unitDamageTypeAbility) <= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeSummon, c_unitDamageTypeAbility) <= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeStructure, c_unitDamageTypeAbility) <= 0.0) && (UnitGetArmorValue(EventUnit(), c_unitDamageTypeMinion, c_unitDamageTypeAbility) <= 0.0)) { @@ -48793,12 +49368,16 @@ bool libGame_gt_HeroDamageTracking_Func (bool testConds, bool runActions) { } } + if (libGame_gv_HeroSpecificStoredDamageMitigated[UnitGetOwner(EventUnit())] != 0.0) { + libGame_gv_TallyArmorModified(EventUnitDamageEffect(), UnitGetType(EventUnit()), (EventUnitDamageAmount() + EventUnitDamageBehaviorShield()), libGame_gv_HeroSpecificStoredDamageMitigated[UnitGetOwner(EventUnit())], (EventUnitDamageAttemptedVitals() + EventUnitDamageBehaviorShield()), EventPlayer(), lv_eventUnitDamageSourcePlayer, EventUnit()); + } + if ((CatalogFieldValueGetAsFixed(c_gameCatalogEffect, EventUnitDamageEffect(), "Flags[" + "NoFractionDealtBonus" + "]", lv_eventUnitDamageSourcePlayer) == 0.0) && ((lv_eventUnitDamageSourcePlayer >= 1) && (lv_eventUnitDamageSourcePlayer <= libCore_gv_bALMaxPlayers))) { - if ((CatalogFieldValueGet(c_gameCatalogEffect, EventUnitDamageEffect(), "Kind", UnitGetOwner(EventUnitDamageSourceUnit())) == "Ability") && (libGame_gv_DamageDealtFractionAbility(EventUnitDamageSourceUnit(), EventUnitDamageEffect(), false) != 0.0)) { - libGame_gv_TallyDamageDealtFraction(EventUnitDamageEffect(), (EventUnitDamageAmount() + EventUnitDamageBehaviorShield()), EventUnit(), EventUnitDamageSourceUnit(), lv_eventPlayer, lv_eventUnitDamageSourcePlayer, libGame_gv_DamageDealtFractionAbility(EventUnitDamageSourceUnit(), EventUnitDamageEffect(), false)); + if ((CatalogFieldValueGet(c_gameCatalogEffect, EventUnitDamageEffect(), "Kind", UnitGetOwner(EventUnitDamageSourceUnit())) == "Ability") && (libGame_gv_DamageDealtFractionAbility(EventUnitDamageSourceUnit(), EventUnitDamageEffect(), false, true) != 0.0)) { + libGame_gv_TallyDamageDealtFraction(EventUnitDamageEffect(), (EventUnitDamageAmount() + EventUnitDamageBehaviorShield()), EventUnit(), EventUnitDamageSourceUnit(), lv_eventPlayer, lv_eventUnitDamageSourcePlayer, libGame_gv_DamageDealtFractionAbility(EventUnitDamageSourceUnit(), EventUnitDamageEffect(), false, true)); } - else if ((CatalogFieldValueGet(c_gameCatalogEffect, EventUnitDamageEffect(), "Kind", UnitGetOwner(EventUnitDamageSourceUnit())) == "Basic") && (libGame_gv_DamageDealtFractionBasic(EventUnitDamageSourceUnit(), EventUnitDamageEffect(), false) != 0.0)) { - libGame_gv_TallyDamageDealtFraction(EventUnitDamageEffect(), (EventUnitDamageAmount() + EventUnitDamageBehaviorShield()), EventUnit(), EventUnitDamageSourceUnit(), lv_eventPlayer, lv_eventUnitDamageSourcePlayer, libGame_gv_DamageDealtFractionBasic(EventUnitDamageSourceUnit(), EventUnitDamageEffect(), false)); + else if ((CatalogFieldValueGet(c_gameCatalogEffect, EventUnitDamageEffect(), "Kind", UnitGetOwner(EventUnitDamageSourceUnit())) == "Basic") && (libGame_gv_DamageDealtFractionBasic(EventUnitDamageSourceUnit(), EventUnitDamageEffect(), false, true) != 0.0)) { + libGame_gv_TallyDamageDealtFraction(EventUnitDamageEffect(), (EventUnitDamageAmount() + EventUnitDamageBehaviorShield()), EventUnit(), EventUnitDamageSourceUnit(), lv_eventPlayer, lv_eventUnitDamageSourcePlayer, libGame_gv_DamageDealtFractionBasic(EventUnitDamageSourceUnit(), EventUnitDamageEffect(), false, true)); } } if (UnitGetType(EventUnitDamageSourceUnit()) == "MercSummonerLanerMinionDummy") { @@ -50142,6 +50721,9 @@ bool libGame_gt_TownMidLateGamePowerTransitionOn_Func (bool testConds, bool runA if ((libGame_gv_trackingHeroCooldowns == false) && (libGame_gv_gameOver == false)) { libGame_gf_trackHeroCooldowns(); } + if ((libGame_gv_timeTravelling == false) && (libGame_gv_gameOver == false) && (libGame_gv_trackingHeroCooldowns == true)) { + libGame_gf_travelThroughTime(); + } // } } return true; diff --git a/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameLib_h.galaxy b/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameLib_h.galaxy index 683fb01..f20901d 100644 --- a/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameLib_h.galaxy +++ b/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameLib_h.galaxy @@ -898,104 +898,115 @@ struct libGame_gs_WatchTowers { }; struct libGame_gs_HeroSpecificScoreValues { - fixed lv_supportOne; - fixed lv_supportTwo; - fixed lv_supportThree; - fixed lv_supportFour; - fixed lv_supportFive; - fixed lv_supportSix; - fixed lv_supportSeven; - fixed lv_supportEight; - fixed lv_supportNine; - fixed lv_supportTen; - fixed lv_supportEleven; - fixed lv_supportTwelve; - fixed lv_supportThirteen; - fixed lv_supportFourteen; - fixed lv_supportFifteen; - fixed lv_supportSixteen; - fixed lv_scoreOne; - fixed lv_scoreTwo; - fixed lv_scoreThree; - fixed lv_scoreFour; - fixed lv_scoreFive; - fixed lv_scoreSix; - fixed lv_scoreSeven; - fixed lv_scoreEight; - fixed lv_scoreNine; - fixed lv_scoreTen; - fixed lv_scoreEleven; - fixed lv_scoreTwelve; - fixed lv_scoreThirteen; - fixed lv_scoreFourteen; - fixed lv_scoreFifteen; - fixed lv_scoreSixteen; - int lv_accuracyOne; - int lv_accuracyTwo; - int lv_accuracyThree; - int lv_accuracyFour; - int lv_accuracyFive; - int lv_accuracySix; - int lv_accuracySeven; - int lv_accuracyEight; - int lv_accuracyNine; - int lv_accuracyTen; - int lv_accuracyEleven; - int lv_accuracyTwelve; - int lv_accuracyThirteen; - int lv_accuracyFourteen; - fixed lv_scoreHealingToOne; - fixed lv_scoreHealingToTwo; - fixed lv_scoreHealingToThree; - fixed lv_scoreHealingToFour; - fixed lv_scoreHealingToFive; - fixed lv_scoreHealingToSix; - fixed lv_scoreHealingToSeven; - fixed lv_scoreHealingToEight; - fixed lv_scoreHealingToNine; - fixed lv_scoreHealingToTen; - fixed lv_scoreDamageToOne; - fixed lv_scoreDamageToTwo; - fixed lv_scoreDamageToThree; - fixed lv_scoreDamageToFour; - fixed lv_scoreDamageToFive; - fixed lv_scoreDamageToSix; - fixed lv_scoreDamageToSeven; - fixed lv_scoreDamageToEight; - fixed lv_scoreDamageToNine; - fixed lv_scoreDamageToTen; - fixed lv_scoreArmorPositive; - fixed lv_scoreArmorNegative; - fixed lv_scoreArmorFallback; - fixed lv_scoreFountainHealing; - fixed lv_scoreGlobeHealing; - fixed lv_scoreBaseHealing; - fixed lv_scorePhysicalDamage; - fixed lv_scoreSpellDamage; - fixed lv_scoreDeathXP; - fixed lv_scoreGlobeXP; - fixed lv_scoreTinyGlobeXP; - fixed lv_scoreLastHitXP; - fixed lv_scoreGlobes; - fixed lv_scoreTinyGlobes; - fixed lv_scoreLastHits; - fixed lv_scoreVisible; - fixed lv_scorePhysArmorPositive; - fixed lv_scorePhysArmorNegative; - fixed lv_scorePhysArmorFallback; - fixed lv_scoreSpellArmorPositive; - fixed lv_scoreSpellArmorNegative; - fixed lv_scoreSpellArmorFallback; - fixed lv_scorePhysDamageIncreased; - fixed lv_scorePhysDamageDecreased; - fixed lv_scoreSpellDamageIncreased; - fixed lv_scoreSpellDamageDecreased; - fixed lv_scoreHealTaken; - fixed lv_scoreShieldsDamaged; - fixed lv_scoreBlindsPrevented; - fixed lv_scoreLeechTaken; - fixed lv_scorePhysTaken; - fixed lv_scoreSpellTaken; + fixed lv_supportOne; + fixed lv_supportTwo; + fixed lv_supportThree; + fixed lv_supportFour; + fixed lv_supportFive; + fixed lv_supportSix; + fixed lv_supportSeven; + fixed lv_supportEight; + fixed lv_supportNine; + fixed lv_supportTen; + fixed lv_supportEleven; + fixed lv_supportTwelve; + fixed lv_supportThirteen; + fixed lv_supportFourteen; + fixed lv_supportFifteen; + fixed lv_supportSixteen; + fixed lv_scoreOne; + fixed lv_scoreTwo; + fixed lv_scoreThree; + fixed lv_scoreFour; + fixed lv_scoreFive; + fixed lv_scoreSix; + fixed lv_scoreSeven; + fixed lv_scoreEight; + fixed lv_scoreNine; + fixed lv_scoreTen; + fixed lv_scoreEleven; + fixed lv_scoreTwelve; + fixed lv_scoreThirteen; + fixed lv_scoreFourteen; + fixed lv_scoreFifteen; + fixed lv_scoreSixteen; + int lv_accuracyOne; + int lv_accuracyTwo; + int lv_accuracyThree; + int lv_accuracyFour; + int lv_accuracyFive; + int lv_accuracySix; + int lv_accuracySeven; + int lv_accuracyEight; + int lv_accuracyNine; + int lv_accuracyTen; + int lv_accuracyEleven; + int lv_accuracyTwelve; + int lv_accuracyThirteen; + int lv_accuracyFourteen; + fixed lv_scoreHealingToOne; + fixed lv_scoreHealingToTwo; + fixed lv_scoreHealingToThree; + fixed lv_scoreHealingToFour; + fixed lv_scoreHealingToFive; + fixed lv_scoreHealingToSix; + fixed lv_scoreHealingToSeven; + fixed lv_scoreHealingToEight; + fixed lv_scoreHealingToNine; + fixed lv_scoreHealingToTen; + fixed lv_scoreDamageToOne; + fixed lv_scoreDamageToTwo; + fixed lv_scoreDamageToThree; + fixed lv_scoreDamageToFour; + fixed lv_scoreDamageToFive; + fixed lv_scoreDamageToSix; + fixed lv_scoreDamageToSeven; + fixed lv_scoreDamageToEight; + fixed lv_scoreDamageToNine; + fixed lv_scoreDamageToTen; + fixed lv_scoreArmorPositive; + fixed lv_scoreArmorNegative; + fixed lv_scoreArmorFallback; + fixed lv_scoreFountainHealing; + fixed lv_scoreGlobeHealing; + fixed lv_scoreBaseHealing; + fixed lv_scorePhysicalDamage; + fixed lv_scoreSpellDamage; + fixed lv_scoreDeathXP; + fixed lv_scoreGlobeXP; + fixed lv_scoreTinyGlobeXP; + fixed lv_scoreLastHitXP; + fixed lv_scoreGlobes; + fixed lv_scoreTinyGlobes; + fixed lv_scoreLastHits; + fixed lv_scoreVisible; + fixed lv_scorePhysArmorPositive; + fixed lv_scorePhysArmorNegative; + fixed lv_scorePhysArmorFallback; + fixed lv_scoreSpellArmorPositive; + fixed lv_scoreSpellArmorNegative; + fixed lv_scoreSpellArmorFallback; + fixed lv_scorePhysDamageIncreased; + fixed lv_scorePhysDamageDecreased; + fixed lv_scoreSpellDamageIncreased; + fixed lv_scoreSpellDamageDecreased; + fixed lv_scoreHealTaken; + fixed lv_scoreShieldsDamaged; + fixed lv_scoreBlindsPrevented; + fixed lv_scoreLeechTaken; + fixed lv_scorePhysTaken; + fixed lv_scoreSpellTaken; +}; + +struct libGame_gs_timeTravelValues { + fixed[4] lv_damageDealtAbility; + fixed[4] lv_damageDealtPhysical; + fixed[4][7][3] lv_armor; + bool[4] lv_slowed; + bool[4] lv_stunned; + bool[4] lv_silenced; + bool[4] lv_rooted; + fixed lv_timeStored; }; // Variable Declarations @@ -1187,6 +1198,10 @@ fixed libGame_gv_vehicleDragonKnightBullRushCutoffDistance; int libGame_gv_watchTowersCurrentCount; libGame_gs_WatchTowers[libGame_gv_watchTowersMaxCount + 1] libGame_gv_watchTowers; libGame_gs_HeroSpecificScoreValues[libCore_gv_bALMaxPlayers + 1] libGame_gv_heroSpecificScoreValues; +libGame_gs_timeTravelValues[libCore_gv_bALMaxPlayers + 1][4] libGame_gv_timeTravelValues; +int[libCore_gv_bALMaxPlayers + 1] libGame_gv_timeTravelActiveUnit; +int libGame_gv_timeTravelActiveLoop; +int libGame_gv_timeTravelPreviousLoop; fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredValue1; fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredValue2; fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredValue3; @@ -1194,6 +1209,9 @@ fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredValue4; fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredValue5; fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredValue6; fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredValue7; +fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredValue8; +fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredValue9; +fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredValue10; unit[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredUnit1; unit[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredUnit2; fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroQButtonTimestamp; @@ -1204,15 +1222,13 @@ fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroDButtonTimestamp; fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredDamageMitigated; fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_HeroSpecificStoredDamageMitigatedTimestamp; fixed[libCore_gv_bALMaxPlayers + 1] libGame_gv_TimeSpentInVision; -int[libCore_gv_bALMaxPlayers + 1] libGame_gv_SupportFifteenLabel; -int[libCore_gv_bALMaxPlayers + 1] libGame_gv_SupportSixteenLabel; -int[libCore_gv_bALMaxPlayers + 1] libGame_gv_DamageFifteenLabel; unitgroup libGame_gv_parsedMercenaries; unitgroup[libCore_gv_bALMaxPlayers + 1] libGame_gv_ownedMercenaries; bool libGame_gv_heroSpecificDebug; string libGame_gv_heroSpecificDebugString; bool libGame_gv_isCustomReplayLogic; bool libGame_gv_trackingHeroCooldowns; +bool libGame_gv_timeTravelling; bool libGame_gv_initializedOBSUI; // string[libCore_gv_bALMaxPlayers + 1] libGame_gv_StoredScoreString; @@ -1861,13 +1877,15 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ void libGame_gf_HeroSpecificStatTrackerOther (fixed lp_scoreValue, int lp_casterPlayer, int lp_targetPlayer, string lp_inputData, unit lp_extraDataUnit, string lp_extraDataString); void libGame_gf_TallyHeroSpecificStatShared (fixed lp_scoreValue, int lp_casterPlayer, string lp_scoreString, string lp_source); fixed libGame_gv_GetHealDealtAsFixed (unit lp_contextUnit); -fixed libGame_gv_DamageDealtFractionBasic(unit lp_contextUnit, string lp_damageEffect, bool lp_cap); -fixed libGame_gv_DamageDealtFractionAbility(unit lp_contextUnit, string lp_damageEffect, bool lp_cap); +fixed libGame_gv_DamageDealtFractionBasic(unit lp_contextUnit, string lp_damageEffect, bool lp_cap, bool lp_includeAlreadyTracked); +fixed libGame_gv_DamageDealtFractionAbility(unit lp_contextUnit, string lp_damageEffect, bool lp_cap, bool lp_includeAlreadyTracked); void libGame_gv_TallyDamageDealtFraction(string lp_damageEffect, fixed lp_damageValue, unit lp_targetUnit, unit lp_casterUnit, int lp_targetPlayer, int lp_casterPlayer, fixed lp_damageModifier); +void libGame_gv_TallyArmorModified(string lp_damageEffect, string lp_attackerType, fixed lp_damageValue, fixed lp_damageMitigated, fixed lp_damageAttempted, int lp_attackedPlayer, int lp_attackingPlayer, unit lp_attackedUnit); void libGame_gf_TeamDamageTracker (string lp_damageEffect, fixed lp_damageValue, unit lp_targetUnit, unit lp_casterUnit, int lp_targetPlayer, int lp_casterPlayer); void libGame_gf_exportStatsForPlayer (int lp_player); string libGame_gf_statsForPlayerHeroSpecificString (int lp_player); void libGame_gf_trackHeroCooldowns (); +void libGame_gf_travelThroughTime (); fixed libGame_gf_FetchAbilityCooldownTime (unit lp_unit, string lp_ability, int lp_player, bool lp_displayDebug); void libGame_gv_trackHeroCooldowns (unit lp_casterUnit, string lp_abilityName, fixed lp_cooldownNewValue, fixed lp_cooldownOldValue, fixed lp_interruptCost); void libGame_gv_trackHeroCooldownsReduced (unit lp_casterUnit, string lp_abilityName, fixed lp_cooldownNewValue, fixed lp_cooldownOldValue, fixed lp_interruptCost); diff --git a/maps/Heroes/CustomReplayMaps/DragonShire.StormMap b/maps/Heroes/CustomReplayMaps/DragonShire.StormMap index eaaef03..44ee61b 100644 Binary files a/maps/Heroes/CustomReplayMaps/DragonShire.StormMap and b/maps/Heroes/CustomReplayMaps/DragonShire.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/GardenofTerror.StormMap b/maps/Heroes/CustomReplayMaps/GardenofTerror.StormMap index f975cba..5cbf0c1 100644 Binary files a/maps/Heroes/CustomReplayMaps/GardenofTerror.StormMap and b/maps/Heroes/CustomReplayMaps/GardenofTerror.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/HanamuraTemple.StormMap b/maps/Heroes/CustomReplayMaps/HanamuraTemple.StormMap index c279043..8ca4faf 100644 Binary files a/maps/Heroes/CustomReplayMaps/HanamuraTemple.StormMap and b/maps/Heroes/CustomReplayMaps/HanamuraTemple.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/HauntedMines.StormMap b/maps/Heroes/CustomReplayMaps/HauntedMines.StormMap index 2797a6d..f0cb777 100644 Binary files a/maps/Heroes/CustomReplayMaps/HauntedMines.StormMap and b/maps/Heroes/CustomReplayMaps/HauntedMines.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/InfernalShrines.StormMap b/maps/Heroes/CustomReplayMaps/InfernalShrines.StormMap index 76f1513..9604a58 100644 Binary files a/maps/Heroes/CustomReplayMaps/InfernalShrines.StormMap and b/maps/Heroes/CustomReplayMaps/InfernalShrines.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/LostCavern.StormMap b/maps/Heroes/CustomReplayMaps/LostCavern.StormMap index ed77fe5..2c2f86f 100644 Binary files a/maps/Heroes/CustomReplayMaps/LostCavern.StormMap and b/maps/Heroes/CustomReplayMaps/LostCavern.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/SilverCity.StormMap b/maps/Heroes/CustomReplayMaps/SilverCity.StormMap index 64b2166..95e51b6 100644 Binary files a/maps/Heroes/CustomReplayMaps/SilverCity.StormMap and b/maps/Heroes/CustomReplayMaps/SilverCity.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/SkyTemple.StormMap b/maps/Heroes/CustomReplayMaps/SkyTemple.StormMap index 9a685e3..ffbd4ac 100644 Binary files a/maps/Heroes/CustomReplayMaps/SkyTemple.StormMap and b/maps/Heroes/CustomReplayMaps/SkyTemple.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/TomboftheSpiderQueen.StormMap b/maps/Heroes/CustomReplayMaps/TomboftheSpiderQueen.StormMap index d2d4ab4..3cdb07c 100644 Binary files a/maps/Heroes/CustomReplayMaps/TomboftheSpiderQueen.StormMap and b/maps/Heroes/CustomReplayMaps/TomboftheSpiderQueen.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/TowersofDoom.StormMap b/maps/Heroes/CustomReplayMaps/TowersofDoom.StormMap index d4e7a22..3270171 100644 Binary files a/maps/Heroes/CustomReplayMaps/TowersofDoom.StormMap and b/maps/Heroes/CustomReplayMaps/TowersofDoom.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/VolskayaFoundry.StormMap b/maps/Heroes/CustomReplayMaps/VolskayaFoundry.StormMap index 03147ed..95c6026 100644 Binary files a/maps/Heroes/CustomReplayMaps/VolskayaFoundry.StormMap and b/maps/Heroes/CustomReplayMaps/VolskayaFoundry.StormMap differ diff --git a/maps/Heroes/CustomReplayMaps/WarheadJunction.StormMap b/maps/Heroes/CustomReplayMaps/WarheadJunction.StormMap index 59c251e..0b1b854 100644 Binary files a/maps/Heroes/CustomReplayMaps/WarheadJunction.StormMap and b/maps/Heroes/CustomReplayMaps/WarheadJunction.StormMap differ