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)) {