XCOM 2
Not enough ratings
Voice Pack Creation Tips
By Lofty
Intro to voice pack creation with tips that would have saved me time.
   
Award
Favorite
Favorited
Unfavorite
Tutorial Link + Tools
Tutorial I used: Kregano's tutorial [docs.google.com].

Here's a guide by the wonderful Ayser. It includes some extra stuff I haven't included, like dlc icon stuff. It's also a full guide rather than tips like mine, though I think my tips are still useful.

Another good resource

First time setup here is a good idea . Make sure you do all of it, especially when you cook mods, if you haven't done these steps, you'll get errors that are nigh impossible to fix without help.

Cooking tutorial if you are looking to cook an existing mod (faster than moving to the Enhanced Template). Using this template [github.com] naturally leads to cooking and saves time compared to the other method, but is more technically complicated. Note that archetypes do not save if you switch to this format, so I'd suggest if you can, start using this template from the beginning to save you the time of repopulating the archetypes.


Tools you probably want
  • Audacity for radio effect. Here's a tutorial, it's outdated and I have a summary in the next section, but it's here for reference. I like polishing the audio (see normalizing below) and applying a filter early on so that I'm not working with both polished and unpolished audio in case I want to add in more audio later.
  • ffmpeg + Python for scanning and adjusting audio with scripts.
  • Chatgpt and python to write scripts for files without having to code things yourself. This can adjust file names, file types, etc.
  • Alternative Mod Launcher [github.com]
  • Alternative Mod Uploader
    Circumstantial Tools I've Used So Far
  • FSB extractor also known as Aezey extractor [aezay.dk]. This can be used to extract .fsb files, like those used in Dragon Age: Origins.
  • A hex editor. Sometimes files, like voice files in Knights of the Old Republic II, have extra garbage at the beginnings of files you need to remove to make them listenable. A hex editor can do that.
Tips - Audio
    Radio Effect and Conversion in Audacity
  • Radio effect - Tools -> Manage Macros -> New Macro (name radio effect if you want) -> Insert -> Filter Curve EQ -> Edit -> Presets & Settings -> Factory Presets -> Telephone.
  • Export as WAV
  • Check export location with edit -> Preferences -> Directories -> Macro Output. Make sure this is set correctly with every project. If the output location doesn't exist, the operation will fail.
  • With that done, apply it to files by Tools -> Manage Macros -> Select the 'radio effect' you made -> Files. Note this does not go into subfolders.
  • Here [www.metadata2go.com] you can check if your audio files are currently mono (num_channels=1) and the bit rate = 16. Also note the sample rate. Don't save in a sample rate higher than your raw audio sample rate, or it will increase file size without increasing quality. Especially with the radio filter, I think it's safe to even bring down the sample rate to 22050; I can't tell the difference from higher sample rates here. If you're cooking the voice pack (which you should), then going up to 32000hz sample rate shouldn't make noticeable difference unless you have a LOT of lines.


    Audio
    General
  • Duplicate your original audio files in case something happens to the ones you're working with.
  • Decide on your voice cues as you edit and sort audio. You want to have a variety for as much as possible, especially for the most common lines like taking damage, missing, being missed, dashing, etc.
  • Name your files starting with the audio cue they're with for easy navigation later. My code below reflects my own organization method.
  • Your audio must be in 16 bit .wav mono. If you edit the audio later, make sure you're still saving it in this format.
  • Your sound file names cannot contain spaces, or Unreal Editor will reject them.
  • Look over the audio cues ahead of time so you can merge cues you won't have many lines for. If you're taking lines from Gandalf, he probably won't have many you can use for reloading, suppressing fire, etc. If you consider that ahead of time, you can instead sort in lines that can kinda fit, like 'My staff is drained' for instance. If it's still not enough, then you can leave the cue empty, or add some empty inputs to the sound cue (or adjust properties) to make it only play sometimes.
  • The "See teammate die" cue normally plays at the moment of their death. Instead, add a delay (like 2 seconds) to that cue with a module in the sound cue editor (Thanks to Ayser for the tip). After adding a delay module in the editor, make sure the window -> properties is checked so you can edit the value.

    Polishing Audio
    You need to make sure your audio is in a good state before going into Modbuddy and the Editor. Some voice lines will be too quiet or too loud, and will give you a bad quality voice pack. You can: 1) Manually go through all of them and personally adjust their volume. Easy technically, but time consuming.
    2) Use scripts (I use python + ffmpeg) to pull out and adjust loudest and quietest files as needed. More technical, saves time.
    3) Use batch processing with a program like Reaper or Audacity to improve volume levels (I have screenshots below). More technical but saves the most time and produces more consistent results than the other options. I use this, and then double check volumes with the scripts from option 2.

    Normalization
    You're wanting to reduce the dynamic range (difference between the loud and quiet parts) so that nothing is painfully loud, but also everything is audible with the other sounds going on. Here are some screenshots of my process. I'll still use scripts (using python + ffmpeg) to double check the loudest and quietest files before moving onto the next steps.

    I'm no audio expert, so what I have below may very well be suboptimal, but it seems to be working for me.
    Above, I'm using a series of compressors to gradually lower the high volumes while adding global gain (5db each). This keeps the loud stuff from getting too loud while making everything else louder. The last compressor has no global gain.
    Even after the compression, I'm using Reaper to 'normalize' the audio, which I'm using to add more volume to the quieter sounds because they were still too quiet.
Tips - Modbuddy and project
    Inside the project, troubleshooting
  • Make sure your project name, solution, and title are the exact same. So the initial window to choose a project name, and the one right after that should be the same.
  • To clarify, you automatically create a new package in the editor when you import audio to a package that doesn't exist yet, and you save it. The name for this package shouldn't have spaces, and should reflect an entire voice. For instance, in a star wars voice pack, a package might be named "LukeVoice".
  • Never delete or rename any archetypes (and be careful with other stuff) in the Unreal Editor, and if you for some reason try it, make sure you have a backup for your *whole* project ready. Be careful renaming and deleting things from Modbuddy too, sometimes there are references that affects.
  • Don't forget to build the 'solution' (not just your project) to make sure your changes get into your testing and updates.
  • There are two main folders to be aware of. By default one is in your xcom2 sdk folder. The other is in your documents Modbuddy folder. You may want to pin those folders for easy access. The Modbuddy folder is your basic project folder and the one you'll be mostly using.
  • Sometimes Modbuddy gets confused and needs a restart or several to fix weird problems.
  • In the sound cue editor, empty inputs will still be played, so make sure if you delete nodes that you also delete their inputs, or you'll get extra empty lines.
  • If you need to change your archetype, like you want to add new cues or change their order while using Enhanced Template, put the .uc file for Robojumper's script into the project directory (Firaxis Modbuddy) ...\Src\ModName\Classes.
  • If you're using the Enhanced Template, you'll need to make adjustments in order to launch debugger mode and test your mod from the Modbuddy launcher. I will update when I learn how to do this.
Tips - Uploading and Cooking
    Cooking
  • Make sure you unzip the template and take it out of the first unzipped folder (mine wouldn't work otherwise), and take out the first folder or the template won't show up.
  • Make sure to unblock the ps1 files
  • You might find a CookedPCConsole folder in directory like this if you need it "C:\Program Files (x86)\Steam\steamapps\common\XCOM 2\XCom2-WarOfTheChosen\XComGame"

    Enhanced Template
  • If you're using robojumper's script and are updating your mod to be cooked, it will break the archetypes and you will need to remake them. To do that, paste the .uc file with robojumper's script into the project folder (documents flraxis modbuddy path) into the src\projectname\classes folder. Then rebuild the modbuddy project, you don't have to add the script actively into the project itself. But now the archetype should be there in the editor.
  • If you use Enhanced Template, you will likely need to delete the help.uc and configengine.uc files after you run the first time .bat file. You may also choose ot delete the extra_globals.uci, (ModName).int, XComTemplateCreator.ini, and XComTemplateEditor.ini
  • The Enhanced Template treats the .int file a little differently, it appears. You don't *have* to have one, and it will default to something. But if you do have one, it seems to look at the most recent entry for a given voice. So normally you'd need an entry for 'soldier' 'reaper' 'skirmisher' 'templar' 'SPARKS'. Now, it will use whichever one is placed last in the code for all of them. To convert an old pack, comment out the non-basic lines (reaper, skirmisher...) from the .int file, and from the XComContent.ini file.

    Uploading
  • To publish the mod, you may need to run the Modbuddy exe as administrator, I didn't need to for updates after the original upload. 'sdk folder\Binaries\win32\Modbuddy' should be its location.
  • To change the mod name you see in game, check Localization -> XComGame.int
  • Whenever you change your mod's name, it seems it may create a duplicate for you to delete in AML. Make sure you like your mod's name before making it public. Also make sure that if you want to update your project (like if you're using Enhanced Template to cook it), to name your new project the EXACT same as the old project, or it can create annoying popups in game.
  • To add mod thumbnail, just replace the ModPreview.jpg (Or png should work too) with your picture. Ideally it will be 512x512 pixels. And it must be under 1mb.
  • You can check, and subscribe to your workshop mod before making it public, so you should test it to make sure there's no problems in the real game first, outside of just ModBuddy's debug mode.

    Troubleshooting

  • AuthorizationManager check failed solution - Make sure you fully did the first time setups steps in the beginning.
  • The discord [http//%3Dhttps] may be the best resource for more troubleshooting.
The Key Files
Significant files

This first file is "XComContent.ini"
These are how my important config file is set up. Template name, and archetype name are key here, and should match the other relevant places for them - archetype in the UE3 editor, and template in the localization file in the second screenshot. The extra lines for reapers, skirmishers, and templars allow the voice to be used for them as well. To add those lines, just add these lines (names adjusted for your project) to this ini file and the localization file in the second screenshot.



I had to manually add the "X2BodyPartTemplate". Before I did, the display name for my mod was "MorriganVoicePackBodyPartTemplate" - not ideal.

Adding Tags
Option 1: Use Alternative Mod Uploader. It's very easy. You'd be silly not to use this option.

Option 2:
From the E3245 tutorial linked at the beginning (The second tutorial link).
Originally posted by E3245:
Go to XCOM 2 SDK/XCOMGame/Mods/YourMod and open YourMod.XCOMMod with Notepad, or any text editor.
Go down until you see tags=
Fill it out with the appropriate tags so that other people can find it. However, there are several things you need to know before filling out tags.
You need a space after tags=, or else it won’t work.
Use lowercase characters ONLY, no uppercase, or special symbols.
Use commas to separate tags.
Below is the list of tags that you can use for the workshop. This is what it should look like:
tags= voice, soldier customization, soldier class, facility, voice, ui, item, weapon, map, alien, gameplay

Save the text document, and publish your mod. You should see now that you have tags, so other people can find your mod.
You’ll have to repeat this every time you rebuild the mod.
Please use appropriate tags! DO NOT USE TAGS THAT DO NOT MATCH THE MOD THAT YOU’VE CREATED!
Thanks to Future Null Infinity for helping me figure this out!

You can also add the tags from Modbuddy. Project -> *Your project* Properties. Then add the "tags=..." in the description box. Save.
My Code Organization pt. 1
Here are how I've organized my cues for easier organization. These categories work for me better than the default alphabetical. Maybe this organization structure can save you some time. Voice Patcher is required to play a bunch of them. They're alphabetized based on my personal naming of cues.
This code belongs in the .uc file "*Yourmod*.uc". Thanks to Ayser for providing more insight into which ones of these work, and some of these lines are from them directly.
//Events with _w, if empty, will just play their default counterpart //Am_ - things happening to the character Events.Add((EventName="Acid")) Events.Add((EventName="Burning")) Events.Add((EventName="Poison")) Events.Add((EventName="Confused")) Events.Add((EventName="TurnWhileConfused")) //Taking hits Events.Add((EventName="DeathScream")) Events.Add((EventName="ArmorHit")) Events.Add((EventName="TakingDamage")) Events.Add((EventName="CriticallyWounded")) Events.Add((EventName="TakingFire")) Events.Add((EventName="SoldierFlanked")) Events.Add((EventName="Suppressed")) Events.Add((EventName="PanicScream")) Events.Add((EventName="PanickedBreathing")) Events.Add((EventName="SoldierResistsMindControl")) Events.Add((EventName="SoldierControlled")) Events.Add((EventName="SquadConcealmentBroken")) Events.Add((EventName="SustainTriggered")) //Voice Patcher only, Soldier faints and Sustain is triggered //Ammo Events.Add((EventName="AmmoOut")) Events.Add((EventName="LowAmmo")) //Reload Events.Add((EventName="Reloading")) //Body management Events.Add((EventName="PickingUpBody")) Events.Add((EventName="DroppingBody")) //Bondmate Events.Add((EventName="BondmateDualStrike")) //Voice Patcher only, Bonded soldier double attack: first soldier's voiceline Events.Add((EventName="BondmateDualStrikeFollowup")) //Voice Patcher only, Bonded soldier double attack: second soldier's line //Charges Events.Add((EventName="PlantX4")) //Voice Patcher only. Plant X4 charge //Objective - crate Events.Add((EventNam="ObjectSecured")) //Voice Patcher only. Mark supply crate for extraction //Concealment Events.Add((EventName="ActivateConcealment")) Events.Add((EventName="Shadow")) Events.Add((EventName="EnterSquadConcealment")) //Typically played at mission start //Moving Events.Add((EventName="Dashing")) Events.Add((EventName="Moving")) Events.Add((EventName="Dashing_w")) Events.Add((EventName="Moving_w")) Events.Add((EventName="GrapplingHook")) Events.Add((EventName="IcarusJump")) //Voice Patcher only, Icarus Armor jet jump Events.Add((EventName="WallPhasing")) //Voice Patcher only, Wraith Suit activated ability Events.Add((EventName="Domination")) //Enemy_ - Things enemies are doing //Enemy_Debuff Events.Add((EventName="DisablingShot")) //Shot that disables primary weapon? Events.Add((EventName="Amplify")) //Debuff enemy Events.Add((EventName="DP_DirtyKick")) //Stun, debuff Events.Add((EventName="Suppressing")) Events.Add((EventName="SaturationFire")) //Reacts to attempted attacks Events.Add((EventName="TargetWinged")) Events.Add((EventName="TargetArmorHit")) Events.Add((EventName="TargetKilled")) Events.Add((EventName="TargetMissed")) Events.Add((EventName="MultipleTargetsKilled")) Events.Add((EventName="AlienReinforcements")) Events.Add((EventName="AlienRetreat")) //evac Events.Add((EventName="EVAC")) Events.Add((EventName="EVACrequest")) //Explosive Events.Add((EventName="ThrowFlashbang")) Events.Add((EventName="ThrowGrenade")) Events.Add((EventName="FrostBomb")) //Throwing or launching Frost Bomb Events.Add((EventName="ElectroPulse")) //Throwing or launching EMP Grenade Events.Add((EventName="ThrowIncendiary")) //Throwing or launching Incendiary Grenade Events.Add((EventName="Fuse")) Events.Add((EventName="RemoteStart")) //General Attack Events.Add((EventName="Rend")) Events.Add((EventName="Volt")) Events.Add((EventName="Sting")) Events.Add((EventName="StunStrike")) //For templar Events.Add((EventName="CombatProtocol")) //Voice Patcher only Events.Add((EventName="LightningHands")) //pistol ability, present in WOTC //LW2 + voice patcher stuff Events.Add((EventName="DP_TrickShot")) //General Atk Events.Add((EventName="DP_PistolWhip")) //General Atk Events.Add((EventName="DP_LegShot")) //General atk Events.Add((EventName="Shadowfall")) //Voice Patcher only, Firing Shadowkeeper pistol Events.Add((EventName="Ragestrike")) //Voice Patcher only, RAGE Armor's Rage Strike Events.Add((EventName="FreezingLash")) //Voice Patcher only, Serpent Armor's Frostbite Events.Add((EventName="ThrowAxe")) //Voice Patcher only, Throwing Hunter's Axe //Sword stuff Events.Add((EventName="SwordSlice")) Events.Add((EventName="BladestormAttack")) Events.Add((EventName="TemplarBladestormAttack")) //Voice Patcher only. Templar Bladestorm Events.Add((EventName="RetributionAttack")) //Voice Patcher only. Skirmisher Bladestorm Events.Add((EventName="Justice")) Events.Add((EventName="Vengeance")) //AKA Wrath, Skirmisher ability, present //lw2 general attack Events.Add((EventName="KnifeFighter")) //Melee attack with knife against adjacent enemy Events.Add((EventName="CombativesAttack")) //Parry melee attacks and counterattack with knife Events.Add((EventName="PointBlank")) //Fire sawed-off shotgun at nearby enemy Events.Add((EventName="ConcussionRocket")) //Fire special rocket that does little damage with chance to stun or disorient organics and leaves cloud of smoke Events.Add((EventName="Intervention")) //Spend 10 Intel to gain 2 turns on mission timer Events.Add((EventName="ClutchShot")) //Pistol attack that cannot miss Events.Add((EventName="SlugShot")) //Shotguns only shot that pierces 2 armor and has no range penalties Events.Add((EventName="WalkFire")) //Shot with +30 hit chance but -30 crit chance and half damage Events.Add((EventName="PrecisionShot")) //Special shot with +30 crit chance and +33% crit damage Events.Add((EventName="Slash_LW")) //Slash. Attack adjacent target with sword Events.Add((EventName="IronCurtainShot")) //Cone-based shot that does half damage but reduces target mobility Events.Add((EventName="Flush")) //Shot with bonus to hit chance and reduced damage that forces target to move on hit Events.Add((EventName="SwordSlice_LW")) //Fleche. Attack any enemy within movement range with sword. Damage increases with distance Events.Add((EventName="DoubleTap")) //Fire a standard shot and gain a second action restricted to standard shot, precision shot, deadeye, kubikiri, or overwatch //General Plan Events.Add((EventName="Overwatch_w")) Events.Add((EventName="Overwatch")) Events.Add((EventName="InTheZone")) Events.Add((EventName="KillZone")) Events.Add((EventName="Gunslinger")) //Reaction shot with pistol against any enemy the moves or attacks within 8 tiles Events.Add((EventName="Interrupt")) //Overwatch Events.Add((EventName="Battlelord")) //Overwatch ++ Events.Add((EventName="FullThrottle")) //Extra move Events.Add((EventName="ManualOverride")) //lowers cooldowns //General Plan Events.Add((EventName="FocusFire")) //Grant your squad cumulative aim bonuses and 1 armor pierce against 1 target Events.Add((EventName="OscarMike")) //Give all allies within Command range +5 mobility Events.Add((EventName="GetSome")) //Grant all allies within Command range a +20 bonus to crit chance Events.Add((EventName="Incoming")) //Grant all allies within Command range 4 points of damage resistance against explosive attacks Events.Add((EventName="RescueProtocol")) //Grant move action to ally. Uses Gremlin
My Code Organization pt. 2
Events.Add((EventName="Holotarget")) //Holotarget enemy to grant aim bonus to all attacks against target Events.Add((EventName="Roust")) //Flamethrower shot that does less damage but forces target to move Events.Add((EventName="Quickburn")) //Activate to make next flamethrower use not cost an action Events.Add((EventName="Interference")) //Cancel overwatch on selected unit. Uses Gremlin Events.Add((EventName="SteadyWeapon")) //Steady Hands? If you did not move last turn, gain +10 aim and crit chance Events.Add((EventName="Dedication")) //Run and Gun variant Events.Add((EventName="SnapShot")) //Standard shots with the Sniper can be taken after moving. Severe range penalties beyond 5 tiles of squadsight range Events.Add((EventName="LightEmUp")) //Primary weapon shots do not end turn Events.Add((EventName="Jammer")) //Delay the arrive of incoming enemy reinforcements //Ideally these templar cues get split up for more variety. Events.Add((EventName="Invert")) //These 2 swap location Events.Add((EventName="Exchange")) Events.Add((EventName="RunAndGun")) Events.Add((EventName="Reaper")) Events.Add((EventName="DP_LimitBreak")) //General plan //Mimic Events.Add((EventName="Ghost")) //Creates a mimic Events.Add((EventName="MimicBeaconThrow")) //Give Item Events.Add((EventName="Airdrop")) //Grant explosive grenade to targeted ally. Uses Gremlin Events.Add((EventName="TakeThis")) //Youll need this. Pass spare pistol to civilian ally //Hacking Events.Add((EventName="AttemptingHack")) Events.Add((EventName="HackTurret")) Events.Add((EventName="HaywireProtocol")) Events.Add((EventName="HackUnit")) Events.Add((EventName="HackDoor")) //no gremlin Events.Add((EventName="HackWorkstation")) //no gremlin Events.Add((EventName="HackTurretFailed")) Events.Add((EventName="HackUnitFailed")) Events.Add((EventName="GenericHackFailed")) //Fail a Skulljack & security tower hack Events.Add((EventName="HackDoorSuccess")) Events.Add((EventName="HackUnitSuccess")) Events.Add((EventName="HackTurretSuccess")) Events.Add((EventName="HackWorkstationSuccess")) Events.Add((EventName="GenericHackSuccess")) //Might play when successfully hacking a workstation, security tower, or with Skulljack Events.Add((EventName="FullOverride")) //Take permanent control of robot unit and possibly aquire ADVENT MEC. Uses Gremlin Events.Add((EventName="AlienNotStunned")) //Skulljack failure Events.Add((EventName="StunnedAlien")) //Skulljack success Events.Add((EventName="VIPknockout")) //Voice Patcher only, Dark VIP Subdue //Healing and support Events.Add((EventName="HealingAlly")) Events.Add((EventName="MedicalProtocol")) Events.Add((EventName="RestorativeMist")) Events.Add((EventName="RevivalProtocol")) //Voice Patcher only Events.Add((EventName="RevivingAlly")) //Stabilize Events.Add((EventName="StabilizingAlly")) //Hunker Events.Add((EventName="HunkerDown")) //Insanity Events.Add((EventName="Insanity")) Events.Add((EventName="Judgement")) //Inspire Events.Add((EventName="Inspire")) Events.Add((EventName="CombatPresence")) Events.Add((EventName="Command")) //End your turn to grant a bonus action to any visible ally Events.Add((EventName="PsionicsInspiration")) //Mind Merge, psionic variant of Inspire //Looting Events.Add((EventName="ItemCollected")) //Objective items from hack Events.Add((EventName="LootCaptured")) Events.Add((EventName="OpenChest")) //Voice Patcher only. Open loot chest //Obj_Fail Events.Add((EventName="MissionAbortRequest")) //Reaper Events.Add((EventName="HomingMine")) //Rescue Events.Add((EventName="CivilianRescue")) //See concealed Events.Add((EventName="ConcealedSpotted")) Events.Add((EventName="TrippedBurrow")) //Chrysallid emerges from burrow and moves to attack this soldier //Sensors Events.Add((EventName="EnemyPatrolSpotted")) Events.Add((EventName="TargetDefinition")) Events.Add((EventName="LootSpotted")) Events.Add((EventName="ObjectiveSighted")) Events.Add((EventName="ObjectiveSighted_w")) //See team dead Events.Add((EventName="SquadMemberDead")) //More sensors Events.Add((EventName="TargetHeard")) //Unknown Enemy Moving, give same cue as below Events.Add((EventName="AlienMoving")) //Known enemy moving Events.Add((EventName="ScanningProtocol")) Events.Add((EventName="BattleScanner")) //Shielding Events.Add((EventName="SmokeGrenade")) Events.Add((EventName="AidProtocol")) //Voice Patcher only Events.Add((EventName="NullShield")) Events.Add((EventName="Pillar")) Events.Add((EventName="DefensiveProtocol")) Events.Add((EventName="HighCoverGenerator")) //Voice Patcher only, W.A.R. suit activated ability (Shieldwall) Events.Add((EventName="Fortify")) //Activate to grant +20 defense until beginning of next turn. No action cost Events.Add((EventName="AbsorptionFields")) //Impact Fields PCS ability, reduced damage. Use shielding line. //Devastating attack Events.Add((EventName="Mindblast")) Events.Add((EventName="NullLance")) Events.Add((EventName="VoidRift")) Events.Add((EventName="IonicStorm")) Events.Add((EventName="CapacitorDischarge")) Events.Add((EventName="Banish")) Events.Add((EventName="Whiplash")) Events.Add((EventName="ChainShot")) Events.Add((EventName="RapidFire")) Events.Add((EventName="BlasterLauncher")) Events.Add((EventName="Flamethrower")) Events.Add((EventName="RocketLauncher")) Events.Add((EventName="ShredStormCannon")) Events.Add((EventName="ShredderGun")) Events.Add((EventName="PlasmaBlaster")) Events.Add((EventName="DeadEye")) Events.Add((EventName="Faceoff")) Events.Add((EventName="FanFire")) //LW2 Events.Add((EventName="DP_Unload")) //Devastating Events.Add((EventName="DP_Checkmate")) //Devastating Events.Add((EventName="BothBarrels")) //Fire both parrels of sawed-off shotgun Events.Add((EventName="BunkerBuster")) //Special rocket that destroys buildings and other objects in environment Events.Add((EventName="Firestorm")) //Attack all units in a complete circle around users position and grants immunity to fire Events.Add((EventName="CyclicFire")) //Fire three shots at a traget with aim penalties Events.Add((EventName="StreetSweeper")) //Cone-based shotgun shot that is blocked by heavy cover and does bonus damage to unarmored targets //Stim Events.Add((EventName="CombatStim")) //Void conduit - Immobilize and slowly kill Events.Add((EventName="VoidConduit")) //Environment Events.Add((EventName="Explosion")) //Vehicle near the soldier catches fire Events.Add((EventName="ObjectFireSpreading")) //Fire is near the soldier //Other lines that work, but I personally haven't used much //VIP Events.Add((EventName="VIPRescueComplete")) Events.Add((EventName="VIPsighted")) Events.Add((EventName="EngineerScienceVIP")) Events.Add((EventName="HostileVIP")) //Plays both when spotting and picking up Dark VIPs Events.Add((EventName="HiddenMovementVox")) //Don't know how this differs from the other two. I typically keep it silent. Events.Add((EventName="ADVENTsighting")) // world narrative Events.Add((EventName="AlienExperimentSighted")) Events.Add((EventName="AlienFacilitySighted")) Events.Add((EventName="AlienFloraSighted")) Events.Add((EventName="CheckpointSighted")) Events.Add((EventName="GenericSighting")) Events.Add((EventName="GraffitiSighted")) Events.Add((EventName="MeatFactorySighted")) Events.Add((EventName="DoorBreach")) //Voice Patcher only. This plays when both opening AND closing a door Events.Add((EventName="SwordMiss")) //This seems unused Events.Add((EventName="SoldierFailsControl")) //Seems unused
LWOTC Lines
(Thanks Ayser for the code)
//LW2 Secondary Weapons Events.Add((EventName="Holotarget")) //Holotarget enemy to grant aim bonus to all attacks against target Events.Add((EventName="Roust")) //Flamethrower shot that does less damage but forces target to move Events.Add((EventName="Quickburn")) //Activate to make next flamethrower use not cost an action Events.Add((EventName="Interference")) //Cancel overwatch on selected unit. Uses Gremlin Events.Add((EventName="SteadyWeapon")) //Steady Hands? If you did not move last turn, gain +10 aim and crit chance Events.Add((EventName="Dedication")) //Run and Gun variant Events.Add((EventName="SnapShot")) //Standard shots with the Sniper can be taken after moving. Severe range penalties beyond 5 tiles of squadsight range Events.Add((EventName="LightEmUp")) //Primary weapon shots do not end turn Events.Add((EventName="Jammer")) //Delay the arrive of incoming enemy reinforcements Events.Add((EventName="KnifeFighter")) //Melee attack with knife against adjacent enemy Events.Add((EventName="CombativesAttack")) //Parry melee attacks and counterattack with knife Events.Add((EventName="PointBlank")) //Fire sawed-off shotgun at nearby enemy Events.Add((EventName="ConcussionRocket")) //Fire special rocket that does little damage with chance to stun or disorient organics and leaves cloud of smoke Events.Add((EventName="Intervention")) //Spend 10 Intel to gain 2 turns on mission timer Events.Add((EventName="ClutchShot")) //Pistol attack that cannot miss Events.Add((EventName="SlugShot")) //Shotguns only shot that pierces 2 armor and has no range penalties Events.Add((EventName="WalkFire")) //Shot with +30 hit chance but -30 crit chance and half damage Events.Add((EventName="PrecisionShot")) //Special shot with +30 crit chance and +33% crit damage Events.Add((EventName="Gunslinger")) //Reaction shot with pistol against any enemy the moves or attacks within 8 tiles Events.Add((EventName="Slash_LW")) //Slash. Attack adjacent target with sword Events.Add((EventName="IronCurtainShot")) //Cone-based shot that does half damage but reduces target mobility Events.Add((EventName="Flush")) //Shot with bonus to hit chance and reduced damage that forces target to move on hit Events.Add((EventName="SwordSlice_LW")) //Fleche. Attack any enemy within movement range with sword. Damage increases with distance Events.Add((EventName="DoubleTap")) //Fire a standard shot and gain a second action restricted to standard shot, precision shot, deadeye, kubikiri, or overwatch Events.Add((EventName="BothBarrels")) //Fire both parrels of sawed-off shotgun Events.Add((EventName="BunkerBuster")) //Special rocket that destroys buildings and other objects in environment Events.Add((EventName="Firestorm")) //Attack all units in a complete circle around users position and grants immunity to fire Events.Add((EventName="CyclicFire")) //Fire three shots at a traget with aim penalties Events.Add((EventName="StreetSweeper")) //Cone-based shotgun shot that is blocked by heavy cover and does bonus damage to unarmored targets Events.Add((EventName="FullOverride")) //Take permanent control of robot unit and possibly aquire ADVENT MEC. Uses Gremlin Events.Add((EventName="Airdrop")) //Grant explosive grenade to targeted ally. Uses Gremlin Events.Add((EventName="TakeThis")) //Youll need this. Pass spare pistol to civilian ally Events.Add((EventName="Command")) //End your turn to grant a bonus action to any visible ally Events.Add((EventName="FocusFire")) //Grant your squad cumulative aim bonuses and 1 armor pierce against 1 target Events.Add((EventName="OscarMike")) //Give all allies within Command range +5 mobility Events.Add((EventName="GetSome")) //Grant all allies within Command range a +20 bonus to crit chance Events.Add((EventName="Incoming")) //Grant all allies within Command range 4 points of damage resistance against explosive attacks Events.Add((EventName="RescueProtocol")) //Grant move action to ally. Uses Gremlin Events.Add((EventName="PsionicsInspiration")) //Mind Merge, psionic variant of Inspire Events.Add((EventName="DisablingShot")) //Shot that disables primary weapon? Events.Add((EventName="Fortify")) //Activate to grant +20 defense until beginning of next turn. No action cost Events.Add((EventName="AbsorptionFields")) //Impact Fields PCS ability, reduced damage. Use shielding line.
Extra Cues I Don't Use
It seems these below are mostly useless. Ignoring them is advisable.

Events.Add((EventName="Dodge")) //Seems unused //Events.Add((EventName="HackTurretSuccess")) //Events.Add((EventName="HackUnit")) //After rigorous testing, this event is now known to be completely unused //Events.Add((EventName="HackUnitSuccess")) //Events.Add((EventName="HackWorkstationSuccess")) // attitudes //Events.Add((EventName="Moving_BY_THE_BOOK")) //Events.Add((EventName="TargetKilled_BY_THE_BOOK")) //Events.Add((EventName="Panic_BY_THE_BOOK")) //Events.Add((EventName="SoldierVIP_BY_THE_BOOK")) //Events.Add((EventName="UsefulVIP_BY_THE_BOOK")) //Events.Add((EventName="GenericVIP_BY_THE_BOOK")) //Events.Add((EventName="HostileVIP_BY_THE_BOOK")) //Events.Add((EventName="LootCaptured_BY_THE_BOOK")) //Events.Add((EventName="HackWorkstation_BY_THE_BOOK")) //Events.Add((EventName="LootSpotted_BY_THE_BOOK")) //Events.Add((EventName="PickingUpBody_BY_THE_BOOK")) // //Events.Add((EventName="Moving_LAID_BACK")) //Events.Add((EventName="TargetKilled_LAID_BACK")) //Events.Add((EventName="Panic_LAID_BACK")) //Events.Add((EventName="SoldierVIP_LAID_BACK")) //Events.Add((EventName="UsefulVIP_LAID_BACK")) //Events.Add((EventName="GenericVIP_LAID_BACK")) //Events.Add((EventName="HostileVIP_LAID_BACK")) //Events.Add((EventName="LootCaptured_LAID_BACK")) //Events.Add((EventName="HackWorkstation_LAID_BACK")) //Events.Add((EventName="LootSpotted_LAID_BACK")) //Events.Add((EventName="PickingUpBody_LAID_BACK")) // //Events.Add((EventName="Moving_TWITCHY")) //Events.Add((EventName="TargetKilled_TWITCHY")) //Events.Add((EventName="Panic_TWITCHY")) //Events.Add((EventName="SoldierVIP_TWITCHY")) //Events.Add((EventName="UsefulVIP_TWITCHY")) //Events.Add((EventName="GenericVIP_TWITCHY")) //Events.Add((EventName="HostileVIP_TWITCHY")) //Events.Add((EventName="LootCaptured_TWITCHY")) //Events.Add((EventName="HackWorkstation_TWITCHY")) //Events.Add((EventName="LootSpotted_TWITCHY")) //Events.Add((EventName="PickingUpBody_TWITCHY")) // //Events.Add((EventName="Moving_HAPPY_GO_LUCKY")) //Events.Add((EventName="TargetKilled_HAPPY_GO_LUCKY")) //Events.Add((EventName="Panic_HAPPY_GO_LUCKY")) //Events.Add((EventName="SoldierVIP_HAPPY_GO_LUCKY")) //Events.Add((EventName="UsefulVIP_HAPPY_GO_LUCKY")) //Events.Add((EventName="GenericVIP_HAPPY_GO_LUCKY")) //Events.Add((EventName="HostileVIP_HAPPY_GO_LUCKY")) //Events.Add((EventName="LootCaptured_HAPPY_GO_LUCKY")) //Events.Add((EventName="HackWorkstation_HAPPY_GO_LUCKY")) //Events.Add((EventName="LootSpotted_HAPPY_GO_LUCKY")) //Events.Add((EventName="PickingUpBody_HAPPY_GO_LUCKY")) // //Events.Add((EventName="Moving_HARD_LUCK")) //Events.Add((EventName="TargetKilled_HARD_LUCK")) //Events.Add((EventName="Panic_HARD_LUCK")) //Events.Add((EventName="SoldierVIP_HARD_LUCK")) //Events.Add((EventName="UsefulVIP_HARD_LUCK")) //Events.Add((EventName="GenericVIP_HARD_LUCK")) //Events.Add((EventName="HostileVIP_HARD_LUCK")) //Events.Add((EventName="LootCaptured_HARD_LUCK")) //Events.Add((EventName="HackWorkstation_HARD_LUCK")) //Events.Add((EventName="LootSpotted_HARD_LUCK")) //Events.Add((EventName="PickingUpBody_HARD_LUCK")) // //Events.Add((EventName="Moving_INTENSE")) //Events.Add((EventName="TargetKilled_INTENSE")) //Events.Add((EventName="Panic_INTENSE")) //Events.Add((EventName="SoldierVIP_INTENSE")) //Events.Add((EventName="UsefulVIP_INTENSE")) //Events.Add((EventName="GenericVIP_INTENSE")) //Events.Add((EventName="HostileVIP_INTENSE")) //Events.Add((EventName="LootCaptured_INTENSE")) //Events.Add((EventName="HackWorkstation_INTENSE")) //Events.Add((EventName="LootSpotted_INTENSE")) //Events.Add((EventName="PickingUpBody_INTENSE")) // UNUSED, but hooked up in vanilla voices // Mods may use those lines. //Events.Add((EventName="ALERT")) //Events.Add((EventName="AlienSightings")) //Events.Add((EventName="ArcThrower")) //Events.Add((EventName="AreaSuppressing")) //Events.Add((EventName="BleedingOut")) //Events.Add((EventName="CivilianScream")) //Events.Add((EventName="CivilianSighted")) //Events.Add((EventName="CollateralDamage")) //Events.Add((EventName="CoupDeGrace")) //Events.Add((EventName="CriticalFeedback")) //Events.Add((EventName="DisablingShot")) //Events.Add((EventName="ElectroPulse")) //Events.Add((EventName="EngagingHostiles")) //Events.Add((EventName="EvacAllDead")) //Events.Add((EventName="EvacAllOut")) //Events.Add((EventName="EvacHeavyLosses")) //Events.Add((EventName="EvacNoLosses")) //Events.Add((EventName="EvacSomeLosses")) //Events.Add((EventName="EvacSomeOut")) //Events.Add((EventName="ExaltChatter")) //Events.Add((EventName="FireRocket")) //Events.Add((EventName="Flushing")) //Events.Add((EventName="GenericVIP")) //Events.Add((EventName="GhostModeActive")) //Events.Add((EventName="GroundZero")) //Events.Add((EventName="Halt")) //Events.Add((EventName="HiddenMovement")) //Events.Add((EventName="HoldTheLine")) //Events.Add((EventName="InDropPosition")) //Events.Add((EventName="InitialFeedback")) //Events.Add((EventName="JetBoots")) //Events.Add((EventName="JetPackOff")) //Events.Add((EventName="JetpackMove")) //Events.Add((EventName="KineticStrike")) //Events.Add((EventName="MovementSpotted")) //Events.Add((EventName="MovingConcealed")) //Events.Add((EventName="ObjectOnFire")) //Events.Add((EventName="ObjectSecured")) //Events.Add((EventName="ObjectivePackageEVAC")) //Events.Add((EventName="OneForAll")) //Events.Add((EventName="OrderConfirm")) //Events.Add((EventName="PanicScream")) //Events.Add((EventName="Poisoned")) //Events.Add((EventName="ProximityMine")) //Events.Add((EventName="PsionicsInspiration")) //Events.Add((EventName="PsionicsMindControl")) //Events.Add((EventName="PsionicsMindfray")) //Events.Add((EventName="PsionicsPanic")) //Events.Add((EventName="PsionicsTelekineticField")) //Events.Add((EventName="RepairSHIV")) //Events.Add((EventName="RequestReinforcements")) //Events.Add((EventName="RocketScatter")) //Events.Add((EventName="ShredderRocket")) //Events.Add((EventName="SoldierSuppressed")) //Events.Add((EventName="SoldierVIP")) //Events.Add((EventName="StunTarget")) //Events.Add((EventName="TargetCaptured")) //Events.Add((EventName="TargetEliminated")) //Events.Add((EventName="TargetKilled")) //Events.Add((EventName="TargetSighted")) //Events.Add((EventName="TargetSpopttedHidden")) //Events.Add((EventName="TargetSpotted")) //Events.Add((EventName="TeslaCannon")) //Events.Add((EventName="ThroughTheWall")) //Events.Add((EventName="UsefulVIP")) //Events.Add((EventName="VIPRescueInProgress")) //Events.Add((EventName="VIPknockout")) //Events.Add((EventName="VolunteerPsiRift")) //Events.Add((EventName="TargetEliminated_BY_THE_BOOK")) //Events.Add((EventName="TargetEliminated_LAID_BACK")) //Events.Add((EventName="TargetEliminated_TWITCHY")) //Events.Add((EventName="TargetEliminated_HAPPY_GO_LUCKY")) //Events.Add((EventName="TargetEliminated_HARD_LUCK")) //Events.Add((EventName="TargetEliminated_INTENSE"))
Credits
Ayser for being extremely helpful, providing code.
Aquillo's voice patcher and code snippets.
Kregano for making their tutorial.
Robojumper for making the script Kregano's tutorial is based on.
∑3245 for some guides.
Iridar for being helpful.
Stupid Pupil's tutorial caused me problems so I couldn't use it, but it gave me some insights into my own troubleshooting.