From 0b1e435c5c53c00f9d46ca51196bfea45a56b3ca Mon Sep 17 00:00:00 2001 From: iTracerFacer <134304944+iTracerFacer@users.noreply.github.com> Date: Tue, 2 Dec 2025 21:28:55 -0600 Subject: [PATCH] Updated miz with updated scirpt and added DBG to example mission. --- Moose_DualCoalitionZoneCapture.lua | 71 +++++++++++--------- Moose_DualCoalitionZoneCapture.miz | Bin 2438844 -> 2447771 bytes Moose_DynamicGroundBattle_Plugin.lua | 97 ++++++++++++++++----------- 3 files changed, 98 insertions(+), 70 deletions(-) diff --git a/Moose_DualCoalitionZoneCapture.lua b/Moose_DualCoalitionZoneCapture.lua index d0e6962..e48a25c 100644 --- a/Moose_DualCoalitionZoneCapture.lua +++ b/Moose_DualCoalitionZoneCapture.lua @@ -69,6 +69,18 @@ local function GetZoneColor(zoneCapture) return ZONE_COLORS.EMPTY end +-- ========================================== +-- COALITION TITLES CONFIGURATION +-- ========================================== +-- Mission makers: Customize the display names for each coalition +-- These will be used in messages, mission names, and UI elements +local COALITION_TITLES = { + BLUE = "USA", -- Display name for Blue coalition (e.g., "USA", "NATO", "Allied Forces") + RED = "Russia", -- Display name for Red coalition (e.g., "Russia", "Germany", "Axis Powers") + BLUE_OPERATION = "Operation Polar Shield", -- Name of Blue coalition's operation + RED_OPERATION = "Defend the Motherland" -- Name of Red coalition's operation +} + -- ========================================== -- ZONE CONFIGURATION -- ========================================== @@ -80,7 +92,6 @@ end -- Note: Red/Blue/Neutral zones defined below are only setting their initial ownership state. -- If there are existing units in the zone at mission start, ownership may change based on unit presence. - local ZONE_CONFIG = { -- Zones that start under RED coalition control -- IMPORTANT: Use the EXACT zone names from the mission editor (including "Capture " prefix if present) @@ -119,7 +130,7 @@ local ZONE_SETTINGS = { -- Build Command Center and Mission for Blue Coalition local blueHQ = GROUP:FindByName("BLUEHQ") if blueHQ then - US_CC = COMMANDCENTER:New(blueHQ, "USA HQ") + US_CC = COMMANDCENTER:New(blueHQ, COALITION_TITLES.BLUE .. " HQ") US_Mission = MISSION:New(US_CC, "Zone Capture Example Mission", "Primary", "", coalition.side.BLUE) US_Score = SCORING:New("Zone Capture Example Mission") --US_Mission:AddScoring(US_Score) @@ -132,7 +143,7 @@ end --Build Command Center and Mission Red local redHQ = GROUP:FindByName("REDHQ") if redHQ then - RU_CC = COMMANDCENTER:New(redHQ, "Russia HQ") + RU_CC = COMMANDCENTER:New(redHQ, COALITION_TITLES.RED .. " HQ") RU_Mission = MISSION:New(RU_CC, "Zone Capture Example Mission", "Primary", "Hold what we have, take what we don't.", coalition.side.RED) --RU_Score = SCORING:New("Zone Capture Example Mission") --RU_Mission:AddScoring(RU_Score) @@ -148,7 +159,7 @@ do -- BLUE Mission US_Mission_Capture_Airfields = MISSION:New( US_CC, "Capture the Zones", "Primary", "Capture the Zones marked on your F10 map.\n" .. - "Destroy enemy ground forces in the surrounding area, " .. + "Destroy " .. COALITION_TITLES.RED .. " ground forces in the surrounding area, " .. "then occupy each capture zone with a platoon.\n " .. "Your orders are to hold position until all capture zones are taken.\n" .. "Use the map (F10) for a clear indication of the location of each capture zone.\n" .. @@ -166,13 +177,13 @@ end -- Setup RED Missions do -- RED Mission - RU_Mission_Capture_Airfields = MISSION:New( RU_CC, "Defend the Motherland", "Primary", - "Defend Russian airfields and recapture lost territory.\n" .. - "Eliminate enemy forces in capture zones and " .. + RU_Mission_Capture_Airfields = MISSION:New( RU_CC, "Defend the Territory", "Primary", + "Defend " .. COALITION_TITLES.RED .. " territory and recapture lost zones.\n" .. + "Eliminate " .. COALITION_TITLES.BLUE .. " forces in capture zones and " .. "maintain control with ground units.\n" .. - "Your orders are to prevent the enemy from capturing all strategic zones.\n" .. + "Your orders are to prevent the " .. COALITION_TITLES.BLUE .. " from capturing all strategic zones.\n" .. "Use the map (F10) for a clear indication of the location of each capture zone.\n" .. - "Expect heavy NATO resistance!\n" + "Expect heavy " .. COALITION_TITLES.BLUE .. " resistance!\n" , coalition.side.RED) --RU_Score = SCORING:New( "Defend Territory" ) @@ -182,8 +193,6 @@ do -- RED Mission RU_Mission_Capture_Airfields:Start() end - - -- Logging configuration: toggle logging behavior for this module -- Set `CAPTURE_ZONE_LOGGING.enabled = false` to silence module logs if not CAPTURE_ZONE_LOGGING then @@ -582,16 +591,16 @@ local function OnEnterGuarded(ZoneCapture, From, Event, To) ZoneCapture:UndrawZone() local color = ZONE_COLORS.BLUE_CAPTURED ZoneCapture:DrawZone(-1, {0, 0, 0}, 1, color, 0.2, 2, true) - US_CC:MessageTypeToCoalition( string.format( "%s is under protection of the USA", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) - RU_CC:MessageTypeToCoalition( string.format( "%s is under protection of the USA", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) + US_CC:MessageTypeToCoalition( string.format( "%s is under protection of the %s", ZoneCapture:GetZoneName(), COALITION_TITLES.BLUE ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) + RU_CC:MessageTypeToCoalition( string.format( "%s is under protection of the %s", ZoneCapture:GetZoneName(), COALITION_TITLES.BLUE ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) else ZoneCapture:Smoke( SMOKECOLOR.Red ) -- Update zone visual markers to RED ZoneCapture:UndrawZone() local color = ZONE_COLORS.RED_CAPTURED ZoneCapture:DrawZone(-1, {0, 0, 0}, 1, color, 0.2, 2, true) - RU_CC:MessageTypeToCoalition( string.format( "%s is under protection of Russia", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) - US_CC:MessageTypeToCoalition( string.format( "%s is under protection of Russia", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) + RU_CC:MessageTypeToCoalition( string.format( "%s is under protection of the %s", ZoneCapture:GetZoneName(), COALITION_TITLES.RED ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) + US_CC:MessageTypeToCoalition( string.format( "%s is under protection of the %s", ZoneCapture:GetZoneName(), COALITION_TITLES.RED ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) end -- Create/update tactical information marker CreateTacticalInfoMarker(ZoneCapture) @@ -618,11 +627,11 @@ local function OnEnterAttacked(ZoneCapture) local color if Coalition == coalition.side.BLUE then color = ZONE_COLORS.BLUE_ATTACKED - US_CC:MessageTypeToCoalition( string.format( "%s is under attack by Russia", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.ATTACK_MESSAGE_DURATION ) + US_CC:MessageTypeToCoalition( string.format( "%s is under attack by %s", ZoneCapture:GetZoneName(), COALITION_TITLES.RED ), MESSAGE.Type.Information, MESSAGE_CONFIG.ATTACK_MESSAGE_DURATION ) RU_CC:MessageTypeToCoalition( string.format( "We are attacking %s", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.ATTACK_MESSAGE_DURATION ) else color = ZONE_COLORS.RED_ATTACKED - RU_CC:MessageTypeToCoalition( string.format( "%s is under attack by the USA", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.ATTACK_MESSAGE_DURATION ) + RU_CC:MessageTypeToCoalition( string.format( "%s is under attack by %s", ZoneCapture:GetZoneName(), COALITION_TITLES.BLUE ), MESSAGE.Type.Information, MESSAGE_CONFIG.ATTACK_MESSAGE_DURATION ) US_CC:MessageTypeToCoalition( string.format( "We are attacking %s", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.ATTACK_MESSAGE_DURATION ) end ZoneCapture:DrawZone(-1, {0, 0, 0}, 1, color, 0.2, 2, true) @@ -655,15 +664,15 @@ local function CheckVictoryCondition() log("[VICTORY] All zones captured by BLUE! Triggering victory sequence...") US_CC:MessageTypeToCoalition( - "VICTORY! All capture zones have been secured by coalition forces!\n\n" .. - "Operation Polar Shield is complete. Outstanding work!\n" .. + "VICTORY! All capture zones have been secured by " .. COALITION_TITLES.BLUE .. " forces!\n\n" .. + COALITION_TITLES.BLUE_OPERATION .. " is complete. Outstanding work!\n" .. "Mission will end in 60 seconds.", MESSAGE.Type.Information, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION ) 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.", + "DEFEAT! All strategic positions have been lost to " .. COALITION_TITLES.BLUE .. " forces.\n\n" .. + COALITION_TITLES.BLUE_OPERATION .. " has failed. Mission ending in 60 seconds.", MESSAGE.Type.Information, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION ) @@ -696,15 +705,15 @@ local function CheckVictoryCondition() log("[VICTORY] All zones captured by RED! Triggering victory sequence...") RU_CC:MessageTypeToCoalition( - "VICTORY! All strategic positions secured for the Motherland!\n\n" .. - "NATO forces have been repelled. Outstanding work!\n" .. + "VICTORY! All strategic positions secured for " .. COALITION_TITLES.RED_OPERATION .. "!\n\n" .. + COALITION_TITLES.BLUE .. " forces have been repelled. Outstanding work!\n" .. "Mission will end in 60 seconds.", MESSAGE.Type.Information, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION ) US_CC:MessageTypeToCoalition( - "DEFEAT! All capture zones have been lost to Russian forces.\n\n" .. - "Operation Polar Shield has failed. Mission ending in 60 seconds.", + "DEFEAT! All capture zones have been lost to " .. COALITION_TITLES.RED .. " forces.\n\n" .. + COALITION_TITLES.BLUE_OPERATION .. " has failed. Mission ending in 60 seconds.", MESSAGE.Type.Information, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION ) @@ -742,14 +751,14 @@ local function OnEnterCaptured(ZoneCapture) ZoneCapture:UndrawZone() local color = ZONE_COLORS.BLUE_CAPTURED ZoneCapture:DrawZone(-1, {0, 0, 0}, 1, color, 0.2, 2, true) - RU_CC:MessageTypeToCoalition( string.format( "%s is captured by the USA, we lost it!", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) + RU_CC:MessageTypeToCoalition( string.format( "%s is captured by the %s, we lost it!", ZoneCapture:GetZoneName(), COALITION_TITLES.BLUE ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) US_CC:MessageTypeToCoalition( string.format( "We captured %s, Excellent job!", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) else -- Update zone visual markers to RED for captured ZoneCapture:UndrawZone() local color = ZONE_COLORS.RED_CAPTURED ZoneCapture:DrawZone(-1, {0, 0, 0}, 1, color, 0.2, 2, true) - US_CC:MessageTypeToCoalition( string.format( "%s is captured by Russia, we lost it!", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) + US_CC:MessageTypeToCoalition( string.format( "%s is captured by the %s, we lost it!", ZoneCapture:GetZoneName(), COALITION_TITLES.RED ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) RU_CC:MessageTypeToCoalition( string.format( "We captured %s, Excellent job!", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) end @@ -930,8 +939,8 @@ local ZoneMonitorScheduler = SCHEDULER:New( nil, function() ) RU_CC:MessageTypeToCoalition( - string.format("CRITICAL SITUATION! Coalition forces control %d/%d zones! We must recapture territory!", - status.blue, status.total), + string.format("CRITICAL SITUATION! %s forces control %d/%d zones! We must recapture territory!", + COALITION_TITLES.BLUE, status.blue, status.total), MESSAGE.Type.Information, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION ) end @@ -945,8 +954,8 @@ local ZoneMonitorScheduler = SCHEDULER:New( nil, function() ) US_CC:MessageTypeToCoalition( - string.format("CRITICAL SITUATION! Russian forces control %d/%d zones! We must recapture territory!", - status.red, status.total), + string.format("CRITICAL SITUATION! %s forces control %d/%d zones! We must recapture territory!", + COALITION_TITLES.RED, status.red, status.total), MESSAGE.Type.Information, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION ) end diff --git a/Moose_DualCoalitionZoneCapture.miz b/Moose_DualCoalitionZoneCapture.miz index 96e28d75bdc8c02813604430905450686ca2ee06..a7be9bc9c675e9c274e640f702d94b06db5fbaad 100644 GIT binary patch delta 19416 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 q2}BOnFr;G!opIB_dD>cAc)D9_C?g^N8xJPz@ 0 then local warehousePos = warehouse:GetVec3() local details @@ -416,7 +435,8 @@ local function addMarkPoints(warehouses, coalition) local coordinate = COORDINATE:NewFromVec3(warehousePos) local marker = MARKER:New(coordinate, details):ToCoalition(coalition):ReadOnly() - table.insert(activeMarkers, marker) + local key = warehouse:GetName() .. "_coalition_" .. coalition + warehouseMarkers[key] = marker end end end @@ -424,12 +444,9 @@ end -- Function to update warehouse markers local function updateMarkPoints() -- Clean up old markers first - for i = #activeMarkers, 1, -1 do - local marker = activeMarkers[i] - if marker then - marker:Remove() - end - activeMarkers[i] = nil + for key, marker in pairs(warehouseMarkers) do + marker:Remove() + warehouseMarkers[key] = nil end addMarkPoints(redWarehouses, 2) -- Blue coalition sees red warehouses @@ -437,7 +454,9 @@ local function updateMarkPoints() addMarkPoints(redWarehouses, 1) -- Red coalition sees red warehouses addMarkPoints(blueWarehouses, 1) -- Red coalition sees blue warehouses - env.info(string.format("[DGB PLUGIN] Updated warehouse markers (%d total)", #activeMarkers)) + local markerCount = 0 + for _ in pairs(warehouseMarkers) do markerCount = markerCount + 1 end + env.info(string.format("[DGB PLUGIN] Updated warehouse markers (%d total)", markerCount)) end -- Function to check if a group contains infantry units