mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
Scoring updates
This commit is contained in:
parent
c9c3b11b14
commit
1e143778bd
@ -1,7 +1,7 @@
|
||||
--- Single-Player:**Yes** / Multi-Player:**Yes** / Core:**Yes** -- **Administer the scoring of player achievements,
|
||||
-- and create a CSV file logging the scoring events for use at team or squadron websites.**
|
||||
--
|
||||
-- -- 
|
||||
-- -- 
|
||||
--
|
||||
-- ===
|
||||
--
|
||||
@ -9,14 +9,66 @@
|
||||
--
|
||||
-- The @{#SCORING} class administers the scoring of player achievements,
|
||||
-- and creates a CSV file logging the scoring events for use at team or squadron websites.
|
||||
-- In other words, use AI_BALANCER to simulate human behaviour by spawning in replacement AI in multi player missions.
|
||||
--
|
||||
-- This scoring class calculates the hits and kills that players make within a simulation session.
|
||||
-- Scoring is calculated using a defined algorithm.
|
||||
-- The scores are calculated by scoring the hits and kills of objects that players make,
|
||||
-- which are @{Unit} and @{Static) objects within your mission.
|
||||
-- On top, @{Zone}s can be defined for which scores are also granted when a @{Scenery} object is hit and killed within that Zone.
|
||||
--
|
||||
-- Scores are calculated based on the threat level of the objects involved.
|
||||
-- The threat level of a unit can be a value between 0 and 10.
|
||||
-- A calculated score takes the threat level of the target divided by the threat level of the player unit.
|
||||
-- This provides a value between 0.1 and 10.
|
||||
-- The stronger or the higher the threat of the player unit, the less score will be given in kills.
|
||||
--
|
||||
--
|
||||
--
|
||||
-- That value can then be multiplied by a multiplier. A multiplier can be set for enemies and friendlies kills.
|
||||
--
|
||||
-- Special scores can be given to specific units. These scores are added when player(s) kill that unit.
|
||||
--
|
||||
-- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded
|
||||
-- to a database or a BI tool to publish the scoring results to the player community.
|
||||
--
|
||||
-- ## 1.1) Set the kill score or penalty multiplier
|
||||
--
|
||||
-- Score multipliers can be set for scores granted when enemies or friendlies are killed.
|
||||
-- Use the method @{#SCORING.SetMultiplierKillScore}() to set the multiplier of enemy kills (positive kills).
|
||||
-- Use the method @{#SCORING.SetMultiplierKillPenalty}() to set the multiplier of friendly kills (negative kills).
|
||||
--
|
||||
-- ## 1.2) Define special targets in the mission that will give extra scores.
|
||||
--
|
||||
-- Special targets can be set that will give extra scores to the players when these are killed.
|
||||
-- Use the method @{#SCORING.SetScoreUnit}() to specify a special additional score for a specific @{Unit}.
|
||||
-- Use the method @{#SCORING.SetScoreGroup}() to specify a special additional score for a specific @{Group}.
|
||||
--
|
||||
-- ====
|
||||
--
|
||||
-- # **API CHANGE HISTORY**
|
||||
--
|
||||
-- The underlying change log documents the API changes. Please read this carefully. The following notation is used:
|
||||
--
|
||||
-- * **Added** parts are expressed in bold type face.
|
||||
-- * _Removed_ parts are expressed in italic type face.
|
||||
--
|
||||
-- Hereby the change log:
|
||||
--
|
||||
-- 2017-02-26: Initial class and API.
|
||||
--
|
||||
-- ===
|
||||
--
|
||||
-- # **AUTHORS and CONTRIBUTIONS**
|
||||
--
|
||||
-- ### Contributions:
|
||||
--
|
||||
-- * **Wingthor**: Testing & Advice.
|
||||
-- * **Dutch-Baron**: Testing & Advice.
|
||||
-- * **[Whisper](http://forums.eagle.ru/member.php?u=3829): Testing.
|
||||
--
|
||||
-- ### Authors:
|
||||
--
|
||||
-- * **FlightControl**: Concept, Design & Programming.
|
||||
--
|
||||
-- @module Scoring
|
||||
-- @author FlightControl
|
||||
|
||||
|
||||
--- The Scoring class
|
||||
@ -62,6 +114,12 @@ function SCORING:New( GameName )
|
||||
error( "A game name must be given to register the scoring results" )
|
||||
end
|
||||
|
||||
-- Multipliers
|
||||
self.MultiplierKillScore = 10
|
||||
self.MultiplierKillPenalty = 20
|
||||
|
||||
-- Additional Scores
|
||||
self.ScoreUnits = {}
|
||||
|
||||
self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash )
|
||||
self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash )
|
||||
@ -78,6 +136,61 @@ function SCORING:New( GameName )
|
||||
|
||||
end
|
||||
|
||||
--- Set the multiplier for scoring valid kills (enemy kills).
|
||||
-- A calculated score is a value between 0.1 and 10.
|
||||
-- The multiplier magnifies the scores given to the players.
|
||||
-- @param #SCORING self
|
||||
-- @param #number Multiplier The multiplier of the score given.
|
||||
function SCORING:SetMultiplierKillScore( Multiplier )
|
||||
|
||||
self.MultiplierKillScore = Multiplier
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Set the multiplier for scoring penalty kills (friendly kills).
|
||||
-- A calculated score is a value between 0.1 and 10.
|
||||
-- The multiplier magnifies the scores given to the players.
|
||||
-- @param #SCORING self
|
||||
-- @param #number Multiplier The multiplier of the score given.
|
||||
function SCORING:SetMultiplierKillPenalty( Multiplier )
|
||||
|
||||
self.MultiplierKillPenalty = Multiplier
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Specify a special additional score for a @{Unit}.
|
||||
-- @param #SCORING self
|
||||
-- @param Wrapper.Unit#UNIT ScoreUnit The @{Unit} for which the Score is given.
|
||||
-- @param #number Score The Score value.
|
||||
function SCORING:SetScoreUnit( ScoreUnit, Score )
|
||||
|
||||
local UnitName = ScoreUnit:GetName()
|
||||
|
||||
self.ScoreUnits[UnitName] = Score
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Specify a special additional score for a @{Group}.
|
||||
-- @param #SCORING self
|
||||
-- @param Wrapper.Group#GROUP ScoreGroup The @{Group} for which each @{Unit} a Score is given.
|
||||
-- @param #number Score The Score value.
|
||||
function SCORING:SetScoreGroup( ScoreGroup, Score )
|
||||
|
||||
local ScoreUnits = ScoreGroup:GetUnits()
|
||||
|
||||
for ScoreUnitID, ScoreUnit in pairs( ScoreUnits ) do
|
||||
local UnitName = ScoreUnit:GetName()
|
||||
self.ScoreUnits[UnitName] = Score
|
||||
end
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
|
||||
|
||||
--- Creates a score radio menu. Can be accessed using Radio -> F10.
|
||||
-- @param #SCORING self
|
||||
-- @return #SCORING self
|
||||
@ -493,30 +606,30 @@ function SCORING:_EventOnDeadOrCrash( Event )
|
||||
if InitCoalition == TargetCoalition then
|
||||
local ThreatLevelTarget, ThreatTypeTarget = PlayerKill.UNIT:GetThreatLevel()
|
||||
local ThreatLevelPlayer = Player.UNIT:GetThreatLevel()
|
||||
local ThreatLevel = math.ceil( ThreatLevelTarget / ThreatLevelPlayer * 100 )
|
||||
local ThreatLevel = math.ceil( ( ThreatLevelTarget / ThreatLevelPlayer ) * self.MultiplierKillPenalty )
|
||||
self:E( { ThreatLevel = ThreatLevel, ThreatLevelTarget = ThreatLevelTarget, ThreatTypeTarget = ThreatTypeTarget, ThreatLevelPlayer = ThreatLevelPlayer } )
|
||||
|
||||
Player.Penalty = Player.Penalty + ThreatLevel * 4
|
||||
PlayerKill.Penalty = PlayerKill.Penalty + ThreatLevel * 4
|
||||
Player.Penalty = Player.Penalty + ThreatLevel
|
||||
PlayerKill.Penalty = PlayerKill.Penalty + ThreatLevel
|
||||
PlayerKill.PenaltyKill = PlayerKill.PenaltyKill + 1
|
||||
|
||||
if Player.HitPlayers[TargetPlayerName] then -- A player killed another player
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' killed friendly player '" .. TargetPlayerName .. "' " .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " ..
|
||||
PlayerKill.PenaltyKill .. " times. Penalty: -" .. PlayerKill.Penalty ..
|
||||
". Score Total:" .. Player.Score - Player.Penalty,
|
||||
5 ):ToAll()
|
||||
15 ):ToAll()
|
||||
else
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " ..
|
||||
PlayerKill.PenaltyKill .. " times. Penalty: -" .. PlayerKill.Penalty ..
|
||||
". Score Total:" .. Player.Score - Player.Penalty,
|
||||
5 ):ToAll()
|
||||
15 ):ToAll()
|
||||
end
|
||||
self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType )
|
||||
else
|
||||
|
||||
local ThreatLevelTarget, ThreatTypeTarget = PlayerKill.UNIT:GetThreatLevel()
|
||||
local ThreatLevelPlayer = Player.UNIT:GetThreatLevel()
|
||||
local ThreatLevel = math.ceil( ThreatLevelTarget / ThreatLevelPlayer * 100 )
|
||||
local ThreatLevel = math.ceil( ( ThreatLevelTarget / ThreatLevelPlayer ) * self.MultiplierKillScore )
|
||||
self:E( { ThreatLevel = ThreatLevel, ThreatLevelTarget = ThreatLevelTarget, ThreatTypeTarget = ThreatTypeTarget, ThreatLevelPlayer = ThreatLevelPlayer } )
|
||||
|
||||
Player.Score = Player.Score + ThreatLevel
|
||||
@ -526,13 +639,22 @@ function SCORING:_EventOnDeadOrCrash( Event )
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' killed enemy player '" .. TargetPlayerName .. "' " .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " ..
|
||||
PlayerKill.ScoreKill .. " times. Score: " .. PlayerKill.Score ..
|
||||
". Score Total:" .. Player.Score - Player.Penalty,
|
||||
5 ):ToAll()
|
||||
15 ):ToAll()
|
||||
else
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " ..
|
||||
PlayerKill.ScoreKill .. " times. Score: " .. PlayerKill.Score ..
|
||||
". Score Total:" .. Player.Score - Player.Penalty,
|
||||
5 ):ToAll()
|
||||
". Total:" .. Player.Score - Player.Penalty,
|
||||
15 ):ToAll()
|
||||
end
|
||||
|
||||
local UnitName = PlayerKill.UNIT:GetName()
|
||||
local ScoreUnit = self.ScoreUnits[UnitName]
|
||||
if ScoreUnit then
|
||||
Player.Score = Player.Score + ScoreUnit
|
||||
PlayerKill.Score = PlayerKill.Score + ScoreUnit
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' receives an extra " .. ScoreUnit .. " points! Total: " .. Player.Score - Player.Penalty,
|
||||
15 ):ToAll()
|
||||
end
|
||||
self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType )
|
||||
end
|
||||
end
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
env.info( '*** MOOSE STATIC INCLUDE START *** ' )
|
||||
env.info( 'Moose Generation Timestamp: 20170226_1531' )
|
||||
env.info( 'Moose Generation Timestamp: 20170226_2255' )
|
||||
local base = _G
|
||||
|
||||
Include = {}
|
||||
@ -17752,7 +17752,7 @@ end
|
||||
--- Single-Player:**Yes** / Multi-Player:**Yes** / Core:**Yes** -- **Administer the scoring of player achievements,
|
||||
-- and create a CSV file logging the scoring events for use at team or squadron websites.**
|
||||
--
|
||||
-- -- 
|
||||
-- -- 
|
||||
--
|
||||
-- ===
|
||||
--
|
||||
@ -17760,14 +17760,66 @@ end
|
||||
--
|
||||
-- The @{#SCORING} class administers the scoring of player achievements,
|
||||
-- and creates a CSV file logging the scoring events for use at team or squadron websites.
|
||||
-- In other words, use AI_BALANCER to simulate human behaviour by spawning in replacement AI in multi player missions.
|
||||
--
|
||||
-- This scoring class calculates the hits and kills that players make within a simulation session.
|
||||
-- Scoring is calculated using a defined algorithm.
|
||||
-- The scores are calculated by scoring the hits and kills of objects that players make,
|
||||
-- which are @{Unit} and @{Static) objects within your mission.
|
||||
-- On top, @{Zone}s can be defined for which scores are also granted when a @{Scenery} object is hit and killed within that Zone.
|
||||
--
|
||||
-- Scores are calculated based on the threat level of the objects involved.
|
||||
-- The threat level of a unit can be a value between 0 and 10.
|
||||
-- A calculated score takes the threat level of the target divided by the threat level of the player unit.
|
||||
-- This provides a value between 0.1 and 10.
|
||||
-- The stronger or the higher the threat of the player unit, the less score will be given in kills.
|
||||
--
|
||||
--
|
||||
--
|
||||
-- That value can then be multiplied by a multiplier. A multiplier can be set for enemies and friendlies kills.
|
||||
--
|
||||
-- Special scores can be given to specific units. These scores are added when player(s) kill that unit.
|
||||
--
|
||||
-- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded
|
||||
-- to a database or a BI tool to publish the scoring results to the player community.
|
||||
--
|
||||
-- ## 1.1) Set the kill score or penalty multiplier
|
||||
--
|
||||
-- Score multipliers can be set for scores granted when enemies or friendlies are killed.
|
||||
-- Use the method @{#SCORING.SetMultiplierKillScore}() to set the multiplier of enemy kills (positive kills).
|
||||
-- Use the method @{#SCORING.SetMultiplierKillPenalty}() to set the multiplier of friendly kills (negative kills).
|
||||
--
|
||||
-- ## 1.2) Define special targets in the mission that will give extra scores.
|
||||
--
|
||||
-- Special targets can be set that will give extra scores to the players when these are killed.
|
||||
-- Use the method @{#SCORING.SetScoreUnit}() to specify a special additional score for a specific @{Unit}.
|
||||
-- Use the method @{#SCORING.SetScoreGroup}() to specify a special additional score for a specific @{Group}.
|
||||
--
|
||||
-- ====
|
||||
--
|
||||
-- # **API CHANGE HISTORY**
|
||||
--
|
||||
-- The underlying change log documents the API changes. Please read this carefully. The following notation is used:
|
||||
--
|
||||
-- * **Added** parts are expressed in bold type face.
|
||||
-- * _Removed_ parts are expressed in italic type face.
|
||||
--
|
||||
-- Hereby the change log:
|
||||
--
|
||||
-- 2017-02-26: Initial class and API.
|
||||
--
|
||||
-- ===
|
||||
--
|
||||
-- # **AUTHORS and CONTRIBUTIONS**
|
||||
--
|
||||
-- ### Contributions:
|
||||
--
|
||||
-- * **Wingthor**: Testing & Advice.
|
||||
-- * **Dutch-Baron**: Testing & Advice.
|
||||
-- * **[Whisper](http://forums.eagle.ru/member.php?u=3829): Testing.
|
||||
--
|
||||
-- ### Authors:
|
||||
--
|
||||
-- * **FlightControl**: Concept, Design & Programming.
|
||||
--
|
||||
-- @module Scoring
|
||||
-- @author FlightControl
|
||||
|
||||
|
||||
--- The Scoring class
|
||||
@ -17813,6 +17865,12 @@ function SCORING:New( GameName )
|
||||
error( "A game name must be given to register the scoring results" )
|
||||
end
|
||||
|
||||
-- Multipliers
|
||||
self.MultiplierKillScore = 10
|
||||
self.MultiplierKillPenalty = 20
|
||||
|
||||
-- Additional Scores
|
||||
self.ScoreUnits = {}
|
||||
|
||||
self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash )
|
||||
self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash )
|
||||
@ -17829,6 +17887,61 @@ function SCORING:New( GameName )
|
||||
|
||||
end
|
||||
|
||||
--- Set the multiplier for scoring valid kills (enemy kills).
|
||||
-- A calculated score is a value between 0.1 and 10.
|
||||
-- The multiplier magnifies the scores given to the players.
|
||||
-- @param #SCORING self
|
||||
-- @param #number Multiplier The multiplier of the score given.
|
||||
function SCORING:SetMultiplierKillScore( Multiplier )
|
||||
|
||||
self.MultiplierKillScore = Multiplier
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Set the multiplier for scoring penalty kills (friendly kills).
|
||||
-- A calculated score is a value between 0.1 and 10.
|
||||
-- The multiplier magnifies the scores given to the players.
|
||||
-- @param #SCORING self
|
||||
-- @param #number Multiplier The multiplier of the score given.
|
||||
function SCORING:SetMultiplierKillPenalty( Multiplier )
|
||||
|
||||
self.MultiplierKillPenalty = Multiplier
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Specify a special additional score for a @{Unit}.
|
||||
-- @param #SCORING self
|
||||
-- @param Wrapper.Unit#UNIT ScoreUnit The @{Unit} for which the Score is given.
|
||||
-- @param #number Score The Score value.
|
||||
function SCORING:SetScoreUnit( ScoreUnit, Score )
|
||||
|
||||
local UnitName = ScoreUnit:GetName()
|
||||
|
||||
self.ScoreUnits[UnitName] = Score
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Specify a special additional score for a @{Group}.
|
||||
-- @param #SCORING self
|
||||
-- @param Wrapper.Group#GROUP ScoreGroup The @{Group} for which each @{Unit} a Score is given.
|
||||
-- @param #number Score The Score value.
|
||||
function SCORING:SetScoreGroup( ScoreGroup, Score )
|
||||
|
||||
local ScoreUnits = ScoreGroup:GetUnits()
|
||||
|
||||
for ScoreUnitID, ScoreUnit in pairs( ScoreUnits ) do
|
||||
local UnitName = ScoreUnit:GetName()
|
||||
self.ScoreUnits[UnitName] = Score
|
||||
end
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
|
||||
|
||||
--- Creates a score radio menu. Can be accessed using Radio -> F10.
|
||||
-- @param #SCORING self
|
||||
-- @return #SCORING self
|
||||
@ -18244,30 +18357,30 @@ function SCORING:_EventOnDeadOrCrash( Event )
|
||||
if InitCoalition == TargetCoalition then
|
||||
local ThreatLevelTarget, ThreatTypeTarget = PlayerKill.UNIT:GetThreatLevel()
|
||||
local ThreatLevelPlayer = Player.UNIT:GetThreatLevel()
|
||||
local ThreatLevel = math.ceil( ThreatLevelTarget / ThreatLevelPlayer * 100 )
|
||||
local ThreatLevel = math.ceil( ( ThreatLevelTarget / ThreatLevelPlayer ) * self.MultiplierKillPenalty )
|
||||
self:E( { ThreatLevel = ThreatLevel, ThreatLevelTarget = ThreatLevelTarget, ThreatTypeTarget = ThreatTypeTarget, ThreatLevelPlayer = ThreatLevelPlayer } )
|
||||
|
||||
Player.Penalty = Player.Penalty + ThreatLevel * 4
|
||||
PlayerKill.Penalty = PlayerKill.Penalty + ThreatLevel * 4
|
||||
Player.Penalty = Player.Penalty + ThreatLevel
|
||||
PlayerKill.Penalty = PlayerKill.Penalty + ThreatLevel
|
||||
PlayerKill.PenaltyKill = PlayerKill.PenaltyKill + 1
|
||||
|
||||
if Player.HitPlayers[TargetPlayerName] then -- A player killed another player
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' killed friendly player '" .. TargetPlayerName .. "' " .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " ..
|
||||
PlayerKill.PenaltyKill .. " times. Penalty: -" .. PlayerKill.Penalty ..
|
||||
". Score Total:" .. Player.Score - Player.Penalty,
|
||||
5 ):ToAll()
|
||||
15 ):ToAll()
|
||||
else
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " ..
|
||||
PlayerKill.PenaltyKill .. " times. Penalty: -" .. PlayerKill.Penalty ..
|
||||
". Score Total:" .. Player.Score - Player.Penalty,
|
||||
5 ):ToAll()
|
||||
15 ):ToAll()
|
||||
end
|
||||
self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType )
|
||||
else
|
||||
|
||||
local ThreatLevelTarget, ThreatTypeTarget = PlayerKill.UNIT:GetThreatLevel()
|
||||
local ThreatLevelPlayer = Player.UNIT:GetThreatLevel()
|
||||
local ThreatLevel = math.ceil( ThreatLevelTarget / ThreatLevelPlayer * 100 )
|
||||
local ThreatLevel = math.ceil( ( ThreatLevelTarget / ThreatLevelPlayer ) * self.MultiplierKillScore )
|
||||
self:E( { ThreatLevel = ThreatLevel, ThreatLevelTarget = ThreatLevelTarget, ThreatTypeTarget = ThreatTypeTarget, ThreatLevelPlayer = ThreatLevelPlayer } )
|
||||
|
||||
Player.Score = Player.Score + ThreatLevel
|
||||
@ -18277,13 +18390,22 @@ function SCORING:_EventOnDeadOrCrash( Event )
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' killed enemy player '" .. TargetPlayerName .. "' " .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " ..
|
||||
PlayerKill.ScoreKill .. " times. Score: " .. PlayerKill.Score ..
|
||||
". Score Total:" .. Player.Score - Player.Penalty,
|
||||
5 ):ToAll()
|
||||
15 ):ToAll()
|
||||
else
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " ..
|
||||
PlayerKill.ScoreKill .. " times. Score: " .. PlayerKill.Score ..
|
||||
". Score Total:" .. Player.Score - Player.Penalty,
|
||||
5 ):ToAll()
|
||||
". Total:" .. Player.Score - Player.Penalty,
|
||||
15 ):ToAll()
|
||||
end
|
||||
|
||||
local UnitName = PlayerKill.UNIT:GetName()
|
||||
local ScoreUnit = self.ScoreUnits[UnitName]
|
||||
if ScoreUnit then
|
||||
Player.Score = Player.Score + ScoreUnit
|
||||
PlayerKill.Score = PlayerKill.Score + ScoreUnit
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' receives an extra " .. ScoreUnit .. " points! Total: " .. Player.Score - Player.Penalty,
|
||||
15 ):ToAll()
|
||||
end
|
||||
self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType )
|
||||
end
|
||||
end
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
env.info( '*** MOOSE STATIC INCLUDE START *** ' )
|
||||
env.info( 'Moose Generation Timestamp: 20170226_1531' )
|
||||
env.info( 'Moose Generation Timestamp: 20170226_2255' )
|
||||
local base = _G
|
||||
|
||||
Include = {}
|
||||
@ -17752,7 +17752,7 @@ end
|
||||
--- Single-Player:**Yes** / Multi-Player:**Yes** / Core:**Yes** -- **Administer the scoring of player achievements,
|
||||
-- and create a CSV file logging the scoring events for use at team or squadron websites.**
|
||||
--
|
||||
-- -- 
|
||||
-- -- 
|
||||
--
|
||||
-- ===
|
||||
--
|
||||
@ -17760,14 +17760,66 @@ end
|
||||
--
|
||||
-- The @{#SCORING} class administers the scoring of player achievements,
|
||||
-- and creates a CSV file logging the scoring events for use at team or squadron websites.
|
||||
-- In other words, use AI_BALANCER to simulate human behaviour by spawning in replacement AI in multi player missions.
|
||||
--
|
||||
-- This scoring class calculates the hits and kills that players make within a simulation session.
|
||||
-- Scoring is calculated using a defined algorithm.
|
||||
-- The scores are calculated by scoring the hits and kills of objects that players make,
|
||||
-- which are @{Unit} and @{Static) objects within your mission.
|
||||
-- On top, @{Zone}s can be defined for which scores are also granted when a @{Scenery} object is hit and killed within that Zone.
|
||||
--
|
||||
-- Scores are calculated based on the threat level of the objects involved.
|
||||
-- The threat level of a unit can be a value between 0 and 10.
|
||||
-- A calculated score takes the threat level of the target divided by the threat level of the player unit.
|
||||
-- This provides a value between 0.1 and 10.
|
||||
-- The stronger or the higher the threat of the player unit, the less score will be given in kills.
|
||||
--
|
||||
--
|
||||
--
|
||||
-- That value can then be multiplied by a multiplier. A multiplier can be set for enemies and friendlies kills.
|
||||
--
|
||||
-- Special scores can be given to specific units. These scores are added when player(s) kill that unit.
|
||||
--
|
||||
-- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded
|
||||
-- to a database or a BI tool to publish the scoring results to the player community.
|
||||
--
|
||||
-- ## 1.1) Set the kill score or penalty multiplier
|
||||
--
|
||||
-- Score multipliers can be set for scores granted when enemies or friendlies are killed.
|
||||
-- Use the method @{#SCORING.SetMultiplierKillScore}() to set the multiplier of enemy kills (positive kills).
|
||||
-- Use the method @{#SCORING.SetMultiplierKillPenalty}() to set the multiplier of friendly kills (negative kills).
|
||||
--
|
||||
-- ## 1.2) Define special targets in the mission that will give extra scores.
|
||||
--
|
||||
-- Special targets can be set that will give extra scores to the players when these are killed.
|
||||
-- Use the method @{#SCORING.SetScoreUnit}() to specify a special additional score for a specific @{Unit}.
|
||||
-- Use the method @{#SCORING.SetScoreGroup}() to specify a special additional score for a specific @{Group}.
|
||||
--
|
||||
-- ====
|
||||
--
|
||||
-- # **API CHANGE HISTORY**
|
||||
--
|
||||
-- The underlying change log documents the API changes. Please read this carefully. The following notation is used:
|
||||
--
|
||||
-- * **Added** parts are expressed in bold type face.
|
||||
-- * _Removed_ parts are expressed in italic type face.
|
||||
--
|
||||
-- Hereby the change log:
|
||||
--
|
||||
-- 2017-02-26: Initial class and API.
|
||||
--
|
||||
-- ===
|
||||
--
|
||||
-- # **AUTHORS and CONTRIBUTIONS**
|
||||
--
|
||||
-- ### Contributions:
|
||||
--
|
||||
-- * **Wingthor**: Testing & Advice.
|
||||
-- * **Dutch-Baron**: Testing & Advice.
|
||||
-- * **[Whisper](http://forums.eagle.ru/member.php?u=3829): Testing.
|
||||
--
|
||||
-- ### Authors:
|
||||
--
|
||||
-- * **FlightControl**: Concept, Design & Programming.
|
||||
--
|
||||
-- @module Scoring
|
||||
-- @author FlightControl
|
||||
|
||||
|
||||
--- The Scoring class
|
||||
@ -17813,6 +17865,12 @@ function SCORING:New( GameName )
|
||||
error( "A game name must be given to register the scoring results" )
|
||||
end
|
||||
|
||||
-- Multipliers
|
||||
self.MultiplierKillScore = 10
|
||||
self.MultiplierKillPenalty = 20
|
||||
|
||||
-- Additional Scores
|
||||
self.ScoreUnits = {}
|
||||
|
||||
self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash )
|
||||
self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash )
|
||||
@ -17829,6 +17887,61 @@ function SCORING:New( GameName )
|
||||
|
||||
end
|
||||
|
||||
--- Set the multiplier for scoring valid kills (enemy kills).
|
||||
-- A calculated score is a value between 0.1 and 10.
|
||||
-- The multiplier magnifies the scores given to the players.
|
||||
-- @param #SCORING self
|
||||
-- @param #number Multiplier The multiplier of the score given.
|
||||
function SCORING:SetMultiplierKillScore( Multiplier )
|
||||
|
||||
self.MultiplierKillScore = Multiplier
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Set the multiplier for scoring penalty kills (friendly kills).
|
||||
-- A calculated score is a value between 0.1 and 10.
|
||||
-- The multiplier magnifies the scores given to the players.
|
||||
-- @param #SCORING self
|
||||
-- @param #number Multiplier The multiplier of the score given.
|
||||
function SCORING:SetMultiplierKillPenalty( Multiplier )
|
||||
|
||||
self.MultiplierKillPenalty = Multiplier
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Specify a special additional score for a @{Unit}.
|
||||
-- @param #SCORING self
|
||||
-- @param Wrapper.Unit#UNIT ScoreUnit The @{Unit} for which the Score is given.
|
||||
-- @param #number Score The Score value.
|
||||
function SCORING:SetScoreUnit( ScoreUnit, Score )
|
||||
|
||||
local UnitName = ScoreUnit:GetName()
|
||||
|
||||
self.ScoreUnits[UnitName] = Score
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Specify a special additional score for a @{Group}.
|
||||
-- @param #SCORING self
|
||||
-- @param Wrapper.Group#GROUP ScoreGroup The @{Group} for which each @{Unit} a Score is given.
|
||||
-- @param #number Score The Score value.
|
||||
function SCORING:SetScoreGroup( ScoreGroup, Score )
|
||||
|
||||
local ScoreUnits = ScoreGroup:GetUnits()
|
||||
|
||||
for ScoreUnitID, ScoreUnit in pairs( ScoreUnits ) do
|
||||
local UnitName = ScoreUnit:GetName()
|
||||
self.ScoreUnits[UnitName] = Score
|
||||
end
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
|
||||
|
||||
--- Creates a score radio menu. Can be accessed using Radio -> F10.
|
||||
-- @param #SCORING self
|
||||
-- @return #SCORING self
|
||||
@ -18244,30 +18357,30 @@ function SCORING:_EventOnDeadOrCrash( Event )
|
||||
if InitCoalition == TargetCoalition then
|
||||
local ThreatLevelTarget, ThreatTypeTarget = PlayerKill.UNIT:GetThreatLevel()
|
||||
local ThreatLevelPlayer = Player.UNIT:GetThreatLevel()
|
||||
local ThreatLevel = math.ceil( ThreatLevelTarget / ThreatLevelPlayer * 100 )
|
||||
local ThreatLevel = math.ceil( ( ThreatLevelTarget / ThreatLevelPlayer ) * self.MultiplierKillPenalty )
|
||||
self:E( { ThreatLevel = ThreatLevel, ThreatLevelTarget = ThreatLevelTarget, ThreatTypeTarget = ThreatTypeTarget, ThreatLevelPlayer = ThreatLevelPlayer } )
|
||||
|
||||
Player.Penalty = Player.Penalty + ThreatLevel * 4
|
||||
PlayerKill.Penalty = PlayerKill.Penalty + ThreatLevel * 4
|
||||
Player.Penalty = Player.Penalty + ThreatLevel
|
||||
PlayerKill.Penalty = PlayerKill.Penalty + ThreatLevel
|
||||
PlayerKill.PenaltyKill = PlayerKill.PenaltyKill + 1
|
||||
|
||||
if Player.HitPlayers[TargetPlayerName] then -- A player killed another player
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' killed friendly player '" .. TargetPlayerName .. "' " .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " ..
|
||||
PlayerKill.PenaltyKill .. " times. Penalty: -" .. PlayerKill.Penalty ..
|
||||
". Score Total:" .. Player.Score - Player.Penalty,
|
||||
5 ):ToAll()
|
||||
15 ):ToAll()
|
||||
else
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " ..
|
||||
PlayerKill.PenaltyKill .. " times. Penalty: -" .. PlayerKill.Penalty ..
|
||||
". Score Total:" .. Player.Score - Player.Penalty,
|
||||
5 ):ToAll()
|
||||
15 ):ToAll()
|
||||
end
|
||||
self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType )
|
||||
else
|
||||
|
||||
local ThreatLevelTarget, ThreatTypeTarget = PlayerKill.UNIT:GetThreatLevel()
|
||||
local ThreatLevelPlayer = Player.UNIT:GetThreatLevel()
|
||||
local ThreatLevel = math.ceil( ThreatLevelTarget / ThreatLevelPlayer * 100 )
|
||||
local ThreatLevel = math.ceil( ( ThreatLevelTarget / ThreatLevelPlayer ) * self.MultiplierKillScore )
|
||||
self:E( { ThreatLevel = ThreatLevel, ThreatLevelTarget = ThreatLevelTarget, ThreatTypeTarget = ThreatTypeTarget, ThreatLevelPlayer = ThreatLevelPlayer } )
|
||||
|
||||
Player.Score = Player.Score + ThreatLevel
|
||||
@ -18277,13 +18390,22 @@ function SCORING:_EventOnDeadOrCrash( Event )
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' killed enemy player '" .. TargetPlayerName .. "' " .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " ..
|
||||
PlayerKill.ScoreKill .. " times. Score: " .. PlayerKill.Score ..
|
||||
". Score Total:" .. Player.Score - Player.Penalty,
|
||||
5 ):ToAll()
|
||||
15 ):ToAll()
|
||||
else
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. ThreatTypeTarget .. " ) " ..
|
||||
PlayerKill.ScoreKill .. " times. Score: " .. PlayerKill.Score ..
|
||||
". Score Total:" .. Player.Score - Player.Penalty,
|
||||
5 ):ToAll()
|
||||
". Total:" .. Player.Score - Player.Penalty,
|
||||
15 ):ToAll()
|
||||
end
|
||||
|
||||
local UnitName = PlayerKill.UNIT:GetName()
|
||||
local ScoreUnit = self.ScoreUnits[UnitName]
|
||||
if ScoreUnit then
|
||||
Player.Score = Player.Score + ScoreUnit
|
||||
PlayerKill.Score = PlayerKill.Score + ScoreUnit
|
||||
MESSAGE:New( "Player '" .. PlayerName .. "' receives an extra " .. ScoreUnit .. " points! Total: " .. Player.Score - Player.Penalty,
|
||||
15 ):ToAll()
|
||||
end
|
||||
self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType )
|
||||
end
|
||||
end
|
||||
|
||||
@ -18,4 +18,10 @@ local CommandCenter = COMMANDCENTER:New( HQ, "Lima" )
|
||||
|
||||
local Scoring = SCORING:New( "Detect Demo" )
|
||||
|
||||
Scoring:SetMultiplierKillScore( 10 )
|
||||
|
||||
Scoring:SetMultiplierKillPenalty( 40 )
|
||||
|
||||
Scoring:SetScoreUnit( UNIT:FindByName( "Unit #001" ), 200 )
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@ -71,7 +71,7 @@
|
||||
<div id="content">
|
||||
<h1>Module <code>AI_Balancer</code></h1>
|
||||
|
||||
<p>Single-Player:<strong>No</strong> / Mulit-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>All</strong> -- <strong>AI Balancing will replace in multi player missions
|
||||
<p>Single-Player:<strong>No</strong> / Multi-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>All</strong> -- <strong>AI Balancing will replace in multi player missions
|
||||
non-occupied human slots with AI groups, in order to provide an engaging simulation environment,
|
||||
even when there are hardly any players in the mission.</strong></p>
|
||||
|
||||
|
||||
@ -71,7 +71,7 @@
|
||||
<div id="content">
|
||||
<h1>Module <code>AI_Cap</code></h1>
|
||||
|
||||
<p>Single-Player:<strong>Yes</strong> / Mulit-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Air</strong> -- <strong>Execute Combat Air Patrol (CAP).</strong></p>
|
||||
<p>Single-Player:<strong>Yes</strong> / Multi-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Air</strong> -- <strong>Execute Combat Air Patrol (CAP).</strong></p>
|
||||
|
||||
<p><img src="..\Presentations\AI_CAP\Dia1.JPG" alt="Banner Image"/></p>
|
||||
|
||||
|
||||
@ -71,7 +71,7 @@
|
||||
<div id="content">
|
||||
<h1>Module <code>AI_Cas</code></h1>
|
||||
|
||||
<p>Single-Player:<strong>Yes</strong> / Mulit-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Air</strong> --
|
||||
<p>Single-Player:<strong>Yes</strong> / Multi-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Air</strong> --
|
||||
<strong>Provide Close Air Support to friendly ground troops.</strong></p>
|
||||
|
||||
<p><img src="..\Presentations\AI_CAS\Dia1.JPG" alt="Banner Image"/></p>
|
||||
@ -307,7 +307,7 @@ It can be notified to go RTB through the <strong>RTB</strong> event.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(AI_CAS_ZONE).New">AI_CAS_ZONE:New(PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, PatrolAltType, EngageZone)</a></td>
|
||||
<td class="name" nowrap="nowrap"><a href="##(AI_CAS_ZONE).New">AI_CAS_ZONE:New(PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, EngageZone, PatrolAltType)</a></td>
|
||||
<td class="summary">
|
||||
<p>Creates a new AI<em>CAS</em>ZONE object</p>
|
||||
</td>
|
||||
@ -706,7 +706,7 @@ It can be notified to go RTB through the <strong>RTB</strong> event.</p>
|
||||
<dt>
|
||||
|
||||
<a id="#(AI_CAS_ZONE).New" >
|
||||
<strong>AI_CAS_ZONE:New(PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, PatrolAltType, EngageZone)</strong>
|
||||
<strong>AI_CAS_ZONE:New(PatrolZone, PatrolFloorAltitude, PatrolCeilingAltitude, PatrolMinSpeed, PatrolMaxSpeed, EngageZone, PatrolAltType)</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
@ -747,13 +747,14 @@ The maximum speed of the <a href="Controllable.html">Controllable</a> in km/h.</
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<p><code><em><a href="Dcs.DCSTypes.html##(AltitudeType)">Dcs.DCSTypes#AltitudeType</a> PatrolAltType </em></code>:
|
||||
The altitude type ("RADIO"=="AGL", "BARO"=="ASL"). Defaults to RADIO</p>
|
||||
<p><code><em><a href="Core.Zone.html##(ZONE_BASE)">Core.Zone#ZONE_BASE</a> EngageZone </em></code>:
|
||||
The zone where the engage will happen.</p>
|
||||
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<p><code><em><a href="Core.Zone.html##(ZONE)">Core.Zone#ZONE</a> EngageZone </em></code>: </p>
|
||||
<p><code><em><a href="Dcs.DCSTypes.html##(AltitudeType)">Dcs.DCSTypes#AltitudeType</a> PatrolAltType </em></code>:
|
||||
The altitude type ("RADIO"=="AGL", "BARO"=="ASL"). Defaults to RADIO</p>
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@ -71,7 +71,7 @@
|
||||
<div id="content">
|
||||
<h1>Module <code>AI_Patrol</code></h1>
|
||||
|
||||
<p>Single-Player:<strong>Yes</strong> / Mulit-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Air</strong> --
|
||||
<p>Single-Player:<strong>Yes</strong> / Multi-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Air</strong> --
|
||||
<strong>Air Patrolling or Staging.</strong></p>
|
||||
|
||||
<p><img src="..\Presentations\AI_PATROL\Dia1.JPG" alt="Banner Image"/></p>
|
||||
|
||||
@ -71,7 +71,7 @@
|
||||
<div id="content">
|
||||
<h1>Module <code>Cargo</code></h1>
|
||||
|
||||
<p>Single-Player:<strong>Yes</strong> / Mulit-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Ground</strong> -- <br/>
|
||||
<p>Single-Player:<strong>Yes</strong> / Multi-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Ground</strong> -- <br/>
|
||||
<strong>Management of logical cargo objects, that can be transported from and to transportation carriers.</strong></p>
|
||||
|
||||
<p><img src="..\Presentations\AI_CARGO\CARGO.JPG" alt="Banner Image"/></p>
|
||||
|
||||
@ -115,7 +115,7 @@ in the correct processing order.</p>
|
||||
|
||||
<p><img src="..\Presentations\EVENT\Dia6.JPG" alt="Objects"/></p>
|
||||
|
||||
<p>For most DCS events, the above order of updating will be followed.1</p>
|
||||
<p>For most DCS events, the above order of updating will be followed.</p>
|
||||
|
||||
<p><img src="..\Presentations\EVENT\Dia7.JPG" alt="Objects"/></p>
|
||||
|
||||
@ -206,6 +206,23 @@ There are basically 4 main categories of information stored in the EVENTDATA str
|
||||
|
||||
<p><img src="..\Presentations\EVENT\Dia14.JPG" alt="Objects"/></p>
|
||||
|
||||
<p><strong>IMPORTANT NOTE:</strong> Some events can involve not just UNIT objects, but also STATIC objects!!!
|
||||
In that case the initiator or target unit fields will refer to a STATIC object!
|
||||
In case a STATIC object is involved, the documentation indicates which fields will and won't not be populated.
|
||||
The fields <strong>IniCategory</strong> and <strong>TgtCategory</strong> contain the indicator which <strong>kind of object is involved</strong> in the event.
|
||||
You can use the enumerator <strong>Object.Category.UNIT</strong> and <strong>Object.Category.STATIC</strong> to check on IniCategory and TgtCategory.
|
||||
Example code snippet:</p>
|
||||
|
||||
<pre><code> if Event.IniCategory == Object.Category.UNIT then
|
||||
...
|
||||
end
|
||||
if Event.IniCategory == Object.Category.STATIC then
|
||||
...
|
||||
end
|
||||
</code></pre>
|
||||
|
||||
<p>When a static object is involved in the event, the Group and Player fields won't be populated.</p>
|
||||
|
||||
<hr/>
|
||||
|
||||
<h1><strong>API CHANGE HISTORY</strong></h1>
|
||||
@ -571,81 +588,141 @@ YYYY-MM-DD: CLASS:<strong>NewFunction( Params )</strong> added</p>
|
||||
<h2><a id="#(EVENTDATA)">Type <code>EVENTDATA</code></a></h2>
|
||||
<table class="function_list">
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).IniCategory">EVENTDATA.IniCategory</a></td>
|
||||
<td class="summary">
|
||||
<pre><code> (UNIT/STATIC) The initiator object category ( Object.Category.UNIT or Object.Category.STATIC ).
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).IniDCSGroup">EVENTDATA.IniDCSGroup</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<pre><code> (UNIT) The initiating {Dcs.DCSGroup#Group}.
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).IniDCSGroupName">EVENTDATA.IniDCSGroupName</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<p> (UNIT) The initiating Group name.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).IniDCSUnit">EVENTDATA.IniDCSUnit</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<pre><code> (UNIT/STATIC) The initiating <a href="Dcs.DCSUnit.html##(Unit)">Dcs.DCSUnit#Unit</a> or <a href="Dcs.DCSStaticObject.html##(StaticObject)">Dcs.DCSStaticObject#StaticObject</a>.
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).IniDCSUnitName">EVENTDATA.IniDCSUnitName</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<p> (UNIT/STATIC) The initiating Unit name.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).IniGroup">EVENTDATA.IniGroup</a></td>
|
||||
<td class="summary">
|
||||
<pre><code> (UNIT) The initiating MOOSE wrapper <a href="Wrapper.Group.html##(GROUP)">Wrapper.Group#GROUP</a> of the initiator Group object.
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).IniGroupName">EVENTDATA.IniGroupName</a></td>
|
||||
<td class="summary">
|
||||
<pre><code> (UNIT) The initiating GROUP name (same as IniDCSGroupName).
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).IniPlayerName">EVENTDATA.IniPlayerName</a></td>
|
||||
<td class="summary">
|
||||
<pre><code>(UNIT) The name of the initiating player in case the Unit is a client or player slot.
|
||||
</code></pre>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).IniUnit">EVENTDATA.IniUnit</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<pre><code> (UNIT/STATIC) The initiating MOOSE wrapper <a href="Wrapper.Unit.html##(UNIT)">Wrapper.Unit#UNIT</a> of the initiator Unit object.
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).IniUnitName">EVENTDATA.IniUnitName</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<pre><code> (UNIT/STATIC) The initiating UNIT name (same as IniDCSUnitName).
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).TgtCategory">EVENTDATA.TgtCategory</a></td>
|
||||
<td class="summary">
|
||||
<pre><code> (UNIT/STATIC) The target object category ( Object.Category.UNIT or Object.Category.STATIC ).
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).TgtDCSGroup">EVENTDATA.TgtDCSGroup</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<pre><code> (UNIT) The target {Dcs.DCSGroup#Group}.
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).TgtDCSGroupName">EVENTDATA.TgtDCSGroupName</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<p> (UNIT) The target Group name.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).TgtDCSUnit">EVENTDATA.TgtDCSUnit</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<pre><code> (UNIT/STATIC) The target <a href="Dcs.DCSUnit.html##(Unit)">Dcs.DCSUnit#Unit</a> or <a href="Dcs.DCSStaticObject.html##(StaticObject)">Dcs.DCSStaticObject#StaticObject</a>.
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).TgtDCSUnitName">EVENTDATA.TgtDCSUnitName</a></td>
|
||||
<td class="summary">
|
||||
<p> (UNIT/STATIC) The target Unit name.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).TgtGroup">EVENTDATA.TgtGroup</a></td>
|
||||
<td class="summary">
|
||||
<pre><code> (UNIT) The target MOOSE wrapper <a href="Wrapper.Group.html##(GROUP)">Wrapper.Group#GROUP</a> of the target Group object.
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).TgtGroupName">EVENTDATA.TgtGroupName</a></td>
|
||||
<td class="summary">
|
||||
<pre><code> (UNIT) The target GROUP name (same as TgtDCSGroupName).
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).TgtPlayerName">EVENTDATA.TgtPlayerName</a></td>
|
||||
<td class="summary">
|
||||
<pre><code>(UNIT) The name of the target player in case the Unit is a client or player slot.
|
||||
</code></pre>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).TgtUnit">EVENTDATA.TgtUnit</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<pre><code> (UNIT/STATIC) The target MOOSE wrapper <a href="Wrapper.Unit.html##(UNIT)">Wrapper.Unit#UNIT</a> of the target Unit object.
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).TgtUnitName">EVENTDATA.TgtUnitName</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<pre><code> (UNIT/STATIC) The target UNIT name (same as TgtDCSUnitName).
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -669,25 +746,28 @@ YYYY-MM-DD: CLASS:<strong>NewFunction( Params )</strong> added</p>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).id">EVENTDATA.id</a></td>
|
||||
<td class="summary">
|
||||
<p>The identifier of the event.</p>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).initiator">EVENTDATA.initiator</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<pre><code> (UNIT/STATIC) The initiating <a href="Dcs.DCSUnit.html##(Unit)">Dcs.DCSUnit#Unit</a> or <a href="Dcs.DCSStaticObject.html##(StaticObject)">Dcs.DCSStaticObject#StaticObject</a>.
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).target">EVENTDATA.target</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<pre><code> (UNIT/STATIC) The target <a href="Dcs.DCSUnit.html##(Unit)">Dcs.DCSUnit#Unit</a> or <a href="Dcs.DCSStaticObject.html##(StaticObject)">Dcs.DCSStaticObject#StaticObject</a>.
|
||||
</code></pre>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(EVENTDATA).weapon">EVENTDATA.weapon</a></td>
|
||||
<td class="summary">
|
||||
|
||||
<p>The weapon used during the event.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@ -2438,71 +2518,135 @@ The self instance of the class for which the event is.</p>
|
||||
|
||||
<h2><a id="#(EVENTDATA)" >Type <code>EVENTDATA</code></a></h2>
|
||||
|
||||
<p>The Event structure</p>
|
||||
<p>The Event structure
|
||||
Note that at the beginning of each field description, there is an indication which field will be populated depending on the object type involved in the Event:</p>
|
||||
|
||||
<ul>
|
||||
<li>A (Object.Category.)UNIT : A UNIT object type is involved in the Event.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<ul>
|
||||
<li>A (Object.Category.)STATIC : A STATIC object type is involved in the Event.µ
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3>Field(s)</h3>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em><a href="Dcs.DCSObject.html##(Object.Category)">Dcs.DCSObject#Object.Category</a></em>
|
||||
<a id="#(EVENTDATA).IniCategory" >
|
||||
<strong>EVENTDATA.IniCategory</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<pre><code> (UNIT/STATIC) The initiator object category ( Object.Category.UNIT or Object.Category.STATIC ).
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em><a href="Dcs.DCSGroup.html##(Group)">Dcs.DCSGroup#Group</a></em>
|
||||
<a id="#(EVENTDATA).IniDCSGroup" >
|
||||
<strong>EVENTDATA.IniDCSGroup</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<pre><code> (UNIT) The initiating {Dcs.DCSGroup#Group}.
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em>#string</em>
|
||||
<a id="#(EVENTDATA).IniDCSGroupName" >
|
||||
<strong>EVENTDATA.IniDCSGroupName</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<p> (UNIT) The initiating Group name.</p>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em><a href="Dcs.DCSUnit.html##(Unit)">Dcs.DCSUnit#Unit</a></em>
|
||||
<a id="#(EVENTDATA).IniDCSUnit" >
|
||||
<strong>EVENTDATA.IniDCSUnit</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<pre><code> (UNIT/STATIC) The initiating <a href="Dcs.DCSUnit.html##(Unit)">Dcs.DCSUnit#Unit</a> or <a href="Dcs.DCSStaticObject.html##(StaticObject)">Dcs.DCSStaticObject#StaticObject</a>.
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em>#string</em>
|
||||
<a id="#(EVENTDATA).IniDCSUnitName" >
|
||||
<strong>EVENTDATA.IniDCSUnitName</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<p> (UNIT/STATIC) The initiating Unit name.</p>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em></em>
|
||||
<em><a href="Wrapper.Group.html##(GROUP)">Wrapper.Group#GROUP</a></em>
|
||||
<a id="#(EVENTDATA).IniGroup" >
|
||||
<strong>EVENTDATA.IniGroup</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<pre><code> (UNIT) The initiating MOOSE wrapper <a href="Wrapper.Group.html##(GROUP)">Wrapper.Group#GROUP</a> of the initiator Group object.
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em>#string</em>
|
||||
<a id="#(EVENTDATA).IniGroupName" >
|
||||
<strong>EVENTDATA.IniGroupName</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<pre><code> (UNIT) The initiating GROUP name (same as IniDCSGroupName).
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em>#string</em>
|
||||
<a id="#(EVENTDATA).IniPlayerName" >
|
||||
<strong>EVENTDATA.IniPlayerName</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<pre><code>(UNIT) The name of the initiating player in case the Unit is a client or player slot.
|
||||
</code></pre>
|
||||
|
||||
|
||||
</dd>
|
||||
@ -2517,7 +2661,8 @@ The self instance of the class for which the event is.</p>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<pre><code> (UNIT/STATIC) The initiating MOOSE wrapper <a href="Wrapper.Unit.html##(UNIT)">Wrapper.Unit#UNIT</a> of the initiator Unit object.
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
@ -2531,58 +2676,126 @@ The self instance of the class for which the event is.</p>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<pre><code> (UNIT/STATIC) The initiating UNIT name (same as IniDCSUnitName).
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em><a href="Dcs.DCSObject.html##(Object.Category)">Dcs.DCSObject#Object.Category</a></em>
|
||||
<a id="#(EVENTDATA).TgtCategory" >
|
||||
<strong>EVENTDATA.TgtCategory</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<pre><code> (UNIT/STATIC) The target object category ( Object.Category.UNIT or Object.Category.STATIC ).
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em><a href="Dcs.DCSGroup.html##(Group)">Dcs.DCSGroup#Group</a></em>
|
||||
<a id="#(EVENTDATA).TgtDCSGroup" >
|
||||
<strong>EVENTDATA.TgtDCSGroup</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<pre><code> (UNIT) The target {Dcs.DCSGroup#Group}.
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em>#string</em>
|
||||
<a id="#(EVENTDATA).TgtDCSGroupName" >
|
||||
<strong>EVENTDATA.TgtDCSGroupName</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<p> (UNIT) The target Group name.</p>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em><a href="Dcs.DCSUnit.html##(Unit)">Dcs.DCSUnit#Unit</a></em>
|
||||
<a id="#(EVENTDATA).TgtDCSUnit" >
|
||||
<strong>EVENTDATA.TgtDCSUnit</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<pre><code> (UNIT/STATIC) The target <a href="Dcs.DCSUnit.html##(Unit)">Dcs.DCSUnit#Unit</a> or <a href="Dcs.DCSStaticObject.html##(StaticObject)">Dcs.DCSStaticObject#StaticObject</a>.
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em>#string</em>
|
||||
<a id="#(EVENTDATA).TgtDCSUnitName" >
|
||||
<strong>EVENTDATA.TgtDCSUnitName</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<p> (UNIT/STATIC) The target Unit name.</p>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em><a href="Wrapper.Group.html##(GROUP)">Wrapper.Group#GROUP</a></em>
|
||||
<a id="#(EVENTDATA).TgtGroup" >
|
||||
<strong>EVENTDATA.TgtGroup</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<pre><code> (UNIT) The target MOOSE wrapper <a href="Wrapper.Group.html##(GROUP)">Wrapper.Group#GROUP</a> of the target Group object.
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em>#string</em>
|
||||
<a id="#(EVENTDATA).TgtGroupName" >
|
||||
<strong>EVENTDATA.TgtGroupName</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<pre><code> (UNIT) The target GROUP name (same as TgtDCSGroupName).
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em>#string</em>
|
||||
<a id="#(EVENTDATA).TgtPlayerName" >
|
||||
<strong>EVENTDATA.TgtPlayerName</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<pre><code>(UNIT) The name of the target player in case the Unit is a client or player slot.
|
||||
</code></pre>
|
||||
|
||||
|
||||
</dd>
|
||||
@ -2597,7 +2810,8 @@ The self instance of the class for which the event is.</p>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<pre><code> (UNIT/STATIC) The target MOOSE wrapper <a href="Wrapper.Unit.html##(UNIT)">Wrapper.Unit#UNIT</a> of the target Unit object.
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
@ -2611,7 +2825,8 @@ The self instance of the class for which the event is.</p>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<pre><code> (UNIT/STATIC) The target UNIT name (same as TgtDCSUnitName).
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
@ -2657,12 +2872,14 @@ The self instance of the class for which the event is.</p>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em>#number</em>
|
||||
<a id="#(EVENTDATA).id" >
|
||||
<strong>EVENTDATA.id</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<p>The identifier of the event.</p>
|
||||
|
||||
|
||||
</dd>
|
||||
@ -2670,26 +2887,30 @@ The self instance of the class for which the event is.</p>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em><a href="Dcs.DCSUnit.html##(Unit)">Dcs.DCSUnit#Unit</a></em>
|
||||
<a id="#(EVENTDATA).initiator" >
|
||||
<strong>EVENTDATA.initiator</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<pre><code> (UNIT/STATIC) The initiating <a href="Dcs.DCSUnit.html##(Unit)">Dcs.DCSUnit#Unit</a> or <a href="Dcs.DCSStaticObject.html##(StaticObject)">Dcs.DCSStaticObject#StaticObject</a>.
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em><a href="Dcs.DCSUnit.html##(Unit)">Dcs.DCSUnit#Unit</a></em>
|
||||
<a id="#(EVENTDATA).target" >
|
||||
<strong>EVENTDATA.target</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<pre><code> (UNIT/STATIC) The target <a href="Dcs.DCSUnit.html##(Unit)">Dcs.DCSUnit#Unit</a> or <a href="Dcs.DCSStaticObject.html##(StaticObject)">Dcs.DCSStaticObject#StaticObject</a>.
|
||||
</code></pre>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
@ -2702,7 +2923,7 @@ The self instance of the class for which the event is.</p>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
<p>The weapon used during the event.</p>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
@ -71,22 +71,86 @@
|
||||
<div id="content">
|
||||
<h1>Module <code>Scoring</code></h1>
|
||||
|
||||
<p>Scoring system for MOOSE.</p>
|
||||
<p>Single-Player:<strong>Yes</strong> / Multi-Player:<strong>Yes</strong> / Core:<strong>Yes</strong> -- <strong>Administer the scoring of player achievements,
|
||||
and create a CSV file logging the scoring events for use at team or squadron websites.</strong></p>
|
||||
|
||||
<p>-- <img src="..\Presentations\AI_Balancer\Dia1.JPG" alt="Banner Image"/></p>
|
||||
|
||||
<hr/>
|
||||
|
||||
<h1>1) <a href="Scoring.html##(SCORING)">Scoring#SCORING</a> class, extends <a href="Base.html##(BASE)">Base#BASE</a></h1>
|
||||
|
||||
<p>The <a href="##(SCORING)">#SCORING</a> class administers the scoring of player achievements,
|
||||
and creates a CSV file logging the scoring events for use at team or squadron websites.</p>
|
||||
|
||||
|
||||
<p>This scoring class calculates the hits and kills that players make within a simulation session.
|
||||
Scoring is calculated using a defined algorithm.
|
||||
With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded
|
||||
|
||||
<p>The scores are calculated by scoring the hits and kills of objects that players make,
|
||||
which are <a href="Unit.html">Unit</a> and <a href="Static.html">Static</a>s can be defined for which scores are also granted when a <a href="Scenery.html">Scenery</a> object is hit and killed within that Zone.</p>
|
||||
|
||||
<p>Scores are calculated based on the threat level of the objects involved.
|
||||
The threat level of a unit can be a value between 0 and 10.
|
||||
A calculated score takes the threat level of the target divided by the threat level of the player unit.
|
||||
This provides a value between 0.1 and 10.
|
||||
The stronger or the higher the threat of the player unit, the less score will be given in kills.</p>
|
||||
|
||||
|
||||
|
||||
<p>That value can then be multiplied by a multiplier. A multiplier can be set for enemies and friendlies kills.</p>
|
||||
|
||||
<p>Special scores can be given to specific units. These scores are added when player(s) kill that unit.</p>
|
||||
|
||||
<p>With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded
|
||||
to a database or a BI tool to publish the scoring results to the player community.</p>
|
||||
|
||||
<h2>1.1) Set the kill score or penalty multiplier</h2>
|
||||
|
||||
<p>Score multipliers can be set for scores granted when enemies or friendlies are killed.
|
||||
Use the method <a href="##(SCORING).SetMultiplierKillScore">SCORING.SetMultiplierKillScore</a>() to set the multiplier of enemy kills (positive kills).
|
||||
Use the method <a href="##(SCORING).SetMultiplierKillPenalty">SCORING.SetMultiplierKillPenalty</a>() to set the multiplier of friendly kills (negative kills).</p>
|
||||
|
||||
<h2>1.2) Define special targets in the mission that will give extra scores.</h2>
|
||||
|
||||
<p>Special targets can be set that will give extra scores to the players when these are killed.
|
||||
Use the method <a href="##(SCORING).SetScoreUnit">SCORING.SetScoreUnit</a>() to specify a special additional score for a specific <a href="Unit.html">Unit</a>.
|
||||
Use the method <a href="##(SCORING).SetScoreGroup">SCORING.SetScoreGroup</a>() to specify a special additional score for a specific <a href="Group.html">Group</a>.</p>
|
||||
|
||||
<hr/>
|
||||
|
||||
<h1><strong>API CHANGE HISTORY</strong></h1>
|
||||
|
||||
<p>The underlying change log documents the API changes. Please read this carefully. The following notation is used:</p>
|
||||
|
||||
<ul>
|
||||
<li><strong>Added</strong> parts are expressed in bold type face.</li>
|
||||
<li><em>Removed</em> parts are expressed in italic type face.</li>
|
||||
</ul>
|
||||
|
||||
<p>Hereby the change log:</p>
|
||||
|
||||
<p>2017-02-26: Initial class and API.</p>
|
||||
|
||||
<hr/>
|
||||
|
||||
<h1><strong>AUTHORS and CONTRIBUTIONS</strong></h1>
|
||||
|
||||
<h3>Contributions:</h3>
|
||||
|
||||
<ul>
|
||||
<li><strong>Wingthor</strong>: Testing & Advice.</li>
|
||||
<li><strong>Dutch-Baron</strong>: Testing & Advice.</li>
|
||||
<li>**<a href="http://forums.eagle.ru/member.php?u=3829">Whisper</a>: Testing.</li>
|
||||
</ul>
|
||||
|
||||
<h3>Authors:</h3>
|
||||
|
||||
<ul>
|
||||
<li><strong>FlightControl</strong>: Concept, Design & Programming.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Global(s)</h2>
|
||||
<table class="function_list">
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="#ClientGroup">ClientGroup</a></td>
|
||||
<td class="summary">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="#SCORING">SCORING</a></td>
|
||||
<td class="summary">
|
||||
@ -142,6 +206,18 @@ to a database or a BI tool to publish the scoring results to the player communit
|
||||
<td class="name" nowrap="nowrap"><a href="##(SCORING).Menu">SCORING.Menu</a></td>
|
||||
<td class="summary">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(SCORING).MultiplierKillPenalty">SCORING.MultiplierKillPenalty</a></td>
|
||||
<td class="summary">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(SCORING).MultiplierKillScore">SCORING.MultiplierKillScore</a></td>
|
||||
<td class="summary">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -202,6 +278,30 @@ to a database or a BI tool to publish the scoring results to the player communit
|
||||
<td class="name" nowrap="nowrap"><a href="##(SCORING).SecondsToClock">SCORING:SecondsToClock(sSeconds)</a></td>
|
||||
<td class="summary">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(SCORING).SetMultiplierKillPenalty">SCORING:SetMultiplierKillPenalty(Multiplier)</a></td>
|
||||
<td class="summary">
|
||||
<p>Set the multiplier for scoring penalty kills (friendly kills).</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(SCORING).SetMultiplierKillScore">SCORING:SetMultiplierKillScore(Multiplier)</a></td>
|
||||
<td class="summary">
|
||||
<p>Set the multiplier for scoring valid kills (enemy kills).</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(SCORING).SetScoreGroup">SCORING:SetScoreGroup(ScoreGroup, Score)</a></td>
|
||||
<td class="summary">
|
||||
<p>Specify a special additional score for a <a href="Group.html">Group</a>.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(SCORING).SetScoreUnit">SCORING:SetScoreUnit(ScoreUnit, Score)</a></td>
|
||||
<td class="summary">
|
||||
<p>Specify a special additional score for a <a href="Unit.html">Unit</a>.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -246,20 +346,6 @@ to a database or a BI tool to publish the scoring results to the player communit
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em></em>
|
||||
<a id="ClientGroup" >
|
||||
<strong>ClientGroup</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em><a href="##(SCORING)">#SCORING</a></em>
|
||||
<a id="SCORING" >
|
||||
<strong>SCORING</strong>
|
||||
@ -387,6 +473,34 @@ to a database or a BI tool to publish the scoring results to the player communit
|
||||
|
||||
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em></em>
|
||||
<a id="#(SCORING).MultiplierKillPenalty" >
|
||||
<strong>SCORING.MultiplierKillPenalty</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em></em>
|
||||
<a id="#(SCORING).MultiplierKillScore" >
|
||||
<strong>SCORING.MultiplierKillScore</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
@ -656,6 +770,114 @@ self</p>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<a id="#(SCORING).SetMultiplierKillPenalty" >
|
||||
<strong>SCORING:SetMultiplierKillPenalty(Multiplier)</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<p>Set the multiplier for scoring penalty kills (friendly kills).</p>
|
||||
|
||||
|
||||
<p>A calculated score is a value between 0.1 and 10.
|
||||
The multiplier magnifies the scores given to the players.</p>
|
||||
|
||||
<h3>Parameter</h3>
|
||||
<ul>
|
||||
<li>
|
||||
|
||||
<p><code><em>#number Multiplier </em></code>:
|
||||
The multiplier of the score given.</p>
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<a id="#(SCORING).SetMultiplierKillScore" >
|
||||
<strong>SCORING:SetMultiplierKillScore(Multiplier)</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<p>Set the multiplier for scoring valid kills (enemy kills).</p>
|
||||
|
||||
|
||||
<p>A calculated score is a value between 0.1 and 10.
|
||||
The multiplier magnifies the scores given to the players.</p>
|
||||
|
||||
<h3>Parameter</h3>
|
||||
<ul>
|
||||
<li>
|
||||
|
||||
<p><code><em>#number Multiplier </em></code>:
|
||||
The multiplier of the score given.</p>
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<a id="#(SCORING).SetScoreGroup" >
|
||||
<strong>SCORING:SetScoreGroup(ScoreGroup, Score)</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<p>Specify a special additional score for a <a href="Group.html">Group</a>.</p>
|
||||
|
||||
<h3>Parameters</h3>
|
||||
<ul>
|
||||
<li>
|
||||
|
||||
<p><code><em><a href="Wrapper.Group.html##(GROUP)">Wrapper.Group#GROUP</a> ScoreGroup </em></code>:
|
||||
The <a href="Group.html">Group</a> for which each <a href="Unit.html">Unit</a> a Score is given.</p>
|
||||
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<p><code><em>#number Score </em></code>:
|
||||
The Score value.</p>
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<a id="#(SCORING).SetScoreUnit" >
|
||||
<strong>SCORING:SetScoreUnit(ScoreUnit, Score)</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
<p>Specify a special additional score for a <a href="Unit.html">Unit</a>.</p>
|
||||
|
||||
<h3>Parameters</h3>
|
||||
<ul>
|
||||
<li>
|
||||
|
||||
<p><code><em><a href="Wrapper.Unit.html##(UNIT)">Wrapper.Unit#UNIT</a> ScoreUnit </em></code>:
|
||||
The <a href="Unit.html">Unit</a> for which the Score is given.</p>
|
||||
|
||||
</li>
|
||||
<li>
|
||||
|
||||
<p><code><em>#number Score </em></code>:
|
||||
The Score value.</p>
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<a id="#(SCORING)._AddMissionScore" >
|
||||
<strong>SCORING:_AddMissionScore(Mission, PlayerUnit, Text, Score)</strong>
|
||||
</a>
|
||||
@ -740,7 +962,7 @@ self</p>
|
||||
<ul>
|
||||
<li>
|
||||
|
||||
<p><code><em> UnitData </em></code>: </p>
|
||||
<p><code><em><a href="Wrapper.Unit.html##(UNIT)">Wrapper.Unit#UNIT</a> UnitData </em></code>: </p>
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@ -71,7 +71,7 @@
|
||||
<div id="content">
|
||||
<h1>Module <code>Spawn</code></h1>
|
||||
|
||||
<p>Single-Player:<strong>Yes</strong> / Mulit-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>All</strong> -- <br/>
|
||||
<p>Single-Player:<strong>Yes</strong> / Multi-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>All</strong> -- <br/>
|
||||
<strong>Spawn groups of units dynamically in your missions.</strong></p>
|
||||
|
||||
<p><img src="..\Presentations\SPAWN\SPAWN.JPG" alt="Banner Image"/></p>
|
||||
@ -1758,6 +1758,9 @@ The group that was spawned. You can use this group for further actions.</p>
|
||||
|
||||
|
||||
|
||||
|
||||
<p> Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning.</p>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
@ -2528,7 +2531,7 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 )
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<em></em>
|
||||
<em>#boolean</em>
|
||||
<a id="#(SPAWN).SpawnUnControlled" >
|
||||
<strong>SPAWN.SpawnUnControlled</strong>
|
||||
</a>
|
||||
@ -2552,7 +2555,7 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 )
|
||||
|
||||
|
||||
|
||||
<p> Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned.</p>
|
||||
<p> When the first Spawn executes, all the Groups need to be made visible before start.</p>
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
@ -133,6 +133,12 @@ If the DCS Static object does not exist or is nil, the STATIC methods will retur
|
||||
<td class="name" nowrap="nowrap"><a href="##(STATIC).GetDCSObject">STATIC:GetDCSObject()</a></td>
|
||||
<td class="summary">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="##(STATIC).GetThreatLevel">STATIC:GetThreatLevel()</a></td>
|
||||
<td class="summary">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -226,6 +232,19 @@ Name of the DCS <strong>Static</strong> as defined within the Mission Editor.</p
|
||||
|
||||
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
<dt>
|
||||
|
||||
<a id="#(STATIC).GetThreatLevel" >
|
||||
<strong>STATIC:GetThreatLevel()</strong>
|
||||
</a>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
|
||||
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="function">
|
||||
|
||||
@ -74,7 +74,7 @@
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="AI_Balancer.html">AI_Balancer</a></td>
|
||||
<td class="summary">
|
||||
<p>Single-Player:<strong>No</strong> / Mulit-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>All</strong> -- <strong>AI Balancing will replace in multi player missions
|
||||
<p>Single-Player:<strong>No</strong> / Multi-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>All</strong> -- <strong>AI Balancing will replace in multi player missions
|
||||
non-occupied human slots with AI groups, in order to provide an engaging simulation environment,
|
||||
even when there are hardly any players in the mission.</strong></p>
|
||||
|
||||
@ -91,7 +91,7 @@ CLIENTS in a SET_CLIENT collection, which are not occupied by human players.</p>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="AI_Cap.html">AI_Cap</a></td>
|
||||
<td class="summary">
|
||||
<p>Single-Player:<strong>Yes</strong> / Mulit-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Air</strong> -- <strong>Execute Combat Air Patrol (CAP).</strong></p>
|
||||
<p>Single-Player:<strong>Yes</strong> / Multi-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Air</strong> -- <strong>Execute Combat Air Patrol (CAP).</strong></p>
|
||||
|
||||
<p><img src="..\Presentations\AI_CAP\Dia1.JPG" alt="Banner Image"/></p>
|
||||
|
||||
@ -106,7 +106,7 @@ and automatically engage any airborne enemies that are within a certain range or
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="AI_Cas.html">AI_Cas</a></td>
|
||||
<td class="summary">
|
||||
<p>Single-Player:<strong>Yes</strong> / Mulit-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Air</strong> --
|
||||
<p>Single-Player:<strong>Yes</strong> / Multi-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Air</strong> --
|
||||
<strong>Provide Close Air Support to friendly ground troops.</strong></p>
|
||||
|
||||
<p><img src="..\Presentations\AI_CAS\Dia1.JPG" alt="Banner Image"/></p>
|
||||
@ -121,7 +121,7 @@ and automatically engage any airborne enemies that are within a certain range or
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="AI_Patrol.html">AI_Patrol</a></td>
|
||||
<td class="summary">
|
||||
<p>Single-Player:<strong>Yes</strong> / Mulit-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Air</strong> --
|
||||
<p>Single-Player:<strong>Yes</strong> / Multi-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Air</strong> --
|
||||
<strong>Air Patrolling or Staging.</strong></p>
|
||||
|
||||
<p><img src="..\Presentations\AI_PATROL\Dia1.JPG" alt="Banner Image"/></p>
|
||||
@ -166,7 +166,7 @@ and automatically engage any airborne enemies that are within a certain range or
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="Cargo.html">Cargo</a></td>
|
||||
<td class="summary">
|
||||
<p>Single-Player:<strong>Yes</strong> / Mulit-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Ground</strong> -- <br/>
|
||||
<p>Single-Player:<strong>Yes</strong> / Multi-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>Ground</strong> -- <br/>
|
||||
<strong>Management of logical cargo objects, that can be transported from and to transportation carriers.</strong></p>
|
||||
|
||||
<p><img src="..\Presentations\AI_CARGO\CARGO.JPG" alt="Banner Image"/></p>
|
||||
@ -334,7 +334,17 @@ following a given priority.</p>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="Scoring.html">Scoring</a></td>
|
||||
<td class="summary">
|
||||
<p>Scoring system for MOOSE.</p>
|
||||
<p>Single-Player:<strong>Yes</strong> / Multi-Player:<strong>Yes</strong> / Core:<strong>Yes</strong> -- <strong>Administer the scoring of player achievements,
|
||||
and create a CSV file logging the scoring events for use at team or squadron websites.</strong></p>
|
||||
|
||||
<p>-- <img src="..\Presentations\AI_Balancer\Dia1.JPG" alt="Banner Image"/></p>
|
||||
|
||||
<hr/>
|
||||
|
||||
<h1>1) <a href="Scoring.html##(SCORING)">Scoring#SCORING</a> class, extends <a href="Base.html##(BASE)">Base#BASE</a></h1>
|
||||
|
||||
<p>The <a href="##(SCORING)">#SCORING</a> class administers the scoring of player achievements,
|
||||
and creates a CSV file logging the scoring events for use at team or squadron websites.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -358,7 +368,7 @@ following a given priority.</p>
|
||||
<tr>
|
||||
<td class="name" nowrap="nowrap"><a href="Spawn.html">Spawn</a></td>
|
||||
<td class="summary">
|
||||
<p>Single-Player:<strong>Yes</strong> / Mulit-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>All</strong> -- <br/>
|
||||
<p>Single-Player:<strong>Yes</strong> / Multi-Player:<strong>Yes</strong> / AI:<strong>Yes</strong> / Human:<strong>No</strong> / Types:<strong>All</strong> -- <br/>
|
||||
<strong>Spawn groups of units dynamically in your missions.</strong></p>
|
||||
|
||||
<p><img src="..\Presentations\SPAWN\SPAWN.JPG" alt="Banner Image"/></p>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user