Have you ever wanted to create the Battle of Winterfell in Total War: Attila? The Battle of Agincourt? The Sack of Rome? To provide players with a scenario full of cutscenes, reinforcements, and unique objectives? Well now you can, with a new tutorial created by Caligula on how to script 'historical' battles. This tutorial was made possible by DETrooper, Farfadet, Elessar, DrunkFlamingo, and Case who provided immeasurable support by creating the unique scripts in the accompanying Historical Battle Template. Check out the examples below, and create something unique!
DETrooper: Ruination of the Nomads, Crossing the Danube and Fall of Constantinople
Requires The Long Night to play
Step-by-Step Tutorial
Step 1 (Basic Data Entry)
Spoiler Alert, click show to read:
[1] Refer to the post below this one to learn what each table/entry does, and how they affect your battle. Constantly refer back to this post throughout this tutorial.
[2] Download the Historical Battle Template that DETrooper, Farfadet, Elessar, DrunkFlamingo, Case and I have created. Use PFM or RPFM to open it up and use it as the basis for your mod.
[3] Go to all of the following tables/entries and replace the tutorial_ and tut_ prefix for each table with the prefix for your mod. battle. Eg change tutorial_historical_battles to mktw_historical_battles and tut_battle.xml to agincourt_battle.xml db
This box is 619x335 pixels big. If we look at data.pack - db - historical_battles_ui_locations_tables we can see that Utus is located at x=619, y=342. It is not 100% pixel perfect, so a bit of trial and error is required to get it in exactly the right position.
Anyways now we go to historical_battles_ui_locations_tables, input the exact same name as you did in battles_table and put the x, y and height percent values in.
This lua script contains a list of the historical battles that are available in your mod. Below is the relevant section. Change tut_tutorial_battle to the name of your battle.
This is a 512x256 png file that acts as a little preview image of your historical battle. Here are three examples I've used, and two pictures of them actually in-game. Example 1 Example 2 Example 3
This is a text file where you can change what each difficulty level is called (if you want to). The default difficulties are Easy, Normal, Hard, Very Hard, Legendary. In “The War of the Ring” I changed the difficulties as follows:
This is a text file where you put in the name, and the description of your historical battles. For example...
battles_localised_name_battleofthebastards
Battle of the Bastards
battles_description_battleofthebastards
The Bastard of the Dreadfort and Warden of the North, Ramsay Bolton, holds Winterfell – the ancestral seat of House Stark. Jon Snow, the Bastard of Winterfell has come to reclaim his home at the head of a ragged army of Wildlings, and bannermen loyal to his cause. The bastards will clash outside the walls of Winterfell, where only one may emerge victorious.
uied_component_texts.loc
This is a text file where you can change the text displaying "Historical Battles" to whatever custom text you want, for example "Battles of the North" or "The War of the Ring". These are the three strings that you would change:
You should also change the names of the "medals" that appear on the map after you win a battle.
[5] Go back to (prefix)_battle.xml and we're going to set up what factions are involved in the historical battle; what map the battle will be fought on; what weather and lighting will be present; what the victory condition is; where the deployment area is; and how big the playable area is. script
tut_tutorial_battle
(prefix)_battle.xml
The Factions
The following example comes from the Battle of the Bastards. Look at the alliance id and <army> tags below. You can see that House Stark and the Vale are two factions on the same team (alliance 0). The Vale is controlled by the AI. You can also see that the two factions have different deployment areas.
The faction/alliance that is listed FIRST in the battle.xml will always be controlled by the player.
You may want to check out other historical battles from Rome 2 or Attila to discover different victory conditions, or ways of doing the deployment area. I generally just leave the victory condition as to kill or rout all enemy units and the deployment area to be bigger than the entire map. This means units can spawn anywhere, and the loading screen won't show a specific deployment area which allows the location of reinforcements/enemies to be a surprise. HOWEVER, this does make it difficult to position units with the guerrilla deployment trait.
It is recommended that you just test random custom battles to find the battle map you’d like to use.
If you use a vanilla siege map, you need to decide whether you want to use an upgraded version of the map, and whether there should be siege escalation (destroyed buildings/walls).
If you want to use a type of battle map other than a normal land battle (for example a port, ambush, river crossing, siege), you need to change the following entry
You also need to consider how big you want the playable area dimensions to be. You may tweak this if you want to remove access to certain parts of a pre-existing map, eg for Fords of Isen I made the playable area smaller so the player couldn't use the river crossing to the north of the map.
Code:
<playable_area dimension="1924"></playable_area>
Weather
You can also choose the precise weather that you want to occur in the battle, for example
I don’t know what the prevailing wind does, it’s probably just for naval battles. Anyways, to choose the environment key you go to data.pack – weather and choose what type of weather you want. You have to test them one by one within the historical battle if you’re trying to get a precise one.
The time_of_day, season and precipitation_type settings under <battle_description> do not seem to have any effect.
Step 2 (Friendly Units)
Spoiler Alert, click show to read:
Background Information
Look at the code below. This example comes from the Battle of the Fist of the First Men from my Battles of the North mod.
As you can see here, the unit is a custom general unit for Jeor Mormont. It's x and y co-ordinates; orientation radians; width; experience level; and unique name are al listed. You can also do other things such as give it special abilities via script, or make it start at 50% strength.
Width determines how stretched out the unit is/how many rows.
In the Battle of the Bastards historical battle script, you may have noticed that the units look like this.
hide_prebattle="true" means that the unit will not appear on the loading screen at the start, so when they appear (eg due to a reinforcement script), it will come as a surprise to the plawyer.
The reason I have unit script_name rather than just plain <unit> is because I have referenced this unit in a reinforcement script in that battle.
Decide how your battle will work.
How many units will each side have? Eg 10 infantry, 4 cavalry, 5 archers.
What specific units will each side have? Eg 5 Palatina Guard, 5 Cohors, 2 Scout Equites, ect.
Once you have worked that out go back to [prefix]_battle.xml
[1] Go to the deployment area for your faction (the very first faction), and change the width and height metres to something insane, this will mean you can position units anywhere on the map. Eg:
[3] Copy and paste this exact line of code for the amount of units you want, eg 19 units. Change the unit script_name for each, eg tutorial_01, tutorial_02, tutorial_03, ect.
[4] Then replace the unit_type with the specific units you want, eg Cohors or Scout Equites
[6] Now go to [prefix]_declarations.lua and create the SUnit script. This will tie all of the units together, and allow you to create orders for the units and position them.
"Stark" refers to the name of the army, and tutorial_02 to the unit script_name in [prefix]_battle.xml.
Ensure that the SUnit group, eg "SUnits_Tutorial_All", matches the SUnit group referenced in [prefix]_start.lua function Start_Battle(). An example is provided below:
Lets do the battle co-ordinates now.
[1] Launch the mod, and your historical battle. After you finish loading, you will see all of your units on top of each other and a big "Start Battle" button. DO NOT click it.
[2] Move all of your units to the positions you want them to be in at the start of your battle.
[3] Once they are all positioned, click the "Start Battle" button, alt tab and go to C:\Program Files (x86)\Steam\steamapps\common\Total War Attila\data, and open Historical_Battle_Camera_log.txt. Each unit's position, orientation, and width will have been logged. The log will look like this:
[4] Now close Attila, and go to [prefix]_battle.xml of your mod.
[5] Replace each unit’s position, orientation radians, and width metres code with the ones that have been generated in Historical_Battle_Camera_log.txt.
[6] Save your mod.
Step 4 (Enemy Units + Positioning Enemy Units)
Spoiler Alert, click show to read:
Now we will do the same for the enemy units.
[1] Go to [prefix]_battle.xml and copy everything between the <army> </army> tags for your faction. Save this in a separate text folder.
[2] Now move everything between YOUR <army> tags to the bottom, so it is in <alliance id="1"> and everything from there to <alliance id="0">. This will make it so you are playing as the enemy.
[3] Now repeat steps 2 and 3, except make sure that the position and orientation radians are as below:
[4] In case you have forgotten, this means copy and paste a unit x amount of times on the same position, give the “enemy” faction a single tutorial placeholder unit, go in-game and set up the units, get their co-ordinates + orientation + width and paste this data into [prefix]_battle.xml.
[5] Once you have done that, swap the <army> tags around again so you have your entire army with its co-ordinates, and the enemy has their entire army with their co-ordinates.
Step 5 (Cutscenes)
Spoiler Alert, click show to read:
[1] The way I set up a cutscene is to make all of the units spawn 50m backwards from the position I set them to in Steps 3 and 4, and then make them walk to the start position during the cutscene whilst I chain together shots of them walking. I’m sure there are fancier ways of doing this, eg chaining together a path of co-ordinates for them to walk to eg walking through city streets but that would require quite a bit of effort.
[2] To set up a cutscene my way, go to [prefix]_cutscenes.lua and look at the following entries:
Code:
local Cutscene_Intro = cutscene:new(
"Cutscene_Intro", -- unique string name for cutscene
ga_franks_01:get_unitcontroller(), -- unitcontroller over player's army
50000 -- duration of cutscene in ms
);
[3] 50,000 is the length of the cutscene in milliseconds (so 50 seconds). Change this to 100 (1/10th of a second) so that the cutscene will end immediately, but the units will still be walking to their position. This will let us put together the shots for our own cutscene.
[4] Now look at "teleport_to_start_location_offset". The -50 in location offset means the units start 50m behind their start position. Keep this (or make it longer/shorter, eg 100m). It will depend on the units of course, but it takes roughly 40 seconds for vanilla infantry to walk 50m. A 40s cutscene seems a good length.
[5] Now go to Cutscene_Intro:action(function() cam:fade(false, 0.5) end, 0); and disable this line by adding -- to the front of it. i.e. -- Cutscene_Intro:action(function() cam:fade(false, 0.5) end, 0);
This will mean the camera does not take half a second to fade in. Once you have finished your cutscene, remember to remove the -- so it functions again.
[6] Now save the mod and launch it. Click Start Battle, and immediately click “P” to pause it.
[7] Move the camera to where you want the cutscene to start, and looking in the direction you want; click the button in the middle bottom of the screen to trigger the camera log script which will write down the co-ordinates that the camera was in at that time; start the battle; pause again after a certain amount of time, eg 5 seconds, and move the camera to where you want it to end up; and click the button again.
These logs will be saved to "Historical_Battle_Camera_log.txt" in C:\Program Files (x86)\Steam\steamapps\common\Total War Attila\data in a format looking like this:
[8] It may be useful to open Historical_Battle_Camera_log.txt and write notes such as those below. These will remind you how long the cutscene should be. Make sure to save the file after each edit you make, so your notes are not overridden by the next set of co-ordinates. Eg:
[9] Rinse and repeat for the cutscene co-ordinates you want.
[10] The final co-ordinates you need are for the shot that the cutscene will end on, and that players will be teleported to if they decide to skip the cutscene. This is broken into two parts – where the camera actually is, and where its looking. Eg the first set of code should be near the top, the 2nd set of code is the final cutscene shot.
[11] Finally, change the duration of the cutscene at the start to however long your cutscene is. I made mine 22 seconds.
Code:
local Cutscene_Intro = cutscene:new(
"Cutscene_Intro", -- unique string name for cutscene
ga_franks_01:get_unitcontroller(), -- unitcontroller over player's army
22000 -- duration of cutscene in ms
);
Step 6 (Subtitles + Advisor)
Spoiler Alert, click show to read:
[1] You can add subtitles to your cutscenes by editing scripted_subtitles_tables and scripted_subtitles.loc, then putting the cutscenes in [prefix]_cutscenes.lua.
It is very self explanatory and easily worked out.
[2] You can also add messages that pop-up mid-battle from the advisor. Eg when a general dies, when youre winning, when the battle starts. You do this by editing advice_levels_tables; advice_threads_tables; advice_levels.loc; and [prefix]_start.lua.
As above, this is very self-explanatory and easily worked out. Look at Att.HB.AD.001 for example. You MAY need to do advice_levels_tables in the Assembly Kit so it will automatically generate a key for you. Otherwise, just override a vanilla advice entry.
[4] If you want the change what the advisor looks like, make sure the Porthole Quality is set to 3D in Graphics Settings and change att_advisor_monk.variantmeshdefinition.
Unfortunately EVERY historical battle will use the SAME advisor, you can’t have a different advisor per battle.
Step 7 (Difficulty Levels)
Spoiler Alert, click show to read:
There are a number of interesting scripts that we have created and saved in script - _historical_battle_library. I will explain difficulty_script_remove_units_per_difficulty.lua and difficulty_script_prevent_reinforcements.lua
[1] Decide whether you want:
a) all the units to spawn at the start, but for the amount of units to be dependent on the difficulty you choose (eg -4 enemy units on easy difficulty; 0 change on normal difficulty; -4 friendly units on hard difficulty)
OR
b) You want extra units to arrive as reinforcements after a certain amount of time (which can also be dependent on difficulty, eg reinforcements only arrive on easy difficulty)
[1] If you want all the units to spawn at the start, but for certain units to be automatically killed at the start of the battle depending on the difficulty you choose, then add difficulty_script_remove_units_per_difficulty.lua to your battle, eg tut_tutorial_battle, alongside all your other scripts. Make sure to add your prefix to the start, eg tut_difficulty_script_remove_units_per_difficulty.lua
[3] Now determine what units you want to remove on each difficulty level. Eg:
Easy (1)
Remove 2 Enemy Units
Normal (0)
Remove 0 Units
Hard (-1)
Remove 2 Friendly Units
Very Hard (-2)
Remove 4 Friendly Units
Legendary (-3)
Remove 6 Friendly Units
[4] I have provided an example of what the above would look like in the template pack.
[5] I bundle Easy and Normal together, and Very Hard and Legendary together by giving them the same options, and renaming the difficulty levels in random_localisation_strings.loc. You may want to do the same.
[6] Make sure you do NOT remove the first unit in an army, this is the general. If you remove it, that army will immediately suffer a morale penalty as their general has died.
[1] If you instead want extra units to arrive as reinforcements after a certain amount of time, then:
- replace [prefix]_reinforcements.lua with reinforcements_script.lua from _historical_battle_library; and
- add difficulty_script_prevent_reinforcements.lua to your battle, eg tut_tutorial_battle, alongside all your other scripts. Make sure to add your prefix to the start, eg tut_difficulty_script_prevent_reinforcements.lua
[3] This script is a bit more complicated.
At the top of the new reinforcements script, it says "Isengard_Reinforcements_1_Countdown = 45000". This means that after 45 seconds this function (Isengard reinforcements) are called. You can also see that it takes another 0.5 seconds for the units to spawn. And then, after another 25 seconds the Isengard reinforcements will go to x103, z-171 and attempt to defend it in a 200m radius. This is a way of directing the AI towards a particular destination and telling it to attack anyone nearby.
[4] If you want you can make a cutscene trigger when the reinforcements spawn.
[5] If you look at [prefix]_difficulty_script_prevent_reinforcements you’ll see that:
a. Isengard Reinforcements 1 ALWAYS spawn;
b. Isengard Reinforcements 2 (which I have deleted) only spawn on Easy or Normal difficulty (1 or 0);
c. Rohan Reinforcements only spawn on Very Hard or Legendary difficulty (-2 or -3).
If you want to have custom audio narration during your cutscene, or custom audio when the battle advisor says something, you will need to override vanilla audio files.
This box is 619x335 pixels big. If we look at data.pack - db - historical_battles_ui_locations_tables we can see that Utus is located at x=619, y=342. It is not 100% pixel perfect, so a bit of trial and error is required to get it in exactly the right position.
Anyways now we go to historical_battles_ui_locations_tables, input the exact same name as you did in battles_table and put the x, y and height percent values in.
If you want subtitles during cutscenes at the start, middle or end of your historical battle then you have to make entries for them here. For example: "HB.BoB.Intro_01" (Historical Battle, Battle of Bastards, Intro 1). There will be no audio for these cutscenes.
These subtitles are also referenced in [prefix]_scripted_subtitles.loc and [prefix]_cutscenes.lua
If you want to make custom audio for these scripted subtitles, change character_for_vo key to “Narrator”. This tutorial will teach you how to import custom audio, and this spreadsheet will help you identify the audio files to override.
lua_scripts
dev.lua and logging_callbacks.lua and util.lua
These three lua scripts contain a camera co-ordinates logger script that is a combination of work by the Rome 2 Total Realism team; DETrooper; Case; DrunkFlamingo; Farfadet; and myself. This script helps in creating historical battles as:
Every time you click "Start Battle" a text file will write down the co-ordinates, width, and orientation/bearing of every unit in your army (so long as you also set this up in [prefix]_battle.xml; [prefix]_declarations.lua and [prefix]_start.lua). This greatly assists in positioning units in battle.xml. The format will look like this:
In addition, every time you click the button in the middle bottom of the screen a text file will write down the co-ordinates that the camera was in at that time. This greatly assists in creating cutscenes. The log is created in "Historical_Battle_Camera_log.txt" which is saved in C:\Program Files (x86)\Steam\steamapps\common\Total War Attila\data in a format looking like this:
If you want to change what button activates the script, change "mon_crest" in logging_callbacks.lua
If you are creating historical battles for a mod that has disabled historical battles (such as The Dawnless Days), you may need to edit that mod’s “frontend_scripted.lua” to remove:
You can make gates of a settlement be forced open;
You can spawn siege equipment for the attackers;
You can make it so immediately after a historical battle, the game launches either a campaign as a specific faction, or another historical battle. The 2nd option would let you make a "campaign" out of historical battles;
You can set it up so the game hides reinforcing armies from appearing in the opening loading screen. So reinforcements will just appear without warning.
screenshot_small.png
This is a 512x256 png file that acts as a little preview image of your historical battle. Here are three examples I've used, and two pictures of them actually in-game. Example 1 Example 2 Example 3
This file determines quite a lot of what happens in the historical battle. Such as what factions are involved in the historical battle, how many (and what) units each faction has, the co-ordinates/orientation/width of the units, whether they have chevrons in experience, what the victory condition is, where the deployment area is, the type of weather and lighting, the battle map and how big the playable area is.
The Factions
The following example comes from the Battle of the Bastards. Look at the alliance id and <army> tags below. You can see that House Stark and the Vale are two factions on the same team. The Vale is controlled by the AI. You can also see that the two factions have different deployment areas.
As you can see here, the unit is a custom general unit for Jeor Mormont. It's x and y co-ordinates are detailed, it's orientation radians is listed (I honestly don't have a clue how you work this out, and it is incredibly annoying), it's width is listed, its experience level and because it is the general I have given it a custom name (which requires files like names_tables and names.loc).
Width determines how stretched out the unit is/how many rows. For infantry units I generally give them 21.70 width, archers get 27.00 and cavalry get 35.00
In the Battle of the Bastards historical battle script, you may have noticed that the units look like this.
hide_prebattle="true" means that the unit will not appear on the loading screen at the start, so when they appear (eg due to a reinforcement script), it will come as a surprise to the plawyer.
The reason I have unit script_name rather than just plain <unit> is because I have referenced this unit in a reinforcement script in that battle.
Weather
With historical battles, you can choose the precise weather that you want to occur in the battle, for example
I don’t know what the prevailing wind does, it’s probably just for naval battles. Anyways, to choose the environment key you go to data.pack – weather and choose what type of weather you want. You have to test them one by one within the historical battle if you’re trying to get a precise one.
The time_of_day, season and precipitation_type settings under <battle_description> do not seem to have any effect.
Battle Map
First off, you have to choose what exact battle map you want to use as your historical battle. You can choose to use a custom battle map, such as
It is recommended that you just test random custom battles to find the battle map you’d like to use.
If you use a vanilla siege map, you need to decide whether you want to use an upgraded version of the map, and whether there should be siege escalation.
If you want to use a type of battle map other than a normal land battle (for example a port, ambush, river crossing, siege), you need to change the following entry
You also need to consider how big you want the playable area dimensions to be.
Code:
<playable_area dimension="1924"></playable_area>
(prefix)_cutscenes.lua
This controls how long the cutscenes are, how long each individual shot is, the co-ordinates each individual shot starts at and tracks to, the subtitles that appear, when the subtitles appear and for how long, whether the two factions march into position during the cutscene and whether there are additional cutscenes such as reinforcements or at the end of the battle.
I believe this is telling the camera what co-ordinates it should be at (more below on co-ordinates), and what it should be looking at when the cutscene ends, or if you skip the cutscene. You will need to play around with this to work it out.
This is telling all ga_franks_01 and ga_soissons_01 units to start 50m away from their start position that is set in battles.xml, and to walk to the start position as the cutscene plays. I believe there are modifiers where you can make them walk or run. Presumably you could even make them walk to numerous different co-ordinates during the cutscenes.
When you use the camera position log script in-game you will notice that the following text is created:
Input the length of the cutscene (this is essentially the speed at which the camera transitions from point A to point B in seconds. Eg it’ll go very slowly if you write 22 seconds, or very fast if you write 2 seconds. You can make it go slowly by writing 22 seconds, but then START the next cutscene after just 8 seconds)
Input the field of view (eg 45 degrees)
Input a start time (this is in milliseconds. Eg if you want the 1st shot to last 20 seconds and the 2nd shot to last 8 seconds then the start time for the first shot is 0, start time for the 2nd shot is 20000, and start time for the 3rd shot is 8000.
All cutscenes come in pairs. Eg 1 and 2; 3 and 4; 5 and 6.
The cutscene length for the first of the pair is ALWAYS 0.
The start time is ALWAYS the same for each pair.
An example of a finished cutscene is below.
Pair 1 and 2 start at 0 seconds, and last for 22 seconds.
Pair 3 and 4 start at 22 seconds and last for 20 seconds
Pair 5 and 6 start at 42 seconds and last for 10 seconds
You can also add subtitles to the cutscene as seen below (also referenced in “scripted_subtitles_tables” and “[prefix]_scripted_subtitles.loc”).
You can see each subtitle has a start time, and then a function to end that subtitle at a certain time (eg AT 20 seconds, NOT AFTER 20 seconds).
You can also trigger cutscenes to occur after reinforcements arrive.
(prefix)_declarations.lua
This file contains parts of the logging scripts, and the unit scripts. The unit scripts section is necessary if you want to reference units in scripts, eg the logging scripts, reinforcement scripts, or difficulty handicap scripts.
There must be two alliances, and then you list each army in those alliances.
You then type in the script names for those units, and what army they’re part of.
SUnits_ binds certain units together, eg so you can issue them all commands in a script.
(prefix)_script_reinforcements.lua
This file contains the reinforcement scripts, if you want to use them.
The countdown at the top is in milliseconds. Therefore, 5000 = 5 seconds and 360000 = 6 minutes.
You can also tie the reinforcement scripts to trigger certain cutscenes when the reinforcements arrive. Check vanilla historical battles, or “Battle of the Bastards” to see how this may be done.
“SAI_Isengard_Reinforcement_1:defend_position(v(103, -171), 200)” directs this reinforcement army to go to, and defend the position x103 y-171 in a radius of 200m. This should force it to attack any enemy units in that radius. This function does not appear to kick in until 25 seconds have elapsed.
(prefix)_start.lua
[prefix]_start.lua requires very little editing.
You may turn the logging on/off by typing true or false (not sure whether this actually works anymore);
You can swap between dev mode and battle mode by changing "false" to "true"
Code:
gb = generated_battle:new(
false, -- screen starts black. Should match the prepare_for_fade_in flag in the battle xml
false, -- prevents deployment. Set to false if you want the player to be able to deploy.
function() Play_Cutscene_Intro() end, -- intro cutscene callback. Supply a function that runs your intro cutscene here
false -- debug mode
);
You will also need to change the SUnits referred to in function Start_Battle() to match [prefix]_declarations.lua
You can decide whether the battle starts with the AI immediately attacking you;
You can prevent certain scripts from working by adding -- to the start, eg:
You can make the Advisor say stuff when the battle starts, when your general/the enemy general dies, and when you win/lose. See vanilla examples or Battle of the Bastards:
Code:
-- advice on battle start
gb:advice_on_message("cutscene_ended", "SK.HB.BA.001", 5000);
-- advice on player's general dying
ga_franks_01:message_on_commander_death("player_general_dies");
gb:advice_on_message("player_general_dies", "SK.HB.BA.002", 2500);
-- advice on enemy general dying
ga_soissons_01:message_on_commander_death("enemy_general_dies");
gb:advice_on_message("enemy_general_dies", "SK.HB.BA.003", 2500);
-- advice on player winning
ga_franks_01:message_on_victory("player_wins");
gb:advice_on_message("player_wins", "SK.HB.BA.004");
-- advice on player losing
ga_franks_01:message_on_defeat("player_loses");
gb:advice_on_message("player_loses", "SK.HB.BA.005");
text
db
random_localisation_strings.loc
This is a text file where you can change what each difficulty level is called (if you want to). The default difficulties are Easy, Normal, Hard, Very Hard, Legendary. In “The War of the Ring” I changed the difficulties as follows:
This is a text file where you put in the name, and the description of your historical battles. For example...
battles_localised_name_battleofthebastards
Battle of the Bastards
battles_description_battleofthebastards
The Bastard of the Dreadfort and Warden of the North, Ramsay Bolton, holds Winterfell – the ancestral seat of House Stark. Jon Snow, the Bastard of Winterfell has come to reclaim his home at the head of a ragged army of Wildlings, and bannermen loyal to his cause. The bastards will clash outside the walls of Winterfell, where only one may emerge victorious.
scripted_subtitles.loc
This is a text file where you put in the subtitles for your cutscenes. For example...
This is a text file where you can change the text displaying "Historical Battles" to whatever custom text you want, for example "Battles of the North" or "The War of the Ring". These are the three strings that you would change:
All other tables and entries in the tutorial pack are not strictly required for a historical battle, but you may end up using them eg if you want to have custom units, custom maps, custom UI, ect, in your battles.
Last edited by Commissar Caligula_; September 29, 2022 at 04:15 AM.
I've recently updated the tutorial to v2.0, this is a first draft, so can you please give me feedback and whether it is clear enough for you to make a historical battle?
The template pack now includes quite a few cool scripts including:
A script which makes it very easy way to position your units at the start.
A script which automatically logs the co-ordinates, width, and orientation of every unit when you start the battle.
A script which logs the camera's co-ordinates every time you press a certain button so you can create stunning cutscenes.
A script which lets you spawn reinforcements
A script which lets you kill off and/or damage certain units at the start of a battle, to make the difficulty level easier or harder
A script which lets you prevent certain reinforcements from spawning, depending on the difficulty level chosen
I'm going to update the pack and this tutorial with a few tips n tricks soon, but here's the biggest one that I just came up with.
If you extract the contents of your script folder to Steam\steamapps\common\Total War Attila\data and delete them from the actual pack, you can edit the lua and xml files whilst in-game! This means that you don't need to shut down Attila, edit the pack, save it, then re-launch Attila just to correct a minor problem. Instead just fix the .xml or .lua file, quit to the main menu, and relaunch the battle.