<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.lancertactics.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Darloth</id>
	<title>The Muse - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.lancertactics.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Darloth"/>
	<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/Special:Contributions/Darloth"/>
	<updated>2026-08-27T14:54:35Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Modding_Cookbook&amp;diff=182</id>
		<title>Modding Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Modding_Cookbook&amp;diff=182"/>
		<updated>2026-08-06T19:03:15Z</updated>

		<summary type="html">&lt;p&gt;Darloth: /* Make your mod */ - thumbnail minimums&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Make your mod ==&lt;br /&gt;
&lt;br /&gt;
# Get hands on the project source code, hopefully via the modkit download on itch.io or another channel from Wickworks.&lt;br /&gt;
# Open it in the Godot editor (4.7 currently)&lt;br /&gt;
# Go to Project Settings → Plugins and enable Mod Loader Dev Tool (it&#039;ll be the only thing that&#039;s unchecked)&lt;br /&gt;
# There&#039;s now a tab call &amp;quot;Mod Tool&amp;quot;  at the top-center of the window. Press the &amp;quot;Create new Mod&amp;quot; button, fill out the fields, and press Create.  Your mod will need to have at least 3 characters in both author and mod name, and it&#039;s best not to use any special characters aside from _ and -&lt;br /&gt;
## See [[Modding#Mod Types &amp;amp; Security|Mod Types]] for the difference between an Asset Pack, Content Pack, and Substantial mod. You can change what type it is later by adding scripts or toggling requires_restart.&amp;lt;br&amp;gt; NOTE: If you wish to create an Asset Pack, there&#039;s currently a bug that will prevent it being created correctly unless you select a Content Pack first, then switch back to Asset Pack.&lt;br /&gt;
# Fill out any information you&#039;d like to provide in manifest fields.  The manifest should be automatically saved.&lt;br /&gt;
# In the FileSystem window, you should see folder with the name of your mod under unpacked/, with a manifest.json and a mod_main.gd file.&lt;br /&gt;
# (optional) Update thumbnail.png with the image you want to represent your mod.  The thumbnail should be in 16:9 ratio, and has a minimum size of 640x360 pixels.&lt;br /&gt;
&lt;br /&gt;
== Replace existing resources and scenes ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the file you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Asset Override&amp;quot; from the context menu.&lt;br /&gt;
# This will copy the resource to your mod&#039;s folder under res/ + the original path.&lt;br /&gt;
# Modify the resource in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
It will be automatically swapped in to the game&#039;s virtual filesystem at the vanilla path when the mod is activated by your mod_main.gd&#039;s &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;Resource.take_over_path&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warning: If multiple mods replace the same resource, only the last one will take effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add new resources and scenes ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Add them to your mod&#039;s res/ directory in a folder mirroring where they&#039;d be in the base game data. For example, if you wanted to add a new available sprite for the napoleon at:&lt;br /&gt;
 res://assets/frames/ha/mf_napoleon/&lt;br /&gt;
&lt;br /&gt;
You&#039;d add your image at:&lt;br /&gt;
 res://unpacked/Mod-Name/res/assets/frames/ha/mf_napoleon/&lt;br /&gt;
&lt;br /&gt;
It will be automatically added to the game&#039;s virtual filesystem at the vanilla path when the mod is activated by your mod_main.gd&#039;s &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;Resource.take_over_path&amp;lt;/code&amp;gt;. If you&#039;re making an asset pack, the default mod_main that will be used handles this instead.&lt;br /&gt;
&lt;br /&gt;
Warning: If multiple mods add a new resource with the same path + name, only the last one will take effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Remove existing resources ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
TODO: some way to mark a resource as something to remove. An extra extension?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modify existing resource ==&lt;br /&gt;
&#039;&#039;(.tres)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the resource you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Resource Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script in your mod&#039;s folder under res/ + the original path, with the extension .tres_ext.gd&lt;br /&gt;
# Modify the scene through the generated script&#039;s modify_resource function, as desired.&lt;br /&gt;
&lt;br /&gt;
For example, to add the Barbarossa as an alt frame of the Napoleon license, find and Create Resource Extension for the li_napoleon.tres.  In the resulting li_napoleon.tres_ext.gd file, you would put:&lt;br /&gt;
&lt;br /&gt;
 func modify_resource(resource:Resource) -&amp;gt; Resource:&lt;br /&gt;
 	var license:UnlockTree = resource&lt;br /&gt;
 &lt;br /&gt;
 	var barb := load(&#039;res://content/frames/ha/mf_barbarossa/mf_barbarossa.tres&#039;)&lt;br /&gt;
 	license.rank_2.granted_frames.append(barb)&lt;br /&gt;
 &lt;br /&gt;
 	return license&lt;br /&gt;
&lt;br /&gt;
Note: modify_resource is run after resources are moved in the virtual filesystem from your mod&#039;s res/ directory into their res:// locations, so I *believe* that if you load new resources from your mod you should use their res://content/... paths instead of the unpacked location.&lt;br /&gt;
&lt;br /&gt;
To be safe, a function such as this can always return what should be the correct path:&lt;br /&gt;
&lt;br /&gt;
 func sload(file: String):&lt;br /&gt;
    if(ResourceLoader.exists(file)):&lt;br /&gt;
        return ResourceLoader.load(file)&lt;br /&gt;
    else:&lt;br /&gt;
        return ResourceLoader.load(&#039;res://&#039;+file.split(&#039;/res/&#039;)[1])&lt;br /&gt;
&lt;br /&gt;
Then use sload instead of load to load resource references.&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same resource.&lt;br /&gt;
&lt;br /&gt;
== Modify existing scenes ==&lt;br /&gt;
&#039;&#039;(.tscn)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the scene you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Scene Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script in your mod&#039;s folder under res/ + the original path, with the extension .tscn_ext.gd&lt;br /&gt;
# Modify the scene through the generated script&#039;s modify_scene function, as desired.&lt;br /&gt;
&lt;br /&gt;
Note: if you add new nodes to the modified scene, you MUST set the [https://docs.godotengine.org/en/stable/classes/class_node.html#class-node-property-owner owner] of that child to the scene after adding it as a child, e.g.&lt;br /&gt;
&lt;br /&gt;
 func modify_scene(scene:Node) -&amp;gt; Node:&lt;br /&gt;
 	# Modify an existing node.&lt;br /&gt;
 	var label: Label = scene_instance.get_node(&amp;quot;Maybe/Some/NodeHere&amp;quot;)&lt;br /&gt;
 	label.text += &amp;quot; modified&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 	# Add a new node.&lt;br /&gt;
 	var new_node: Node = Node.new()&lt;br /&gt;
 	scene_instance.add_child(new_node)&lt;br /&gt;
 	new_node.owner = scene # Must come after add_child for all added nodes.&lt;br /&gt;
 &lt;br /&gt;
 	return scene_instance&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same scene.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Extend existing scripts ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/script_extensions/&lt;br /&gt;
&lt;br /&gt;
# Navigate to the script you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Script Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script to your mod&#039;s folder under res/ + the original path, extending the vanilla script, with the extension .gd_ext.gd&lt;br /&gt;
# Modify the extending script in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same script, via &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;ModLoaderMod.install_script_extension&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you change an autoload, that autoload will be reloaded after all mods are applied.&lt;br /&gt;
&lt;br /&gt;
If you find that the autoload&#039;s functions do not run your extended code, you may need to manually refresh the script of an autoload after your mod&#039;s mod_main._init() function.  Example code that does this for the UnitRelation autoload is provided below, you&#039;ll need to adjust it to the specific autoloads that you&#039;re affecting.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
func _init() -&amp;gt; void:&lt;br /&gt;
    ModLoaderLog.info(&amp;quot;Activating.&amp;quot;, MOD_ID)&lt;br /&gt;
&lt;br /&gt;
    LancerTacticsMod.add_translations(MOD_ID)&lt;br /&gt;
&lt;br /&gt;
    LancerTacticsMod.add_overwrite_extend_mod_resources(MOD_ID)&lt;br /&gt;
    # other things might be here&lt;br /&gt;
    # ... &lt;br /&gt;
    call_deferred(&amp;amp;&amp;quot;fix_scripts&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
func fix_scripts():&lt;br /&gt;
    #print(&amp;quot;fix UnitRelation&amp;quot;)&lt;br /&gt;
    UnitRelation.set_script(load(&amp;quot;res://engine/character/unit/service/unit_relation.gd&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WARNING: Due to unknown reasons, if a static function on an autoload calls other static functions on the same autoload more than two function calls deep, it reverts to the original code rather than the extended code.  So far no workaround has been discovered.&lt;br /&gt;
&lt;br /&gt;
WARNING: Due to a bug in Godot, we can&#039;t extend scripts with a class_name. See [[Modding#Hooks and class name scripts|Hooks and class name scripts]] for details.&lt;br /&gt;
&lt;br /&gt;
== Replace existing scripts ==&lt;br /&gt;
&lt;br /&gt;
# Navigate to the script you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Asset Override&amp;quot; from the context menu.&lt;br /&gt;
# This will copy the script to your mod&#039;s folder under res/ + the original path.&lt;br /&gt;
# Modify the replacing script in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
This will likely conflict with any other mods that also attempt to replace or extend this script. However, this is the only way to change static vars. Godot appears to cache consts at a script-path level, so as far as I can tell there&#039;s no way to change a const on an object/script after it&#039;s been declared, even by completely replacing the script.&lt;br /&gt;
&lt;br /&gt;
You should very probably include definitions for everything the original script did, or you&#039;ll crash as soon as something asks for a now-missing value (unless this replacement is also extending something that covers those functions).&lt;br /&gt;
&lt;br /&gt;
If you change an autoload, that autoload will be reloaded after all mods are applied.&lt;br /&gt;
&lt;br /&gt;
== Localizations &amp;amp; text ==&lt;br /&gt;
&lt;br /&gt;
Generating a mod from a template will create a localization/localizations.csv file in your mod folder. These key/value pairs are used to figure out what text to show in the game for kits/frames/everything. You can see the shipped assets/localization/localizations.csv file for examples of all the base game text.&lt;br /&gt;
&lt;br /&gt;
You can add your own keys in a likewise format in your own file — I recommend an external spreadsheet editor over godot&#039;s text editor to automatically handle internal commas and quotation marks. Alternatively, there is a second tab next to the Manifest Editor in the Mod Tool section called &amp;quot;Localization Editor&amp;quot;. I haven&#039;t thoroughly tested it, but it gives some basic controls for adding new key/values in the expected format and a button to regenerate localizations (possibly necessary to see the changes show up).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add custom sound fx ==&lt;br /&gt;
&lt;br /&gt;
https://www.fmod.com/docs/2.01/studio/supporting-downloadable-and-user-generated-content.html&lt;br /&gt;
&lt;br /&gt;
I haven&#039;t actually tested it, but if you open the Lancer Tactics FMOD project and export your own bank as described above, you should be able to add your .bank file anywhere in your mod&#039;s res/ directory and it&#039;ll be automatically picked up and loaded in (and subsequently unloaded if the mod is disabled).&lt;br /&gt;
&lt;br /&gt;
New banks must be named by either prefixing or suffixing the bank they&#039;re adding onto. For example, if I&#039;m making a new music bank, since the baseline bank is called &amp;quot;music.bank&amp;quot; mine has to look like &amp;quot;my_music.bank&amp;quot; or &amp;quot;music_thunderdome.bank&amp;quot;. This is because the FMOD addon crashes if we ever try to play an event not in the banks so we have to cache what events are available for each category.&lt;br /&gt;
&lt;br /&gt;
If you feel motivated to test this, let me know how it goes!&lt;br /&gt;
&lt;br /&gt;
== Modify how COMP/CON imports pilots ==&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics is strict about what sorts of prefixes it looks for in resources. If you&#039;re working with a more loosey-goosey ID that was made for COMP/CON (such as the practice of adding prefixes based on the supplement), you can make a mod that tells LT how to map the C/C ID.&lt;br /&gt;
&lt;br /&gt;
# Extend the compcon_importer script: &amp;lt;code&amp;gt;res://ui/page/pilot_roster/compcon_importer.gd&amp;lt;/code&amp;gt;&lt;br /&gt;
# Extend the get_compcon_id_remap function.&lt;br /&gt;
# Call super.get_compcon_id_remap() within it, then add whatever C/C -&amp;gt; LT IDs to the dictionary that you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
== Player configuration ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/config_json/&lt;br /&gt;
&lt;br /&gt;
You can allow the player to configure your mod through inputs in the mod manager, ie, toggle booleans, pick from dropdowns, and enter text+numbers that your mod can then consume.&lt;br /&gt;
&lt;br /&gt;
Define the config as described in the above documentation inside of your manifest.json file, and get the player&#039;s current values with &amp;lt;code&amp;gt;ModLoaderConfig.get_current_config(&amp;quot;your_mod_id&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics currently only supports numbers, strings, and boolean inputs. Let me know if you need more than that!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/using_other_mods/#dependencies-and-load-order&lt;br /&gt;
&lt;br /&gt;
If your mod requires another mod to function, you need to do two things:&lt;br /&gt;
&lt;br /&gt;
# Add the other mod&#039;s folder ID (in the Namespace-ModName format) in the &amp;quot;Dependencies&amp;quot; section of your manifest. This will tell the mod loader to load their mod first.&lt;br /&gt;
# Tell mod.io about the dependency by going to &amp;lt;code&amp;gt;mod.io/g/lancer-tactics/m/[YOUR MOD SLUG HERE]/admin/settings#dependencies&amp;lt;/code&amp;gt; and selecting the other mod from the search bar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Export + upload your mod to share ==&lt;br /&gt;
&lt;br /&gt;
Mods are loaded by player&#039;s games by looking for .zip files in their user mods/ folder. In order to get them set up with the mod, we need to create that zip and get it into their folder. There are three options:&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
In the bottom-center of the Mod Tool tab, there&#039;s an &amp;quot;Export as .zip&amp;quot; button. Pressing it will pack the current mod into a zip file at the designated location.&lt;br /&gt;
&lt;br /&gt;
You can drag the zipped mod to your own user data mods/ folder, or send it to your friends so they can do so for their own games. No need to get a third party involved.&lt;br /&gt;
&lt;br /&gt;
=== Mod.io, via the Mod Tool ===&lt;br /&gt;
In the bottom-right of the Mod Tool tab, there&#039;s a &amp;quot;Upload&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
# Authenticate with mod.io from the Omninet page in the running game, if you haven&#039;t already. This will save a token to your settings.cfg&lt;br /&gt;
# Verify that it shows you as logged in as the appropriate email, and press &amp;quot;Check status&amp;quot; button to verify your connection to mod.io.&lt;br /&gt;
# Press &amp;quot;Upload to mod.io&amp;quot; and confirm.&lt;br /&gt;
&lt;br /&gt;
You should now be able to see and manage your mod online at https://mod.io/content#mods&lt;br /&gt;
&lt;br /&gt;
=== Mod.io, via the browser ===&lt;br /&gt;
You can upload a mod from outside the Mod Tool by uploading the exported .zip file you made in the manual option above. Mod.io&#039;s flow for doing so is fairly intuitive, but to be loaded by the game you must include this json in the Metadata section for the mod, filling in values as appropriate:&lt;br /&gt;
 {&lt;br /&gt;
 	&amp;quot;game_version&amp;quot;:&amp;quot;X.X.X&amp;quot;,&lt;br /&gt;
 	&amp;quot;mod_id&amp;quot;:&amp;quot;YourNamespace-YourMod&amp;quot;,&lt;br /&gt;
 	&amp;quot;revision&amp;quot;:1,&lt;br /&gt;
 	&amp;quot;version&amp;quot;:&amp;quot;1.0.0&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
* game_version: The version of Lancer Tactics you expect this mod to work on.&lt;br /&gt;
* mod_id: The ID of your mod, in the Namespace-Modname format (matches its folder when unpacked)&lt;br /&gt;
* revision: Doesn&#039;t matter too much; just for information. Incremented by the game each time it uploads something new.&lt;br /&gt;
* version: The [https://semver.org/ semantic versioning] of your mod.&lt;/div&gt;</summary>
		<author><name>Darloth</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Modding_Cookbook&amp;diff=181</id>
		<title>Modding Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Modding_Cookbook&amp;diff=181"/>
		<updated>2026-08-06T19:02:12Z</updated>

		<summary type="html">&lt;p&gt;Darloth: /* Make your mod */ - advice on mod name, no more save manifest button&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Make your mod ==&lt;br /&gt;
&lt;br /&gt;
# Get hands on the project source code, hopefully via the modkit download on itch.io or another channel from Wickworks.&lt;br /&gt;
# Open it in the Godot editor (4.7 currently)&lt;br /&gt;
# Go to Project Settings → Plugins and enable Mod Loader Dev Tool (it&#039;ll be the only thing that&#039;s unchecked)&lt;br /&gt;
# There&#039;s now a tab call &amp;quot;Mod Tool&amp;quot;  at the top-center of the window. Press the &amp;quot;Create new Mod&amp;quot; button, fill out the fields, and press Create.  Your mod will need to have at least 3 characters in both author and mod name, and it&#039;s best not to use any special characters aside from _ and -&lt;br /&gt;
## See [[Modding#Mod Types &amp;amp; Security|Mod Types]] for the difference between an Asset Pack, Content Pack, and Substantial mod. You can change what type it is later by adding scripts or toggling requires_restart.&amp;lt;br&amp;gt; NOTE: If you wish to create an Asset Pack, there&#039;s currently a bug that will prevent it being created correctly unless you select a Content Pack first, then switch back to Asset Pack.&lt;br /&gt;
# Fill out any information you&#039;d like to provide in manifest fields.  The manifest should be automatically saved.&lt;br /&gt;
# In the FileSystem window, you should see folder with the name of your mod under unpacked/, with a manifest.json and a mod_main.gd file.&lt;br /&gt;
# (optional) Update thumbnail.png with the image you want to represent your mod.&lt;br /&gt;
&lt;br /&gt;
== Replace existing resources and scenes ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the file you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Asset Override&amp;quot; from the context menu.&lt;br /&gt;
# This will copy the resource to your mod&#039;s folder under res/ + the original path.&lt;br /&gt;
# Modify the resource in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
It will be automatically swapped in to the game&#039;s virtual filesystem at the vanilla path when the mod is activated by your mod_main.gd&#039;s &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;Resource.take_over_path&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warning: If multiple mods replace the same resource, only the last one will take effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add new resources and scenes ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Add them to your mod&#039;s res/ directory in a folder mirroring where they&#039;d be in the base game data. For example, if you wanted to add a new available sprite for the napoleon at:&lt;br /&gt;
 res://assets/frames/ha/mf_napoleon/&lt;br /&gt;
&lt;br /&gt;
You&#039;d add your image at:&lt;br /&gt;
 res://unpacked/Mod-Name/res/assets/frames/ha/mf_napoleon/&lt;br /&gt;
&lt;br /&gt;
It will be automatically added to the game&#039;s virtual filesystem at the vanilla path when the mod is activated by your mod_main.gd&#039;s &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;Resource.take_over_path&amp;lt;/code&amp;gt;. If you&#039;re making an asset pack, the default mod_main that will be used handles this instead.&lt;br /&gt;
&lt;br /&gt;
Warning: If multiple mods add a new resource with the same path + name, only the last one will take effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Remove existing resources ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
TODO: some way to mark a resource as something to remove. An extra extension?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modify existing resource ==&lt;br /&gt;
&#039;&#039;(.tres)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the resource you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Resource Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script in your mod&#039;s folder under res/ + the original path, with the extension .tres_ext.gd&lt;br /&gt;
# Modify the scene through the generated script&#039;s modify_resource function, as desired.&lt;br /&gt;
&lt;br /&gt;
For example, to add the Barbarossa as an alt frame of the Napoleon license, find and Create Resource Extension for the li_napoleon.tres.  In the resulting li_napoleon.tres_ext.gd file, you would put:&lt;br /&gt;
&lt;br /&gt;
 func modify_resource(resource:Resource) -&amp;gt; Resource:&lt;br /&gt;
 	var license:UnlockTree = resource&lt;br /&gt;
 &lt;br /&gt;
 	var barb := load(&#039;res://content/frames/ha/mf_barbarossa/mf_barbarossa.tres&#039;)&lt;br /&gt;
 	license.rank_2.granted_frames.append(barb)&lt;br /&gt;
 &lt;br /&gt;
 	return license&lt;br /&gt;
&lt;br /&gt;
Note: modify_resource is run after resources are moved in the virtual filesystem from your mod&#039;s res/ directory into their res:// locations, so I *believe* that if you load new resources from your mod you should use their res://content/... paths instead of the unpacked location.&lt;br /&gt;
&lt;br /&gt;
To be safe, a function such as this can always return what should be the correct path:&lt;br /&gt;
&lt;br /&gt;
 func sload(file: String):&lt;br /&gt;
    if(ResourceLoader.exists(file)):&lt;br /&gt;
        return ResourceLoader.load(file)&lt;br /&gt;
    else:&lt;br /&gt;
        return ResourceLoader.load(&#039;res://&#039;+file.split(&#039;/res/&#039;)[1])&lt;br /&gt;
&lt;br /&gt;
Then use sload instead of load to load resource references.&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same resource.&lt;br /&gt;
&lt;br /&gt;
== Modify existing scenes ==&lt;br /&gt;
&#039;&#039;(.tscn)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the scene you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Scene Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script in your mod&#039;s folder under res/ + the original path, with the extension .tscn_ext.gd&lt;br /&gt;
# Modify the scene through the generated script&#039;s modify_scene function, as desired.&lt;br /&gt;
&lt;br /&gt;
Note: if you add new nodes to the modified scene, you MUST set the [https://docs.godotengine.org/en/stable/classes/class_node.html#class-node-property-owner owner] of that child to the scene after adding it as a child, e.g.&lt;br /&gt;
&lt;br /&gt;
 func modify_scene(scene:Node) -&amp;gt; Node:&lt;br /&gt;
 	# Modify an existing node.&lt;br /&gt;
 	var label: Label = scene_instance.get_node(&amp;quot;Maybe/Some/NodeHere&amp;quot;)&lt;br /&gt;
 	label.text += &amp;quot; modified&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 	# Add a new node.&lt;br /&gt;
 	var new_node: Node = Node.new()&lt;br /&gt;
 	scene_instance.add_child(new_node)&lt;br /&gt;
 	new_node.owner = scene # Must come after add_child for all added nodes.&lt;br /&gt;
 &lt;br /&gt;
 	return scene_instance&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same scene.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Extend existing scripts ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/script_extensions/&lt;br /&gt;
&lt;br /&gt;
# Navigate to the script you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Script Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script to your mod&#039;s folder under res/ + the original path, extending the vanilla script, with the extension .gd_ext.gd&lt;br /&gt;
# Modify the extending script in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same script, via &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;ModLoaderMod.install_script_extension&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you change an autoload, that autoload will be reloaded after all mods are applied.&lt;br /&gt;
&lt;br /&gt;
If you find that the autoload&#039;s functions do not run your extended code, you may need to manually refresh the script of an autoload after your mod&#039;s mod_main._init() function.  Example code that does this for the UnitRelation autoload is provided below, you&#039;ll need to adjust it to the specific autoloads that you&#039;re affecting.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
func _init() -&amp;gt; void:&lt;br /&gt;
    ModLoaderLog.info(&amp;quot;Activating.&amp;quot;, MOD_ID)&lt;br /&gt;
&lt;br /&gt;
    LancerTacticsMod.add_translations(MOD_ID)&lt;br /&gt;
&lt;br /&gt;
    LancerTacticsMod.add_overwrite_extend_mod_resources(MOD_ID)&lt;br /&gt;
    # other things might be here&lt;br /&gt;
    # ... &lt;br /&gt;
    call_deferred(&amp;amp;&amp;quot;fix_scripts&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
func fix_scripts():&lt;br /&gt;
    #print(&amp;quot;fix UnitRelation&amp;quot;)&lt;br /&gt;
    UnitRelation.set_script(load(&amp;quot;res://engine/character/unit/service/unit_relation.gd&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WARNING: Due to unknown reasons, if a static function on an autoload calls other static functions on the same autoload more than two function calls deep, it reverts to the original code rather than the extended code.  So far no workaround has been discovered.&lt;br /&gt;
&lt;br /&gt;
WARNING: Due to a bug in Godot, we can&#039;t extend scripts with a class_name. See [[Modding#Hooks and class name scripts|Hooks and class name scripts]] for details.&lt;br /&gt;
&lt;br /&gt;
== Replace existing scripts ==&lt;br /&gt;
&lt;br /&gt;
# Navigate to the script you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Asset Override&amp;quot; from the context menu.&lt;br /&gt;
# This will copy the script to your mod&#039;s folder under res/ + the original path.&lt;br /&gt;
# Modify the replacing script in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
This will likely conflict with any other mods that also attempt to replace or extend this script. However, this is the only way to change static vars. Godot appears to cache consts at a script-path level, so as far as I can tell there&#039;s no way to change a const on an object/script after it&#039;s been declared, even by completely replacing the script.&lt;br /&gt;
&lt;br /&gt;
You should very probably include definitions for everything the original script did, or you&#039;ll crash as soon as something asks for a now-missing value (unless this replacement is also extending something that covers those functions).&lt;br /&gt;
&lt;br /&gt;
If you change an autoload, that autoload will be reloaded after all mods are applied.&lt;br /&gt;
&lt;br /&gt;
== Localizations &amp;amp; text ==&lt;br /&gt;
&lt;br /&gt;
Generating a mod from a template will create a localization/localizations.csv file in your mod folder. These key/value pairs are used to figure out what text to show in the game for kits/frames/everything. You can see the shipped assets/localization/localizations.csv file for examples of all the base game text.&lt;br /&gt;
&lt;br /&gt;
You can add your own keys in a likewise format in your own file — I recommend an external spreadsheet editor over godot&#039;s text editor to automatically handle internal commas and quotation marks. Alternatively, there is a second tab next to the Manifest Editor in the Mod Tool section called &amp;quot;Localization Editor&amp;quot;. I haven&#039;t thoroughly tested it, but it gives some basic controls for adding new key/values in the expected format and a button to regenerate localizations (possibly necessary to see the changes show up).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add custom sound fx ==&lt;br /&gt;
&lt;br /&gt;
https://www.fmod.com/docs/2.01/studio/supporting-downloadable-and-user-generated-content.html&lt;br /&gt;
&lt;br /&gt;
I haven&#039;t actually tested it, but if you open the Lancer Tactics FMOD project and export your own bank as described above, you should be able to add your .bank file anywhere in your mod&#039;s res/ directory and it&#039;ll be automatically picked up and loaded in (and subsequently unloaded if the mod is disabled).&lt;br /&gt;
&lt;br /&gt;
New banks must be named by either prefixing or suffixing the bank they&#039;re adding onto. For example, if I&#039;m making a new music bank, since the baseline bank is called &amp;quot;music.bank&amp;quot; mine has to look like &amp;quot;my_music.bank&amp;quot; or &amp;quot;music_thunderdome.bank&amp;quot;. This is because the FMOD addon crashes if we ever try to play an event not in the banks so we have to cache what events are available for each category.&lt;br /&gt;
&lt;br /&gt;
If you feel motivated to test this, let me know how it goes!&lt;br /&gt;
&lt;br /&gt;
== Modify how COMP/CON imports pilots ==&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics is strict about what sorts of prefixes it looks for in resources. If you&#039;re working with a more loosey-goosey ID that was made for COMP/CON (such as the practice of adding prefixes based on the supplement), you can make a mod that tells LT how to map the C/C ID.&lt;br /&gt;
&lt;br /&gt;
# Extend the compcon_importer script: &amp;lt;code&amp;gt;res://ui/page/pilot_roster/compcon_importer.gd&amp;lt;/code&amp;gt;&lt;br /&gt;
# Extend the get_compcon_id_remap function.&lt;br /&gt;
# Call super.get_compcon_id_remap() within it, then add whatever C/C -&amp;gt; LT IDs to the dictionary that you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
== Player configuration ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/config_json/&lt;br /&gt;
&lt;br /&gt;
You can allow the player to configure your mod through inputs in the mod manager, ie, toggle booleans, pick from dropdowns, and enter text+numbers that your mod can then consume.&lt;br /&gt;
&lt;br /&gt;
Define the config as described in the above documentation inside of your manifest.json file, and get the player&#039;s current values with &amp;lt;code&amp;gt;ModLoaderConfig.get_current_config(&amp;quot;your_mod_id&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics currently only supports numbers, strings, and boolean inputs. Let me know if you need more than that!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/using_other_mods/#dependencies-and-load-order&lt;br /&gt;
&lt;br /&gt;
If your mod requires another mod to function, you need to do two things:&lt;br /&gt;
&lt;br /&gt;
# Add the other mod&#039;s folder ID (in the Namespace-ModName format) in the &amp;quot;Dependencies&amp;quot; section of your manifest. This will tell the mod loader to load their mod first.&lt;br /&gt;
# Tell mod.io about the dependency by going to &amp;lt;code&amp;gt;mod.io/g/lancer-tactics/m/[YOUR MOD SLUG HERE]/admin/settings#dependencies&amp;lt;/code&amp;gt; and selecting the other mod from the search bar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Export + upload your mod to share ==&lt;br /&gt;
&lt;br /&gt;
Mods are loaded by player&#039;s games by looking for .zip files in their user mods/ folder. In order to get them set up with the mod, we need to create that zip and get it into their folder. There are three options:&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
In the bottom-center of the Mod Tool tab, there&#039;s an &amp;quot;Export as .zip&amp;quot; button. Pressing it will pack the current mod into a zip file at the designated location.&lt;br /&gt;
&lt;br /&gt;
You can drag the zipped mod to your own user data mods/ folder, or send it to your friends so they can do so for their own games. No need to get a third party involved.&lt;br /&gt;
&lt;br /&gt;
=== Mod.io, via the Mod Tool ===&lt;br /&gt;
In the bottom-right of the Mod Tool tab, there&#039;s a &amp;quot;Upload&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
# Authenticate with mod.io from the Omninet page in the running game, if you haven&#039;t already. This will save a token to your settings.cfg&lt;br /&gt;
# Verify that it shows you as logged in as the appropriate email, and press &amp;quot;Check status&amp;quot; button to verify your connection to mod.io.&lt;br /&gt;
# Press &amp;quot;Upload to mod.io&amp;quot; and confirm.&lt;br /&gt;
&lt;br /&gt;
You should now be able to see and manage your mod online at https://mod.io/content#mods&lt;br /&gt;
&lt;br /&gt;
=== Mod.io, via the browser ===&lt;br /&gt;
You can upload a mod from outside the Mod Tool by uploading the exported .zip file you made in the manual option above. Mod.io&#039;s flow for doing so is fairly intuitive, but to be loaded by the game you must include this json in the Metadata section for the mod, filling in values as appropriate:&lt;br /&gt;
 {&lt;br /&gt;
 	&amp;quot;game_version&amp;quot;:&amp;quot;X.X.X&amp;quot;,&lt;br /&gt;
 	&amp;quot;mod_id&amp;quot;:&amp;quot;YourNamespace-YourMod&amp;quot;,&lt;br /&gt;
 	&amp;quot;revision&amp;quot;:1,&lt;br /&gt;
 	&amp;quot;version&amp;quot;:&amp;quot;1.0.0&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
* game_version: The version of Lancer Tactics you expect this mod to work on.&lt;br /&gt;
* mod_id: The ID of your mod, in the Namespace-Modname format (matches its folder when unpacked)&lt;br /&gt;
* revision: Doesn&#039;t matter too much; just for information. Incremented by the game each time it uploads something new.&lt;br /&gt;
* version: The [https://semver.org/ semantic versioning] of your mod.&lt;/div&gt;</summary>
		<author><name>Darloth</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Modding_Cookbook&amp;diff=180</id>
		<title>Modding Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Modding_Cookbook&amp;diff=180"/>
		<updated>2026-08-03T21:57:00Z</updated>

		<summary type="html">&lt;p&gt;Darloth: /* Make your mod */ - asset pack issue and workaround&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Make your mod ==&lt;br /&gt;
&lt;br /&gt;
# Get hands on the project source code, hopefully via the modkit download on itch.io or another channel from Wickworks.&lt;br /&gt;
# Open it in the Godot editor (4.7 currently)&lt;br /&gt;
# Go to Project Settings → Plugins and enable Mod Loader Dev Tool (it&#039;ll be the only thing that&#039;s unchecked)&lt;br /&gt;
# There&#039;s now a tab call &amp;quot;Mod Tool&amp;quot;  at the top-center of the window. Press the &amp;quot;Create new Mod&amp;quot; button, fill out the fields, and press Create.&lt;br /&gt;
## See [[Modding#Mod Types &amp;amp; Security|Mod Types]] for the difference between an Asset Pack, Content Pack, and Substantial mod. You can change what type it is later by adding scripts or toggling requires_restart.&amp;lt;br&amp;gt; NOTE: If you wish to create an Asset Pack, there&#039;s currently a bug that will prevent it being created correctly unless you select a Content Pack first, then switch back to Asset Pack.&lt;br /&gt;
# Fill out any information you&#039;d like to provide in manifest fields, and press &amp;quot;Save to manifest.json&amp;quot; in the top-right.&lt;br /&gt;
# In the FileSystem window, you should see folder with the name of your mod under unpacked/, with a manifest.json and a mod_main.gd file.&lt;br /&gt;
# (optional) Update thumbnail.png with the image you want to represent your mod.&lt;br /&gt;
&lt;br /&gt;
== Replace existing resources and scenes ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the file you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Asset Override&amp;quot; from the context menu.&lt;br /&gt;
# This will copy the resource to your mod&#039;s folder under res/ + the original path.&lt;br /&gt;
# Modify the resource in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
It will be automatically swapped in to the game&#039;s virtual filesystem at the vanilla path when the mod is activated by your mod_main.gd&#039;s &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;Resource.take_over_path&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warning: If multiple mods replace the same resource, only the last one will take effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add new resources and scenes ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Add them to your mod&#039;s res/ directory in a folder mirroring where they&#039;d be in the base game data. For example, if you wanted to add a new available sprite for the napoleon at:&lt;br /&gt;
 res://assets/frames/ha/mf_napoleon/&lt;br /&gt;
&lt;br /&gt;
You&#039;d add your image at:&lt;br /&gt;
 res://unpacked/Mod-Name/res/assets/frames/ha/mf_napoleon/&lt;br /&gt;
&lt;br /&gt;
It will be automatically added to the game&#039;s virtual filesystem at the vanilla path when the mod is activated by your mod_main.gd&#039;s &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;Resource.take_over_path&amp;lt;/code&amp;gt;. If you&#039;re making an asset pack, the default mod_main that will be used handles this instead.&lt;br /&gt;
&lt;br /&gt;
Warning: If multiple mods add a new resource with the same path + name, only the last one will take effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Remove existing resources ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
TODO: some way to mark a resource as something to remove. An extra extension?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modify existing resource ==&lt;br /&gt;
&#039;&#039;(.tres)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the resource you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Resource Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script in your mod&#039;s folder under res/ + the original path, with the extension .tres_ext.gd&lt;br /&gt;
# Modify the scene through the generated script&#039;s modify_resource function, as desired.&lt;br /&gt;
&lt;br /&gt;
For example, to add the Barbarossa as an alt frame of the Napoleon license, find and Create Resource Extension for the li_napoleon.tres.  In the resulting li_napoleon.tres_ext.gd file, you would put:&lt;br /&gt;
&lt;br /&gt;
 func modify_resource(resource:Resource) -&amp;gt; Resource:&lt;br /&gt;
 	var license:UnlockTree = resource&lt;br /&gt;
 &lt;br /&gt;
 	var barb := load(&#039;res://content/frames/ha/mf_barbarossa/mf_barbarossa.tres&#039;)&lt;br /&gt;
 	license.rank_2.granted_frames.append(barb)&lt;br /&gt;
 &lt;br /&gt;
 	return license&lt;br /&gt;
&lt;br /&gt;
Note: modify_resource is run after resources are moved in the virtual filesystem from your mod&#039;s res/ directory into their res:// locations, so I *believe* that if you load new resources from your mod you should use their res://content/... paths instead of the unpacked location.&lt;br /&gt;
&lt;br /&gt;
To be safe, a function such as this can always return what should be the correct path:&lt;br /&gt;
&lt;br /&gt;
 func sload(file: String):&lt;br /&gt;
    if(ResourceLoader.exists(file)):&lt;br /&gt;
        return ResourceLoader.load(file)&lt;br /&gt;
    else:&lt;br /&gt;
        return ResourceLoader.load(&#039;res://&#039;+file.split(&#039;/res/&#039;)[1])&lt;br /&gt;
&lt;br /&gt;
Then use sload instead of load to load resource references.&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same resource.&lt;br /&gt;
&lt;br /&gt;
== Modify existing scenes ==&lt;br /&gt;
&#039;&#039;(.tscn)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the scene you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Scene Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script in your mod&#039;s folder under res/ + the original path, with the extension .tscn_ext.gd&lt;br /&gt;
# Modify the scene through the generated script&#039;s modify_scene function, as desired.&lt;br /&gt;
&lt;br /&gt;
Note: if you add new nodes to the modified scene, you MUST set the [https://docs.godotengine.org/en/stable/classes/class_node.html#class-node-property-owner owner] of that child to the scene after adding it as a child, e.g.&lt;br /&gt;
&lt;br /&gt;
 func modify_scene(scene:Node) -&amp;gt; Node:&lt;br /&gt;
 	# Modify an existing node.&lt;br /&gt;
 	var label: Label = scene_instance.get_node(&amp;quot;Maybe/Some/NodeHere&amp;quot;)&lt;br /&gt;
 	label.text += &amp;quot; modified&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 	# Add a new node.&lt;br /&gt;
 	var new_node: Node = Node.new()&lt;br /&gt;
 	scene_instance.add_child(new_node)&lt;br /&gt;
 	new_node.owner = scene # Must come after add_child for all added nodes.&lt;br /&gt;
 &lt;br /&gt;
 	return scene_instance&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same scene.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Extend existing scripts ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/script_extensions/&lt;br /&gt;
&lt;br /&gt;
# Navigate to the script you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Script Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script to your mod&#039;s folder under res/ + the original path, extending the vanilla script, with the extension .gd_ext.gd&lt;br /&gt;
# Modify the extending script in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same script, via &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;ModLoaderMod.install_script_extension&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you change an autoload, that autoload will be reloaded after all mods are applied.&lt;br /&gt;
&lt;br /&gt;
If you find that the autoload&#039;s functions do not run your extended code, you may need to manually refresh the script of an autoload after your mod&#039;s mod_main._init() function.  Example code that does this for the UnitRelation autoload is provided below, you&#039;ll need to adjust it to the specific autoloads that you&#039;re affecting.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
func _init() -&amp;gt; void:&lt;br /&gt;
    ModLoaderLog.info(&amp;quot;Activating.&amp;quot;, MOD_ID)&lt;br /&gt;
&lt;br /&gt;
    LancerTacticsMod.add_translations(MOD_ID)&lt;br /&gt;
&lt;br /&gt;
    LancerTacticsMod.add_overwrite_extend_mod_resources(MOD_ID)&lt;br /&gt;
    # other things might be here&lt;br /&gt;
    # ... &lt;br /&gt;
    call_deferred(&amp;amp;&amp;quot;fix_scripts&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
func fix_scripts():&lt;br /&gt;
    #print(&amp;quot;fix UnitRelation&amp;quot;)&lt;br /&gt;
    UnitRelation.set_script(load(&amp;quot;res://engine/character/unit/service/unit_relation.gd&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WARNING: Due to unknown reasons, if a static function on an autoload calls other static functions on the same autoload more than two function calls deep, it reverts to the original code rather than the extended code.  So far no workaround has been discovered.&lt;br /&gt;
&lt;br /&gt;
WARNING: Due to a bug in Godot, we can&#039;t extend scripts with a class_name. See [[Modding#Hooks and class name scripts|Hooks and class name scripts]] for details.&lt;br /&gt;
&lt;br /&gt;
== Replace existing scripts ==&lt;br /&gt;
&lt;br /&gt;
# Navigate to the script you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Asset Override&amp;quot; from the context menu.&lt;br /&gt;
# This will copy the script to your mod&#039;s folder under res/ + the original path.&lt;br /&gt;
# Modify the replacing script in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
This will likely conflict with any other mods that also attempt to replace or extend this script. However, this is the only way to change static vars. Godot appears to cache consts at a script-path level, so as far as I can tell there&#039;s no way to change a const on an object/script after it&#039;s been declared, even by completely replacing the script.&lt;br /&gt;
&lt;br /&gt;
You should very probably include definitions for everything the original script did, or you&#039;ll crash as soon as something asks for a now-missing value (unless this replacement is also extending something that covers those functions).&lt;br /&gt;
&lt;br /&gt;
If you change an autoload, that autoload will be reloaded after all mods are applied.&lt;br /&gt;
&lt;br /&gt;
== Localizations &amp;amp; text ==&lt;br /&gt;
&lt;br /&gt;
Generating a mod from a template will create a localization/localizations.csv file in your mod folder. These key/value pairs are used to figure out what text to show in the game for kits/frames/everything. You can see the shipped assets/localization/localizations.csv file for examples of all the base game text.&lt;br /&gt;
&lt;br /&gt;
You can add your own keys in a likewise format in your own file — I recommend an external spreadsheet editor over godot&#039;s text editor to automatically handle internal commas and quotation marks. Alternatively, there is a second tab next to the Manifest Editor in the Mod Tool section called &amp;quot;Localization Editor&amp;quot;. I haven&#039;t thoroughly tested it, but it gives some basic controls for adding new key/values in the expected format and a button to regenerate localizations (possibly necessary to see the changes show up).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add custom sound fx ==&lt;br /&gt;
&lt;br /&gt;
https://www.fmod.com/docs/2.01/studio/supporting-downloadable-and-user-generated-content.html&lt;br /&gt;
&lt;br /&gt;
I haven&#039;t actually tested it, but if you open the Lancer Tactics FMOD project and export your own bank as described above, you should be able to add your .bank file anywhere in your mod&#039;s res/ directory and it&#039;ll be automatically picked up and loaded in (and subsequently unloaded if the mod is disabled).&lt;br /&gt;
&lt;br /&gt;
New banks must be named by either prefixing or suffixing the bank they&#039;re adding onto. For example, if I&#039;m making a new music bank, since the baseline bank is called &amp;quot;music.bank&amp;quot; mine has to look like &amp;quot;my_music.bank&amp;quot; or &amp;quot;music_thunderdome.bank&amp;quot;. This is because the FMOD addon crashes if we ever try to play an event not in the banks so we have to cache what events are available for each category.&lt;br /&gt;
&lt;br /&gt;
If you feel motivated to test this, let me know how it goes!&lt;br /&gt;
&lt;br /&gt;
== Modify how COMP/CON imports pilots ==&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics is strict about what sorts of prefixes it looks for in resources. If you&#039;re working with a more loosey-goosey ID that was made for COMP/CON (such as the practice of adding prefixes based on the supplement), you can make a mod that tells LT how to map the C/C ID.&lt;br /&gt;
&lt;br /&gt;
# Extend the compcon_importer script: &amp;lt;code&amp;gt;res://ui/page/pilot_roster/compcon_importer.gd&amp;lt;/code&amp;gt;&lt;br /&gt;
# Extend the get_compcon_id_remap function.&lt;br /&gt;
# Call super.get_compcon_id_remap() within it, then add whatever C/C -&amp;gt; LT IDs to the dictionary that you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
== Player configuration ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/config_json/&lt;br /&gt;
&lt;br /&gt;
You can allow the player to configure your mod through inputs in the mod manager, ie, toggle booleans, pick from dropdowns, and enter text+numbers that your mod can then consume.&lt;br /&gt;
&lt;br /&gt;
Define the config as described in the above documentation inside of your manifest.json file, and get the player&#039;s current values with &amp;lt;code&amp;gt;ModLoaderConfig.get_current_config(&amp;quot;your_mod_id&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics currently only supports numbers, strings, and boolean inputs. Let me know if you need more than that!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/using_other_mods/#dependencies-and-load-order&lt;br /&gt;
&lt;br /&gt;
If your mod requires another mod to function, you need to do two things:&lt;br /&gt;
&lt;br /&gt;
# Add the other mod&#039;s folder ID (in the Namespace-ModName format) in the &amp;quot;Dependencies&amp;quot; section of your manifest. This will tell the mod loader to load their mod first.&lt;br /&gt;
# Tell mod.io about the dependency by going to &amp;lt;code&amp;gt;mod.io/g/lancer-tactics/m/[YOUR MOD SLUG HERE]/admin/settings#dependencies&amp;lt;/code&amp;gt; and selecting the other mod from the search bar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Export + upload your mod to share ==&lt;br /&gt;
&lt;br /&gt;
Mods are loaded by player&#039;s games by looking for .zip files in their user mods/ folder. In order to get them set up with the mod, we need to create that zip and get it into their folder. There are three options:&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
In the bottom-center of the Mod Tool tab, there&#039;s an &amp;quot;Export as .zip&amp;quot; button. Pressing it will pack the current mod into a zip file at the designated location.&lt;br /&gt;
&lt;br /&gt;
You can drag the zipped mod to your own user data mods/ folder, or send it to your friends so they can do so for their own games. No need to get a third party involved.&lt;br /&gt;
&lt;br /&gt;
=== Mod.io, via the Mod Tool ===&lt;br /&gt;
In the bottom-right of the Mod Tool tab, there&#039;s a &amp;quot;Upload&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
# Authenticate with mod.io from the Omninet page in the running game, if you haven&#039;t already. This will save a token to your settings.cfg&lt;br /&gt;
# Verify that it shows you as logged in as the appropriate email, and press &amp;quot;Check status&amp;quot; button to verify your connection to mod.io.&lt;br /&gt;
# Press &amp;quot;Upload to mod.io&amp;quot; and confirm.&lt;br /&gt;
&lt;br /&gt;
You should now be able to see and manage your mod online at https://mod.io/content#mods&lt;br /&gt;
&lt;br /&gt;
=== Mod.io, via the browser ===&lt;br /&gt;
You can upload a mod from outside the Mod Tool by uploading the exported .zip file you made in the manual option above. Mod.io&#039;s flow for doing so is fairly intuitive, but to be loaded by the game you must include this json in the Metadata section for the mod, filling in values as appropriate:&lt;br /&gt;
 {&lt;br /&gt;
 	&amp;quot;game_version&amp;quot;:&amp;quot;X.X.X&amp;quot;,&lt;br /&gt;
 	&amp;quot;mod_id&amp;quot;:&amp;quot;YourNamespace-YourMod&amp;quot;,&lt;br /&gt;
 	&amp;quot;revision&amp;quot;:1,&lt;br /&gt;
 	&amp;quot;version&amp;quot;:&amp;quot;1.0.0&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
* game_version: The version of Lancer Tactics you expect this mod to work on.&lt;br /&gt;
* mod_id: The ID of your mod, in the Namespace-Modname format (matches its folder when unpacked)&lt;br /&gt;
* revision: Doesn&#039;t matter too much; just for information. Incremented by the game each time it uploads something new.&lt;br /&gt;
* version: The [https://semver.org/ semantic versioning] of your mod.&lt;/div&gt;</summary>
		<author><name>Darloth</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Modding_Cookbook&amp;diff=179</id>
		<title>Modding Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Modding_Cookbook&amp;diff=179"/>
		<updated>2026-08-03T21:09:10Z</updated>

		<summary type="html">&lt;p&gt;Darloth: /* Extend existing scripts */ - explaining fix for autoloads that don&amp;#039;t get modified properly when you modify them&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Make your mod ==&lt;br /&gt;
&lt;br /&gt;
# Get hands on the project source code, hopefully via the modkit download on itch.io or another channel from Wickworks.&lt;br /&gt;
# Open it in the Godot editor (4.7 currently)&lt;br /&gt;
# Go to Project Settings → Plugins and enable Mod Loader Dev Tool (it&#039;ll be the only thing that&#039;s unchecked)&lt;br /&gt;
# There&#039;s now a tab call &amp;quot;Mod Tool&amp;quot;  at the top-center of the window. Press the &amp;quot;Create new Mod&amp;quot; button, fill out the fields, and press Create.&lt;br /&gt;
## See [[Modding#Mod Types &amp;amp; Security|Mod Types]] for the difference between an Asset Pack, Content Pack, and Substantial mod. You can change what type it is later by adding scripts or toggling requires_restart.&lt;br /&gt;
# Fill out any information you&#039;d like to provide in manifest fields, and press &amp;quot;Save to manifest.json&amp;quot; in the top-right.&lt;br /&gt;
# In the FileSystem window, you should see folder with the name of your mod under unpacked/, with a manifest.json and a mod_main.gd file.&lt;br /&gt;
# (optional) Update thumbnail.png with the image you want to represent your mod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Replace existing resources and scenes ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the file you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Asset Override&amp;quot; from the context menu.&lt;br /&gt;
# This will copy the resource to your mod&#039;s folder under res/ + the original path.&lt;br /&gt;
# Modify the resource in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
It will be automatically swapped in to the game&#039;s virtual filesystem at the vanilla path when the mod is activated by your mod_main.gd&#039;s &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;Resource.take_over_path&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warning: If multiple mods replace the same resource, only the last one will take effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add new resources and scenes ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Add them to your mod&#039;s res/ directory in a folder mirroring where they&#039;d be in the base game data. For example, if you wanted to add a new available sprite for the napoleon at:&lt;br /&gt;
 res://assets/frames/ha/mf_napoleon/&lt;br /&gt;
&lt;br /&gt;
You&#039;d add your image at:&lt;br /&gt;
 res://unpacked/Mod-Name/res/assets/frames/ha/mf_napoleon/&lt;br /&gt;
&lt;br /&gt;
It will be automatically added to the game&#039;s virtual filesystem at the vanilla path when the mod is activated by your mod_main.gd&#039;s &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;Resource.take_over_path&amp;lt;/code&amp;gt;. If you&#039;re making an asset pack, the default mod_main that will be used handles this instead.&lt;br /&gt;
&lt;br /&gt;
Warning: If multiple mods add a new resource with the same path + name, only the last one will take effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Remove existing resources ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
TODO: some way to mark a resource as something to remove. An extra extension?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modify existing resource ==&lt;br /&gt;
&#039;&#039;(.tres)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the resource you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Resource Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script in your mod&#039;s folder under res/ + the original path, with the extension .tres_ext.gd&lt;br /&gt;
# Modify the scene through the generated script&#039;s modify_resource function, as desired.&lt;br /&gt;
&lt;br /&gt;
For example, to add the Barbarossa as an alt frame of the Napoleon license, find and Create Resource Extension for the li_napoleon.tres.  In the resulting li_napoleon.tres_ext.gd file, you would put:&lt;br /&gt;
&lt;br /&gt;
 func modify_resource(resource:Resource) -&amp;gt; Resource:&lt;br /&gt;
 	var license:UnlockTree = resource&lt;br /&gt;
 &lt;br /&gt;
 	var barb := load(&#039;res://content/frames/ha/mf_barbarossa/mf_barbarossa.tres&#039;)&lt;br /&gt;
 	license.rank_2.granted_frames.append(barb)&lt;br /&gt;
 &lt;br /&gt;
 	return license&lt;br /&gt;
&lt;br /&gt;
Note: modify_resource is run after resources are moved in the virtual filesystem from your mod&#039;s res/ directory into their res:// locations, so I *believe* that if you load new resources from your mod you should use their res://content/... paths instead of the unpacked location.&lt;br /&gt;
&lt;br /&gt;
To be safe, a function such as this can always return what should be the correct path:&lt;br /&gt;
&lt;br /&gt;
 func sload(file: String):&lt;br /&gt;
    if(ResourceLoader.exists(file)):&lt;br /&gt;
        return ResourceLoader.load(file)&lt;br /&gt;
    else:&lt;br /&gt;
        return ResourceLoader.load(&#039;res://&#039;+file.split(&#039;/res/&#039;)[1])&lt;br /&gt;
&lt;br /&gt;
Then use sload instead of load to load resource references.&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same resource.&lt;br /&gt;
&lt;br /&gt;
== Modify existing scenes ==&lt;br /&gt;
&#039;&#039;(.tscn)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the scene you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Scene Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script in your mod&#039;s folder under res/ + the original path, with the extension .tscn_ext.gd&lt;br /&gt;
# Modify the scene through the generated script&#039;s modify_scene function, as desired.&lt;br /&gt;
&lt;br /&gt;
Note: if you add new nodes to the modified scene, you MUST set the [https://docs.godotengine.org/en/stable/classes/class_node.html#class-node-property-owner owner] of that child to the scene after adding it as a child, e.g.&lt;br /&gt;
&lt;br /&gt;
 func modify_scene(scene:Node) -&amp;gt; Node:&lt;br /&gt;
 	# Modify an existing node.&lt;br /&gt;
 	var label: Label = scene_instance.get_node(&amp;quot;Maybe/Some/NodeHere&amp;quot;)&lt;br /&gt;
 	label.text += &amp;quot; modified&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 	# Add a new node.&lt;br /&gt;
 	var new_node: Node = Node.new()&lt;br /&gt;
 	scene_instance.add_child(new_node)&lt;br /&gt;
 	new_node.owner = scene # Must come after add_child for all added nodes.&lt;br /&gt;
 &lt;br /&gt;
 	return scene_instance&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same scene.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Extend existing scripts ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/script_extensions/&lt;br /&gt;
&lt;br /&gt;
# Navigate to the script you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Script Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script to your mod&#039;s folder under res/ + the original path, extending the vanilla script, with the extension .gd_ext.gd&lt;br /&gt;
# Modify the extending script in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same script, via &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;ModLoaderMod.install_script_extension&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you change an autoload, that autoload will be reloaded after all mods are applied.&lt;br /&gt;
&lt;br /&gt;
If you find that the autoload&#039;s functions do not run your extended code, you may need to manually refresh the script of an autoload after your mod&#039;s mod_main._init() function.  Example code that does this for the UnitRelation autoload is provided below, you&#039;ll need to adjust it to the specific autoloads that you&#039;re affecting.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
func _init() -&amp;gt; void:&lt;br /&gt;
    ModLoaderLog.info(&amp;quot;Activating.&amp;quot;, MOD_ID)&lt;br /&gt;
&lt;br /&gt;
    LancerTacticsMod.add_translations(MOD_ID)&lt;br /&gt;
&lt;br /&gt;
    LancerTacticsMod.add_overwrite_extend_mod_resources(MOD_ID)&lt;br /&gt;
    # other things might be here&lt;br /&gt;
    # ... &lt;br /&gt;
    call_deferred(&amp;amp;&amp;quot;fix_scripts&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
func fix_scripts():&lt;br /&gt;
    #print(&amp;quot;fix UnitRelation&amp;quot;)&lt;br /&gt;
    UnitRelation.set_script(load(&amp;quot;res://engine/character/unit/service/unit_relation.gd&amp;quot;))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
WARNING: Due to unknown reasons, if a static function on an autoload calls other static functions on the same autoload more than two function calls deep, it reverts to the original code rather than the extended code.  So far no workaround has been discovered.&lt;br /&gt;
&lt;br /&gt;
WARNING: Due to a bug in Godot, we can&#039;t extend scripts with a class_name. See [[Modding#Hooks and class name scripts|Hooks and class name scripts]] for details.&lt;br /&gt;
&lt;br /&gt;
== Replace existing scripts ==&lt;br /&gt;
&lt;br /&gt;
# Navigate to the script you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Asset Override&amp;quot; from the context menu.&lt;br /&gt;
# This will copy the script to your mod&#039;s folder under res/ + the original path.&lt;br /&gt;
# Modify the replacing script in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
This will likely conflict with any other mods that also attempt to replace or extend this script. However, this is the only way to change static vars. Godot appears to cache consts at a script-path level, so as far as I can tell there&#039;s no way to change a const on an object/script after it&#039;s been declared, even by completely replacing the script.&lt;br /&gt;
&lt;br /&gt;
You should very probably include definitions for everything the original script did, or you&#039;ll crash as soon as something asks for a now-missing value (unless this replacement is also extending something that covers those functions).&lt;br /&gt;
&lt;br /&gt;
If you change an autoload, that autoload will be reloaded after all mods are applied.&lt;br /&gt;
&lt;br /&gt;
== Localizations &amp;amp; text ==&lt;br /&gt;
&lt;br /&gt;
Generating a mod from a template will create a localization/localizations.csv file in your mod folder. These key/value pairs are used to figure out what text to show in the game for kits/frames/everything. You can see the shipped assets/localization/localizations.csv file for examples of all the base game text.&lt;br /&gt;
&lt;br /&gt;
You can add your own keys in a likewise format in your own file — I recommend an external spreadsheet editor over godot&#039;s text editor to automatically handle internal commas and quotation marks. Alternatively, there is a second tab next to the Manifest Editor in the Mod Tool section called &amp;quot;Localization Editor&amp;quot;. I haven&#039;t thoroughly tested it, but it gives some basic controls for adding new key/values in the expected format and a button to regenerate localizations (possibly necessary to see the changes show up).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add custom sound fx ==&lt;br /&gt;
&lt;br /&gt;
https://www.fmod.com/docs/2.01/studio/supporting-downloadable-and-user-generated-content.html&lt;br /&gt;
&lt;br /&gt;
I haven&#039;t actually tested it, but if you open the Lancer Tactics FMOD project and export your own bank as described above, you should be able to add your .bank file anywhere in your mod&#039;s res/ directory and it&#039;ll be automatically picked up and loaded in (and subsequently unloaded if the mod is disabled).&lt;br /&gt;
&lt;br /&gt;
New banks must be named by either prefixing or suffixing the bank they&#039;re adding onto. For example, if I&#039;m making a new music bank, since the baseline bank is called &amp;quot;music.bank&amp;quot; mine has to look like &amp;quot;my_music.bank&amp;quot; or &amp;quot;music_thunderdome.bank&amp;quot;. This is because the FMOD addon crashes if we ever try to play an event not in the banks so we have to cache what events are available for each category.&lt;br /&gt;
&lt;br /&gt;
If you feel motivated to test this, let me know how it goes!&lt;br /&gt;
&lt;br /&gt;
== Modify how COMP/CON imports pilots ==&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics is strict about what sorts of prefixes it looks for in resources. If you&#039;re working with a more loosey-goosey ID that was made for COMP/CON (such as the practice of adding prefixes based on the supplement), you can make a mod that tells LT how to map the C/C ID.&lt;br /&gt;
&lt;br /&gt;
# Extend the compcon_importer script: &amp;lt;code&amp;gt;res://ui/page/pilot_roster/compcon_importer.gd&amp;lt;/code&amp;gt;&lt;br /&gt;
# Extend the get_compcon_id_remap function.&lt;br /&gt;
# Call super.get_compcon_id_remap() within it, then add whatever C/C -&amp;gt; LT IDs to the dictionary that you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
== Player configuration ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/config_json/&lt;br /&gt;
&lt;br /&gt;
You can allow the player to configure your mod through inputs in the mod manager, ie, toggle booleans, pick from dropdowns, and enter text+numbers that your mod can then consume.&lt;br /&gt;
&lt;br /&gt;
Define the config as described in the above documentation inside of your manifest.json file, and get the player&#039;s current values with &amp;lt;code&amp;gt;ModLoaderConfig.get_current_config(&amp;quot;your_mod_id&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics currently only supports numbers, strings, and boolean inputs. Let me know if you need more than that!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/using_other_mods/#dependencies-and-load-order&lt;br /&gt;
&lt;br /&gt;
If your mod requires another mod to function, you need to do two things:&lt;br /&gt;
&lt;br /&gt;
# Add the other mod&#039;s folder ID (in the Namespace-ModName format) in the &amp;quot;Dependencies&amp;quot; section of your manifest. This will tell the mod loader to load their mod first.&lt;br /&gt;
# Tell mod.io about the dependency by going to &amp;lt;code&amp;gt;mod.io/g/lancer-tactics/m/[YOUR MOD SLUG HERE]/admin/settings#dependencies&amp;lt;/code&amp;gt; and selecting the other mod from the search bar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Export + upload your mod to share ==&lt;br /&gt;
&lt;br /&gt;
Mods are loaded by player&#039;s games by looking for .zip files in their user mods/ folder. In order to get them set up with the mod, we need to create that zip and get it into their folder. There are three options:&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
In the bottom-center of the Mod Tool tab, there&#039;s an &amp;quot;Export as .zip&amp;quot; button. Pressing it will pack the current mod into a zip file at the designated location.&lt;br /&gt;
&lt;br /&gt;
You can drag the zipped mod to your own user data mods/ folder, or send it to your friends so they can do so for their own games. No need to get a third party involved.&lt;br /&gt;
&lt;br /&gt;
=== Mod.io, via the Mod Tool ===&lt;br /&gt;
In the bottom-right of the Mod Tool tab, there&#039;s a &amp;quot;Upload&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
# Authenticate with mod.io from the Omninet page in the running game, if you haven&#039;t already. This will save a token to your settings.cfg&lt;br /&gt;
# Verify that it shows you as logged in as the appropriate email, and press &amp;quot;Check status&amp;quot; button to verify your connection to mod.io.&lt;br /&gt;
# Press &amp;quot;Upload to mod.io&amp;quot; and confirm.&lt;br /&gt;
&lt;br /&gt;
You should now be able to see and manage your mod online at https://mod.io/content#mods&lt;br /&gt;
&lt;br /&gt;
=== Mod.io, via the browser ===&lt;br /&gt;
You can upload a mod from outside the Mod Tool by uploading the exported .zip file you made in the manual option above. Mod.io&#039;s flow for doing so is fairly intuitive, but to be loaded by the game you must include this json in the Metadata section for the mod, filling in values as appropriate:&lt;br /&gt;
 {&lt;br /&gt;
 	&amp;quot;game_version&amp;quot;:&amp;quot;X.X.X&amp;quot;,&lt;br /&gt;
 	&amp;quot;mod_id&amp;quot;:&amp;quot;YourNamespace-YourMod&amp;quot;,&lt;br /&gt;
 	&amp;quot;revision&amp;quot;:1,&lt;br /&gt;
 	&amp;quot;version&amp;quot;:&amp;quot;1.0.0&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
* game_version: The version of Lancer Tactics you expect this mod to work on.&lt;br /&gt;
* mod_id: The ID of your mod, in the Namespace-Modname format (matches its folder when unpacked)&lt;br /&gt;
* revision: Doesn&#039;t matter too much; just for information. Incremented by the game each time it uploads something new.&lt;br /&gt;
* version: The [https://semver.org/ semantic versioning] of your mod.&lt;/div&gt;</summary>
		<author><name>Darloth</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Modding_Cookbook&amp;diff=178</id>
		<title>Modding Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Modding_Cookbook&amp;diff=178"/>
		<updated>2026-08-03T20:26:14Z</updated>

		<summary type="html">&lt;p&gt;Darloth: /* Modify existing resource */ More detail&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Make your mod ==&lt;br /&gt;
&lt;br /&gt;
# Get hands on the project source code, hopefully via the modkit download on itch.io or another channel from Wickworks.&lt;br /&gt;
# Open it in the Godot editor (4.7 currently)&lt;br /&gt;
# Go to Project Settings → Plugins and enable Mod Loader Dev Tool (it&#039;ll be the only thing that&#039;s unchecked)&lt;br /&gt;
# There&#039;s now a tab call &amp;quot;Mod Tool&amp;quot;  at the top-center of the window. Press the &amp;quot;Create new Mod&amp;quot; button, fill out the fields, and press Create.&lt;br /&gt;
## See [[Modding#Mod Types &amp;amp; Security|Mod Types]] for the difference between an Asset Pack, Content Pack, and Substantial mod. You can change what type it is later by adding scripts or toggling requires_restart.&lt;br /&gt;
# Fill out any information you&#039;d like to provide in manifest fields, and press &amp;quot;Save to manifest.json&amp;quot; in the top-right.&lt;br /&gt;
# In the FileSystem window, you should see folder with the name of your mod under unpacked/, with a manifest.json and a mod_main.gd file.&lt;br /&gt;
# (optional) Update thumbnail.png with the image you want to represent your mod.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Replace existing resources and scenes ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the file you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Asset Override&amp;quot; from the context menu.&lt;br /&gt;
# This will copy the resource to your mod&#039;s folder under res/ + the original path.&lt;br /&gt;
# Modify the resource in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
It will be automatically swapped in to the game&#039;s virtual filesystem at the vanilla path when the mod is activated by your mod_main.gd&#039;s &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;Resource.take_over_path&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Warning: If multiple mods replace the same resource, only the last one will take effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add new resources and scenes ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Add them to your mod&#039;s res/ directory in a folder mirroring where they&#039;d be in the base game data. For example, if you wanted to add a new available sprite for the napoleon at:&lt;br /&gt;
 res://assets/frames/ha/mf_napoleon/&lt;br /&gt;
&lt;br /&gt;
You&#039;d add your image at:&lt;br /&gt;
 res://unpacked/Mod-Name/res/assets/frames/ha/mf_napoleon/&lt;br /&gt;
&lt;br /&gt;
It will be automatically added to the game&#039;s virtual filesystem at the vanilla path when the mod is activated by your mod_main.gd&#039;s &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;Resource.take_over_path&amp;lt;/code&amp;gt;. If you&#039;re making an asset pack, the default mod_main that will be used handles this instead.&lt;br /&gt;
&lt;br /&gt;
Warning: If multiple mods add a new resource with the same path + name, only the last one will take effect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Remove existing resources ==&lt;br /&gt;
&#039;&#039;(.png, .svg, .tres, .tscn, .json)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
TODO: some way to mark a resource as something to remove. An extra extension?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Modify existing resource ==&lt;br /&gt;
&#039;&#039;(.tres)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the resource you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Resource Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script in your mod&#039;s folder under res/ + the original path, with the extension .tres_ext.gd&lt;br /&gt;
# Modify the scene through the generated script&#039;s modify_resource function, as desired.&lt;br /&gt;
&lt;br /&gt;
For example, to add the Barbarossa as an alt frame of the Napoleon license, find and Create Resource Extension for the li_napoleon.tres.  In the resulting li_napoleon.tres_ext.gd file, you would put:&lt;br /&gt;
&lt;br /&gt;
 func modify_resource(resource:Resource) -&amp;gt; Resource:&lt;br /&gt;
 	var license:UnlockTree = resource&lt;br /&gt;
 &lt;br /&gt;
 	var barb := load(&#039;res://content/frames/ha/mf_barbarossa/mf_barbarossa.tres&#039;)&lt;br /&gt;
 	license.rank_2.granted_frames.append(barb)&lt;br /&gt;
 &lt;br /&gt;
 	return license&lt;br /&gt;
&lt;br /&gt;
Note: modify_resource is run after resources are moved in the virtual filesystem from your mod&#039;s res/ directory into their res:// locations, so I *believe* that if you load new resources from your mod you should use their res://content/... paths instead of the unpacked location.&lt;br /&gt;
&lt;br /&gt;
To be safe, a function such as this can always return what should be the correct path:&lt;br /&gt;
&lt;br /&gt;
 func sload(file: String):&lt;br /&gt;
    if(ResourceLoader.exists(file)):&lt;br /&gt;
        return ResourceLoader.load(file)&lt;br /&gt;
    else:&lt;br /&gt;
        return ResourceLoader.load(&#039;res://&#039;+file.split(&#039;/res/&#039;)[1])&lt;br /&gt;
&lt;br /&gt;
Then use sload instead of load to load resource references.&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same resource.&lt;br /&gt;
&lt;br /&gt;
== Modify existing scenes ==&lt;br /&gt;
&#039;&#039;(.tscn)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Navigate to the scene you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Scene Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script in your mod&#039;s folder under res/ + the original path, with the extension .tscn_ext.gd&lt;br /&gt;
# Modify the scene through the generated script&#039;s modify_scene function, as desired.&lt;br /&gt;
&lt;br /&gt;
Note: if you add new nodes to the modified scene, you MUST set the [https://docs.godotengine.org/en/stable/classes/class_node.html#class-node-property-owner owner] of that child to the scene after adding it as a child, e.g.&lt;br /&gt;
&lt;br /&gt;
 func modify_scene(scene:Node) -&amp;gt; Node:&lt;br /&gt;
 	# Modify an existing node.&lt;br /&gt;
 	var label: Label = scene_instance.get_node(&amp;quot;Maybe/Some/NodeHere&amp;quot;)&lt;br /&gt;
 	label.text += &amp;quot; modified&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 	# Add a new node.&lt;br /&gt;
 	var new_node: Node = Node.new()&lt;br /&gt;
 	scene_instance.add_child(new_node)&lt;br /&gt;
 	new_node.owner = scene # Must come after add_child for all added nodes.&lt;br /&gt;
 &lt;br /&gt;
 	return scene_instance&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same scene.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Extend existing scripts ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/script_extensions/&lt;br /&gt;
&lt;br /&gt;
# Navigate to the script you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Script Extension&amp;quot; from the context menu.&lt;br /&gt;
# This will create a new script to your mod&#039;s folder under res/ + the original path, extending the vanilla script, with the extension .gd_ext.gd&lt;br /&gt;
# Modify the extending script in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
This will work even if two different mods extend the same script, via &amp;lt;code&amp;gt;add_overwrite_extend_mod_resources&amp;lt;/code&amp;gt;, powered by &amp;lt;code&amp;gt;ModLoaderMod.install_script_extension&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If you change an autoload, that autoload will be reloaded after all mods are applied.&lt;br /&gt;
&lt;br /&gt;
WARNING: Due to a bug in Godot, we can&#039;t extend scripts with a class_name. See [[Modding#Hooks and class name scripts|Hooks and class name scripts]] for details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Replace existing scripts ==&lt;br /&gt;
&lt;br /&gt;
# Navigate to the script you want to replace in the FileSystem window.&lt;br /&gt;
# Right-click it and select &amp;quot;ModTool: Create Asset Override&amp;quot; from the context menu.&lt;br /&gt;
# This will copy the script to your mod&#039;s folder under res/ + the original path.&lt;br /&gt;
# Modify the replacing script in your res/ folder as desired.&lt;br /&gt;
&lt;br /&gt;
This will likely conflict with any other mods that also attempt to replace or extend this script. However, this is the only way to change static vars. Godot appears to cache consts at a script-path level, so as far as I can tell there&#039;s no way to change a const on an object/script after it&#039;s been declared, even by completely replacing the script.&lt;br /&gt;
&lt;br /&gt;
You should very probably include definitions for everything the original script did, or you&#039;ll crash as soon as something asks for a now-missing value (unless this replacement is also extending something that covers those functions).&lt;br /&gt;
&lt;br /&gt;
If you change an autoload, that autoload will be reloaded after all mods are applied.&lt;br /&gt;
&lt;br /&gt;
== Localizations &amp;amp; text ==&lt;br /&gt;
&lt;br /&gt;
Generating a mod from a template will create a localization/localizations.csv file in your mod folder. These key/value pairs are used to figure out what text to show in the game for kits/frames/everything. You can see the shipped assets/localization/localizations.csv file for examples of all the base game text.&lt;br /&gt;
&lt;br /&gt;
You can add your own keys in a likewise format in your own file — I recommend an external spreadsheet editor over godot&#039;s text editor to automatically handle internal commas and quotation marks. Alternatively, there is a second tab next to the Manifest Editor in the Mod Tool section called &amp;quot;Localization Editor&amp;quot;. I haven&#039;t thoroughly tested it, but it gives some basic controls for adding new key/values in the expected format and a button to regenerate localizations (possibly necessary to see the changes show up).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add custom sound fx ==&lt;br /&gt;
&lt;br /&gt;
https://www.fmod.com/docs/2.01/studio/supporting-downloadable-and-user-generated-content.html&lt;br /&gt;
&lt;br /&gt;
I haven&#039;t actually tested it, but if you open the Lancer Tactics FMOD project and export your own bank as described above, you should be able to add your .bank file anywhere in your mod&#039;s res/ directory and it&#039;ll be automatically picked up and loaded in (and subsequently unloaded if the mod is disabled).&lt;br /&gt;
&lt;br /&gt;
New banks must be named by either prefixing or suffixing the bank they&#039;re adding onto. For example, if I&#039;m making a new music bank, since the baseline bank is called &amp;quot;music.bank&amp;quot; mine has to look like &amp;quot;my_music.bank&amp;quot; or &amp;quot;music_thunderdome.bank&amp;quot;. This is because the FMOD addon crashes if we ever try to play an event not in the banks so we have to cache what events are available for each category.&lt;br /&gt;
&lt;br /&gt;
If you feel motivated to test this, let me know how it goes!&lt;br /&gt;
&lt;br /&gt;
== Modify how COMP/CON imports pilots ==&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics is strict about what sorts of prefixes it looks for in resources. If you&#039;re working with a more loosey-goosey ID that was made for COMP/CON (such as the practice of adding prefixes based on the supplement), you can make a mod that tells LT how to map the C/C ID.&lt;br /&gt;
&lt;br /&gt;
# Extend the compcon_importer script: &amp;lt;code&amp;gt;res://ui/page/pilot_roster/compcon_importer.gd&amp;lt;/code&amp;gt;&lt;br /&gt;
# Extend the get_compcon_id_remap function.&lt;br /&gt;
# Call super.get_compcon_id_remap() within it, then add whatever C/C -&amp;gt; LT IDs to the dictionary that you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
== Player configuration ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/config_json/&lt;br /&gt;
&lt;br /&gt;
You can allow the player to configure your mod through inputs in the mod manager, ie, toggle booleans, pick from dropdowns, and enter text+numbers that your mod can then consume.&lt;br /&gt;
&lt;br /&gt;
Define the config as described in the above documentation inside of your manifest.json file, and get the player&#039;s current values with &amp;lt;code&amp;gt;ModLoaderConfig.get_current_config(&amp;quot;your_mod_id&amp;quot;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics currently only supports numbers, strings, and boolean inputs. Let me know if you need more than that!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
https://wiki.godotmodding.com/guides/modding/using_other_mods/#dependencies-and-load-order&lt;br /&gt;
&lt;br /&gt;
If your mod requires another mod to function, you need to do two things:&lt;br /&gt;
&lt;br /&gt;
# Add the other mod&#039;s folder ID (in the Namespace-ModName format) in the &amp;quot;Dependencies&amp;quot; section of your manifest. This will tell the mod loader to load their mod first.&lt;br /&gt;
# Tell mod.io about the dependency by going to &amp;lt;code&amp;gt;mod.io/g/lancer-tactics/m/[YOUR MOD SLUG HERE]/admin/settings#dependencies&amp;lt;/code&amp;gt; and selecting the other mod from the search bar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Export + upload your mod to share ==&lt;br /&gt;
&lt;br /&gt;
Mods are loaded by player&#039;s games by looking for .zip files in their user mods/ folder. In order to get them set up with the mod, we need to create that zip and get it into their folder. There are three options:&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
In the bottom-center of the Mod Tool tab, there&#039;s an &amp;quot;Export as .zip&amp;quot; button. Pressing it will pack the current mod into a zip file at the designated location.&lt;br /&gt;
&lt;br /&gt;
You can drag the zipped mod to your own user data mods/ folder, or send it to your friends so they can do so for their own games. No need to get a third party involved.&lt;br /&gt;
&lt;br /&gt;
=== Mod.io, via the Mod Tool ===&lt;br /&gt;
In the bottom-right of the Mod Tool tab, there&#039;s a &amp;quot;Upload&amp;quot; section.&lt;br /&gt;
&lt;br /&gt;
# Authenticate with mod.io from the Omninet page in the running game, if you haven&#039;t already. This will save a token to your settings.cfg&lt;br /&gt;
# Verify that it shows you as logged in as the appropriate email, and press &amp;quot;Check status&amp;quot; button to verify your connection to mod.io.&lt;br /&gt;
# Press &amp;quot;Upload to mod.io&amp;quot; and confirm.&lt;br /&gt;
&lt;br /&gt;
You should now be able to see and manage your mod online at https://mod.io/content#mods&lt;br /&gt;
&lt;br /&gt;
=== Mod.io, via the browser ===&lt;br /&gt;
You can upload a mod from outside the Mod Tool by uploading the exported .zip file you made in the manual option above. Mod.io&#039;s flow for doing so is fairly intuitive, but to be loaded by the game you must include this json in the Metadata section for the mod, filling in values as appropriate:&lt;br /&gt;
 {&lt;br /&gt;
 	&amp;quot;game_version&amp;quot;:&amp;quot;X.X.X&amp;quot;,&lt;br /&gt;
 	&amp;quot;mod_id&amp;quot;:&amp;quot;YourNamespace-YourMod&amp;quot;,&lt;br /&gt;
 	&amp;quot;revision&amp;quot;:1,&lt;br /&gt;
 	&amp;quot;version&amp;quot;:&amp;quot;1.0.0&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
* game_version: The version of Lancer Tactics you expect this mod to work on.&lt;br /&gt;
* mod_id: The ID of your mod, in the Namespace-Modname format (matches its folder when unpacked)&lt;br /&gt;
* revision: Doesn&#039;t matter too much; just for information. Incremented by the game each time it uploads something new.&lt;br /&gt;
* version: The [https://semver.org/ semantic versioning] of your mod.&lt;/div&gt;</summary>
		<author><name>Darloth</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=177</id>
		<title>The Muse</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=177"/>
		<updated>2026-07-31T17:07:42Z</updated>

		<summary type="html">&lt;p&gt;Darloth: /* Editors */ - link to basics of module creation guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;The Muse&amp;lt;/strong&amp;gt; (aka the Lancer Tactics Wiki) is a compilation of editor documentation and guides for &amp;lt;strong&amp;gt;[https://lancertactics.com/ Lancer Tactics]&amp;lt;/strong&amp;gt;, a video game adaptation of the [https://massifpress.com/lancer Lancer TTRPG] by Tom Bloom and Miguel Lopez-Hall. The in-universe concept of the Muse is from the [https://vexwerewolf.itch.io/in-golden-flame-act-1 In Golden Flame] module by Vex Werewolf.&lt;br /&gt;
&lt;br /&gt;
== Modding ==&lt;br /&gt;
* [[Modding EULA]]&lt;br /&gt;
* [[Modding|Introduction to modding]]&lt;br /&gt;
* [[Modding Cookbook]]&lt;br /&gt;
* [[Basic Troubleshooting]]&lt;br /&gt;
* [[Fx Groups]]&lt;br /&gt;
* [[Localization and Text Highlighting]]&lt;br /&gt;
* [[Pixel Art]]&lt;br /&gt;
* [[Adding a new License]]&lt;br /&gt;
&lt;br /&gt;
== Editors ==&lt;br /&gt;
* [[Module Editor]]&lt;br /&gt;
** [[Basics of Module Creation]]&lt;br /&gt;
* [[Combat Editor Cookbook]]&lt;br /&gt;
* [[Editor Triggers|Editor Triggers List]]&lt;br /&gt;
* [[Playtesting|Playtesting tips]]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[Changes from the TTRPG]]&lt;br /&gt;
&lt;br /&gt;
== External Links &amp;amp; Resources ==&lt;br /&gt;
* [https://wick.works/devlog/category/lancer-tactics Devlog at wick.works]&lt;br /&gt;
* [https://discord.com/invite/2t7Efg2Fbj Lancer Tactics Discord]&lt;br /&gt;
* [https://wick.itch.io/lancer-tactics/community itch.io forums]&lt;br /&gt;
* [https://wick.itch.io/lancer-tactics itch.io store page]&lt;br /&gt;
* [https://store.steampowered.com/app/4049810/Lancer_Tactics/ Wishlist on Steam]&lt;br /&gt;
* [https://mod.io/g/lancer-tactics Lancer Tactics on mod.io]&lt;br /&gt;
* [https://compcon.app/ COMP/CON]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Lancer Tactics is not an official Lancer product; it is a third party work, and is not affiliated with Massif Press. Lancer Tactics is published via the Lancer Third Party License. Lancer is copyright Massif Press.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Darloth</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Adding_a_new_License&amp;diff=130</id>
		<title>Adding a new License</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Adding_a_new_License&amp;diff=130"/>
		<updated>2026-07-22T22:53:21Z</updated>

		<summary type="html">&lt;p&gt;Darloth: Added content section, link to Take your Balor to work day.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Possibly one of the most common things a piece of Lancer content will do is define a new license players can take ranks in, and so here is a quick summary of the typical tasks necessary to make a mod that does just that.&lt;br /&gt;
&lt;br /&gt;
This won&#039;t cover specifics of how to implement any particular license, but will lay out the steps necessary for any and every license.&lt;br /&gt;
&lt;br /&gt;
Before you begin, it&#039;s a good idea to read through the [[Modding|Introduction to Modding]] if you haven&#039;t already, as that covers all the basic concepts of using Godot as a modding environment and the mod tool that Lancer Tactics has in support of that.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
For a license to show up in the game, it requires at least the main li_[licensename].tres file, and usually several other things:&lt;br /&gt;
&lt;br /&gt;
* An UnlockTree Resource for the license itself, saved as a file following the naming convention li_[licensename].tres, usually placed in the res/content/licenses/[manufacturer]/ subfolder.&lt;br /&gt;
** An icon for that UnlockTree - an Everest icon will be substituted here if there is no icon, but that makes it confusing to use.  Typically the icon here is the same as the granted frame for the license, though this isn&#039;t a hard requirement.  This is the icon that will show up in the license wheel.&lt;br /&gt;
** an UnlockRank Resource for each of the three ranks of the license.  These are usually defined inline in the inspector, without being saved as separate files.&lt;br /&gt;
*** Two pieces of gear in the GrantedGear array of each UnlockRank.  The game will load and display the license without them, but it will have obviously missing data, and will not seem finished.&lt;br /&gt;
*** An icon for each rank is nice, though the defaults do work&lt;br /&gt;
*** A frame at rank 2, in the GrantedFrames array.  In theory this could be inline, but in practice a mf_[framename].tres file is selected or drag-dropped into here to specify the link to the frame.&lt;br /&gt;
&lt;br /&gt;
If your license is within any of the existing big-4 manufacturer folders or the gms folder, it should be automatically picked up by the resource group addon and loaded as a license for that manufacturer by the mod support code.&lt;br /&gt;
&lt;br /&gt;
On the other hand, if you&#039;re adding your own manufacturer, that will require additional files:&lt;br /&gt;
&lt;br /&gt;
* A man_[manufacturername].tres Manufacturer Resource file saved in the res/content/manufacturers/ folder.  &lt;br /&gt;
** An icon for that manufacturer, which will be used for the selection button for it.&lt;br /&gt;
** A link to the ResourceGroup file which tells the game how to find content for that manufacturer, see below&lt;br /&gt;
* A ResourceGroup file in the same location as the Manufacturer resource.  This is a special type of file that the Resource Group addon edits every time the project is run, and collects all resource files within a certain set of subdirectories usually specified via a search string. &amp;lt;p&amp;gt;For example, the resgrp_man_horus.tres file has the filter &amp;lt;code&amp;gt;**/horus/**.tres&amp;lt;/code&amp;gt; which picks up every resource file (they have the .tres extension) under any directory path including a /horus/ directory, such as /res/content/licenses/&#039;&#039;&#039;horus&#039;&#039;&#039;/li_goblin.tres and many others.  Whenever the game is started, it builds a list of these resource files and adds it to the set of paths stored in the resource group, and those are associated with the manufacturer.  &amp;lt;p&amp;gt;There&#039;s also an exclude list, typically excluding files starting with &amp;lt;code&amp;gt;buff_&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;action_&amp;lt;/code&amp;gt;, as those are not items that belong to the manufacturer and could be found in menus, but used by the game to make things happen.&lt;br /&gt;
&lt;br /&gt;
== Content ==&lt;br /&gt;
&lt;br /&gt;
Actual content that goes in the license is usually distributed over a variety of locations - frames go in the frames folder, gear has its own folder, each with subfolders for individual frames or frame powers or gear items and so on.  The most generic of these will not require any custom scripting, just making a new Kit resource, saving it to the right location with the right naming convention, and adjusting numbers and adding inline subresources, but most interesting abilities will also require .gd script files to modify the behaviour of the game to follow whatever specific rules the content item has.  &lt;br /&gt;
&lt;br /&gt;
Olive&#039;s [https://wick.works/devlog/take-your-balor-to-work-day Take your Balor to work day] is a great example of the process of adding and developing the Balor license, and reading that is probably a good start to help making your own.&lt;/div&gt;</summary>
		<author><name>Darloth</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Adding_a_new_License&amp;diff=123</id>
		<title>Adding a new License</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Adding_a_new_License&amp;diff=123"/>
		<updated>2026-07-22T22:32:09Z</updated>

		<summary type="html">&lt;p&gt;Darloth: Forgot how to do link formatting it seems, fixed.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Possibly one of the most common things a piece of Lancer content will do is define a new license players can take ranks in, and so here is a quick summary of the typical tasks necessary to make a mod that does just that.&lt;br /&gt;
&lt;br /&gt;
This won&#039;t cover specifics of how to implement any particular license, but will lay out the steps necessary for any and every license.&lt;br /&gt;
&lt;br /&gt;
Before you begin, it&#039;s a good idea to read through the [[Modding|Introduction to Modding]] if you haven&#039;t already, as that covers all the basic concepts of using Godot as a modding environment and the mod tool that Lancer Tactics has in support of that.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
For a license to show up in the game, it requires at least the main li_[licensename].tres file, and usually several other things:&lt;br /&gt;
&lt;br /&gt;
* An UnlockTree Resource for the license itself, saved as a file following the naming convention li_[licensename].tres, usually placed in the res/content/licenses/[manufacturer]/ subfolder.&lt;br /&gt;
** An icon for that UnlockTree - an Everest icon will be substituted here if there is no icon, but that makes it confusing to use.  Typically the icon here is the same as the granted frame for the license, though this isn&#039;t a hard requirement.  This is the icon that will show up in the license wheel.&lt;br /&gt;
** an UnlockRank Resource for each of the three ranks of the license.  These are usually defined inline in the inspector, without being saved as separate files.&lt;br /&gt;
*** Two pieces of gear in the GrantedGear array of each UnlockRank.  The game will load and display the license without them, but it will have obviously missing data, and will not seem finished.&lt;br /&gt;
*** An icon for each rank is nice, though the defaults do work&lt;br /&gt;
*** A frame at rank 2, in the GrantedFrames array.  In theory this could be inline, but in practice a mf_[framename].tres file is selected or drag-dropped into here to specify the link to the frame.&lt;br /&gt;
&lt;br /&gt;
If your license is within any of the existing big-4 manufacturer folders or the gms folder, it should be automatically picked up by the resource group addon and loaded as a license for that manufacturer by the mod support code.&lt;br /&gt;
&lt;br /&gt;
On the other hand, if you&#039;re adding your own manufacturer, that will require additional files:&lt;br /&gt;
&lt;br /&gt;
* A man_[manufacturername].tres Manufacturer Resource file saved in the res/content/manufacturers/ folder.  &lt;br /&gt;
** An icon for that manufacturer, which will be used for the selection button for it.&lt;br /&gt;
** A link to the ResourceGroup file which tells the game how to find content for that manufacturer, see below&lt;br /&gt;
* A ResourceGroup file in the same location as the Manufacturer resource.  This is a special type of file that the Resource Group addon edits every time the project is run, and collects all resource files within a certain set of subdirectories usually specified via a search string. &amp;lt;p&amp;gt;For example, the resgrp_man_horus.tres file has the filter &amp;lt;code&amp;gt;**/horus/**.tres&amp;lt;/code&amp;gt; which picks up every resource file (they have the .tres extension) under any directory path including a /horus/ directory, such as /res/content/licenses/&#039;&#039;&#039;horus&#039;&#039;&#039;/li_goblin.tres and many others.  Whenever the game is started, it builds a list of these resource files and adds it to the set of paths stored in the resource group, and those are associated with the manufacturer.  &amp;lt;p&amp;gt;There&#039;s also an exclude list, typically excluding files starting with &amp;lt;code&amp;gt;buff_&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;action_&amp;lt;/code&amp;gt;, as those are not items that belong to the manufacturer and could be found in menus, but used by the game to make things happen.&lt;/div&gt;</summary>
		<author><name>Darloth</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Adding_a_new_License&amp;diff=122</id>
		<title>Adding a new License</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Adding_a_new_License&amp;diff=122"/>
		<updated>2026-07-22T22:30:04Z</updated>

		<summary type="html">&lt;p&gt;Darloth: Bold looks better than italic, actually.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Possibly one of the most common things a piece of Lancer content will do is define a new license players can take ranks in, and so here is a quick summary of the typical tasks necessary to make a mod that does just that.&lt;br /&gt;
&lt;br /&gt;
This won&#039;t cover specifics of how to implement any particular license, but will lay out the steps necessary for any and every license.&lt;br /&gt;
&lt;br /&gt;
Before you begin, it&#039;s a good idea to read through the [[Modding/Introduction to Modding]] if you haven&#039;t already, as that covers all the basic concepts of using Godot as a modding environment and the mod tool that Lancer Tactics has in support of that.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
For a license to show up in the game, it requires at least the main li_[licensename].tres file, and usually several other things:&lt;br /&gt;
&lt;br /&gt;
* An UnlockTree Resource for the license itself, saved as a file following the naming convention li_[licensename].tres, usually placed in the res/content/licenses/[manufacturer]/ subfolder.&lt;br /&gt;
** An icon for that UnlockTree - an Everest icon will be substituted here if there is no icon, but that makes it confusing to use.  Typically the icon here is the same as the granted frame for the license, though this isn&#039;t a hard requirement.  This is the icon that will show up in the license wheel.&lt;br /&gt;
** an UnlockRank Resource for each of the three ranks of the license.  These are usually defined inline in the inspector, without being saved as separate files.&lt;br /&gt;
*** Two pieces of gear in the GrantedGear array of each UnlockRank.  The game will load and display the license without them, but it will have obviously missing data, and will not seem finished.&lt;br /&gt;
*** An icon for each rank is nice, though the defaults do work&lt;br /&gt;
*** A frame at rank 2, in the GrantedFrames array.  In theory this could be inline, but in practice a mf_[framename].tres file is selected or drag-dropped into here to specify the link to the frame.&lt;br /&gt;
&lt;br /&gt;
If your license is within any of the existing big-4 manufacturer folders or the gms folder, it should be automatically picked up by the resource group addon and loaded as a license for that manufacturer by the mod support code.&lt;br /&gt;
&lt;br /&gt;
On the other hand, if you&#039;re adding your own manufacturer, that will require additional files:&lt;br /&gt;
&lt;br /&gt;
* A man_[manufacturername].tres Manufacturer Resource file saved in the res/content/manufacturers/ folder.  &lt;br /&gt;
** An icon for that manufacturer, which will be used for the selection button for it.&lt;br /&gt;
** A link to the ResourceGroup file which tells the game how to find content for that manufacturer, see below&lt;br /&gt;
* A ResourceGroup file in the same location as the Manufacturer resource.  This is a special type of file that the Resource Group addon edits every time the project is run, and collects all resource files within a certain set of subdirectories usually specified via a search string. &amp;lt;p&amp;gt;For example, the resgrp_man_horus.tres file has the filter &amp;lt;code&amp;gt;**/horus/**.tres&amp;lt;/code&amp;gt; which picks up every resource file (they have the .tres extension) under any directory path including a /horus/ directory, such as /res/content/licenses/&#039;&#039;&#039;horus&#039;&#039;&#039;/li_goblin.tres and many others.  Whenever the game is started, it builds a list of these resource files and adds it to the set of paths stored in the resource group, and those are associated with the manufacturer.  &amp;lt;p&amp;gt;There&#039;s also an exclude list, typically excluding files starting with &amp;lt;code&amp;gt;buff_&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;action_&amp;lt;/code&amp;gt;, as those are not items that belong to the manufacturer and could be found in menus, but used by the game to make things happen.&lt;/div&gt;</summary>
		<author><name>Darloth</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Adding_a_new_License&amp;diff=121</id>
		<title>Adding a new License</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Adding_a_new_License&amp;diff=121"/>
		<updated>2026-07-22T22:29:43Z</updated>

		<summary type="html">&lt;p&gt;Darloth: Better formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Possibly one of the most common things a piece of Lancer content will do is define a new license players can take ranks in, and so here is a quick summary of the typical tasks necessary to make a mod that does just that.&lt;br /&gt;
&lt;br /&gt;
This won&#039;t cover specifics of how to implement any particular license, but will lay out the steps necessary for any and every license.&lt;br /&gt;
&lt;br /&gt;
Before you begin, it&#039;s a good idea to read through the [[Modding/Introduction to Modding]] if you haven&#039;t already, as that covers all the basic concepts of using Godot as a modding environment and the mod tool that Lancer Tactics has in support of that.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
For a license to show up in the game, it requires at least the main li_[licensename].tres file, and usually several other things:&lt;br /&gt;
&lt;br /&gt;
* An UnlockTree Resource for the license itself, saved as a file following the naming convention li_[licensename].tres, usually placed in the res/content/licenses/[manufacturer]/ subfolder.&lt;br /&gt;
** An icon for that UnlockTree - an Everest icon will be substituted here if there is no icon, but that makes it confusing to use.  Typically the icon here is the same as the granted frame for the license, though this isn&#039;t a hard requirement.  This is the icon that will show up in the license wheel.&lt;br /&gt;
** an UnlockRank Resource for each of the three ranks of the license.  These are usually defined inline in the inspector, without being saved as separate files.&lt;br /&gt;
*** Two pieces of gear in the GrantedGear array of each UnlockRank.  The game will load and display the license without them, but it will have obviously missing data, and will not seem finished.&lt;br /&gt;
*** An icon for each rank is nice, though the defaults do work&lt;br /&gt;
*** A frame at rank 2, in the GrantedFrames array.  In theory this could be inline, but in practice a mf_[framename].tres file is selected or drag-dropped into here to specify the link to the frame.&lt;br /&gt;
&lt;br /&gt;
If your license is within any of the existing big-4 manufacturer folders or the gms folder, it should be automatically picked up by the resource group addon and loaded as a license for that manufacturer by the mod support code.&lt;br /&gt;
&lt;br /&gt;
On the other hand, if you&#039;re adding your own manufacturer, that will require additional files:&lt;br /&gt;
&lt;br /&gt;
* A man_[manufacturername].tres Manufacturer Resource file saved in the res/content/manufacturers/ folder.  &lt;br /&gt;
** An icon for that manufacturer, which will be used for the selection button for it.&lt;br /&gt;
** A link to the ResourceGroup file which tells the game how to find content for that manufacturer, see below&lt;br /&gt;
* A ResourceGroup file in the same location as the Manufacturer resource.  This is a special type of file that the Resource Group addon edits every time the project is run, and collects all resource files within a certain set of subdirectories usually specified via a search string. &amp;lt;p&amp;gt;For example, the resgrp_man_horus.tres file has the filter &amp;lt;code&amp;gt;**/horus/**.tres&amp;lt;/code&amp;gt; which picks up every resource file (they have the .tres extension) under any directory path including a /horus/ directory, such as /res/content/licenses/&#039;&#039;horus&#039;&#039;/li_goblin.tres and many others.  Whenever the game is started, it builds a list of these resource files and adds it to the set of paths stored in the resource group, and those are associated with the manufacturer.  &amp;lt;p&amp;gt;There&#039;s also an exclude list, typically excluding files starting with &amp;lt;code&amp;gt;buff_&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;action_&amp;lt;/code&amp;gt;, as those are not items that belong to the manufacturer and could be found in menus, but used by the game to make things happen.&lt;/div&gt;</summary>
		<author><name>Darloth</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Adding_a_new_License&amp;diff=119</id>
		<title>Adding a new License</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Adding_a_new_License&amp;diff=119"/>
		<updated>2026-07-22T22:27:15Z</updated>

		<summary type="html">&lt;p&gt;Darloth: Added basic summary of what&amp;#039;s needed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Possibly one of the most common things a piece of Lancer content will do is define a new license players can take ranks in, and so here is a quick summary of the typical tasks necessary to make a mod that does just that.&lt;br /&gt;
&lt;br /&gt;
This won&#039;t cover specifics of how to implement any particular license, but will lay out the steps necessary for any and every license.&lt;br /&gt;
&lt;br /&gt;
Before you begin, it&#039;s a good idea to read through the [[Modding/Introduction to Modding]] if you haven&#039;t already, as that covers all the basic concepts of using Godot as a modding environment and the mod tool that Lancer Tactics has in support of that.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
For a license to show up in the game, it requires at least the main li_[licensename].tres file, and usually several other things:&lt;br /&gt;
&lt;br /&gt;
* An UnlockTree Resource for the license itself, saved as a file following the naming convention li_[licensename].tres, usually placed in the res/content/licenses/[manufacturer]/ subfolder.&lt;br /&gt;
** An icon for that UnlockTree - an Everest icon will be substituted here if there is no icon, but that makes it confusing to use.  Typically the icon here is the same as the granted frame for the license, though this isn&#039;t a hard requirement.  This is the icon that will show up in the license wheel.&lt;br /&gt;
** an UnlockRank Resource for each of the three ranks of the license.  These are usually defined inline in the inspector, without being saved as separate files.&lt;br /&gt;
*** Two pieces of gear in the GrantedGear array of each UnlockRank.  The game will load and display the license without them, but it will have obviously missing data, and will not seem finished.&lt;br /&gt;
*** An icon for each rank is nice, though the defaults do work&lt;br /&gt;
*** A frame at rank 2, in the GrantedFrames array.  In theory this could be inline, but in practice a mf_[framename].tres file is selected or drag-dropped into here to specify the link to the frame.&lt;br /&gt;
&lt;br /&gt;
If your license is within any of the existing big-4 manufacturer folders or the gms folder, it should be automatically picked up by the resource group addon and loaded as a license for that manufacturer by the mod support code.&lt;br /&gt;
&lt;br /&gt;
On the other hand, if you&#039;re adding your own manufacturer, that will require additional files:&lt;br /&gt;
&lt;br /&gt;
* A man_[manufacturername].tres Manufacturer Resource file saved in the res/content/manufacturers/ folder.  &lt;br /&gt;
** An icon for that manufacturer, which will be used for the selection button for it.&lt;br /&gt;
** A link to the ResourceGroup file which tells the game how to find content for that manufacturer, see below&lt;br /&gt;
* A ResourceGroup file in the same location as the Manufacturer resource.  This is a special type of file that the Resource Group addon edits every time the project is run, and collects all resource files within a certain set of subdirectories usually specified via a search string.  For example, the resgrp_man_horus.tres file has the filter &amp;lt;code&amp;gt;**/horus/**.tres&amp;lt;/code&amp;gt; which picks up every resource file (they have the .tres extension) under any directory path including a /horus/ directory, such as /res/content/licenses/*horus*/li_goblin.tres and many others.  Whenever the game is started, it builds a list of these resource files and adds it to the set of paths stored in the resource group, and those are associated with the manufacturer.  There&#039;s also an exclude list, typically excluding files starting with &amp;lt;code&amp;gt;buff_&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;action_&amp;lt;/code&amp;gt;, as those are not items that belong to the manufacturer and could be found in menus, but used by the game to make things happen.&lt;/div&gt;</summary>
		<author><name>Darloth</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=117</id>
		<title>The Muse</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=117"/>
		<updated>2026-07-22T22:00:55Z</updated>

		<summary type="html">&lt;p&gt;Darloth: /* Modding */ - link to Adding a new License page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;strong&amp;gt;The Muse&amp;lt;/strong&amp;gt; (aka the Lancer Tactics Wiki) is a compilation of editor documentation and guides for &amp;lt;strong&amp;gt;[https://lancertactics.com/ Lancer Tactics]&amp;lt;/strong&amp;gt;, a video game adaptation of the [https://massifpress.com/lancer Lancer TTRPG] by Tom Bloom and Miguel Lopez-Hall. The in-universe concept of the Muse is from the [https://vexwerewolf.itch.io/in-golden-flame-act-1 In Golden Flame] module by Vex Werewolf.&lt;br /&gt;
&lt;br /&gt;
== Modding ==&lt;br /&gt;
* [[Modding EULA]]&lt;br /&gt;
* [[Modding|Introduction to modding]]&lt;br /&gt;
* [[Adding a new License]]&lt;br /&gt;
* [[Modding Cookbook]]&lt;br /&gt;
* [[Basic Troubleshooting]]&lt;br /&gt;
* [[Pixel Art]]&lt;br /&gt;
&lt;br /&gt;
== Editors ==&lt;br /&gt;
* [[Module Editor]]&lt;br /&gt;
* [[Combat Editor Cookbook]]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[Changes from the TTRPG]]&lt;br /&gt;
&lt;br /&gt;
== External Links &amp;amp; Resources ==&lt;br /&gt;
* [https://wick.works/devlog/category/lancer-tactics Devlog at wick.works]&lt;br /&gt;
* [https://discord.com/invite/2t7Efg2Fbj Lancer Tactics Discord]&lt;br /&gt;
* [https://wick.itch.io/lancer-tactics/community itch.io forums]&lt;br /&gt;
* [https://wick.itch.io/lancer-tactics itch.io store page]&lt;br /&gt;
* [https://store.steampowered.com/app/4049810/Lancer_Tactics/ Wishlist on Steam]&lt;br /&gt;
* [https://mod.io/g/lancer-tactics Lancer Tactics on mod.io]&lt;br /&gt;
* [https://compcon.app/ COMP/CON]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Lancer Tactics is not an official Lancer product; it is a third party work, and is not affiliated with Massif Press. Lancer Tactics is published via the Lancer Third Party License. Lancer is copyright Massif Press.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Darloth</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=106</id>
		<title>Module Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=106"/>
		<updated>2026-07-17T22:05:34Z</updated>

		<summary type="html">&lt;p&gt;Darloth: Very basic explanation of module state.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:ModuleEditorBeats.png|thumb]]&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;strong&amp;gt;Module Editor&amp;lt;/strong&amp;gt; is a tool for adding downtime scenes between combats.&lt;br /&gt;
&lt;br /&gt;
A player is always within exactly one active Beat, which itself can contain one or more Moments. Beats are like a room and Moments are like the things you can do in that room.&lt;br /&gt;
&lt;br /&gt;
A module&#039;s State is also often relevant, serving as the memory of a module, accessed through variables which can also be updated or checked inside combats and preserved until needed.&lt;br /&gt;
&lt;br /&gt;
== Beats ==&lt;br /&gt;
&lt;br /&gt;
Beats determine what the player can do with the Lancers character-sheet-wise whenever another Moment isn&#039;t currently active. The available values:&lt;br /&gt;
; Hidden&lt;br /&gt;
: All Lancers are hidden. The player cannot open characters sheets or see who&#039;s in the current party.&lt;br /&gt;
; None&lt;br /&gt;
: The player can inspect character sheets, but not spend repairs or otherwise modify their Lancers.&lt;br /&gt;
; Short repair&lt;br /&gt;
: The player can spend repairs to restore Structure/Stress or destroyed systems and mechs, but not modify their current loadout.&lt;br /&gt;
; Full repair&lt;br /&gt;
: All stats are restored to full and the player is free to modify loadouts.&lt;br /&gt;
; Level up&lt;br /&gt;
: On entering this beat for the first time, all Lancers increase in License Level. Otherwise acts as a full repair.&lt;br /&gt;
&lt;br /&gt;
== Moments ==&lt;br /&gt;
&lt;br /&gt;
The current Moment types are:&lt;br /&gt;
; Combat Briefing&lt;br /&gt;
: Shows a preview of a combat with any available sitrep and map information. Players can press Launch to start the combat. There&#039;s also a checkbox to skip the briefing screen and jump straight into the combat as soon as this Moment becomes active.&lt;br /&gt;
; Exposition&lt;br /&gt;
: A flexible text box, optional image media, and player choices.&lt;br /&gt;
; Dialogue&lt;br /&gt;
: Runs a cutscene of characters speaking to each other, defined in the Conversation tool.&lt;br /&gt;
; Branch&lt;br /&gt;
: Automatically proceeds to one of two connected Moments depending on whether its condition returns true/false.&lt;br /&gt;
; Signal receiver&lt;br /&gt;
: Immediately becomes the active Moment when a Trigger emits a matching module signal effect and proceeds to whatever it&#039;s connected to.&lt;br /&gt;
; Trigger&lt;br /&gt;
: Runs some number of effects (as long as its conditions are met) and proceeds to whatever it&#039;s connected to. The interface for defining trigger conditions and effects is the same as in the Combat Editor but the list of what effects are available is different.&lt;br /&gt;
&lt;br /&gt;
== Media ==&lt;br /&gt;
&lt;br /&gt;
When a UI element needs to display a player-defined image, it does so through a Media picker. &lt;br /&gt;
&lt;br /&gt;
The current Media types are:&lt;br /&gt;
; PNG&lt;br /&gt;
: An arbitrary static image. Players can place .png files in the media/ folder within their module folder.&lt;br /&gt;
; Diorama&lt;br /&gt;
: A miniature map, created in a feature-reduced version of the combat editor.&lt;br /&gt;
; Mech&lt;br /&gt;
: The image of a mech from a module origin character or NPC.&lt;br /&gt;
; Pilot&lt;br /&gt;
: The image of one of the player&#039;s character portraits.&lt;br /&gt;
; NPC&lt;br /&gt;
: The image of one of the module NPC portraits.&lt;br /&gt;
&lt;br /&gt;
=== Backgrounds ===&lt;br /&gt;
&#039;&#039;Available media types: PNG, Diorama, Combat&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Beats and Moments can specify a Background Media, which underlays all the downtime UI and buttons. Unless an active Moment specifies otherwise, a Beat determines the current Background.&lt;br /&gt;
&lt;br /&gt;
Currently, only .png filenames that begin with the text &amp;quot;bg_&amp;quot; will show up and be available for backgrounds. (This is likely to change.) Backgrounds are recommended to be at least 1280x720 or a lower multiple with the same ratio.&lt;br /&gt;
&lt;br /&gt;
=== Handouts ===&lt;br /&gt;
[[File:ExpositionMedia.png|thumb|Example of an Exposition Moment screen with a Diorama provided as the Handout Media. ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Available media types: Any&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Exposition moments can specify a Handout Media which shows up alongside the text.&lt;br /&gt;
&lt;br /&gt;
Handout images will be rendered at a maximum of 512x512&lt;br /&gt;
&lt;br /&gt;
=== Banner ===&lt;br /&gt;
[[File:Custom_Module_Banner.png|thumb|Example view of the screen where you pick what module to play, showing the description and banner. ]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Available media types: PNG&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Shown above your module description when picking what module to play. The required dimensions or format of module banners may change in the future.&lt;br /&gt;
&lt;br /&gt;
Currently, only .png filenames that begin with the text &amp;quot;banner_&amp;quot; will show up and be available for banners.&lt;br /&gt;
&lt;br /&gt;
== State ==&lt;br /&gt;
&lt;br /&gt;
Any variable names can be used to store state, and any variable can store any data type.&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
A variable called Has_Player_Found_Secret_Pirate_Treasure could be assigned a boolean value of True during a combat (perhaps if they stand in a certain area and use a specific action) and then checked after that combat to give the player more rewards.  Once set to True in this fashion it will remain True until altered again, and (while it is probably a bad idea to do so) nothing stops you setting this variable to the number 14, or the string &amp;quot;no&amp;quot; at any point.&lt;/div&gt;</summary>
		<author><name>Darloth</name></author>
	</entry>
</feed>