diff --git a/Moose Development/Moose/Functional/Scoring.lua b/Moose Development/Moose/Functional/Scoring.lua
index 714f9bc7d..c77a3088a 100644
--- a/Moose Development/Moose/Functional/Scoring.lua
+++ b/Moose Development/Moose/Functional/Scoring.lua
@@ -43,7 +43,7 @@
--
-- 
--
--- **Various @{Zone}s** can be defined for which scores are also granted when objects in that @{Zone} are destroyed.
+-- Various @{Zone}s can be defined for which scores are also granted when objects in that @{Zone} are destroyed.
-- This is **specifically useful** to designate **scenery targets on the map** that will generate points when destroyed.
--
-- With a small change in MissionScripting.lua, the scoring results can also be logged in a **CSV file**.
@@ -99,13 +99,18 @@
-- The other implementation could be to designate a scenery target (a building) in the mission editor surrounded by a @{Zone},
-- just large enough around that building.
--
--- ## 1.4) Configure fratricide level.
+-- ## 1.4) Add extra Goal scores upon an event or a condition.
+--
+-- A mission has goals and achievements. The scoring system provides an API to set additional scores when a goal or achievement event happens.
+-- Use the method @{#SCORING.AddGoalScore}() to add a score for a Player at any time in your mission.
+--
+-- ## 1.5) Configure fratricide level.
--
-- When a player commits too much damage to friendlies, his penalty score will reach a certain level.
-- Use the method @{#SCORING.SetFratricide}() to define the level when a player gets kicked.
-- By default, the fratricide level is the default penalty mutiplier * 2 for the penalty score.
--
--- ## 1.5) Penalty score when a player changes the coalition.
+-- ## 1.6) Penalty score when a player changes the coalition.
--
-- When a player changes the coalition, he can receive a penalty score.
-- Use the method @{#SCORING.SetCoalitionChangePenalty}() to define the penalty when a player changes coalition.
@@ -514,6 +519,7 @@ function SCORING:SetFratricide( Fratricide )
return self
end
+
--- When a player changes the coalition, he can receive a penalty score.
-- Use the method @{#SCORING.SetCoalitionChangePenalty}() to define the penalty when a player changes coalition.
-- By default, the penalty for changing coalition is the default penalty scale.
@@ -600,6 +606,37 @@ function SCORING:_AddPlayerFromUnit( UnitData )
end
+--- Add a goal score for a player.
+-- The method takes the PlayerUnit for which the Goal score needs to be set.
+-- The GoalTag is a string or identifier that is taken into the CSV file scoring log to identify the goal.
+-- A free text can be given that is shown to the players.
+-- The Score can be both positive and negative.
+-- @param #SCORING self
+-- @param Wrapper.Unit#UNIT PlayerUnit The @{Unit} of the Player. Other Properties for the scoring are taken from this PlayerUnit, like coalition, type etc.
+-- @param #string GoalTag The string or identifier that is used in the CSV file to identify the goal (sort or group later in Excel).
+-- @param #string Text A free text that is shown to the players.
+-- @param #number Score The score can be both positive or negative ( Penalty ).
+function SCORING:AddGoalScore( PlayerUnit, GoalTag, Text, Score )
+
+ local PlayerName = PlayerUnit:GetPlayerName()
+
+ self:E( { PlayerUnit.UnitName, PlayerName, GoalTag, Text, Score } )
+
+ -- PlayerName can be nil, if the Unit with the player crashed or due to another reason.
+ if PlayerName then
+ local PlayerData = self.Players[PlayerName]
+
+ PlayerData.Goals[GoalTag] = PlayerData.Goals[GoalTag] or { Score = 0 }
+ PlayerData.Goals[GoalTag].Score = PlayerData.Goals[GoalTag].Score + Score
+ PlayerData.Score = PlayerData.Score + Score
+
+ MESSAGE:New( Text, 30 ):ToAll()
+
+ self:ScoreCSV( PlayerName, "GOAL_" .. string.upper( GoalTag ), 1, Score, PlayerUnit:GetName() )
+ end
+end
+
+
--- Registers Scores the players completing a Mission Task.
-- @param #SCORING self
-- @param Tasking.Mission#MISSION Mission
@@ -1223,6 +1260,43 @@ function SCORING:ReportDetailedPlayerCoalitionChanges( PlayerName )
return ScoreMessage, PlayerScore, PlayerPenalty
end
+--- Produce detailed report of player goal scores.
+-- @param #SCORING self
+-- @param #string PlayerName The name of the player.
+-- @return #string The report.
+function SCORING:ReportDetailedPlayerMissions( PlayerName )
+
+ local ScoreMessage = ""
+ local PlayerScore = 0
+ local PlayerPenalty = 0
+
+ local PlayerData = self.Players[PlayerName]
+ if PlayerData then -- This should normally not happen, but i'll test it anyway.
+ self:T( "Score Player: " .. PlayerName )
+
+ -- Some variables
+ local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition]
+ local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory]
+ local InitUnitType = PlayerData.UnitType
+ local InitUnitName = PlayerData.UnitName
+
+ local ScoreMessageGoal = ""
+ local ScoreGoal = 0
+ local ScoreTask = 0
+ for GoalName, GoalData in pairs( PlayerData.Goals ) do
+ ScoreGoal = ScoreGoal + GoalData.Score
+ ScoreMessageGoal = ScoreMessageGoal .. "'" .. GoalName .. "':" .. GoalData.Score .. "; "
+ end
+ PlayerScore = PlayerScore + ScoreGoal
+
+ if ScoreMessageGoal ~= "" then
+ ScoreMessage = "Goals: " .. ScoreMessageGoal
+ end
+ end
+
+ return ScoreMessage, PlayerScore, PlayerPenalty
+end
+
--- Produce detailed report of player penalty scores because of changing the coalition.
-- @param #SCORING self
-- @param #string PlayerName The name of the player.
@@ -1243,9 +1317,6 @@ function SCORING:ReportDetailedPlayerMissions( PlayerName )
local InitUnitType = PlayerData.UnitType
local InitUnitName = PlayerData.UnitName
- local PlayerScore = 0
- local PlayerPenalty = 0
-
local ScoreMessageMission = ""
local ScoreMission = 0
local ScoreTask = 0
@@ -1257,7 +1328,7 @@ function SCORING:ReportDetailedPlayerMissions( PlayerName )
PlayerScore = PlayerScore + ScoreMission + ScoreTask
if ScoreMessageMission ~= "" then
- ScoreMessage = ScoreMessage .. "Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")"
+ ScoreMessage = "Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")"
end
end
@@ -1284,18 +1355,25 @@ function SCORING:ReportScoreGroupSummary( PlayerGroup )
local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName )
ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits
self:E( { ReportHits, ScoreHits, PenaltyHits } )
+
local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName )
ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys
self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } )
+
local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName )
ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges
self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } )
+
+ local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName )
+ ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals
+ self:E( { ReportGoals, ScoreGoals, PenaltyGoals } )
+
local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName )
ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions
self:E( { ReportMissions, ScoreMissions, PenaltyMissions } )
- local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreMissions
- local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + PenaltyMissions
+ local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions
+ local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions
PlayerMessage =
string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )",
@@ -1329,21 +1407,28 @@ function SCORING:ReportScoreGroupDetailed( PlayerGroup )
local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName )
ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits
self:E( { ReportHits, ScoreHits, PenaltyHits } )
+
local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName )
ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys
self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } )
+
local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName )
ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges
self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } )
+
+ local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName )
+ ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals
+ self:E( { ReportGoals, ScoreGoals, PenaltyGoals } )
+
local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName )
ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions
self:E( { ReportMissions, ScoreMissions, PenaltyMissions } )
- local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreMissions
- local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + PenaltyMissions
+ local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions
+ local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions
PlayerMessage =
- string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )%s%s%s%s",
+ string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )%s%s%s%s%s",
PlayerName,
PlayerScore - PlayerPenalty,
PlayerScore,
@@ -1351,6 +1436,7 @@ function SCORING:ReportScoreGroupDetailed( PlayerGroup )
ReportHits,
ReportDestroys,
ReportCoalitionChanges,
+ ReportGoals,
ReportMissions
)
MESSAGE:New( PlayerMessage, 30, "Player '" .. PlayerName .. "'" ):ToGroup( PlayerGroup )
@@ -1375,18 +1461,25 @@ function SCORING:ReportScoreAllSummary( PlayerGroup )
local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName )
ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits
self:E( { ReportHits, ScoreHits, PenaltyHits } )
+
local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName )
ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys
self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } )
+
local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName )
ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges
self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } )
+
+ local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName )
+ ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals
+ self:E( { ReportGoals, ScoreGoals, PenaltyGoals } )
+
local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName )
ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions
self:E( { ReportMissions, ScoreMissions, PenaltyMissions } )
- local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreMissions
- local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + PenaltyMissions
+ local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions
+ local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions
PlayerMessage =
string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )",
diff --git a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua
index 36807088e..cd2501fff 100644
--- a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua
+++ b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua
@@ -1,5 +1,5 @@
env.info( '*** MOOSE STATIC INCLUDE START *** ' )
-env.info( 'Moose Generation Timestamp: 20170302_2326' )
+env.info( 'Moose Generation Timestamp: 20170303_0807' )
local base = _G
Include = {}
@@ -17902,7 +17902,7 @@ end
--
-- 
--
--- **Various @{Zone}s** can be defined for which scores are also granted when objects in that @{Zone} are destroyed.
+-- Various @{Zone}s can be defined for which scores are also granted when objects in that @{Zone} are destroyed.
-- This is **specifically useful** to designate **scenery targets on the map** that will generate points when destroyed.
--
-- With a small change in MissionScripting.lua, the scoring results can also be logged in a **CSV file**.
@@ -17958,13 +17958,18 @@ end
-- The other implementation could be to designate a scenery target (a building) in the mission editor surrounded by a @{Zone},
-- just large enough around that building.
--
--- ## 1.4) Configure fratricide level.
+-- ## 1.4) Add extra Goal scores upon an event or a condition.
+--
+-- A mission has goals and achievements. The scoring system provides an API to set additional scores when a goal or achievement event happens.
+-- Use the method @{#SCORING.AddGoalScore}() to add a score for a Player at any time in your mission.
+--
+-- ## 1.5) Configure fratricide level.
--
-- When a player commits too much damage to friendlies, his penalty score will reach a certain level.
-- Use the method @{#SCORING.SetFratricide}() to define the level when a player gets kicked.
-- By default, the fratricide level is the default penalty mutiplier * 2 for the penalty score.
--
--- ## 1.5) Penalty score when a player changes the coalition.
+-- ## 1.6) Penalty score when a player changes the coalition.
--
-- When a player changes the coalition, he can receive a penalty score.
-- Use the method @{#SCORING.SetCoalitionChangePenalty}() to define the penalty when a player changes coalition.
@@ -18373,6 +18378,7 @@ function SCORING:SetFratricide( Fratricide )
return self
end
+
--- When a player changes the coalition, he can receive a penalty score.
-- Use the method @{#SCORING.SetCoalitionChangePenalty}() to define the penalty when a player changes coalition.
-- By default, the penalty for changing coalition is the default penalty scale.
@@ -18459,6 +18465,37 @@ function SCORING:_AddPlayerFromUnit( UnitData )
end
+--- Add a goal score for a player.
+-- The method takes the PlayerUnit for which the Goal score needs to be set.
+-- The GoalTag is a string or identifier that is taken into the CSV file scoring log to identify the goal.
+-- A free text can be given that is shown to the players.
+-- The Score can be both positive and negative.
+-- @param #SCORING self
+-- @param Wrapper.Unit#UNIT PlayerUnit The @{Unit} of the Player. Other Properties for the scoring are taken from this PlayerUnit, like coalition, type etc.
+-- @param #string GoalTag The string or identifier that is used in the CSV file to identify the goal (sort or group later in Excel).
+-- @param #string Text A free text that is shown to the players.
+-- @param #number Score The score can be both positive or negative ( Penalty ).
+function SCORING:AddGoalScore( PlayerUnit, GoalTag, Text, Score )
+
+ local PlayerName = PlayerUnit:GetPlayerName()
+
+ self:E( { PlayerUnit.UnitName, PlayerName, GoalTag, Text, Score } )
+
+ -- PlayerName can be nil, if the Unit with the player crashed or due to another reason.
+ if PlayerName then
+ local PlayerData = self.Players[PlayerName]
+
+ PlayerData.Goals[GoalTag] = PlayerData.Goals[GoalTag] or { Score = 0 }
+ PlayerData.Goals[GoalTag].Score = PlayerData.Goals[GoalTag].Score + Score
+ PlayerData.Score = PlayerData.Score + Score
+
+ MESSAGE:New( Text, 30 ):ToAll()
+
+ self:ScoreCSV( PlayerName, "GOAL_" .. string.upper( GoalTag ), 1, Score, PlayerUnit:GetName() )
+ end
+end
+
+
--- Registers Scores the players completing a Mission Task.
-- @param #SCORING self
-- @param Tasking.Mission#MISSION Mission
@@ -19082,6 +19119,43 @@ function SCORING:ReportDetailedPlayerCoalitionChanges( PlayerName )
return ScoreMessage, PlayerScore, PlayerPenalty
end
+--- Produce detailed report of player goal scores.
+-- @param #SCORING self
+-- @param #string PlayerName The name of the player.
+-- @return #string The report.
+function SCORING:ReportDetailedPlayerMissions( PlayerName )
+
+ local ScoreMessage = ""
+ local PlayerScore = 0
+ local PlayerPenalty = 0
+
+ local PlayerData = self.Players[PlayerName]
+ if PlayerData then -- This should normally not happen, but i'll test it anyway.
+ self:T( "Score Player: " .. PlayerName )
+
+ -- Some variables
+ local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition]
+ local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory]
+ local InitUnitType = PlayerData.UnitType
+ local InitUnitName = PlayerData.UnitName
+
+ local ScoreMessageGoal = ""
+ local ScoreGoal = 0
+ local ScoreTask = 0
+ for GoalName, GoalData in pairs( PlayerData.Goals ) do
+ ScoreGoal = ScoreGoal + GoalData.Score
+ ScoreMessageGoal = ScoreMessageGoal .. "'" .. GoalName .. "':" .. GoalData.Score .. "; "
+ end
+ PlayerScore = PlayerScore + ScoreGoal
+
+ if ScoreMessageGoal ~= "" then
+ ScoreMessage = "Goals: " .. ScoreMessageGoal
+ end
+ end
+
+ return ScoreMessage, PlayerScore, PlayerPenalty
+end
+
--- Produce detailed report of player penalty scores because of changing the coalition.
-- @param #SCORING self
-- @param #string PlayerName The name of the player.
@@ -19102,9 +19176,6 @@ function SCORING:ReportDetailedPlayerMissions( PlayerName )
local InitUnitType = PlayerData.UnitType
local InitUnitName = PlayerData.UnitName
- local PlayerScore = 0
- local PlayerPenalty = 0
-
local ScoreMessageMission = ""
local ScoreMission = 0
local ScoreTask = 0
@@ -19116,7 +19187,7 @@ function SCORING:ReportDetailedPlayerMissions( PlayerName )
PlayerScore = PlayerScore + ScoreMission + ScoreTask
if ScoreMessageMission ~= "" then
- ScoreMessage = ScoreMessage .. "Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")"
+ ScoreMessage = "Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")"
end
end
@@ -19143,18 +19214,25 @@ function SCORING:ReportScoreGroupSummary( PlayerGroup )
local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName )
ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits
self:E( { ReportHits, ScoreHits, PenaltyHits } )
+
local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName )
ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys
self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } )
+
local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName )
ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges
self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } )
+
+ local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName )
+ ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals
+ self:E( { ReportGoals, ScoreGoals, PenaltyGoals } )
+
local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName )
ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions
self:E( { ReportMissions, ScoreMissions, PenaltyMissions } )
- local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreMissions
- local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + PenaltyMissions
+ local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions
+ local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions
PlayerMessage =
string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )",
@@ -19188,21 +19266,28 @@ function SCORING:ReportScoreGroupDetailed( PlayerGroup )
local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName )
ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits
self:E( { ReportHits, ScoreHits, PenaltyHits } )
+
local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName )
ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys
self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } )
+
local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName )
ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges
self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } )
+
+ local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName )
+ ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals
+ self:E( { ReportGoals, ScoreGoals, PenaltyGoals } )
+
local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName )
ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions
self:E( { ReportMissions, ScoreMissions, PenaltyMissions } )
- local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreMissions
- local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + PenaltyMissions
+ local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions
+ local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions
PlayerMessage =
- string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )%s%s%s%s",
+ string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )%s%s%s%s%s",
PlayerName,
PlayerScore - PlayerPenalty,
PlayerScore,
@@ -19210,6 +19295,7 @@ function SCORING:ReportScoreGroupDetailed( PlayerGroup )
ReportHits,
ReportDestroys,
ReportCoalitionChanges,
+ ReportGoals,
ReportMissions
)
MESSAGE:New( PlayerMessage, 30, "Player '" .. PlayerName .. "'" ):ToGroup( PlayerGroup )
@@ -19234,18 +19320,25 @@ function SCORING:ReportScoreAllSummary( PlayerGroup )
local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName )
ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits
self:E( { ReportHits, ScoreHits, PenaltyHits } )
+
local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName )
ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys
self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } )
+
local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName )
ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges
self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } )
+
+ local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName )
+ ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals
+ self:E( { ReportGoals, ScoreGoals, PenaltyGoals } )
+
local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName )
ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions
self:E( { ReportMissions, ScoreMissions, PenaltyMissions } )
- local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreMissions
- local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + PenaltyMissions
+ local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions
+ local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions
PlayerMessage =
string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )",
diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua
index 36807088e..cd2501fff 100644
--- a/Moose Mission Setup/Moose.lua
+++ b/Moose Mission Setup/Moose.lua
@@ -1,5 +1,5 @@
env.info( '*** MOOSE STATIC INCLUDE START *** ' )
-env.info( 'Moose Generation Timestamp: 20170302_2326' )
+env.info( 'Moose Generation Timestamp: 20170303_0807' )
local base = _G
Include = {}
@@ -17902,7 +17902,7 @@ end
--
-- 
--
--- **Various @{Zone}s** can be defined for which scores are also granted when objects in that @{Zone} are destroyed.
+-- Various @{Zone}s can be defined for which scores are also granted when objects in that @{Zone} are destroyed.
-- This is **specifically useful** to designate **scenery targets on the map** that will generate points when destroyed.
--
-- With a small change in MissionScripting.lua, the scoring results can also be logged in a **CSV file**.
@@ -17958,13 +17958,18 @@ end
-- The other implementation could be to designate a scenery target (a building) in the mission editor surrounded by a @{Zone},
-- just large enough around that building.
--
--- ## 1.4) Configure fratricide level.
+-- ## 1.4) Add extra Goal scores upon an event or a condition.
+--
+-- A mission has goals and achievements. The scoring system provides an API to set additional scores when a goal or achievement event happens.
+-- Use the method @{#SCORING.AddGoalScore}() to add a score for a Player at any time in your mission.
+--
+-- ## 1.5) Configure fratricide level.
--
-- When a player commits too much damage to friendlies, his penalty score will reach a certain level.
-- Use the method @{#SCORING.SetFratricide}() to define the level when a player gets kicked.
-- By default, the fratricide level is the default penalty mutiplier * 2 for the penalty score.
--
--- ## 1.5) Penalty score when a player changes the coalition.
+-- ## 1.6) Penalty score when a player changes the coalition.
--
-- When a player changes the coalition, he can receive a penalty score.
-- Use the method @{#SCORING.SetCoalitionChangePenalty}() to define the penalty when a player changes coalition.
@@ -18373,6 +18378,7 @@ function SCORING:SetFratricide( Fratricide )
return self
end
+
--- When a player changes the coalition, he can receive a penalty score.
-- Use the method @{#SCORING.SetCoalitionChangePenalty}() to define the penalty when a player changes coalition.
-- By default, the penalty for changing coalition is the default penalty scale.
@@ -18459,6 +18465,37 @@ function SCORING:_AddPlayerFromUnit( UnitData )
end
+--- Add a goal score for a player.
+-- The method takes the PlayerUnit for which the Goal score needs to be set.
+-- The GoalTag is a string or identifier that is taken into the CSV file scoring log to identify the goal.
+-- A free text can be given that is shown to the players.
+-- The Score can be both positive and negative.
+-- @param #SCORING self
+-- @param Wrapper.Unit#UNIT PlayerUnit The @{Unit} of the Player. Other Properties for the scoring are taken from this PlayerUnit, like coalition, type etc.
+-- @param #string GoalTag The string or identifier that is used in the CSV file to identify the goal (sort or group later in Excel).
+-- @param #string Text A free text that is shown to the players.
+-- @param #number Score The score can be both positive or negative ( Penalty ).
+function SCORING:AddGoalScore( PlayerUnit, GoalTag, Text, Score )
+
+ local PlayerName = PlayerUnit:GetPlayerName()
+
+ self:E( { PlayerUnit.UnitName, PlayerName, GoalTag, Text, Score } )
+
+ -- PlayerName can be nil, if the Unit with the player crashed or due to another reason.
+ if PlayerName then
+ local PlayerData = self.Players[PlayerName]
+
+ PlayerData.Goals[GoalTag] = PlayerData.Goals[GoalTag] or { Score = 0 }
+ PlayerData.Goals[GoalTag].Score = PlayerData.Goals[GoalTag].Score + Score
+ PlayerData.Score = PlayerData.Score + Score
+
+ MESSAGE:New( Text, 30 ):ToAll()
+
+ self:ScoreCSV( PlayerName, "GOAL_" .. string.upper( GoalTag ), 1, Score, PlayerUnit:GetName() )
+ end
+end
+
+
--- Registers Scores the players completing a Mission Task.
-- @param #SCORING self
-- @param Tasking.Mission#MISSION Mission
@@ -19082,6 +19119,43 @@ function SCORING:ReportDetailedPlayerCoalitionChanges( PlayerName )
return ScoreMessage, PlayerScore, PlayerPenalty
end
+--- Produce detailed report of player goal scores.
+-- @param #SCORING self
+-- @param #string PlayerName The name of the player.
+-- @return #string The report.
+function SCORING:ReportDetailedPlayerMissions( PlayerName )
+
+ local ScoreMessage = ""
+ local PlayerScore = 0
+ local PlayerPenalty = 0
+
+ local PlayerData = self.Players[PlayerName]
+ if PlayerData then -- This should normally not happen, but i'll test it anyway.
+ self:T( "Score Player: " .. PlayerName )
+
+ -- Some variables
+ local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition]
+ local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory]
+ local InitUnitType = PlayerData.UnitType
+ local InitUnitName = PlayerData.UnitName
+
+ local ScoreMessageGoal = ""
+ local ScoreGoal = 0
+ local ScoreTask = 0
+ for GoalName, GoalData in pairs( PlayerData.Goals ) do
+ ScoreGoal = ScoreGoal + GoalData.Score
+ ScoreMessageGoal = ScoreMessageGoal .. "'" .. GoalName .. "':" .. GoalData.Score .. "; "
+ end
+ PlayerScore = PlayerScore + ScoreGoal
+
+ if ScoreMessageGoal ~= "" then
+ ScoreMessage = "Goals: " .. ScoreMessageGoal
+ end
+ end
+
+ return ScoreMessage, PlayerScore, PlayerPenalty
+end
+
--- Produce detailed report of player penalty scores because of changing the coalition.
-- @param #SCORING self
-- @param #string PlayerName The name of the player.
@@ -19102,9 +19176,6 @@ function SCORING:ReportDetailedPlayerMissions( PlayerName )
local InitUnitType = PlayerData.UnitType
local InitUnitName = PlayerData.UnitName
- local PlayerScore = 0
- local PlayerPenalty = 0
-
local ScoreMessageMission = ""
local ScoreMission = 0
local ScoreTask = 0
@@ -19116,7 +19187,7 @@ function SCORING:ReportDetailedPlayerMissions( PlayerName )
PlayerScore = PlayerScore + ScoreMission + ScoreTask
if ScoreMessageMission ~= "" then
- ScoreMessage = ScoreMessage .. "Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")"
+ ScoreMessage = "Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")"
end
end
@@ -19143,18 +19214,25 @@ function SCORING:ReportScoreGroupSummary( PlayerGroup )
local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName )
ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits
self:E( { ReportHits, ScoreHits, PenaltyHits } )
+
local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName )
ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys
self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } )
+
local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName )
ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges
self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } )
+
+ local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName )
+ ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals
+ self:E( { ReportGoals, ScoreGoals, PenaltyGoals } )
+
local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName )
ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions
self:E( { ReportMissions, ScoreMissions, PenaltyMissions } )
- local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreMissions
- local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + PenaltyMissions
+ local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions
+ local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions
PlayerMessage =
string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )",
@@ -19188,21 +19266,28 @@ function SCORING:ReportScoreGroupDetailed( PlayerGroup )
local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName )
ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits
self:E( { ReportHits, ScoreHits, PenaltyHits } )
+
local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName )
ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys
self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } )
+
local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName )
ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges
self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } )
+
+ local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName )
+ ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals
+ self:E( { ReportGoals, ScoreGoals, PenaltyGoals } )
+
local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName )
ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions
self:E( { ReportMissions, ScoreMissions, PenaltyMissions } )
- local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreMissions
- local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + PenaltyMissions
+ local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions
+ local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions
PlayerMessage =
- string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )%s%s%s%s",
+ string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )%s%s%s%s%s",
PlayerName,
PlayerScore - PlayerPenalty,
PlayerScore,
@@ -19210,6 +19295,7 @@ function SCORING:ReportScoreGroupDetailed( PlayerGroup )
ReportHits,
ReportDestroys,
ReportCoalitionChanges,
+ ReportGoals,
ReportMissions
)
MESSAGE:New( PlayerMessage, 30, "Player '" .. PlayerName .. "'" ):ToGroup( PlayerGroup )
@@ -19234,18 +19320,25 @@ function SCORING:ReportScoreAllSummary( PlayerGroup )
local ReportHits, ScoreHits, PenaltyHits = self:ReportDetailedPlayerHits( PlayerName )
ReportHits = ReportHits ~= "" and "\n- " .. ReportHits or ReportHits
self:E( { ReportHits, ScoreHits, PenaltyHits } )
+
local ReportDestroys, ScoreDestroys, PenaltyDestroys = self:ReportDetailedPlayerDestroys( PlayerName )
ReportDestroys = ReportDestroys ~= "" and "\n- " .. ReportDestroys or ReportDestroys
self:E( { ReportDestroys, ScoreDestroys, PenaltyDestroys } )
+
local ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges = self:ReportDetailedPlayerCoalitionChanges( PlayerName )
ReportCoalitionChanges = ReportCoalitionChanges ~= "" and "\n- " .. ReportCoalitionChanges or ReportCoalitionChanges
self:E( { ReportCoalitionChanges, ScoreCoalitionChanges, PenaltyCoalitionChanges } )
+
+ local ReportGoals, ScoreGoals, PenaltyGoals = self:ReportDetailedPlayerGoals( PlayerName )
+ ReportGoals = ReportGoals ~= "" and "\n- " .. ReportGoals or ReportGoals
+ self:E( { ReportGoals, ScoreGoals, PenaltyGoals } )
+
local ReportMissions, ScoreMissions, PenaltyMissions = self:ReportDetailedPlayerMissions( PlayerName )
ReportMissions = ReportMissions ~= "" and "\n- " .. ReportMissions or ReportMissions
self:E( { ReportMissions, ScoreMissions, PenaltyMissions } )
- local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreMissions
- local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + PenaltyMissions
+ local PlayerScore = ScoreHits + ScoreDestroys + ScoreCoalitionChanges + ScoreGoals + ScoreMissions
+ local PlayerPenalty = PenaltyHits + PenaltyDestroys + PenaltyCoalitionChanges + ScoreGoals + PenaltyMissions
PlayerMessage =
string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties )",
diff --git a/Moose Presentations/SCORING.pptx b/Moose Presentations/SCORING.pptx
index 68223c839..576daef1f 100644
Binary files a/Moose Presentations/SCORING.pptx and b/Moose Presentations/SCORING.pptx differ
diff --git a/docs/Documentation/AI_Patrol.html b/docs/Documentation/AI_Patrol.html
index 51fe4286e..3d4f402b1 100644
--- a/docs/Documentation/AI_Patrol.html
+++ b/docs/Documentation/AI_Patrol.html
@@ -881,9 +881,6 @@ Use the method AIPATROLZONE.M
-
- This table contains the targets detected during patrol.
diff --git a/docs/Documentation/Cargo.html b/docs/Documentation/Cargo.html
index efcd3f237..59202c294 100644
--- a/docs/Documentation/Cargo.html
+++ b/docs/Documentation/Cargo.html
@@ -2425,7 +2425,6 @@ The UNIT carrying the package.
Initialize the ObjectSchedulers array, which is a weakly coupled table. - If the object used as the key is nil, then the garbage collector will remove the item from the Functions array.
+setmetatable( {}, { __mode = "v" } )
**Various Zones** can be defined for which scores are also granted when objects in that Zone are destroyed. +
Various Zones can be defined for which scores are also granted when objects in that Zone are destroyed. This is specifically useful to designate scenery targets on the map that will generate points when destroyed.
With a small change in MissionScripting.lua, the scoring results can also be logged in a CSV file.
@@ -180,13 +180,18 @@ then the zone is a moving zone, and anything destroyed within that Zone,
just large enough around that building.
A mission has goals and achievements. The scoring system provides an API to set additional scores when a goal or achievement event happens. +Use the method SCORING.AddGoalScore() to add a score for a Player at any time in your mission.
+ +When a player commits too much damage to friendlies, his penalty score will reach a certain level.
Use the method SCORING.SetFratricide() to define the level when a player gets kicked.
By default, the fratricide level is the default penalty mutiplier * 2 for the penalty score.
When a player changes the coalition, he can receive a penalty score. Use the method SCORING.SetCoalitionChangePenalty() to define the penalty when a player changes coalition. @@ -299,6 +304,12 @@ Various methods exist to configure:
SCORING| SCORING:AddGoalScore(PlayerUnit, GoalTag, Text, Score) | +
+ Add a goal score for a player. + |
+
| SCORING:AddScoreGroup(ScoreGroup, Score) |
Specify a special additional score for a Group. @@ -493,7 +504,7 @@ Various methods exist to configure: |
| SCORING:ReportDetailedPlayerMissions(PlayerName) |
- Produce detailed report of player penalty scores because of changing the coalition. +Produce detailed report of player goal scores. |
| - | -|
| SPAWN.uncontrolled | -- |
Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning.
+When the first Spawn executes, all the Groups need to be made visible before start.
+Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned.
Sets the TimeOut for the Task.
FSM function for a TASK
+FSM function for a TASK
FSM function for a TASK
+FSM function for a TASK
Sets the TimeOut for the Task.
+ + +If Task stayed planned for longer than TimeOut, it gets into Cancelled status.
+ +#integer Timer :
+in seconds
#TASK: +self
+ +FSM function for a TASK
+ +#string Event :
#string From :
#string To :
FSM function for a TASK
+ +#string Event :
#string From :
#string To :
integer