diff --git a/functions/CfgFunctions.hpp b/functions/CfgFunctions.hpp
index fcb9e91..6b24d26 100644
--- a/functions/CfgFunctions.hpp
+++ b/functions/CfgFunctions.hpp
@@ -15,9 +15,7 @@ class milsim
};
class fbcb2 {
- class addFBCB2DiaryEntries { postInit = 1; };
class initFBCB2 { postInit = 1; };
- class processFBCB2Callsigns {};
class processFBCB2FixedWingAssets {};
class processFBCB2RotaryAssets {};
class processFBCB2RadioFrequencies {};
@@ -25,6 +23,15 @@ class milsim
class processFBCB2Environment {};
class messageFBCB2AssetStatus {};
};
+ class fbcb2_util {
+ file = "functions\fbcb2\util";
+ class createOrUpdateDiaryRecord {};
+ };
+ class fbcb2_radioFrequencies {
+ file = "functions\fbcb2\radioFrequencies";
+ class formatRadioElementForDiary {};
+ class generateElementFrequencyRecordText {};
+ };
class client {
class addZenModules { postInit = 1; };
diff --git a/functions/definitions/BattalionInfo.hpp b/functions/definitions/BattalionInfo.hpp
index b4a3bff..e2313f0 100644
--- a/functions/definitions/BattalionInfo.hpp
+++ b/functions/definitions/BattalionInfo.hpp
@@ -67,6 +67,7 @@ class BattalionInfo {
// frequencies are in format:
// {roleWithinElement, {primarySR, additionalSR}, {primaryLR, additionalLR}}
frequencies[] = {
+ {"Contact", {}, {FREQ_BATTALION}},
{"Actual", {}, {FREQ_BATTALION}},
{"Romeo", {}, {FREQ_BATTALION, FREQ_ECHO_FLIGHT_CAS}}
};
@@ -77,6 +78,7 @@ class BattalionInfo {
shortDescription = "RRC";
textColor = LVL2_TEXT_COLOR;
frequencies[] = {
+ {"Contact", {}, {FREQ_BATTALION}},
{"Actual", {}, {FREQ_BATTALION, FREQ_ECHO_FLIGHT_CAS}}
};
};
@@ -86,18 +88,20 @@ class BattalionInfo {
shortDescription = "Battalion Medical";
textColor = LVL2_TEXT_COLOR;
frequencies[] = {
+ {"Contact", {FREQ_ALL_MEDICAL_SR}, {FREQ_BATTALION}},
{"Actual", {FREQ_BATTALION_MEDICAL_INTERCOM, FREQ_ALL_MEDICAL_SR}, {FREQ_BATTALION, FREQ_ECHO_FLIGHT_LOGISTICS}},
{"General", {FREQ_BATTALION_MEDICAL_INTERCOM, FREQ_ALL_MEDICAL_SR}, {}}
};
};
- // class WeaponsPlatoon { // WIP
- // callsign = WPN_CALLSIGN;
- // textColor = LVL2_TEXT_COLOR;
- // frequencies[] = {
- // {"Actual", {}, {FREQ_BATTALION, FREQ_ECHO_FLIGHT_CAS}}
- // };
- // };
+ class WeaponsSquad { // WIP
+ callsign = WPN_CALLSIGN;
+ shortDescription = "Special Weapons Squad";
+ textColor = LVL2_TEXT_COLOR;
+ frequencies[] = {
+ {"Contact", {}, {FREQ_BATTALION, FREQ_ECHO_FLIGHT_CAS}}
+ };
+ };
class AlphaCompany {
@@ -105,15 +109,15 @@ class BattalionInfo {
shortDescription = "Alpha Company";
textColor = LVL2_TEXT_COLOR;
frequencies[] = {
- {"Actual", {}, {FREQ_COMPANY, FREQ_BATTALION}},
- {"Romeo", {}, {FREQ_BATTALION, FREQ_ECHO_FLIGHT_CAS, FREQ_ECHO_FLIGHT_LOGISTICS}}
+ {"Contact", {}, {FREQ_ALPHA_COMPANY, FREQ_BATTALION}}
};
class Platoon1 {
callsign = CALLSIGN_ELEMENT(ALPHA_CALLSIGN, 1-6);
textColor = LVL3_TEXT_COLOR;
frequencies[] = {
- {"Actual", {FREQ_PLATOON1_SR, FREQ_PLATOON1_RTO}, {FREQ_PLATOON1_LR, FREQ_COMPANY}}
+ {"Actual", {FREQ_PLATOON1_SR, FREQ_PLATOON1_RTO}, {FREQ_PLATOON1_LR, FREQ_ALPHA_COMPANY}},
+ {"Romeo", {}, {FREQ_BATTALION, FREQ_ECHO_FLIGHT_CAS, FREQ_ECHO_FLIGHT_LOGISTICS}}
};
class Squad1 {
callsign = CALLSIGN_ELEMENT(ALPHA_CALLSIGN, 1-1);
@@ -151,7 +155,7 @@ class BattalionInfo {
callsign = CALLSIGN_ELEMENT(ALPHA_CALLSIGN, 2-6);
textColor = LVL3_TEXT_COLOR;
frequencies[] = {
- {"Actual", {FREQ_PLATOON2_SR, FREQ_PLATOON2_RTO}, {FREQ_PLATOON2, FREQ_COMPANY}}
+ {"Actual", {FREQ_PLATOON2_SR, FREQ_PLATOON2_RTO}, {FREQ_PLATOON2_LR, FREQ_ALPHA_COMPANY}}
};
class Squad1 {
callsign = CALLSIGN_ELEMENT(ALPHA_CALLSIGN, 2-1);
@@ -191,6 +195,7 @@ class BattalionInfo {
shortDescription = "Echo Company";
textColor = LVL2_TEXT_COLOR;
frequencies[] = {
+ {"Contact", {}, {FREQ_BATTALION}},
{"Actual", {}, {FREQ_BATTALION}}
};
diff --git a/functions/fbcb2/fn_addFBCB2DiaryEntries.sqf b/functions/fbcb2/fn_addFBCB2DiaryEntries.sqf
deleted file mode 100644
index 10936a4..0000000
--- a/functions/fbcb2/fn_addFBCB2DiaryEntries.sqf
+++ /dev/null
@@ -1,10 +0,0 @@
-if ( !hasInterface ) exitWith {};
-
-player createDiarySubject["Status","FBCB2 - Status"];
-player createDiarySubject["Intel","FBCB2 - Combat Msgs"];
-player createDiarySubject["Messages","FBCB2 - Messages"];
-
-
-diag_log text "[MILSIM] (fbcb2) diary entries added";
-
-nil;
\ No newline at end of file
diff --git a/functions/fbcb2/fn_initFBCB2.sqf b/functions/fbcb2/fn_initFBCB2.sqf
index 4a4d3f4..f906fd1 100644
--- a/functions/fbcb2/fn_initFBCB2.sqf
+++ b/functions/fbcb2/fn_initFBCB2.sqf
@@ -1,8 +1,29 @@
+
if ( !hasInterface ) exitWith {};
waitUntil { !isNil "milsim_complete" };
-[] call milsim_fnc_processFBCB2Callsigns;
+milsim_fbcb2_recordTitleColor = "#ff6666";
+milsim_fbcb2_recordTitleFont = "PuristaMedium";
+milsim_fbcb2_recordTitleSize = 20;
+
+milsim_fbcb2_subjectStatusID = "FBCB2_Status";
+milsim_fbcb2_subjectIntelID = "FBCB2_Intel";
+milsim_fbcb2_subjectMessagesID = "FBCB2_Messages";
+milsim_fbcb2_subjectFrequenciesID = "FBCB2_Frequencies";
+
+player createDiarySubject[milsim_fbcb2_subjectStatusID, "FBCB2 - Status"];
+player createDiarySubject[milsim_fbcb2_subjectMessagesID, "FBCB2 - Messages"];
+player createDiarySubject[milsim_fbcb2_subjectIntelID, "FBCB2 - Intel"];
+player createDiarySubject[milsim_fbcb2_subjectFrequenciesID, "FBCB2 - Frequencies"];
+
+// store records in format:
+// [subject, [
+// [title, diaryRecord]
+// ]]
+milsim_fbcb2_diaryRecords = createHashMap;
+
+// populate diary
[] call milsim_fnc_processFBCB2FixedWingAssets;
[] call milsim_fnc_processFBCB2RotaryAssets;
[] call milsim_fnc_processFBCB2RadioFrequencies;
diff --git a/functions/fbcb2/fn_processFBCB2Callsigns.sqf b/functions/fbcb2/fn_processFBCB2Callsigns.sqf
deleted file mode 100644
index 545511c..0000000
--- a/functions/fbcb2/fn_processFBCB2Callsigns.sqf
+++ /dev/null
@@ -1,38 +0,0 @@
-
-_text = "
-=======------ Mission Data Set ------=======
-
-SPARTAN
-Command
-
-BLACKJACK
-Alpha Platoon
-
-ZOOMER
-Echo
-
-TIGER
-RRC
-
-BLACKFOOT
-Weapons Squad
-
-";
-
-
-private _text = [];
-
-private _battalionCfg = call milsim_fnc_getBattalionCfg;
-private _commandCfg = _battalionCfg >> "Command";
-private _battalionLevelElements = [_commandCfg] call BIS_fnc_returnChildren;
-
-{
- private _cfg = _x;
- private _callsign = getText (_cfg >> "callsign");
- private _desc = getText (_cfg >> "shortDescription");
- _text pushBack format ["%1
%2", _callsign, _desc];
-} forEach _battalionLevelElements;
-
-_text = _text joinString "
";
-
-player createDiaryRecord ["Status", ["MDS - COMMAND - CALLSIGNS", _text]];
\ No newline at end of file
diff --git a/functions/fbcb2/fn_processFBCB2Environment.sqf b/functions/fbcb2/fn_processFBCB2Environment.sqf
index 5c700fa..4206098 100644
--- a/functions/fbcb2/fn_processFBCB2Environment.sqf
+++ b/functions/fbcb2/fn_processFBCB2Environment.sqf
@@ -1,8 +1,16 @@
-_sunTimes = date call BIS_fnc_sunriseSunsetTime;
+private _recordTitle = "MDS - INTEL - ENVIRONMENT";
-_text = "
-=======------ Mission Data Set ------=======
-
+
+_sunTimes = date call BIS_fnc_sunriseSunsetTime;
+
+_text = format[
+ "%4
",
+ milsim_fbcb2_recordTitleSize,
+ milsim_fbcb2_recordTitleColor,
+ milsim_fbcb2_recordTitleFont,
+ _recordTitle
+];
+_text = _text + "
Local Sunrise
" + ([_sunTimes select 0, "HH:MM"] call BIS_fnc_timeToString) + "
@@ -13,4 +21,10 @@ _text = "
";
-player createDiaryRecord ["Status", ["MDS - INTEL - ENVIRONMENT", _text]];
\ No newline at end of file
+player createDiaryRecord ["Status", ["MDS - INTEL - ENVIRONMENT", _text]];
+
+[
+ milsim_fbcb2_subjectIntelID,
+ _recordTitle,
+ _text
+] call milsim_fnc_createOrUpdateDiaryRecord;
\ No newline at end of file
diff --git a/functions/fbcb2/fn_processFBCB2RadioFrequencies.sqf b/functions/fbcb2/fn_processFBCB2RadioFrequencies.sqf
index 8902d03..8057b22 100644
--- a/functions/fbcb2/fn_processFBCB2RadioFrequencies.sqf
+++ b/functions/fbcb2/fn_processFBCB2RadioFrequencies.sqf
@@ -1,108 +1,53 @@
// updated 2024-02-01 by IndigoFox
// now reads from the battalion config structure
-private _formatElementForDiary = {
- params ["_cfg", "_indentCount"];
-
- private _leadingSpace = [
- format["| ", _ELEMENT_NAME_SIZE]
- ];
- for "_i" from 1 to _indentCount do {
- _leadingSpace pushBack "-";
- };
- _leadingSpace pushBack " | ";
-
- // make header line
- private _lines = [
- format[
- "%3%4",
- _ELEMENT_NAME_SIZE,
- getText(_cfg >> "textColor"),
- _leadingSpace joinString "",
- getText (_cfg >> "callsign")
- ]
- ];
-
- // make frequency lines
- private _freqLeadingSpace = [
- format["| ", _ELEMENT_NAME_SIZE]
- ];
- for "_i" from 1 to _indentCount + 4 do {
- _freqLeadingSpace pushBack " ";
- };
- _freqLeadingSpace pushBack "";
- _freqLeadingSpace = _freqLeadingSpace joinString "";
-
- {
- _x params ["_role", "_sr", "_lr"];
-
-
- private ["_srStr", "_lrStr"];
- if (count _sr > 0) then {
- _srStr = format["SR [%1]", _sr joinString "/"];
- } else {
- _srStr = "----";
- };
- if (count _lr > 0) then {
- _lrStr = format["LR [%1]", _lr joinString "/"];
- } else {
- _lrStr = "----";
- };
-
-
- _lines pushBack format[
- "%1- %4%5%6 -",
- _freqLeadingSpace,
- _ELEMENT_FREQ_SIZE,
- _FREQ_TEXT_COLOR,
- [_role, "right", " ", _FREQ_PAD_LENGTH] call milsim_fnc_padString,
- [_srStr, "right", " ", _FREQ_PAD_LENGTH] call milsim_fnc_padString,
- [_lrStr, "right", " ", 8] call milsim_fnc_padString
- ];
- } forEach (getArray (_cfg >> "frequencies"));
-
- _lines;
-};
-
private _addToAllText = {
params [["_lines", []]];
- _allText = format[
- "%1%2
",
- _allText,
- _lines joinString "
"
- ];
-};
-
-private _recurseAddElements = {
- params ["_cfg", ["_indentCount", 1]];
-
- // add config
- private _lines = [_cfg, _indentCount] call _formatElementForDiary;
- [_lines] call _addToAllText;
-
- // get children and recurse
- _childCfgs = _cfg call BIS_fnc_returnChildren;
- {
- [_x, _indentCount+1] call _recurseAddElements;
- } forEach _childCfgs;
+ _allText pushBack (_lines joinString "
");
};
////////////////////////////////////////
-_allText = "
-=======------ Mission Data Set ------=======
-
";
-private _battalionInfoCfgs = [call milsim_fnc_getBattalionCfg] call BIS_fnc_returnChildren;
+private _battalionInfoCfg = call milsim_fnc_getBattalionCfg;
+private _battalionElementCfgs = [_battalionInfoCfg >> "Command"] call BIS_fnc_returnChildren;
private _ELEMENT_NAME_SIZE = 10;
-private _ELEMENT_FREQ_SIZE = 8;
-private _FREQ_PAD_LENGTH = 14;
+private _ELEMENT_NAME_FONT = "EtelkaMonospaceProBold";
+private _ELEMENT_FREQ_SIZE = 9;
+private _ELEMENT_FREQ_FONT = "EtelkaMonospacePro";
+private _FREQ_INDENT_CONSTANT = 6;
+private _FREQ_PAD_LENGTH = 17;
private _FREQ_TEXT_COLOR = "#CCCCCC";
+
+private _freqLeadingSpace = [
+ format["| ", _ELEMENT_NAME_SIZE, _ELEMENT_NAME_FONT]
+];
+for "_i" from 1 to _FREQ_INDENT_CONSTANT do {
+ _freqLeadingSpace pushBack " ";
+};
+_freqLeadingSpace pushBack "";
+_freqLeadingSpace = _freqLeadingSpace joinString "";
+
+
+
+// reverse the list so diary records are filed in the correct order
+reverse _battalionElementCfgs;
{
- _x call _recurseAddElements;
-} forEach _battalionInfoCfgs;
+ // recursively generate diary text for all child elements of battalion-level elements
+ private _diaryTitleText = [_x, true] call milsim_fnc_generateElementFrequencyRecordText;
+ [
+ milsim_fbcb2_subjectFrequenciesID,
+ _diaryTitleText#0,
+ _diaryTitleText#1
+ ] call milsim_fnc_createOrUpdateDiaryRecord;
+} forEach _battalionElementCfgs;
-_allText = format["%1", _allText];
-
-player createDiaryRecord ["Status", ["MDS - INTEL - RADIO FREQS", _allText]];
\ No newline at end of file
+// add the battalion command to the top of the list
+// don't process child elements
+private _diaryTitleText = [_battalionInfoCfg >> "Command", false] call milsim_fnc_generateElementFrequencyRecordText;
+[
+ milsim_fbcb2_subjectFrequenciesID,
+ _diaryTitleText#0,
+ _diaryTitleText#1
+] call milsim_fnc_createOrUpdateDiaryRecord;
\ No newline at end of file
diff --git a/functions/fbcb2/radioFrequencies/fn_formatRadioElementForDiary.sqf b/functions/fbcb2/radioFrequencies/fn_formatRadioElementForDiary.sqf
new file mode 100644
index 0000000..8b5210c
--- /dev/null
+++ b/functions/fbcb2/radioFrequencies/fn_formatRadioElementForDiary.sqf
@@ -0,0 +1,62 @@
+// called from milsim_fnc_processFBCB2RadioFrequencies
+params ["_cfg", ["_indentCount", 1, [5]]];
+
+private _leadingSpace = [
+ format["| ", _ELEMENT_NAME_SIZE, _ELEMENT_NAME_FONT]
+];
+for "_i" from 1 to _indentCount do {
+ _leadingSpace pushBack "-";
+};
+_leadingSpace pushBack " | ";
+
+// make header line
+private _lines = [
+ format[
+ "%2%3",
+ getText(_cfg >> "textColor"),
+ _leadingSpace joinString "",
+ getText (_cfg >> "callsign")
+ ]
+];
+
+// make frequency lines
+private _freqLeadingSpace = [
+ format["| ", _ELEMENT_NAME_SIZE, _ELEMENT_NAME_FONT]
+];
+for "_i" from 1 to _FREQ_INDENT_CONSTANT do {
+ _freqLeadingSpace pushBack " ";
+};
+_freqLeadingSpace pushBack "";
+_freqLeadingSpace = _freqLeadingSpace joinString "";
+
+{
+ _x params ["_role", "_sr", "_lr"];
+
+
+ private ["_srStr", "_lrStr"];
+ if (count _sr > 0) then {
+ _srStr = format["%1", _sr joinString " / "];
+ } else {
+ _srStr = "----";
+ };
+ if (count _lr > 0) then {
+ _lrStr = format["%1", _lr joinString " / "];
+ } else {
+ _lrStr = "----";
+ };
+
+
+ _lines pushBack format[
+ "%1- %5%6%7",
+ _freqLeadingSpace,
+ _ELEMENT_FREQ_SIZE,
+ _ELEMENT_FREQ_FONT,
+ _FREQ_TEXT_COLOR,
+ [_role, "right", " ", _FREQ_PAD_LENGTH] call milsim_fnc_padString,
+ [_srStr, "right", " ", _FREQ_PAD_LENGTH] call milsim_fnc_padString,
+ _lrStr
+ ];
+} forEach (getArray (_cfg >> "frequencies"));
+// diag_log text (_lines joinString endl);
+
+_lines;
\ No newline at end of file
diff --git a/functions/fbcb2/radioFrequencies/fn_generateElementFrequencyRecordText.sqf b/functions/fbcb2/radioFrequencies/fn_generateElementFrequencyRecordText.sqf
new file mode 100644
index 0000000..d66f07a
--- /dev/null
+++ b/functions/fbcb2/radioFrequencies/fn_generateElementFrequencyRecordText.sqf
@@ -0,0 +1,60 @@
+// called from milsim_fnc_processFBCB2RadioFrequencies
+params [
+ ["_elementCfg", configNull, [configNull]],
+ ["_shouldProcessChildCfgs", true]
+];
+
+if (isNull _elementCfg) exitWith {
+ ["_elementCfg parameter is NULL"] call BIS_fnc_error;
+};
+
+private _battalionElement = _elementCfg;
+
+private _recordTitle = format[
+ "%1 (%2)",
+ getText(_battalionElement >> "callsign"),
+ getText(_battalionElement >> "shortDescription")
+];
+// systemChat _recordTitle;
+
+private _headers = [
+ format[
+ "%4
",
+ milsim_fbcb2_recordTitleSize,
+ milsim_fbcb2_recordTitleColor,
+ milsim_fbcb2_recordTitleFont,
+ _recordTitle
+ ],
+ format[
+ "%1- %5%6%7
",
+ _freqLeadingSpace,
+ _ELEMENT_FREQ_SIZE,
+ _ELEMENT_FREQ_FONT,
+ _FREQ_TEXT_COLOR,
+ ["ROLE", "right", " ", _FREQ_PAD_LENGTH] call milsim_fnc_padString,
+ ["SR", "right", " ", _FREQ_PAD_LENGTH] call milsim_fnc_padString,
+ "LR"
+ ]
+];
+
+private _allText = [];
+
+// get all child elements recursively and format them
+if (_shouldProcessChildCfgs) then {
+ [_battalionElement, {
+ params ["_cfg", "_recurseCounter"];
+ // add config
+ private _lines = [_cfg, _recurseCounter+1] call milsim_fnc_formatRadioElementForDiary;
+ // private _lines = [_cfg, _indentCount] call t;
+ _allText pushBack (_lines joinString "
");
+ }] call milsim_fnc_recurseSubclasses;
+} else {
+ private _lines = [_battalionElement, 1] call milsim_fnc_formatRadioElementForDiary;
+ // private _lines = [_cfg, _indentCount] call t;
+ _allText pushBack (_lines joinString "
");
+};
+
+
+_allText = format["%1%2", _headers joinString "
", _allText joinString "
"];
+
+[_recordTitle, _allText];
\ No newline at end of file
diff --git a/functions/fbcb2/util/fn_createOrUpdateDiaryRecord.sqf b/functions/fbcb2/util/fn_createOrUpdateDiaryRecord.sqf
new file mode 100644
index 0000000..89380e8
--- /dev/null
+++ b/functions/fbcb2/util/fn_createOrUpdateDiaryRecord.sqf
@@ -0,0 +1,18 @@
+params [
+ ["_subjectID", milsim_fbcb2_subjectStatusID, [""]],
+ ["_recordTitle", "", [""]],
+ ["_recordText", "", [""]]
+];
+
+// Check if already created
+private _subjectRecords = milsim_fbcb2_diaryRecords getOrDefault [_subjectID, createHashMap, true];
+private _existingRecord = _subjectRecords getOrDefault [_recordTitle, diaryRecordNull, true];
+
+if (!isNull _existingRecord) then {
+ player setDiaryRecordText [[_subjectID, _existingRecord], [_recordTitle, _recordText]];
+ systemChat format ["Updated diary record: %1", _recordTitle];
+} else {
+ private _new = player createDiaryRecord [_subjectID, [_recordTitle, _recordText]];
+ _subjectRecords set [_recordTitle, _new];
+ milsim_fbcb2_diaryRecords set [_subjectID, _subjectRecords];
+};
\ No newline at end of file
diff --git a/functions/util/fn_recurseSubclasses.sqf b/functions/util/fn_recurseSubclasses.sqf
index 6d483f5..b4ba431 100644
--- a/functions/util/fn_recurseSubclasses.sqf
+++ b/functions/util/fn_recurseSubclasses.sqf
@@ -5,10 +5,21 @@ params [
if (isNull _cfg) exitWith {["Provided config is null!"] call BIS_fnc_error};
-[_cfg] call _code;
-// get children and recurse
-private _childCfgs = _cfg call BIS_fnc_returnChildren;
-{
- [_x, _code] call milsim_fnc_recurseSubclasses;
-} forEach _childCfgs;
\ No newline at end of file
+private _recurseFnc = {
+ params ["_cfg", "_code", ["_recurseCounter", 0]];
+ [_cfg, _recurseCounter] call _code;
+ // get children and recurse
+ private _childCfgs = _cfg call BIS_fnc_returnChildren;
+ if (count _childCfgs isEqualTo 0) exitWith {false};
+
+ {
+ [_x, _code, _recurseCounter + 1] call _recurseFnc;
+ } forEach _childCfgs;
+ false;
+};
+
+private _continue = true;
+while {_continue} do {
+ _continue = [_cfg, _code] call _recurseFnc;
+};
\ No newline at end of file