mirror of
https://github.com/iTracerFacer/DCS_MissionDev.git
synced 2025-12-03 04:14:46 +00:00
Nice working spot for polar shield.
This commit is contained in:
parent
84d56092d6
commit
b4478ccec0
Binary file not shown.
@ -140,6 +140,74 @@ local function OnEnterAttacked(ZoneCapture)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Victory condition monitoring
|
||||||
|
local function CheckVictoryCondition()
|
||||||
|
local blueZonesCount = 0
|
||||||
|
local totalZones = #zoneCaptureObjects
|
||||||
|
|
||||||
|
for i, zoneCapture in ipairs(zoneCaptureObjects) do
|
||||||
|
if zoneCapture and zoneCapture:GetCoalition() == coalition.side.BLUE then
|
||||||
|
blueZonesCount = blueZonesCount + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
env.info(string.format("[VICTORY CHECK] Blue owns %d/%d zones", blueZonesCount, totalZones))
|
||||||
|
|
||||||
|
if blueZonesCount >= totalZones then
|
||||||
|
-- All zones captured by BLUE - trigger victory condition
|
||||||
|
env.info("[VICTORY] All zones captured by BLUE! Triggering victory sequence...")
|
||||||
|
|
||||||
|
-- Victory messages
|
||||||
|
US_CC:MessageTypeToCoalition(
|
||||||
|
"VICTORY! All capture zones have been secured by coalition forces!\n\n" ..
|
||||||
|
"Operation Polar Shield is complete. Outstanding work!\n" ..
|
||||||
|
"Mission will end in 60 seconds.",
|
||||||
|
MESSAGE.Type.Information, 30
|
||||||
|
)
|
||||||
|
|
||||||
|
RU_CC:MessageTypeToCoalition(
|
||||||
|
"DEFEAT! All strategic positions have been lost to coalition forces.\n\n" ..
|
||||||
|
"Operation Polar Shield has failed. Mission ending in 60 seconds.",
|
||||||
|
MESSAGE.Type.Information, 30
|
||||||
|
)
|
||||||
|
|
||||||
|
-- Optional: Add victory celebration effects
|
||||||
|
for _, zoneCapture in ipairs(zoneCaptureObjects) do
|
||||||
|
if zoneCapture then
|
||||||
|
zoneCapture:Smoke( SMOKECOLOR.Blue )
|
||||||
|
-- Add flares for celebration
|
||||||
|
local zone = zoneCapture:GetZone()
|
||||||
|
if zone then
|
||||||
|
zone:FlareZone( FLARECOLOR.Blue, 90, 60 )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Schedule mission end after 60 seconds
|
||||||
|
SCHEDULER:New( nil, function()
|
||||||
|
env.info("[VICTORY] Ending mission due to complete zone capture by BLUE")
|
||||||
|
-- You can trigger specific end-mission logic here
|
||||||
|
-- For example: trigger.action.setUserFlag("MissionComplete", 1)
|
||||||
|
-- Or call specific mission ending functions
|
||||||
|
|
||||||
|
-- Example mission end trigger
|
||||||
|
trigger.action.setUserFlag("BLUE_VICTORY", 1)
|
||||||
|
|
||||||
|
-- Optional: Show final score/statistics
|
||||||
|
US_CC:MessageTypeToCoalition(
|
||||||
|
"Mission Complete! Congratulations on your victory!\n" ..
|
||||||
|
"Final Status: All 10 strategic zones secured.",
|
||||||
|
MESSAGE.Type.Information, 10
|
||||||
|
)
|
||||||
|
|
||||||
|
end, {}, 60 )
|
||||||
|
|
||||||
|
return true -- Victory achieved
|
||||||
|
end
|
||||||
|
|
||||||
|
return false -- Victory not yet achieved
|
||||||
|
end
|
||||||
|
|
||||||
local function OnEnterCaptured(ZoneCapture)
|
local function OnEnterCaptured(ZoneCapture)
|
||||||
local Coalition = ZoneCapture:GetCoalition()
|
local Coalition = ZoneCapture:GetCoalition()
|
||||||
if Coalition == coalition.side.BLUE then
|
if Coalition == coalition.side.BLUE then
|
||||||
@ -152,6 +220,9 @@ local function OnEnterCaptured(ZoneCapture)
|
|||||||
|
|
||||||
ZoneCapture:AddScore( "Captured", "Zone captured: Extra points granted.", 200 )
|
ZoneCapture:AddScore( "Captured", "Zone captured: Extra points granted.", 200 )
|
||||||
ZoneCapture:__Guard( 30 )
|
ZoneCapture:__Guard( 30 )
|
||||||
|
|
||||||
|
-- Check victory condition after any zone capture
|
||||||
|
CheckVictoryCondition()
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Apply event handlers to all zone capture objects
|
-- Apply event handlers to all zone capture objects
|
||||||
@ -237,3 +308,139 @@ else
|
|||||||
env.info("✗ ZoneCapture_Olenya object is nil!")
|
env.info("✗ ZoneCapture_Olenya object is nil!")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- ==========================================
|
||||||
|
-- VICTORY MONITORING SYSTEM
|
||||||
|
-- ==========================================
|
||||||
|
|
||||||
|
-- Function to get current zone ownership status
|
||||||
|
local function GetZoneOwnershipStatus()
|
||||||
|
local status = {
|
||||||
|
blue = 0,
|
||||||
|
red = 0,
|
||||||
|
neutral = 0,
|
||||||
|
total = #zoneCaptureObjects,
|
||||||
|
zones = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Explicitly reference the global coalition table to avoid parameter shadowing
|
||||||
|
local coalitionTable = _G.coalition or coalition
|
||||||
|
|
||||||
|
for i, zoneCapture in ipairs(zoneCaptureObjects) do
|
||||||
|
if zoneCapture then
|
||||||
|
local zoneCoalition = zoneCapture:GetCoalition()
|
||||||
|
local zoneName = zoneNames[i] or ("Zone " .. i)
|
||||||
|
|
||||||
|
if zoneCoalition == coalitionTable.side.BLUE then
|
||||||
|
status.blue = status.blue + 1
|
||||||
|
status.zones[zoneName] = "BLUE"
|
||||||
|
elseif zoneCoalition == coalitionTable.side.RED then
|
||||||
|
status.red = status.red + 1
|
||||||
|
status.zones[zoneName] = "RED"
|
||||||
|
else
|
||||||
|
status.neutral = status.neutral + 1
|
||||||
|
status.zones[zoneName] = "NEUTRAL"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return status
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Function to broadcast zone status report
|
||||||
|
local function BroadcastZoneStatus()
|
||||||
|
local status = GetZoneOwnershipStatus()
|
||||||
|
|
||||||
|
local reportMessage = string.format(
|
||||||
|
"ZONE CONTROL REPORT:\n" ..
|
||||||
|
"Blue Coalition: %d/%d zones\n" ..
|
||||||
|
"Red Coalition: %d/%d zones\n" ..
|
||||||
|
"Neutral: %d/%d zones\n\n" ..
|
||||||
|
"Progress to Victory: %d%%",
|
||||||
|
status.blue, status.total,
|
||||||
|
status.red, status.total,
|
||||||
|
status.neutral, status.total,
|
||||||
|
math.floor((status.blue / status.total) * 100)
|
||||||
|
)
|
||||||
|
|
||||||
|
-- Add detailed zone status
|
||||||
|
local detailMessage = "\nZONE DETAILS:\n"
|
||||||
|
for zoneName, owner in pairs(status.zones) do
|
||||||
|
detailMessage = detailMessage .. string.format("• %s: %s\n", zoneName, owner)
|
||||||
|
end
|
||||||
|
|
||||||
|
local fullMessage = reportMessage .. detailMessage
|
||||||
|
|
||||||
|
US_CC:MessageTypeToCoalition( fullMessage, MESSAGE.Type.Information, 15 )
|
||||||
|
|
||||||
|
env.info("[ZONE STATUS] " .. reportMessage:gsub("\n", " | "))
|
||||||
|
|
||||||
|
return status
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Periodic zone monitoring (every 5 minutes)
|
||||||
|
local ZoneMonitorScheduler = SCHEDULER:New( nil, function()
|
||||||
|
local status = BroadcastZoneStatus()
|
||||||
|
|
||||||
|
-- Check if we're close to victory (80% or more zones captured)
|
||||||
|
if status.blue >= math.floor(status.total * 0.8) and status.blue < status.total then
|
||||||
|
US_CC:MessageTypeToCoalition(
|
||||||
|
string.format("APPROACHING VICTORY! %d more zone(s) needed for complete success!",
|
||||||
|
status.total - status.blue),
|
||||||
|
MESSAGE.Type.Information, 10
|
||||||
|
)
|
||||||
|
|
||||||
|
RU_CC:MessageTypeToCoalition(
|
||||||
|
string.format("CRITICAL SITUATION! Only %d zone(s) remain under our control!",
|
||||||
|
status.red),
|
||||||
|
MESSAGE.Type.Information, 10
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
end, {}, 10, 300 ) -- Start after 10 seconds, repeat every 300 seconds (5 minutes)
|
||||||
|
|
||||||
|
-- Manual zone status command for players (F10 radio menu)
|
||||||
|
local function SetupZoneStatusCommands()
|
||||||
|
-- Add F10 radio menu commands for zone status
|
||||||
|
if US_CC then
|
||||||
|
local USMenu = MENU_COALITION:New( coalition.side.BLUE, "Zone Control" )
|
||||||
|
MENU_COALITION_COMMAND:New( coalition.side.BLUE, "Get Zone Status Report", USMenu, BroadcastZoneStatus )
|
||||||
|
|
||||||
|
MENU_COALITION_COMMAND:New( coalition.side.BLUE, "Check Victory Progress", USMenu, function()
|
||||||
|
local status = GetZoneOwnershipStatus()
|
||||||
|
local progressPercent = math.floor((status.blue / status.total) * 100)
|
||||||
|
|
||||||
|
US_CC:MessageTypeToCoalition(
|
||||||
|
string.format(
|
||||||
|
"VICTORY PROGRESS: %d%%\n" ..
|
||||||
|
"Zones Captured: %d/%d\n" ..
|
||||||
|
"Remaining: %d zones\n\n" ..
|
||||||
|
"%s",
|
||||||
|
progressPercent,
|
||||||
|
status.blue, status.total,
|
||||||
|
status.total - status.blue,
|
||||||
|
progressPercent >= 100 and "MISSION COMPLETE!" or
|
||||||
|
progressPercent >= 80 and "ALMOST THERE!" or
|
||||||
|
progressPercent >= 50 and "GOOD PROGRESS!" or
|
||||||
|
"KEEP FIGHTING!"
|
||||||
|
),
|
||||||
|
MESSAGE.Type.Information, 10
|
||||||
|
)
|
||||||
|
end )
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Initialize zone status monitoring
|
||||||
|
SCHEDULER:New( nil, function()
|
||||||
|
env.info("[VICTORY SYSTEM] Initializing zone monitoring system...")
|
||||||
|
SetupZoneStatusCommands()
|
||||||
|
|
||||||
|
-- Initial status report
|
||||||
|
SCHEDULER:New( nil, function()
|
||||||
|
env.info("[VICTORY SYSTEM] Broadcasting initial zone status...")
|
||||||
|
BroadcastZoneStatus()
|
||||||
|
end, {}, 30 ) -- Initial report after 30 seconds
|
||||||
|
|
||||||
|
end, {}, 5 ) -- Initialize after 5 seconds
|
||||||
|
|
||||||
|
env.info("[VICTORY SYSTEM] Zone capture victory monitoring system loaded successfully!")
|
||||||
|
|
||||||
|
|||||||
@ -3,8 +3,8 @@
|
|||||||
|
|
||||||
|
|
||||||
-- Set Spawn Limits - These limits can be adjusted to change the number of ground units that will spawn for each type.
|
-- Set Spawn Limits - These limits can be adjusted to change the number of ground units that will spawn for each type.
|
||||||
-- These are max units, not groups. For example, the manpad group in the mission editor is 2 units. So if MAX_RU_MANPADS = 10, then 5 groups of manpads will spawn.
|
-- These set max units, not groups. For example, the manpad group in the mission editor is 2 units. So if MAX_RU_MANPADS = 10, then 5 groups of manpads will spawn.
|
||||||
-- So you have to knnow how many units are in each group to set these limits effectively.
|
-- So you have to know how many units are in each group to set these limits effectively.
|
||||||
|
|
||||||
MAX_RU_MANPADS = 10 -- Each group has 2 units, so 10 = 5 groups of 2.
|
MAX_RU_MANPADS = 10 -- Each group has 2 units, so 10 = 5 groups of 2.
|
||||||
MAX_RU_AAA = 25 -- Each group has 1 units, so 25 = 25 groups of 1.
|
MAX_RU_AAA = 25 -- Each group has 1 units, so 25 = 25 groups of 1.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user