A321 XLR - Systems/Sound Mod

  • Wow, looks great, specially the RAAS part sounds interesting. Any chance we will see this for MacOS too?

  • Good news is that a forum member has converted my A350 mod to Mac, so will hopefully do the same for the A321XLR and the other Airbus once I'm done.

    Thank you very much for your work. It really adds some much needed realism to the sim. Now, I am a MacBook user and haven't yet been able to make full use of your mods, because I can't use the dispatch application. I would be really grateful if I could get the Mac compatible files for both aircraft.

    Kind regards

  • Thank you very much for your work. It really adds some much needed realism to the sim. Now, I am a MacBook user and haven't yet been able to make full use of your mods, because I can't use the dispatch application. I would be really grateful if I could get the Mac compatible files for both aircraft.

    Kind regards

    Wow, looks great, specially the RAAS part sounds interesting. Any chance we will see this for MacOS too?

    Hey Mac Users, I’m currently in charge of making the Mac port with 777Driver. For right now we don't know when it will be ready. We will update you soon when we have more progress. But most likely when we do release something it will be both for the XLR and A350. Thanks guys.

  • I should add that I don't own or Mac and won't be purchasing one, so I can't test any of this. This is just a hobby for me, I initially created these mods for myself as a stop gap until the devs do their own versions, but that could obviously be years (if at all)

    Whilst all the fault overlays will work on Mac, the actual code driving the random faults is through PowerShell and Python, and I have zero clue how that works on Mac.

    What the Mac version will need is a GUI, and more more importantly, a script that copies each failure into the respective system and parameters files. Below is an example of the code for severe faults like engine failures.

    Also, these are the paths for Aerofly in FS4 and the PC version; the equivalent paths need to be located for Mac.

    FS4 PC mods go here \Documents\Aerofly FS 4\aircraft\a350_1000

    FS4 Steam folder - C:\Steam\steamapps\common\Aerofly FS 4 Flight Simulator\aircraft\a350_1000

    FS4 Failure mod lives here - \Aerofly FS 4\aircraft\a350_1000\A350 DISPATCH (folder name needs to be changed to lower case for other platforms, works fine on PC)


    I'll try to assist as much as I can, but the whole mod took me a long time to create on PC, and my time is limited. Thankfully, all the system failures are cross-platform, and that was the hardest part.

  • THIS IS ONLY PART OF THE SELECTOR CODE - Each component is weighted with a random chance of being selected and injected into the sim. For example, an engine failure is set to 1 (extremely rare). The hydraulic yellow system is set to 10 (still rare). Medium and minor faults (Electrical, Pneumatic, flaps etc) are dealt with separately and are more common.


    The 'Weight' determines the likelihood of a failure.

    @{ Name = "ENG1_FAIL_BELOW_V1"; File = "system_eng_fail_belowV1.tmd"; Weight = 1 }

    @{ Name = "HYD_YELLOW_FLIGHT11"; File = "System_HydYellowflght_11000ft.tmd"; Weight = 10 }


    $ErrorActionPreference = "Stop"

    try {

    # ===============================
    # A350 DISPATCH SYSTEM SELECTOR
    # CLEAN + CTD SAFE + FORCE MODE
    # + MEDIUM FAULT LAYER
    # + LEVEL-D CHECKRIDE MODE
    # ===============================

    $DebugMode = $true

    # ---------------- RELATIVE PATH RESOLUTION ----------------

    $ScriptPath = $MyInvocation.MyCommand.Path
    $FailureRepo = Split-Path $ScriptPath -Parent
    $AircraftRoot = Split-Path $FailureRepo -Parent
    $DispatchRoot = Join-Path $AircraftRoot "A350 DISPATCH"

    $StatusFile = Join-Path $DispatchRoot "gui_status.txt"
    $LogFile = Join-Path $DispatchRoot "dispatch_log.txt"
    $TechLogFile = Join-Path $DispatchRoot "tech_log.txt"

    $ForceBelow5000Flag = Join-Path $DispatchRoot "force_below_5000ft.flag"
    $LevelDCheckrideFlag = Join-Path $DispatchRoot "level_d_checkride.flag"
    $DispatchOptionsFile = Join-Path $DispatchRoot "dispatch_options.txt"

    # ---------------- TARGETS ----------------

    $MinorSourceFolder = Join-Path $AircraftRoot "minorfaults\selected"
    $MinorParametersFile = Join-Path $AircraftRoot "minorfaults\parameters.tmd"
    $MinorSystemFile = Join-Path $AircraftRoot "minorfaults\system.tmd"

    $MediumSourceFolder = Join-Path $AircraftRoot "mediumfaults\selected"
    $MediumSystemFile = Join-Path $AircraftRoot "mediumfaults\system.tmd"
    $MediumParametersFile = Join-Path $AircraftRoot "mediumfaults\parameters.tmd"

    $SevereSystemFile = Join-Path $AircraftRoot "severefaults\system.tmd"
    $SevereParametersFile = Join-Path $AircraftRoot "severefaults\parameters.tmd"

    $WriteBaseSystemOnNormal = $false
    $BaseSystemTMD = Join-Path $AircraftRoot "base\system.tmd"

    # ---------------- VALID EMPTY TMD ----------------

    $BlankTmd = @"
    <[file][][]>
    <[modelmanager][][]>
    <[pointer_list_tmuniverse][DynamicObjects][]>
    >
    >
    >
    "@

    # ---------------- FAILURE LIST ----------------

    $AllFailures = @(

    @{ Name = "NORMAL"; File = "system_ENG_clean.tmd"; Weight = 900 }

    @{ Name = "ENG1_FAIL_BELOW_V1"; File = "system_eng_fail_belowV1.tmd"; Weight = 1 }
    @{ Name = "ENG12_FAIL_34000FT"; File = "system_eng12_fail_FL340.tmd"; Weight = 1 }
    @{ Name = "ENG12_FAIL_34000FT_DLY"; File = "system_eng12_fail_FL340_delayed.tmd"; Weight = 1 }
    @{ Name = "ENG12_FAIL_34000FT_LDLY"; File = "system_eng12_fail_FL340_LONGdelayed.tmd"; Weight = 1 }
    @{ Name = "ENG1_CRUISE_55MIN"; File = "system_eng1_cruise55min_fail.tmd"; Weight = 1 }
    @{ Name = "ENG1_CRUISE_6HR"; File = "system_eng1_cruise6hr_fail.tmd"; Weight = 1 }
    @{ Name = "ENG2_CRUISE_4HR_FIRE"; File = "system_eng2_cruise4hr_fire_fail.tmd"; Weight = 1 }

    @{ Name = "ENG1_V1_BIRDSTRIKE"; File = "system_eng_V1BIRDSTRIKE_fail.tmd"; Weight = 1 }
    @{ Name = "ENG1_PREV1_FAIL"; File = "system_eng_prev1_fail.tmd"; Weight = 1 }
    @{ Name = "ENG2_FIRE_500FT"; File = "system_eng2_fire_500ft.tmd"; Weight = 1 }
    @{ Name = "ENG1_FAIL_FIRE_5000"; File = "system_eng1_fire_5000ft.tmd"; Weight = 1 }
    @{ Name = "ENG2_FAIL_FIRE_5000"; File = "system_eng2_fire_5000ft.tmd"; Weight = 1 }

    @{ Name = "ENG2_FIRE_2000FT"; File = "system_eng2_fire_2000ft.tmd"; Weight = 1 }
    @{ Name = "ENG_FAIL_5000"; File = "system_eng_fail_5000ft.tmd"; Weight = 1 }
    @{ Name = "ENG_FAIL_5500"; File = "system_eng_fail_5500ft.tmd"; Weight = 1 }
    @{ Name = "ENG_FAIL_14000"; File = "system_eng_fail_14000ft.tmd"; Weight = 1 }
    @{ Name = "ENG_FAIL_19000"; File = "system_eng_fail_19000ft.tmd"; Weight = 1 }

    @{ Name = "ENG_FAIL_34000"; File = "system_eng_fail_34000ft.tmd"; Weight = 1 }
    @{ Name = "ENG2_FIRE_34000FT"; File = "system_eng2_fire_34000ft.tmd"; Weight = 1 }
    @{ Name = "ENG2_FIRE_34500FT"; File = "system_eng2_fire_34500ft.tmd"; Weight = 1 }
    @{ Name = "ENG_FAIL_37000"; File = "system_eng_fail_37000ft.tmd"; Weight = 1 }
    @{ Name = "ENG_FAIL_41000"; File = "system_eng_fail_41000ft.tmd"; Weight = 1 }
    @{ Name = "ENG_FAIL_41500"; File = "system_eng_fail_41500ft.tmd"; Weight = 1 }
    @{ Name = "ENG2_FIRE_13000FT"; File = "system_eng2_fire_13000ft.tmd"; Weight = 1 }
    @{ Name = "ENG2_FIRE_16000FT"; File = "system_eng2_fire_16000ft.tmd"; Weight = 1 }
    @{ Name = "ENG2_FIRE_23000FT"; File = "system_eng2_fire_23000ft.tmd"; Weight = 1 }
    @{ Name = "ENG2_FIRE_23500FT"; File = "system_eng2_fire_23500ft.tmd"; Weight = 1 }

    @{ Name = "ENG_FAIL_DUAL_FIRE_34000FT"; File = "system_eng_fail_DUAL_fire_34000ft.tmd"; Weight = 1 }

    @{ Name = "PRESS_DECOMP_FL360"; File = "system_press_decomp_FL360.tmd"; Weight = 1 }
    @{ Name = "PRESS_NO_PRESS_TO"; File = "system_press_no_press_to.tmd"; Weight = 2 }

    @{ Name = "GEN1A_FLIGHT"; File = "System_Gen1Aflght_1000ft.tmd"; Weight = 10 }
    @{ Name = "GEN1AB_FLIGHT"; File = "System_Gen1ABflght_1000ft.tmd"; Weight = 10 }
    @{ Name = "GEN1AB5_FLIGHT"; File = "System_Gen1ABflght_5000ft.tmd"; Weight = 10 }
    @{ Name = "GEN1B_FLIGHT"; File = "System_Gen1bflght_25000ft.tmd"; Weight = 10 }
    @{ Name = "GEN2A_FLIGHT"; File = "System_Gen2aflght_34000ft.tmd"; Weight = 10 }

    @{ Name = "HYD_GREEN_FLIGHT"; File = "System_HydGreenflght_5000ft.tmd"; Weight = 10 }
    @{ Name = "HYD_GREEN_FLIGHT10"; File = "System_HydGreenflght_10000ft.tmd"; Weight = 10 }
    @{ Name = "HYD_YELLOW_FLIGHT"; File = "System_HydYellowflght_5000ft.tmd"; Weight = 10 }
    @{ Name = "HYD_YELLOW_FLIGHT11"; File = "System_HydYellowflght_11000ft.tmd"; Weight = 10 }
    )

    # ---------------- FORCE NORMAL OPTION ----------------

    $ForceNormal = $false

    if (Test-Path $DispatchOptionsFile) {
    $DispatchOptionsRaw = Get-Content $DispatchOptionsFile -Raw -ErrorAction SilentlyContinue
    if ($DispatchOptionsRaw -match 'FORCE_NORMAL\s*=\s*1') {
    $ForceNormal = $true
    }

    Remove-Item $DispatchOptionsFile -Force -ErrorAction SilentlyContinue
    }

    # ---------------- FORCE BELOW 5000FT MODE ----------------

    if (Test-Path $ForceBelow5000Flag) {

    Write-Host "FORCE BELOW 5000FT MODE ENABLED"

    $Failures = $AllFailures | Where-Object {
    $_.Name -like "*500FT*" -or
    $_.Name -like "*2000FT*" -or
    $_.Name -like "*5000*" -or
    $_.Name -like "*PREV1*" -or
    $_.Name -like "*BIRDSTRIKE*" -or
    $_.Name -eq "NORMAL"
    }

    } else {

    $Failures = $AllFailures
    }

    # ---------------- LEVEL-D CHECKRIDE MODE ----------------

    if ($ForceNormal) {

    Write-Host "FORCE NORMAL MODE ENABLED"
    $Selected = $AllFailures | Where-Object { $_.Name -eq "NORMAL" } | Select-Object -First 1

    }
    else {

    if (Test-Path $LevelDCheckrideFlag) {
    Write-Host "LEVEL-D CHECKRIDE MODE ENABLED"

    $Failures = $Failures | Where-Object {
    $_.Name -ne "NORMAL"
    }
    }

    # ---------------- WEIGHTED SELECTION ----------------

    $TotalWeight = 0
    foreach ($f in $Failures) { $TotalWeight += [int]$f.Weight }

    $Roll = Get-Random -Minimum 1 -Maximum ($TotalWeight + 1)

    $RunningTotal = 0
    $Selected = $null

    foreach ($Fail in $Failures) {
    $RunningTotal += $Fail.Weight
    if ($Roll -le $RunningTotal) {
    $Selected = $Fail
    break
    }
    }
    }

    if (-not $Selected) { throw "No dispatch selection made" }

    $SourceSystem = Join-Path $FailureRepo $Selected.File
    if (-not (Test-Path $SourceSystem)) { throw "Missing system file: $SourceSystem" }

    # ---------------- SEVERE + AIRBORNE DETECTION ----------------

    $IsSevere = $false
    $IsAirborne = $false

    if ($Selected.File -like "System_*flght*.tmd") {
    $IsAirborne = $true
    }
    elseif (
    $Selected.File -like "system_eng*_fail*.tmd" -or
    $Selected.File -like "system_eng*_fire*.tmd" -or
    $Selected.File -like "system_eng12*.tmd" -or
    $Selected.File -like "system_press_*.tmd"
    ) {
    $IsSevere = $true
    }

  • The project is coming along well and making steady progress. It’s still in the early stages, and we’re currently looking for MacOS beta testers.

    If you’re interested feel free to PM me to join testing. This is a crucial phase of development and any help is greatly appreciated.

    Thanks to everyone who’s willing to support the project.

  • The project is coming along well and making steady progress. It’s still in the early stages, and we’re currently looking for MacOS beta testers.

    If you’re interested feel free to PM me to join testing. This is a crucial phase of development and any help is greatly appreciated.

    Thanks to everyone who’s willing to support the project.

    I’d be willing to test it on MacOS. Send me all the information and what you need me to look at via PM, and i’ll look into it.

  • Hey everyone, I’m still looking for one more Mac beta tester. Any help testing the project would be greatly appreciated. Your feedback really helps improves the app before release. If you’re interested, feel free to message me. Thanks again to everyone helping out with testing.