unit uMain1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExeInfo, AdvOfficeStatusBar, AdvSmoothTabPager, StdCtrls, HTMLabel,
  AdvEdit, AdvEdBtn, AdvDirectoryEdit, ActiveX, advlued, AdvSmoothPanel,
  AdvSmoothButton, htmlbtns, HTMLChkList, AdvFileNameEdit, AdvSmoothListBox,
  AdvSmoothComboBox, CheckLst, FmxUtils, Registry, inifiles, Math,
  Mask, AdvSpin, uCICVersionInformation, System.UITypes; //VersInfo; // SMCVersInfo,

type
  TfrmMain1 = class(TForm)
    Exe1: TExeInfo;
    pct1: TAdvSmoothTabPager;
    tshGE: TAdvSmoothTabPage;
    tshSE: TAdvSmoothTabPage;
    tshOther: TAdvSmoothTabPage;
    AdvOfficeStatusBar1: TAdvOfficeStatusBar;
    edtHCDirGE: TAdvDirectoryEdit;
    lblHCDirGE: THTMLabel;
    edtGEName: TAdvLUEdit;
    lblGEName: THTMLabel;
    pnlCmdOptsGE: TAdvSmoothPanel;
    btnLaunchGE: TAdvSmoothButton;
    ckbAutoPlayGE: THTMLCheckBox;
    ckbBSNumGE: THTMLCheckBox;
    ckbBSFNGE: THTMLCheckBox;
    edtBSFNGE: TAdvFileNameEdit;
    cbxBSNumGE: TAdvSmoothComboBox;
    ckbScenFNGE: THTMLCheckBox;
    edtScenFNGE: TAdvFileNameEdit;
    ckbScenNumGE: THTMLCheckBox;
    cbxScenNumGE: TAdvSmoothComboBox;
    ckbCDBresFNGE: THTMLCheckBox;
    edtCDBresFNGE: TAdvFileNameEdit;
    edtCDBrsrFNGE: TAdvFileNameEdit;
    ckbCDBrsrFNGE: THTMLCheckBox;
    ckbSavFNGE: THTMLCheckBox;
    edtSavFNGE: TAdvFileNameEdit;
    edtLogFNGE: TAdvFileNameEdit;
    ckbLogFNGE: THTMLCheckBox;
    ckbIgnoreRegGE: THTMLCheckBox;
    ckbSubAIGE: THTMLCheckBox;
    ckbEff115GE: THTMLCheckBox;
    ckbIterSaveGE: THTMLCheckBox;
    ckbSavIntGE: THTMLCheckBox;
    edtSavIntGE: TAdvEdit;
    pnlGameOptsGE: TAdvSmoothPanel;
    ckbGOGE: THTMLCheckBox;
    cbxGOSideGE: TAdvSmoothComboBox;
    cbxGONukeRelGE: TAdvSmoothComboBox;
    cbxGOSnorkSubGE: TAdvSmoothComboBox;
    cbxGORealWeathGE: TAdvSmoothComboBox;
    cbxGOMaintFailGE: TAdvSmoothComboBox;
    cbxGOFullOrdGE: TAdvSmoothComboBox;
    cbxGOFormPatGE: TAdvSmoothComboBox;
    cbxGOExitGE: TAdvSmoothComboBox;
    cbxGOTimeCompGE: TAdvSmoothComboBox;
    pnlLogOptsGE: TAdvSmoothPanel;
    ckbLOGE: THTMLCheckBox;
    ckbLOinit_annexGE: THTMLCheckBox;
    ckbLOac_aiGE: THTMLCheckBox;
    ckbLOsub_aiGE: THTMLCheckBox;
    ckbLOemcon_aiGE: THTMLCheckBox;
    ckbLOsonarGE: THTMLCheckBox;
    ckbLOrefuelGE: THTMLCheckBox;
    ckbLOmissionGE: THTMLCheckBox;
    ckbLOinterceptGE: THTMLCheckBox;
    ckbLOres_fileGE: THTMLCheckBox;
    ckbLOloadGE: THTMLCheckBox;
    ckbLOradarGE: THTMLCheckBox;
    ckbLOecmGE: THTMLCheckBox;
    ckbLOmissileGE: THTMLCheckBox;
    ckbLOareadefGE: THTMLCheckBox;
    ckbLOperfGE: THTMLCheckBox;
    ckbLObad_dbGE: THTMLCheckBox;
    ckbLOgraphicGE: THTMLCheckBox;
    ckbLOallGE: THTMLCheckBox;
    ckbAffinityGE: THTMLCheckBox;
    cbxAffinityGE: TAdvSmoothComboBox;
    edtCmdLineGE: TAdvEdit;
    cbxPriorityGE: TAdvSmoothComboBox;
    ckbPriorityGE: THTMLCheckBox;
    chkGOSidesGE: THTMLCheckList;
    ckbIterSaveGTGE: THTMLCheckBox;
    edtIterSaveGTIntervalGE: TAdvSpinEdit;
    HTMLabel1: THTMLabel;
    edtIterSaveGTSavesGE: TAdvSpinEdit;
    HTMLabel2: THTMLabel;
    ckbLOunitGE: THTMLCheckBox;
    pnlDebugOptsGE: TAdvSmoothPanel;
    ckbIDLGE: THTMLCheckBox;
    ckbIDLI32501GE: THTMLCheckBox;
    ckbLogMLFNGE: THTMLCheckBox;
    edtLogMLFNGE: TAdvFileNameEdit;
    ckbIterSaveGTFNGE: THTMLCheckBox;
    edtIterFNGE: TAdvFileNameEdit;
    pnlWindowHideGE: TAdvSmoothPanel;
    ckbWHGE: THTMLCheckBox;
    ckbWHGroupGE: THTMLCheckBox;
    ckbWHUnitGE: THTMLCheckBox;
    ckbWHStratMapGE: THTMLCheckBox;
    ckbWHMiniReportGE: THTMLCheckBox;
    ckbWHMessageLogGE: THTMLCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure edtHCDirGEChange(Sender: TObject);
    procedure edtGENameChange(Sender: TObject);
    procedure ckbAutoPlayGEClick(Sender: TObject);
    procedure radBSGEClick(Sender: TObject);
    procedure ckbBSFNGEClick(Sender: TObject);
    procedure ckbBSNumGEClick(Sender: TObject);
    procedure ckbScenNumGEClick(Sender: TObject);
    procedure ckbScenFNGEClick(Sender: TObject);
    procedure edtBSFNGEChange(Sender: TObject);
    procedure edtScenFNGEChange(Sender: TObject);
    procedure ckbCDBresFNGEClick(Sender: TObject);
    procedure ckbCDBrsrFNGEClick(Sender: TObject);
    procedure edtCDBresFNGEChange(Sender: TObject);
    procedure edtCDBrsrFNGEChange(Sender: TObject);
    procedure ckbSavFNGEClick(Sender: TObject);
    procedure edtSavFNGEChange(Sender: TObject);
    procedure edtLogFNGEChange(Sender: TObject);
    procedure ckbIgnoreRegGEClick(Sender: TObject);
    procedure ckbSubAIGEClick(Sender: TObject);
    procedure ckbEff115GEClick(Sender: TObject);
    procedure ckbIterSaveGEClick(Sender: TObject);
    procedure ckbSavIntGEClick(Sender: TObject);
    procedure edtSavIntGEChange(Sender: TObject);
    procedure ckbGOGEClick(Sender: TObject);
    procedure ckbLOGEClick(Sender: TObject);
    procedure ckbLOinit_annexGEClick(Sender: TObject);
    procedure ckbLOac_aiGEClick(Sender: TObject);
    procedure ckbLOsub_aiGEClick(Sender: TObject);
    procedure ckbLOemcon_aiGEClick(Sender: TObject);
    procedure ckbLOsonarGEClick(Sender: TObject);
    procedure ckbLOrefuelGEClick(Sender: TObject);
    procedure ckbLOmissionGEClick(Sender: TObject);
    procedure ckbLOinterceptGEClick(Sender: TObject);
    procedure ckbLOres_fileGEClick(Sender: TObject);
    procedure ckbLOloadGEClick(Sender: TObject);
    procedure ckbLOradarGEClick(Sender: TObject);
    procedure ckbLOecmGEClick(Sender: TObject);
    procedure ckbLOmissileGEClick(Sender: TObject);
    procedure ckbLOareadefGEClick(Sender: TObject);
    procedure ckbLOperfGEClick(Sender: TObject);
    procedure ckbLObad_dbGEClick(Sender: TObject);
    procedure ckbLOgraphicGEClick(Sender: TObject);
    procedure ckbLOallGEClick(Sender: TObject);
    procedure ckbAffinityGEClick(Sender: TObject);
    procedure btnLaunchGEClick(Sender: TObject);
    procedure ckbLogFNGEClick(Sender: TObject);
    procedure cbxGOSideGEItemSelected(Sender: TObject; itemindex: Integer);
    procedure cbxGONukeRelGEItemSelected(Sender: TObject; itemindex: Integer);
    procedure cbxGOSnorkSubGEItemSelected(Sender: TObject; itemindex: Integer);
    procedure cbxGORealWeathGEItemSelected(Sender: TObject; itemindex: Integer);
    procedure cbxGOMaintFailGEItemSelected(Sender: TObject; itemindex: Integer);
    procedure cbxGOFullOrdGEItemSelected(Sender: TObject; itemindex: Integer);
    procedure cbxGOFormPatGEItemSelected(Sender: TObject; itemindex: Integer);
    procedure cbxGOExitGEItemSelected(Sender: TObject; itemindex: Integer);
    procedure cbxGOTimeCompGEItemSelected(Sender: TObject; itemindex: Integer);
    procedure cbxAffinityGEItemSelected(Sender: TObject; itemindex: Integer);
    procedure cbxScenNumGEItemSelected(Sender: TObject; itemindex: Integer);
    procedure cbxBSNumGEItemSelected(Sender: TObject; itemindex: Integer);
    procedure ckbPriorityGEClick(Sender: TObject);
    procedure cbxPriorityGEItemSelected(Sender: TObject; itemindex: Integer);
    procedure chkGOSidesGECheckClick(Sender: TObject; Index: Integer);
    procedure ckbIterSaveGTGEClick(Sender: TObject);
    procedure edtIterSaveGTIntervalGEChange(Sender: TObject);
    procedure edtIterSaveGTSavesGEChange(Sender: TObject);
    procedure ckbLOunitGEClick(Sender: TObject);
    procedure ckbIDLGEClick(Sender: TObject);
    procedure ckbIDLI32501GEClick(Sender: TObject);
    procedure ckbIterSaveGTFNGEClick(Sender: TObject);
    procedure edtIterFNGEChange(Sender: TObject);
    procedure ckbLogMLFNGEClick(Sender: TObject);
    procedure edtLogMLFNGEChange(Sender: TObject);
    procedure ckbWHGroupGEClick(Sender: TObject);
    procedure ckbWHUnitGEClick(Sender: TObject);
    procedure ckbWHStratMapGEClick(Sender: TObject);
    procedure ckbWHMiniReportGEClick(Sender: TObject);
    procedure ckbWHMessageLogGEClick(Sender: TObject);
    procedure ckbWHGEClick(Sender: TObject);
  private
    { Private declarations }
    strCmdLine: String;
    intGOSidesGE: Integer;
    procedure BuildCommandLineGE();
    procedure SettingsLoad();
    procedure SettingsSave();
  public
    { Public declarations }
    function IsFloat(S: String): Boolean;
  end;

var
  frmMain1: TfrmMain1;

implementation

{$R *.dfm}

{*** ALE 20090705 Is the string representing a float? ***}
function TfrmMain1.IsFloat(S: String): Boolean;
begin
  try
    Result := True;
    StrToFloat(S);
  except on E: EConvertError do
    Result := False;
  end;
end;

{*** ALE 20090703 Compile command line from the options ***}
procedure TfrmMain1.btnLaunchGEClick(Sender: TObject);
begin
  if (FileExists(edtHCDirGE.Text + '\' + edtGEName.Text)) then
  begin
    ExecuteFile('"' + edtHCDirGE.Text + '\' + edtGEName.Text + '"',
     strCmdLine, edtHCDirGE.Text, SW_SHOW);
  end
  else
  begin
    MessageDlg('Listed GE file does not exist, please enter a valid exe', mtInformation, [mbOK], 0);
  end;
end;

procedure TfrmMain1.BuildCommandLineGE;
var
  strLOGE: string;
  blnLOGE: boolean;
  strIDLGE: String;
  blnIDLGE: Boolean;
  strWHGE: String;
  blnWHGE: Boolean;
begin
  strCmdLine := '';

  if (ckbLogFNGE.Checked AND (DirectoryExists(ExtractFilePath(edtLogFNGE.Text)))) then
  begin
    strCmdLine := strCmdLine + '-f "' + edtLogFNGE.Text + '" ';
  end;

  if (ckbLOGE.Checked) then
  begin
    blnLOGE := False;
    if (ckbLOallGE.Checked) then
    begin
      strCmdLine := strCmdLine + '-l all ';
    end
    else
    begin
      if (ckbLOinit_annexGE.Checked) then
      begin
        strLOGE := strLOGE + '-l init_annex ';
        blnLOGE := True;
      end;
      if (ckbLOac_aiGE.Checked) then
      begin
        strLOGE := strLOGE + '-l ac_ai ';
        blnLOGE := True;
      end;
      if (ckbLOsub_aiGE.Checked) then
      begin
        strLOGE := strLOGE + '-l sub_ai ';
        blnLOGE := True;
      end;
      if (ckbLOemcon_aiGE.Checked) then
      begin
        strLOGE := strLOGE + '-l emcon_ai ';
        blnLOGE := True;
      end;
      if (ckbLOsonarGE.Checked) then
      begin
        strLOGE := strLOGE + '-l sonar ';
        blnLOGE := True;
      end;
      if (ckbLOrefuelGE.Checked) then
      begin
        strLOGE := strLOGE + '-l refuel ';
        blnLOGE := True;
      end;
      if (ckbLOmissionGE.Checked) then
      begin
        strLOGE := strLOGE + '-l mission ';
        blnLOGE := True;
      end;
      if (ckbLOinterceptGE.Checked) then
      begin
        strLOGE := strLOGE + '-l intercept ';
        blnLOGE := True;
      end;
      if (ckbLOres_fileGE.Checked) then
      begin
        strLOGE := strLOGE + '-l res_file ';
        blnLOGE := True;
      end;
      if (ckbLOloadGE.Checked) then
      begin
        strLOGE := strLOGE + '-l load ';
        blnLOGE := True;
      end;
      if (ckbLOradarGE.Checked) then
      begin
        strLOGE := strLOGE + '-l radar ';
        blnLOGE := True;
      end;
      if (ckbLOecmGE.Checked) then
      begin
        strLOGE := strLOGE + '-l ecm ';
        blnLOGE := True;
      end;
      if (ckbLOmissileGE.Checked) then
      begin
        strLOGE := strLOGE + '-l missile ';
        blnLOGE := True;
      end;
      if (ckbLOareadefGE.Checked) then
      begin
        strLOGE := strLOGE + '-l areadef ';
        blnLOGE := True;
      end;
      if (ckbLOperfGE.Checked) then
      begin
        strLOGE := strLOGE + '-l perf ';
        blnLOGE := True;
      end;
      if (ckbLObad_dbGE.Checked) then
      begin
        strLOGE := strLOGE + '-l bad_db ';
        blnLOGE := True;
      end;
      if (ckbLOgraphicGE.Checked) then
      begin
        strLOGE := strLOGE + '-l graphic ';
        blnLOGE := True;
      end;
      if (ckbLOunitGE.Checked) then
      begin
        strLOGE := strLOGE + '-l unit ';
        blnLOGE := True;
      end;
      if (blnLOGE) then
        strCmdLine := strCmdLine + strLOGE;
    end;
  end;

  if (ckbIDLGE.Checked) then
  begin
    blnIDLGE := False;
    if (ckbIDLI32501GE.Checked) then
    begin
      strIDLGE := strIDLGE + '-I I32501 ';
      blnIDLGE := True;
    end;
    if (blnIDLGE) then
      strCmdLine := strCmdLine + strIDLGE;
  end;

  if (ckbWHGE.Checked) then
  begin
    blnWHGE := False;
    if (ckbWHGroupGE.Checked) then
    begin
      strWHGE := strWHGE + '-h group ';
      blnWHGE := True;
    end;
    if (ckbWHUnitGE.Checked) then
    begin
      strWHGE := strWHGE + '-h unit ';
      blnWHGE := True;
    end;
    if (ckbWHStratMapGE.Checked) then
    begin
      strWHGE := strWHGE + '-h strategicmap ';
      blnWHGE := True;
    end;
    if (ckbWHMiniReportGE.Checked) then
    begin
      strWHGE := strWHGE + '-h minireport ';
      blnWHGE := True;
    end;
    if (ckbWHMessageLogGE.Checked) then
    begin
      strWHGE := strWHGE + '-h messagelog ';
      blnWHGE := True;
    end;
    if (blnWHGE) then
      strCmdLine := strCmdLine + strWHGE;
  end;

  if (ckbIgnoreRegGE.Checked) then
    strCmdLine := strCmdLine + '-i ';

  if (ckbAutoPlayGE.Checked) then
    strCmdLine := strCmdLine + '-a ';

  if (ckbSavIntGE.Checked AND (IsFloat(edtSavIntGE.Text))) then
  begin
    strCmdLine := strCmdLine + '-t ' + edtSavIntGE.Text + ' ';
  end;

  if (ckbIterSaveGE.Checked) then
    strCmdLine := strCmdLine + '-s ';

  if (ckbIterSaveGTGE.Checked) then
  begin
    strCmdLine := strCmdLine + '-S'
     + Format('%0.5d', [edtIterSaveGTIntervalGE.Value])
     + Format('%0.4d ', [edtIterSaveGTSavesGE.Value]);
    if (ckbIterSaveGTFNGE.Checked AND (edtIterFNGE.FileName <> '')) then
    begin
      strCmdLine := strCmdLine + '-k ' + edtIterFNGE.FileName + ' ';
    end;
  end;

  if (ckbLogMLFNGE.Checked AND (edtLogMLFNGE.FileName <> '')) then
  begin
    strCmdLine := strCmdLine + '-m ' + edtLogMLFNGE.FileName + ' ';
  end;

  if (ckbSubAIGE.Checked) then
    strCmdLine := strCmdLine + '-x ';

  if (ckbEff115GE.Checked) then
    strCmdLine := strCmdLine + '-e ';

  if (ckbBSNumGE.Checked AND (cbxBSNumGE.SelectedItemIndex <> -1)) then
  begin
    case cbxBSNumGE.SelectedItemIndex of
      00: strCmdLine := strCmdLine + '-b 1 ';
      01: strCmdLine := strCmdLine + '-b 2 ';
      02: strCmdLine := strCmdLine + '-b 3 ';
      03: strCmdLine := strCmdLine + '-b 4 ';
      04: strCmdLine := strCmdLine + '-b 6 ';
      05: strCmdLine := strCmdLine + '-b 7 ';
      06: strCmdLine := strCmdLine + '-b 8 ';
      07: strCmdLine := strCmdLine + '-b 9 ';
      08: strCmdLine := strCmdLine + '-b 10 ';
      09: strCmdLine := strCmdLine + '-b 11 ';
      10: strCmdLine := strCmdLine + '-b 12 ';
      11: strCmdLine := strCmdLine + '-b 13 ';
      12: strCmdLine := strCmdLine + '-b 14 ';
      13: strCmdLine := strCmdLine + '-b 15 ';
      14: strCmdLine := strCmdLine + '-b 16 ';
      15: strCmdLine := strCmdLine + '-b 17 ';
      16: strCmdLine := strCmdLine + '-b 18 ';
      17: strCmdLine := strCmdLine + '-b 19 ';
      18: strCmdLine := strCmdLine + '-b 20 ';
      19: strCmdLine := strCmdLine + '-b 21 ';
      20: strCmdLine := strCmdLine + '-b 22 ';
      21: strCmdLine := strCmdLine + '-b 23 ';
      22: strCmdLine := strCmdLine + '-b 24 ';
      23: strCmdLine := strCmdLine + '-b 25 ';
      24: strCmdLine := strCmdLine + '-b 26 ';
      25: strCmdLine := strCmdLine + '-b 27 ';
      26: strCmdLine := strCmdLine + '-b 28 ';
      27: strCmdLine := strCmdLine + '-b 29 ';
      28: strCmdLine := strCmdLine + '-b 30 ';
      29: strCmdLine := strCmdLine + '-b 31 ';
      30: strCmdLine := strCmdLine + '-b 32 '; // 32 - Malacca Strait
      31: strCmdLine := strCmdLine + '-b 35 ';
    end;
  end
  else if (ckbBSFNGE.Checked AND (FileExists(edtBSFNGE.Text))) then
  begin
    strCmdLine := strCmdLine + '-b "' + edtBSFNGE.Text + '" ';
  end;

  if (ckbScenNumGE.Checked AND (cbxScenNumGE.SelectedItemIndex <> -1)) then
  begin
    case cbxScenNumGE.SelectedItemIndex of
      00: strCmdLine := strCmdLine + '-c 1 ';
      01: strCmdLine := strCmdLine + '-c 2 ';
      02: strCmdLine := strCmdLine + '-c 3 ';
      03: strCmdLine := strCmdLine + '-c 4 ';
      04: strCmdLine := strCmdLine + '-c 5 ';
      05: strCmdLine := strCmdLine + '-c 6 ';
      06: strCmdLine := strCmdLine + '-c 7 ';
      07: strCmdLine := strCmdLine + '-c 8 ';
      08: strCmdLine := strCmdLine + '-c 9 ';
      09: strCmdLine := strCmdLine + '-c 10 ';
      10: strCmdLine := strCmdLine + '-c 11 ';
      11: strCmdLine := strCmdLine + '-c 12 ';
      12: strCmdLine := strCmdLine + '-c 13 ';
      13: strCmdLine := strCmdLine + '-c 14 ';
      14: strCmdLine := strCmdLine + '-c 15 ';
      15: strCmdLine := strCmdLine + '-c 16 ';
      16: strCmdLine := strCmdLine + '-c 17 ';
      17: strCmdLine := strCmdLine + '-c 18 ';
      18: strCmdLine := strCmdLine + '-c 19 ';
      19: strCmdLine := strCmdLine + '-c 20 ';
      20: strCmdLine := strCmdLine + '-c 21 ';
      21: strCmdLine := strCmdLine + '-c 22 ';
    end;
  end
  else if (ckbScenFNGE.Checked AND (FileExists(edtScenFNGE.Text))) then
  begin
    strCmdLine := strCmdLine + '-c "' + edtScenFNGE.Text + '" ';
  end;

  if (ckbSavFNGE.Checked AND (FileExists(edtSavFNGE.Text))) then
  begin
    strCmdLine := strCmdLine + '-v "' + edtSavFNGE.Text + '" ';
  end;

  if (ckbCDBresFNGE.Checked AND (FileExists(edtCDBresFNGE.Text))) then
  begin
    strCmdLine := strCmdLine + '-d "' + edtCDBresFNGE.Text + '" ';
  end;

  if (ckbCDBrsrFNGE.Checked AND (FileExists(edtCDBrsrFNGE.Text))) then
  begin
    strCmdLine := strCmdLine + '-r "' + edtCDBrsrFNGE.Text + '" ';
  end;

  if (ckbGOGE.Checked) then
  begin
    if (chkGOSidesGE.Visible = False) then
    begin
      strCmdLine := strCmdLine + '-g ' + Format('%d%d%d%d%d%d%d%d%d',
       [cbxGOSideGE.SelectedItemIndex, cbxGONukeRelGE.SelectedItemIndex,
        cbxGOSnorkSubGE.SelectedItemIndex, cbxGORealWeathGE.SelectedItemIndex,
        cbxGOMaintFailGE.SelectedItemIndex, cbxGOFullOrdGE.SelectedItemIndex,
        cbxGOFormPatGE.SelectedItemIndex, cbxGOExitGE.SelectedItemIndex,
        cbxGOTimeCompGE.SelectedItemIndex]) + ' ';
    end
    else
    begin
      strCmdLine := strCmdLine + '-g ' + Format('%d%d%d%d%d%d%d%d%d',
       [intGOSidesGE, cbxGONukeRelGE.SelectedItemIndex,
        cbxGOSnorkSubGE.SelectedItemIndex, cbxGORealWeathGE.SelectedItemIndex,
        cbxGOMaintFailGE.SelectedItemIndex, cbxGOFullOrdGE.SelectedItemIndex,
        cbxGOFormPatGE.SelectedItemIndex, cbxGOExitGE.SelectedItemIndex,
        cbxGOTimeCompGE.SelectedItemIndex]) + ' ';
    end;
  end;

  if (ckbAffinityGE.Checked AND (cbxAffinityGE.SelectedItemIndex <> -1)) then
  begin
    case cbxAffinityGE.SelectedItemIndex of
     0: strCmdLine := strCmdLine + '-p 1 ';
     1: strCmdLine := strCmdLine + '-p 2 ';
     2: strCmdLine := strCmdLine + '-p 4 ';
     3: strCmdLine := strCmdLine + '-p 8 ';
    end;
  end;

  if (ckbPriorityGE.Checked AND (cbxPriorityGE.SelectedItemIndex <> -1)) then
  begin
    case cbxPriorityGE.SelectedItemIndex of
     0: strCmdLine := strCmdLine + '-u -2 ';
     1: strCmdLine := strCmdLine + '-u -1 ';
     2: strCmdLine := strCmdLine + '-u 0 ';
     3: strCmdLine := strCmdLine + '-u 1 ';
     4: strCmdLine := strCmdLine + '-u 2 ';
    end;
  end;

  edtCmdLineGE.Text := 'Command Line: "' + edtHCDirGE.Text + '\'
   + edtGEName.Text + '" ' + strCmdLine;
end;

procedure TfrmMain1.cbxAffinityGEItemSelected(Sender: TObject;
  itemindex: Integer);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.cbxBSNumGEItemSelected(Sender: TObject; itemindex: Integer);
begin
  if (ckbBSFNGE.Checked) then
    ckbBSFNGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.cbxGONukeRelGEItemSelected(Sender: TObject;
  itemindex: Integer);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.cbxGOSideGEItemSelected(Sender: TObject;
  itemindex: Integer);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.cbxGOSnorkSubGEItemSelected(Sender: TObject;
  itemindex: Integer);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.cbxGOTimeCompGEItemSelected(Sender: TObject;
  itemindex: Integer);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.cbxPriorityGEItemSelected(Sender: TObject;
  itemindex: Integer);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.cbxGOExitGEItemSelected(Sender: TObject;
  itemindex: Integer);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.cbxGOFormPatGEItemSelected(Sender: TObject;
  itemindex: Integer);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.cbxGOFullOrdGEItemSelected(Sender: TObject;
  itemindex: Integer);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.cbxGOMaintFailGEItemSelected(Sender: TObject;
  itemindex: Integer);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.cbxGORealWeathGEItemSelected(Sender: TObject;
  itemindex: Integer);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.cbxScenNumGEItemSelected(Sender: TObject;
  itemindex: Integer);
begin
  if (ckbScenFNGE.Checked) then
    ckbScenFNGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.chkGOSidesGECheckClick(Sender: TObject; Index: Integer);
var
  intSide: Integer;
begin
  intGOSidesGE := 0;

  for intSide := 0 to chkGOSidesGE.Items.Count - 1 do
  begin
    if (chkGOSidesGE.Checked[intSide]) then
      intGOSidesGE := intGOSidesGE + Trunc(IntPower(2.0, intSide));
  end;
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbAffinityGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbAutoPlayGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbBSFNGEClick(Sender: TObject);
begin
  if (ckbBSNumGE.Checked) then
    ckbBSNumGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbBSNumGEClick(Sender: TObject);
begin
  if (ckbBSFNGE.Checked) then
    ckbBSFNGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbCDBresFNGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbCDBrsrFNGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbEff115GEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbIDLGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbIDLI32501GEClick(Sender: TObject);
begin
  if ckbIDLI32501GE.Checked then
  begin
    if NOT ckbIDLGE.Checked then
      ckbIDLGE.Checked := True;
  end
  else
  begin
    if ckbIDLGE.Checked then
      ckbIDLGE.Checked := False;
  end;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbIgnoreRegGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbIterSaveGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbIterSaveGTFNGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbIterSaveGTGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOac_aiGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOallGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
  begin
    // ALE 20090706 uncheck the rest
    ckbLOinit_annexGE.Checked := False;
    ckbLOac_aiGE.Checked := False;
    ckbLOsub_aiGE.Checked := False;
    ckbLOemcon_aiGE.Checked := False;
    ckbLOsonarGE.Checked := False;
    ckbLOrefuelGE.Checked := False;
    ckbLOmissionGE.Checked := False;
    ckbLOinterceptGE.Checked := False;
    ckbLOres_fileGE.Checked := False;
    ckbLOloadGE.Checked := False;
    ckbLOradarGE.Checked := False;
    ckbLOecmGE.Checked := False;
    ckbLOmissileGE.Checked := False;
    ckbLOareadefGE.Checked := False;
    ckbLOperfGE.Checked := False;
    ckbLObad_dbGE.Checked := False;
    ckbLOgraphicGE.Checked := False;
  end;

  BuildCommandLineGE();

end;

procedure TfrmMain1.ckbLOareadefGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLObad_dbGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOecmGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOemcon_aiGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLogFNGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLogMLFNGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOgraphicGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOinit_annexGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOinterceptGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOloadGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOmissileGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOmissionGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOperfGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOradarGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOrefuelGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOres_fileGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOsonarGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOsub_aiGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbLOunitGEClick(Sender: TObject);
begin
  if (ckbLOallGE.Checked) then
    ckbLOallGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbPriorityGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbSavFNGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbSavIntGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbScenFNGEClick(Sender: TObject);
begin
  if (ckbScenNumGE.Checked) then
    ckbScenNumGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbScenNumGEClick(Sender: TObject);
begin
  if (ckbScenFNGE.Checked) then
    ckbScenFNGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbSubAIGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbWHGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbWHGroupGEClick(Sender: TObject);
begin
  if ckbWHGroupGE.Checked then
  begin
    if NOT ckbWHGE.Checked then
      ckbWHGE.Checked := True;
  end;
  // ALE 20250615 would be nice to have an else here looking for the
  //  other window specific checkboxes to uncheck the main hide-window
  //  checkbox

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbWHMessageLogGEClick(Sender: TObject);
begin
  if ckbWHMessageLogGE.Checked then
  begin
    if NOT ckbWHGE.Checked then
      ckbWHGE.Checked := True;
  end;
  // ALE 20250615 would be nice to have an else here looking for the
  //  other window specific checkboxes to uncheck the main hide-window
  //  checkbox

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbWHMiniReportGEClick(Sender: TObject);
begin
  if ckbWHMiniReportGE.Checked then
  begin
    if NOT ckbWHGE.Checked then
      ckbWHGE.Checked := True;
  end;
  // ALE 20250615 would be nice to have an else here looking for the
  //  other window specific checkboxes to uncheck the main hide-window
  //  checkbox

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbWHStratMapGEClick(Sender: TObject);
begin
  if ckbWHStratMapGE.Checked then
  begin
    if NOT ckbWHGE.Checked then
      ckbWHGE.Checked := True;
  end;
  // ALE 20250615 would be nice to have an else here looking for the
  //  other window specific checkboxes to uncheck the main hide-window
  //  checkbox

  BuildCommandLineGE();
end;

procedure TfrmMain1.ckbWHUnitGEClick(Sender: TObject);
begin
  if ckbWHUnitGE.Checked then
  begin
    if NOT ckbWHGE.Checked then
      ckbWHGE.Checked := True;
  end;
  // ALE 20250615 would be nice to have an else here looking for the
  //  other window specific checkboxes to uncheck the main hide-window
  //  checkbox

  BuildCommandLineGE();

end;

procedure TfrmMain1.edtBSFNGEChange(Sender: TObject);
begin
  if (ckbBSNumGE.Checked) then
    ckbBSNumGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.edtCDBresFNGEChange(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.edtCDBrsrFNGEChange(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.edtGENameChange(Sender: TObject);
var
  lVersion: String;
begin
  if FileExists(edtHCDirGE.Text + '\' + edtGEName.Text) then
  begin
    lVersion := CICGetAppVersionStr(edtHCDirGE.Text + '\' + edtGEName.Text);
    // ALE 20140520 Added < 2014.001 check so that new stable beta GEs will
    //  be fine.
    if ((lVersion > '2011.002')
     AND (lVersion < '2014.001')) then
    begin
      chkGOSidesGE.Visible := True;
      cbxGOSideGE.Visible := False;
    end
    else
    begin
      chkGOSidesGE.Visible := False;
      cbxGOSideGE.Visible := True;
    end;
    // ALE 20220921 Issue-specific debugging and logging
    if (lVersion >= '2022.0.1.5') then
    begin
      pnlDebugOptsGE.Visible := True;
    end
    else
    begin
      pnlDebugOptsGE.Visible := False;
    end;
    // ALE 20221110 added MessageLog filename and Iterative save base filename
    if (lVersion >= '2022.0.2.5') then
    begin
      ckbLogMLFNGE.Visible := True;
      edtLogMLFNGE.Visible := True;
      ckbIterSaveGTFNGE.Visible := True;
      edtIterFNGE.Visible := True;
    end
    else
    begin
      ckbLogMLFNGE.Visible := False;
      edtLogMLFNGE.Visible := False;
      ckbIterSaveGTFNGE.Visible := False;
      edtIterFNGE.Visible := False;
    end;

  end;
  BuildCommandLineGE();
end;

procedure TfrmMain1.edtHCDirGEChange(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.edtIterFNGEChange(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.edtIterSaveGTIntervalGEChange(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.edtIterSaveGTSavesGEChange(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.edtLogFNGEChange(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.edtLogMLFNGEChange(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.edtSavFNGEChange(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.edtSavIntGEChange(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.edtScenFNGEChange(Sender: TObject);
begin
  if (ckbScenNumGE.Checked) then
    ckbScenNumGE.Checked := False;

  BuildCommandLineGE();
end;

procedure TfrmMain1.FormCreate(Sender: TObject);
var
  regHKCU: TRegistry;
begin
  Caption := Caption + Exe1.FileVersion + ' on ' + Exe1.OSName;

  SettingsLoad;
  // ALE 20100428 read battleset path and use that as default base dir
  if NOT DirectoryExists(edtHCDirGE.Text) then
  begin
    regHKCU := TRegistry.Create;
    regHKCU.RootKey := HKEY_CURRENT_USER;

    if regHKCU.OpenKeyReadOnly('Software\Matrix Games\HCE\Options\BattlesetPath') then
    begin
      edtHCDirGE.Text := regHKCU.ReadString('')
    end;
    regHKCU.CloseKey;
    regHKCU.Free;
  end;

  if NOT DirectoryExists(edtHCDirGE.Text) then
    edtHCDirGE.Text := ExtractFilePath(Application.ExeName);
  if (edtHCDirGE.Text[Length(edtHCDirGE.Text)] = '\') then
    edtHCDirGE.Text := Copy(edtHCDirGE.Text, 1, Length(edtHCDirGE.Text) - 1);

  edtBSFNGE.InitialDir      := edtHCDirGE.Text;
  edtScenFNGE.InitialDir    := edtHCDirGE.Text;
  edtCDBresFNGE.InitialDir  := edtHCDirGE.Text;
  edtCDBrsrFNGE.InitialDir  := edtHCDirGE.Text;
  edtSavFNGE.InitialDir     := edtHCDirGE.Text;
  edtLogFNGE.InitialDir     := edtHCDirGE.Text;
  edtLogMLFNGE.InitialDir   := edtHCDirGE.Text;
  edtIterFNGE.InitialDir    := edtHCDirGE.Text;

  edtGEName.Change;

  BuildCommandLineGE(); // ALE 20100428 since we load settings from ini
end;

procedure TfrmMain1.FormDestroy(Sender: TObject);
begin
  SettingsSave;

  if (edtHCDirGE.OleDropTarget) then
    RevokeDragDrop(edtHCDirGE.Handle);
  if (edtBSFNGE.OleDropTarget) then
    RevokeDragDrop(edtBSFNGE.Handle);
  if (edtScenFNGE.OleDropTarget) then
    RevokeDragDrop(edtScenFNGE.Handle);
  if (edtCDBresFNGE.OleDropTarget) then
    RevokeDragDrop(edtCDBresFNGE.Handle);
  if (edtCDBrsrFNGE.OleDropTarget) then
    RevokeDragDrop(edtCDBrsrFNGE.Handle);
  if (edtSavFNGE.OleDropTarget) then
    RevokeDragDrop(edtSavFNGE.Handle);
  if (edtLogFNGE.OleDropTarget) then
    RevokeDragDrop(edtLogFNGE.Handle);
end;

procedure TfrmMain1.ckbGOGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.radBSGEClick(Sender: TObject);
begin
  BuildCommandLineGE();
end;

procedure TfrmMain1.SettingsLoad;
var
  iniSettings: TIniFile;
begin
  iniSettings := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Launcher.ini');

  edtHCDirGE.Text := iniSettings.ReadString('Main', 'DirHC', edtHCDirGE.Text);
  edtGEName.Text := iniSettings.ReadString('Main', 'FileGE', edtGEName.Text);

  ckbAutoPlayGE.Checked := iniSettings.ReadBool('GECLO', 'blnAutoPlay', ckbAutoPlayGE.Checked);
  ckbIgnoreRegGE.Checked := iniSettings.ReadBool('GECLO', 'blnRegIgnore', ckbIgnoreRegGE.Checked);
  ckbSubAIGE.Checked := iniSettings.ReadBool('GECLO', 'blnSubAIDis', ckbSubAIGE.Checked);
  ckbEff115GE.Checked := iniSettings.ReadBool('GECLO', 'blnEff115Old', ckbEff115GE.Checked);
  ckbBSFNGE.Checked := iniSettings.ReadBool('GECLO', 'blnBSFN', ckbBSFNGE.Checked);
  ckbScenFNGE.Checked := iniSettings.ReadBool('GECLO', 'blnScenFN', ckbScenFNGE.Checked);
  ckbCDBresFNGE.Checked := iniSettings.ReadBool('GECLO', 'blnCDBresFN', ckbCDBresFNGE.Checked);
  ckbSavFNGE.Checked := iniSettings.ReadBool('GECLO', 'blnSaveFN', ckbSavFNGE.Checked);
  ckbIterSaveGE.Checked := iniSettings.ReadBool('GECLO', 'blnSaveIter', ckbIterSaveGE.Checked);
  ckbSavIntGE.Checked := iniSettings.ReadBool('GECLO', 'blnSaveAuto', ckbSavIntGE.Checked);
  ckbBSNumGE.Checked := iniSettings.ReadBool('GECLO', 'blnBSNum', ckbBSNumGE.Checked);
  ckbScenNumGE.Checked := iniSettings.ReadBool('GECLO', 'blnScenNum', ckbScenNumGE.Checked);
  ckbCDBrsrFNGE.Checked := iniSettings.ReadBool('GECLO', 'blnCDBrsrFN', ckbCDBrsrFNGE.Checked);
  ckbLogFNGE.Checked := iniSettings.ReadBool('GECLO', 'blnLogFN', ckbLogFNGE.Checked);
  ckbAffinityGE.Checked := iniSettings.ReadBool('GECLO', 'blnCPUAff', ckbAffinityGE.Checked);
  ckbPriorityGE.Checked := iniSettings.ReadBool('GECLO', 'blnProcPrio', ckbPriorityGE.Checked);

  edtBSFNGE.FileName := iniSettings.ReadString('GECLO', 'edtBSFN', edtBSFNGE.FileName);
  edtScenFNGE.FileName := iniSettings.ReadString('GECLO', 'edtScenFN', edtScenFNGE.FileName);
  edtCDBresFNGE.FileName := iniSettings.ReadString('GECLO', 'edtCDBresFN', edtCDBresFNGE.FileName);
  edtCDBrsrFNGE.FileName := iniSettings.ReadString('GECLO', 'edtCDBrsrFN', edtCDBrsrFNGE.FileName);
  edtSavFNGE.FileName := iniSettings.ReadString('GECLO', 'edtSavFN', edtSavFNGE.FileName);
  edtSavIntGE.Text := iniSettings.ReadString('GECLO', 'edtSavAuto', edtSavIntGE.Text);
  edtLogFNGE.FileName := iniSettings.ReadString('GECLO', 'edtLogFN', edtLogFNGE.FileName);

  cbxBSNumGE.SelectedItemIndex := iniSettings.ReadInteger('GECLO', 'cbxBSNum', cbxBSNumGE.SelectedItemIndex);
  cbxScenNumGE.SelectedItemIndex := iniSettings.ReadInteger('GECLO', 'cbxScenNum', cbxScenNumGE.SelectedItemIndex);
  cbxAffinityGE.SelectedItemIndex := iniSettings.ReadInteger('GECLO', 'cbxCPUAff', cbxAffinityGE.SelectedItemIndex);
  cbxPriorityGE.SelectedItemIndex := iniSettings.ReadInteger('GECLO', 'cbxProcPrio', cbxPriorityGE.SelectedItemIndex);
  ckbIterSaveGTGE.Checked := iniSettings.ReadBool('GECLO', 'IterSaveGT', ckbIterSaveGTGE.Checked);
  edtIterSaveGTIntervalGE.Value := iniSettings.ReadInteger('GECLO', 'IterSaveGTInterval', edtIterSaveGTIntervalGE.Value);
  edtIterSaveGTSavesGE.Value := iniSettings.ReadInteger('GECLO', 'IterSaveGTSaves', edtIterSaveGTSavesGE.Value);

  ckbGOGE.Checked := iniSettings.ReadBool('GECLOGO', 'blnGO', ckbGOGE.Checked);
  intGOSidesGE := iniSettings.ReadInteger('GECLOGO', 'intGOSidesGE', 1); // ALE 20110414 default to Blue only
  if ((intGOSidesGE and 1) > 0) then
    chkGOSidesGE.Checked[0] := True;
  if ((intGOSidesGE and 2) > 0) then
    chkGOSidesGE.Checked[1] := True;
  if ((intGOSidesGE and 4) > 0) then
    chkGOSidesGE.Checked[2] := True;
  cbxGOSideGE.SelectedItemIndex := iniSettings.ReadInteger('GECLOGO', 'cbxGOSide', cbxGOSideGE.SelectedItemIndex);
  cbxGONukeRelGE.SelectedItemIndex := iniSettings.ReadInteger('GECLOGO', 'cbxGONukeRel', cbxGONukeRelGE.SelectedItemIndex);
  cbxGOSnorkSubGE.SelectedItemIndex := iniSettings.ReadInteger('GECLOGO', 'cbxGOSnorkSub', cbxGOSnorkSubGE.SelectedItemIndex);
  cbxGORealWeathGE.SelectedItemIndex :=iniSettings.ReadInteger('GECLOGO', 'cbxGORealWeath', cbxGORealWeathGE.SelectedItemIndex);
  cbxGOMaintFailGE.SelectedItemIndex := iniSettings.ReadInteger('GECLOGO', 'cbxGOMaintFail', cbxGOMaintFailGE.SelectedItemIndex);
  cbxGOFullOrdGE.SelectedItemIndex := iniSettings.ReadInteger('GECLOGO', 'cbxGOFullOrd', cbxGOFullOrdGE.SelectedItemIndex);
  cbxGOFormPatGE.SelectedItemIndex := iniSettings.ReadInteger('GECLOGO', 'cbxGOFormPat', cbxGOFormPatGE.SelectedItemIndex);
  cbxGOExitGE.SelectedItemIndex := iniSettings.ReadInteger('GECLOGO', 'cbxGOExit', cbxGOExitGE.SelectedItemIndex);
  cbxGOTimeCompGE.SelectedItemIndex := iniSettings.ReadInteger('GECLOGO', 'cbxGOTimeComp', cbxGOTimeCompGE.SelectedItemIndex);

  ckbLOGE.Checked := iniSettings.ReadBool('GECLOLO', 'blnLO', ckbLOGE.Checked);
  ckbLOinit_annexGE.Checked := iniSettings.ReadBool('GECLOLO', 'blnLOinit_annex', ckbLOinit_annexGE.Checked);
  ckbLOac_aiGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOac_ai', ckbLOac_aiGE.Checked);
  ckbLOsub_aiGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOsub_ai', ckbLOsub_aiGE.Checked);
  ckbLOemcon_aiGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOemcon_ai', ckbLOemcon_aiGE.Checked);
  ckbLOsonarGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOsonar', ckbLOsonarGE.Checked);
  ckbLOrefuelGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOrefuel', ckbLOrefuelGE.Checked);
  ckbLOmissionGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOmission', ckbLOmissionGE.Checked);
  ckbLOinterceptGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOintercept', ckbLOinterceptGE.Checked);
  ckbLOres_fileGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOres_file', ckbLOres_fileGE.Checked);
  ckbLOloadGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOload', ckbLOloadGE.Checked);
  ckbLOradarGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOradar', ckbLOradarGE.Checked);
  ckbLOecmGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOecm', ckbLOecmGE.Checked);
  ckbLOmissileGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOmissile', ckbLOmissileGE.Checked);
  ckbLOareadefGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOareadef', ckbLOareadefGE.Checked);
  ckbLOperfGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOperf', ckbLOperfGE.Checked);
  ckbLObad_dbGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLObad_db', ckbLObad_dbGE.Checked);
  ckbLOgraphicGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOgraphic', ckbLOgraphicGE.Checked);
  ckbLOallGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbLOall', ckbLOallGE.Checked);

  // ALE 20221110 catch up
  ckbIDLGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbIDLGE', ckbIDLGE.Checked);
  ckbIDLI32501GE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbIDLI32501GE', ckbIDLI32501GE.Checked);
  ckbLogMLFNGE.Checked := iniSettings.ReadBool('GECLO', 'ckbLogMLFNGE', ckbLogMLFNGE.Checked);
  edtLogMLFNGE.FileName := iniSettings.ReadString('GECLO', 'edtLogMLFNGE', edtLogMLFNGE.FileName);
  ckbIterSaveGTFNGE.Checked := iniSettings.ReadBool('GECLO', 'ckbIterSaveGTFNGE', ckbIterSaveGTFNGE.Checked);
  edtIterFNGE.FileName := iniSettings.ReadString('GECLO', 'edtIterFNGE', edtIterFNGE.FileName);

  // ALE 20250615 catch up
  ckbWHGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbWHGE', ckbWHGE.Checked);
  ckbWHGroupGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbWHGroupGE', ckbWHGroupGE.Checked);
  ckbWHUnitGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbWHUnitGE', ckbWHUnitGE.Checked);
  ckbWHStratMapGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbWHStratMapGE', ckbWHStratMapGE.Checked);
  ckbWHMiniReportGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbWHMiniReportGE', ckbWHMiniReportGE.Checked);
  ckbWHMessageLogGE.Checked := iniSettings.ReadBool('GECLOLO', 'ckbWHMessageLogGE', ckbWHMessageLogGE.Checked);

  iniSettings.Free;
end;

procedure TfrmMain1.SettingsSave;
var
  iniSettings: TIniFile;
begin
  iniSettings := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Launcher.ini');

  iniSettings.WriteString('Main', 'DirHC', edtHCDirGE.Text);
  iniSettings.WriteString('Main', 'FileGE', edtGEName.Text);

  iniSettings.WriteBool('GECLO', 'blnAutoPlay', ckbAutoPlayGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnRegIgnore', ckbIgnoreRegGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnSubAIDis', ckbSubAIGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnEff115Old', ckbEff115GE.Checked);
  iniSettings.WriteBool('GECLO', 'blnBSFN', ckbBSFNGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnScenFN', ckbScenFNGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnCDBresFN', ckbCDBresFNGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnSaveFN', ckbSavFNGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnSaveIter', ckbIterSaveGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnSaveAuto', ckbSavIntGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnBSNum', ckbBSNumGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnScenNum', ckbScenNumGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnCDBrsrFN', ckbCDBrsrFNGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnLogFN', ckbLogFNGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnCPUAff', ckbAffinityGE.Checked);
  iniSettings.WriteBool('GECLO', 'blnProcPrio', ckbPriorityGE.Checked);

  iniSettings.WriteString('GECLO', 'edtBSFN', edtBSFNGE.FileName);
  iniSettings.WriteString('GECLO', 'edtScenFN', edtScenFNGE.FileName);
  iniSettings.WriteString('GECLO', 'edtCDBresFN', edtCDBresFNGE.FileName);
  iniSettings.WriteString('GECLO', 'edtCDBrsrFN', edtCDBrsrFNGE.FileName);
  iniSettings.WriteString('GECLO', 'edtSavFN', edtSavFNGE.FileName);
  iniSettings.WriteString('GECLO', 'edtSavAuto', edtSavIntGE.Text);
  iniSettings.WriteString('GECLO', 'edtLogFN', edtLogFNGE.FileName);

  iniSettings.WriteInteger('GECLO', 'cbxBSNum', cbxBSNumGE.SelectedItemIndex);
  iniSettings.WriteInteger('GECLO', 'cbxScenNum', cbxScenNumGE.SelectedItemIndex);
  iniSettings.WriteInteger('GECLO', 'cbxCPUAff', cbxAffinityGE.SelectedItemIndex);
  iniSettings.WriteInteger('GECLO', 'cbxProcPrio', cbxPriorityGE.SelectedItemIndex);
  iniSettings.WriteBool('GECLO', 'IterSaveGT', ckbIterSaveGTGE.Checked);
  iniSettings.WriteInteger('GECLO', 'IterSaveGTInterval', edtIterSaveGTIntervalGE.Value);
  iniSettings.WriteInteger('GECLO', 'IterSaveGTSaves', edtIterSaveGTSavesGE.Value);

  iniSettings.WriteBool('GECLOGO', 'blnGO', ckbGOGE.Checked);
  iniSettings.WriteInteger('GECLOGO', 'intGOSidesGE', intGOSidesGE);
  iniSettings.WriteInteger('GECLOGO', 'cbxGOSide', cbxGOSideGE.SelectedItemIndex);
  iniSettings.WriteInteger('GECLOGO', 'cbxGONukeRel', cbxGONukeRelGE.SelectedItemIndex);
  iniSettings.WriteInteger('GECLOGO', 'cbxGOSnorkSub', cbxGOSnorkSubGE.SelectedItemIndex);
  iniSettings.WriteInteger('GECLOGO', 'cbxGORealWeath', cbxGORealWeathGE.SelectedItemIndex);
  iniSettings.WriteInteger('GECLOGO', 'cbxGOMaintFail', cbxGOMaintFailGE.SelectedItemIndex);
  iniSettings.WriteInteger('GECLOGO', 'cbxGOFullOrd', cbxGOFullOrdGE.SelectedItemIndex);
  iniSettings.WriteInteger('GECLOGO', 'cbxGOFormPat', cbxGOFormPatGE.SelectedItemIndex);
  iniSettings.WriteInteger('GECLOGO', 'cbxGOExit', cbxGOExitGE.SelectedItemIndex);
  iniSettings.WriteInteger('GECLOGO', 'cbxGOTimeComp', cbxGOTimeCompGE.SelectedItemIndex);

  iniSettings.WriteBool('GECLOLO', 'blnLO', ckbLOGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'blnLOinit_annex', ckbLOinit_annexGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOac_ai', ckbLOac_aiGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOsub_ai', ckbLOsub_aiGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOemcon_ai', ckbLOemcon_aiGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOsonar', ckbLOsonarGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOrefuel', ckbLOrefuelGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOmission', ckbLOmissionGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOintercept', ckbLOinterceptGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOres_file', ckbLOres_fileGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOload', ckbLOloadGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOradar', ckbLOradarGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOecm', ckbLOecmGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOmissile', ckbLOmissileGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOareadef', ckbLOareadefGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOperf', ckbLOperfGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLObad_db', ckbLObad_dbGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOgraphic', ckbLOgraphicGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbLOall', ckbLOallGE.Checked);

  // ALE 20221110 catch up
  iniSettings.WriteBool('GECLOLO', 'ckbIDLGE', ckbIDLGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbIDLI32501GE', ckbIDLI32501GE.Checked);
  iniSettings.WriteBool('GECLO', 'ckbLogMLFNGE', ckbLogMLFNGE.Checked);
  iniSettings.WriteString('GECLO', 'edtLogMLFNGE', edtLogMLFNGE.FileName);
  iniSettings.WriteBool('GECLO', 'ckbIterSaveGTFNGE', ckbIterSaveGTFNGE.Checked);
  iniSettings.WriteString('GECLO', 'edtIterFNGE', edtIterFNGE.FileName);

  // ALE 20250615 catch up
  iniSettings.WriteBool('GECLOLO', 'ckbWHGE', ckbWHGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbWHGroupGE', ckbWHGroupGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbWHUnitGE', ckbWHUnitGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbWHStratMapGE', ckbWHStratMapGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbWHMiniReportGE', ckbWHMiniReportGE.Checked);
  iniSettings.WriteBool('GECLOLO', 'ckbWHMessageLogGE', ckbWHMessageLogGE.Checked);

  iniSettings.UpdateFile;
  iniSettings.Free;
end;

end.
