diff --git a/binaries/data/mods/public/gui/session/session.js b/binaries/data/mods/public/gui/session/session.js
index 174937204d..4ae43544ed 100644
--- a/binaries/data/mods/public/gui/session/session.js
+++ b/binaries/data/mods/public/gui/session/session.js
@@ -376,6 +376,11 @@ function onSimulationUpdate()
updateResearchDisplay();
updateBuildingPlacementPreview();
updateTimeElapsedCounter(simState);
+
+ // Update music state on basis of battle state.
+ var battleState = Engine.GuiInterfaceCall("GetBattleState", Engine.GetPlayerID());
+ if (battleState)
+ global.music.setState(global.music.states[battleState]);
}
function updateGroups()
diff --git a/binaries/data/mods/public/simulation/components/Attack.js b/binaries/data/mods/public/simulation/components/Attack.js
index b632e2fc88..460dfa19a4 100644
--- a/binaries/data/mods/public/simulation/components/Attack.js
+++ b/binaries/data/mods/public/simulation/components/Attack.js
@@ -698,7 +698,7 @@ Attack.prototype.CauseDamage = function(data)
}
Engine.PostMessage(data.target, MT_Attacked,
- { "attacker": this.entity, "target": data.target, "type": data.type });
+ { "attacker": this.entity, "target": data.target, "type": data.type, "damage": -targetState.change });
PlaySound("attack_impact", this.entity);
};
diff --git a/binaries/data/mods/public/simulation/components/GuiInterface.js b/binaries/data/mods/public/simulation/components/GuiInterface.js
index a6f5c9a6b1..8fb1544f56 100644
--- a/binaries/data/mods/public/simulation/components/GuiInterface.js
+++ b/binaries/data/mods/public/simulation/components/GuiInterface.js
@@ -605,6 +605,13 @@ GuiInterface.prototype.GetStartedResearch = function(player)
return ret;
}
+// Returns the battle state of the player.
+GuiInterface.prototype.GetBattleState = function(player)
+{
+ var cmpBattleDetection = QueryPlayerIDInterface(player, IID_BattleDetection);
+ return cmpBattleDetection.GetState();
+};
+
// Used to show a red square over GUI elements you can't yet afford.
GuiInterface.prototype.GetNeededResources = function(player, amounts)
{
@@ -1697,6 +1704,7 @@ var exposedFunctions = {
"IsTechnologyResearched": 1,
"CheckTechnologyRequirements": 1,
"GetStartedResearch": 1,
+ "GetBattleState": 1,
"GetNeededResources": 1,
"GetNextNotification": 1,
diff --git a/binaries/data/mods/public/simulation/components/Health.js b/binaries/data/mods/public/simulation/components/Health.js
index e200d80081..fac81db94c 100644
--- a/binaries/data/mods/public/simulation/components/Health.js
+++ b/binaries/data/mods/public/simulation/components/Health.js
@@ -155,6 +155,7 @@ Health.prototype.Reduce = function(amount)
Engine.PostMessage(this.entity, MT_HealthChanged, { "from": old, "to": this.hitpoints });
}
+ state.change = this.hitpoints - old;
return state;
};
diff --git a/binaries/data/mods/public/simulation/components/interfaces/Attack.js b/binaries/data/mods/public/simulation/components/interfaces/Attack.js
index 48aaf484e2..530b490e1a 100644
--- a/binaries/data/mods/public/simulation/components/interfaces/Attack.js
+++ b/binaries/data/mods/public/simulation/components/interfaces/Attack.js
@@ -2,5 +2,5 @@ Engine.RegisterInterface("Attack");
// Message sent from Attack to the target entity, each
// time the target is damaged.
-// Data: { attacker: 123, target: 234 }
+// Data: { attacker: 123, target: 234, type: "Melee", damage: 123 }
Engine.RegisterMessageType("Attacked");
diff --git a/binaries/data/mods/public/simulation/templates/special/player.xml b/binaries/data/mods/public/simulation/templates/special/player.xml
index 7ed0741fc7..a2285a9abc 100644
--- a/binaries/data/mods/public/simulation/templates/special/player.xml
+++ b/binaries/data/mods/public/simulation/templates/special/player.xml
@@ -12,4 +12,5 @@
+