diff --git a/changelog.md b/changelog.md index e82317f..2320b15 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,27 @@ -# v0.29 (**2022-04-29**) +# v0.29a + +* Statistics + * Sgt. Hammer now tracks the bonus damage from Mechanical Knowhow, split into Heroic targets and non-Heroic targets + * Fixed an issue where Alexstrasza's Cleansing Flame would not be counted correctly. Thanks, Dragonqueen Form + * Fixed an issue where Blaze's Adrenaline Stimpack casts would not be be in the correct location + * Fixed an issue where Diablo would display error text when Shadow Charge was interrupted before hitting an enemy + +* UI + * Top Bar + * Anub'arak's Locust Swarm remaining duration is now displayed as a buff if selected as a talent + * Chen's Wandering Keg remaining duration is now displayed as a buff if selected as a talent + * Diablo's Lightning Breath remaining duration is now displayed as a buff if selected as a talent + * D.Va's Bunny Hop remaining duration is now displayed as a buff if selected as a talent. This will be hidden when it is not decaying + * E.T.C.'s Mosh Pit remaining duration is now displayed as a buff if selected as a talent + * Blaze's Combustion channel timer is now displayed as a buff if selected as a talent, this will fill the duration indicator rather than empty it + * Gall's Twisting Nether channel timer is now displayed as a buff if selected as a talent, this will fill the duration indicator rather than empty it + * Imperius's Angelic Armaments reactivation delay is now displayed as a buff if selected as a talent, this will fill the duration indicator rather than empty it + * Dehaka's Adaption buff display will now fill the duration indicator, rather than empty it + * Bug Fixes + * Fixed an issue with Diablo's thirteenth score entry in the secondary hero-specific stat tab not referencing the correct string + + +## v0.29 (**2022-04-29**) * Statistics * Updated Alterac Pass to the version added in build 87990 diff --git a/conversion/dragAll_details.bat b/conversion/dragAll_details.bat index e696071..d102fae 100644 --- a/conversion/dragAll_details.bat +++ b/conversion/dragAll_details.bat @@ -12,7 +12,6 @@ echo extracting tracker events echo finding map name in tracker events - findstr /c:"MapCursedHollow" "%mpqdirectory%\replay.tracker.events" if %ERRORLEVEL%==0 ( echo string found cursed @@ -191,7 +190,6 @@ if %ERRORLEVEL%==0 ( GOTO found ) - echo failed to discern battleground, please use the manual converter. del "%mpqdirectory%\replay.tracker.events" diff --git a/interface/CustomScoreboard.StormInterface/Base.StormData/UI/Layout/CustomPanelSpazzo.StormLayout b/interface/CustomScoreboard.StormInterface/Base.StormData/UI/Layout/CustomPanelSpazzo.StormLayout index 4a06d0f..419335f 100644 --- a/interface/CustomScoreboard.StormInterface/Base.StormData/UI/Layout/CustomPanelSpazzo.StormLayout +++ b/interface/CustomScoreboard.StormInterface/Base.StormData/UI/Layout/CustomPanelSpazzo.StormLayout @@ -7766,6 +7766,7 @@ + diff --git a/interface/CustomScoreboard.StormInterface/Base.StormData/UI/Layout/SpazzoCustomTopBarQuests.StormLayout b/interface/CustomScoreboard.StormInterface/Base.StormData/UI/Layout/SpazzoCustomTopBarQuests.StormLayout index 182d653..db4cfe3 100644 --- a/interface/CustomScoreboard.StormInterface/Base.StormData/UI/Layout/SpazzoCustomTopBarQuests.StormLayout +++ b/interface/CustomScoreboard.StormInterface/Base.StormData/UI/Layout/SpazzoCustomTopBarQuests.StormLayout @@ -2731,6 +2731,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2778,15 +2881,6 @@ - - - - - - - - - @@ -2803,6 +2897,7 @@ + @@ -2890,6 +2985,7 @@ + diff --git a/interface/CustomScoreboard.StormInterface/enus.StormData/LocalizedData/GameStrings.txt b/interface/CustomScoreboard.StormInterface/enus.StormData/LocalizedData/GameStrings.txt index 6c9b762..244ddbe 100644 --- a/interface/CustomScoreboard.StormInterface/enus.StormData/LocalizedData/GameStrings.txt +++ b/interface/CustomScoreboard.StormInterface/enus.StormData/LocalizedData/GameStrings.txt @@ -1,4 +1,4 @@ -UI/Spazzo/UIVersion=v0.29 +UI/Spazzo/UIVersion=v0.29a UI/Spazzo/UIWARNING=WARNING UI/Spazzo/UIWARNINGTOOLTIP=Game is detected as having ended, statistics may be incorrect, please rewind to after the core is destroyed, but before these images become visible! @@ -4610,8 +4610,8 @@ UI/SpazzoDamage/SgtHammer/ScoreSix=Concussive Blast Damage to Heroes UI/SpazzoDamage/SgtHammer/ScoreSeven=Concussive Blast Damage to non-Heroes UI/SpazzoDamage/SgtHammer/ScoreEight=Napalm Strike, BFG Damage to Heroes UI/SpazzoDamage/SgtHammer/ScoreNine=Napalm Strike, BFG Damage to non-Heroes -UI/SpazzoDamage/SgtHammer/ScoreTen=Giant Killer Damage -UI/SpazzoDamage/SgtHammer/ScoreEleven=Unused +UI/SpazzoDamage/SgtHammer/ScoreTen=Mechanical Know-How Bonus Damage to Heroes, Giant Killer Damage +UI/SpazzoDamage/SgtHammer/ScoreEleven=Mechanical Know-How Bonus Damage to non-Heroes UI/SpazzoDamage/SgtHammer/ScoreTwelve=Unused UI/SpazzoAccuracy/SgtHammer/ScoreOne=Spider Mine Casts UI/SpazzoAccuracy/SgtHammer/ScoreTwo=Concussive Blast Casts diff --git a/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameLib.galaxy b/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameLib.galaxy index cb352b9..37c0402 100644 --- a/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameLib.galaxy +++ b/maps/Heroes/CustomReplayMaps/CustomLogicFolder/Base.StormData/TriggerLibs/GameLib.galaxy @@ -12957,9 +12957,11 @@ void libGame_gf_CalculateLeechDamage (string lp_damageEffect, fixed lp_damageVal } } else { - UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Expected Leech is less than actual leech! Effect: ") + StringToText(lp_damageEffect))); - UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText(lv_leechState)); - UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Leech Value: ") + FixedToText(lp_leechValue, 2) + StringToText(" Expected Leech Value: ") + FixedToText(lv_expectedLeechValue, 2) + StringToText(" Calculated Leech Fraction: ") + FixedToText(lv_calculatedActualLeechFraction, 2))); + if ((libGame_gv_heroSpecificDebugString != "Ignore")) { + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Expected Leech is less than actual leech! Effect: ") + StringToText(lp_damageEffect))); + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText(lv_leechState)); + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Leech Value: ") + FixedToText(lp_leechValue, 2) + StringToText(" Expected Leech Value: ") + FixedToText(lv_expectedLeechValue, 2) + StringToText(" Calculated Leech Fraction: ") + FixedToText(lv_calculatedActualLeechFraction, 2))); + } } } else if ((lv_expectedLeechValue >= lp_leechValue)) { @@ -13069,9 +13071,11 @@ void libGame_gf_CalculateLeechDamage (string lp_damageEffect, fixed lp_damageVal } } if ((lv_expectedLeechValue > lp_leechValue)) { - UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Expected Leech is higher than actual leech! Effect: ") + StringToText(lp_damageEffect))); - UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText(lv_leechState)); - UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Leech Value: ") + FixedToText(lp_leechValue, 2) + StringToText(" Expected Leech Value: ") + FixedToText(lv_expectedLeechValue, 4) + StringToText(" Calculated Leech Fraction: ") + FixedToText(lv_calculatedActualLeechFraction, 2))); + if ((libGame_gv_heroSpecificDebugString != "Ignore")) { + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Expected Leech is higher than actual leech! Effect: ") + StringToText(lp_damageEffect))); + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText(lv_leechState)); + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("Leech Value: ") + FixedToText(lp_leechValue, 2) + StringToText(" Expected Leech Value: ") + FixedToText(lv_expectedLeechValue, 4) + StringToText(" Calculated Leech Fraction: ") + FixedToText(lv_calculatedActualLeechFraction, 2))); + } } // if ((lv_expectedLeechValue < 0.0)) { // UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, (StringToText("More Leech was subtracted than leech was present! Effect: ") + StringToText(lp_damageEffect) + StringToText(" Expected Leech Value: ") + FixedToText(lv_expectedLeechValue, 2))); @@ -16895,6 +16899,9 @@ void libGame_gf_HeroSpecificStatTrackerHealed (fixed lp_healedValue, string lp_h if ((lp_healEffect == "DiabloFireStompEternalFlamesManaRestore")) { lv_primaryScoreString = "TalentOne"; } + if ((lp_healEffect == "DiabloShadowChargeNotUnitImpactedRefund")) { + lv_primaryScoreString = "Discard"; + } } if ((UnitGetType(libGame_gv_players[lp_casterPlayer].lv_heroUnit) == "HeroThrall")) { // if ((lp_healEffect == "ThrallChainLightningRollingThunderCreateHealer")) { @@ -29591,25 +29598,49 @@ void libGame_gf_HeroSpecificStatTrackerDamage (string lp_damageEffect, fixed lp_ if ((lp_damageEffect == "SiegeWeaponBaseDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreOne"; + if ((UnitHasBehavior2(lp_targetUnit, "SgtHammerNeosteelPlatingMechanicalKnowhowDamageCarryBuff") == true)) { + lv_secondaryScoreOverride = libGame_gv_DamageCalculateMMDDFAF(lp_damageEffect, lp_damageValue, lp_damageAttempted, lp_casterUnit, lp_targetUnit, "SgtHammerMechanicalKnowhow"); + lv_secondaryScoreString = "ScoreTen"; + } } else { lv_primaryScoreString = "ScoreThree"; + if ((UnitHasBehavior2(lp_targetUnit, "SgtHammerNeosteelPlatingMechanicalKnowhowDamageCarryBuff") == true)) { + lv_secondaryScoreOverride = libGame_gv_DamageCalculateMMDDFAF(lp_damageEffect, lp_damageValue, lp_damageAttempted, lp_casterUnit, lp_targetUnit, "SgtHammerMechanicalKnowhow"); + lv_secondaryScoreString = "ScoreEleven"; + } } } if ((lp_damageEffect == "SiegeWeaponSplashDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreTwo"; + if ((UnitHasBehavior2(lp_targetUnit, "SgtHammerNeosteelPlatingMechanicalKnowhowDamageCarryBuff") == true)) { + lv_secondaryScoreOverride = libGame_gv_DamageCalculateMMDDFAF(lp_damageEffect, lp_damageValue, lp_damageAttempted, lp_casterUnit, lp_targetUnit, "SgtHammerMechanicalKnowhow"); + lv_secondaryScoreString = "ScoreTen"; + } } else { lv_primaryScoreString = "ScoreThree"; + if ((UnitHasBehavior2(lp_targetUnit, "SgtHammerNeosteelPlatingMechanicalKnowhowDamageCarryBuff") == true)) { + lv_secondaryScoreOverride = libGame_gv_DamageCalculateMMDDFAF(lp_damageEffect, lp_damageValue, lp_damageAttempted, lp_casterUnit, lp_targetUnit, "SgtHammerMechanicalKnowhow"); + lv_secondaryScoreString = "ScoreEleven"; + } } } if ((lp_damageEffect == "SgtHammerTankAttackDamage")) { if ((UnitTypeTestAttribute(UnitGetType(lp_targetUnit), c_unitAttributeHeroic) == true)) { lv_primaryScoreString = "ScoreOne"; + if ((UnitHasBehavior2(lp_targetUnit, "SgtHammerNeosteelPlatingMechanicalKnowhowDamageCarryBuff") == true)) { + lv_secondaryScoreOverride = libGame_gv_DamageCalculateMMDDFAF(lp_damageEffect, lp_damageValue, lp_damageAttempted, lp_casterUnit, lp_targetUnit, "SgtHammerMechanicalKnowhow"); + lv_secondaryScoreString = "ScoreTen"; + } } else { lv_primaryScoreString = "ScoreThree"; + if ((UnitHasBehavior2(lp_targetUnit, "SgtHammerNeosteelPlatingMechanicalKnowhowDamageCarryBuff") == true)) { + lv_secondaryScoreOverride = libGame_gv_DamageCalculateMMDDFAF(lp_damageEffect, lp_damageValue, lp_damageAttempted, lp_casterUnit, lp_targetUnit, "SgtHammerMechanicalKnowhow"); + lv_secondaryScoreString = "ScoreEleven"; + } } } if ((lp_damageEffect == "SgtHammerSpiderMinesDamage")) { @@ -34559,7 +34590,7 @@ int libGame_gf_unitGroupCountRaynorInspire (unitgroup lp_generatedUnitGroup, str void libGame_gf_exportStatsForPlayer (int lp_player) { string lv_scoreString; - lv_scoreString = "Version 0.28 " + "[ " + "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.29a " + "[ " + "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); @@ -36528,6 +36559,10 @@ void libGame_gv_trackHeroCooldowns (unit lp_casterUnit, string lp_abilityName, f } if ((lp_abilityName == "AlexstraszaLifebinder") || (lp_abilityName == "AlexstraszaCleansingFlame")) { lv_scoreString = "AccuracyEight"; + if (libGame_gv_HeroRButtonTimestamp[lv_casterPlayerOverride] == GameGetMissionTime()) { + lv_scoreString = "Discard"; + } + libGame_gv_HeroRButtonTimestamp[lv_casterPlayerOverride] = GameGetMissionTime(); if (((lp_cooldownNewValue < (lp_interruptCost + 0.5))) && (lp_abilityName == "AlexstraszaCleansingFlame")) { lv_scoreString = "Discard"; } @@ -36538,6 +36573,10 @@ void libGame_gv_trackHeroCooldowns (unit lp_casterUnit, string lp_abilityName, f if ((lp_abilityName == "AlexstraszaBlessingOfTheRed")) { lv_scoreString = "AccuracyTen"; } + if (lp_abilityName == "AlexstraszaCleansingFlameDragonqueen") { + libGame_gv_HeroRButtonTimestamp[lv_casterPlayerOverride] = GameGetMissionTime(); + lv_scoreString = "Discard"; + } } else if ((lv_heroUnitType == "HeroAna")) { if ((lp_abilityName == "AnaHealingDart")) { @@ -36890,7 +36929,7 @@ void libGame_gv_trackHeroCooldowns (unit lp_casterUnit, string lp_abilityName, f libGame_gv_HeroDButtonTimestamp[lv_casterPlayerOverride] = GameGetMissionTime(); } if ((lp_abilityName == "FirebatAdrenalineStimpack")) { - lv_scoreString = "ScoreFifteen"; + lv_scoreString = "ScoreFourteen"; } if ((lp_abilityName == "FirebatEnduranceStimpack")) { lv_scoreString = "ScoreFourteen"; @@ -40520,7 +40559,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.28 ") + StringToText("Interface Version: ") + StringExternal("UI/Spazzo/UIVersion")); + UIDisplayMessage(PlayerGroupAll(), c_messageAreaDebug, StringToText("Stats Version: v0.29a ") + StringToText("Interface Version: ") + StringExternal("UI/Spazzo/UIVersion")); // Well, I tried to add team coloured globes. // CatalogFieldValueSet(c_gameCatalogActor, "ExperienceGlobeAlly", "ModelAspectSets[" + IntToString(0) + "].Aspects[" + IntToString(0) + "].ModelOwnerHasPlayerId", libCore_gv_cOMPUTER_TeamOrder, "11"); // CatalogFieldValueSet(c_gameCatalogActor, "ExperienceGlobeAlly", "ModelAspectSets[" + IntToString(0) + "].Aspects[" + IntToString(0) + "].Person", libCore_gv_cOMPUTER_TeamOrder, "Observer"); @@ -42069,6 +42108,14 @@ fixed libGame_gv_DamageCalculateMMDDFAF(string lp_damageEffect, fixed lp_damageV lv_damageResult = ((lv_damageValuePerCatalog * (1.0 + CatalogFieldValueGetAsFixed(c_gameCatalogEffect, "RaynorHeroWeaponDamage", "MultiplicativeModifierArray[" + "CavalrysArrived" + "].Modifier", lv_casterPlayer))) - lv_damageValuePerCatalog); } + + if ((lp_inputData == "SgtHammerMechanicalKnowhow")) { + if ((lp_damageEffect == "SiegeWeaponBaseDamage") || (lp_damageEffect == "SiegeWeaponSplashDamage") || (lp_damageEffect == "SgtHammerTankAttackDamage")) { + lv_flatDamageModifier = 0.0; + } + + lv_damageResult = ((lv_damageValuePerCatalog * (1.0 + CatalogFieldValueGetAsFixed(c_gameCatalogEffect, "SiegeWeaponBaseDamage", "MultiplicativeModifierArray[" + "MechanicalKnowhow" + "].Modifier", lv_casterPlayer))) - lv_damageValuePerCatalog); + } if ((lp_inputData == "MedivhForceofMagic")) { if ((lp_damageEffect == "MedivhArcaneRiftDamage") && (libGame_gv_HeroSpecificStoredValue4[lv_casterPlayer] >= 40.0)) {