From 63006a3d9923c7a7f4a7c47a1a8d6fceb9570806 Mon Sep 17 00:00:00 2001 From: iTracerFacer <134304944+iTracerFacer@users.noreply.github.com> Date: Fri, 12 Dec 2025 13:00:09 -0600 Subject: [PATCH] Added perplayer multi language support. --- Moose_DualCoalitionZoneCapture.lua | 834 +++- Moose_DualCoalitionZoneCapture.miz | Bin 2447771 -> 2459648 bytes ....zip => Moose_DualCoalitionZoneCapture.zip | Bin 2471439 -> 2475831 bytes Moose_DynamicGroundBattle_Plugin.lua | 461 +- Moose_MenuManager.lua | 164 + Moose_WWII_PilotIntuition.lua | 3750 +++++++++++++++++ README.md | 292 -- cover.png | Bin 0 -> 209889 bytes 8 files changed, 4968 insertions(+), 533 deletions(-) rename Moose_DynamicGroundBattle.zip => Moose_DualCoalitionZoneCapture.zip (98%) create mode 100644 Moose_MenuManager.lua create mode 100644 Moose_WWII_PilotIntuition.lua create mode 100644 cover.png diff --git a/Moose_DualCoalitionZoneCapture.lua b/Moose_DualCoalitionZoneCapture.lua index 7548813..723e366 100644 --- a/Moose_DualCoalitionZoneCapture.lua +++ b/Moose_DualCoalitionZoneCapture.lua @@ -38,35 +38,6 @@ local MESSAGE_CONFIG = { GARBAGE_COLLECTION_FREQUENCY = 600 -- Lua garbage collection cadence (seconds) - helps prevent memory buildup } --- ========================================== --- ZONE COLOR CONFIGURATION (Centralized) --- ========================================== --- Colors are in RGB format: {Red, Green, Blue} where each value is 0.0 to 1.0 -local ZONE_COLORS = { - -- Blue coalition zones - BLUE_CAPTURED = {0, 0, 1}, -- Blue (owned by Blue) - BLUE_ATTACKED = {0, 1, 1}, -- Cyan (owned by Blue, under attack) - - -- Red coalition zones - RED_CAPTURED = {1, 0, 0}, -- Red (owned by Red) - RED_ATTACKED = {1, 0.5, 0}, -- Orange (owned by Red, under attack) - - -- Neutral/Empty zones - EMPTY = {0, 1, 0} -- Green (no owner) -} - --- ========================================== --- 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 -- ========================================== @@ -109,6 +80,422 @@ local ZONE_SETTINGS = { captureScore = 200 -- Points awarded for capturing a zone } +-- ========================================== +-- ZONE COLOR CONFIGURATION (Centralized) +-- ========================================== +-- Colors are in RGB format: {Red, Green, Blue} where each value is 0.0 to 1.0 +local ZONE_COLORS = { + -- Blue coalition zones + BLUE_CAPTURED = {0, 0, 1}, -- Blue (owned by Blue) + BLUE_ATTACKED = {0, 1, 1}, -- Cyan (owned by Blue, under attack) + + -- Red coalition zones + RED_CAPTURED = {1, 0, 0}, -- Red (owned by Red) + RED_ATTACKED = {1, 0.5, 0}, -- Orange (owned by Red, under attack) + + -- Neutral/Empty zones + EMPTY = {0, 1, 0} -- Green (no owner) +} + +-- ========================================== +-- 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 +} + +-- ========================================== +-- LANGUAGE CONFIGURATION +-- ========================================== +local LANGUAGE_CONFIG = { + defaultLanguage = "EN", -- Default language: "EN", "DE", "FR", "ES", "RU" +} + +-- Multilingual message table +-- Each language contains all messages and menu text +local ZONE_CAPTURE_LANGUAGES = { + EN = { + -- Zone state messages + zoneGuarded = "%s is under protection of the %s", + zoneEmpty = "%s is unprotected, and can be captured!", + zoneUnderAttack = "%s is under attack by %s", + zoneWeAttacking = "We are attacking %s", + zoneCapturedByEnemy = "%s is captured by the %s, we lost it!", + zoneCapturedByUs = "We captured %s, Excellent job!", + + -- Victory messages + victoryBlue = "VICTORY! All capture zones have been secured by %s forces!\n\n%s is complete. Outstanding work!\nMission will end in 60 seconds.", + defeatBlue = "DEFEAT! All strategic positions have been lost to %s forces.\n\n%s has failed. Mission ending in 60 seconds.", + victoryRed = "VICTORY! All strategic positions secured for %s!\n\n%s forces have been repelled. Outstanding work!\nMission will end in 60 seconds.", + defeatRed = "DEFEAT! All capture zones have been lost to %s forces.\n\n%s has failed. Mission ending in 60 seconds.", + missionComplete = "Mission Complete! Congratulations on your victory!\nFinal Status: All %d strategic zones secured.", + + -- Status report messages + zoneControlReport = "ZONE CONTROL REPORT:\nBlue Coalition: %d/%d zones\nRed Coalition: %d/%d zones\nNeutral: %d/%d zones", + zoneDetails = "\nZONE DETAILS:\n", + zoneDetailLine = "• %s: %s\n", + yourProgress = "\n\nYour Progress to Victory: %d%%", + + -- Progress warning messages + blueNearVictory = "TACTICAL ALERT: %s forces control %d%% of strategic zones!\nVictory is within reach!", + redNearVictory = "WARNING: %s forces have captured %d%% of zones!\nDefend our positions!", + + -- Coalition names + coalitionBlue = "Blue Coalition", + coalitionRed = "Red Coalition", + coalitionNeutral = "Neutral", + + -- Menu items + menuZoneControl = "Zone Control", + menuStatusReport = "Get Zone Status Report", + menuVictoryProgress = "Check Victory Progress", + menuRefreshColors = "Refresh Zone Colors", + menuLanguage = "Language / Sprache / Langue", + menuEnglish = "English", + menuGerman = "Deutsch (German)", + menuFrench = "Français (French)", + menuSpanish = "Español (Spanish)", + menuRussian = "Русский (Russian)", + + -- Victory progress messages + victoryProgressTitle = "VICTORY PROGRESS: %d%%", + zonesCaptured = "Zones Captured: %d/%d", + zonesRemaining = "Remaining: %d zones", + progressComplete = "MISSION COMPLETE!", + progressAlmostThere = "ALMOST THERE!", + progressGood = "GOOD PROGRESS!", + progressKeepFighting = "KEEP FIGHTING!", + + -- System messages + zoneMarkersRefreshed = "Zone visual markers have been refreshed!", + languageChanged = "Language changed to English", + }, + + DE = { + -- Zone state messages + zoneGuarded = "%s steht unter dem Schutz der %s", + zoneEmpty = "%s ist ungeschützt und kann erobert werden!", + zoneUnderAttack = "%s wird von %s angegriffen", + zoneWeAttacking = "Wir greifen %s an", + zoneCapturedByEnemy = "%s wurde von %s erobert, wir haben es verloren!", + zoneCapturedByUs = "Wir haben %s erobert, hervorragende Arbeit!", + + -- Victory messages + victoryBlue = "SIEG! Alle Eroberungszonen wurden von %s Streitkräften gesichert!\n\n%s ist abgeschlossen. Hervorragende Arbeit!\nMission endet in 60 Sekunden.", + defeatBlue = "NIEDERLAGE! Alle strategischen Positionen wurden an %s Streitkräfte verloren.\n\n%s ist gescheitert. Mission endet in 60 Sekunden.", + victoryRed = "SIEG! Alle strategischen Positionen für %s gesichert!\n\n%s Streitkräfte wurden zurückgeschlagen. Hervorragende Arbeit!\nMission endet in 60 Sekunden.", + defeatRed = "NIEDERLAGE! Alle Eroberungszonen wurden an %s Streitkräfte verloren.\n\n%s ist gescheitert. Mission endet in 60 Sekunden.", + missionComplete = "Mission erfolgreich! Herzlichen Glückwunsch zu Ihrem Sieg!\nEndstatus: Alle %d strategischen Zonen gesichert.", + + -- Status report messages + zoneControlReport = "ZONENKONTROLLBERICHT:\nBlaue Koalition: %d/%d Zonen\nRote Koalition: %d/%d Zonen\nNeutral: %d/%d Zonen", + zoneDetails = "\nZONENDETAILS:\n", + zoneDetailLine = "• %s: %s\n", + yourProgress = "\n\nIhr Fortschritt zum Sieg: %d%%", + + -- Progress warning messages + blueNearVictory = "TAKTISCHER ALARM: %s Streitkräfte kontrollieren %d%% der strategischen Zonen!\nSieg ist in Reichweite!", + redNearVictory = "WARNUNG: %s Streitkräfte haben %d%% der Zonen erobert!\nVerteidigt unsere Positionen!", + + -- Coalition names + coalitionBlue = "Blaue Koalition", + coalitionRed = "Rote Koalition", + coalitionNeutral = "Neutral", + + -- Menu items + menuZoneControl = "Zonenkontrolle", + menuStatusReport = "Zonenstatusbericht abrufen", + menuVictoryProgress = "Siegfortschritt prüfen", + menuRefreshColors = "Zonenfarben aktualisieren", + menuLanguage = "Language / Sprache / Langue", + menuEnglish = "English", + menuGerman = "Deutsch (German)", + menuFrench = "Français (French)", + menuSpanish = "Español (Spanish)", + menuRussian = "Русский (Russian)", + + -- Victory progress messages + victoryProgressTitle = "SIEGFORTSCHRITT: %d%%", + zonesCaptured = "Zonen erobert: %d/%d", + zonesRemaining = "Verbleibend: %d Zonen", + progressComplete = "MISSION ABGESCHLOSSEN!", + progressAlmostThere = "FAST GESCHAFFT!", + progressGood = "GUTER FORTSCHRITT!", + progressKeepFighting = "WEITER KÄMPFEN!", + + -- System messages + zoneMarkersRefreshed = "Zonenmarkierungen wurden aktualisiert!", + languageChanged = "Sprache auf Deutsch geändert", + }, + + FR = { + -- Zone state messages + zoneGuarded = "%s est sous la protection de %s", + zoneEmpty = "%s est sans protection et peut être capturée !", + zoneUnderAttack = "%s est attaquée par %s", + zoneWeAttacking = "Nous attaquons %s", + zoneCapturedByEnemy = "%s est capturée par %s, nous l'avons perdue !", + zoneCapturedByUs = "Nous avons capturé %s, excellent travail !", + + -- Victory messages + victoryBlue = "VICTOIRE ! Toutes les zones de capture ont été sécurisées par les forces %s !\n\n%s est terminée. Excellent travail !\nLa mission se terminera dans 60 secondes.", + defeatBlue = "DÉFAITE ! Toutes les positions stratégiques ont été perdues face aux forces %s.\n\n%s a échoué. Mission se terminant dans 60 secondes.", + victoryRed = "VICTOIRE ! Toutes les positions stratégiques sécurisées pour %s !\n\nLes forces %s ont été repoussées. Excellent travail !\nLa mission se terminera dans 60 secondes.", + defeatRed = "DÉFAITE ! Toutes les zones de capture ont été perdues face aux forces %s.\n\n%s a échoué. Mission se terminant dans 60 secondes.", + missionComplete = "Mission accomplie ! Félicitations pour votre victoire !\nStatut final : Toutes les %d zones stratégiques sécurisées.", + + -- Status report messages + zoneControlReport = "RAPPORT DE CONTRÔLE DES ZONES :\nCoalition bleue : %d/%d zones\nCoalition rouge : %d/%d zones\nNeutre : %d/%d zones", + zoneDetails = "\nDÉTAILS DES ZONES :\n", + zoneDetailLine = "• %s : %s\n", + yourProgress = "\n\nVotre progression vers la victoire : %d%%", + + -- Progress warning messages + blueNearVictory = "ALERTE TACTIQUE : Les forces %s contrôlent %d%% des zones stratégiques !\nLa victoire est à portée de main !", + redNearVictory = "AVERTISSEMENT : Les forces %s ont capturé %d%% des zones !\nDéfendez nos positions !", + + -- Coalition names + coalitionBlue = "Coalition bleue", + coalitionRed = "Coalition rouge", + coalitionNeutral = "Neutre", + + -- Menu items + menuZoneControl = "Contrôle des zones", + menuStatusReport = "Obtenir le rapport d'état des zones", + menuVictoryProgress = "Vérifier la progression vers la victoire", + menuRefreshColors = "Actualiser les couleurs des zones", + menuLanguage = "Language / Sprache / Langue", + menuEnglish = "English", + menuGerman = "Deutsch (German)", + menuFrench = "Français (French)", + menuSpanish = "Español (Spanish)", + menuRussian = "Русский (Russian)", + + -- Victory progress messages + victoryProgressTitle = "PROGRÈS DE LA VICTOIRE : %d%%", + zonesCaptured = "Zones capturées : %d/%d", + zonesRemaining = "Restantes : %d zones", + progressComplete = "MISSION ACCOMPLIE !", + progressAlmostThere = "PRESQUE TERMINÉ !", + progressGood = "BON PROGRÈS !", + progressKeepFighting = "CONTINUEZ À COMBATTRE !", + + -- System messages + zoneMarkersRefreshed = "Les marqueurs de zone ont été actualisés !", + languageChanged = "Langue changée en français", + }, + + ES = { + -- Zone state messages + zoneGuarded = "%s está bajo la protección de %s", + zoneEmpty = "¡%s está desprotegida y puede ser capturada!", + zoneUnderAttack = "%s está siendo atacada por %s", + zoneWeAttacking = "Estamos atacando %s", + zoneCapturedByEnemy = "¡%s ha sido capturada por %s, la hemos perdido!", + zoneCapturedByUs = "¡Hemos capturado %s, excelente trabajo!", + + -- Victory messages + victoryBlue = "¡VICTORIA! ¡Todas las zonas de captura han sido aseguradas por las fuerzas %s!\n\n%s está completa. ¡Excelente trabajo!\nLa misión terminará en 60 segundos.", + defeatBlue = "¡DERROTA! Todas las posiciones estratégicas se han perdido ante las fuerzas %s.\n\n%s ha fallado. Misión terminando en 60 segundos.", + victoryRed = "¡VICTORIA! ¡Todas las posiciones estratégicas aseguradas para %s!\n\n¡Las fuerzas %s han sido repelidas. Excelente trabajo!\nLa misión terminará en 60 segundos.", + defeatRed = "¡DERROTA! Todas las zonas de captura se han perdido ante las fuerzas %s.\n\n%s ha fallado. Misión terminando en 60 segundos.", + missionComplete = "¡Misión completada! ¡Felicitaciones por tu victoria!\nEstado final: Todas las %d zonas estratégicas aseguradas.", + + -- Status report messages + zoneControlReport = "INFORME DE CONTROL DE ZONAS:\nCoalición Azul: %d/%d zonas\nCoalición Roja: %d/%d zonas\nNeutral: %d/%d zonas", + zoneDetails = "\nDETALLES DE ZONAS:\n", + zoneDetailLine = "• %s: %s\n", + yourProgress = "\n\nTu progreso hacia la victoria: %d%%", + + -- Progress warning messages + blueNearVictory = "ALERTA TÁCTICA: ¡Las fuerzas %s controlan el %d%% de las zonas estratégicas!\n¡La victoria está al alcance!", + redNearVictory = "ADVERTENCIA: ¡Las fuerzas %s han capturado el %d%% de las zonas!\n¡Defiende nuestras posiciones!", + + -- Coalition names + coalitionBlue = "Coalición Azul", + coalitionRed = "Coalición Roja", + coalitionNeutral = "Neutral", + + -- Menu items + menuZoneControl = "Control de zonas", + menuStatusReport = "Obtener informe de estado de zonas", + menuVictoryProgress = "Verificar progreso de victoria", + menuRefreshColors = "Actualizar colores de zonas", + menuLanguage = "Language / Sprache / Langue", + menuEnglish = "English", + menuGerman = "Deutsch (German)", + menuFrench = "Français (French)", + menuSpanish = "Español (Spanish)", + menuRussian = "Русский (Russian)", + + -- Victory progress messages + victoryProgressTitle = "PROGRESO DE VICTORIA: %d%%", + zonesCaptured = "Zonas capturadas: %d/%d", + zonesRemaining = "Restantes: %d zonas", + progressComplete = "¡MISIÓN COMPLETADA!", + progressAlmostThere = "¡CASI TERMINADO!", + progressGood = "¡BUEN PROGRESO!", + progressKeepFighting = "¡SIGUE LUCHANDO!", + + -- System messages + zoneMarkersRefreshed = "¡Los marcadores de zona se han actualizado!", + languageChanged = "Idioma cambiado a español", + }, + + RU = { + -- Zone state messages + zoneGuarded = "%s находится под защитой %s", + zoneEmpty = "%s не защищена и может быть захвачена!", + zoneUnderAttack = "%s атакована силами %s", + zoneWeAttacking = "Мы атакуем %s", + zoneCapturedByEnemy = "%s захвачена %s, мы её потеряли!", + zoneCapturedByUs = "Мы захватили %s, отличная работа!", + + -- Victory messages + victoryBlue = "ПОБЕДА! Все зоны захвата обеспечены силами %s!\n\n%s завершена. Отличная работа!\nМиссия закончится через 60 секунд.", + defeatBlue = "ПОРАЖЕНИЕ! Все стратегические позиции потеряны силами %s.\n\n%s провалена. Миссия заканчивается через 60 секунд.", + victoryRed = "ПОБЕДА! Все стратегические позиции обеспечены для %s!\n\nСилы %s отброшены. Отличная работа!\nМиссия закончится через 60 секунд.", + defeatRed = "ПОРАЖЕНИЕ! Все зоны захвата потеряны силами %s.\n\n%s провалена. Миссия заканчивается через 60 секунд.", + missionComplete = "Миссия выполнена! Поздравляем с победой!\nИтоговый статус: Все %d стратегических зон обеспечены.", + + -- Status report messages + zoneControlReport = "ОТЧЁТ О КОНТРОЛЕ ЗОН:\nСиняя коалиция: %d/%d зон\nКрасная коалиция: %d/%d зон\nНейтральные: %d/%d зон", + zoneDetails = "\nПОДРОБНОСТИ ЗОН:\n", + zoneDetailLine = "• %s: %s\n", + yourProgress = "\n\nВаш прогресс к победе: %d%%", + + -- Progress warning messages + blueNearVictory = "ТАКТИЧЕСКАЯ ТРЕВОГА: Силы %s контролируют %d%% стратегических зон!\nПобеда близка!", + redNearVictory = "ВНИМАНИЕ: Силы %s захватили %d%% зон!\nЗащищайте наши позиции!", + + -- Coalition names + coalitionBlue = "Синяя коалиция", + coalitionRed = "Красная коалиция", + coalitionNeutral = "Нейтральные", + + -- Menu items + menuZoneControl = "Контроль зон", + menuStatusReport = "Получить отчёт о статусе зон", + menuVictoryProgress = "Проверить прогресс победы", + menuRefreshColors = "Обновить цвета зон", + menuLanguage = "Language / Sprache / Langue", + menuEnglish = "English", + menuGerman = "Deutsch (German)", + menuFrench = "Français (French)", + menuSpanish = "Español (Spanish)", + menuRussian = "Русский (Russian)", + + -- Victory progress messages + victoryProgressTitle = "ПРОГРЕСС ПОБЕДЫ: %d%%", + zonesCaptured = "Зоны захвачены: %d/%d", + zonesRemaining = "Осталось: %d зон", + progressComplete = "МИССИЯ ВЫПОЛНЕНА!", + progressAlmostThere = "ПОЧТИ ГОТОВО!", + progressGood = "ХОРОШИЙ ПРОГРЕСС!", + progressKeepFighting = "ПРОДОЛЖАЙТЕ БОРОТЬСЯ!", + + -- System messages + zoneMarkersRefreshed = "Маркеры зон обновлены!", + languageChanged = "Язык изменён на русский", + } +} + +-- ========================================== +-- PLAYER LANGUAGE TRACKING +-- ========================================== +-- Store per-player language preferences +local playerLanguages = {} + +-- Helper function to get player's language preference +local function GetPlayerLanguage(playerName) + if playerName and playerLanguages[playerName] then + return playerLanguages[playerName] + end + return LANGUAGE_CONFIG.defaultLanguage +end + +-- Helper function to set player's language preference +local function SetPlayerLanguage(playerName, language) + if playerName and language then + playerLanguages[playerName] = language + env.info(string.format("[LANGUAGE] Player %s language set to %s", playerName, language)) + end +end + +-- Helper function to get translated text +local function GetText(textKey, playerName) + local lang = GetPlayerLanguage(playerName) + local langTable = ZONE_CAPTURE_LANGUAGES[lang] or ZONE_CAPTURE_LANGUAGES.EN + return langTable[textKey] or textKey +end + +-- Helper function to get coalition-specific text +local function GetCoalitionText(coalitionSide, playerName) + local lang = GetPlayerLanguage(playerName) + local langTable = ZONE_CAPTURE_LANGUAGES[lang] or ZONE_CAPTURE_LANGUAGES.EN + + if coalitionSide == coalition.side.BLUE then + return langTable.coalitionBlue + elseif coalitionSide == coalition.side.RED then + return langTable.coalitionRed + else + return langTable.coalitionNeutral + end +end + +-- Helper function to send message to coalition with language support +local function MessageToCoalition(commandCenter, messageKey, params, coalitionSide, duration) + if not commandCenter then return end + + -- Get all players in the coalition + local playerList = coalition.getPlayers(coalitionSide) + + if not playerList or #playerList == 0 then + -- No players in coalition, send default language message + local defaultText = ZONE_CAPTURE_LANGUAGES[LANGUAGE_CONFIG.defaultLanguage][messageKey] + if params then + defaultText = string.format(defaultText, unpack(params)) + end + commandCenter:MessageTypeToCoalition(defaultText, MESSAGE.Type.Information, duration) + return + end + + -- Group players by language preference + local languageGroups = {} + for _, unit in ipairs(playerList) do + if unit then + local playerName = unit:getPlayerName() + if playerName then + local lang = GetPlayerLanguage(playerName) + if not languageGroups[lang] then + languageGroups[lang] = {} + end + table.insert(languageGroups[lang], playerName) + end + end + end + + -- Send message in each language to respective players + for lang, players in pairs(languageGroups) do + local langTable = ZONE_CAPTURE_LANGUAGES[lang] or ZONE_CAPTURE_LANGUAGES.EN + local text = langTable[messageKey] + if params then + text = string.format(text, unpack(params)) + end + + -- For now, send to entire coalition (MOOSE doesn't support per-player filtering easily) + -- This is a limitation, but better than nothing + commandCenter:MessageTypeToCoalition(text, MESSAGE.Type.Information, duration) + end +end + + + -- ========================================== -- END OF CONFIGURATION -- ========================================== @@ -607,16 +994,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 %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 ) + MessageToCoalition(US_CC, "zoneGuarded", {ZoneCapture:GetZoneName(), COALITION_TITLES.BLUE}, coalition.side.BLUE, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION) + MessageToCoalition(RU_CC, "zoneGuarded", {ZoneCapture:GetZoneName(), COALITION_TITLES.BLUE}, coalition.side.RED, 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 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 ) + MessageToCoalition(RU_CC, "zoneGuarded", {ZoneCapture:GetZoneName(), COALITION_TITLES.RED}, coalition.side.RED, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION) + MessageToCoalition(US_CC, "zoneGuarded", {ZoneCapture:GetZoneName(), COALITION_TITLES.RED}, coalition.side.BLUE, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION) end -- Create/update tactical information marker CreateTacticalInfoMarker(ZoneCapture) @@ -629,8 +1016,8 @@ local function OnEnterEmpty(ZoneCapture) ZoneCapture:UndrawZone() local color = ZONE_COLORS.EMPTY ZoneCapture:DrawZone(-1, {0, 0, 0}, 1, color, 0.2, 2, true) - US_CC:MessageTypeToCoalition( string.format( "%s is unprotected, and can be captured!", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) - RU_CC:MessageTypeToCoalition( string.format( "%s is unprotected, and can be captured!", ZoneCapture:GetZoneName() ), MESSAGE.Type.Information, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION ) + MessageToCoalition(US_CC, "zoneEmpty", {ZoneCapture:GetZoneName()}, coalition.side.BLUE, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION) + MessageToCoalition(RU_CC, "zoneEmpty", {ZoneCapture:GetZoneName()}, coalition.side.RED, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION) -- Create/update tactical information marker CreateTacticalInfoMarker(ZoneCapture) end @@ -643,12 +1030,12 @@ 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 %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 ) + MessageToCoalition(US_CC, "zoneUnderAttack", {ZoneCapture:GetZoneName(), COALITION_TITLES.RED}, coalition.side.BLUE, MESSAGE_CONFIG.ATTACK_MESSAGE_DURATION) + MessageToCoalition(RU_CC, "zoneWeAttacking", {ZoneCapture:GetZoneName()}, coalition.side.RED, MESSAGE_CONFIG.ATTACK_MESSAGE_DURATION) else color = ZONE_COLORS.RED_ATTACKED - 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 ) + MessageToCoalition(RU_CC, "zoneUnderAttack", {ZoneCapture:GetZoneName(), COALITION_TITLES.BLUE}, coalition.side.RED, MESSAGE_CONFIG.ATTACK_MESSAGE_DURATION) + MessageToCoalition(US_CC, "zoneWeAttacking", {ZoneCapture:GetZoneName()}, coalition.side.BLUE, MESSAGE_CONFIG.ATTACK_MESSAGE_DURATION) end ZoneCapture:DrawZone(-1, {0, 0, 0}, 1, color, 0.2, 2, true) -- Create/update tactical information marker @@ -679,18 +1066,8 @@ local function CheckVictoryCondition() if blueZonesCount >= totalZones then log("[VICTORY] All zones captured by BLUE! Triggering victory sequence...") - US_CC:MessageTypeToCoalition( - "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_TITLES.BLUE .. " forces.\n\n" .. - COALITION_TITLES.BLUE_OPERATION .. " has failed. Mission ending in 60 seconds.", - MESSAGE.Type.Information, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION - ) + MessageToCoalition(US_CC, "victoryBlue", {COALITION_TITLES.BLUE, COALITION_TITLES.BLUE_OPERATION}, coalition.side.BLUE, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION) + MessageToCoalition(RU_CC, "defeatBlue", {COALITION_TITLES.BLUE, COALITION_TITLES.BLUE_OPERATION}, coalition.side.RED, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION) -- Add victory celebration effects for _, zoneCapture in ipairs(zoneCaptureObjects) do @@ -707,10 +1084,7 @@ local function CheckVictoryCondition() log("[VICTORY] Ending mission due to complete zone capture by BLUE") trigger.action.setUserFlag("BLUE_VICTORY", 1) - US_CC:MessageTypeToCoalition( - string.format("Mission Complete! Congratulations on your victory!\nFinal Status: All %d strategic zones secured.", totalZones), - MESSAGE.Type.Information, 10 - ) + MessageToCoalition(US_CC, "missionComplete", {totalZones}, coalition.side.BLUE, 10) end, {}, 60 ) return true @@ -720,18 +1094,8 @@ local function CheckVictoryCondition() if redZonesCount >= totalZones then log("[VICTORY] All zones captured by RED! Triggering victory sequence...") - RU_CC:MessageTypeToCoalition( - "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 " .. 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 - ) + MessageToCoalition(RU_CC, "victoryRed", {COALITION_TITLES.RED_OPERATION, COALITION_TITLES.BLUE}, coalition.side.RED, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION) + MessageToCoalition(US_CC, "defeatRed", {COALITION_TITLES.RED, COALITION_TITLES.BLUE_OPERATION}, coalition.side.BLUE, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION) -- Add victory celebration effects for _, zoneCapture in ipairs(zoneCaptureObjects) do @@ -748,10 +1112,7 @@ local function CheckVictoryCondition() log("[VICTORY] Ending mission due to complete zone capture by RED") trigger.action.setUserFlag("RED_VICTORY", 1) - RU_CC:MessageTypeToCoalition( - string.format("Mission Complete! Congratulations on your victory!\nFinal Status: All %d strategic zones secured.", totalZones), - MESSAGE.Type.Information, 10 - ) + MessageToCoalition(RU_CC, "missionComplete", {totalZones}, coalition.side.RED, 10) end, {}, 60 ) return true @@ -767,15 +1128,15 @@ 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 %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 ) + MessageToCoalition(RU_CC, "zoneCapturedByEnemy", {ZoneCapture:GetZoneName(), COALITION_TITLES.BLUE}, coalition.side.RED, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION) + MessageToCoalition(US_CC, "zoneCapturedByUs", {ZoneCapture:GetZoneName()}, coalition.side.BLUE, 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 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 ) + MessageToCoalition(US_CC, "zoneCapturedByEnemy", {ZoneCapture:GetZoneName(), COALITION_TITLES.RED}, coalition.side.BLUE, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION) + MessageToCoalition(RU_CC, "zoneCapturedByUs", {ZoneCapture:GetZoneName()}, coalition.side.RED, MESSAGE_CONFIG.CAPTURE_MESSAGE_DURATION) end ZoneCapture:AddScore( "Captured", "Zone captured: Extra points granted.", ZONE_SETTINGS.captureScore ) @@ -908,36 +1269,60 @@ end local function BroadcastZoneStatus() local status = GetZoneOwnershipStatus() - -- Build coalition-neutral report - local reportMessage = string.format( - "ZONE CONTROL REPORT:\n" .. - "Blue Coalition: %d/%d zones\n" .. - "Red Coalition: %d/%d zones\n" .. - "Neutral: %d/%d zones", + -- Build report for BLUE coalition in their language + local bluePlayerList = coalition.getPlayers(coalition.side.BLUE) + local bluePlayerName = nil + if bluePlayerList and #bluePlayerList > 0 then + local unit = Unit.getByName(Unit.getName(bluePlayerList[1])) + if unit then + bluePlayerName = unit:getPlayerName() + end + end + + local blueReportMessage = string.format( + GetText("zoneControlReport", bluePlayerName), status.blue, status.total, status.red, status.total, status.neutral, status.total ) - -- Add detailed zone status - local detailMessage = "\nZONE DETAILS:\n" + local blueDetailMessage = GetText("zoneDetails", bluePlayerName) for zoneName, owner in pairs(status.zones) do - detailMessage = detailMessage .. string.format("• %s: %s\n", zoneName, owner) + blueDetailMessage = blueDetailMessage .. string.format(GetText("zoneDetailLine", bluePlayerName), zoneName, owner) end - local fullMessage = reportMessage .. detailMessage - - -- Broadcast to BOTH coalitions with their specific victory progress local totalZones = math.max(status.total, 1) local blueProgressPercent = math.floor((status.blue / totalZones) * 100) - local blueFullMessage = fullMessage .. string.format("\n\nYour Progress to Victory: %d%%", blueProgressPercent) + local blueFullMessage = blueReportMessage .. blueDetailMessage .. string.format(GetText("yourProgress", bluePlayerName), blueProgressPercent) US_CC:MessageTypeToCoalition( blueFullMessage, MESSAGE.Type.Information, MESSAGE_CONFIG.STATUS_MESSAGE_DURATION ) + -- Build report for RED coalition in their language + local redPlayerList = coalition.getPlayers(coalition.side.RED) + local redPlayerName = nil + if redPlayerList and #redPlayerList > 0 then + local unit = Unit.getByName(Unit.getName(redPlayerList[1])) + if unit then + redPlayerName = unit:getPlayerName() + end + end + + local redReportMessage = string.format( + GetText("zoneControlReport", redPlayerName), + status.blue, status.total, + status.red, status.total, + status.neutral, status.total + ) + + local redDetailMessage = GetText("zoneDetails", redPlayerName) + for zoneName, owner in pairs(status.zones) do + redDetailMessage = redDetailMessage .. string.format(GetText("zoneDetailLine", redPlayerName), zoneName, owner) + end + local redProgressPercent = math.floor((status.red / totalZones) * 100) - local redFullMessage = fullMessage .. string.format("\n\nYour Progress to Victory: %d%%", redProgressPercent) + local redFullMessage = redReportMessage .. redDetailMessage .. string.format(GetText("yourProgress", redPlayerName), redProgressPercent) RU_CC:MessageTypeToCoalition( redFullMessage, MESSAGE.Type.Information, MESSAGE_CONFIG.STATUS_MESSAGE_DURATION ) - log("[ZONE STATUS] " .. reportMessage:gsub("\n", " | ")) + log("[ZONE STATUS] Blue:" .. status.blue .. "/" .. status.total .. " Red:" .. status.red .. "/" .. status.total) return status end @@ -948,32 +1333,16 @@ local ZoneMonitorScheduler = SCHEDULER:New( nil, function() -- Check if BLUE is 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, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION - ) - - RU_CC:MessageTypeToCoalition( - 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 - ) + local bluePercent = math.floor((status.blue / status.total) * 100) + MessageToCoalition(US_CC, "blueNearVictory", {COALITION_TITLES.BLUE, bluePercent}, coalition.side.BLUE, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION) + MessageToCoalition(RU_CC, "redNearVictory", {COALITION_TITLES.BLUE, bluePercent}, coalition.side.RED, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION) end -- Check if RED is close to victory (80% or more zones captured) if status.red >= math.floor(status.total * 0.8) and status.red < status.total then - RU_CC:MessageTypeToCoalition( - string.format("APPROACHING VICTORY! %d more zone(s) needed for complete success!", - status.total - status.red), - MESSAGE.Type.Information, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION - ) - - US_CC:MessageTypeToCoalition( - 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 - ) + local redPercent = math.floor((status.red / status.total) * 100) + MessageToCoalition(RU_CC, "blueNearVictory", {COALITION_TITLES.RED, redPercent}, coalition.side.RED, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION) + MessageToCoalition(US_CC, "redNearVictory", {COALITION_TITLES.RED, redPercent}, coalition.side.BLUE, MESSAGE_CONFIG.VICTORY_MESSAGE_DURATION) end end, {}, MESSAGE_CONFIG.STATUS_BROADCAST_START_DELAY, MESSAGE_CONFIG.STATUS_BROADCAST_FREQUENCY ) @@ -1086,81 +1455,188 @@ local function RefreshAllZoneColors() end -- Notify BOTH coalitions - US_CC:MessageTypeToCoalition("Zone visual markers have been refreshed!", MESSAGE.Type.Information, MESSAGE_CONFIG.STATUS_MESSAGE_DURATION) - RU_CC:MessageTypeToCoalition("Zone visual markers have been refreshed!", MESSAGE.Type.Information, MESSAGE_CONFIG.STATUS_MESSAGE_DURATION) + MessageToCoalition(US_CC, "zoneMarkersRefreshed", nil, coalition.side.BLUE, MESSAGE_CONFIG.STATUS_MESSAGE_DURATION) + MessageToCoalition(RU_CC, "zoneMarkersRefreshed", nil, coalition.side.RED, MESSAGE_CONFIG.STATUS_MESSAGE_DURATION) end --- Manual zone status commands for players (F10 radio menu) - BOTH COALITIONS -local function SetupZoneStatusCommands() - -- Add F10 radio menu commands for BLUE coalition - if US_CC then - -- Use MenuManager to create zone control menu under Mission Options - local USMenu = MenuManager and MenuManager.CreateCoalitionMenu(coalition.side.BLUE, "Zone Control") - or 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 totalZones = math.max(status.total, 1) - local progressPercent = math.floor((status.blue / totalZones) * 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, MESSAGE_CONFIG.STATUS_MESSAGE_DURATION - ) - end ) - - -- Add command to refresh zone colors (troubleshooting tool) - MENU_COALITION_COMMAND:New( coalition.side.BLUE, "Refresh Zone Colors", USMenu, RefreshAllZoneColors ) +-- NOTE: All menus are now created per-player in CreatePlayerLanguageMenu() function below +-- No coalition-wide menus needed + +-- ========================================== +-- PER-PLAYER MENU SETUP (ALL ZONE CONTROL FUNCTIONS) +-- ========================================== +-- Track player menus to avoid duplicates per group +-- Key format: "playerName|groupName" to handle aircraft switches +local playerMenus = {} + +-- Function to create complete Zone Control menu for a specific player +local function CreatePlayerMenu(playerUnit) + env.info("[MENU DEBUG] CreatePlayerMenu called") + if not playerUnit then + env.info("[MENU DEBUG] No playerUnit") + return end - -- Add F10 radio menu commands for RED coalition - if RU_CC then - -- Use MenuManager to create zone control menu under Mission Options - local RUMenu = MenuManager and MenuManager.CreateCoalitionMenu(coalition.side.RED, "Zone Control") - or MENU_COALITION:New( coalition.side.RED, "Zone Control" ) - MENU_COALITION_COMMAND:New( coalition.side.RED, "Get Zone Status Report", RUMenu, BroadcastZoneStatus ) + local playerName = playerUnit:getPlayerName() + env.info(string.format("[MENU DEBUG] PlayerName: %s", tostring(playerName))) + if not playerName then return end + + -- Get DCS group and convert to MOOSE GROUP wrapper + local dcsGroup = playerUnit:getGroup() + env.info(string.format("[MENU DEBUG] DCS Group: %s", tostring(dcsGroup and dcsGroup:getName() or "nil"))) + if not dcsGroup then return end + + local groupName = dcsGroup:getName() + local group = GROUP:FindByName(groupName) + env.info(string.format("[MENU DEBUG] MOOSE Group found: %s", tostring(group ~= nil))) + if not group then return end + + local menuKey = playerName .. "|" .. groupName + + -- Don't create duplicate menus for same player in same group + if playerMenus[menuKey] then + env.info(string.format("[MENU DEBUG] Menu already exists for %s", menuKey)) + return + end + + local playerCoalition = playerUnit:getCoalition() + + -- Get appropriate command center + local commandCenter = playerCoalition == coalition.side.BLUE and US_CC or RU_CC + if not commandCenter then + env.info("[MENU DEBUG] No command center found") + return + end + + env.info(string.format("[MENU] Creating Zone Control menu for player %s (group: %s)", playerName, groupName)) + + -- Create Zone Control root menu (use GROUP object, not group name string) + -- Use MenuManager if available to nest under "Mission Options" + local zoneControlMenu = MenuManager and MenuManager.CreateGroupMenu(group, GetText("menuZoneControl", playerName)) + or MENU_GROUP:New(group, GetText("menuZoneControl", playerName)) + + -- Add Zone Status Report command + MENU_GROUP_COMMAND:New(group, GetText("menuStatusReport", playerName), zoneControlMenu, function() + BroadcastZoneStatus() + end) + + -- Add Victory Progress command + MENU_GROUP_COMMAND:New(group, GetText("menuVictoryProgress", playerName), zoneControlMenu, function() + local status = GetZoneOwnershipStatus() + local totalZones = math.max(status.total, 1) + local progressPercent = 0 - MENU_COALITION_COMMAND:New( coalition.side.RED, "Check Victory Progress", RUMenu, function() - local status = GetZoneOwnershipStatus() - local totalZones = math.max(status.total, 1) - local progressPercent = math.floor((status.red / totalZones) * 100) - - RU_CC:MessageTypeToCoalition( - string.format( - "VICTORY PROGRESS: %d%%\n" .. - "Zones Captured: %d/%d\n" .. - "Remaining: %d zones\n\n" .. - "%s", - progressPercent, - status.red, status.total, - status.total - status.red, - progressPercent >= 100 and "MISSION COMPLETE!" or - progressPercent >= 80 and "ALMOST THERE!" or - progressPercent >= 50 and "GOOD PROGRESS!" or - "KEEP FIGHTING!" - ), - MESSAGE.Type.Information, MESSAGE_CONFIG.STATUS_MESSAGE_DURATION - ) - end ) + -- Calculate progress based on player's coalition + if playerCoalition == coalition.side.BLUE then + progressPercent = math.floor((status.blue / totalZones) * 100) + else + progressPercent = math.floor((status.red / totalZones) * 100) + end - -- Add command to refresh zone colors (troubleshooting tool) - MENU_COALITION_COMMAND:New( coalition.side.RED, "Refresh Zone Colors", RUMenu, RefreshAllZoneColors ) + -- Determine progress message based on percentage + local progressMsg + if progressPercent >= 100 then + progressMsg = GetText("progressComplete", playerName) + elseif progressPercent >= 80 then + progressMsg = GetText("progressAlmostThere", playerName) + elseif progressPercent >= 50 then + progressMsg = GetText("progressGood", playerName) + else + progressMsg = GetText("progressKeepFighting", playerName) + end + + local zonesCaptured = playerCoalition == coalition.side.BLUE and status.blue or status.red + local zonesRemaining = status.total - zonesCaptured + + MESSAGE:New( + string.format( + "%s\n%s\n%s\n\n%s", + string.format(GetText("victoryProgressTitle", playerName), progressPercent), + string.format(GetText("zonesCaptured", playerName), zonesCaptured, status.total), + string.format(GetText("zonesRemaining", playerName), zonesRemaining), + progressMsg + ), + MESSAGE_CONFIG.STATUS_MESSAGE_DURATION + ):ToGroup(group) + end) + + -- Add Refresh Zone Colors command + MENU_GROUP_COMMAND:New(group, GetText("menuRefreshColors", playerName), zoneControlMenu, function() + RefreshAllZoneColors() + end) + + -- Create Language submenu + local langMenu = MENU_GROUP:New(group, GetText("menuLanguage", playerName), zoneControlMenu) + + -- Add language options + MENU_GROUP_COMMAND:New(group, GetText("menuEnglish", playerName), langMenu, function() + SetPlayerLanguage(playerName, "EN") + MESSAGE:New(GetText("languageChanged", playerName), 5):ToGroup(group) + end) + + MENU_GROUP_COMMAND:New(group, GetText("menuGerman", playerName), langMenu, function() + SetPlayerLanguage(playerName, "DE") + MESSAGE:New(GetText("languageChanged", playerName), 5):ToGroup(group) + end) + + MENU_GROUP_COMMAND:New(group, GetText("menuFrench", playerName), langMenu, function() + SetPlayerLanguage(playerName, "FR") + MESSAGE:New(GetText("languageChanged", playerName), 5):ToGroup(group) + end) + + MENU_GROUP_COMMAND:New(group, GetText("menuSpanish", playerName), langMenu, function() + SetPlayerLanguage(playerName, "ES") + MESSAGE:New(GetText("languageChanged", playerName), 5):ToGroup(group) + end) + + MENU_GROUP_COMMAND:New(group, GetText("menuRussian", playerName), langMenu, function() + SetPlayerLanguage(playerName, "RU") + MESSAGE:New(GetText("languageChanged", playerName), 5):ToGroup(group) + end) + + playerMenus[menuKey] = true + log(string.format("[MENU] Zone Control menu created for %s in group %s", playerName, groupName)) +end + +-- Event handler to create player menus when players spawn +local function OnPlayerBirth(event) + env.info(string.format("[MENU DEBUG] OnPlayerBirth called, event id: %s", tostring(event.id))) + if event.id == world.event.S_EVENT_BIRTH and event.initiator then + local unit = event.initiator + local playerName = unit and unit:getPlayerName() + env.info(string.format("[MENU DEBUG] Birth event for player: %s", tostring(playerName))) + if unit and playerName then + -- Small delay to ensure everything is initialized + timer.scheduleFunction(function() + CreatePlayerMenu(unit) + end, nil, timer.getTime() + 2) + end end end +-- Set up event handler +world.addEventHandler({ + onEvent = OnPlayerBirth +}) + +-- Create menus for any players already in the mission +timer.scheduleFunction(function() + env.info("[MENU] Checking for existing players...") + for _, coalitionSide in pairs({coalition.side.BLUE, coalition.side.RED}) do + local players = coalition.getPlayers(coalitionSide) + env.info(string.format("[MENU DEBUG] Found %d players in coalition %d", players and #players or 0, coalitionSide)) + if players then + for _, unit in ipairs(players) do + local playerName = unit and unit:getPlayerName() + env.info(string.format("[MENU DEBUG] Processing existing player: %s", tostring(playerName))) + if unit and playerName then + CreatePlayerMenu(unit) + end + end + end + end +end, nil, timer.getTime() + 5) + -- Initialize zone status monitoring SCHEDULER:New( nil, function() log("[VICTORY SYSTEM] Initializing zone monitoring system...") @@ -1168,7 +1644,7 @@ SCHEDULER:New( nil, function() -- Initialize performance optimization caches InitializeCachedUnitSet() - SetupZoneStatusCommands() + -- Note: All menus are created per-player via event handlers -- Initial status report SCHEDULER:New( nil, function() diff --git a/Moose_DualCoalitionZoneCapture.miz b/Moose_DualCoalitionZoneCapture.miz index a7be9bc9c675e9c274e640f702d94b06db5fbaad..fce6a5c045cf57d4c195bc973fbe51b0effc2d1c 100644 GIT binary patch delta 42527 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 delta 30566 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 0 then + local unit = playerList[1] + if unit then + local playerName = unit:getPlayerName() + if playerName then + return DGB_GetPlayerLanguage(playerName) + end + end + end + + -- Fall back to default language + if LANGUAGE_CONFIG and LANGUAGE_CONFIG.defaultLanguage then + return LANGUAGE_CONFIG.defaultLanguage + end + + return "EN" +end + +-- Helper function to get translated text +local function DGB_GetText(textKey, playerName) + local lang = DGB_GetPlayerLanguage(playerName) + local langTable = DGB_LANGUAGES[lang] or DGB_LANGUAGES.EN + return langTable[textKey] or DGB_LANGUAGES.EN[textKey] or textKey +end + +-- Helper function to get translated text for a coalition +local function DGB_GetTextForCoalition(textKey, coalitionSide) + local lang = DGB_GetCoalitionLanguage(coalitionSide) + local langTable = DGB_LANGUAGES[lang] or DGB_LANGUAGES.EN + return langTable[textKey] or DGB_LANGUAGES.EN[textKey] or textKey +end + env.info("[DGB PLUGIN] Dynamic Ground Battle Plugin initializing...") -- Validate that DualCoalitionZoneCapture is loaded @@ -418,15 +730,15 @@ local function addMarkPoints(warehouses, coalition) if coalition == 2 then -- Blue viewing if warehouse:GetCoalition() == 2 then - details = "Warehouse: " .. warehouse:GetName() .. "\nThis warehouse needs to be protected.\n" + details = string.format(DGB_GetTextForCoalition("warehouseFriendly", coalition), warehouse:GetName()) else - details = "Warehouse: " .. warehouse:GetName() .. "\nThis is a primary target as it is directly supplying enemy units.\n" + details = string.format(DGB_GetTextForCoalition("warehouseEnemy", coalition), warehouse:GetName()) end elseif coalition == 1 then -- Red viewing if warehouse:GetCoalition() == 1 then - details = "Warehouse: " .. warehouse:GetName() .. "\nThis warehouse needs to be protected.\n" + details = string.format(DGB_GetTextForCoalition("warehouseFriendly", coalition), warehouse:GetName()) else - details = "Warehouse: " .. warehouse:GetName() .. "\nThis is a primary target as it is directly supplying enemy units.\n" + details = string.format(DGB_GetTextForCoalition("warehouseEnemy", coalition), warehouse:GetName()) end end @@ -818,10 +1130,23 @@ local function MonitorWarehouses() local blueSpawnFrequencyPercentage = CalculateSpawnFrequencyPercentage(blueWarehouses) if ENABLE_WAREHOUSE_STATUS_MESSAGES then - local msg = "[Warehouse Status]\n" - msg = msg .. "Red warehouses alive: " .. redWarehousesAlive .. " Reinforcements: " .. redSpawnFrequencyPercentage .. "%\n" - msg = msg .. "Blue warehouses alive: " .. blueWarehousesAlive .. " Reinforcements: " .. blueSpawnFrequencyPercentage .. "%\n" - MESSAGE:New(msg, 30):ToAll() + -- Send to Blue coalition in their language + local blueLang = DGB_GetCoalitionLanguage(coalition.side.BLUE) + local blueMsg = string.format( + DGB_LANGUAGES[blueLang].warehouseStatus, + redWarehousesAlive, redSpawnFrequencyPercentage, + blueWarehousesAlive, blueSpawnFrequencyPercentage + ) + MESSAGE:New(blueMsg, 30):ToBlue() + + -- Send to Red coalition in their language + local redLang = DGB_GetCoalitionLanguage(coalition.side.RED) + local redMsg = string.format( + DGB_LANGUAGES[redLang].warehouseStatus, + redWarehousesAlive, redSpawnFrequencyPercentage, + blueWarehousesAlive, blueSpawnFrequencyPercentage + ) + MESSAGE:New(redMsg, 30):ToRed() end env.info(string.format("[DGB PLUGIN] Warehouse status - Red: %d/%d (%d%%), Blue: %d/%d (%d%%)", @@ -920,73 +1245,77 @@ local function ShowSystemStatistics(playerCoalition) local blueInfantryInterval = CalculateSpawnFrequency(blueWarehouses, SPAWN_SCHED_BLUE_INFANTRY, BLUE_INFANTRY_CADENCE_SCALAR) local blueArmorInterval = CalculateSpawnFrequency(blueWarehouses, SPAWN_SCHED_BLUE_ARMOR, BLUE_ARMOR_CADENCE_SCALAR) + -- Get language for this coalition + local lang = DGB_GetCoalitionLanguage(playerCoalition) + local T = DGB_LANGUAGES[lang] + -- Build comprehensive report local msg = "═══════════════════════════════════════\n" - msg = msg .. "DYNAMIC GROUND BATTLE - SYSTEM STATUS\n" + msg = msg .. T.statsTitle .. "\n" msg = msg .. "═══════════════════════════════════════\n\n" -- Configuration Section - msg = msg .. "【CONFIGURATION】\n" - msg = msg .. " Defenders per Zone: " .. DEFENDERS_PER_ZONE .. "\n" - msg = msg .. " Defender Rotation: " .. (ALLOW_DEFENDER_ROTATION and "ENABLED" or "DISABLED") .. "\n" - msg = msg .. " Infantry Movement: " .. (MOVING_INFANTRY_PATROLS and "ENABLED" or "DISABLED") .. "\n" - msg = msg .. " Task Reassignment: Every " .. ASSIGN_TASKS_SCHED .. "s\n" - msg = msg .. " Warehouse Markers: " .. (ENABLE_WAREHOUSE_MARKERS and "ENABLED" or "DISABLED") .. "\n\n" + msg = msg .. T.statsConfiguration .. "\n" + msg = msg .. string.format(T.statsDefendersPerZone, DEFENDERS_PER_ZONE) .. "\n" + msg = msg .. string.format(T.statsDefenderRotation, ALLOW_DEFENDER_ROTATION and T.enabled or T.disabled) .. "\n" + msg = msg .. string.format(T.statsInfantryMovement, MOVING_INFANTRY_PATROLS and T.enabled or T.disabled) .. "\n" + msg = msg .. string.format(T.statsTaskReassignment, ASSIGN_TASKS_SCHED) .. "\n" + msg = msg .. string.format(T.statsWarehouseMarkers, ENABLE_WAREHOUSE_MARKERS and T.enabled or T.disabled) .. "\n\n" -- Spawn Limits Section - msg = msg .. "【SPAWN LIMITS】\n" - msg = msg .. " Red Infantry: " .. INIT_RED_INFANTRY .. "/" .. MAX_RED_INFANTRY .. "\n" - msg = msg .. " Red Armor: " .. INIT_RED_ARMOR .. "/" .. MAX_RED_ARMOR .. "\n" - msg = msg .. " Blue Infantry: " .. INIT_BLUE_INFANTRY .. "/" .. MAX_BLUE_INFANTRY .. "\n" - msg = msg .. " Blue Armor: " .. INIT_BLUE_ARMOR .. "/" .. MAX_BLUE_ARMOR .. "\n\n" + msg = msg .. T.statsSpawnLimits .. "\n" + msg = msg .. string.format(T.statsRedInfantry, INIT_RED_INFANTRY, MAX_RED_INFANTRY) .. "\n" + msg = msg .. string.format(T.statsRedArmor, INIT_RED_ARMOR, MAX_RED_ARMOR) .. "\n" + msg = msg .. string.format(T.statsBlueInfantry, INIT_BLUE_INFANTRY, MAX_BLUE_INFANTRY) .. "\n" + msg = msg .. string.format(T.statsBlueArmor, INIT_BLUE_ARMOR, MAX_BLUE_ARMOR) .. "\n\n" -- Red Coalition Section - msg = msg .. "【RED COALITION】\n" - msg = msg .. " Warehouses: " .. redWarehousesAlive .. "/" .. redWarehouseTotal .. " (" .. redSpawnFreqPct .. "%)\n" - msg = msg .. " Active Units: " .. redUnits.total .. " (" .. redUnits.infantry .. " inf, " .. redUnits.armor .. " armor)\n" - msg = msg .. " Defenders: " .. redUnits.defenders .. " | Mobile: " .. redUnits.mobile .. "\n" - msg = msg .. " Controlled Zones: " .. redGarrison.totalZones .. "\n" - msg = msg .. " - Garrisoned: " .. redGarrison.garrisoned .. "\n" - msg = msg .. " - Under-Garrisoned: " .. redGarrison.underGarrisoned .. "\n" + msg = msg .. T.statsRedCoalition .. "\n" + msg = msg .. string.format(T.statsWarehouses, redWarehousesAlive, redWarehouseTotal, redSpawnFreqPct) .. "\n" + msg = msg .. string.format(T.statsActiveUnits, redUnits.total, redUnits.infantry, redUnits.armor) .. "\n" + msg = msg .. string.format(T.statsDefenders, redUnits.defenders, redUnits.mobile) .. "\n" + msg = msg .. string.format(T.statsControlledZones, redGarrison.totalZones) .. "\n" + msg = msg .. string.format(T.statsGarrisoned, redGarrison.garrisoned) .. "\n" + msg = msg .. string.format(T.statsUnderGarrisoned, redGarrison.underGarrisoned) .. "\n" if redInfantryInterval then - msg = msg .. " Infantry Spawn: " .. math.floor(redInfantryInterval) .. "s\n" + msg = msg .. string.format(T.statsInfantrySpawn, math.floor(redInfantryInterval)) .. "\n" else - msg = msg .. " Infantry Spawn: PAUSED (no warehouses)\n" + msg = msg .. T.statsInfantrySpawnPaused .. "\n" end if redArmorInterval then - msg = msg .. " Armor Spawn: " .. math.floor(redArmorInterval) .. "s\n\n" + msg = msg .. string.format(T.statsArmorSpawn, math.floor(redArmorInterval)) .. "\n\n" else - msg = msg .. " Armor Spawn: PAUSED (no warehouses)\n\n" + msg = msg .. T.statsArmorSpawnPaused .. "\n\n" end -- Blue Coalition Section - msg = msg .. "【BLUE COALITION】\n" - msg = msg .. " Warehouses: " .. blueWarehousesAlive .. "/" .. blueWarehouseTotal .. " (" .. blueSpawnFreqPct .. "%)\n" - msg = msg .. " Active Units: " .. blueUnits.total .. " (" .. blueUnits.infantry .. " inf, " .. blueUnits.armor .. " armor)\n" - msg = msg .. " Defenders: " .. blueUnits.defenders .. " | Mobile: " .. blueUnits.mobile .. "\n" - msg = msg .. " Controlled Zones: " .. blueGarrison.totalZones .. "\n" - msg = msg .. " - Garrisoned: " .. blueGarrison.garrisoned .. "\n" - msg = msg .. " - Under-Garrisoned: " .. blueGarrison.underGarrisoned .. "\n" + msg = msg .. T.statsBlueCoalition .. "\n" + msg = msg .. string.format(T.statsWarehouses, blueWarehousesAlive, blueWarehouseTotal, blueSpawnFreqPct) .. "\n" + msg = msg .. string.format(T.statsActiveUnits, blueUnits.total, blueUnits.infantry, blueUnits.armor) .. "\n" + msg = msg .. string.format(T.statsDefenders, blueUnits.defenders, blueUnits.mobile) .. "\n" + msg = msg .. string.format(T.statsControlledZones, blueGarrison.totalZones) .. "\n" + msg = msg .. string.format(T.statsGarrisoned, blueGarrison.garrisoned) .. "\n" + msg = msg .. string.format(T.statsUnderGarrisoned, blueGarrison.underGarrisoned) .. "\n" if blueInfantryInterval then - msg = msg .. " Infantry Spawn: " .. math.floor(blueInfantryInterval) .. "s\n" + msg = msg .. string.format(T.statsInfantrySpawn, math.floor(blueInfantryInterval)) .. "\n" else - msg = msg .. " Infantry Spawn: PAUSED (no warehouses)\n" + msg = msg .. T.statsInfantrySpawnPaused .. "\n" end if blueArmorInterval then - msg = msg .. " Armor Spawn: " .. math.floor(blueArmorInterval) .. "s\n\n" + msg = msg .. string.format(T.statsArmorSpawn, math.floor(blueArmorInterval)) .. "\n\n" else - msg = msg .. " Armor Spawn: PAUSED (no warehouses)\n\n" + msg = msg .. T.statsArmorSpawnPaused .. "\n\n" end -- System Info - msg = msg .. "【SYSTEM INFO】\n" - msg = msg .. " Total Zones: " .. #zoneCaptureObjects .. "\n" - msg = msg .. " Active Garrisons: " .. (redGarrison.garrisoned + blueGarrison.garrisoned) .. "\n" - msg = msg .. " Total Active Units: " .. (redUnits.total + blueUnits.total) .. "\n" + msg = msg .. T.statsSystemInfo .. "\n" + msg = msg .. string.format(T.statsTotalZones, #zoneCaptureObjects) .. "\n" + msg = msg .. string.format(T.statsActiveGarrisons, redGarrison.garrisoned + blueGarrison.garrisoned) .. "\n" + msg = msg .. string.format(T.statsTotalActiveUnits, redUnits.total + blueUnits.total) .. "\n" -- Memory and Performance Tracking local totalSpawnedGroups = 0 @@ -995,17 +1324,17 @@ local function ShowSystemStatistics(playerCoalition) end local luaMemoryKB = collectgarbage("count") - msg = msg .. " Tracked Groups: " .. totalSpawnedGroups .. "\n" - msg = msg .. " Lua Memory: " .. string.format("%.1f MB", luaMemoryKB / 1024) .. "\n" + msg = msg .. string.format(T.statsTrackedGroups, totalSpawnedGroups) .. "\n" + msg = msg .. string.format(T.statsLuaMemory, luaMemoryKB / 1024) .. "\n" -- Warning if memory is high if luaMemoryKB > 512000 then -- More than 500MB - msg = msg .. " ⚠️ WARNING: High memory usage!\n" + msg = msg .. T.statsWarningMemory .. "\n" end -- Warning if too many groups if totalSpawnedGroups > 200 then - msg = msg .. " ⚠️ WARNING: High group count!\n" + msg = msg .. T.statsWarningGroups .. "\n" end msg = msg .. "\n" @@ -1028,8 +1357,13 @@ local blueZones = GetZonesByCoalition(coalition.side.BLUE) local redSpawnFrequencyPercentage = CalculateSpawnFrequencyPercentage(redWarehouses) local blueSpawnFrequencyPercentage = CalculateSpawnFrequencyPercentage(blueWarehouses) -MESSAGE:New("Red reinforcement capacity: " .. redSpawnFrequencyPercentage .. "%", 30):ToRed() -MESSAGE:New("Blue reinforcement capacity: " .. blueSpawnFrequencyPercentage .. "%", 30):ToBlue() +local redLang = DGB_GetCoalitionLanguage(coalition.side.RED) +local redMsg = string.format(DGB_LANGUAGES[redLang].reinforcementCapacity, "Red", redSpawnFrequencyPercentage) +MESSAGE:New(redMsg, 30):ToRed() + +local blueLang = DGB_GetCoalitionLanguage(coalition.side.BLUE) +local blueMsg = string.format(DGB_LANGUAGES[blueLang].reinforcementCapacity, "Blue", blueSpawnFrequencyPercentage) +MESSAGE:New(blueMsg, 30):ToBlue() -- Initialize spawners env.info("[DGB PLUGIN] Initializing spawn systems...") @@ -1277,25 +1611,28 @@ SCHEDULER:New(nil, AssignTasksToGroups, {}, 15, ASSIGN_TASKS_SCHED) -- Add F10 menu for manual checks (using MenuManager if available) if MenuManager then -- Create coalition-specific menus under Mission Options - local blueMenu = MenuManager.CreateCoalitionMenu(coalition.side.BLUE, "Ground Battle") - MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Check Warehouse Status", blueMenu, MonitorWarehouses) - MENU_COALITION_COMMAND:New(coalition.side.BLUE, "Show System Statistics", blueMenu, function() + local blueMenuText = DGB_GetTextForCoalition("menuGroundBattle", coalition.side.BLUE) + local blueMenu = MenuManager.CreateCoalitionMenu(coalition.side.BLUE, blueMenuText) + MENU_COALITION_COMMAND:New(coalition.side.BLUE, DGB_GetTextForCoalition("menuWarehouseStatus", coalition.side.BLUE), blueMenu, MonitorWarehouses) + MENU_COALITION_COMMAND:New(coalition.side.BLUE, DGB_GetTextForCoalition("menuSystemStats", coalition.side.BLUE), blueMenu, function() ShowSystemStatistics(coalition.side.BLUE) end) - local redMenu = MenuManager.CreateCoalitionMenu(coalition.side.RED, "Ground Battle") - MENU_COALITION_COMMAND:New(coalition.side.RED, "Check Warehouse Status", redMenu, MonitorWarehouses) - MENU_COALITION_COMMAND:New(coalition.side.RED, "Show System Statistics", redMenu, function() + local redMenuText = DGB_GetTextForCoalition("menuGroundBattle", coalition.side.RED) + local redMenu = MenuManager.CreateCoalitionMenu(coalition.side.RED, redMenuText) + MENU_COALITION_COMMAND:New(coalition.side.RED, DGB_GetTextForCoalition("menuWarehouseStatus", coalition.side.RED), redMenu, MonitorWarehouses) + MENU_COALITION_COMMAND:New(coalition.side.RED, DGB_GetTextForCoalition("menuSystemStats", coalition.side.RED), redMenu, function() ShowSystemStatistics(coalition.side.RED) end) else -- Fallback to root-level mission menu - local missionMenu = MENU_MISSION:New("Ground Battle") - MENU_MISSION_COMMAND:New("Check Warehouse Status", missionMenu, MonitorWarehouses) - MENU_MISSION_COMMAND:New("Show Blue Statistics", missionMenu, function() + local missionMenuText = DGB_GetTextForCoalition("menuGroundBattle", coalition.side.BLUE) + local missionMenu = MENU_MISSION:New(missionMenuText) + MENU_MISSION_COMMAND:New(DGB_GetTextForCoalition("menuWarehouseStatus", coalition.side.BLUE), missionMenu, MonitorWarehouses) + MENU_MISSION_COMMAND:New(DGB_GetTextForCoalition("menuSystemStats", coalition.side.BLUE) .. " (Blue)", missionMenu, function() ShowSystemStatistics(coalition.side.BLUE) end) - MENU_MISSION_COMMAND:New("Show Red Statistics", missionMenu, function() + MENU_MISSION_COMMAND:New(DGB_GetTextForCoalition("menuSystemStats", coalition.side.RED) .. " (Red)", missionMenu, function() ShowSystemStatistics(coalition.side.RED) end) end diff --git a/Moose_MenuManager.lua b/Moose_MenuManager.lua new file mode 100644 index 0000000..b040568 --- /dev/null +++ b/Moose_MenuManager.lua @@ -0,0 +1,164 @@ +--[[ + Unified F10 Menu Manager + + Purpose: Provides a centralized menu system to organize all mission scripts + into a consistent F10 menu structure. + + Menu Organization: + F10 -> F1: Mission Options (all other scripts go here) + F10 -> F2: CTLD (reserved position) + F10 -> F3: AFAC Control (reserved position) + + Usage: + 1. Load this script FIRST before any other menu-creating scripts + 2. Other scripts should use MenuManager to register their menus + + Example: + -- In your script, instead of: + -- local MyMenu = MENU_COALITION:New(coalition.side.BLUE, "My Script") + + -- Use: + -- local MyMenu = MenuManager.CreateCoalitionMenu(coalition.side.BLUE, "My Script") + +]]-- + +MenuManager = {} +MenuManager.Version = "1.1" + +-- Configuration +MenuManager.Config = { + EnableMissionOptionsMenu = true, -- Set to false to disable the parent menu system + MissionOptionsMenuName = "Mission Options", -- Name of the parent menu + Debug = false -- Set to true for debug messages +} + +-- Storage for menu references +MenuManager.Menus = { + Blue = {}, + Red = {}, + Mission = {} +} + +-- Parent menu references (created on first use) +MenuManager.ParentMenus = { + BlueCoalition = nil, + RedCoalition = nil, + Mission = nil +} + +-- Initialize the parent menus +function MenuManager.Initialize() + if MenuManager.Config.EnableMissionOptionsMenu then + -- Create the parent "Mission Options" menu for each coalition + MenuManager.ParentMenus.BlueCoalition = MENU_COALITION:New( + coalition.side.BLUE, + MenuManager.Config.MissionOptionsMenuName + ) + + MenuManager.ParentMenus.RedCoalition = MENU_COALITION:New( + coalition.side.RED, + MenuManager.Config.MissionOptionsMenuName + ) + + -- Note: MENU_MISSION not created to avoid duplicate empty menu + -- Scripts that need mission-wide menus should use MENU_MISSION directly + + if MenuManager.Config.Debug then + env.info("MenuManager: Initialized parent coalition menus") + end + end +end + +-- Create a coalition menu under "Mission Options" +-- @param coalitionSide: coalition.side.BLUE or coalition.side.RED +-- @param menuName: Name of the menu +-- @param parentMenu: (Optional) If provided, creates as submenu of this parent instead of Mission Options +-- @return: MENU_COALITION object +function MenuManager.CreateCoalitionMenu(coalitionSide, menuName, parentMenu) + if MenuManager.Config.EnableMissionOptionsMenu and not parentMenu then + -- Create under Mission Options + local parent = (coalitionSide == coalition.side.BLUE) + and MenuManager.ParentMenus.BlueCoalition + or MenuManager.ParentMenus.RedCoalition + + local menu = MENU_COALITION:New(coalitionSide, menuName, parent) + + if MenuManager.Config.Debug then + local coalitionName = (coalitionSide == coalition.side.BLUE) and "BLUE" or "RED" + env.info(string.format("MenuManager: Created coalition menu '%s' for %s", menuName, coalitionName)) + end + + return menu + else + -- Create as root menu or under provided parent + local menu = MENU_COALITION:New(coalitionSide, menuName, parentMenu) + return menu + end +end + +-- Create a mission menu (not nested under Mission Options, as that causes duplicates) +-- @param menuName: Name of the menu +-- @param parentMenu: (Optional) Parent menu +-- @return: MENU_MISSION object +-- Note: Mission menus are visible to all players and cannot be nested under coalition menus +function MenuManager.CreateMissionMenu(menuName, parentMenu) + -- Always create as root menu or under provided parent + -- Mission menus can't be nested under coalition-specific "Mission Options" + local menu = MENU_MISSION:New(menuName, parentMenu) + + if MenuManager.Config.Debug then + env.info(string.format("MenuManager: Created mission menu '%s'", menuName)) + end + + return menu +end + +-- Create a group menu under "Mission Options" for the player's coalition +-- @param group: GROUP object +-- @param menuName: Name of the menu +-- @param parentMenu: (Optional) If provided, creates as submenu of this parent instead of Mission Options +-- @return: MENU_GROUP object +function MenuManager.CreateGroupMenu(group, menuName, parentMenu) + if MenuManager.Config.EnableMissionOptionsMenu and not parentMenu then + -- Get group's coalition and create under appropriate Mission Options + local groupCoalition = group:getCoalition() + local parent = (groupCoalition == coalition.side.BLUE) + and MenuManager.ParentMenus.BlueCoalition + or MenuManager.ParentMenus.RedCoalition + + local menu = MENU_GROUP:New(group, menuName, parent) + + if MenuManager.Config.Debug then + local coalitionName = (groupCoalition == coalition.side.BLUE) and "BLUE" or "RED" + env.info(string.format("MenuManager: Created group menu '%s' for %s (coalition %s)", + menuName, group:getName(), coalitionName)) + end + + return menu + else + -- Create as root menu or under provided parent + local menu = MENU_GROUP:New(group, menuName, parentMenu) + return menu + end +end + +-- Helper to disable the parent menu system at runtime +function MenuManager.DisableParentMenus() + MenuManager.Config.EnableMissionOptionsMenu = false + env.info("MenuManager: Parent menu system disabled") +end + +-- Helper to enable the parent menu system at runtime +function MenuManager.EnableParentMenus() + MenuManager.Config.EnableMissionOptionsMenu = true + if not MenuManager.ParentMenus.BlueCoalition then + MenuManager.Initialize() + end + env.info("MenuManager: Parent menu system enabled") +end + +-- Initialize on load +MenuManager.Initialize() + +-- Announcement +env.info(string.format("MenuManager v%s loaded - Mission Options menu system ready", MenuManager.Version)) diff --git a/Moose_WWII_PilotIntuition.lua b/Moose_WWII_PilotIntuition.lua new file mode 100644 index 0000000..07f3775 --- /dev/null +++ b/Moose_WWII_PilotIntuition.lua @@ -0,0 +1,3750 @@ +---@diagnostic disable: undefined-field, undefined-global +---@diagnostic disable: undefined-global, lowercase-global +-- WWII Pilot Intuition System using Moose Framework +-- +-- Description: +-- This script simulates a WWII-era pilot intuition system for DCS World missions. It enhances immersion by providing realistic reconnaissance capabilities, +-- alerting pilots to nearby air and ground threats through voice-like messages and optional markers, mimicking how pilots spotted targets in WWII without modern aids. +-- +-- Purpose: +-- To bridge the gap between modern DCS gameplay and historical WWII aviation, where situational awareness relied on visual scanning, formation flying, and intuition. +-- It helps players maintain awareness of their surroundings in dense or chaotic environments, promoting better tactics and immersion. +-- +-- Use Case: +-- Ideal for WWII-themed missions, dogfights, or ground attack scenarios. Players can fly without relying on radar or labels, using the system to spot bandits, +-- ground units, and receive formation feedback. It's particularly useful in multiplayer servers for coordinated flights or solo play for enhanced challenge. + +-- Features: +-- - **Dynamic Detection Ranges**: Detection ranges automatically adjust based on formation flying and environmental conditions. Flying in tight formations with wingmen significantly boosts spotting distances for both air and ground targets. For example, a solo pilot might detect air targets at 5km, but in a 2-ship formation, this increases to 10km, and in a 4-ship formation to 15km. Environmental factors like night reduce ranges (e.g., 50% at night), while bad weather can further decrease visibility. This simulates historical WWII reconnaissance where formation integrity was crucial for situational awareness. +-- - Line of Sight checks to ensure targets are only reported when visible. +-- - Realistic messaging simulating pilot radio calls for spotting bandits and ground threats. +-- - Formation integrity monitoring with alerts for wingmen presence. +-- - Dogfight assistance with alerts for merging bandits, tail warnings, head-on threats, and more. +-- - Optional visual markers (smoke, flares) for spotted targets, with selectable colors. +-- - Independent toggles for air target scanning, both globally (mission-wide) and per-player. +-- - On-demand ground target scanning with selective marking: scan nearby targets, review list, and choose which one to mark. +-- - Configurable settings via F10 menu for players to customize their experience. +-- - Scheduled summaries for players preferring less frequent updates. +-- - Per Player customization of dogfight assistance, marker types, and scanning preferences and message frequency. +-- - Per Player Multi Language Support: English, German, French, Spanish, Russian. + +-- +-- Setup Instructions: +-- 1. Ensure the Moose framework is installed and loaded in your DCS mission (download from https://flightcontrol-master.github.io/MOOSE_DOCS/). +-- 2. Add this script to your mission via the DCS Mission Editor: Go to Triggers > Mission Start > Do Script File, and select this Lua file. +-- 3. Optionally, customize the PILOT_INTUITION_CONFIG table below to adjust ranges, multipliers, and behaviors to fit your mission. +-- 4. The system initializes automatically on mission start. Players will see a welcome message and can access settings via the F10 menu. +-- 5. For best results, test in a mission with active AI units or other players to verify detection ranges and messaging. + +-- Logging system (0=NONE, 1=ERROR, 2=INFO, 3=DEBUG, 4=TRACE) +PILOT_INTUITION_LOG_LEVEL = 1 -- Default to INFO level + +local function PILog(level, message) + if level <= PILOT_INTUITION_LOG_LEVEL then + env.info(message) + end +end + +-- Log level constants +local LOG_NONE = 0 +local LOG_ERROR = 1 +local LOG_INFO = 2 +local LOG_DEBUG = 3 +local LOG_TRACE = 4 + +-- Global configuration table for settings +PILOT_INTUITION_CONFIG = { + airDetectionRange = 8000, -- Meters (base range for air targets) (can be modified by formation and environment) + groundDetectionRange = 5000, -- Meters (base range for ground targets) (can be modified by formation and environment) + messageCooldown = 10, -- Seconds between messages + markerType = "smoke_red", -- Options: "smoke_red", "smoke_green", "smoke_blue", "smoke_white", "flare_red", "flare_green", "flare_white", "none" + markerDuration = 300, -- Seconds for marker visibility (dcs default can't be changed, so this is just for reference) + threatHotRange = 1000, -- Meters for "hot" threat + threatColdRange = 5000, -- Meters for "cold" threat + scanInterval = 5, -- Seconds between scans + mergeRange = 500, -- Meters for merge detection + highMergeAltitude = 500, -- Meters altitude difference for "high merge" + lowMergeAltitude = 500, -- Meters altitude difference for "low merge" + tailWarningRange = 1000, -- Meters for tail warnings + headOnRange = 1000, -- Meters for head-on detection + beamRange = 1500, -- Meters for beam aspect detection + separatingRange = 2000, -- Meters - if opening past this after merge, call "separating" + multipleBanditsRange = 2000, -- Meters for multiple bandits detection + multipleBanditsWarningCooldown = 300, -- Seconds between "Multiple bandits in vicinity!" warnings (5 minutes) + maxThreatDisplay = 3, -- Maximum number of threats to display in multi-bandit tactical picture (most threatening first) + combatIntensityThreshold = 3, -- Number of bandits to trigger "high intensity" mode (increases cooldowns) + combatIntensityCooldownMultiplier = 1.5, -- Multiply dogfight assist cooldown by this during high intensity combat + suppressFormationInCombat = true, -- Suppress formation join/leave messages when engaged with bandits + formationRange = 1000, -- Meters for considering players in formation + minFormationWingmen = 1, -- Minimum wingmen for formation integrity warnings + formationMessageCooldown = 60, -- Seconds cooldown for formation join/leave messages (prevents spam) + nightDetectionMultiplier = 0.5, -- Detection range multiplier at night + badWeatherMultiplier = 0.7, -- Detection range multiplier in bad weather + dogfightAssistEnabled = true, -- Enable dogfight assistance by default + dogfightMessageCooldown = 3, -- Seconds between dogfight assist messages + criticalSpeedThreshold = 150, -- Knots - warn if speed drops below this in dogfight + altitudeDeltaThreshold = 300, -- Meters - significant altitude difference for callouts + highClosureRate = 100, -- M/s - warn if closure rate exceeds this + positionChangeThreshold = 45, -- Degrees - trigger update if bandit moves this much + maxMultiplier = 8, -- Max detection multiplier to prevent excessive ranges + summaryInterval = 120, -- Seconds between scheduled summaries (0 to disable) + summaryCooldown = 2, -- Minimum seconds between on-demand summaries + activeMessaging = true, -- Enable live alerts; false for on-demand only + showGlobalMenu = true, -- Enable global settings menu for players + showWelcomeMessage = true, -- Show welcome message to new players + enableCloseFlyingCompliments = true, -- Enable compliments for close flying + complimentRange = 75, -- Meters for close flying compliment + headOnWarningRange = 150, -- Meters for head-on warning + closeFlyingMessageCooldown = 26, -- Seconds between close flying messages + enableAirScanning = true, -- Enable scanning for air targets + enableGroundScanning = false, -- Enable scanning for ground targets + illuminationCooldown = 30, -- Seconds between illumination flare drops (simulates reload time) + illuminationAltitude = 500, -- Meters - altitude offset above target for illumination flares + illuminationFlaresDefault = 3, -- Number of illumination flares per sortie + countAIWingmen = true, -- Count AI units in same group as wingmen for formation bonus (false = players only count as wingmen) + aiWingmenMultiplier = 1.0, -- Multiplier for AI wingmen (0.5 = half credit, 1.0 = full credit) + distanceUnit = "mi", -- Default distance unit: "km" for kilometers, "mi" for miles (nautical miles) + defaultLanguage = "EN", -- Default language: "EN", "DE", "FR", "ES", "RU" +} + +-- Multilingual message and menu tables +-- Each language contains all messages and menu text +PILOT_INTUITION_LANGUAGES = { + EN = { + -- Messages + welcome = { + "Welcome to WWII Pilot Intuition! This system simulates pilot reconnaissance for spotting air and ground targets. Use F10 menu for settings.", + "Greetings, pilot! WWII Pilot Intuition is active. It helps you spot bandits and ground threats. Check F10 for options.", + "Pilot Intuition engaged! Simulate WWII-era reconnaissance. F10 menu for controls.", + }, + formationJoin = { + "You've joined flight with %s - air detection increased to %.0f%s, ground to %.0f%s.", + "%s is now flying off your wing - detection ranges boosted to %.0f%s air, %.0f%s ground.", + "Welcome aboard, %s! Formation tightens detection to %.0f%s for air, %.0f%s for ground.", + "%s joins the formation - eyes sharper now, %.0f%s air, %.0f%s ground range.", + }, + formationLeave = { + "%s left formation - air detection reduced to %.0f%s, ground to %.0f%s.", + "%s is outa here - detection drops to %.0f%s air, %.0f%s ground.", + "Formation broken by %s - ranges now %.0f%s air, %.0f%s ground.", + "%s has peeled off - back to solo detection: %.0f%s air, %.0f%s ground.", + }, + formationIntegrityLow = { + "Formation integrity low! Tighten up.", + "Form up, pilots! We're spread too thin.", + "Close ranks! Formation integrity compromised.", + "Get back in formation, lads! We're vulnerable.", + }, + airTargetDetected = { + "Bandit %s at %.0f degrees, %.1f %s, angels %.0f (%s)!", + "Enemy aircraft %s: %.0f degrees, %.1f %s, altitude %.0f (%s).", + "Bogey %s at %.0f o'clock, %.1f %s out, angels %.0f (%s).", + "Hostile contact %s: %.0f degrees, %.1f %s, %.0f angels (%s).", + "Bandit inbound %s: %.0f degrees, %.1f %s, angels %.0f (%s).", + }, + groundTargetDetected = { + "%s contact: %s %s at %.0f degrees, %.1f %s.", + "Ground threat: %s %s %s spotted at %.0f degrees, %.1f %s.", + "%s units detected: %s %s, %.0f degrees, %.1f %s.", + "Enemy ground: %s %s %s at bearing %.0f, %.1f %s away.", + }, + dogfightEngaged = { + "Engaged!", + "Tally ho! Dogfight started.", + "Bandit engaged! Fight's on.", + "Dogfight! Guns hot.", + }, + dogfightConcluded = { + "Dogfight concluded.", + "Fight's over. Clear.", + "Dogfight ended. Stand down.", + "Engagement terminated.", + }, + underFire = { + "Under fire! Break %s!%s", + "Taking hits! Evade %s!%s", + "Shots fired! Turn %s now!%s", + "Incoming! Break %s!%s", + }, + closeFlyingCompliment = { + "Nice flying! Tip-to-tip formation.", + "Hey, nice! That's some close flying.", + "Great job! That's close!", + "Easy does it there tiger, I don't know you that well!", + "Impressive! Wingtip to wingtip.", + "Smooth moves! Close quarters flying.", + "Damn, that's tight! Good flying.", + "Holy shit, that's close! Nice one.", + "Whew, that was close! Good stick work.", + "You're glued to my wing! Excellent flying.", + "Tight as a drum! Keep it up.", + "Helluva formation! Tip to tip.", + "Smooth as silk! Close flying there.", + "Damn, pilot! That's some precision.", + "Whoa, easy on the throttle! Nice and close.", + "Impressive control! Wingtip distance.", + "You're right on my six... wait, formation! Good job.", + "Tight formation! That's how it's done.", + "Holy cow, that's close! Well done.", + "Nice touch! Close quarters.", + "You're flying like a pro! Tight formation.", + "Smooth operator! Tip-to-tip.", + "Damn fine flying! Close as can be.", + "Whoa there! That's some tight flying.", + "Impressive! You're practically in my cockpit.", + "Smooth sailing! Close formation.", + "Hell yeah, that's tight! Good work.", + "Easy tiger, but damn good flying.", + "You're a formation expert! Tip-to-tip.", + "Smooth moves, pilot! Close quarters.", + }, + headOnWarning = { + "Whew! That was close!", + "Whoa! Nearly a head-on!", + "Close call! Watch that pass.", + "Damn, that was tight! Be careful.", + "Holy crap, almost collided!", + }, + markerSet = { + "Marker set to %s.", + "Markers now %s.", + "Marker type changed to %s.", + }, + dogfightAssistToggle = { + "Dogfight assist %s.", + "Dogfight assistance %s.", + }, + activeMessagingToggle = { + "Active messaging %s.", + "Live alerts %s.", + }, + airScanningToggle = { + "Air scanning %s.", + "Air detection %s.", + }, + groundScanningToggle = { + "Ground scanning %s.", + "Ground detection %s.", + }, + alertFrequencyToggle = { + "Alert frequency set to %s.", + "Alerts now %s.", + }, + summaryCooldown = { + "Summary on cooldown.", + "Wait a bit for another summary.", + }, + noThreats = { + "No active threats.", + "All clear.", + "Situation normal.", + }, + -- Additional hardcoded messages that need translation + systemActive = "WWII Pilot Intuition active! Use F10 menu for settings.", + logLevelSet = "Log level set to: %s", + distanceUnitsSet = "Distance units set to %s.", + targetNotAvailable = "Target %d not available.", + markedTarget = "Marked Target %d.", + noIlluminationFlares = "No illumination flares remaining. Land at a friendly airbase to rearm.", + illuminationNotReady = "Illumination not ready. Wait %d seconds.", + cannotDeterminePosition = "Cannot determine position for illumination drop.", + cannotDetermineAltitude = "Cannot determine altitude for illumination drop.", + illuminationDropped = "Illumination flare dropped at your position. (%d remaining)", + cannotDetermineTargetPosition = "Cannot determine target position for illumination drop.", + errorCouldNotDeterminePosition = "Error: Could not determine your position.", + illuminationDroppedOnTarget = "Illumination flare dropped on Target %d (%.0f°, %.1f%s). (%d remaining)", + illuminationRearmed = "Illumination flares rearmed: %d available.", + noGroundTargets = "No enemy ground targets detected in range.", + selectTargetFromMenu = "Select a target from the menu to mark it.", + targetInfo = "Target %d: %s %s %s, Bearing %.0f, Range %.1f %s", + -- State words + enabled = "enabled", + disabled = "disabled", + hot = "hot", + cold = "cold", + closing = "closing", + opening = "opening", + left = "left", + right = "right", + above = "above", + below = "below", + high = "high", + low = "low", + normal = "normal", + quiet = "quiet", + verbose = "verbose", + -- Menu text + menu = { + mainTitle = "WWII Pilot Intuition", + dogfightAssist = "Dogfight Assist", + enable = "Enable", + disable = "Disable", + markerType = "Marker Type", + smoke = "Smoke", + flare = "Flare", + red = "Red", + green = "Green", + blue = "Blue", + white = "White", + none = "None", + airScanning = "Air Scanning", + groundScanning = "Ground Scanning", + groundTargeting = "Ground Targeting", + scanForTargets = "Scan for Targets", + markTarget = "Mark Target", + target = "Target %d", + illumination = "Illumination (%d left)", + dropAtMyPosition = "Drop at My Position", + dropOnTarget = "Drop on Target", + alertFrequency = "Alert Frequency", + normalFreq = "Normal", + quietFreq = "Quiet", + verboseFreq = "Verbose", + summary = "Summary", + brief = "Brief", + detailed = "Detailed", + settingsAndGuides = "Settings & Player Guides", + distanceUnits = "Distance Units", + milesNautical = "Miles (Nautical)", + kilometers = "Kilometers", + playerGuide = "Player Guide", + systemOverview = "System Overview", + detectionRanges = "Detection Ranges", + dogfightAssistHelp = "Dogfight Assist Help", + groundTargetingHelp = "Ground Targeting Help", + formationTips = "Formation Tips", + illuminationHelp = "Illumination Help", + logLevel = "Log Level", + language = "Language / Sprache / Langue", + english = "English", + german = "Deutsch (German)", + french = "Français (French)", + spanish = "Español (Spanish)", + russian = "Русский (Russian)", + } + }, + -- German language + DE = { + welcome = { + "Willkommen bei WWII Piloten-Intuition! Dieses System simuliert Piloten-Aufklärung zum Erkennen von Luft- und Bodenzielen. Verwenden Sie das F10-Menü für Einstellungen.", + "Grüße, Pilot! WWII Piloten-Intuition ist aktiv. Es hilft Ihnen, Banditen und Bodenbedrohungen zu erkennen. Prüfen Sie F10 für Optionen.", + "Piloten-Intuition aktiviert! Simulieren Sie Aufklärung aus der WWII-Ära. F10-Menü für Steuerung.", + }, + formationJoin = { + "Sie haben sich dem Flug mit %s angeschlossen - Lufterkennung erhöht auf %.0f%s, Boden auf %.0f%s.", + "%s fliegt jetzt an Ihrem Flügel - Erkennungsreichweiten erhöht auf %.0f%s Luft, %.0f%s Boden.", + "Willkommen an Bord, %s! Formation verbessert Erkennung auf %.0f%s für Luft, %.0f%s für Boden.", + "%s schließt sich der Formation an - Augen sind schärfer jetzt, %.0f%s Luft, %.0f%s Boden Reichweite.", + }, + formationLeave = { + "%s hat Formation verlassen - Lufterkennung reduziert auf %.0f%s, Boden auf %.0f%s.", + "%s ist weg - Erkennung fällt auf %.0f%s Luft, %.0f%s Boden.", + "Formation durch %s aufgelöst - Reichweiten jetzt %.0f%s Luft, %.0f%s Boden.", + "%s hat sich abgesetzt - zurück zur Solo-Erkennung: %.0f%s Luft, %.0f%s Boden.", + }, + formationIntegrityLow = { + "Formationsintegrität niedrig! Zusammenrücken.", + "Formiert euch, Piloten! Wir sind zu weit auseinander.", + "Reihen schließen! Formationsintegrität gefährdet.", + "Zurück in Formation, Leute! Wir sind verwundbar.", + }, + airTargetDetected = { + "Bandit %s bei %.0f Grad, %.1f %s, Engel %.0f (%s)!", + "Feindflugzeug %s: %.0f Grad, %.1f %s, Höhe %.0f (%s).", + "Bogey %s bei %.0f Uhr, %.1f %s entfernt, Engel %.0f (%s).", + "Feindkontakt %s: %.0f Grad, %.1f %s, %.0f Engel (%s).", + "Bandit im Anflug %s: %.0f Grad, %.1f %s, Engel %.0f (%s).", + }, + groundTargetDetected = { + "%s Kontakt: %s %s bei %.0f Grad, %.1f %s.", + "Bodenbedrohung: %s %s %s gesichtet bei %.0f Grad, %.1f %s.", + "%s Einheiten entdeckt: %s %s, %.0f Grad, %.1f %s.", + "Feindlicher Boden: %s %s %s bei Peilung %.0f, %.1f %s entfernt.", + }, + dogfightEngaged = { + "Im Gefecht!", + "Tally ho! Luftkampf begonnen.", + "Bandit im Gefecht! Kampf läuft.", + "Luftkampf! Waffen scharf.", + }, + dogfightConcluded = { + "Luftkampf beendet.", + "Kampf vorbei. Klar.", + "Luftkampf beendet. Entspannen.", + "Gefecht beendet.", + }, + underFire = { + "Unter Beschuss! Ausweichen %s!%s", + "Treffer einsteckend! Ausweichen %s!%s", + "Schüsse abgefeuert! Wende %s jetzt!%s", + "Eingehend! Ausweichen %s!%s", + }, + closeFlyingCompliment = { + "Schönes Fliegen! Spitze-zu-Spitze-Formation.", + "Hey, schön! Das ist enges Fliegen.", + "Großartige Arbeit! Das ist nah!", + "Ruhig, Tiger, ich kenne dich nicht so gut!", + "Beeindruckend! Flügelspitze zu Flügelspitze.", + "Geschmeidige Bewegungen! Nahkampffliegen.", + "Verdammt, das ist eng! Gutes Fliegen.", + "Heilige Scheiße, das ist nah! Gut gemacht.", + "Puh, das war knapp! Gute Steuerung.", + "Du klebst an meinem Flügel! Exzellentes Fliegen.", + }, + headOnWarning = { + "Puh! Das war knapp!", + "Whoa! Fast frontal!", + "Knapper Anruf! Pass auf beim Überholen.", + "Verdammt, das war eng! Sei vorsichtig.", + "Heiliger Mist, fast kollidiert!", + }, + markerSet = { + "Markierung auf %s gesetzt.", + "Markierungen jetzt %s.", + "Markierungstyp geändert auf %s.", + }, + dogfightAssistToggle = { + "Luftkampf-Hilfe %s.", + "Luftkampf-Unterstützung %s.", + }, + activeMessagingToggle = { + "Aktive Benachrichtigungen %s.", + "Live-Warnungen %s.", + }, + airScanningToggle = { + "Luftscan %s.", + "Lufterkennung %s.", + }, + groundScanningToggle = { + "Bodenscan %s.", + "Bodenerkennung %s.", + }, + alertFrequencyToggle = { + "Warnfrequenz auf %s eingestellt.", + "Warnungen jetzt %s.", + }, + summaryCooldown = { + "Zusammenfassung in Abklingzeit.", + "Warten Sie etwas für eine weitere Zusammenfassung.", + }, + noThreats = { + "Keine aktiven Bedrohungen.", + "Alles klar.", + "Situation normal.", + }, + systemActive = "WWII Piloten-Intuition aktiv! Verwenden Sie das F10-Menü für Einstellungen.", + logLevelSet = "Log-Level auf %s gesetzt", + distanceUnitsSet = "Entfernungseinheiten auf %s eingestellt.", + targetNotAvailable = "Ziel %d nicht verfügbar.", + markedTarget = "Ziel %d markiert.", + noIlluminationFlares = "Keine Leuchtraketen mehr. Landen Sie auf einem befreundeten Flugplatz zum Auftanken.", + illuminationNotReady = "Beleuchtung nicht bereit. Warten Sie %d Sekunden.", + cannotDeterminePosition = "Kann Position für Leuchtraketen-Abwurf nicht bestimmen.", + cannotDetermineAltitude = "Kann Höhe für Leuchtraketen-Abwurf nicht bestimmen.", + illuminationDropped = "Leuchtrakete an Ihrer Position abgeworfen. (%d verbleibend)", + cannotDetermineTargetPosition = "Kann Zielposition für Leuchtraketen-Abwurf nicht bestimmen.", + errorCouldNotDeterminePosition = "Fehler: Konnte Ihre Position nicht bestimmen.", + illuminationDroppedOnTarget = "Leuchtrakete auf Ziel %d abgeworfen (%.0f°, %.1f%s). (%d verbleibend)", + illuminationRearmed = "Leuchtraketen aufgefüllt: %d verfügbar.", + noGroundTargets = "Keine feindlichen Bodenziele in Reichweite erkannt.", + selectTargetFromMenu = "Wählen Sie ein Ziel aus dem Menü zum Markieren.", + targetInfo = "Ziel %d: %s %s %s, Peilung %.0f, Reichweite %.1f %s", + enabled = "aktiviert", + disabled = "deaktiviert", + hot = "heiß", + cold = "kalt", + closing = "schließend", + opening = "öffnend", + left = "links", + right = "rechts", + above = "oben", + below = "unten", + high = "hoch", + low = "niedrig", + normal = "normal", + quiet = "ruhig", + verbose = "ausführlich", + menu = { + mainTitle = "WWII Piloten-Intuition", + dogfightAssist = "Luftkampf-Hilfe", + enable = "Aktivieren", + disable = "Deaktivieren", + markerType = "Markierungstyp", + smoke = "Rauch", + flare = "Leuchtrakete", + red = "Rot", + green = "Grün", + blue = "Blau", + white = "Weiß", + none = "Keine", + airScanning = "Luftscan", + groundScanning = "Bodenscan", + groundTargeting = "Bodenziel-Erfassung", + scanForTargets = "Nach Zielen scannen", + markTarget = "Ziel markieren", + target = "Ziel %d", + illumination = "Beleuchtung (%d übrig)", + dropAtMyPosition = "An meiner Position abwerfen", + dropOnTarget = "Auf Ziel abwerfen", + alertFrequency = "Warnfrequenz", + normalFreq = "Normal", + quietFreq = "Ruhig", + verboseFreq = "Ausführlich", + summary = "Zusammenfassung", + brief = "Kurz", + detailed = "Detailliert", + settingsAndGuides = "Einstellungen & Spielerführer", + distanceUnits = "Entfernungseinheiten", + milesNautical = "Meilen (Nautisch)", + kilometers = "Kilometer", + playerGuide = "Spielerführer", + systemOverview = "Systemübersicht", + detectionRanges = "Erkennungsreichweiten", + dogfightAssistHelp = "Luftkampf-Hilfe Anleitung", + groundTargetingHelp = "Bodenziel-Erfassung Anleitung", + formationTips = "Formationstipps", + illuminationHelp = "Beleuchtungs-Hilfe", + logLevel = "Log-Level", + language = "Language / Sprache / Langue", + english = "English (Englisch)", + german = "Deutsch (German)", + french = "Français (Französisch)", + spanish = "Español (Spanisch)", + russian = "Русский (Russisch)", + } + }, + -- French language + FR = { + welcome = { + "Bienvenue dans WWII Intuition du Pilote! Ce système simule la reconnaissance du pilote pour repérer les cibles aériennes et terrestres. Utilisez le menu F10 pour les paramètres.", + "Salutations, pilote! WWII Intuition du Pilote est actif. Il vous aide à repérer les bandits et les menaces au sol. Consultez F10 pour les options.", + "Intuition du pilote engagée! Simulez la reconnaissance de l'ère WWII. Menu F10 pour les commandes.", + }, + formationJoin = { + "Vous avez rejoint le vol avec %s - détection aérienne augmentée à %.0f%s, sol à %.0f%s.", + "%s vole maintenant sur votre aile - portées de détection augmentées à %.0f%s air, %.0f%s sol.", + "Bienvenue à bord, %s! La formation améliore la détection à %.0f%s pour l'air, %.0f%s pour le sol.", + "%s rejoint la formation - les yeux sont plus aiguisés maintenant, %.0f%s air, %.0f%s sol portée.", + }, + formationLeave = { + "%s a quitté la formation - détection aérienne réduite à %.0f%s, sol à %.0f%s.", + "%s est parti - détection chute à %.0f%s air, %.0f%s sol.", + "Formation rompue par %s - portées maintenant %.0f%s air, %.0f%s sol.", + "%s s'est détaché - retour à la détection solo: %.0f%s air, %.0f%s sol.", + }, + formationIntegrityLow = { + "Intégrité de formation faible! Resserrez-vous.", + "Formez-vous, pilotes! Nous sommes trop dispersés.", + "Serrez les rangs! Intégrité de formation compromise.", + "Revenez en formation, les gars! Nous sommes vulnérables.", + }, + airTargetDetected = { + "Bandit %s à %.0f degrés, %.1f %s, anges %.0f (%s)!", + "Avion ennemi %s: %.0f degrés, %.1f %s, altitude %.0f (%s).", + "Bogey %s à %.0f heures, %.1f %s, anges %.0f (%s).", + "Contact hostile %s: %.0f degrés, %.1f %s, %.0f anges (%s).", + "Bandit entrant %s: %.0f degrés, %.1f %s, anges %.0f (%s).", + }, + groundTargetDetected = { + "%s contact: %s %s à %.0f degrés, %.1f %s.", + "Menace au sol: %s %s %s repéré à %.0f degrés, %.1f %s.", + "%s unités détectées: %s %s, %.0f degrés, %.1f %s.", + "Sol ennemi: %s %s %s au relèvement %.0f, %.1f %s de distance.", + }, + dogfightEngaged = { + "Engagé!", + "Tally ho! Combat aérien commencé.", + "Bandit engagé! Le combat est lancé.", + "Combat aérien! Armes chaudes.", + }, + dogfightConcluded = { + "Combat aérien terminé.", + "Combat terminé. Dégagé.", + "Combat aérien terminé. Repos.", + "Engagement terminé.", + }, + underFire = { + "Sous le feu! Rompez %s!%s", + "Prend des coups! Évitez %s!%s", + "Coups tirés! Tournez %s maintenant!%s", + "Entrant! Rompez %s!%s", + }, + closeFlyingCompliment = { + "Beau vol! Formation bout à bout.", + "Hey, sympa! C'est du vol serré.", + "Excellent travail! C'est proche!", + "Doucement, tigre, je ne te connais pas si bien!", + "Impressionnant! Bout d'aile à bout d'aile.", + "Mouvements fluides! Vol en quartiers serrés.", + "Merde, c'est serré! Bon vol.", + "Putain, c'est proche! Bien joué.", + "Ouf, c'était proche! Bon maniement du manche.", + "Tu es collé à mon aile! Excellent vol.", + }, + headOnWarning = { + "Ouf! C'était proche!", + "Whoa! Presque en face!", + "Appel serré! Attention à ce passage.", + "Merde, c'était serré! Soyez prudent.", + "Sainte merde, presque entré en collision!", + }, + markerSet = { + "Marqueur défini sur %s.", + "Marqueurs maintenant %s.", + "Type de marqueur changé en %s.", + }, + dogfightAssistToggle = { + "Assistance combat aérien %s.", + "Assistance combat aérien %s.", + }, + activeMessagingToggle = { + "Messagerie active %s.", + "Alertes en direct %s.", + }, + airScanningToggle = { + "Scan aérien %s.", + "Détection aérienne %s.", + }, + groundScanningToggle = { + "Scan au sol %s.", + "Détection au sol %s.", + }, + alertFrequencyToggle = { + "Fréquence d'alerte définie sur %s.", + "Alertes maintenant %s.", + }, + summaryCooldown = { + "Résumé en temps de recharge.", + "Attendez un peu pour un autre résumé.", + }, + noThreats = { + "Aucune menace active.", + "Tout est clair.", + "Situation normale.", + }, + systemActive = "WWII Intuition du Pilote actif! Utilisez le menu F10 pour les paramètres.", + logLevelSet = "Niveau de log défini sur: %s", + distanceUnitsSet = "Unités de distance définies sur %s.", + targetNotAvailable = "Cible %d non disponible.", + markedTarget = "Cible %d marquée.", + noIlluminationFlares = "Plus de fusées éclairantes. Atterrissez sur une base aérienne amie pour vous réarmer.", + illuminationNotReady = "Illumination pas prête. Attendez %d secondes.", + cannotDeterminePosition = "Impossible de déterminer la position pour le largage de fusée éclairante.", + cannotDetermineAltitude = "Impossible de déterminer l'altitude pour le largage de fusée éclairante.", + illuminationDropped = "Fusée éclairante larguée à votre position. (%d restantes)", + cannotDetermineTargetPosition = "Impossible de déterminer la position de la cible pour le largage de fusée éclairante.", + errorCouldNotDeterminePosition = "Erreur: Impossible de déterminer votre position.", + illuminationDroppedOnTarget = "Fusée éclairante larguée sur cible %d (%.0f°, %.1f%s). (%d restantes)", + illuminationRearmed = "Fusées éclairantes réarmées: %d disponibles.", + noGroundTargets = "Aucune cible terrestre ennemie détectée à portée.", + selectTargetFromMenu = "Sélectionnez une cible dans le menu pour la marquer.", + targetInfo = "Cible %d: %s %s %s, Relèvement %.0f, Portée %.1f %s", + enabled = "activé", + disabled = "désactivé", + hot = "chaud", + cold = "froid", + closing = "rapprochement", + opening = "éloignement", + left = "gauche", + right = "droite", + above = "au-dessus", + below = "en-dessous", + high = "haut", + low = "bas", + normal = "normal", + quiet = "calme", + verbose = "verbeux", + menu = { + mainTitle = "Intuition du Pilote WWII", + dogfightAssist = "Assistance Combat Aérien", + enable = "Activer", + disable = "Désactiver", + markerType = "Type de Marqueur", + smoke = "Fumée", + flare = "Fusée", + red = "Rouge", + green = "Vert", + blue = "Bleu", + white = "Blanc", + none = "Aucun", + airScanning = "Scan Aérien", + groundScanning = "Scan au Sol", + groundTargeting = "Ciblage au Sol", + scanForTargets = "Scanner les Cibles", + markTarget = "Marquer Cible", + target = "Cible %d", + illumination = "Illumination (%d restantes)", + dropAtMyPosition = "Larguer à ma Position", + dropOnTarget = "Larguer sur Cible", + alertFrequency = "Fréquence d'Alerte", + normalFreq = "Normal", + quietFreq = "Calme", + verboseFreq = "Verbeux", + summary = "Résumé", + brief = "Bref", + detailed = "Détaillé", + settingsAndGuides = "Paramètres & Guides Joueurs", + distanceUnits = "Unités de Distance", + milesNautical = "Miles (Nautiques)", + kilometers = "Kilomètres", + playerGuide = "Guide du Joueur", + systemOverview = "Aperçu du Système", + detectionRanges = "Portées de Détection", + dogfightAssistHelp = "Aide Combat Aérien", + groundTargetingHelp = "Aide Ciblage au Sol", + formationTips = "Conseils Formation", + illuminationHelp = "Aide Illumination", + logLevel = "Niveau de Log", + language = "Language / Sprache / Langue", + english = "English (Anglais)", + german = "Deutsch (Allemand)", + french = "Français (French)", + spanish = "Español (Espagnol)", + russian = "Русский (Russe)", + } + }, + -- Spanish language + ES = { + welcome = { + "¡Bienvenido a WWII Intuición del Piloto! Este sistema simula el reconocimiento del piloto para detectar objetivos aéreos y terrestres. Use el menú F10 para configuración.", + "¡Saludos, piloto! WWII Intuición del Piloto está activo. Te ayuda a detectar bandidos y amenazas terrestres. Revisa F10 para opciones.", + "¡Intuición del piloto activada! Simula reconocimiento de la era WWII. Menú F10 para controles.", + }, + formationJoin = { + "Te has unido al vuelo con %s - detección aérea aumentada a %.0f%s, terrestre a %.0f%s.", + "%s ahora vuela en tu ala - rangos de detección aumentados a %.0f%s aéreo, %.0f%s terrestre.", + "¡Bienvenido a bordo, %s! La formación mejora detección a %.0f%s para aéreo, %.0f%s para terrestre.", + "%s se une a la formación - ojos más agudos ahora, %.0f%s aéreo, %.0f%s terrestre rango.", + }, + formationLeave = { + "%s dejó la formación - detección aérea reducida a %.0f%s, terrestre a %.0f%s.", + "%s se fue - detección cae a %.0f%s aéreo, %.0f%s terrestre.", + "Formación rota por %s - rangos ahora %.0f%s aéreo, %.0f%s terrestre.", + "%s se ha separado - vuelta a detección solitaria: %.0f%s aéreo, %.0f%s terrestre.", + }, + formationIntegrityLow = { + "¡Integridad de formación baja! Aprieten.", + "¡Formen, pilotos! Estamos demasiado dispersos.", + "¡Cierren filas! Integridad de formación comprometida.", + "¡Vuelvan a la formación, muchachos! Somos vulnerables.", + }, + airTargetDetected = { + "Bandido %s a %.0f grados, %.1f %s, ángeles %.0f (%s)!", + "Aeronave enemiga %s: %.0f grados, %.1f %s, altitud %.0f (%s).", + "Bogey %s a las %.0f en punto, %.1f %s fuera, ángeles %.0f (%s).", + "Contacto hostil %s: %.0f grados, %.1f %s, %.0f ángeles (%s).", + "Bandido entrante %s: %.0f grados, %.1f %s, ángeles %.0f (%s).", + }, + groundTargetDetected = { + "%s contacto: %s %s a %.0f grados, %.1f %s.", + "Amenaza terrestre: %s %s %s avistado a %.0f grados, %.1f %s.", + "%s unidades detectadas: %s %s, %.0f grados, %.1f %s.", + "Terreno enemigo: %s %s %s en rumbo %.0f, %.1f %s de distancia.", + }, + dogfightEngaged = { + "¡Enganchado!", + "¡Tally ho! Combate aéreo iniciado.", + "¡Bandido enganchado! La pelea está en marcha.", + "¡Combate aéreo! Armas calientes.", + }, + dogfightConcluded = { + "Combate aéreo concluido.", + "Pelea terminada. Despejado.", + "Combate aéreo terminado. Descanso.", + "Enganche terminado.", + }, + underFire = { + "¡Bajo fuego! ¡Rompe %s!%s", + "¡Recibiendo impactos! ¡Evade %s!%s", + "¡Disparos! ¡Gira %s ahora!%s", + "¡Entrante! ¡Rompe %s!%s", + }, + closeFlyingCompliment = { + "¡Buen vuelo! Formación punta con punta.", + "¡Hey, bien! Eso es vuelo cerrado.", + "¡Excelente trabajo! ¡Qué cerca!", + "¡Despacio ahí tigre, no te conozco tan bien!", + "¡Impresionante! Punta de ala con punta de ala.", + "¡Movimientos suaves! Vuelo en cuartos cerrados.", + "¡Diablos, qué ajustado! Buen vuelo.", + "¡Mierda, qué cerca! Bien hecho.", + "¡Uf, eso estuvo cerca! Buen control del stick.", + "¡Estás pegado a mi ala! Excelente vuelo.", + }, + headOnWarning = { + "¡Uf! ¡Eso estuvo cerca!", + "¡Whoa! ¡Casi de frente!", + "¡Llamada cerrada! Cuidado con ese pase.", + "¡Diablos, eso estuvo ajustado! Ten cuidado.", + "¡Santo cielo, casi colisionamos!", + }, + markerSet = { + "Marcador establecido en %s.", + "Marcadores ahora %s.", + "Tipo de marcador cambiado a %s.", + }, + dogfightAssistToggle = { + "Asistencia de combate aéreo %s.", + "Asistencia de combate aéreo %s.", + }, + activeMessagingToggle = { + "Mensajería activa %s.", + "Alertas en vivo %s.", + }, + airScanningToggle = { + "Escaneo aéreo %s.", + "Detección aérea %s.", + }, + groundScanningToggle = { + "Escaneo terrestre %s.", + "Detección terrestre %s.", + }, + alertFrequencyToggle = { + "Frecuencia de alerta establecida en %s.", + "Alertas ahora %s.", + }, + summaryCooldown = { + "Resumen en tiempo de reutilización.", + "Espera un poco para otro resumen.", + }, + noThreats = { + "Sin amenazas activas.", + "Todo despejado.", + "Situación normal.", + }, + systemActive = "¡WWII Intuición del Piloto activo! Use el menú F10 para configuración.", + logLevelSet = "Nivel de registro establecido en: %s", + distanceUnitsSet = "Unidades de distancia establecidas en %s.", + targetNotAvailable = "Objetivo %d no disponible.", + markedTarget = "Objetivo %d marcado.", + noIlluminationFlares = "No quedan bengalas de iluminación. Aterriza en una base aérea amiga para rearmarte.", + illuminationNotReady = "Iluminación no lista. Espera %d segundos.", + cannotDeterminePosition = "No se puede determinar la posición para lanzar bengala de iluminación.", + cannotDetermineAltitude = "No se puede determinar la altitud para lanzar bengala de iluminación.", + illuminationDropped = "Bengala de iluminación lanzada en tu posición. (%d restantes)", + cannotDetermineTargetPosition = "No se puede determinar la posición del objetivo para lanzar bengala de iluminación.", + errorCouldNotDeterminePosition = "Error: No se pudo determinar tu posición.", + illuminationDroppedOnTarget = "Bengala de iluminación lanzada en Objetivo %d (%.0f°, %.1f%s). (%d restantes)", + illuminationRearmed = "Bengalas de iluminación rearmadas: %d disponibles.", + noGroundTargets = "No se detectaron objetivos terrestres enemigos en rango.", + selectTargetFromMenu = "Selecciona un objetivo del menú para marcarlo.", + targetInfo = "Objetivo %d: %s %s %s, Rumbo %.0f, Rango %.1f %s", + enabled = "activado", + disabled = "desactivado", + hot = "caliente", + cold = "frío", + closing = "acercándose", + opening = "alejándose", + left = "izquierda", + right = "derecha", + above = "arriba", + below = "abajo", + high = "alto", + low = "bajo", + normal = "normal", + quiet = "silencioso", + verbose = "detallado", + menu = { + mainTitle = "Intuición del Piloto WWII", + dogfightAssist = "Asistencia Combate Aéreo", + enable = "Activar", + disable = "Desactivar", + markerType = "Tipo de Marcador", + smoke = "Humo", + flare = "Bengala", + red = "Rojo", + green = "Verde", + blue = "Azul", + white = "Blanco", + none = "Ninguno", + airScanning = "Escaneo Aéreo", + groundScanning = "Escaneo Terrestre", + groundTargeting = "Objetivo Terrestre", + scanForTargets = "Escanear Objetivos", + markTarget = "Marcar Objetivo", + target = "Objetivo %d", + illumination = "Iluminación (%d restantes)", + dropAtMyPosition = "Lanzar en Mi Posición", + dropOnTarget = "Lanzar en Objetivo", + alertFrequency = "Frecuencia de Alerta", + normalFreq = "Normal", + quietFreq = "Silencioso", + verboseFreq = "Detallado", + summary = "Resumen", + brief = "Breve", + detailed = "Detallado", + settingsAndGuides = "Configuración y Guías", + distanceUnits = "Unidades de Distancia", + milesNautical = "Millas (Náuticas)", + kilometers = "Kilómetros", + playerGuide = "Guía del Jugador", + systemOverview = "Resumen del Sistema", + detectionRanges = "Rangos de Detección", + dogfightAssistHelp = "Ayuda Combate Aéreo", + groundTargetingHelp = "Ayuda Objetivo Terrestre", + formationTips = "Consejos de Formación", + illuminationHelp = "Ayuda de Iluminación", + logLevel = "Nivel de Registro", + language = "Language / Sprache / Langue", + english = "English (Inglés)", + german = "Deutsch (Alemán)", + french = "Français (Francés)", + spanish = "Español (Spanish)", + russian = "Русский (Ruso)", + } + }, + -- Russian language + RU = { + welcome = { + "Добро пожаловать в WWII Интуиция Пилота! Эта система имитирует разведку пилота для обнаружения воздушных и наземных целей. Используйте меню F10 для настроек.", + "Приветствую, пилот! WWII Интуиция Пилота активна. Она поможет вам обнаружить бандитов и наземные угрозы. Проверьте F10 для опций.", + "Интуиция пилота активирована! Имитируйте разведку эпохи WWII. Меню F10 для управления.", + }, + formationJoin = { + "Вы присоединились к полету с %s - обнаружение воздушных целей увеличено до %.0f%s, наземных до %.0f%s.", + "%s теперь летит на вашем крыле - дальности обнаружения увеличены до %.0f%s воздух, %.0f%s земля.", + "Добро пожаловать на борт, %s! Формация улучшает обнаружение до %.0f%s для воздуха, %.0f%s для земли.", + "%s присоединяется к формации - глаза острее теперь, %.0f%s воздух, %.0f%s земля дальность.", + }, + formationLeave = { + "%s покинул формацию - обнаружение воздушных целей снижено до %.0f%s, наземных до %.0f%s.", + "%s ушел - обнаружение падает до %.0f%s воздух, %.0f%s земля.", + "Формация разорвана %s - дальности теперь %.0f%s воздух, %.0f%s земля.", + "%s отделился - обратно к одиночному обнаружению: %.0f%s воздух, %.0f%s земля.", + }, + formationIntegrityLow = { + "Целостность формации низкая! Сжаться.", + "Стройтесь, пилоты! Мы слишком разбросаны.", + "Сомкните ряды! Целостность формации под угрозой.", + "Вернитесь в формацию, ребята! Мы уязвимы.", + }, + airTargetDetected = { + "Бандит %s на %.0f градусов, %.1f %s, ангелы %.0f (%s)!", + "Вражеский самолет %s: %.0f градусов, %.1f %s, высота %.0f (%s).", + "Боги %s на %.0f часов, %.1f %s, ангелы %.0f (%s).", + "Враждебный контакт %s: %.0f градусов, %.1f %s, %.0f ангелов (%s).", + "Бандит входящий %s: %.0f градусов, %.1f %s, ангелы %.0f (%s).", + }, + groundTargetDetected = { + "%s контакт: %s %s на %.0f градусов, %.1f %s.", + "Наземная угроза: %s %s %s замечен на %.0f градусов, %.1f %s.", + "%s единицы обнаружены: %s %s, %.0f градусов, %.1f %s.", + "Вражеская земля: %s %s %s на пеленге %.0f, %.1f %s расстояние.", + }, + dogfightEngaged = { + "Вступил!", + "Талли хо! Воздушный бой начат.", + "Бандит вступил! Бой идет.", + "Воздушный бой! Оружие горячо.", + }, + dogfightConcluded = { + "Воздушный бой завершен.", + "Бой окончен. Чисто.", + "Воздушный бой закончен. Отбой.", + "Вступление завершено.", + }, + underFire = { + "Под огнем! Разрывай %s!%s", + "Получаем попадания! Уклоняйся %s!%s", + "Выстрелы! Поверни %s сейчас!%s", + "Входящий! Разрывай %s!%s", + }, + closeFlyingCompliment = { + "Отличный полет! Формация концом к концу.", + "Эй, хорошо! Это тесный полет.", + "Отличная работа! Как близко!", + "Полегче там, тигр, я тебя так хорошо не знаю!", + "Впечатляюще! Законцовка к законцовке.", + "Плавные движения! Полет в тесных четвертях.", + "Черт, как тесно! Хороший полет.", + "Святые небеса, как близко! Отлично.", + "Уф, это было близко! Хорошая работа ручкой.", + "Ты приклеен к моему крылу! Отличный полет.", + }, + headOnWarning = { + "Уф! Это было близко!", + "Воу! Почти лобовое!", + "Близкий вызов! Осторожнее с этим проходом.", + "Черт, это было тесно! Будь осторожен.", + "Святые небеса, почти столкнулись!", + }, + markerSet = { + "Маркер установлен на %s.", + "Маркеры теперь %s.", + "Тип маркера изменен на %s.", + }, + dogfightAssistToggle = { + "Помощь в воздушном бою %s.", + "Ассистенс воздушного боя %s.", + }, + activeMessagingToggle = { + "Активные сообщения %s.", + "Живые оповещения %s.", + }, + airScanningToggle = { + "Воздушное сканирование %s.", + "Воздушное обнаружение %s.", + }, + groundScanningToggle = { + "Наземное сканирование %s.", + "Наземное обнаружение %s.", + }, + alertFrequencyToggle = { + "Частота оповещений установлена на %s.", + "Оповещения теперь %s.", + }, + summaryCooldown = { + "Резюме на перезарядке.", + "Подожди немного для другого резюме.", + }, + noThreats = { + "Нет активных угроз.", + "Все чисто.", + "Ситуация нормальная.", + }, + systemActive = "WWII Интуиция Пилота активна! Используйте меню F10 для настроек.", + logLevelSet = "Уровень логирования установлен на: %s", + distanceUnitsSet = "Единицы расстояния установлены на %s.", + targetNotAvailable = "Цель %d недоступна.", + markedTarget = "Цель %d отмечена.", + noIlluminationFlares = "Осветительные ракеты закончились. Приземлитесь на дружественную авиабазу для перевооружения.", + illuminationNotReady = "Освещение не готово. Подождите %d секунд.", + cannotDeterminePosition = "Невозможно определить позицию для сброса осветительной ракеты.", + cannotDetermineAltitude = "Невозможно определить высоту для сброса осветительной ракеты.", + illuminationDropped = "Осветительная ракета сброшена на вашей позиции. (%d осталось)", + cannotDetermineTargetPosition = "Невозможно определить позицию цели для сброса осветительной ракеты.", + errorCouldNotDeterminePosition = "Ошибка: Не удалось определить вашу позицию.", + illuminationDroppedOnTarget = "Осветительная ракета сброшена на Цель %d (%.0f°, %.1f%s). (%d осталось)", + illuminationRearmed = "Осветительные ракеты перезаряжены: %d доступно.", + noGroundTargets = "Вражеские наземные цели в радиусе не обнаружены.", + selectTargetFromMenu = "Выберите цель из меню, чтобы отметить её.", + targetInfo = "Цель %d: %s %s %s, Пеленг %.0f, Дальность %.1f %s", + enabled = "включено", + disabled = "отключено", + hot = "горячий", + cold = "холодный", + closing = "сближение", + opening = "расхождение", + left = "слева", + right = "справа", + above = "сверху", + below = "снизу", + high = "высокий", + low = "низкий", + normal = "нормальный", + quiet = "тихий", + verbose = "подробный", + menu = { + mainTitle = "Интуиция Пилота WWII", + dogfightAssist = "Помощь Воздушный Бой", + enable = "Включить", + disable = "Отключить", + markerType = "Тип Маркера", + smoke = "Дым", + flare = "Ракета", + red = "Красный", + green = "Зеленый", + blue = "Синий", + white = "Белый", + none = "Нет", + airScanning = "Воздушное Сканирование", + groundScanning = "Наземное Сканирование", + groundTargeting = "Наземное Наведение", + scanForTargets = "Сканировать Цели", + markTarget = "Отметить Цель", + target = "Цель %d", + illumination = "Освещение (%d осталось)", + dropAtMyPosition = "Сбросить на Моей Позиции", + dropOnTarget = "Сбросить на Цель", + alertFrequency = "Частота Оповещений", + normalFreq = "Нормальная", + quietFreq = "Тихая", + verboseFreq = "Подробная", + summary = "Резюме", + brief = "Краткое", + detailed = "Подробное", + settingsAndGuides = "Настройки и Руководства", + distanceUnits = "Единицы Расстояния", + milesNautical = "Мили (Морские)", + kilometers = "Километры", + playerGuide = "Руководство Игрока", + systemOverview = "Обзор Системы", + detectionRanges = "Дальности Обнаружения", + dogfightAssistHelp = "Помощь Воздушный Бой", + groundTargetingHelp = "Помощь Наземное Наведение", + formationTips = "Советы по Формации", + illuminationHelp = "Помощь Освещение", + logLevel = "Уровень Логирования", + language = "Language / Sprache / Langue", + english = "English (Английский)", + german = "Deutsch (Немецкий)", + french = "Français (Французский)", + spanish = "Español (Испанский)", + russian = "Русский (Russian)", + } + } +} + +-- Backward compatibility: keep old reference for any direct usage +PILOT_INTUITION_MESSAGES = PILOT_INTUITION_LANGUAGES.EN + +-- Pilot Intuition Class +PilotIntuition = { + ClassName = "PilotIntuition", + players = {}, -- Table to track per-player data + trackedGroundTargets = {}, -- Global table to track ground targets + lastMessageTime = 0, + menu = nil, + enabled = true, + summaryScheduler = nil, + lastDeepCleanup = 0, -- For periodic deep cleanup + playerMenus = {}, -- Track created player menus to avoid duplicates +} + +-- Helper function to format distance based on player preference +function PilotIntuition:FormatDistance(distanceMeters, playerKey) + local distanceUnit = PILOT_INTUITION_CONFIG.distanceUnit + + -- Check for player-specific preference + if playerKey and self.players[playerKey] and self.players[playerKey].distanceUnit then + distanceUnit = self.players[playerKey].distanceUnit + end + + if distanceUnit == "mi" then + -- Convert to nautical miles (1 nautical mile = 1852 meters) + local distanceNM = distanceMeters / 1852 + return distanceNM, "mi" + else + -- Default to kilometers + local distanceKM = distanceMeters / 1000 + return distanceKM, "km" + end +end + +-- Helper function to get player's language +function PilotIntuition:GetPlayerLanguage(playerKey) + if playerKey and self.players[playerKey] and self.players[playerKey].language then + return self.players[playerKey].language + end + return PILOT_INTUITION_CONFIG.defaultLanguage +end + +-- Helper function to get translated text (non-array messages) +function PilotIntuition:GetText(textKey, playerKey) + local lang = self:GetPlayerLanguage(playerKey) + local langTable = PILOT_INTUITION_LANGUAGES[lang] or PILOT_INTUITION_LANGUAGES.EN + + -- Check if it's a nested key (e.g., "menu.mainTitle") + if string.find(textKey, "%.") then + local parts = {} + for part in string.gmatch(textKey, "[^%.]+") do + table.insert(parts, part) + end + + local value = langTable + for _, part in ipairs(parts) do + if value and type(value) == "table" then + value = value[part] + else + return textKey -- Fallback to key if not found + end + end + return value or textKey + end + + return langTable[textKey] or textKey +end + +-- Get random message with player language support +function PilotIntuition:GetRandomMessage(messageType, params, playerKey) + local lang = self:GetPlayerLanguage(playerKey) + local langTable = PILOT_INTUITION_LANGUAGES[lang] or PILOT_INTUITION_LANGUAGES.EN + local messages = langTable[messageType] + + if not messages then + env.info("PilotIntuition: No messages for type " .. tostring(messageType) .. " in language " .. lang) + return "Message type not found: " .. tostring(messageType) + end + + -- Handle both array messages and single string messages + local msg + if type(messages) == "table" and #messages > 0 then + msg = messages[math.random(#messages)] + elseif type(messages) == "string" then + msg = messages + else + return "Invalid message format for: " .. tostring(messageType) + end + + env.info("PilotIntuition: Selected message: " .. msg) + if params then + msg = string.format(msg, unpack(params)) + env.info("PilotIntuition: Formatted message: " .. msg) + end + return msg +end + +function PilotIntuition:New() + PILog(LOG_INFO, "PilotIntuition: System starting") + local self = BASE:Inherit(self, BASE:New()) + self.players = {} + self.trackedGroundTargets = {} + self.lastMessageTime = timer.getTime() + self.playerMenus = {} -- Clear cached menus on initialization + self:SetupMenu() + self:WireEventHandlers() + self:StartScheduler() + PILog(LOG_INFO, "PilotIntuition: System initialized") + return self +end + +-- Helper function to get current unit for a clientName +function PilotIntuition:GetUnitForClient(clientName) + if not clientName then + env.info("PilotIntuition: GetUnitForClient - no clientName provided") + return nil + end + + env.info("PilotIntuition: GetUnitForClient looking for: " .. tostring(clientName)) + + -- Try _DATABASE.CLIENTS first + if _DATABASE and _DATABASE.CLIENTS and _DATABASE.CLIENTS[clientName] then + local unitName = _DATABASE.CLIENTS[clientName].UnitName + env.info("PilotIntuition: Found in _DATABASE.CLIENTS, unitName: " .. tostring(unitName)) + if unitName then + local unit = UNIT:FindByName(unitName) + if unit then + env.info("PilotIntuition: UNIT:FindByName succeeded, IsAlive: " .. tostring(unit:IsAlive())) + if unit:IsAlive() then + return unit + end + else + env.info("PilotIntuition: UNIT:FindByName returned nil") + end + end + else + env.info("PilotIntuition: clientName not found in _DATABASE.CLIENTS") + end + + return nil +end + +-- Helper function to get player data key from a unit (handles aliasing) +function PilotIntuition:GetPlayerDataKey(playerUnit) + if not playerUnit then return nil end + + local unitName = playerUnit:GetName() + local playerName = playerUnit:GetPlayerName() + + -- Try unit name first (clientName from _DATABASE.CLIENTS) + if self.players[unitName] then + return unitName + end + + -- Try player name second (may be aliased to unit name) + if playerName and self.players[playerName] then + return playerName + end + + -- Try to find player data by searching _DATABASE.CLIENTS for matching unit + if _DATABASE and _DATABASE.CLIENTS then + for clientName, clientData in pairs(_DATABASE.CLIENTS) do + if clientData and clientData.UnitName == unitName then + if self.players[clientName] then + return clientName + end + end + end + end + + return nil +end + +-- Helper function to get all active player units +function PilotIntuition:GetActivePlayers() + local players = {} + local count = 0 + + -- Method 1: Try DCS coalition.getPlayers() + for _, coalitionId in pairs({coalition.side.RED, coalition.side.BLUE, coalition.side.NEUTRAL}) do + local success, coalPlayers = pcall(coalition.getPlayers, coalitionId) + if success and coalPlayers then + for _, playerId in pairs(coalPlayers) do + if playerId and type(playerId) == "string" and playerId ~= "" then + local success2, unit = pcall(Unit.getByName, playerId) + if success2 and unit and unit:isExist() and unit:isActive() then + local unitWrapper = UNIT:Find(unit) + if unitWrapper then + local playerName = unitWrapper:GetPlayerName() or unitWrapper:GetName() + players[playerName] = unitWrapper + count = count + 1 + env.info("PilotIntuition: Found player via coalition.getPlayers: " .. playerName) + end + end + end + end + end + end + + -- Method 2: Try _DATABASE.CLIENTS + if _DATABASE and _DATABASE.CLIENTS then + local clientCount = 0 + for clientName, clientData in pairs(_DATABASE.CLIENTS) do + clientCount = clientCount + 1 + PILog(LOG_TRACE, "PilotIntuition: Checking _DATABASE.CLIENTS entry #" .. clientCount .. ": " .. tostring(clientName)) + if clientData then + PILog(LOG_TRACE, " - UnitName: " .. tostring(clientData.UnitName)) + end + if not players[clientName] and clientData and clientData.UnitName then + local unit = UNIT:FindByName(clientData.UnitName) + PILog(LOG_TRACE, " - UNIT:FindByName result: " .. tostring(unit)) + if unit then + PILog(LOG_TRACE, " - Unit:IsAlive: " .. tostring(unit:IsAlive())) + end + if unit and unit:IsAlive() then + players[clientName] = unit + count = count + 1 + PILog(LOG_DEBUG, "PilotIntuition: Found player via _DATABASE.CLIENTS: " .. clientName) + end + end + end + PILog(LOG_DEBUG, "PilotIntuition: _DATABASE.CLIENTS had " .. clientCount .. " total entries") + else + PILog(LOG_ERROR, "PilotIntuition: _DATABASE.CLIENTS not available!") + end + + PILog(LOG_INFO, "PilotIntuition: GetActivePlayers found " .. count .. " players") + return players +end + +function PilotIntuition:ScanTargets() + PILog(LOG_DEBUG, "PilotIntuition: ScanTargets called") + if not self.enabled then + return + end + local startTime = timer.getTime() -- Profiling start + + local activePlayers = self:GetActivePlayers() + local activeClients = {} + local activePlayerNames = {} + + -- Build active client list from the players we found + for clientName, unit in pairs(activePlayers) do + if unit and unit:IsAlive() then + local client = unit:GetClient() + local pos = unit:GetCoordinate() + local actualPlayerName = unit:GetPlayerName() or unit:GetName() + activeClients[#activeClients + 1] = { client = client, unit = unit, name = clientName, pos = pos, coalition = unit:GetCoalition() } + activePlayerNames[clientName] = true + + -- Create player data if it doesn't exist (using clientName as primary key) + if not self.players[clientName] then + self.players[clientName] = { + trackedAirTargets = {}, + lastMessageTime = timer.getTime(), + lastFormationMessageTime = 3, -- Separate cooldown for formation join/leave messages + lastDogfightTime = 0, -- For multi-bandit tactical picture cooldown + wingmenList = {}, + formationWarned = false, + lastFormationChangeTime = 0, + lastConclusionTime = 0, + trackedGroundTargets = {}, + dogfightAssist = PILOT_INTUITION_CONFIG.dogfightAssistEnabled, + lastDogfightAssistTime = 0, + markerType = PILOT_INTUITION_CONFIG.markerType, + lastSpeed = 0, + primaryTarget = nil, + lastPrimaryTargetBearing = nil, + lastSummaryTime = 0, + hasBeenWelcomed = false, + lastComplimentTime = 0, + lastHeadOnWarningTime = 0, + enableAirScanning = PILOT_INTUITION_CONFIG.enableAirScanning, + enableGroundScanning = PILOT_INTUITION_CONFIG.enableGroundScanning, + scannedGroundTargets = {}, -- List of recently scanned ground targets for selection + cachedWingmen = 0, -- Cached wingmen count + lastIlluminationTime = 0, -- Cooldown tracking for illumination flares + illuminationFlares = PILOT_INTUITION_CONFIG.illuminationFlaresDefault, -- Remaining illumination flares + lastWingmenUpdate = 0, + previousWingmen = 0, -- For formation change detection + frequencyMultiplier = 1.0, -- Per-player alert frequency: 1.0=normal, 2.0=quiet, 0.5=verbose + threateningBandits = {}, -- Reusable table for detected threats + lastMultipleBanditsWarningTime = 0, -- Cooldown for "Multiple bandits in vicinity!" message + distanceUnit = PILOT_INTUITION_CONFIG.distanceUnit, -- Player's distance unit preference + language = PILOT_INTUITION_CONFIG.defaultLanguage, -- Player's language preference + } + end + + -- Menu creation now handled by Birth event only + end + end + + -- If no active players, skip the scan + if #activeClients == 0 then + env.info("PilotIntuition: No active players, skipping scan") + return + end + + -- Cache wingmen for each player (updated every scan for simplicity) + for _, info in ipairs(activeClients) do + local playerName = info.name + local playerData = self.players[playerName] + if playerData then + playerData.cachedWingmen = 0 + + -- Count other players in formation + for _, otherInfo in ipairs(activeClients) do + local u = otherInfo.unit + if u and u:IsAlive() and u:GetCoalition() == info.unit:GetCoalition() and u:GetName() ~= info.unit:GetName() then + local dist = info.pos:Get2DDistance(otherInfo.pos) + if dist <= PILOT_INTUITION_CONFIG.formationRange then + playerData.cachedWingmen = playerData.cachedWingmen + 1 + end + end + end + + -- Count AI wingmen if enabled (aircraft only, same coalition) + if PILOT_INTUITION_CONFIG.countAIWingmen then + PILog(LOG_INFO, "PilotIntuition: Checking AI wingmen for player " .. playerName) + + -- Get all friendly AIR units in formation range + local playerCoalition = info.unit:GetCoalition() + local allFriendlyUnits = coalition.getGroups(playerCoalition, Group.Category.AIRPLANE) + local aiCount = 0 + + for _, dcsGroup in ipairs(allFriendlyUnits) do + local mooseGroup = GROUP:Find(dcsGroup) + if mooseGroup and mooseGroup:IsAlive() then + local groupUnits = mooseGroup:GetUnits() + for _, aiUnit in pairs(groupUnits) do + if aiUnit and aiUnit:IsAlive() and aiUnit:GetName() ~= info.unit:GetName() then + -- Verify it's an aircraft (double-check since we filtered by category) + if aiUnit:IsAir() then + -- Check distance first (cheaper than GetPlayerName) + local aiCoord = aiUnit:GetCoordinate() + if aiCoord then + local dist = info.pos:Get2DDistance(aiCoord) + if dist <= PILOT_INTUITION_CONFIG.formationRange then + -- Now check if it's AI (not a player) + local playerName = aiUnit:GetPlayerName() + local isAI = not playerName or playerName == "" + if isAI then + -- Add AI with multiplier (can be fractional) + playerData.cachedWingmen = playerData.cachedWingmen + PILOT_INTUITION_CONFIG.aiWingmenMultiplier + aiCount = aiCount + 1 + PILog(LOG_INFO, "PilotIntuition: Added AI wingman " .. aiUnit:GetName() .. " at " .. math.floor(dist) .. "m, total: " .. playerData.cachedWingmen) + end + end + end + end + end + end + end + end + + PILog(LOG_INFO, "PilotIntuition: Total AI wingmen in formation: " .. aiCount) + end + + PILog(LOG_INFO, "PilotIntuition: Final wingmen count for " .. playerName .. ": " .. playerData.cachedWingmen) + playerData.lastWingmenUpdate = timer.getTime() + end + end + + -- Send welcome message to new players + for _, info in ipairs(activeClients) do + local playerName = info.name + if self.players[playerName] and not self.players[playerName].hasBeenWelcomed and PILOT_INTUITION_CONFIG.showWelcomeMessage then + MESSAGE:New(self:GetRandomMessage("welcome", nil, playerName), 10):ToClient(info.client) + self.players[playerName].hasBeenWelcomed = true + end + end + + -- Clean up stale player data + for playerName, _ in pairs(self.players) do + if not activePlayerNames[playerName] then + self.players[playerName] = nil + end + end + + -- Build enemy unit lists once per coalition for the scan + local enemyAirByCoalition = {} + enemyAirByCoalition[coalition.side.BLUE] = {} + enemyAirByCoalition[coalition.side.RED] = {} + PILog(LOG_INFO, "PilotIntuition: Building enemy air unit list from _DATABASE.UNITS...") + local enemyCount = 0 + + -- Iterate directly through Moose's already-populated database + for unitName, unitObj in pairs(_DATABASE.UNITS) do + if unitObj and unitObj:IsAlive() and unitObj:IsAir() then + local c = unitObj:GetCoalition() + if c == coalition.side.BLUE or c == coalition.side.RED then + enemyAirByCoalition[c][#enemyAirByCoalition[c] + 1] = unitObj + enemyCount = enemyCount + 1 + PILog(LOG_INFO, "PilotIntuition: Found enemy air unit: " .. unitName .. " (coalition " .. c .. ")") + end + end + end + PILog(LOG_INFO, "PilotIntuition: Total enemy air units found: " .. enemyCount) + + local enemyGroundByCoalition = {} + enemyGroundByCoalition[coalition.side.BLUE] = {} + enemyGroundByCoalition[coalition.side.RED] = {} + + -- Iterate directly through Moose's already-populated database for ground groups + for groupName, groupObj in pairs(_DATABASE.GROUPS) do + if groupObj and groupObj:IsAlive() and groupObj:IsGround() then + local c = groupObj:GetCoalition() + if c == coalition.side.BLUE or c == coalition.side.RED then + enemyGroundByCoalition[c][#enemyGroundByCoalition[c] + 1] = groupObj + end + end + end + + -- Now scan per active client + for _, info in ipairs(activeClients) do + local client = info.client + local unit = info.unit + local playerName = info.name + local playerData = self.players[playerName] + if playerData and unit and unit:IsAlive() then + -- Determine enemy lists for this player + local playerCoal = unit:GetCoalition() + local enemyCoal = (playerCoal == coalition.side.BLUE) and coalition.side.RED or coalition.side.BLUE + PILog(LOG_INFO, "PilotIntuition: Player " .. playerName .. " coalition: " .. playerCoal .. ", enemy coalition: " .. enemyCoal) + PILog(LOG_INFO, "PilotIntuition: Air scanning enabled: " .. tostring(playerData.enableAirScanning)) + PILog(LOG_INFO, "PilotIntuition: Enemy air units for this player: " .. #(enemyAirByCoalition[enemyCoal] or {})) + if playerData.enableAirScanning then + self:ScanAirTargetsForPlayer(unit, playerData, client, activeClients, enemyAirByCoalition[enemyCoal]) + end + if playerData.enableGroundScanning then + self:ScanGroundTargetsForPlayer(unit, client, activeClients, enemyGroundByCoalition[enemyCoal]) + end + self:CheckCloseFlyingForPlayer(unit, playerData, client, activeClients) + end + end + + -- Prune dead ground targets globally + for id, data in pairs(self.trackedGroundTargets) do + if not data.group:IsAlive() then + self.trackedGroundTargets[id] = nil + end + end + + -- Periodic deep cleanup every 60 seconds + local now = timer.getTime() + if not self.lastDeepCleanup or (now - self.lastDeepCleanup) > 60 then + self:DeepCleanup() + self.lastDeepCleanup = now + end + + local endTime = timer.getTime() -- Profiling end + PILog(LOG_DEBUG, string.format("PilotIntuition: ScanTargets completed in %.3f seconds", endTime - startTime)) +end + +function PilotIntuition:DeepCleanup() + env.info("PilotIntuition: Performing deep cleanup") + -- Force remove any stale tracked targets + for playerName, playerData in pairs(self.players) do + for id, data in pairs(playerData.trackedAirTargets) do + if not data.unit or not data.unit:IsAlive() then + playerData.trackedAirTargets[id] = nil + end + end + for id, _ in pairs(playerData.trackedGroundTargets) do + if not self.trackedGroundTargets[id] or not self.trackedGroundTargets[id].group:IsAlive() then + playerData.trackedGroundTargets[id] = nil + end + end + end + -- Clean global ground targets + for id, data in pairs(self.trackedGroundTargets) do + if not data.group:IsAlive() then + self.trackedGroundTargets[id] = nil + end + end + env.info("PilotIntuition: Deep cleanup completed") +end + +-- Setup the mission and per-player menus for pilot intuition toggles +function PilotIntuition:SetupMenu() + PILog(LOG_INFO, "PilotIntuition: SetupMenu called - creating menus for existing players") + + -- Create menus for any players already in the mission (e.g., mission editor start) + SCHEDULER:New(nil, function() + local activePlayers = self:GetActivePlayers() + for clientName, unit in pairs(activePlayers) do + if unit and unit:IsAlive() then + local group = unit:GetGroup() + if group then + local groupName = group:GetName() + if not self.playerMenus[groupName] then + PILog(LOG_INFO, "PilotIntuition: Creating menu for existing player group: " .. groupName) + self.playerMenus[groupName] = self:BuildGroupMenus(group) + MESSAGE:New(self:GetText("systemActive", group:GetUnit(1):GetPlayerName()), 10):ToGroup(group) + end + end + end + end + end, {}, 2) -- Wait 2 seconds for mission to fully load +end + +-- BuildGroupMenus: Creates full menu tree for a player group (CTLD-style) +function PilotIntuition:BuildGroupMenus(group) + PILog(LOG_INFO, "PilotIntuition: BuildGroupMenus called for group: " .. group:GetName()) + + -- Verify group is valid and has units + if not group or not group:IsAlive() then + PILog(LOG_ERROR, "PilotIntuition: Cannot create menu - group is nil or not alive") + return nil + end + + -- Get first unit in group for callbacks and language + local unit = group:GetUnit(1) + if not unit then + PILog(LOG_ERROR, "PilotIntuition: WARNING - No unit found in group") + return nil + end + + local playerKey = self:GetPlayerDataKey(unit) + + -- Create the main menu for this group with translated text + local playerSubMenu = MENU_GROUP:New(group, self:GetText("menu.mainTitle", playerKey)) + PILog(LOG_INFO, "PilotIntuition: Main menu created for group: " .. group:GetName()) + + -- Dogfight Assist submenu + local dogfightMenu = MENU_GROUP:New(group, self:GetText("menu.dogfightAssist", playerKey), playerSubMenu) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.enable", playerKey), dogfightMenu, function() self:MenuSetPlayerDogfightAssist(unit, true) end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.disable", playerKey), dogfightMenu, function() self:MenuSetPlayerDogfightAssist(unit, false) end) + + -- Marker Type submenu + local markerMenu = MENU_GROUP:New(group, self:GetText("menu.markerType", playerKey), playerSubMenu) + local smokeMenu = MENU_GROUP:New(group, self:GetText("menu.smoke", playerKey), markerMenu) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.red", playerKey), smokeMenu, function() self:MenuSetPlayerMarker(unit, "smoke_red") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.green", playerKey), smokeMenu, function() self:MenuSetPlayerMarker(unit, "smoke_green") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.blue", playerKey), smokeMenu, function() self:MenuSetPlayerMarker(unit, "smoke_blue") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.white", playerKey), smokeMenu, function() self:MenuSetPlayerMarker(unit, "smoke_white") end) + local flareMenu = MENU_GROUP:New(group, self:GetText("menu.flare", playerKey), markerMenu) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.red", playerKey), flareMenu, function() self:MenuSetPlayerMarker(unit, "flare_red") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.green", playerKey), flareMenu, function() self:MenuSetPlayerMarker(unit, "flare_green") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.white", playerKey), flareMenu, function() self:MenuSetPlayerMarker(unit, "flare_white") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.none", playerKey), markerMenu, function() self:MenuSetPlayerMarker(unit, "none") end) + + -- Air scanning submenu + local airScanMenu = MENU_GROUP:New(group, self:GetText("menu.airScanning", playerKey), playerSubMenu) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.enable", playerKey), airScanMenu, function() self:MenuSetPlayerAirScanning(unit, true) end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.disable", playerKey), airScanMenu, function() self:MenuSetPlayerAirScanning(unit, false) end) + + -- Ground scanning submenu + local groundScanMenu = MENU_GROUP:New(group, self:GetText("menu.groundScanning", playerKey), playerSubMenu) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.enable", playerKey), groundScanMenu, function() self:MenuSetPlayerGroundScanning(unit, true) end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.disable", playerKey), groundScanMenu, function() self:MenuSetPlayerGroundScanning(unit, false) end) + + -- Ground targeting submenu + local groundMenu = MENU_GROUP:New(group, self:GetText("menu.groundTargeting", playerKey), playerSubMenu) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.scanForTargets", playerKey), groundMenu, function() self:MenuScanGroundTargets(unit) end) + local markMenu = MENU_GROUP:New(group, self:GetText("menu.markTarget", playerKey), groundMenu) + for i=1,5 do + local captureIndex = i + local targetLabel = string.format(self:GetText("menu.target", playerKey), i) + MENU_GROUP_COMMAND:New(group, targetLabel, markMenu, function() self:MenuMarkGroundTarget(unit, captureIndex) end) + end + + -- Illumination submenu with dynamic count display + local playerName = unit:GetPlayerName() or unit:GetName() + local flareCount = (self.players[playerName] and self.players[playerName].illuminationFlares) or PILOT_INTUITION_CONFIG.illuminationFlaresDefault + local illuLabel = string.format(self:GetText("menu.illumination", playerKey), flareCount) + local illuMenu = MENU_GROUP:New(group, illuLabel, playerSubMenu) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.dropAtMyPosition", playerKey), illuMenu, function() self:MenuDropIlluminationAtPlayer(unit) end) + local illuTargetMenu = MENU_GROUP:New(group, self:GetText("menu.dropOnTarget", playerKey), illuMenu) + for i=1,5 do + local captureIndex = i + local targetLabel = string.format(self:GetText("menu.target", playerKey), i) + MENU_GROUP_COMMAND:New(group, targetLabel, illuTargetMenu, function() self:MenuDropIlluminationOnTarget(unit, captureIndex) end) + end + + -- Alert frequency submenu + local freqMenu = MENU_GROUP:New(group, self:GetText("menu.alertFrequency", playerKey), playerSubMenu) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.normalFreq", playerKey), freqMenu, function() self:MenuSetPlayerAlertFrequency(unit, "normal") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.quietFreq", playerKey), freqMenu, function() self:MenuSetPlayerAlertFrequency(unit, "quiet") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.verboseFreq", playerKey), freqMenu, function() self:MenuSetPlayerAlertFrequency(unit, "verbose") end) + + -- Summary submenu + local summaryMenu = MENU_GROUP:New(group, self:GetText("menu.summary", playerKey), playerSubMenu) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.brief", playerKey), summaryMenu, function() self:MenuSendPlayerSummary(unit, "brief") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.detailed", playerKey), summaryMenu, function() self:MenuSendPlayerSummary(unit, "detailed") end) + + -- Admin Settings submenu (placed last) + local adminMenu = MENU_GROUP:New(group, self:GetText("menu.settingsAndGuides", playerKey), playerSubMenu) + + -- Language selection submenu (under admin) - Keep multilingual for accessibility + local langMenu = MENU_GROUP:New(group, "Language / Sprache / Langue", adminMenu) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.english", playerKey), langMenu, function() self:MenuSetPlayerLanguage(unit, "EN") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.german", playerKey), langMenu, function() self:MenuSetPlayerLanguage(unit, "DE") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.french", playerKey), langMenu, function() self:MenuSetPlayerLanguage(unit, "FR") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.spanish", playerKey), langMenu, function() self:MenuSetPlayerLanguage(unit, "ES") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.russian", playerKey), langMenu, function() self:MenuSetPlayerLanguage(unit, "RU") end) + + -- Distance units submenu (under admin) + local distMenu = MENU_GROUP:New(group, self:GetText("menu.distanceUnits", playerKey), adminMenu) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.milesNautical", playerKey), distMenu, function() self:MenuSetPlayerDistanceUnit(unit, "mi") end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.kilometers", playerKey), distMenu, function() self:MenuSetPlayerDistanceUnit(unit, "km") end) + + -- Player Guide submenu + local guideMenu = MENU_GROUP:New(group, self:GetText("menu.playerGuide", playerKey), adminMenu) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.systemOverview", playerKey), guideMenu, function() self:ShowGuideOverview(group) end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.detectionRanges", playerKey), guideMenu, function() self:ShowGuideRanges(group) end) + MENU_GROUP_COMMAND:New(group, self:GetText("menu.formationTips", playerKey), guideMenu, function() self:ShowGuideFormation(group) end) + MENU_GROUP_COMMAND:New(group, "Environment Effects", guideMenu, function() self:ShowGuideEnvironment(group) end) + + -- Log level submenu (global setting) + local logMenu = MENU_GROUP:New(group, self:GetText("menu.logLevel", playerKey), adminMenu) + MENU_GROUP_COMMAND:New(group, "Error Only", logMenu, function() self:SetLogLevel(1, group) end) + MENU_GROUP_COMMAND:New(group, "Info (Default)", logMenu, function() self:SetLogLevel(2, group) end) + MENU_GROUP_COMMAND:New(group, "Debug", logMenu, function() self:SetLogLevel(3, group) end) + MENU_GROUP_COMMAND:New(group, "Trace (Verbose)", logMenu, function() self:SetLogLevel(4, group) end) + + PILog(LOG_INFO, "PilotIntuition: Menu created successfully for group " .. group:GetName()) + return playerSubMenu +end + +-- Rebuild menu for a player group (used when illumination flare count changes) +function PilotIntuition:RebuildPlayerMenu(unit) + if not unit or not unit:IsAlive() then + PILog(LOG_ERROR, "PilotIntuition: RebuildPlayerMenu - invalid unit") + return + end + + local group = unit:GetGroup() + if not group then + PILog(LOG_ERROR, "PilotIntuition: RebuildPlayerMenu - no group found") + return + end + + local groupName = group:GetName() + PILog(LOG_DEBUG, "PilotIntuition: Rebuilding menu for group: " .. groupName) + + -- Remove old menu if it exists + if self.playerMenus[groupName] then + local oldMenu = self.playerMenus[groupName] + if oldMenu and oldMenu.Remove then + oldMenu:Remove() + PILog(LOG_DEBUG, "PilotIntuition: Removed old menu for group: " .. groupName) + end + self.playerMenus[groupName] = nil + end + + -- Build new menu + self.playerMenus[groupName] = self:BuildGroupMenus(group) + PILog(LOG_INFO, "PilotIntuition: Menu rebuilt successfully for group: " .. groupName) +end + +function PilotIntuition:SetLogLevel(level, group) + PILOT_INTUITION_LOG_LEVEL = level + local labels = {"None", "Error", "Info", "Debug", "Trace"} + MESSAGE:New("Log level set to: " .. (labels[level + 1] or "Unknown"), 5):ToGroup(group) + PILog(LOG_INFO, "PilotIntuition: Log level changed to " .. level) +end + +-- Player Guide functions +function PilotIntuition:ShowGuideOverview(group) + local msg = "WWII PILOT INTUITION - SYSTEM OVERVIEW\n\n" + msg = msg .. "This system simulates WWII-era pilot awareness without modern radar or labels.\n\n" + msg = msg .. "KEY FEATURES:\n" + msg = msg .. "• Air & Ground target detection based on visual ranges\n" + msg = msg .. "• Formation flying SIGNIFICANTLY boosts detection ranges\n" + msg = msg .. "• Dogfight assistance (merge warnings, tail alerts, energy state)\n" + msg = msg .. "• Optional smoke/flare markers for spotted targets\n" + msg = msg .. "• Environmental effects (night, weather reduce ranges)\n\n" + msg = msg .. "Use F10 menu to customize settings per pilot.\n" + msg = msg .. "Check other guide sections for detailed mechanics." + MESSAGE:New(msg, 20):ToGroup(group) +end + +function PilotIntuition:ShowGuideRanges(group) + local airRange = PILOT_INTUITION_CONFIG.airDetectionRange + local groundRange = PILOT_INTUITION_CONFIG.groundDetectionRange + local maxMult = PILOT_INTUITION_CONFIG.maxMultiplier + local formRange = PILOT_INTUITION_CONFIG.formationRange + + local msg = "DETECTION RANGES\n\n" + msg = msg .. "BASE RANGES (Solo Flight):\n" + msg = msg .. "• Air Targets: " .. airRange .. "m (~" .. math.floor(airRange / 1852 * 10) / 10 .. "nm)\n" + msg = msg .. "• Ground Targets: " .. groundRange .. "m (~" .. math.floor(groundRange / 1852 * 10) / 10 .. "nm)\n\n" + msg = msg .. "FORMATION MULTIPLIERS:\n" + msg = msg .. "Solo: 1.0x (base range)\n" + msg = msg .. "2-ship: 2.0x (double range)\n" + msg = msg .. "3-ship: 3.0x (triple range)\n" + msg = msg .. "4-ship: 4.0x (quadruple range)\n" + if maxMult >= 5 then + msg = msg .. "5-ship: 5.0x\n" + end + if maxMult >= 6 then + msg = msg .. "6+ ship: " .. maxMult .. ".0x (maximum)\n\n" + else + msg = msg .. maxMult .. "+ ship: " .. maxMult .. ".0x (maximum)\n\n" + end + msg = msg .. "EXAMPLE (Air Detection):\n" + local solo = math.floor(airRange / 1000) + local twoship = math.floor(airRange * 2 / 1000) + local fourship = math.floor(airRange * math.min(4, maxMult) / 1000) + msg = msg .. "Solo: " .. solo .. "km | 2-ship: " .. twoship .. "km | 4-ship: " .. fourship .. "km\n\n" + msg = msg .. "Formation = wingmen within " .. formRange .. "m (~" .. math.floor(formRange / 1852 * 10) / 10 .. "nm)" + MESSAGE:New(msg, 25):ToGroup(group) +end + +function PilotIntuition:ShowGuideFormation(group) + local formRange = PILOT_INTUITION_CONFIG.formationRange + local maxMult = PILOT_INTUITION_CONFIG.maxMultiplier + local minWingmen = PILOT_INTUITION_CONFIG.minFormationWingmen + + local msg = "FORMATION FLYING BENEFITS\n\n" + msg = msg .. "Formation flying is CRITICAL for situational awareness!\n\n" + msg = msg .. "FORMATION REQUIREMENTS:\n" + msg = msg .. "• Wingmen must be within " .. formRange .. "m (~" .. math.floor(formRange / 1852 * 10) / 10 .. "nm)\n" + msg = msg .. "• Same coalition (friendlies only)\n" + msg = msg .. "• Aircraft must be alive and player-controlled\n" + msg = msg .. "• Minimum wingmen for warnings: " .. minWingmen .. "\n\n" + msg = msg .. "DETECTION BOOST:\n" + msg = msg .. "Each additional wingman adds 1.0x to your detection range (up to " .. maxMult .. ".0x max).\n\n" + msg = msg .. "TACTICAL ADVANTAGE:\n" + local fourShipMult = math.min(4, maxMult) + msg = msg .. "• 4-ship formation sees " .. fourShipMult .. "x further than solo\n" + msg = msg .. "• Spot bandits before they spot you\n" + msg = msg .. "• Better ground reconnaissance coverage\n" + MESSAGE:New(msg, 25):ToGroup(group) +end + +function PilotIntuition:ShowGuideEnvironment(group) + local nightMult = PILOT_INTUITION_CONFIG.nightDetectionMultiplier + local weatherMult = PILOT_INTUITION_CONFIG.badWeatherMultiplier + local mergeRange = PILOT_INTUITION_CONFIG.mergeRange + local tailRange = PILOT_INTUITION_CONFIG.tailWarningRange + local headOnRange = PILOT_INTUITION_CONFIG.headOnRange + local beamRange = PILOT_INTUITION_CONFIG.beamRange + local combinedMult = nightMult * weatherMult + + local msg = "ENVIRONMENT EFFECTS\n\n" + msg = msg .. "Detection ranges are affected by conditions:\n\n" + msg = msg .. "NIGHT TIME:\n" + msg = msg .. "• " .. (nightMult * 100) .. "% detection range\n" + msg = msg .. "• Harder to spot targets in darkness\n" + msg = msg .. "• Formation flying still helps!\n\n" + msg = msg .. "BAD WEATHER:\n" + msg = msg .. "• " .. (weatherMult * 100) .. "% detection range\n" + msg = msg .. "• Rain, fog, clouds reduce visibility\n" + msg = msg .. "• Stacks with night penalty\n\n" + msg = msg .. "COMBINED EFFECTS:\n" + msg = msg .. "Night + Bad Weather = ~" .. math.floor(combinedMult * 100) .. "% of normal range.\n\n" + msg = msg .. "DOGFIGHT RANGES:\n" + msg = msg .. "• Merge: " .. mergeRange .. "m\n" + msg = msg .. "• Tail Warning: " .. tailRange .. "m\n" + msg = msg .. "• Head-On: " .. headOnRange .. "m\n" + msg = msg .. "• Beam: " .. beamRange .. "m\n\n" + msg = msg .. "These ranges are NOT affected by environment - they're visual merge distances." + MESSAGE:New(msg, 30):ToGroup(group) +end + +-- WireEventHandlers: Set up Birth event handler (CTLD-style) +function PilotIntuition:WireEventHandlers() + PILog(LOG_INFO, "PilotIntuition: Wiring event handlers using EVENTHANDLER") + + local handler = EVENTHANDLER:New() + handler:HandleEvent(EVENTS.Birth) + handler:HandleEvent(EVENTS.PlayerEnterUnit) + handler:HandleEvent(EVENTS.Shot) + handler:HandleEvent(EVENTS.Land) + + local selfref = self + + function handler:OnEventBirth(EventData) + if not EventData or not EventData.IniUnit then return end + local unit = EventData.IniUnit + if not unit or not unit:IsAlive() then return end + + -- Only create menus for player-controlled units + local playerName = unit:GetPlayerName() + if not playerName then + PILog(LOG_TRACE, "PilotIntuition: Birth event for non-player unit, skipping menu creation") + return + end + + local group = unit:GetGroup() + if not group then return end + local groupName = group:GetName() + + -- Simple check: if menu exists for this group, skip + if selfref.playerMenus[groupName] then + PILog(LOG_DEBUG, "PilotIntuition: Menu already exists for group: " .. groupName) + return + end + + PILog(LOG_INFO, "PilotIntuition: Birth event - creating menu for player group: " .. groupName) + selfref.playerMenus[groupName] = selfref:BuildGroupMenus(group) + + -- Send welcome message to group + MESSAGE:New("WWII Pilot Intuition active! Use F10 menu for settings.", 10):ToGroup(group) + end + + function handler:OnEventPlayerEnterUnit(EventData) + if not EventData or not EventData.IniUnit then return end + local unit = EventData.IniUnit + if not unit or not unit:IsAlive() then return end + + local group = unit:GetGroup() + if not group then return end + local groupName = group:GetName() + + PILog(LOG_INFO, "PilotIntuition: PlayerEnterUnit event for group: " .. groupName) + + -- Add a small delay to ensure the unit is fully initialized in multiplayer + SCHEDULER:New(nil, function() + -- Check if menu already exists + if not selfref.playerMenus[groupName] then + PILog(LOG_INFO, "PilotIntuition: Creating menu for player group: " .. groupName) + selfref.playerMenus[groupName] = selfref:BuildGroupMenus(group) + MESSAGE:New("WWII Pilot Intuition active! Use F10 menu for settings.", 10):ToGroup(group) + else + PILog(LOG_DEBUG, "PilotIntuition: Menu already exists for group: " .. groupName) + end + end, {}, 1) + end + + function handler:OnEventShot(EventData) + selfref:OnPlayerShot(EventData) + selfref:OnShotFired(EventData) + end + + function handler:OnEventLand(EventData) + if not EventData or not EventData.IniUnit then return end + local unit = EventData.IniUnit + if not unit or not unit:IsAlive() then return end + + -- Check if it's a player unit + local playerName = unit:GetPlayerName() + if not playerName then return end + + local playerData = selfref.players[playerName] + if not playerData then return end + + -- Check if landed at a friendly airbase + local place = EventData.Place + if place and place:getCoalition() == unit:GetCoalition() then + -- Rearm illumination flares + local prevCount = playerData.illuminationFlares or 0 + playerData.illuminationFlares = PILOT_INTUITION_CONFIG.illuminationFlaresDefault + + local client = unit:GetClient() + if client and prevCount < PILOT_INTUITION_CONFIG.illuminationFlaresDefault then + MESSAGE:New(string.format(self:GetText("illuminationRearmed", clientName), PILOT_INTUITION_CONFIG.illuminationFlaresDefault), 10):ToClient(client) + end + + PILog(LOG_INFO, "PilotIntuition: Player " .. playerName .. " rearmed illumination flares at friendly airbase") + end + end + + self.EventHandler = handler + PILog(LOG_INFO, "PilotIntuition: Event handlers wired successfully") +end + +function PilotIntuition:OnPlayerEnterUnit(EventData) + env.info("PilotIntuition: OnPlayerEnterUnit event triggered") + if EventData and EventData.IniUnit then + local unit = EventData.IniUnit + if unit and unit:IsAlive() then + env.info("PilotIntuition: Player entered unit: " .. tostring(unit:GetName())) + -- Small delay to ensure unit is fully initialized + SCHEDULER:New(nil, function() + self:SetupPlayerMenus() + end, {}, 2) + end + end +end + +function PilotIntuition:SetupPlayerMenus() + env.info("PilotIntuition: SetupPlayerMenus called") + + local activePlayers = self:GetActivePlayers() + local playersFound = 0 + + for clientName, unit in pairs(activePlayers) do + playersFound = playersFound + 1 + env.info("PilotIntuition: Processing player: " .. tostring(clientName)) + + if unit and unit:IsAlive() then + env.info("PilotIntuition: Unit is alive: " .. tostring(unit:GetName())) + + -- Get the actual player name for aliasing + local actualPlayerName = unit:GetPlayerName() or unit:GetName() + + -- Ensure player data exists (may have been created by ScanTargets) + if not self.players[clientName] then + self.players[clientName] = { + trackedAirTargets = {}, + lastMessageTime = timer.getTime(), + lastDogfightTime = 0, -- For multi-bandit tactical picture cooldown + wingmenList = {}, + formationWarned = false, + lastFormationChangeTime = 0, + lastConclusionTime = 0, + trackedGroundTargets = {}, + dogfightAssist = PILOT_INTUITION_CONFIG.dogfightAssistEnabled, + lastDogfightAssistTime = 0, + markerType = PILOT_INTUITION_CONFIG.markerType, + lastSpeed = 0, + primaryTarget = nil, + lastPrimaryTargetBearing = nil, + lastSummaryTime = 0, + hasBeenWelcomed = false, + lastComplimentTime = 0, + lastHeadOnWarningTime = 0, + enableAirScanning = PILOT_INTUITION_CONFIG.enableAirScanning, + enableGroundScanning = PILOT_INTUITION_CONFIG.enableGroundScanning, + scannedGroundTargets = {}, + cachedWingmen = 0, + lastWingmenUpdate = 0, + previousWingmen = 0, + frequencyMultiplier = 1.0, + threateningBandits = {}, -- Reusable table for detected threats + distanceUnit = PILOT_INTUITION_CONFIG.distanceUnit, + language = PILOT_INTUITION_CONFIG.defaultLanguage, + } + end + + -- Create alias for actual player name + if actualPlayerName ~= clientName then + env.info("PilotIntuition: Creating player alias in SetupPlayerMenus: '" .. actualPlayerName .. "' -> '" .. clientName .. "'") + self.players[actualPlayerName] = self.players[clientName] + end + + local playerGroup = unit:GetGroup() + if not playerGroup then + env.info("PilotIntuition: No group found for unit " .. tostring(unit:GetName())) + else + -- Skip if menu already created for this player + if self.playerMenus[clientName] then + env.info("PilotIntuition: Menu already exists for " .. clientName) + else + env.info("PilotIntuition: Creating menu for player " .. clientName) + + -- Create the main menu for this player's group + local playerSubMenu = MENU_GROUP:New(playerGroup, "WWII Pilot Intuition") + local currentGroupName = playerGroup:GetName() + self.playerMenus[clientName] = { + menu = playerSubMenu, + groupName = currentGroupName + } + + -- Dogfight Assist submenu + local dogfightMenu = MENU_GROUP:New(playerGroup, "Dogfight Assist", playerSubMenu) + MENU_GROUP_COMMAND:New(playerGroup, "Enable", dogfightMenu, function() self:MenuSetPlayerDogfightAssist(unit, true) end) + MENU_GROUP_COMMAND:New(playerGroup, "Disable", dogfightMenu, function() self:MenuSetPlayerDogfightAssist(unit, false) end) + + -- Marker Type submenu + local markerMenu = MENU_GROUP:New(playerGroup, "Marker Type", playerSubMenu) + local smokeMenu = MENU_GROUP:New(playerGroup, "Smoke", markerMenu) + MENU_GROUP_COMMAND:New(playerGroup, "Red", smokeMenu, function() self:MenuSetPlayerMarker(unit, "smoke_red") end) + MENU_GROUP_COMMAND:New(playerGroup, "Green", smokeMenu, function() self:MenuSetPlayerMarker(unit, "smoke_green") end) + MENU_GROUP_COMMAND:New(playerGroup, "Blue", smokeMenu, function() self:MenuSetPlayerMarker(unit, "smoke_blue") end) + MENU_GROUP_COMMAND:New(playerGroup, "White", smokeMenu, function() self:MenuSetPlayerMarker(unit, "smoke_white") end) + local flareMenu = MENU_GROUP:New(playerGroup, "Flare", markerMenu) + MENU_GROUP_COMMAND:New(playerGroup, "Red", flareMenu, function() self:MenuSetPlayerMarker(unit, "flare_red") end) + MENU_GROUP_COMMAND:New(playerGroup, "Green", flareMenu, function() self:MenuSetPlayerMarker(unit, "flare_green") end) + MENU_GROUP_COMMAND:New(playerGroup, "White", flareMenu, function() self:MenuSetPlayerMarker(unit, "flare_white") end) + MENU_GROUP_COMMAND:New(playerGroup, "None", markerMenu, function() self:MenuSetPlayerMarker(unit, "none") end) + + -- Air scanning submenu + local airScanMenu = MENU_GROUP:New(playerGroup, "Air Scanning", playerSubMenu) + MENU_GROUP_COMMAND:New(playerGroup, "Enable", airScanMenu, function() self:MenuSetPlayerAirScanning(unit, true) end) + MENU_GROUP_COMMAND:New(playerGroup, "Disable", airScanMenu, function() self:MenuSetPlayerAirScanning(unit, false) end) + + -- Ground scanning submenu + local groundScanMenu = MENU_GROUP:New(playerGroup, "Ground Scanning", playerSubMenu) + MENU_GROUP_COMMAND:New(playerGroup, "Enable", groundScanMenu, function() self:MenuSetPlayerGroundScanning(unit, true) end) + MENU_GROUP_COMMAND:New(playerGroup, "Disable", groundScanMenu, function() self:MenuSetPlayerGroundScanning(unit, false) end) + + -- Ground targeting submenu + local groundMenu = MENU_GROUP:New(playerGroup, "Ground Targeting", playerSubMenu) + MENU_GROUP_COMMAND:New(playerGroup, "Scan for Targets", groundMenu, function() self:MenuScanGroundTargets(unit) end) + local markMenu = MENU_GROUP:New(playerGroup, "Mark Target", groundMenu) + for i=1,5 do + MENU_GROUP_COMMAND:New(playerGroup, "Target " .. i, markMenu, function() self:MenuMarkGroundTarget(unit, i) end) + end + + -- Alert frequency submenu + local freqMenu = MENU_GROUP:New(playerGroup, "Alert Frequency", playerSubMenu) + MENU_GROUP_COMMAND:New(playerGroup, "Normal", freqMenu, function() self:MenuSetPlayerAlertFrequency(unit, "normal") end) + MENU_GROUP_COMMAND:New(playerGroup, "Quiet", freqMenu, function() self:MenuSetPlayerAlertFrequency(unit, "quiet") end) + MENU_GROUP_COMMAND:New(playerGroup, "Verbose", freqMenu, function() self:MenuSetPlayerAlertFrequency(unit, "verbose") end) + + -- Summary submenu + local summaryMenu = MENU_GROUP:New(playerGroup, "Summary", playerSubMenu) + MENU_GROUP_COMMAND:New(playerGroup, "Brief", summaryMenu, function() self:MenuSendPlayerSummary(unit, "brief") end) + MENU_GROUP_COMMAND:New(playerGroup, "Detailed", summaryMenu, function() self:MenuSendPlayerSummary(unit, "detailed") end) + + env.info("PilotIntuition: Menu created successfully for " .. clientName) + end + end + end + end + + env.info("PilotIntuition: SetupPlayerMenus completed, processed " .. playersFound .. " players") +end + +function PilotIntuition:MenuSetPlayerMarker(playerUnit, markerType) + env.info("====== PilotIntuition: MenuSetPlayerMarker CALLED ======") + env.info("PilotIntuition: playerUnit = " .. tostring(playerUnit)) + if playerUnit then + env.info("PilotIntuition: playerUnit:GetName() = " .. tostring(playerUnit:GetName())) + env.info("PilotIntuition: playerUnit:GetPlayerName() = " .. tostring(playerUnit:GetPlayerName())) + end + env.info("PilotIntuition: markerType = " .. tostring(markerType)) + if not playerUnit then + env.info("PilotIntuition: ERROR - No playerUnit provided") + return + end + local playerKey = self:GetPlayerDataKey(playerUnit) + -- store as player pref only - not global config + if playerKey and self.players[playerKey] then + self.players[playerKey].markerType = markerType + local client = playerUnit:GetClient() + if client then + local niceType = markerType:gsub("_", " "):gsub("(%w)(%w*)", function(first, rest) return first:upper() .. rest:lower() end) + MESSAGE:New(self:GetRandomMessage("markerSet", {niceType}, playerName), 10):ToClient(client) + end + end +end +function PilotIntuition:MenuSetMarkerType(type) + env.info("PilotIntuition: MenuSetMarkerType called with " .. tostring(type)) + PILOT_INTUITION_CONFIG.markerType = type + local niceType = type:gsub("_", " "):gsub("(%w)(%w*)", function(first, rest) return first:upper() .. rest:lower() end) + local msg = self:GetRandomMessage("markerSet", {niceType}) + env.info("PilotIntuition: Marker message: " .. msg) + self:BroadcastMessageToAll(msg) +end + +function PilotIntuition:MenuSetPlayerDogfightAssist(playerUnit, onoff) + env.info("====== PilotIntuition: MenuSetPlayerDogfightAssist CALLED ======") + env.info("PilotIntuition: playerUnit = " .. tostring(playerUnit)) + if playerUnit then + env.info("PilotIntuition: playerUnit:GetName() = " .. tostring(playerUnit:GetName())) + end + env.info("PilotIntuition: onoff = " .. tostring(onoff)) + if not playerUnit then + env.info("PilotIntuition: ERROR - No playerUnit provided") + return + end + local playerKey = self:GetPlayerDataKey(playerUnit) + env.info("PilotIntuition: Looking for player data with key: " .. tostring(playerKey)) + env.info("PilotIntuition: Available players: " .. table.concat(self:GetPlayerKeys(), ", ")) + + if playerKey and self.players[playerKey] then + env.info("PilotIntuition: Found player data, setting dogfightAssist to " .. tostring(onoff)) + self.players[playerKey].dogfightAssist = onoff + local status = onoff and "enabled" or "disabled" + local client = playerUnit:GetClient() + env.info("PilotIntuition: Getting client: " .. tostring(client)) + if client then + env.info("PilotIntuition: Sending message to client") + MESSAGE:New(self:GetRandomMessage("dogfightAssistToggle", {status}, playerName), 10):ToClient(client) + else + env.info("PilotIntuition: ERROR - Could not get client") + end + else + env.info("PilotIntuition: ERROR - Player data not found for: " .. tostring(playerKey)) + end +end + +function PilotIntuition:MenuSetPlayerAirScanning(playerUnit, onoff) + env.info("====== PilotIntuition: MenuSetPlayerAirScanning CALLED ======") + env.info("PilotIntuition: playerUnit = " .. tostring(playerUnit)) + if playerUnit then + env.info("PilotIntuition: playerUnit:GetName() = " .. tostring(playerUnit:GetName())) + end + env.info("PilotIntuition: onoff = " .. tostring(onoff)) + if not playerUnit then + env.info("PilotIntuition: ERROR - No playerUnit provided") + return + end + local playerKey = self:GetPlayerDataKey(playerUnit) + if playerKey and self.players[playerKey] then + self.players[playerKey].enableAirScanning = onoff + local status = onoff and "enabled" or "disabled" + local client = playerUnit:GetClient() + if client then + MESSAGE:New(self:GetRandomMessage("airScanningToggle", {status}, playerName), 10):ToClient(client) + end + end +end + +function PilotIntuition:MenuSetPlayerGroundScanning(playerUnit, onoff) + env.info("====== PilotIntuition: MenuSetPlayerGroundScanning CALLED ======") + env.info("PilotIntuition: playerUnit = " .. tostring(playerUnit)) + if playerUnit then + env.info("PilotIntuition: playerUnit:GetName() = " .. tostring(playerUnit:GetName())) + end + env.info("PilotIntuition: onoff = " .. tostring(onoff)) + if not playerUnit then + env.info("PilotIntuition: ERROR - No playerUnit provided") + return + end + local playerKey = self:GetPlayerDataKey(playerUnit) + if playerKey and self.players[playerKey] then + self.players[playerKey].enableGroundScanning = onoff + local status = onoff and "enabled" or "disabled" + local client = playerUnit:GetClient() + if client then + MESSAGE:New(self:GetRandomMessage("groundScanningToggle", {status}, playerName), 10):ToClient(client) + end + end +end + +function PilotIntuition:MenuSetPlayerAlertFrequency(playerUnit, mode) + env.info("====== PilotIntuition: MenuSetPlayerAlertFrequency CALLED ======") + env.info("PilotIntuition: playerUnit = " .. tostring(playerUnit)) + if playerUnit then + env.info("PilotIntuition: playerUnit:GetName() = " .. tostring(playerUnit:GetName())) + end + env.info("PilotIntuition: mode = " .. tostring(mode)) + if not playerUnit then + env.info("PilotIntuition: ERROR - No playerUnit provided") + return + end + local playerKey = self:GetPlayerDataKey(playerUnit) + if playerKey and self.players[playerKey] then + local multiplier + if mode == "normal" then + multiplier = 1.0 + elseif mode == "quiet" then + multiplier = 2.0 + elseif mode == "verbose" then + multiplier = 0.5 + else + multiplier = 1.0 -- Default + end + self.players[playerKey].frequencyMultiplier = multiplier + local client = playerUnit:GetClient() + if client then + MESSAGE:New(self:GetRandomMessage("alertFrequencyToggle", {mode}, playerName), 10):ToClient(client) + end + end +end + +function PilotIntuition:MenuSetPlayerDistanceUnit(playerUnit, unit) + env.info("====== PilotIntuition: MenuSetPlayerDistanceUnit CALLED ======") + env.info("PilotIntuition: playerUnit = " .. tostring(playerUnit)) + if playerUnit then + env.info("PilotIntuition: playerUnit:GetName() = " .. tostring(playerUnit:GetName())) + end + env.info("PilotIntuition: unit = " .. tostring(unit)) + if not playerUnit then + env.info("PilotIntuition: ERROR - No playerUnit provided") + return + end + local playerKey = self:GetPlayerDataKey(playerUnit) + if playerKey and self.players[playerKey] then + self.players[playerKey].distanceUnit = unit + local client = playerUnit:GetClient() + if client then + local unitName = unit == "mi" and "Miles (Nautical)" or "Kilometers" + MESSAGE:New(string.format(self:GetText("distanceUnitsSet", playerKey), unitName), 10):ToClient(client) + end + end +end + +function PilotIntuition:MenuSetPlayerLanguage(playerUnit, language) + env.info("====== PilotIntuition: MenuSetPlayerLanguage CALLED ======") + env.info("PilotIntuition: playerUnit = " .. tostring(playerUnit)) + if playerUnit then + env.info("PilotIntuition: playerUnit:GetName() = " .. tostring(playerUnit:GetName())) + end + env.info("PilotIntuition: language = " .. tostring(language)) + if not playerUnit then + env.info("PilotIntuition: ERROR - No playerUnit provided") + return + end + local playerKey = self:GetPlayerDataKey(playerUnit) + if playerKey and self.players[playerKey] then + -- Validate language + if not PILOT_INTUITION_LANGUAGES[language] then + env.info("PilotIntuition: Invalid language: " .. tostring(language)) + return + end + + self.players[playerKey].language = language + + -- Rebuild the menu immediately to apply language change + self:RebuildPlayerMenu(playerUnit) + + local client = playerUnit:GetClient() + if client then + local langNames = { + EN = "English", + DE = "Deutsch", + FR = "Français", + ES = "Español", + RU = "Русский" + } + local msg = string.format("Language set to %s. Menu has been updated.", langNames[language] or language) + MESSAGE:New(msg, 10):ToClient(client) + end + end +end + +function PilotIntuition:MenuScanGroundTargets(playerUnit) + env.info("====== PilotIntuition: MenuScanGroundTargets CALLED ======") + env.info("PilotIntuition: playerUnit = " .. tostring(playerUnit)) + if playerUnit then + env.info("PilotIntuition: playerUnit:GetName() = " .. tostring(playerUnit:GetName())) + end + if not playerUnit or not playerUnit:IsAlive() then + env.info("PilotIntuition: ERROR - No playerUnit provided or unit not alive") + return + end + + local playerPos = playerUnit:GetCoordinate() + if not playerPos then + env.info("PilotIntuition: ERROR - Cannot get player position") + return + end + + local playerKey = self:GetPlayerDataKey(playerUnit) + local playerData = playerKey and self.players[playerKey] + if not playerData then + env.info("PilotIntuition: ERROR - No player data found for " .. tostring(playerKey)) + return + end + + local client = playerUnit:GetClient() + if not client then + env.info("PilotIntuition: ERROR - No client found") + return + end + + -- Collect enemy ground groups within range + local playerCoalition = playerUnit:GetCoalition() + local enemyCoalition = (playerCoalition == coalition.side.BLUE) and coalition.side.RED or coalition.side.BLUE + local allGroups = coalition.getGroups(enemyCoalition) + local enemyGroundGroups = {} + for _, dcsGroup in ipairs(allGroups) do + -- Wrap DCS group object with Moose GROUP + local group = GROUP:Find(dcsGroup) + if group and group:IsAlive() and (dcsGroup:getCategory() == Group.Category.GROUND or dcsGroup:getCategory() == Group.Category.SHIP) then + local groupCoord = group:GetCoordinate() + if groupCoord then + local distance = playerPos:Get2DDistance(groupCoord) + if distance <= PILOT_INTUITION_CONFIG.groundDetectionRange then + table.insert(enemyGroundGroups, {group = group, distance = distance}) + end + end + end + end + + -- Sort by distance + table.sort(enemyGroundGroups, function(a,b) return a.distance < b.distance end) + + -- Take top 5 + local scanned = {} + for i=1, math.min(5, #enemyGroundGroups) do + scanned[i] = enemyGroundGroups[i].group + end + + -- Store in playerData + playerData.scannedGroundTargets = scanned + + -- Send messages listing targets + for i, group in ipairs(scanned) do + local targetPos = group:GetCoordinate() + local bearing = playerPos:HeadingTo(targetPos) -- Returns heading in degrees as number + + -- Ensure bearing is a valid number + if not bearing or type(bearing) ~= "number" then + bearing = 0 -- Fallback to 0 if bearing is invalid + end + + local distanceMeters = playerPos:Get2DDistance(targetPos) + local distance, unit = self:FormatDistance(distanceMeters, playerKey) + local unitType = group:GetUnits()[1]:GetTypeName() + local category = self:ClassifyGroundUnit(unitType) + local groupSize = #group:GetUnits() + local sizeDesc = groupSize == 1 and "single" or (groupSize <= 4 and "group" or "platoon") + MESSAGE:New(string.format("Target %d: %s %s %s, Bearing %.0f, Range %.1f %s", i, category, sizeDesc, unitType, bearing, distance, unit), 30):ToClient(client) + end + + if #scanned == 0 then + MESSAGE:New(self:GetText("noGroundTargets", playerName), 10):ToClient(client) + else + MESSAGE:New(self:GetText("selectTargetFromMenu", playerName), 10):ToClient(client) + end +end + +function PilotIntuition:MenuMarkGroundTarget(playerUnit, index) + env.info("====== PilotIntuition: MenuMarkGroundTarget CALLED ======") + env.info("PilotIntuition: playerUnit = " .. tostring(playerUnit)) + if playerUnit then + env.info("PilotIntuition: playerUnit:GetName() = " .. tostring(playerUnit:GetName())) + end + env.info("PilotIntuition: index = " .. tostring(index)) + if not playerUnit then + env.info("PilotIntuition: ERROR - No playerUnit provided") + return + end + local playerKey = self:GetPlayerDataKey(playerUnit) + local playerData = playerKey and self.players[playerKey] + if not playerData then + env.info("PilotIntuition: ERROR - No player data found for " .. tostring(playerKey)) + return + end + local client = playerUnit:GetClient() + if not client then + env.info("PilotIntuition: ERROR - No client found") + return + end + + local scanned = playerData.scannedGroundTargets or {} + local group = scanned[index] + if not group or not group:IsAlive() then + MESSAGE:New("Target " .. index .. " not available.", 10):ToClient(client) + return + end + + -- Mark this target + self:ReportGroundTarget(group, playerUnit, client, true) -- placeMarker = true + MESSAGE:New("Marked Target " .. index .. ".", 10):ToClient(client) +end + +function PilotIntuition:MenuDropIlluminationAtPlayer(playerUnit) + env.info("====== PilotIntuition: MenuDropIlluminationAtPlayer CALLED ======") + env.info("PilotIntuition: playerUnit = " .. tostring(playerUnit)) + if playerUnit then + env.info("PilotIntuition: playerUnit:GetName() = " .. tostring(playerUnit:GetName())) + end + if not playerUnit or not playerUnit:IsAlive() then + env.info("PilotIntuition: ERROR - No playerUnit or unit not alive") + return + end + + local playerKey = self:GetPlayerDataKey(playerUnit) + env.info("PilotIntuition: playerKey = " .. tostring(playerKey)) + + if not playerKey or not self.players[playerKey] then + env.info("PilotIntuition: ERROR - Player data not found for: " .. tostring(playerKey)) + return + end + + local playerData = self.players[playerKey] + local client = playerUnit:GetClient() + if not client then + env.info("PilotIntuition: ERROR - Could not get client") + return + end + + -- Check if player has flares remaining + if (playerData.illuminationFlares or 0) <= 0 then + MESSAGE:New("No illumination flares remaining. Land at a friendly airbase to rearm.", 10):ToClient(client) + return + end + + -- Check cooldown + local now = timer.getTime() + local timeSinceLast = now - (playerData.lastIlluminationTime or 0) + if timeSinceLast < PILOT_INTUITION_CONFIG.illuminationCooldown then + local remaining = math.ceil(PILOT_INTUITION_CONFIG.illuminationCooldown - timeSinceLast) + MESSAGE:New("Illumination not ready. Wait " .. remaining .. " seconds.", 5):ToClient(client) + return + end + + -- Drop illumination flare at player position with altitude offset + local playerPos = playerUnit:GetCoordinate() + if not playerPos then + env.info("PilotIntuition: ERROR - Could not get player coordinate") + MESSAGE:New("Cannot determine position for illumination drop.", 5):ToClient(client) + return + end + PILog(LOG_INFO, "PilotIntuition: Player position: " .. playerPos:ToStringLLDMS()) + + -- Get altitude from unit directly (more reliable than coordinate) + local currentAlt = playerUnit:GetAltitude() + if not currentAlt or type(currentAlt) ~= "number" then + env.info("PilotIntuition: ERROR - Could not get valid altitude from unit") + MESSAGE:New("Cannot determine altitude for illumination drop.", 5):ToClient(client) + return + end + PILog(LOG_INFO, "PilotIntuition: Current altitude: " .. currentAlt .. "m") + + -- Create new coordinate at higher altitude + local illuAlt = currentAlt + PILOT_INTUITION_CONFIG.illuminationAltitude + local illuPos = COORDINATE:NewFromVec3(playerPos:GetVec3()) + illuPos = illuPos:SetAltitude(illuAlt) + PILog(LOG_INFO, "PilotIntuition: Illumination altitude: " .. illuAlt .. "m") + + -- Try to drop illumination bomb + PILog(LOG_INFO, "PilotIntuition: Attempting to drop illumination bomb") + illuPos:IlluminationBomb() + PILog(LOG_INFO, "PilotIntuition: IlluminationBomb() called successfully") + + -- Decrement flare count + playerData.illuminationFlares = playerData.illuminationFlares - 1 + playerData.lastIlluminationTime = now + + MESSAGE:New("Illumination flare dropped at your position. (" .. playerData.illuminationFlares .. " remaining)", 10):ToClient(client) + PILog(LOG_INFO, "PilotIntuition: Player " .. playerKey .. " dropped illumination at own position. " .. playerData.illuminationFlares .. " flares remaining") + + -- Rebuild menu to update flare count display + self:RebuildPlayerMenu(playerUnit) +end + +function PilotIntuition:MenuDropIlluminationOnTarget(playerUnit, index) + env.info("====== PilotIntuition: MenuDropIlluminationOnTarget CALLED ======") + env.info("PilotIntuition: playerUnit = " .. tostring(playerUnit)) + env.info("PilotIntuition: index = " .. tostring(index)) + if playerUnit then + env.info("PilotIntuition: playerUnit:GetName() = " .. tostring(playerUnit:GetName())) + end + if not playerUnit or not playerUnit:IsAlive() then + env.info("PilotIntuition: ERROR - No playerUnit or unit not alive") + return + end + + local playerKey = self:GetPlayerDataKey(playerUnit) + env.info("PilotIntuition: playerKey = " .. tostring(playerKey)) + + if not playerKey or not self.players[playerKey] then + env.info("PilotIntuition: ERROR - Player data not found for: " .. tostring(playerKey)) + return + end + + local playerData = self.players[playerKey] + local client = playerUnit:GetClient() + if not client then + env.info("PilotIntuition: ERROR - Could not get client") + return + end + + -- Check if player has flares remaining + if (playerData.illuminationFlares or 0) <= 0 then + MESSAGE:New("No illumination flares remaining. Land at a friendly airbase to rearm.", 10):ToClient(client) + return + end + + -- Check cooldown + local now = timer.getTime() + local timeSinceLast = now - (playerData.lastIlluminationTime or 0) + if timeSinceLast < PILOT_INTUITION_CONFIG.illuminationCooldown then + local remaining = math.ceil(PILOT_INTUITION_CONFIG.illuminationCooldown - timeSinceLast) + MESSAGE:New("Illumination not ready. Wait " .. remaining .. " seconds.", 5):ToClient(client) + return + end + + -- Get scanned target + local scanned = playerData.scannedGroundTargets or {} + local group = scanned[index] + if not group or not group:IsAlive() then + MESSAGE:New("Target " .. index .. " not available.", 10):ToClient(client) + return + end + + -- Drop illumination flare over target with altitude offset + local targetPos = group:GetCoordinate() + if not targetPos then + env.info("PilotIntuition: ERROR - Could not get target coordinate") + MESSAGE:New("Cannot determine target position for illumination drop.", 5):ToClient(client) + return + end + PILog(LOG_INFO, "PilotIntuition: Target position: " .. targetPos:ToStringLLDMS()) + + -- Get altitude from ground level (ground units are at ground level) + -- Use a safe default altitude for ground targets + local targetAlt = 0 + local firstUnit = group:GetUnit(1) + if firstUnit and firstUnit:IsAlive() then + local unitAlt = firstUnit:GetAltitude() + if unitAlt and type(unitAlt) == "number" then + targetAlt = unitAlt + end + end + PILog(LOG_INFO, "PilotIntuition: Target altitude: " .. targetAlt .. "m") + + -- Create new coordinate at higher altitude + local illuAlt = targetAlt + PILOT_INTUITION_CONFIG.illuminationAltitude + local illuPos = COORDINATE:NewFromVec3(targetPos:GetVec3()) + illuPos = illuPos:SetAltitude(illuAlt) + PILog(LOG_INFO, "PilotIntuition: Illumination altitude: " .. illuAlt .. "m") + + -- Try to drop illumination bomb + PILog(LOG_INFO, "PilotIntuition: Attempting to drop illumination bomb on target") + illuPos:IlluminationBomb() + PILog(LOG_INFO, "PilotIntuition: IlluminationBomb() called successfully") + + -- Decrement flare count + playerData.illuminationFlares = playerData.illuminationFlares - 1 + playerData.lastIlluminationTime = now + + local playerCoord = playerUnit:GetCoordinate() + if not playerCoord then + PILog(LOG_ERROR, "PilotIntuition: Could not get player coordinate for illumination drop") + MESSAGE:New("Error: Could not determine your position.", 10):ToClient(client) + return + end + + local bearing = playerCoord:GetAngleDegrees(playerCoord:GetDirectionVec3(targetPos)) + local rawDistance = playerCoord:Get2DDistance(targetPos) + local distance, unit = self:FormatDistance(rawDistance, playerKey) + MESSAGE:New(string.format("Illumination flare dropped on Target %d (%.0f°, %.1f%s). (%d remaining)", index, bearing, distance, unit, playerData.illuminationFlares), 10):ToClient(client) + PILog(LOG_INFO, "PilotIntuition: Player " .. playerKey .. " dropped illumination on target " .. index .. ". " .. playerData.illuminationFlares .. " flares remaining") + + -- Rebuild menu to update flare count display + self:RebuildPlayerMenu(playerUnit) +end + +function PilotIntuition:MenuSetActiveMessaging(onoff) + env.info("PilotIntuition: MenuSetActiveMessaging called with " .. tostring(onoff)) + PILOT_INTUITION_CONFIG.activeMessaging = onoff + if onoff then + local msg = self:GetRandomMessage("activeMessagingToggle", {"enabled"}) + env.info("PilotIntuition: Active messaging message: " .. msg) + self:BroadcastMessageToAll(msg) + if self.summaryScheduler then + self.summaryScheduler:Stop() + self.summaryScheduler = nil + end + else + local msg = self:GetRandomMessage("activeMessagingToggle", {"disabled. Use summaries for updates."}) + env.info("PilotIntuition: Active messaging message: " .. msg) + self:BroadcastMessageToAll(msg) + if PILOT_INTUITION_CONFIG.summaryInterval > 0 then + self.summaryScheduler = SCHEDULER:New(nil, self.SendScheduledSummaries, {self}, 1, PILOT_INTUITION_CONFIG.summaryInterval) + end + end +end + +function PilotIntuition:MenuSetAirScanning(onoff) + env.info("PilotIntuition: MenuSetAirScanning called with " .. tostring(onoff)) + PILOT_INTUITION_CONFIG.enableAirScanning = onoff + local status = onoff and "enabled" or "disabled" + local msg = self:GetRandomMessage("airScanningToggle", {status}) + env.info("PilotIntuition: Air scanning message: " .. msg) + self:BroadcastMessageToAll(msg) +end + +function PilotIntuition:MenuSetGroundScanning(onoff) + env.info("PilotIntuition: MenuSetGroundScanning called with " .. tostring(onoff)) + PILOT_INTUITION_CONFIG.enableGroundScanning = onoff + local status = onoff and "enabled" or "disabled" + local msg = self:GetRandomMessage("groundScanningToggle", {status}) + env.info("PilotIntuition: Ground scanning message: " .. msg) + self:BroadcastMessageToAll(msg) +end + +function PilotIntuition:MenuSendPlayerSummary(playerUnit, detailLevel) + self:SendPlayerSummary(playerUnit, detailLevel) +end + +function PilotIntuition:BroadcastMessageToAll(text) + env.info("PilotIntuition: Broadcasting message: " .. tostring(text)) + MESSAGE:New(text, 10):ToAll() -- Added duration 10 seconds + env.info("PilotIntuition: Broadcasted to all with duration 10") +end + +function PilotIntuition:GetPlayerSummary(playerName, detailLevel, playerUnit) + local data = self.players[playerName] + if not data then return nil end + + -- Get player position for bearing calculations + local playerPos = nil + local playerHeading = 0 + if playerUnit and playerUnit:IsAlive() then + playerPos = playerUnit:GetCoordinate() + playerHeading = math.deg(playerUnit:GetHeading()) + end + + -- Collect air threats with details + local airThreats = {} + for id, t in pairs(data.trackedAirTargets or {}) do + if t.unit and t.unit:IsAlive() then + local distance = t.lastRange or 0 + local bearing = 0 + local relativeBearing = 0 + local threat = "UNKNOWN" + + if playerPos then + bearing = playerPos:GetAngleDegrees(playerPos:GetDirectionVec3(t.unit:GetCoordinate())) + relativeBearing = (bearing - playerHeading + 360) % 360 + + -- Determine threat level + if distance < PILOT_INTUITION_CONFIG.threatHotRange then + threat = "HOT" + elseif distance < PILOT_INTUITION_CONFIG.threatColdRange then + threat = "COLD" + else + threat = "FAR" + end + end + + table.insert(airThreats, { + name = t.unit:GetTypeName() or "Unknown", + bearing = bearing, + distance = distance, + altitude = t.unit:GetAltitude() or 0, + threat = threat + }) + end + end + + -- Sort air threats by distance (closest first) + table.sort(airThreats, function(a, b) return a.distance < b.distance end) + + -- Collect ground threats with details + local groundThreats = {} + for id, _ in pairs(data.trackedGroundTargets or {}) do + -- Look up actual ground group from global table + local groundData = self.trackedGroundTargets[id] + if groundData and groundData.group and groundData.group:IsAlive() then + local g = groundData.group + local gPos = g:GetCoordinate() + local distance = 0 + local bearing = 0 + local category = "Ground" + + if playerPos and gPos then + distance = playerPos:Get2DDistance(gPos) + bearing = playerPos:GetAngleDegrees(playerPos:GetDirectionVec3(gPos)) + end + + -- Classify ground unit + local firstUnit = g:GetUnit(1) + if firstUnit then + local unitType = firstUnit:GetTypeName() or "" + category = self:ClassifyGroundUnit(unitType) + end + + table.insert(groundThreats, { + name = g:GetName() or "Unknown", + category = category, + bearing = bearing, + distance = distance + }) + end + end + + -- Sort ground threats by distance + table.sort(groundThreats, function(a, b) return a.distance < b.distance end) + + -- Build summary based on detail level + if detailLevel == "brief" then + -- Brief: Quick tactical overview + local parts = {} + + if #airThreats > 0 then + local closest = airThreats[1] + local distance, unit = self:FormatDistance(closest.distance, playerName) + table.insert(parts, string.format("%d bandit%s (closest: %s @ %.1f%s %s)", + #airThreats, + #airThreats > 1 and "s" or "", + closest.name, + distance, + unit, + closest.threat)) + end + + if #groundThreats > 0 then + table.insert(parts, string.format("%d ground group%s", #groundThreats, #groundThreats > 1 and "s" or "")) + end + + -- Formation status + local wingmen = data.cachedWingmen or 0 + if wingmen > 0 then + local mult = (wingmen > 0) and (2 * wingmen) or 1 + if mult > PILOT_INTUITION_CONFIG.maxMultiplier then mult = PILOT_INTUITION_CONFIG.maxMultiplier end + local envMult = self:GetDetectionMultiplier() + local airRange, airUnit = self:FormatDistance(PILOT_INTUITION_CONFIG.airDetectionRange * mult * envMult, playerName) + local groundRange, groundUnit = self:FormatDistance(PILOT_INTUITION_CONFIG.groundDetectionRange * mult * envMult, playerName) + table.insert(parts, string.format("Formation: %d wingmen (detect: %.0f%s air/%.0f%s gnd)", wingmen, airRange, airUnit, groundRange, groundUnit)) + else + table.insert(parts, "Solo (reduced detection)") + end + + if #parts == 0 then + return nil + end + + return table.concat(parts, " | ") + + else + -- Detailed: Full tactical situation report + local lines = {} + table.insert(lines, "=== TACTICAL SITREP ===") + + -- Air threats section + if #airThreats > 0 then + table.insert(lines, "\nAIR THREATS:") + for i, threat in ipairs(airThreats) do + local angels = math.floor(threat.altitude * 3.28084 / 1000) -- Convert to thousands of feet + local distance, unit = self:FormatDistance(threat.distance, playerName) + table.insert(lines, string.format(" %d. %s @ %03d°, %.1f%s, angels %d (%s)", + i, threat.name, math.floor(threat.bearing), distance, unit, angels, threat.threat)) + end + else + table.insert(lines, "\nAIR THREATS: None") + end + + -- Ground threats section + if #groundThreats > 0 then + table.insert(lines, "\nGROUND THREATS:") + for i, threat in ipairs(groundThreats) do + local distance, unit = self:FormatDistance(threat.distance, playerName) + table.insert(lines, string.format(" %d. %s @ %03d°, %.1f%s", + i, threat.category, math.floor(threat.bearing), distance, unit)) + end + else + table.insert(lines, "\nGROUND THREATS: None") + end + + -- Formation and detection status + local wingmen = data.cachedWingmen or 0 + local mult = (wingmen > 0) and (2 * wingmen) or 1 + if mult > PILOT_INTUITION_CONFIG.maxMultiplier then mult = PILOT_INTUITION_CONFIG.maxMultiplier end + local envMult = self:GetDetectionMultiplier() + local airRange, airUnit = self:FormatDistance(PILOT_INTUITION_CONFIG.airDetectionRange * mult * envMult, playerName) + local groundRange, groundUnit = self:FormatDistance(PILOT_INTUITION_CONFIG.groundDetectionRange * mult * envMult, playerName) + + table.insert(lines, "\nFORMATION:") + if wingmen > 0 then + table.insert(lines, string.format(" Wingmen: %d (multiplier: x%d)", wingmen, mult)) + else + table.insert(lines, " Status: Solo flight") + end + table.insert(lines, string.format(" Detection: %.0f%s air, %.0f%s ground", airRange, airUnit, groundRange, groundUnit)) + + return table.concat(lines, "\n") + end +end + +function PilotIntuition:SendPlayerSummary(playerUnit, detailLevel) + env.info("PilotIntuition: SendPlayerSummary called with detailLevel: " .. tostring(detailLevel)) + if not playerUnit then + env.info("PilotIntuition: No playerUnit provided") + return + end + local playerKey = self:GetPlayerDataKey(playerUnit) + env.info("PilotIntuition: Player key from unit: " .. tostring(playerKey)) + local client = playerUnit:GetClient() + if not client then + env.info("PilotIntuition: Could not get client for player") + return + end + if not playerKey or not self.players[playerKey] then + env.info("PilotIntuition: Player data not found for: " .. tostring(playerKey)) + env.info("PilotIntuition: Available players: " .. table.concat(self:GetPlayerKeys(), ", ")) + return + end + local now = timer.getTime() + local data = self.players[playerKey] + if data.lastSummaryTime and (now - data.lastSummaryTime) < (PILOT_INTUITION_CONFIG.summaryCooldown or 2) then + MESSAGE:New(self:GetRandomMessage("summaryCooldown"), 5):ToClient(client) + return + end + local summary = self:GetPlayerSummary(playerKey, detailLevel, playerUnit) + env.info("PilotIntuition: Summary generated: " .. tostring(summary)) + if summary and summary ~= "" then + -- Use longer duration for detailed reports + local duration = (detailLevel == "detailed") and 30 or 15 + MESSAGE:New(summary, duration):ToClient(client) + data.lastSummaryTime = now + else + MESSAGE:New(self:GetRandomMessage("noThreats"), 10):ToClient(client) + end +end + +function PilotIntuition:GetPlayerKeys() + local keys = {} + for k, _ in pairs(self.players) do + table.insert(keys, k) + end + return keys +end + +function PilotIntuition:SendScheduledSummaries() + if not PILOT_INTUITION_CONFIG.activeMessaging then + local clients = SET_CLIENT:New():FilterActive():FilterOnce() + clients:ForEachClient(function(client) + if client and type(client.GetUnit) == "function" then + local unit = client:GetUnit() + if unit and unit:IsAlive() then + self:SendPlayerSummary(unit, "brief") + end + end + end) + end +end + +function PilotIntuition:StartScheduler() + -- Schedule periodic scans + SCHEDULER:New(nil, self.ScanTargets, {self}, 1, PILOT_INTUITION_CONFIG.scanInterval) +end + +-- (old ScanTargets removed; using the optimized ScanTargets above) + +function PilotIntuition:ScanAirTargetsForPlayer(playerUnit, playerData, client, activeClients, enemyAirUnits) + local playerKey = self:GetPlayerDataKey(playerUnit) + local playerPos = playerUnit:GetCoordinate() + local playerCoalition = playerUnit:GetCoalition() + local enemyCoalition = (playerCoalition == coalition.side.BLUE) and coalition.side.RED or coalition.side.BLUE + + -- Use cached wingmen count + local wingmen = playerData.cachedWingmen + local multiplier = (wingmen > 0) and (2 * wingmen) or 1 + -- Clamp multiplier to configured maximum + if multiplier > PILOT_INTUITION_CONFIG.maxMultiplier then + multiplier = PILOT_INTUITION_CONFIG.maxMultiplier + end + local envMult = self:GetDetectionMultiplier() + local detectionRange = PILOT_INTUITION_CONFIG.airDetectionRange * multiplier * envMult + + PILog(LOG_DEBUG, string.format("PilotIntuition: Scanning %d enemy air units within %.0fm for player %s", + #enemyAirUnits, detectionRange, playerKey)) + + -- Notify formation changes (suppress during active combat if configured) + local previousWingmen = playerData.previousWingmen or 0 + local now = timer.getTime() + PILog(LOG_DEBUG, "PilotIntuition: Formation check - previous: " .. previousWingmen .. ", current: " .. wingmen .. ", cached: " .. playerData.cachedWingmen) + + -- Check if player is in active combat (has engaged bandits within hot range recently) + local inCombat = false + if PILOT_INTUITION_CONFIG.suppressFormationInCombat then + for _, data in pairs(playerData.trackedAirTargets) do + if data.engaged and (now - (data.lastEngagedTime or 0)) < 30 then + inCombat = true + break + end + end + end + + if not inCombat and (now - playerData.lastFormationMessageTime) >= PILOT_INTUITION_CONFIG.formationMessageCooldown then + local newWingmen = playerData.cachedWingmen + local newMultiplier = (newWingmen > 0) and (2 * newWingmen) or 1 + -- Clamp multiplier to configured maximum + if newMultiplier > PILOT_INTUITION_CONFIG.maxMultiplier then + newMultiplier = PILOT_INTUITION_CONFIG.maxMultiplier + end + local newAirRangeMeters = PILOT_INTUITION_CONFIG.airDetectionRange * newMultiplier * envMult + local newGroundRangeMeters = PILOT_INTUITION_CONFIG.groundDetectionRange * newMultiplier * envMult + + -- Convert to player's preferred units + local newAirRange, airUnit = self:FormatDistance(newAirRangeMeters, playerKey) + local newGroundRange, groundUnit = self:FormatDistance(newGroundRangeMeters, playerKey) + + PILog(LOG_DEBUG, "PilotIntuition: Formation change check - new: " .. newWingmen .. ", prev: " .. previousWingmen .. ", activeMessaging: " .. tostring(PILOT_INTUITION_CONFIG.activeMessaging)) + + if newWingmen > previousWingmen then + PILog(LOG_INFO, "PilotIntuition: Formation joined - sending message") + if PILOT_INTUITION_CONFIG.activeMessaging then + MESSAGE:New(self:GetRandomMessage("formationJoin", {"wingman", newAirRange, airUnit, newGroundRange, groundUnit}), 10):ToClient(client) + end + playerData.lastFormationMessageTime = now + elseif newWingmen < previousWingmen then + PILog(LOG_INFO, "PilotIntuition: Formation left - sending message") + if PILOT_INTUITION_CONFIG.activeMessaging then + MESSAGE:New(self:GetRandomMessage("formationLeave", {"wingman", newAirRange, airUnit, newGroundRange, groundUnit}), 10):ToClient(client) + end + playerData.lastFormationMessageTime = now + end + else + if inCombat then + PILog(LOG_DEBUG, "PilotIntuition: Formation change suppressed - player in combat") + else + PILog(LOG_DEBUG, "PilotIntuition: Formation change message on cooldown") + end + end + playerData.previousWingmen = playerData.cachedWingmen + + -- Formation integrity warning (only if previously had wingmen) + if previousWingmen >= PILOT_INTUITION_CONFIG.minFormationWingmen and wingmen < PILOT_INTUITION_CONFIG.minFormationWingmen then + if not playerData.formationWarned and (now - playerData.lastFormationMessageTime) >= PILOT_INTUITION_CONFIG.formationMessageCooldown then + if PILOT_INTUITION_CONFIG.activeMessaging then + MESSAGE:New(self:GetRandomMessage("formationIntegrityLow"), 10):ToClient(client) + end + playerData.formationWarned = true + playerData.lastFormationMessageTime = now + end + elseif wingmen >= PILOT_INTUITION_CONFIG.minFormationWingmen then + playerData.formationWarned = false + end + + -- Prune dead or out-of-range air targets + for id, data in pairs(playerData.trackedAirTargets) do + if not data.unit:IsAlive() or playerPos:Get2DDistance(data.unit:GetCoordinate()) > detectionRange then + -- Explicitly nil out sub-fields before removing to help GC + data.unit = nil + data.banditName = nil + playerData.trackedAirTargets[id] = nil + end + end + + local banditCount = 0 + local closestUnit = nil + local minDistance = math.huge + -- Reuse existing threateningBandits table to reduce GC pressure + local threateningBandits = playerData.threateningBandits or {} + -- Clear the table (faster than creating new one) + for i = #threateningBandits, 1, -1 do + threateningBandits[i] = nil + end + + for _, unit in ipairs(enemyAirUnits) do + PILog(LOG_DEBUG, string.format("PilotIntuition: Checking enemy unit: %s, IsAlive: %s", + unit and unit:GetName() or "nil", tostring(unit and unit:IsAlive()))) + if unit and unit:IsAlive() then + local unitCoord = unit:GetCoordinate() + if not unitCoord then + PILog(LOG_DEBUG, "PilotIntuition: Could not get coordinate for " .. unit:GetName()) + else + local distance = playerPos:Get2DDistance(unitCoord) + PILog(LOG_DEBUG, string.format("PilotIntuition: Unit %s distance: %.0fm (range: %.0fm)", + unit:GetName(), distance, detectionRange)) + + -- Check if within detection range AND has line of sight + if distance <= detectionRange then + -- Use coordinate-based LOS check from player to enemy + local hasLOS = playerPos:IsLOS(unitCoord) + PILog(LOG_DEBUG, string.format("PilotIntuition: Unit %s in range, LOS check: %s", + unit:GetName(), tostring(hasLOS))) + + if hasLOS then + banditCount = banditCount + 1 + PILog(LOG_DEBUG, string.format("PilotIntuition: Enemy detected with LOS: %s at %.0fm", unit:GetName(), distance)) + if distance < minDistance then + minDistance = distance + closestUnit = unit + end + + local targetID = unit:GetName() + local now = timer.getTime() + + -- Calculate bearing from player to bandit + local bearing = playerPos:HeadingTo(unitCoord) + local playerHeading = playerUnit:GetHeading() -- Already in degrees + + -- Calculate relative bearing (clock position) + local relativeBearing = (bearing - playerHeading + 360) % 360 + + -- Calculate bandit's aspect angle (is he nose-on or tail-on to us?) + local banditHeading = unit:GetHeading() -- Already in degrees + local banditToBearing = (bearing + 180) % 360 -- Reverse bearing (from bandit to player) + local aspectAngle = math.abs(banditToBearing - banditHeading) + if aspectAngle > 180 then aspectAngle = 360 - aspectAngle end -- Normalize to 0-180 + + -- Debug logging for first contact + if distance < 20000 and not playerData.trackedAirTargets[targetID] then + PILog(LOG_DEBUG, string.format("PilotIntuition: Initial contact %s - playerHdg:%.0f° bearing:%.0f° relBrg:%.0f° banditHdg:%.0f° aspect:%.0f°", + targetID, playerHeading, bearing, relativeBearing, banditHeading, aspectAngle)) + end + + if not playerData.trackedAirTargets[targetID] then + local banditName = unit:GetPlayerName() or unit:GetName() + playerData.trackedAirTargets[targetID] = { unit = unit, engaged = false, lastRange = distance, lastTime = now, wasHot = false, lastRelativeBearing = relativeBearing, lastEngagedTime = 0, banditName = banditName } + + -- Safety: Limit tracked targets to prevent memory bloat in long missions (keep 50 most recent) + local trackedCount = 0 + for _ in pairs(playerData.trackedAirTargets) do trackedCount = trackedCount + 1 end + if trackedCount > 50 then + -- Remove oldest non-engaged target + local oldestID, oldestTime = nil, math.huge + for tid, tdata in pairs(playerData.trackedAirTargets) do + if not tdata.engaged and tdata.lastTime < oldestTime then + oldestTime = tdata.lastTime + oldestID = tid + end + end + if oldestID then + playerData.trackedAirTargets[oldestID].unit = nil + playerData.trackedAirTargets[oldestID].banditName = nil + playerData.trackedAirTargets[oldestID] = nil + end + end + else + playerData.trackedAirTargets[targetID].lastRange = playerData.trackedAirTargets[targetID].lastRange or distance + playerData.trackedAirTargets[targetID].lastTime = playerData.trackedAirTargets[targetID].lastTime or now + playerData.trackedAirTargets[targetID].lastRelativeBearing = playerData.trackedAirTargets[targetID].lastRelativeBearing or relativeBearing + end + local data = playerData.trackedAirTargets[targetID] + local closing = distance < data.lastRange + local wasHot = data.wasHot + if distance <= PILOT_INTUITION_CONFIG.threatHotRange then + data.wasHot = true + end + data.lastRange = distance + data.lastTime = now + local lastRelativeBearing = data.lastRelativeBearing + data.lastRelativeBearing = relativeBearing + + -- Reset engaged status after 2 minutes of no engagement or if bandit is out of range + if data.engaged and ((now - data.lastEngagedTime) > 120 or distance > PILOT_INTUITION_CONFIG.airDetectionRange) then + data.engaged = false + -- Only report "dogfight concluded" if the bandit was actually hot at some point (actual engagement) + if data.wasHot and (now - playerData.lastConclusionTime) >= (PILOT_INTUITION_CONFIG.messageCooldown * playerData.frequencyMultiplier) then + if PILOT_INTUITION_CONFIG.activeMessaging then + local banditName = data.banditName or "bandit" + local msg = string.format("%s escaped!", banditName) + MESSAGE:New(msg, 10):ToClient(client) + end + playerData.lastConclusionTime = now + end + end + + if not data.engaged then + -- Calculate altitude information + local playerAlt = playerUnit:GetAltitude() + local banditAlt = unit:GetAltitude() + local altDelta = banditAlt - playerAlt + + -- Check for dogfight situations + local onTail = relativeBearing > 150 and relativeBearing < 210 + local headOn = relativeBearing < 30 or relativeBearing > 330 + local beam = (relativeBearing > 60 and relativeBearing < 120) or (relativeBearing > 240 and relativeBearing < 300) + local overshoot = distance < PILOT_INTUITION_CONFIG.mergeRange and lastRelativeBearing < 90 and relativeBearing > 270 and not closing + + -- High/Low merge detection + local highMerge = distance < PILOT_INTUITION_CONFIG.mergeRange and closing and altDelta > PILOT_INTUITION_CONFIG.highMergeAltitude + local lowMerge = distance < PILOT_INTUITION_CONFIG.mergeRange and closing and altDelta < -PILOT_INTUITION_CONFIG.lowMergeAltitude + local coAltMerge = distance < PILOT_INTUITION_CONFIG.mergeRange and closing and math.abs(altDelta) < 200 + + -- Separation after being hot + local separating = wasHot and distance > PILOT_INTUITION_CONFIG.separatingRange and not closing + + -- Build threat descriptor for ALL detected bandits + local threatType = nil + local threatDetail = nil + + -- Determine threat level based on aspect angle AND distance + -- Hot = nose-on (0-45°), Cold = tail aspect (135-180°), Flanking/Beam = side aspect + local threatLevel = "distant" + if distance <= PILOT_INTUITION_CONFIG.threatHotRange then + threatLevel = "hot" + elseif distance <= PILOT_INTUITION_CONFIG.threatColdRange then + -- Use aspect angle to determine if truly hot or cold + if aspectAngle <= 45 then + threatLevel = "hot" -- Nose-on, coming at us + elseif aspectAngle >= 135 then + threatLevel = "cold" -- Tail aspect, running away + else + threatLevel = "flanking" -- Side aspect + end + else + threatLevel = "distant" + end + + -- Check for specific tactical situations (high priority) + if highMerge then + threatType = "high merge" + threatDetail = string.format("%.0fm above", altDelta) + elseif lowMerge then + threatType = "low merge" + threatDetail = string.format("%.0fm below", math.abs(altDelta)) + elseif coAltMerge then + threatType = "co-alt merge" + elseif onTail and distance < PILOT_INTUITION_CONFIG.tailWarningRange then + if altDelta > 200 then + threatType = "tail high" + elseif altDelta < -200 then + threatType = "tail low" + else + threatType = "tail" + end + elseif headOn and distance < PILOT_INTUITION_CONFIG.headOnRange then + threatType = "head-on" + if math.abs(altDelta) > 200 then + threatDetail = string.format("alt %.0f", altDelta) + end + elseif beam and distance < PILOT_INTUITION_CONFIG.beamRange then + threatType = "beam" + local side = (relativeBearing > 180) and "left" or "right" + threatDetail = side + elseif separating then + threatType = "separating" + elseif overshoot then + threatType = "overshot" + else + -- Generic aspect-based description for distant contacts + local clockPos = math.floor((relativeBearing + 15) / 30) + 1 + if clockPos > 12 then clockPos = clockPos - 12 end + threatType = threatLevel + local distValue, distUnit = self:FormatDistance(distance, playerKey) + threatDetail = string.format("%d o'clock, %.1f%s", clockPos, distValue, distUnit) + if closing then + threatDetail = threatDetail .. ", closing" + end + end + + -- Add ALL detected bandits to the list for multi-bandit reporting + local banditName = unit:GetPlayerName() or unit:GetName() + table.insert(threateningBandits, { + unit = unit, + distance = distance, + threatType = threatType, + threatDetail = threatDetail, + relativeBearing = relativeBearing, + threatLevel = threatLevel, + banditName = banditName + }) + end + + -- Dogfight assist features (if enabled) + if playerData.dogfightAssist and data.engaged then + -- Calculate effective cooldown based on combat intensity + local baseCooldown = PILOT_INTUITION_CONFIG.dogfightMessageCooldown + local effectiveCooldown = baseCooldown + + -- If in high-intensity combat (many bandits), increase cooldown to reduce spam + local engagedBandits = 0 + for _, targetData in pairs(playerData.trackedAirTargets) do + if targetData.engaged then + engagedBandits = engagedBandits + 1 + end + end + + if engagedBandits >= PILOT_INTUITION_CONFIG.combatIntensityThreshold then + effectiveCooldown = baseCooldown * PILOT_INTUITION_CONFIG.combatIntensityCooldownMultiplier + PILog(LOG_DEBUG, string.format("PilotIntuition: High-intensity combat (%d bandits) - dogfight cooldown increased to %.1fs", engagedBandits, effectiveCooldown)) + end + + self:ProvideDogfightAssist(playerUnit, unit, distance, relativeBearing, lastRelativeBearing, playerData, client, closing, effectiveCooldown) + end + end -- End if hasLOS + else + PILog(LOG_TRACE, string.format("PilotIntuition: Unit %s out of range: %.0fm > %.0fm", + unit:GetName(), distance, detectionRange)) + end -- End if distance <= detectionRange + end -- End if unitCoord + end -- End if unit and unit:IsAlive() + end -- End for _, unit in ipairs(enemyAirUnits) + + -- Report multiple bandits situation with tactical picture + PILog(LOG_DEBUG, string.format("PilotIntuition: Threatening bandits count: %d", #threateningBandits)) + + -- COMBAT FOCUS: Filter out distant threats when in close combat + local inCloseCombat = false + local combatFocusRange = PILOT_INTUITION_CONFIG.threatHotRange * 2 -- 2km threshold for "close combat" + for _, threat in ipairs(threateningBandits) do + if threat.distance <= combatFocusRange and threat.threatLevel == "hot" then + inCloseCombat = true + break + end + end + + -- If in close combat, filter to only show immediate threats + local filteredThreats = threateningBandits + if inCloseCombat then + filteredThreats = {} + for _, threat in ipairs(threateningBandits) do + -- Only report threats within combat focus range OR threats that are hot/flanking + if threat.distance <= combatFocusRange or threat.threatLevel == "hot" or threat.threatLevel == "flanking" then + table.insert(filteredThreats, threat) + end + end + PILog(LOG_DEBUG, string.format("PilotIntuition: COMBAT FOCUS - Filtered %d distant threats, showing %d immediate threats", + #threateningBandits - #filteredThreats, #filteredThreats)) + end + + if #filteredThreats > 0 then + for i, threat in ipairs(filteredThreats) do + PILog(LOG_DEBUG, string.format(" Threat %d: %s at %.0fm, type: %s", i, threat.unit:GetName(), threat.distance, threat.threatType)) + end + local now = timer.getTime() + if (now - playerData.lastDogfightTime) >= (PILOT_INTUITION_CONFIG.messageCooldown * playerData.frequencyMultiplier) then + local message = "" + if #filteredThreats == 1 then + -- Single bandit - detailed callout + local threat = filteredThreats[1] + local banditName = threat.banditName or "bandit" + if threat.threatDetail then + message = string.format("%s - %s! %s", banditName, threat.threatType:gsub("^%l", string.upper), threat.threatDetail) + else + message = string.format("%s - %s!", banditName, threat.threatType:gsub("^%l", string.upper)) + end + else + -- Multiple bandits - build tactical picture, showing only most threatening + -- Sort by threat priority: hot > flanking > cold > distant, then by distance + table.sort(filteredThreats, function(a, b) + local priorityOrder = {hot = 1, flanking = 2, cold = 3, distant = 4} + local aPriority = priorityOrder[a.threatLevel] or 5 + local bPriority = priorityOrder[b.threatLevel] or 5 + if aPriority ~= bPriority then + return aPriority < bPriority + else + return a.distance < b.distance + end + end) + + local maxDisplay = PILOT_INTUITION_CONFIG.maxThreatDisplay + local displayCount = math.min(maxDisplay, #filteredThreats) + local totalCount = #filteredThreats + + message = string.format("Multiple bandits - %d contacts", totalCount) + if displayCount < totalCount then + message = message .. string.format(" (showing %d most threatening)", displayCount) + end + message = message .. ": " + + local threats = {} + for i = 1, displayCount do + local threat = filteredThreats[i] + local banditName = threat.banditName or "unknown" + local desc = banditName .. " - " .. threat.threatType + if threat.threatDetail then + desc = desc .. " (" .. threat.threatDetail .. ")" + end + table.insert(threats, desc) + end + message = message .. table.concat(threats, ", ") + end + + if PILOT_INTUITION_CONFIG.activeMessaging then + MESSAGE:New(message, 10):ToClient(client) + end + playerData.lastDogfightTime = now + + -- Mark only HOT bandits as engaged (within hot range or actively threatening) + for _, threat in ipairs(threateningBandits) do + local data = playerData.trackedAirTargets[threat.unit:GetName()] + if data and threat.threatLevel == "hot" then + data.engaged = true + data.lastEngagedTime = now + end + end + end + end + + -- Report the closest unengaged bandit (if no threats) + if #threateningBandits == 0 and closestUnit then + local data = playerData.trackedAirTargets[closestUnit:GetName()] + if data and not data.engaged then + local playerKey = self:GetPlayerDataKey(playerUnit) + self:ReportAirTarget(closestUnit, playerPos, playerData, client, playerKey) + end + end + + -- Check for multiple bandits (with 5-minute cooldown to reduce spam) + if banditCount > 1 then + local now = timer.getTime() + if (now - (playerData.lastMultipleBanditsWarningTime or 0)) >= PILOT_INTUITION_CONFIG.multipleBanditsWarningCooldown then + self:ReportDogfight(nil, playerPos, playerData, client, "Multiple bandits in vicinity!") + playerData.lastMultipleBanditsWarningTime = now + end + end +end + +function PilotIntuition:ReportAirTarget(unit, playerPos, playerData, client, playerKey) + local now = timer.getTime() + if now - playerData.lastMessageTime < (PILOT_INTUITION_CONFIG.messageCooldown * playerData.frequencyMultiplier) then return end + if not PILOT_INTUITION_CONFIG.activeMessaging then return end + + local unitCoord = unit:GetCoordinate() + if not unitCoord then + PILog(LOG_DEBUG, "PilotIntuition: Could not get unit coordinate for air target report") + return + end + + local bearing = playerPos:GetAngleDegrees(playerPos:GetDirectionVec3(unitCoord)) + local rangeMeters = playerPos:Get2DDistance(unitCoord) + local range, distUnit = self:FormatDistance(rangeMeters, playerKey) + -- Convert altitude to angels (thousands of feet) + local altMeters = unit:GetAltitude() + local altFeet = altMeters * 3.28084 + local angels = math.floor(altFeet / 1000) + local threat = "cold" + if rangeMeters <= PILOT_INTUITION_CONFIG.threatHotRange then + threat = "hot" + end + + local group = unit:GetGroup() + if not group then + PILog(LOG_DEBUG, "PilotIntuition: Could not get group for air target") + return + end + local groupSize = #group:GetUnits() + local sizeDesc = groupSize == 1 and "single" or (groupSize == 2 and "pair" or "flight of " .. groupSize) + + MESSAGE:New(self:GetRandomMessage("airTargetDetected", {threat, bearing, range, distUnit, angels, sizeDesc}), 10):ToClient(client) + playerData.lastMessageTime = now +end + +function PilotIntuition:ReportDogfight(unit, playerPos, playerData, client, message) + local now = timer.getTime() + if now - playerData.lastMessageTime < (PILOT_INTUITION_CONFIG.messageCooldown * playerData.frequencyMultiplier) then return end + if not PILOT_INTUITION_CONFIG.activeMessaging then return end + + MESSAGE:New(message, 10):ToClient(client) + playerData.lastMessageTime = now +end + +function PilotIntuition:ScanGroundTargetsForPlayer(playerUnit, client, activeClients, enemyGroundGroups, placeMarker) + if placeMarker == nil then placeMarker = true end + local playerPos = playerUnit:GetCoordinate() + local playerCoalition = playerUnit:GetCoalition() + local enemyCoalition = (playerCoalition == coalition.side.BLUE) and coalition.side.RED or coalition.side.BLUE + local unitName = playerUnit:GetName() + local playerData = self.players[unitName] + if not playerData then return end + + -- Use cached wingmen count + local wingmen = playerData.cachedWingmen + local multiplier = (wingmen > 0) and (2 * wingmen) or 1 + if multiplier > PILOT_INTUITION_CONFIG.maxMultiplier then + multiplier = PILOT_INTUITION_CONFIG.maxMultiplier + end + local envMult = self:GetDetectionMultiplier() + local detectionRange = PILOT_INTUITION_CONFIG.groundDetectionRange * multiplier * envMult + + -- Prune out-of-range ground targets for this player + for id, _ in pairs(playerData.trackedGroundTargets) do + local group = self.trackedGroundTargets[id] + if not group or not group.group:IsAlive() or playerPos:Get2DDistance(group.group:GetCoordinate()) > detectionRange then + playerData.trackedGroundTargets[id] = nil + end + end + + -- Find the closest unmarked target for this player (no sorting needed) + local closestGroup = nil + local minDistance = math.huge + for _, group in ipairs(enemyGroundGroups or {}) do + local distance = playerPos:Get2DDistance(group:GetCoordinate()) + if distance <= detectionRange then + local targetID = group:GetName() + if not self.trackedGroundTargets[targetID] then + self.trackedGroundTargets[targetID] = { group = group, marked = false } + end + if not playerData.trackedGroundTargets[targetID] and distance < minDistance then + closestGroup = group + minDistance = distance + end + end + end + + -- Mark and report the closest unmarked target + if closestGroup then + local targetID = closestGroup:GetName() + self:ReportGroundTarget(closestGroup, playerUnit, client, placeMarker) + self.trackedGroundTargets[targetID].marked = true + playerData.trackedGroundTargets[targetID] = true + end +end + +function PilotIntuition:CheckCloseFlyingForPlayer(playerUnit, playerData, client, activeClients) + if not PILOT_INTUITION_CONFIG.enableCloseFlyingCompliments then return end + local playerPos = playerUnit:GetCoordinate() + local playerCoalition = playerUnit:GetCoalition() + local now = timer.getTime() + local playerHeading = math.deg(playerUnit:GetHeading()) + + for _, info in ipairs(activeClients) do + local otherUnit = info.unit + if otherUnit and otherUnit:IsAlive() and otherUnit:GetCoalition() == playerCoalition and otherUnit:GetName() ~= playerUnit:GetName() then + local otherCoord = otherUnit:GetCoordinate() + if otherCoord then + local distance = playerPos:Get2DDistance(otherCoord) + if distance <= PILOT_INTUITION_CONFIG.complimentRange then + -- Calculate relative bearing + local bearing = playerPos:GetAngleDegrees(playerPos:GetDirectionVec3(otherCoord)) + local relativeBearing = bearing - playerHeading + relativeBearing = (relativeBearing % 360 + 360) % 360 -- Normalize to 0-360 + + -- Check if head-on (within 30 degrees of front or back, but for pass, focus on front) + local isHeadOn = relativeBearing < 30 or relativeBearing > 330 + + if isHeadOn and distance <= PILOT_INTUITION_CONFIG.headOnWarningRange then + if now - playerData.lastHeadOnWarningTime >= (PILOT_INTUITION_CONFIG.closeFlyingMessageCooldown * playerData.frequencyMultiplier) then + MESSAGE:New(self:GetRandomMessage("headOnWarning"), 10):ToClient(client) + playerData.lastHeadOnWarningTime = now + end + elseif not isHeadOn then + if now - playerData.lastComplimentTime >= (PILOT_INTUITION_CONFIG.closeFlyingMessageCooldown * playerData.frequencyMultiplier) then + MESSAGE:New(self:GetRandomMessage("closeFlyingCompliment"), 10):ToClient(client) + playerData.lastComplimentTime = now + end + end + end + end + end + end +end + +function PilotIntuition:ReportGroundTarget(group, playerUnit, client, placeMarker) + if placeMarker == nil then placeMarker = true end + local now = timer.getTime() + if now - self.lastMessageTime < PILOT_INTUITION_CONFIG.messageCooldown then return end + if not PILOT_INTUITION_CONFIG.activeMessaging then return end + local playerPos = playerUnit:GetCoordinate() + local targetPos = group:GetCoordinate() + local bearing = playerPos:HeadingTo(targetPos) -- Returns heading in degrees as number + + -- Ensure bearing is a valid number + if not bearing or type(bearing) ~= "number" then + bearing = 0 -- Fallback to 0 if bearing is invalid + end + + local distanceMeters = playerPos:Get2DDistance(targetPos) + local playerKey = self:GetPlayerDataKey(playerUnit) + local distance, unit = self:FormatDistance(distanceMeters, playerKey) + local unitType = group:GetUnits()[1]:GetTypeName() + local category = self:ClassifyGroundUnit(unitType) + local groupSize = #group:GetUnits() + local sizeDesc = groupSize == 1 and "single" or (groupSize <= 4 and "group" or "platoon") + + MESSAGE:New(self:GetRandomMessage("groundTargetDetected", {category, sizeDesc, unitType, bearing, distance, unit}), 10):ToClient(client) + self.lastMessageTime = now + + -- Place marker if requested + if placeMarker then + -- Determine marker type: prefer player preference if set, otherwise global config + local markerType = PILOT_INTUITION_CONFIG.markerType + local playerName = playerUnit:GetPlayerName() or playerUnit:GetName() + if self.players[playerName] and self.players[playerName].markerType then + markerType = self.players[playerName].markerType + end + if markerType ~= "none" then + local coord = group:GetCoordinate() + local markerTypePart, color = markerType:match("(%w+)_(%w+)") + if markerTypePart == "smoke" then + if color == "red" then coord:SmokeRed() + elseif color == "green" then coord:SmokeGreen() + elseif color == "blue" then coord:SmokeBlue() + elseif color == "white" then coord:SmokeWhite() + end + elseif markerTypePart == "flare" then + if color == "red" then coord:FlareRed() + elseif color == "green" then coord:FlareGreen() + elseif color == "white" then coord:FlareWhite() + end + end + -- Note: Markers are temporary; Moose doesn't have built-in timed markers, so this is basic + end + end +end + +function PilotIntuition:GetDetectionMultiplier() + -- Basic night detection: reduce range at night (22:00 to 06:00) + local time = timer.getAbsTime() % 86400 + local hour = math.floor(time / 3600) + local isNight = hour >= 22 or hour < 6 + local mult = 1 + if isNight then + mult = mult * PILOT_INTUITION_CONFIG.nightDetectionMultiplier + end + -- TODO: Add weather check if available + return mult +end + +function PilotIntuition:ClassifyGroundUnit(unitType) + unitType = string.lower(unitType) + if string.find(unitType, "tank") or string.find(unitType, "armor") or string.find(unitType, "panzer") then + return "Armor" + elseif string.find(unitType, "infantry") or string.find(unitType, "soldier") then + return "Infantry" + elseif string.find(unitType, "aaa") or string.find(unitType, "flak") or string.find(unitType, "aa") then + return "Anti-Air" + elseif string.find(unitType, "truck") or string.find(unitType, "vehicle") or string.find(unitType, "transport") then + return "Logistics" + else + return "Ground" + end +end + +function PilotIntuition:ProvideDogfightAssist(playerUnit, banditUnit, distance, relativeBearing, lastRelativeBearing, playerData, client, closing, effectiveCooldown) + local now = timer.getTime() + -- Use provided effectiveCooldown (for combat intensity adjustment) or fall back to default + local cooldown = effectiveCooldown or PILOT_INTUITION_CONFIG.dogfightMessageCooldown + if (now - playerData.lastDogfightAssistTime) < (cooldown * playerData.frequencyMultiplier) then + return + end + if not PILOT_INTUITION_CONFIG.activeMessaging then return end + + local playerPos = playerUnit:GetCoordinate() + local banditPos = banditUnit:GetCoordinate() + local playerAlt = playerUnit:GetAltitude() + local banditAlt = banditUnit:GetAltitude() + local altDelta = banditAlt - playerAlt + + -- Check for speed warning + local velocity = playerUnit:GetVelocityKMH() + local speedKnots = velocity * 0.539957 + if speedKnots < PILOT_INTUITION_CONFIG.criticalSpeedThreshold then + MESSAGE:New("Speed critical! Extend!", 10):ToClient(client) + playerData.lastDogfightAssistTime = now + return + end + + -- Target loss detection (front to rear hemisphere) + if lastRelativeBearing and lastRelativeBearing < 90 and relativeBearing > 270 then + MESSAGE:New("Lost visual! Bandit reversing on you!", 10):ToClient(client) + playerData.lastDogfightAssistTime = now + return + end + + -- Check for bandit moving behind (now behind, wasn't before) + if relativeBearing > 150 and relativeBearing < 210 and distance < PILOT_INTUITION_CONFIG.tailWarningRange then + local direction = relativeBearing < 180 and "left" or "right" + MESSAGE:New("Bandit at 6 o'clock! Break " .. direction .. "!", 10):ToClient(client) + playerData.lastDogfightAssistTime = now + return + end + + -- Closure rate warning (check this BEFORE altitude to prioritize immediate threats) + if closing and distance < PILOT_INTUITION_CONFIG.threatHotRange then + MESSAGE:New("Bandit closing fast! Prepare to engage!", 10):ToClient(client) + playerData.lastDogfightAssistTime = now + return + end + + -- Significant position change + if playerData.lastPrimaryTargetBearing then + local bearingChange = math.abs(relativeBearing - playerData.lastPrimaryTargetBearing) + if bearingChange > PILOT_INTUITION_CONFIG.positionChangeThreshold and bearingChange < (360 - PILOT_INTUITION_CONFIG.positionChangeThreshold) then + local clockPos = math.floor(relativeBearing / 30) + 1 + if clockPos > 12 then clockPos = clockPos - 12 end + MESSAGE:New("Bandit moving to " .. clockPos .. " o'clock!", 10):ToClient(client) + playerData.lastDogfightAssistTime = now + playerData.lastPrimaryTargetBearing = relativeBearing + return + end + end + + -- Altitude advantage/disadvantage (lower priority - only if no other callouts triggered) + if math.abs(altDelta) > PILOT_INTUITION_CONFIG.altitudeDeltaThreshold then + local clockPos = math.floor(relativeBearing / 30) + 1 + if clockPos > 12 then clockPos = clockPos - 12 end + local distKM = math.floor(distance / 1000 * 10) / 10 + + if altDelta > 0 then + -- Bandit is higher + local altKFeet = math.floor(altDelta * 3.28084 / 1000) + MESSAGE:New(string.format("Bandit %d o'clock, %.1fkm, %dk above!", clockPos, distKM, altKFeet), 10):ToClient(client) + else + -- You have altitude advantage + local altKFeet = math.floor(math.abs(altDelta) * 3.28084 / 1000) + MESSAGE:New(string.format("Bandit %d o'clock, %.1fkm, you're %dk high!", clockPos, distKM, altKFeet), 10):ToClient(client) + end + playerData.lastDogfightAssistTime = now + end + + playerData.lastPrimaryTargetBearing = relativeBearing +end + +-- Handle engagement (simplified: if player shoots, assume engagement for nearest target) +function PilotIntuition:OnPlayerShot(EventData) + if not self.enabled then return end + local playerUnit = EventData.IniUnit + if not playerUnit then return end + local client = playerUnit:GetClient() + if client then + local unitName = playerUnit:GetName() + if self.players[unitName] then + local playerData = self.players[unitName] + -- Calculate wingmen for extended range + local clients = SET_CLIENT:New():FilterActive():FilterOnce() + local wingmen = 0 + clients:ForEachClient(function(c) + if c and type(c.GetUnit) == "function" then + local u = c:GetUnit() + -- Validate playerUnit still exists before using it + if u and u:IsAlive() and playerUnit and playerUnit:IsAlive() and u:GetCoalition() == playerUnit:GetCoalition() and u:GetName() ~= playerUnit:GetName() then + local playerCoord = playerUnit:GetCoordinate() + local uCoord = u:GetCoordinate() + if playerCoord and uCoord then + local dist = playerCoord:Get2DDistance(uCoord) + if dist <= PILOT_INTUITION_CONFIG.formationRange then + wingmen = wingmen + 1 + end + end + end + end + end) + local multiplier = (wingmen > 0) and (2 * wingmen) or 1 + if multiplier > PILOT_INTUITION_CONFIG.maxMultiplier then + multiplier = PILOT_INTUITION_CONFIG.maxMultiplier + end + local detectionRange = PILOT_INTUITION_CONFIG.airDetectionRange * multiplier + -- Find nearest air target and mark as engaged + local minDist = math.huge + local nearestID = nil + for id, data in pairs(playerData.trackedAirTargets) do + if not data.engaged and data.unit and data.unit:IsAlive() and playerUnit and playerUnit:IsAlive() then + local playerCoord = playerUnit:GetCoordinate() + local targetCoord = data.unit:GetCoordinate() + if playerCoord and targetCoord then + local distance = playerCoord:Get2DDistance(targetCoord) + if distance < minDist then + minDist = distance + nearestID = id + end + end + end + end + if nearestID and minDist <= detectionRange then + playerData.trackedAirTargets[nearestID].engaged = true + playerData.trackedAirTargets[nearestID].lastEngagedTime = timer.getTime() + if PILOT_INTUITION_CONFIG.activeMessaging then + MESSAGE:New(self:GetRandomMessage("dogfightEngaged"), 10):ToClient(client) + end + end + end + end +end + +-- Handle being shot at +function PilotIntuition:OnShotFired(EventData) + if not self.enabled then return end + local shooter = EventData.IniUnit + if not shooter then return end + + -- Check if any player is the target + local clients = SET_CLIENT:New():FilterActive():FilterOnce() + clients:ForEachClient(function(client) + if client and type(client.GetUnit) == "function" then + local playerUnit = client:GetUnit() + if playerUnit and playerUnit:IsAlive() and playerUnit:GetCoalition() ~= shooter:GetCoalition() then + local playerName = playerUnit:GetPlayerName() or playerUnit:GetName() + if self.players[playerName] and self.players[playerName].dogfightAssist then + local playerData = self.players[playerName] + local now = timer.getTime() + if not PILOT_INTUITION_CONFIG.activeMessaging then return end + + -- Check if shot is directed at player (within range and aspect) + local playerCoord = playerUnit:GetCoordinate() + local shooterCoord = shooter:GetCoordinate() + if not playerCoord or not shooterCoord then + return + end + local distance = playerCoord:Get2DDistance(shooterCoord) + if distance < 1500 and (now - playerData.lastDogfightAssistTime) >= (PILOT_INTUITION_CONFIG.dogfightMessageCooldown * playerData.frequencyMultiplier) then + local bearing = playerCoord:GetAngleDegrees(playerCoord:GetDirectionVec3(shooterCoord)) + local playerHeading = math.deg(playerUnit:GetHeading()) + local relativeBearing = (bearing - playerHeading + 360) % 360 + + -- Determine evasion direction + local direction = "left" + if relativeBearing > 180 then + direction = "right" + end + + -- Check if above or below + local altDelta = shooter:GetAltitude() - playerUnit:GetAltitude() + local vertical = "" + if altDelta > 100 then + vertical = " Push!" + elseif altDelta < -100 then + vertical = " Pull!" + end + + MESSAGE:New(self:GetRandomMessage("underFire", {direction, vertical})):ToClient(client) + playerData.lastDogfightAssistTime = now + end + end + end + end + end) +end + +-- Initialize the Pilot Intuition system +PILog(LOG_INFO, "====== PILOT INTUITION SYSTEM STARTING ======") +local pilotIntuitionSystem = PilotIntuition:New() +PILog(LOG_INFO, "====== PILOT INTUITION SYSTEM INITIALIZED ======") \ No newline at end of file diff --git a/README.md b/README.md index 5b1cafa..8b13789 100644 --- a/README.md +++ b/README.md @@ -1,293 +1 @@ -# MOOSE Dual Coalition Zone Capture System -- **Author**: F99th-TracerFacer -- **Discord:** https://discord.gg/NdZ2JuSU (The Fighting 99th Discord Server where I spend most of my time.) -A dynamic zone capture and control system for DCS World missions using the MOOSE framework. This script enables territory-based gameplay where RED and BLUE coalitions compete to capture and hold strategic zones across the battlefield. - -![Version](https://img.shields.io/badge/version-2.0-blue) -![DCS](https://img.shields.io/badge/DCS-2.9%2B-green) -![MOOSE](https://img.shields.io/badge/MOOSE-Latest-orange) -![License](https://img.shields.io/badge/license-MIT-lightgrey) - -## 🎯 Features - -- **🎨 Visual Feedback**: Color-coded zone boundaries (Red/Blue/Green/Orange) that change dynamically -- **💨 Smoke Signals**: Automatic smoke markers indicating zone status -- **📍 Tactical Information**: Real-time force composition and MGRS coordinates for enemies -- **🏆 Victory Conditions**: Automatic win detection when one coalition captures all zones -- **📻 F10 Radio Menu**: Player-accessible status reports and progress tracking -- **⚙️ Highly Configurable**: Simple zone ownership configuration via Lua tables -- **🔄 Dual Coalition**: Full support for both RED and BLUE coalitions -- **📊 Auto-Reporting**: Periodic status updates every 5 minutes -- **🎮 Player-Friendly**: Clear messaging and intuitive state transitions - -## 🚀 Quick Start - -### Prerequisites - -1. **DCS World** (version 2.9 or higher) -2. **MOOSE Framework** ([Download here](https://github.com/FlightControl-Master/MOOSE)) -3. Basic knowledge of DCS Mission Editor - -### Installation - -1. **Download the files:** - - `Moose_DualCoalitionZoneCapture.lua` - Main script - - `Moose_DualCoalitionZoneCapture.miz` - Example mission - - `Moose_.lua` - MOOSE framework (get latest version) - -2. **In DCS Mission Editor:** - - Create trigger zones for each capture point (e.g., "Capture Zone-1", "Capture Severomorsk") - - Create two groups: `BLUEHQ` (any BLUE ground unit) and `REDHQ` (any RED ground unit) - -3. **Configure zones** in `Moose_DualCoalitionZoneCapture.lua`: - -```lua -local ZONE_CONFIG = { - RED = { - "Capture Zone-1", - "Capture Zone-2" - }, - BLUE = { - "Capture Zone-3", - "Capture Zone-4" - }, - NEUTRAL = { - -- Empty zones at mission start - } -} -``` - -4. **Load scripts** via Mission Start trigger: - - Action 1: DO SCRIPT FILE → `Moose_.lua` - - Action 2: DO SCRIPT FILE → `Moose_DualCoalitionZoneCapture.lua` - -5. **Save and test** your mission! - -## 📖 How It Works - -### Zone States - -Zones transition between four distinct states: - -| State | Color | Smoke | Description | -|-------|-------|-------|-------------| -| **RED Controlled** | 🔴 Red Border | Red | Zone secured by RED coalition | -| **BLUE Controlled** | 🔵 Blue Border | Blue | Zone secured by BLUE coalition | -| **Neutral/Empty** | 🟢 Green Border | Green | Uncontrolled, ready for capture | -| **Contested** | 🟠 Orange Border | White | Multiple coalitions present - fighting for control | - -### Capture Mechanics - -- **To Capture**: Move ground units into a zone -- **To Hold**: Eliminate all enemy forces in the zone -- **To Win**: Capture ALL zones on the map - -The script automatically scans zones every 30 seconds (configurable) and updates ownership based on unit presence. - -### Tactical Information Markers - -Each zone displays real-time tactical data: - -``` -TACTICAL: Capture Severomorsk-1 -Forces: R:5 B:12 -TGTS: T-90@38U LV 12345 67890, BTR-80@38U LV 12346 67891 -``` - -- **Force Counts**: Number of units per coalition -- **MGRS Coordinates**: Precise enemy locations (when ≤10 units) -- **Coalition-Specific**: Each side sees their enemies marked - -## ⚙️ Configuration Options - -### Zone Settings - -```lua -local ZONE_SETTINGS = { - guardDelay = 1, -- Seconds before entering Guard state after capture - scanInterval = 30, -- How often to scan for units (seconds) - captureScore = 200 -- Points awarded for zone capture -} -``` - -### Performance Tuning - -For missions with many units: -```lua -scanInterval = 60 -- Scan less frequently -``` - -For fast-paced action: -```lua -scanInterval = 15 -- More responsive zone changes -``` - -### Logging Control - -Disable detailed logging: -```lua -CAPTURE_ZONE_LOGGING = { enabled = false } -``` - -## 👥 Player Features - -### F10 Radio Menu Commands - -Players access zone information via **F10 → Zone Control**: - -- **Get Zone Status Report**: Current ownership of all zones -- **Check Victory Progress**: Percentage toward victory -- **Refresh Zone Colors**: Manually redraw zone boundaries - -### Automatic Notifications - -- ✅ Zone capture/loss announcements -- ⚠️ Attack warnings when zones are contested -- 📊 Status reports every 5 minutes -- 🏆 Victory alerts at 80% and 100% completion -- 🎉 Victory countdown with celebratory effects - -## 🎮 Example Mission - -The included `Moose_DualCoalitionZoneCapture.miz` demonstrates: - -- Proper zone configuration -- HQ group placement -- Script loading order -- AI patrol patterns for testing -- All visual and messaging features - -**Use this mission as a template for your own scenarios!** - -## 🔧 Troubleshooting - -### Common Issues - -#### ❌ Script Won't Load -**Error**: "attempt to index a nil value" -- **Cause**: MOOSE not loaded first -- **Fix**: Ensure load order is MOOSE → Capture Script - -#### ❌ Zone Not Found -**Error**: "Zone 'X' not found in mission editor!" -- **Cause**: Zone name mismatch -- **Fix**: Verify zone names match EXACTLY (case-sensitive!) - -#### ⚠️ Zones Not Capturing -- Only ground units count. -- Wait 30 seconds for scan cycle -- Eliminate ALL enemy forces to capture -- Check DCS.log for detailed information -- Increase logging and capture logs before reaching out to me. Happy to help troubleshoot. Discord info below. - -### Checking Logs - -Open `Saved Games\DCS\Logs\DCS.log` and search for: -- `[CAPTURE Module]` - General logging -- `[INIT]` - Initialization messages -- `[TACTICAL]` - Tactical marker updates -- `[VICTORY]` - Victory condition checks - -## 🏗️ Mission Design Tips - -### Best Practices - -- **Zone Size**: Large enough for tactical areas, avoid overlaps -- **Zone Placement**: Position over airbases, FOBs, strategic terrain -- **Starting Balance**: Consider defensive vs. offensive scenarios -- **AI Behavior**: Use "Ground Hold" or "Ground On Road" waypoints -- **Player Briefing**: Document F10 menu commands in mission brief - -### Integration with Other Scripts - -Access zone data from other scripts: - -```lua --- Get current ownership status -local status = GetZoneOwnershipStatus() --- Returns: { blue = X, red = Y, neutral = Z, total = N, zones = {...} } - --- Manual status broadcast -BroadcastZoneStatus() - --- Refresh zone visuals -RefreshAllZoneColors() -``` - -### Victory Flags - -The script sets user flags on victory: -- `BLUE_VICTORY = 1` when BLUE wins -- `RED_VICTORY = 1` when RED wins - -Use these in triggers to end missions or transition to next phase. - -## 📋 Requirements - -### Essential Components - -- ✅ DCS World 2.9 or higher -- ✅ MOOSE Framework (latest version) -- ✅ Trigger zones in mission editor -- ✅ BLUEHQ and REDHQ groups - -### Mission Prerequisites - -- At least one trigger zone per capture point -- Exact zone name matching between editor and Lua config -- Both HQ groups must exist (can be hidden/inactive) - -## 📞 Support & Resources - -### Get Help - -- **F99th Mission Maker Discord Community**: https://discord.gg/kTNmMScQNf -- **Author**: F99th-TracerFacer -- **GitHub Issues**: Report bugs or request features: https://github.com/users/iTracerFacer/projects/3 - - -### Additional Resources - -- [MOOSE Documentation](https://flightcontrol-master.github.io/MOOSE_DOCS/) -- [MOOSE Discord](https://discord.gg/gj68fm969S) -- [DCS Forums](https://forum.dcs.world) - -## 📄 License - -This script is provided free for use in DCS World missions. Feel free to modify and distribute. - -## 🙏 Credits - -- **Author**: F99th-TracerFacer -- **Discord:** https://discord.gg/NdZ2JuSU (The Fighting 99th Discord Server where I spend most of my time.) -- **Framework**: MOOSE by FlightControl -- **Community**: DCS World Mission Makers - -## 🎯 Version History - -### Version 2.0 (Current) -- ✨ Full dual coalition support (RED & BLUE) -- ✨ Tactical information markers with MGRS coordinates -- ✨ Auto-victory detection and countdown -- ✨ F10 radio menu commands -- ✨ Periodic status reports -- ✨ Enhanced visual feedback system -- ✨ Configurable zone ownership via Lua tables - -### Version 1.0 -- Initial release -- Basic zone capture mechanics -- Single coalition focus - ---- - -

- -**🎮 Happy Mission Making! 🚁** - -*Created with ❤️ for the DCS World Community* - -[Discord](https://discord.gg/kTNmMScQNf) • [Documentation](Mission_Maker_Guide.html) • [Report Issue](#) - -
diff --git a/cover.png b/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..4baf6edd38fc5e4cd1c4f0d06fb7453ac8269f52 GIT binary patch literal 209889 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%0AN*Xt%}`p6zHEldf{YGrp%GOLKe{w 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