Scoring updates

This commit is contained in:
FlightControl 2017-02-26 22:55:36 +01:00
parent c9c3b11b14
commit 1e143778bd
16 changed files with 968 additions and 120 deletions

View File

@ -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.**
--
-- -- ![Banner Image](..\Presentations\AI_Balancer\Dia1.JPG)
-- -- ![Banner Image](..\Presentations\Scoring\Dia1.JPG)
--
-- ===
--
@ -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

View File

@ -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.**
--
-- -- ![Banner Image](..\Presentations\AI_Balancer\Dia1.JPG)
-- -- ![Banner Image](..\Presentations\Scoring\Dia1.JPG)
--
-- ===
--
@ -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

View File

@ -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.**
--
-- -- ![Banner Image](..\Presentations\AI_Balancer\Dia1.JPG)
-- -- ![Banner Image](..\Presentations\Scoring\Dia1.JPG)
--
-- ===
--
@ -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

View File

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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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 &lt;a href="Dcs.DCSUnit.html##(Unit)"&gt;Dcs.DCSUnit#Unit&lt;/a&gt; or &lt;a href="Dcs.DCSStaticObject.html##(StaticObject)"&gt;Dcs.DCSStaticObject#StaticObject&lt;/a&gt;.
</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 &lt;a href="Wrapper.Group.html##(GROUP)"&gt;Wrapper.Group#GROUP&lt;/a&gt; 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 &lt;a href="Wrapper.Unit.html##(UNIT)"&gt;Wrapper.Unit#UNIT&lt;/a&gt; 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 &lt;a href="Dcs.DCSUnit.html##(Unit)"&gt;Dcs.DCSUnit#Unit&lt;/a&gt; or &lt;a href="Dcs.DCSStaticObject.html##(StaticObject)"&gt;Dcs.DCSStaticObject#StaticObject&lt;/a&gt;.
</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 &lt;a href="Wrapper.Group.html##(GROUP)"&gt;Wrapper.Group#GROUP&lt;/a&gt; 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 &lt;a href="Wrapper.Unit.html##(UNIT)"&gt;Wrapper.Unit#UNIT&lt;/a&gt; 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 &lt;a href="Dcs.DCSUnit.html##(Unit)"&gt;Dcs.DCSUnit#Unit&lt;/a&gt; or &lt;a href="Dcs.DCSStaticObject.html##(StaticObject)"&gt;Dcs.DCSStaticObject#StaticObject&lt;/a&gt;.
</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 &lt;a href="Dcs.DCSUnit.html##(Unit)"&gt;Dcs.DCSUnit#Unit&lt;/a&gt; or &lt;a href="Dcs.DCSStaticObject.html##(StaticObject)"&gt;Dcs.DCSStaticObject#StaticObject&lt;/a&gt;.
</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 &lt;a href="Dcs.DCSUnit.html##(Unit)"&gt;Dcs.DCSUnit#Unit&lt;/a&gt; or &lt;a href="Dcs.DCSStaticObject.html##(StaticObject)"&gt;Dcs.DCSStaticObject#StaticObject&lt;/a&gt;.
</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 &lt;a href="Wrapper.Group.html##(GROUP)"&gt;Wrapper.Group#GROUP&lt;/a&gt; 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 &lt;a href="Wrapper.Unit.html##(UNIT)"&gt;Wrapper.Unit#UNIT&lt;/a&gt; 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 &lt;a href="Dcs.DCSUnit.html##(Unit)"&gt;Dcs.DCSUnit#Unit&lt;/a&gt; or &lt;a href="Dcs.DCSStaticObject.html##(StaticObject)"&gt;Dcs.DCSStaticObject#StaticObject&lt;/a&gt;.
</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 &lt;a href="Wrapper.Group.html##(GROUP)"&gt;Wrapper.Group#GROUP&lt;/a&gt; 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 &lt;a href="Wrapper.Unit.html##(UNIT)"&gt;Wrapper.Unit#UNIT&lt;/a&gt; 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 &lt;a href="Dcs.DCSUnit.html##(Unit)"&gt;Dcs.DCSUnit#Unit&lt;/a&gt; or &lt;a href="Dcs.DCSStaticObject.html##(StaticObject)"&gt;Dcs.DCSStaticObject#StaticObject&lt;/a&gt;.
</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 &lt;a href="Dcs.DCSUnit.html##(Unit)"&gt;Dcs.DCSUnit#Unit&lt;/a&gt; or &lt;a href="Dcs.DCSStaticObject.html##(StaticObject)"&gt;Dcs.DCSStaticObject#StaticObject&lt;/a&gt;.
</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>

View File

@ -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 &amp; Advice.</li>
<li><strong>Dutch-Baron</strong>: Testing &amp; 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 &amp; 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>

View File

@ -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>

View File

@ -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">

View File

@ -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>