<?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=Olive</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=Olive"/>
	<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/Special:Contributions/Olive"/>
	<updated>2026-08-27T14:54:36Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Modding&amp;diff=186</id>
		<title>Modding</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Modding&amp;diff=186"/>
		<updated>2026-08-26T21:49:14Z</updated>

		<summary type="html">&lt;p&gt;Olive: /* Modkit */ wording&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Get help at [https://wick.itch.io/lancer-tactics/community wick.itch.io/lancer-tactics] or [https://discord.com/invite/2t7Efg2Fbj Discord]&lt;br /&gt;
&lt;br /&gt;
== Modkit ==&lt;br /&gt;
&lt;br /&gt;
To make mods, you&#039;ll first need to get your hands on the source of the game. It’s possible to decompile any game made in Godot which is what bootleg (affectionate) modders have been doing up til now, but we’re making the source available through official channels for convenience. Lancer’s TTRPG creator ecosystem is based on a belief that it should be hackable &amp;amp; extensible, and we want to carry that culture forward.&lt;br /&gt;
&lt;br /&gt;
As of v1.3.3, you can download the modkit [https://wick.itch.io/lancer-tactics via itch.io]. Please be sure you&#039;ve reviewed and agree to the [https://lancertactics.com/modding-eula/ Modding EULA]&lt;br /&gt;
&lt;br /&gt;
If you want to adapt a third-party supplement that you did not design, be sure to get explicit permission from the creator — for your convenience &amp;amp; safety, we&#039;ve hosted a standard license you can refer to for that permission: [https://lancertactics.com/homebrew-mod-license/ Homebrew Mod License]&lt;br /&gt;
&lt;br /&gt;
== Background — how do Godot mods work? ==&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics is made in the [https://godotengine.org/ Godot] game engine; at time of writing on version 4.7. In order to make mods for anything besides asset packs, you&#039;ll need to become comfortable working in its editor. I hope this doesn&#039;t scare you off; of all the major game engines, it has a reputation of being easy to pick up.&lt;br /&gt;
&lt;br /&gt;
Godot projects have an internal filesystem much like the one on your computer; a series of folders and files. The root is referred to as &amp;lt;code&amp;gt;res://&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Godot_filesystem.png]]&lt;br /&gt;
&lt;br /&gt;
However, to run the game Godot needs assets (images, music, etc) to be in a different format than you’d find with them sitting in your filesystem. It compiles these files into a big pile of files that look like this, all jumbled together in one folder.&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_background_imports.png|thumb|A scattering of processed image files from Godot&#039;s .import folder. ]]&lt;br /&gt;
&lt;br /&gt;
To keep knowing where things are, it maintains a skeleton of the original filesystem with all the orignal files swapped out with “.remap” placeholders that just point to where in that big pile the asset they represent went. Furthermore, whenever the game attempts to load a specific asset at a location (e.g. &amp;lt;code&amp;gt;res://assets/icons/mech.svg&amp;lt;/code&amp;gt;), it caches whatever it loaded into memory. Whenever we ask it to load that asset again, it doesn’t have to go ask the .remap file where the original one went and load it up — it just returns whatever it ended up loading from there last time. This cache is like a ghost sitting on top of a skeleton.&lt;br /&gt;
&lt;br /&gt;
For modding, this gives us an opportunity. Instead of needing to actually copy in modded files and override the originals, we can manipulate this ghost-filesystem-cache by lying about what files are at what locations. Here’s what a mod looks like for Lancer Tactics (using a modified system from Godot Mod Loader):&lt;br /&gt;
&lt;br /&gt;
[[File:ModBackgroundUnpacked.png]]&lt;br /&gt;
&lt;br /&gt;
We have a special folder where we put the actual mod files: “unpacked”, then another folder with the specific mod’s identifier “Wickworks-Sawhorse”. Within that, we have a “res” folder, and that’s where the lying starts. When loading up the mod, we can grab everything inside of the mod’s “res” and tell the ghost-cache that the mod’s files are the ones that are actually at that location. In this example, by the end of it when we ask Godot to load &amp;lt;code&amp;gt;res://assets/frames/horus/mf_sawhorse.png&amp;lt;/code&amp;gt;, it will return the file that’s actually over in &amp;lt;code&amp;gt;res://unpacked/Wickworks-Sawhorse/res/assets/frames/horus/mf_sawhorse.png&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Now that we have the power to insert files as we’d like, Godot Mod Loader additionally has some functions that through dark magic allows multiple mods to all alter the same script instead of overriding it. I’m a little fuzzy on these details, but the shape of it is that while loading each successive script that extends the same file actually extends the previous one that also extended that script so all the changes end up getting applied.&lt;br /&gt;
&lt;br /&gt;
In order to change what mods are active, the out-of-the-box Godot Mod Loader addon expects you to restart the game so it can start work with a clean slate each time. For Lancer Tactics, I modified this so it tracks all files inserted so we can go and undo all of our lies and reset the ghost-cache to files’ original locations. This was important because I’m expecting people to want to be able to make maps and modules with bundled-in mods that substantially alter the content of the game, and requiring a restart whenever you load one up would be a terrible experience.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mod Loader ==&lt;br /&gt;
Lancer Tactics is using the [https://wiki.godotmodding.com/ Godot Mod Loader addon], but has made some changes to it:&lt;br /&gt;
&lt;br /&gt;
=== Implicit Overrides ===&lt;br /&gt;
Instead of having to manually declare each asset you want to override in code (via an overwrites.gd that the Mod Tools would generate and put into an extensions/ or overwrites/ sub-directory), assets and resources are overridden implicitly by matching file paths and names from a mod&#039;s res/ directory. See [[Modding Cookbook#Replacing Resources|replacing resources]] for details. This should allow people to make texture asset pack mods fully outside the Godot editor by downloading a template, dropping images into a folder, and zipping it up.&lt;br /&gt;
&lt;br /&gt;
=== Hooks and class_name scripts ===&lt;br /&gt;
Unfortunately, it ended up not being feasible to support their script Hook system, which means it&#039;s not possible to change class_name scripts (or is unreliable to do so). Hooks were designed to work around a bug in Godot that has been unaddressed since 4.3 and do some crazy preprocessing of scripts that involves decompiling them, editing names of functions, and swapping in the copies. For the time being, we decided to instead convert the most likely targets of mods (UnitCondition, UnitTile, UnitAction, etc) into autoloads so they can be accessed by normal script Extensions instead. This will provide better backwards compatibility for mods once the bug is addressed than having to go back and tear out all the Hook code.&lt;br /&gt;
&lt;br /&gt;
TL;DR: You are NOT able to currently extend a script with a class_name. If you want to make a mod that extends a class_name script and it looks like it could be an Autoload, let me know and I&#039;ll see if I can convert it!&lt;br /&gt;
&lt;br /&gt;
The engine bug necessitating hooks: [https://github.com/godotengine/godot/issues/83542 github.com/godotengine/godot/issues/83542]&lt;br /&gt;
&lt;br /&gt;
A possible fix to the godot engine that&#039;ll solve all this: [https://github.com/godotengine/godot/pull/116556 github.com/godotengine/godot/pull/116556]&lt;br /&gt;
&lt;br /&gt;
=== Formatting and Paths ===&lt;br /&gt;
Additionally, we&#039;ve made some path and formatting tweaks for styling and ease of use:&lt;br /&gt;
&lt;br /&gt;
* We&#039;re using &amp;lt;code&amp;gt;res://unpacked/&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;res://mods-unpacked/&amp;lt;/code&amp;gt; for the directory in the godot project that mods are unpacked into. I don&#039;t like hypens in filenames, it&#039;s a bit shorter, and will be sorted alphabetically to the end of the project folders. Plus mod zips will be structured like &amp;lt;code&amp;gt;unpacked/Author-ModName/manifest.json&amp;lt;/code&amp;gt; which is a bit cleaner than having an extra &amp;quot;mods-&amp;quot; at the start of it.&lt;br /&gt;
&lt;br /&gt;
* Our manifest.json doesn&#039;t have the &amp;lt;code&amp;gt;&amp;quot;extra&amp;quot;: {&amp;quot;godot: {...}}&amp;lt;/code&amp;gt; keys, opting instead to just put all that stuff at the root.&lt;br /&gt;
&lt;br /&gt;
* Mod config files are stored in &amp;lt;code&amp;gt;user://mod_configs/&amp;lt;/code&amp;gt; instead of straight &amp;lt;code&amp;gt;user://&amp;lt;/code&amp;gt; for mod-tool-plugin-save.json, mod_user_profiles.json, and mod_loader_cache.json. Keeps the user directory cleaner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mod Types &amp;amp; Security ==&lt;br /&gt;
&lt;br /&gt;
Mods are code that some rando wrote that the game downloads and then runs on your machine. Godot does not have built-in sandboxing for gdscript, so this code has just as much access as the game does, ie, can read or write any file on your computer and talk to the internet. Uh oh!&lt;br /&gt;
&lt;br /&gt;
To be fair, this is a issue with most mods for most games. It’s a very trust-based at-your-own-risk sort of country. This is fine if mods aren’t tightly integrated, but as soon as you as a developer start removing barriers and letting people accidentally stumble into downloading harmful code by just pressing buttons in-game, you start taking on the responsibility in the case of something bad happening.&lt;br /&gt;
&lt;br /&gt;
Slay The Spire 2, another game made in Godot, handles this by putting a big warning screen that it forces you to click through before you can start installing mods. We’ve done something similar:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO INSERT IMAGE&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To help manage this, Lancer Tactics distinguishes between three mod types:&lt;br /&gt;
&lt;br /&gt;
; Asset Pack&lt;br /&gt;
: Just images and tres files. Doesn&#039;t even have a mod_main.gd; just a json manifest and images in various places to get picked up by the appropriate resources. These can be required by combats/modules and they&#039;ll be treated as safe since not having scripts makes them risk-free. We allow tres files to be in asset packs as long as they do not contain any inline scripts.&lt;br /&gt;
: Mods that do not contain any .gd files (including mod_main.gd) will be treated as Asset Packs.&lt;br /&gt;
&lt;br /&gt;
; Content Pack&lt;br /&gt;
: Can have scripts and a mod_main.gd to do non-standard things, but are responsible for making sure anything off-standard they do is reversible without a restart. Since these allow arbitrary code execution, they will prompt additional warnings to the player before they are enabled.&lt;br /&gt;
: Mods that contain .gd files and are marked as &amp;lt;code&amp;gt;requires_restart&amp;lt;/code&amp;gt; as &amp;quot;false&amp;quot; in their manifest will be treated as Content Packs.&lt;br /&gt;
&lt;br /&gt;
; Substantial Mod&lt;br /&gt;
: As above, but the changes are not cleanly reversible so require a restart to turn off or on.&lt;br /&gt;
: Mods that contain .gd files and are marked as &amp;lt;code&amp;gt;requires_restart&amp;lt;/code&amp;gt; as &amp;quot;true&amp;quot; in their manifest will be treated as Substantial Mods.&lt;br /&gt;
&lt;br /&gt;
An area for future growth, given substantially more resources, would be to add the ability to script game content in a nice sandboxed environment by setting up an internal .lua API for new abilities to use. This would allow new mechs and whatnot to count as asset packs, but the time-benefit tradeoff isn’t favorable given our current time and labor constraints.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Modding&amp;diff=185</id>
		<title>Modding</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Modding&amp;diff=185"/>
		<updated>2026-08-26T21:48:21Z</updated>

		<summary type="html">&lt;p&gt;Olive: /* Modkit */ Added links to the new modkit licenses&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Get help at [https://wick.itch.io/lancer-tactics/community wick.itch.io/lancer-tactics] or [https://discord.com/invite/2t7Efg2Fbj Discord]&lt;br /&gt;
&lt;br /&gt;
== Modkit ==&lt;br /&gt;
&lt;br /&gt;
To make mods, you&#039;ll first need to get your hands on the source of the game. It’s possible to decompile any game made in Godot which is what bootleg (affectionate) modders have been doing up til now, but we’re making the source available through official channels for convenience. Lancer’s TTRPG creator ecosystem is based on a belief that it should be hackable &amp;amp; extensible, and we want to carry that culture forward.&lt;br /&gt;
&lt;br /&gt;
As of v1.3.3, you can download the modkit [https://wick.itch.io/lancer-tactics via itch.io]. Please be sure you&#039;ve reviewed and agree to the [https://lancertactics.com/modding-eula/ Modding EULA]&lt;br /&gt;
&lt;br /&gt;
If you want to adapt a third-party supplement that you did not design, be sure to get explicit permission from the creator — for your convenience &amp;amp; safety, we&#039;ve hosted a standard license you can refer to for the terms of the adaptation here: [https://lancertactics.com/homebrew-mod-license/ Homebrew Mod License]&lt;br /&gt;
&lt;br /&gt;
== Background — how do Godot mods work? ==&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics is made in the [https://godotengine.org/ Godot] game engine; at time of writing on version 4.7. In order to make mods for anything besides asset packs, you&#039;ll need to become comfortable working in its editor. I hope this doesn&#039;t scare you off; of all the major game engines, it has a reputation of being easy to pick up.&lt;br /&gt;
&lt;br /&gt;
Godot projects have an internal filesystem much like the one on your computer; a series of folders and files. The root is referred to as &amp;lt;code&amp;gt;res://&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Godot_filesystem.png]]&lt;br /&gt;
&lt;br /&gt;
However, to run the game Godot needs assets (images, music, etc) to be in a different format than you’d find with them sitting in your filesystem. It compiles these files into a big pile of files that look like this, all jumbled together in one folder.&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_background_imports.png|thumb|A scattering of processed image files from Godot&#039;s .import folder. ]]&lt;br /&gt;
&lt;br /&gt;
To keep knowing where things are, it maintains a skeleton of the original filesystem with all the orignal files swapped out with “.remap” placeholders that just point to where in that big pile the asset they represent went. Furthermore, whenever the game attempts to load a specific asset at a location (e.g. &amp;lt;code&amp;gt;res://assets/icons/mech.svg&amp;lt;/code&amp;gt;), it caches whatever it loaded into memory. Whenever we ask it to load that asset again, it doesn’t have to go ask the .remap file where the original one went and load it up — it just returns whatever it ended up loading from there last time. This cache is like a ghost sitting on top of a skeleton.&lt;br /&gt;
&lt;br /&gt;
For modding, this gives us an opportunity. Instead of needing to actually copy in modded files and override the originals, we can manipulate this ghost-filesystem-cache by lying about what files are at what locations. Here’s what a mod looks like for Lancer Tactics (using a modified system from Godot Mod Loader):&lt;br /&gt;
&lt;br /&gt;
[[File:ModBackgroundUnpacked.png]]&lt;br /&gt;
&lt;br /&gt;
We have a special folder where we put the actual mod files: “unpacked”, then another folder with the specific mod’s identifier “Wickworks-Sawhorse”. Within that, we have a “res” folder, and that’s where the lying starts. When loading up the mod, we can grab everything inside of the mod’s “res” and tell the ghost-cache that the mod’s files are the ones that are actually at that location. In this example, by the end of it when we ask Godot to load &amp;lt;code&amp;gt;res://assets/frames/horus/mf_sawhorse.png&amp;lt;/code&amp;gt;, it will return the file that’s actually over in &amp;lt;code&amp;gt;res://unpacked/Wickworks-Sawhorse/res/assets/frames/horus/mf_sawhorse.png&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Now that we have the power to insert files as we’d like, Godot Mod Loader additionally has some functions that through dark magic allows multiple mods to all alter the same script instead of overriding it. I’m a little fuzzy on these details, but the shape of it is that while loading each successive script that extends the same file actually extends the previous one that also extended that script so all the changes end up getting applied.&lt;br /&gt;
&lt;br /&gt;
In order to change what mods are active, the out-of-the-box Godot Mod Loader addon expects you to restart the game so it can start work with a clean slate each time. For Lancer Tactics, I modified this so it tracks all files inserted so we can go and undo all of our lies and reset the ghost-cache to files’ original locations. This was important because I’m expecting people to want to be able to make maps and modules with bundled-in mods that substantially alter the content of the game, and requiring a restart whenever you load one up would be a terrible experience.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mod Loader ==&lt;br /&gt;
Lancer Tactics is using the [https://wiki.godotmodding.com/ Godot Mod Loader addon], but has made some changes to it:&lt;br /&gt;
&lt;br /&gt;
=== Implicit Overrides ===&lt;br /&gt;
Instead of having to manually declare each asset you want to override in code (via an overwrites.gd that the Mod Tools would generate and put into an extensions/ or overwrites/ sub-directory), assets and resources are overridden implicitly by matching file paths and names from a mod&#039;s res/ directory. See [[Modding Cookbook#Replacing Resources|replacing resources]] for details. This should allow people to make texture asset pack mods fully outside the Godot editor by downloading a template, dropping images into a folder, and zipping it up.&lt;br /&gt;
&lt;br /&gt;
=== Hooks and class_name scripts ===&lt;br /&gt;
Unfortunately, it ended up not being feasible to support their script Hook system, which means it&#039;s not possible to change class_name scripts (or is unreliable to do so). Hooks were designed to work around a bug in Godot that has been unaddressed since 4.3 and do some crazy preprocessing of scripts that involves decompiling them, editing names of functions, and swapping in the copies. For the time being, we decided to instead convert the most likely targets of mods (UnitCondition, UnitTile, UnitAction, etc) into autoloads so they can be accessed by normal script Extensions instead. This will provide better backwards compatibility for mods once the bug is addressed than having to go back and tear out all the Hook code.&lt;br /&gt;
&lt;br /&gt;
TL;DR: You are NOT able to currently extend a script with a class_name. If you want to make a mod that extends a class_name script and it looks like it could be an Autoload, let me know and I&#039;ll see if I can convert it!&lt;br /&gt;
&lt;br /&gt;
The engine bug necessitating hooks: [https://github.com/godotengine/godot/issues/83542 github.com/godotengine/godot/issues/83542]&lt;br /&gt;
&lt;br /&gt;
A possible fix to the godot engine that&#039;ll solve all this: [https://github.com/godotengine/godot/pull/116556 github.com/godotengine/godot/pull/116556]&lt;br /&gt;
&lt;br /&gt;
=== Formatting and Paths ===&lt;br /&gt;
Additionally, we&#039;ve made some path and formatting tweaks for styling and ease of use:&lt;br /&gt;
&lt;br /&gt;
* We&#039;re using &amp;lt;code&amp;gt;res://unpacked/&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;res://mods-unpacked/&amp;lt;/code&amp;gt; for the directory in the godot project that mods are unpacked into. I don&#039;t like hypens in filenames, it&#039;s a bit shorter, and will be sorted alphabetically to the end of the project folders. Plus mod zips will be structured like &amp;lt;code&amp;gt;unpacked/Author-ModName/manifest.json&amp;lt;/code&amp;gt; which is a bit cleaner than having an extra &amp;quot;mods-&amp;quot; at the start of it.&lt;br /&gt;
&lt;br /&gt;
* Our manifest.json doesn&#039;t have the &amp;lt;code&amp;gt;&amp;quot;extra&amp;quot;: {&amp;quot;godot: {...}}&amp;lt;/code&amp;gt; keys, opting instead to just put all that stuff at the root.&lt;br /&gt;
&lt;br /&gt;
* Mod config files are stored in &amp;lt;code&amp;gt;user://mod_configs/&amp;lt;/code&amp;gt; instead of straight &amp;lt;code&amp;gt;user://&amp;lt;/code&amp;gt; for mod-tool-plugin-save.json, mod_user_profiles.json, and mod_loader_cache.json. Keeps the user directory cleaner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mod Types &amp;amp; Security ==&lt;br /&gt;
&lt;br /&gt;
Mods are code that some rando wrote that the game downloads and then runs on your machine. Godot does not have built-in sandboxing for gdscript, so this code has just as much access as the game does, ie, can read or write any file on your computer and talk to the internet. Uh oh!&lt;br /&gt;
&lt;br /&gt;
To be fair, this is a issue with most mods for most games. It’s a very trust-based at-your-own-risk sort of country. This is fine if mods aren’t tightly integrated, but as soon as you as a developer start removing barriers and letting people accidentally stumble into downloading harmful code by just pressing buttons in-game, you start taking on the responsibility in the case of something bad happening.&lt;br /&gt;
&lt;br /&gt;
Slay The Spire 2, another game made in Godot, handles this by putting a big warning screen that it forces you to click through before you can start installing mods. We’ve done something similar:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO INSERT IMAGE&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To help manage this, Lancer Tactics distinguishes between three mod types:&lt;br /&gt;
&lt;br /&gt;
; Asset Pack&lt;br /&gt;
: Just images and tres files. Doesn&#039;t even have a mod_main.gd; just a json manifest and images in various places to get picked up by the appropriate resources. These can be required by combats/modules and they&#039;ll be treated as safe since not having scripts makes them risk-free. We allow tres files to be in asset packs as long as they do not contain any inline scripts.&lt;br /&gt;
: Mods that do not contain any .gd files (including mod_main.gd) will be treated as Asset Packs.&lt;br /&gt;
&lt;br /&gt;
; Content Pack&lt;br /&gt;
: Can have scripts and a mod_main.gd to do non-standard things, but are responsible for making sure anything off-standard they do is reversible without a restart. Since these allow arbitrary code execution, they will prompt additional warnings to the player before they are enabled.&lt;br /&gt;
: Mods that contain .gd files and are marked as &amp;lt;code&amp;gt;requires_restart&amp;lt;/code&amp;gt; as &amp;quot;false&amp;quot; in their manifest will be treated as Content Packs.&lt;br /&gt;
&lt;br /&gt;
; Substantial Mod&lt;br /&gt;
: As above, but the changes are not cleanly reversible so require a restart to turn off or on.&lt;br /&gt;
: Mods that contain .gd files and are marked as &amp;lt;code&amp;gt;requires_restart&amp;lt;/code&amp;gt; as &amp;quot;true&amp;quot; in their manifest will be treated as Substantial Mods.&lt;br /&gt;
&lt;br /&gt;
An area for future growth, given substantially more resources, would be to add the ability to script game content in a nice sandboxed environment by setting up an internal .lua API for new abilities to use. This would allow new mechs and whatnot to count as asset packs, but the time-benefit tradeoff isn’t favorable given our current time and labor constraints.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=184</id>
		<title>The Muse</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=184"/>
		<updated>2026-08-26T21:41:31Z</updated>

		<summary type="html">&lt;p&gt;Olive: EULA now hosted at https://lancertactics.com/modding-eula/&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;
* [https://lancertactics.com/modding-eula/ 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>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Modding&amp;diff=183</id>
		<title>Modding</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Modding&amp;diff=183"/>
		<updated>2026-08-26T21:41:13Z</updated>

		<summary type="html">&lt;p&gt;Olive: EULA now hosted at https://lancertactics.com/modding-eula/&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Get help at [https://wick.itch.io/lancer-tactics/community wick.itch.io/lancer-tactics] or [https://discord.com/invite/2t7Efg2Fbj Discord]&lt;br /&gt;
&lt;br /&gt;
== Modkit ==&lt;br /&gt;
&lt;br /&gt;
To make mods, you&#039;ll first need to get your hands on the source of the game. It’s possible to decompile any game made in Godot which is what bootleg (affectionate) modders have been doing up til now, but we’re making the source available through official channels for convenience. Lancer’s TTRPG creator ecosystem is based on a belief that it should be hackable &amp;amp; extensible, and we want to carry that culture forward.&lt;br /&gt;
&lt;br /&gt;
We (Wickworks) are talking to a lawyer to make sure we have all our hatches buttoned down legally to make sure we maintain ownership of the game code itself (and maybe like watermark some assets?), but once we get that squared away we’ll add the modkit alongside the rest of the downloads on itch. Until then, you can request early access to it on [https://discord.com/invite/2t7Efg2Fbj Lancer Tactic’s Discord server].&lt;br /&gt;
&lt;br /&gt;
Finally, before getting started with the modkit, please be sure you&#039;ve reviewed and agree to the [https://lancertactics.com/modding-eula/ Modding EULA].&lt;br /&gt;
&lt;br /&gt;
== Background — how do Godot mods work? ==&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics is made in the [https://godotengine.org/ Godot] game engine; at time of writing on version 4.7. In order to make mods for anything besides asset packs, you&#039;ll need to become comfortable working in its editor. I hope this doesn&#039;t scare you off; of all the major game engines, it has a reputation of being easy to pick up.&lt;br /&gt;
&lt;br /&gt;
Godot projects have an internal filesystem much like the one on your computer; a series of folders and files. The root is referred to as &amp;lt;code&amp;gt;res://&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Godot_filesystem.png]]&lt;br /&gt;
&lt;br /&gt;
However, to run the game Godot needs assets (images, music, etc) to be in a different format than you’d find with them sitting in your filesystem. It compiles these files into a big pile of files that look like this, all jumbled together in one folder.&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_background_imports.png|thumb|A scattering of processed image files from Godot&#039;s .import folder. ]]&lt;br /&gt;
&lt;br /&gt;
To keep knowing where things are, it maintains a skeleton of the original filesystem with all the orignal files swapped out with “.remap” placeholders that just point to where in that big pile the asset they represent went. Furthermore, whenever the game attempts to load a specific asset at a location (e.g. &amp;lt;code&amp;gt;res://assets/icons/mech.svg&amp;lt;/code&amp;gt;), it caches whatever it loaded into memory. Whenever we ask it to load that asset again, it doesn’t have to go ask the .remap file where the original one went and load it up — it just returns whatever it ended up loading from there last time. This cache is like a ghost sitting on top of a skeleton.&lt;br /&gt;
&lt;br /&gt;
For modding, this gives us an opportunity. Instead of needing to actually copy in modded files and override the originals, we can manipulate this ghost-filesystem-cache by lying about what files are at what locations. Here’s what a mod looks like for Lancer Tactics (using a modified system from Godot Mod Loader):&lt;br /&gt;
&lt;br /&gt;
[[File:ModBackgroundUnpacked.png]]&lt;br /&gt;
&lt;br /&gt;
We have a special folder where we put the actual mod files: “unpacked”, then another folder with the specific mod’s identifier “Wickworks-Sawhorse”. Within that, we have a “res” folder, and that’s where the lying starts. When loading up the mod, we can grab everything inside of the mod’s “res” and tell the ghost-cache that the mod’s files are the ones that are actually at that location. In this example, by the end of it when we ask Godot to load &amp;lt;code&amp;gt;res://assets/frames/horus/mf_sawhorse.png&amp;lt;/code&amp;gt;, it will return the file that’s actually over in &amp;lt;code&amp;gt;res://unpacked/Wickworks-Sawhorse/res/assets/frames/horus/mf_sawhorse.png&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Now that we have the power to insert files as we’d like, Godot Mod Loader additionally has some functions that through dark magic allows multiple mods to all alter the same script instead of overriding it. I’m a little fuzzy on these details, but the shape of it is that while loading each successive script that extends the same file actually extends the previous one that also extended that script so all the changes end up getting applied.&lt;br /&gt;
&lt;br /&gt;
In order to change what mods are active, the out-of-the-box Godot Mod Loader addon expects you to restart the game so it can start work with a clean slate each time. For Lancer Tactics, I modified this so it tracks all files inserted so we can go and undo all of our lies and reset the ghost-cache to files’ original locations. This was important because I’m expecting people to want to be able to make maps and modules with bundled-in mods that substantially alter the content of the game, and requiring a restart whenever you load one up would be a terrible experience.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mod Loader ==&lt;br /&gt;
Lancer Tactics is using the [https://wiki.godotmodding.com/ Godot Mod Loader addon], but has made some changes to it:&lt;br /&gt;
&lt;br /&gt;
=== Implicit Overrides ===&lt;br /&gt;
Instead of having to manually declare each asset you want to override in code (via an overwrites.gd that the Mod Tools would generate and put into an extensions/ or overwrites/ sub-directory), assets and resources are overridden implicitly by matching file paths and names from a mod&#039;s res/ directory. See [[Modding Cookbook#Replacing Resources|replacing resources]] for details. This should allow people to make texture asset pack mods fully outside the Godot editor by downloading a template, dropping images into a folder, and zipping it up.&lt;br /&gt;
&lt;br /&gt;
=== Hooks and class_name scripts ===&lt;br /&gt;
Unfortunately, it ended up not being feasible to support their script Hook system, which means it&#039;s not possible to change class_name scripts (or is unreliable to do so). Hooks were designed to work around a bug in Godot that has been unaddressed since 4.3 and do some crazy preprocessing of scripts that involves decompiling them, editing names of functions, and swapping in the copies. For the time being, we decided to instead convert the most likely targets of mods (UnitCondition, UnitTile, UnitAction, etc) into autoloads so they can be accessed by normal script Extensions instead. This will provide better backwards compatibility for mods once the bug is addressed than having to go back and tear out all the Hook code.&lt;br /&gt;
&lt;br /&gt;
TL;DR: You are NOT able to currently extend a script with a class_name. If you want to make a mod that extends a class_name script and it looks like it could be an Autoload, let me know and I&#039;ll see if I can convert it!&lt;br /&gt;
&lt;br /&gt;
The engine bug necessitating hooks: [https://github.com/godotengine/godot/issues/83542 github.com/godotengine/godot/issues/83542]&lt;br /&gt;
&lt;br /&gt;
A possible fix to the godot engine that&#039;ll solve all this: [https://github.com/godotengine/godot/pull/116556 github.com/godotengine/godot/pull/116556]&lt;br /&gt;
&lt;br /&gt;
=== Formatting and Paths ===&lt;br /&gt;
Additionally, we&#039;ve made some path and formatting tweaks for styling and ease of use:&lt;br /&gt;
&lt;br /&gt;
* We&#039;re using &amp;lt;code&amp;gt;res://unpacked/&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;res://mods-unpacked/&amp;lt;/code&amp;gt; for the directory in the godot project that mods are unpacked into. I don&#039;t like hypens in filenames, it&#039;s a bit shorter, and will be sorted alphabetically to the end of the project folders. Plus mod zips will be structured like &amp;lt;code&amp;gt;unpacked/Author-ModName/manifest.json&amp;lt;/code&amp;gt; which is a bit cleaner than having an extra &amp;quot;mods-&amp;quot; at the start of it.&lt;br /&gt;
&lt;br /&gt;
* Our manifest.json doesn&#039;t have the &amp;lt;code&amp;gt;&amp;quot;extra&amp;quot;: {&amp;quot;godot: {...}}&amp;lt;/code&amp;gt; keys, opting instead to just put all that stuff at the root.&lt;br /&gt;
&lt;br /&gt;
* Mod config files are stored in &amp;lt;code&amp;gt;user://mod_configs/&amp;lt;/code&amp;gt; instead of straight &amp;lt;code&amp;gt;user://&amp;lt;/code&amp;gt; for mod-tool-plugin-save.json, mod_user_profiles.json, and mod_loader_cache.json. Keeps the user directory cleaner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mod Types &amp;amp; Security ==&lt;br /&gt;
&lt;br /&gt;
Mods are code that some rando wrote that the game downloads and then runs on your machine. Godot does not have built-in sandboxing for gdscript, so this code has just as much access as the game does, ie, can read or write any file on your computer and talk to the internet. Uh oh!&lt;br /&gt;
&lt;br /&gt;
To be fair, this is a issue with most mods for most games. It’s a very trust-based at-your-own-risk sort of country. This is fine if mods aren’t tightly integrated, but as soon as you as a developer start removing barriers and letting people accidentally stumble into downloading harmful code by just pressing buttons in-game, you start taking on the responsibility in the case of something bad happening.&lt;br /&gt;
&lt;br /&gt;
Slay The Spire 2, another game made in Godot, handles this by putting a big warning screen that it forces you to click through before you can start installing mods. We’ve done something similar:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO INSERT IMAGE&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To help manage this, Lancer Tactics distinguishes between three mod types:&lt;br /&gt;
&lt;br /&gt;
; Asset Pack&lt;br /&gt;
: Just images and tres files. Doesn&#039;t even have a mod_main.gd; just a json manifest and images in various places to get picked up by the appropriate resources. These can be required by combats/modules and they&#039;ll be treated as safe since not having scripts makes them risk-free. We allow tres files to be in asset packs as long as they do not contain any inline scripts.&lt;br /&gt;
: Mods that do not contain any .gd files (including mod_main.gd) will be treated as Asset Packs.&lt;br /&gt;
&lt;br /&gt;
; Content Pack&lt;br /&gt;
: Can have scripts and a mod_main.gd to do non-standard things, but are responsible for making sure anything off-standard they do is reversible without a restart. Since these allow arbitrary code execution, they will prompt additional warnings to the player before they are enabled.&lt;br /&gt;
: Mods that contain .gd files and are marked as &amp;lt;code&amp;gt;requires_restart&amp;lt;/code&amp;gt; as &amp;quot;false&amp;quot; in their manifest will be treated as Content Packs.&lt;br /&gt;
&lt;br /&gt;
; Substantial Mod&lt;br /&gt;
: As above, but the changes are not cleanly reversible so require a restart to turn off or on.&lt;br /&gt;
: Mods that contain .gd files and are marked as &amp;lt;code&amp;gt;requires_restart&amp;lt;/code&amp;gt; as &amp;quot;true&amp;quot; in their manifest will be treated as Substantial Mods.&lt;br /&gt;
&lt;br /&gt;
An area for future growth, given substantially more resources, would be to add the ability to script game content in a nice sandboxed environment by setting up an internal .lua API for new abilities to use. This would allow new mechs and whatnot to count as asset packs, but the time-benefit tradeoff isn’t favorable given our current time and labor constraints.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Basic_Troubleshooting&amp;diff=138</id>
		<title>Basic Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Basic_Troubleshooting&amp;diff=138"/>
		<updated>2026-07-25T00:19:41Z</updated>

		<summary type="html">&lt;p&gt;Olive: /* Troubleshooting Code/Content Additions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Troubleshooting Code/Content Additions ==&lt;br /&gt;
This is a checklist of common mistakes that may be causing your mod to work incorrectly. It&#039;s not a comprehensive guide on all the things that can go wrong, but it&#039;s a good place to start if you&#039;re stuck.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Missing Script:&#039;&#039;&#039; If the addition is a custom action or buff that requires a custom script to implement, make sure you&#039;ve assigned that script to the resource for that action or buff. Besides not executing your custom code, certain settings can create even more erratic behavior on default resources for custom scripts. For example, the root &amp;quot;Buff&amp;quot; resource with &amp;quot;trigger on&amp;quot; events set will simply remove themselves when those events trigger.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Null Checks:&#039;&#039;&#039; Whenever you await &#039;&#039;anything&#039;&#039; within an action, make sure you check if your unit and/or target are still valid before proceeding. If the unit dies or the player exits the game before the ability resumes the references may become null. There are a variety of abort_ functions on EventCores that make this more painless. For example:&lt;br /&gt;
&lt;br /&gt;
 await run_system_fxgs(unit)&lt;br /&gt;
 if activation.abort_without_unit(unit): return&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
 var plan:CompconPlan = await TargetActionUtil.ask_for_targets(activation)&lt;br /&gt;
 if activation.abort_when(not CompconPlan.is_valid_with_targets(plan, context)): return&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Basic_Troubleshooting&amp;diff=137</id>
		<title>Basic Troubleshooting</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Basic_Troubleshooting&amp;diff=137"/>
		<updated>2026-07-25T00:19:15Z</updated>

		<summary type="html">&lt;p&gt;Olive: /* Troubleshooting Code/Content Additions */ add null check tip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Troubleshooting Code/Content Additions ==&lt;br /&gt;
This is a checklist of common mistakes that may be causing your mod to work incorrectly. It&#039;s not a comprehensive guide on all the things that can go wrong, but it&#039;s a good place to start if you&#039;re stuck.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Missing Script:&#039;&#039;&#039; If the addition is a custom action or buff that requires a custom script to implement, make sure you&#039;ve assigned that script to the resource for that action or buff. Besides not executing your custom code, certain settings can create even more erratic behavior on default resources for custom scripts. For example, the root &amp;quot;Buff&amp;quot; resource with &amp;quot;trigger on&amp;quot; events set will simply remove themselves when those events trigger.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Null Checks:&#039;&#039;&#039; Whenever you await &#039;anything&#039; within an action, make sure you check if your unit and/or target are still valid before proceeding. If the unit dies or the player exits the game before the ability resumes the references may become null. There are a variety of abort_ functions on EventCores that make this more painless. For example:&lt;br /&gt;
&lt;br /&gt;
 await run_system_fxgs(unit)&lt;br /&gt;
 if activation.abort_without_unit(unit): return&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
 var plan:CompconPlan = await TargetActionUtil.ask_for_targets(activation)&lt;br /&gt;
 if activation.abort_when(not CompconPlan.is_valid_with_targets(plan, context)): return&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=136</id>
		<title>The Muse</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=136"/>
		<updated>2026-07-23T22:52:21Z</updated>

		<summary type="html">&lt;p&gt;Olive: /* Editors */&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;
* [[Pixel Art]]&lt;br /&gt;
* [[Adding a new License]]&lt;br /&gt;
&lt;br /&gt;
== Editors ==&lt;br /&gt;
* [[Module Editor]]&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>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=135</id>
		<title>The Muse</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=135"/>
		<updated>2026-07-23T22:52:02Z</updated>

		<summary type="html">&lt;p&gt;Olive: /* Editors */ link to playtesting tips&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;
* [[Pixel Art]]&lt;br /&gt;
* [[Adding a new License]]&lt;br /&gt;
&lt;br /&gt;
== Editors ==&lt;br /&gt;
* [[Module Editor]]&lt;br /&gt;
* [[Combat Editor Cookbook]]&lt;br /&gt;
* [[Editor Triggers|Editor Triggers List]]&lt;br /&gt;
* [[Playtesting tips|Playtesting]]&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>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Playtesting&amp;diff=134</id>
		<title>Playtesting</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Playtesting&amp;diff=134"/>
		<updated>2026-07-23T22:51:15Z</updated>

		<summary type="html">&lt;p&gt;Olive: Add playtesting tips page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tips ==&lt;br /&gt;
&lt;br /&gt;
* You can open the console with the ` key. These commands can be helpful in getting and checking the invisible state of the combat or module (type &amp;quot;help&amp;quot; for details on all available commands):&lt;br /&gt;
&lt;br /&gt;
 get_module_state&lt;br /&gt;
 set_module_state&lt;br /&gt;
 get_combat_state&lt;br /&gt;
 set_combat state&lt;br /&gt;
 get_clocks&lt;br /&gt;
 set_clock&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=131</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=131"/>
		<updated>2026-07-22T22:55:00Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* latin */&lt;br /&gt;
@import url(&#039;https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&amp;amp;family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&amp;amp;display=swap&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
  background: #1a212b;&lt;br /&gt;
  font-family: &#039;Open Sans&#039;, &#039;Segoe UI&#039;,&#039;Segoe UI Emoji&#039;,&#039;Segoe UI Symbol&#039;,&#039;Lato&#039;,&#039;Liberation Sans&#039;,&#039;Noto Sans&#039;,&#039;Helvetica Neue&#039;,&#039;Helvetica&#039;,sans-serif;&lt;br /&gt;
&lt;br /&gt;
  dt {&lt;br /&gt;
    font-family: &#039;Open Sans&#039;, &#039;Segoe UI&#039;,&#039;Segoe UI Emoji&#039;,&#039;Segoe UI Symbol&#039;,&#039;Lato&#039;,&#039;Liberation Sans&#039;,&#039;Noto Sans&#039;,&#039;Helvetica Neue&#039;,&#039;Helvetica&#039;,sans-serif;&lt;br /&gt;
    margin: 0 1em 4px;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  h1, h2, h3, h4, h5, h6 {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  input {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .mw-createacct-benefits-heading, .mw-number-text, .mw-number-text strong {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
    background: none !important;&lt;br /&gt;
    padding: 0 !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #simpleSearch {&lt;br /&gt;
    border: solid 1px #36455C;&lt;br /&gt;
&lt;br /&gt;
    #searchInput {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      background: #11151C;&lt;br /&gt;
      color: white;&lt;br /&gt;
      border-radius: 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #searchButton {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/search-ltr-light.svg);&lt;br /&gt;
      background-size: 20px 20px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-container {&lt;br /&gt;
    background: #1a212b;&lt;br /&gt;
    border-bottom: 4px solid #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    #p-logo-text a {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      text-transform: uppercase;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #personal h2 {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/user-light.svg);&lt;br /&gt;
      @media screen and (min-width: 850px) {&lt;br /&gt;
        background-size: 20px 20px;&lt;br /&gt;
        background-position: left 13px;&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #p-search {&lt;br /&gt;
      padding-top: 1px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #site-navigation, #site-tools, #page-tools {&lt;br /&gt;
    background: #eee !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @media screen and (max-width: 850px) {&lt;br /&gt;
    #site-navigation h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/menu-large-light.svg);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #site-tools h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/gear-large-light.svg);&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-hack {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-nav-hack {&lt;br /&gt;
    background: #eee !important;&lt;br /&gt;
&lt;br /&gt;
    .color-middle, .color-left, .color-right {&lt;br /&gt;
      background: #E5B91A;&lt;br /&gt;
      height: 4px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-content-container {&lt;br /&gt;
    background: #36455C;&lt;br /&gt;
    border-bottom: solid 4px #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    input[type=&amp;quot;button&amp;quot;], input[type=&amp;quot;submit&amp;quot;], #wpCreateaccount {&lt;br /&gt;
      background-color: #E5B91A !important;&lt;br /&gt;
      color: #11151C !important;&lt;br /&gt;
      border-color: #E5B91A !important;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:hover {&lt;br /&gt;
        color: #fff !important;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #mw-content {&lt;br /&gt;
      background: #eee !important;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-body h1.firstHeading {&lt;br /&gt;
      border-color: #52698C;&lt;br /&gt;
      padding-bottom: 6px;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-indicators {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      .mw-helplink-icon { display: none; }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .tools-inline li {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      padding-bottom: 2px;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;.selected { border-color: #52698C; }&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:not(.mw-watchlink) a {&lt;br /&gt;
        background: none;&lt;br /&gt;
        padding: 0 2px;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-editsection {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
      background: none;&lt;br /&gt;
      margin: 0;&lt;br /&gt;
&lt;br /&gt;
      a:first-of-type {&lt;br /&gt;
        padding: 0;&lt;br /&gt;
        margin: 0 20px 0 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-footer-container {&lt;br /&gt;
    color: #8197b8;&lt;br /&gt;
&lt;br /&gt;
    a {&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #footer-poweredbyico {&lt;br /&gt;
      background: #8197b8;&lt;br /&gt;
      padding: 4px;&lt;br /&gt;
      border-radius: 5px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=129</id>
		<title>The Muse</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=129"/>
		<updated>2026-07-22T22:43:58Z</updated>

		<summary type="html">&lt;p&gt;Olive: /* Modding */ link to fx groups&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;
* [[Pixel Art]]&lt;br /&gt;
* [[Adding a new License]]&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>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Fx_Groups&amp;diff=128</id>
		<title>Fx Groups</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Fx_Groups&amp;diff=128"/>
		<updated>2026-07-22T22:42:47Z</updated>

		<summary type="html">&lt;p&gt;Olive: initial commit, copied over from internal documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Testing FxGroups ==&lt;br /&gt;
Open up &#039;&#039;&#039;fx_group_texter.tscn&#039;&#039;&#039; and Run Current Scene (Ctrl+R).&lt;br /&gt;
[[File:FX Group tester.png|thumb|Screenshot of the FX Group tester.]]&lt;br /&gt;
The two panels on the left are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Attack FXGs&#039;&#039;&#039;. These are fxgs that have a corresponding target fxg. The base one runs at the originating tile and the target one runs at the target tile(s).&lt;br /&gt;
* &#039;&#039;&#039;Other FXGs&#039;&#039;&#039;. Abilities or events, at the originating tile only.&lt;br /&gt;
&lt;br /&gt;
FXGs are added to each list by their file names; when the system finds a pair of fxgs with one ending in &amp;quot;_target&amp;quot;, it will add the two to the top list and otherwise in the bottom.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This scene hot-reloads!&#039;&#039;&#039; If you modify an FXG scene in the editor, &#039;&#039;&#039;save it&#039;&#039;&#039;, and then switch back to the running tester, re-running the FXG should use the updated values! This should work for tweaking resources, but you may have to re-run the scene in order to obtain new graphic files or sounds.&lt;br /&gt;
&lt;br /&gt;
== Anatomy of an FxGroup ==&lt;br /&gt;
[[File:FXG node tree.png|thumb|378x378px|FXG node tree.]]&lt;br /&gt;
Fx Group scenes are composed of a FxGroup node with some number of children nodes that play sprite animations, FMOD sound effect events, particle emitters, and movements of the originating mech token.&lt;br /&gt;
&lt;br /&gt;
They can also have sub-FxGroup nodes as children to coordinate the ordering and timing of such effects. These children FxGroups can have their own basic effects and FxGroup children of their own, etc. The timing of when children FxGroups play their effects is detailed below.&lt;br /&gt;
&lt;br /&gt;
In order to allow the game to show results of an action mid-completion of the effect, the &#039;&#039;&#039;Preamble&#039;&#039;&#039; signal can be emitted at some point during the effect. &lt;br /&gt;
&lt;br /&gt;
FxGroup scene files should live in the &#039;&#039;&#039;content/fx_groups/&#039;&#039;&#039; directory. Subfolders can be created at the developer&#039;s discretion.&lt;br /&gt;
&lt;br /&gt;
== Timing of an FxGroup ==&lt;br /&gt;
[[File:FxGroup Timing.png|center|thumb|775x775px|Diagram of an FxGroup&#039;s lifecycle.]]&lt;br /&gt;
&lt;br /&gt;
=== Start ===&lt;br /&gt;
The root FxGroup is kicked off by code. It may or may not be awaited; attacks wait for the effect to finish, while terrain destruction just kind of happens in the background.&lt;br /&gt;
&lt;br /&gt;
=== Start delay &amp;amp; jitter ===&lt;br /&gt;
It can wait some amount of time before kicking off its children effects. Jitter will randomly add &#039;&#039;up to&#039;&#039; its amount of time in seconds to this delay.&lt;br /&gt;
&lt;br /&gt;
=== Basic children ===&lt;br /&gt;
AnimatedSprite3D, MuzzleFlash, GPUParticle3D, and BumpNodes all count as &amp;quot;basic children&amp;quot;. They all kick off at the same time here.&lt;br /&gt;
&lt;br /&gt;
=== Children FxGroups ===&lt;br /&gt;
These have three possible start points:&lt;br /&gt;
&lt;br /&gt;
* Immediate — start at the same time as the rest of the basic children&lt;br /&gt;
* Parent Preamble — start whenever the parent fires its Preamble signal.&lt;br /&gt;
* Basic Siblings Finished — start when the basic children of its parent finish&lt;br /&gt;
&lt;br /&gt;
=== Preamble ===&lt;br /&gt;
This has four possible points it could be emitted:&lt;br /&gt;
&lt;br /&gt;
* Immediate — effectively no preamble; emits as soon as all the rest of the effects start&lt;br /&gt;
* Basic Children Finished — emits when all non-FXG children complete (animations &lt;br /&gt;
* Duration — emit after a set time (looks at the &amp;quot;Preamble Duration&amp;quot; value, which no other preamble mode uses)&lt;br /&gt;
* At finish — effectively the entire thing is preamble; emits when all children have completed.&lt;br /&gt;
&lt;br /&gt;
When the Preamble is emitted:&lt;br /&gt;
&lt;br /&gt;
* Any children FXGs set to &amp;quot;Parent Preamble&amp;quot; are kicked off.&lt;br /&gt;
* Any awaiting game code is resumed so we don&#039;t have to wait for the entire FXG to complete before showing results.&lt;br /&gt;
&lt;br /&gt;
For example, the attack event sequence uses the preamble point like this:&lt;br /&gt;
[[File:FxGroup attack timing.png|center|thumb|600x600px|Diagram of how an FxGroup interacts with an attack sequence.]]&lt;br /&gt;
&lt;br /&gt;
* The result of the attack is calculated.&lt;br /&gt;
* Attack FXG is started, and the event code halts. (e.g. for the &amp;quot;wind up&amp;quot; to the attack)&lt;br /&gt;
* Event code awaits the Preamble to be emitted.&lt;br /&gt;
* The result of the attack is shown: miss/hit text, damage popcorn, etc.&lt;br /&gt;
* The Target FXG &#039;&#039;also&#039;&#039; begins playing, even though the post-preamble of the attack FXG is still playing at the same time.&lt;br /&gt;
* The event code waits for the Target FXG to emit its preamble.&lt;br /&gt;
* Game proceeds apace, allowing for the dice rolls and stuff to happen while the Target FXG is still finishing up.&lt;br /&gt;
&lt;br /&gt;
Other abilities may also await for/respond to a Preamble signal separately from the completion of the entire FxGroup, but since they&#039;re less standardized it&#039;s case-by-case. Only the root FxGroup&#039;s preamble affects outside code like this; children FxGroup preambles are only used for internal timings.&lt;br /&gt;
&lt;br /&gt;
=== Complete ===&lt;br /&gt;
An FxGroup marks itself as complete when &#039;&#039;both&#039;&#039; all basic effects children (including sounds) and all FxGroup children have marked themselves as complete.&lt;br /&gt;
&lt;br /&gt;
== Useful FXG sub-nodes ==&lt;br /&gt;
&lt;br /&gt;
=== SfxEmitter ===&lt;br /&gt;
Plays a sound effect event set up in FMOD. Variations and timing are set up there. You shouldn&#039;t need to set any values on these nodes besides which event to play. This does not count as a &amp;quot;basic child&amp;quot;, so the FXG will not await this sound completing for the animations.&lt;br /&gt;
&lt;br /&gt;
=== GPUParticles3D ===&lt;br /&gt;
Particle emitters! This is a whole thing that might be a bit much to make a written guide on. The important values to set for these are:&lt;br /&gt;
&lt;br /&gt;
* the &#039;&#039;&#039;Time&#039;&#039;&#039; dropdown (lifetime, explosiveness)&lt;br /&gt;
* creating a new &#039;&#039;&#039;Process Material&#039;&#039;&#039; (emission position and particle movement) with Animation Speed = 1 if you want a spritesheet.&lt;br /&gt;
* &#039;&#039;&#039;Draw Passes&#039;&#039;&#039; &amp;gt; New &#039;&#039;&#039;Quadmesh&#039;&#039;&#039; for Pass 1 &amp;gt; New &#039;&#039;&#039;StandardMaterial3D&#039;&#039;&#039; with the static sprite/horizontal single-strip spritesheet in question.&lt;br /&gt;
&lt;br /&gt;
Since particle emitters don&#039;t have a reliable &amp;quot;run for this long&amp;quot; mechanism, the length of time particle emitters run for is set by &#039;&#039;&#039;Emitter Duration&#039;&#039;&#039; on the parent FxGroup node. The emitter will run for that duration then hang out for an extra particle&#039;s lifetime before declaring itself finished.&lt;br /&gt;
&lt;br /&gt;
There is also a custom node called &#039;&#039;&#039;GpuParticles3DPointing&#039;&#039;&#039; that is identical to the basic particles node but it gets angled towards the target of the fx (or the origin, if on the target). Basically a muzzle flare but for particles.&lt;br /&gt;
&lt;br /&gt;
=== BumpNodes / BumpCores ===&lt;br /&gt;
[[File:BumpNode.png|thumb|BumpNode in the inspector.]]&lt;br /&gt;
BumpNodes directly move or flash mech sprites. BumpCores exist so they can be passed around as resources via code; just create a new one for each BumpNode when creating these via the editor.&lt;br /&gt;
&lt;br /&gt;
You should set up the FXG so only one of these are active at a time; chaining them together is fine, but they&#039;ll likely conflict if you have two running at once on the same mech.&lt;br /&gt;
&lt;br /&gt;
The direction of the bump will be provided by the code that calls this. For attacks, this will be the angle from the attacker to the target; to get the attacker to recoil backwards, for example, you&#039;d want to set Angle Offset to 180.&lt;br /&gt;
&lt;br /&gt;
There&#039;s currently a default Hit Bump that plays when a mech gets damaged, so don&#039;t worry about adding that to each target. I think that default will eventually be superseded by FXGs specific to each damage type in the future.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;angle_random&#039;&#039;&#039; — Check to ignore Angle Offset and pick a random direction each time get_angle_offset() is called&lt;br /&gt;
* &#039;&#039;&#039;angle offset&#039;&#039;&#039; — direction of the bump in DEGREES (offsets the base_angle given to the BumpNode)&lt;br /&gt;
* &#039;&#039;&#039;repeats&#039;&#039;&#039; — 1 is one-shot&lt;br /&gt;
* &#039;&#039;&#039;distance&#039;&#039;&#039; — how far in world coords to bump them (1.0 = one entire tile)&lt;br /&gt;
* &#039;&#039;&#039;duration out&#039;&#039;&#039; — time to the extent of the bump to the extent&lt;br /&gt;
* &#039;&#039;&#039;duration in&#039;&#039;&#039; — time from the extent of the bump to return to baseline&lt;br /&gt;
* &#039;&#039;&#039;hold&#039;&#039;&#039; — delay at max before returning to baseline&lt;br /&gt;
* &#039;&#039;&#039;pause&#039;&#039;&#039; — delay at baseline before starting the next round&lt;br /&gt;
* &#039;&#039;&#039;smooth&#039;&#039;&#039; — do we pop them to the end point or tween them there&lt;br /&gt;
* &#039;&#039;&#039;flash color&#039;&#039;&#039; — when bumping back, tweens albedo to this color. (1,1,1) is normal, (4,4,4) is a reasonable flash to white.&lt;br /&gt;
&lt;br /&gt;
=== Muzzle Flash ===&lt;br /&gt;
[[File:Muzzle Flash.png|center|thumb|571x571px|Muzzle flash node.]]&lt;br /&gt;
Extends AnimatedSprite3D for some extra common functionality. This will position itself to:&lt;br /&gt;
&lt;br /&gt;
* be on a plane parallel to the ground&lt;br /&gt;
* be on a ring centered on the mech of the given diameter, pointing outwards&lt;br /&gt;
&lt;br /&gt;
It will also run the given animation for the given &#039;&#039;&#039;repeats&#039;&#039;&#039; before automatically stopping &amp;amp; marking itself as finished.&lt;br /&gt;
&lt;br /&gt;
If you give it additional sprite frames in its &#039;&#039;&#039;alternate_sprite_frames&#039;&#039;&#039; property, it will randomly shuffle sprite frames after finishing each animation loop (you could have it weigh certain possibilities more heavily by adding them to the array multiple times). The total pool of possible spriteframes is this array + its original &#039;&#039;&#039;sprite_frames&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
You can give a muzzle flash a GPUParticles3D as a child and it will run those particles as one-shots, re-enabling the emitter at the end of each animation loop. You probably want high explosiveness for the emitter to emit a bunch, but be careful to not toggle it back on again before those original particles are gone or no new ones will spawn.&lt;br /&gt;
&lt;br /&gt;
=== AnimatedSprite3D / SpriteFrames ===&lt;br /&gt;
&#039;&#039;Note: the stock game has moved away from using AnimatedSprite3D nodes, generally opting instead to use a genuine particle system. However, the machinery for these are still in place.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
AnimatedSprite3D is one-shot an out-of-the-box Godot node that will animate a SpriteFrames resource. When the FXG starts, it will cause the AnimatedSprite3D to:&lt;br /&gt;
&lt;br /&gt;
* run its SpriteFrames from the start of the animation&lt;br /&gt;
* run the animation a single time before stopping &amp;amp; marking itself as finished.&lt;br /&gt;
* fade in from transparency at start and fade out on finish if the parent FXGroup has &#039;&#039;&#039;Animated Sprite Fade Time&#039;&#039;&#039; set.&lt;br /&gt;
&lt;br /&gt;
FXGs will automatically set the following values on animated sprites, in order to keep things consistent:&lt;br /&gt;
&lt;br /&gt;
* billboard: enabled&lt;br /&gt;
* double_sided: disabled&lt;br /&gt;
* texture_filter: nearest w/ mipmaps&lt;br /&gt;
* render_priority: 1&lt;br /&gt;
&lt;br /&gt;
==== SpriteFrames ====&lt;br /&gt;
SpriteFrame resources are created from the FileSystem panel and live next to the spritesheet image asset. They define how a spritesheet should be sliced up into an animation, and are shared across all FXGs that might want to use an AnimatedSprite3D with this animation.&lt;br /&gt;
&lt;br /&gt;
To make a new one, right-click near the spritesheet &amp;gt; Create new &amp;gt; Resource &amp;gt; SpriteFrames, and name it the same thing as the spritesheet png. Double-click the new SpriteFrames file to open up the SpriteFrames editor from the bottom of the screen.&lt;br /&gt;
&lt;br /&gt;
There&#039;s a little grid icon underneath the Animation Frames label that you can press to go and open up the spritesheet and set the size an ordering of the of the frames. You may also want to set the FPS of the animations here.&lt;br /&gt;
&lt;br /&gt;
After that, you can use this SpriteFrames resource in any AnimatedSprite3D node!&lt;br /&gt;
&lt;br /&gt;
=== Launched Projectile ===&lt;br /&gt;
todo: write docs&lt;br /&gt;
&lt;br /&gt;
=== Arcing Projectile ===&lt;br /&gt;
todo: write docs&lt;br /&gt;
&lt;br /&gt;
=== Arcing Sprite ===&lt;br /&gt;
todo: write docs&lt;br /&gt;
&lt;br /&gt;
=== Rotating Mesh ===&lt;br /&gt;
It spins by some speed and direction endlessly.&lt;br /&gt;
&lt;br /&gt;
=== Controlled Light &amp;amp; Controlled Decal ===&lt;br /&gt;
todo: touch grass&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=File:FxGroup_attack_timing.png&amp;diff=127</id>
		<title>File:FxGroup attack timing.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=File:FxGroup_attack_timing.png&amp;diff=127"/>
		<updated>2026-07-22T22:41:48Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagram of how an FxGroup interacts with attack sequences.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=File:FxGroup_Timing.png&amp;diff=126</id>
		<title>File:FxGroup Timing.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=File:FxGroup_Timing.png&amp;diff=126"/>
		<updated>2026-07-22T22:38:33Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diagram of the timing of an FxGroup over its lifespan.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=File:BumpNode.png&amp;diff=125</id>
		<title>File:BumpNode.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=File:BumpNode.png&amp;diff=125"/>
		<updated>2026-07-22T22:36:12Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Example values for a BumpNode&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=File:Muzzle_Flash.png&amp;diff=124</id>
		<title>File:Muzzle Flash.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=File:Muzzle_Flash.png&amp;diff=124"/>
		<updated>2026-07-22T22:34:59Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Example of a muzzle flash node.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=File:FXG_node_tree.png&amp;diff=120</id>
		<title>File:FXG node tree.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=File:FXG_node_tree.png&amp;diff=120"/>
		<updated>2026-07-22T22:28:32Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshot of an FXG node tree as seen in the editor.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=File:FX_Group_tester.png&amp;diff=118</id>
		<title>File:FX Group tester.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=File:FX_Group_tester.png&amp;diff=118"/>
		<updated>2026-07-22T22:26:31Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshot of the FX group tester in FXG mode.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Changes_from_the_TTRPG&amp;diff=116</id>
		<title>Changes from the TTRPG</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Changes_from_the_TTRPG&amp;diff=116"/>
		<updated>2026-07-22T21:07:00Z</updated>

		<summary type="html">&lt;p&gt;Olive: reorganize&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;While overall Lancer Tactics has been able to stay extremely close to the TTRPG ruleset (you can even import a character made in [https://compcon.app/ COMP/CON]), we&#039;ve had to make a number of changes for the sake of UX and/or computational ability. The following is a non-exhaustive list.&lt;br /&gt;
&lt;br /&gt;
== Major ==&lt;br /&gt;
* Flying is a on/off status that puts you +3 above the surface instead of free elevation control.&lt;br /&gt;
* You have two &amp;quot;action points&amp;quot; instead of an explicit quick+quick/full; in practice this ends up being extremely similar to tabletop, minus some restrictions (eg you have more movement flexibility in between your attacks while Barraging). It also locks out being able to attack multiple times with the same weapon via Asura; I&#039;ll lose no sleep there.&lt;br /&gt;
* We had to limit brace triggering to not prompt-spam you each time you take damage. Currently it gives you the option to brace whenever you&#039;d otherwise be structured/stressed or if would take over half your health in one hit.&lt;br /&gt;
* We&#039;re using Kai&#039;s NPC rebake project instead of the CRB NPCs; this was [https://www.kickstarter.com/projects/wickworks/lancer-tactics/posts/4379409 hotly debated] but through the discussion we decided that it&#039;s a dramatic improvement in experience while being a light enough touch that it doesn&#039;t compromise tabletop compatibility.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Minor ==&lt;br /&gt;
* We don&#039;t enforce the limit of locking pilots to rank 1 talents at LL0, nor the rules for respeccing. RAW they allow a loophole to get rank 3 in a talent at LL1, so are only ever functionally relevant at LL0 and that made it seem not worth enforcing.&lt;br /&gt;
* Metahook and similar effects that mirror the duration of statuses only apply the mirrored statuses until the end of that character&#039;s next turn.&lt;br /&gt;
* Gravity Grenade counts both voluntary and involuntary movement.&lt;br /&gt;
* The timing of Ideal Image&#039;s systems check happens a lot sooner; before targets are declared.&lt;br /&gt;
* Cable Winch can be detached by a hull check instead of that weird attack thing.&lt;br /&gt;
* Blademaster&#039;s Feint makes you immune to triggering &#039;&#039;all&#039;&#039; reactions from the target until the end of your current turn.&lt;br /&gt;
&lt;br /&gt;
== Trivial ==&lt;br /&gt;
* Mirage&#039;s Dataveil can&#039;t be returned to the Mirage. The AI isn&#039;t smart enough to know when it would be a good idea to do so.&lt;br /&gt;
* Spector&#039;s Machine Pistol only grants extra movement after the attack instead of optionally before.&lt;br /&gt;
* Dimensional Emblems can only be quick-action dissipated by hostile characters.&lt;br /&gt;
* Autopod and Seismic Deluge only trigger on hostile characters.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Changes_from_the_TTRPG&amp;diff=115</id>
		<title>Changes from the TTRPG</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Changes_from_the_TTRPG&amp;diff=115"/>
		<updated>2026-07-22T21:04:52Z</updated>

		<summary type="html">&lt;p&gt;Olive: /* Major */ Rank 1 talent limitation skip&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;While overall Lancer Tactics has been able to stay extremely close to the TTRPG ruleset (you can even import a character made in [https://compcon.app/ COMP/CON]), we&#039;ve had to make a number of changes for the sake of UX and/or computational ability. The following is a non-exhaustive list.&lt;br /&gt;
&lt;br /&gt;
== Major ==&lt;br /&gt;
* Flying is a on/off status that puts you +3 above the surface instead of free elevation control.&lt;br /&gt;
* You have two &amp;quot;action points&amp;quot; instead of an explicit quick+quick/full; in practice this ends up being extremely similar to tabletop, minus some restrictions (eg you have more movement flexibility in between your attacks while Barraging). It also locks out being able to attack multiple times with the same weapon via Asura; I&#039;ll lose no sleep there.&lt;br /&gt;
* We had to limit brace triggering to not prompt-spam you each time you take damage. Currently it gives you the option to brace whenever you&#039;d otherwise be structured/stressed or if would take over half your health in one hit.&lt;br /&gt;
* We&#039;re using Kai&#039;s NPC rebake project instead of the CRB NPCs; this was [https://www.kickstarter.com/projects/wickworks/lancer-tactics/posts/4379409 hotly debated] but through the discussion we decided that it&#039;s a dramatic improvement in experience while being a light enough touch that it doesn&#039;t compromise tabletop compatibility.&lt;br /&gt;
* We don&#039;t enforce the limit of locking pilots to rank 1 talents at LL0, nor the rules for respeccing. RAW they allow a loophole to get rank 3 in a talent at LL1, so are only ever functionally relevant at LL0 and that made it seem not worth enforcing.&lt;br /&gt;
&lt;br /&gt;
== Minor ==&lt;br /&gt;
* Metahook and similar effects that mirror the duration of statuses only apply the mirrored statuses until the end of that character&#039;s next turn.&lt;br /&gt;
* Gravity Grenade counts both voluntary and involuntary movement.&lt;br /&gt;
* The timing of Ideal Image&#039;s systems check happens a lot sooner; before targets are declared.&lt;br /&gt;
* Cable Winch can be detached by a hull check instead of that weird attack thing.&lt;br /&gt;
* Blademaster&#039;s Feint makes you immune to triggering &#039;&#039;all&#039;&#039; reactions from the target until the end of your current turn.&lt;br /&gt;
&lt;br /&gt;
== Trivial ==&lt;br /&gt;
* Mirage&#039;s Dataveil can&#039;t be returned to the Mirage. The AI isn&#039;t smart enough to know when it would be a good idea to do so.&lt;br /&gt;
* Spector&#039;s Machine Pistol only grants extra movement after the attack instead of optionally before.&lt;br /&gt;
* Dimensional Emblems can only be quick-action dissipated by hostile characters.&lt;br /&gt;
* Autopod and Seismic Deluge only trigger on hostile characters.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Pixel_Art&amp;diff=114</id>
		<title>Pixel Art</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Pixel_Art&amp;diff=114"/>
		<updated>2026-07-22T16:32:14Z</updated>

		<summary type="html">&lt;p&gt;Olive: Added link to color palette for photoshop&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Portrait Slices ==&lt;br /&gt;
* Portraits are made by lining up a bunch of portraits in order, kind of like a complicated sandwich. These are called slices.&lt;br /&gt;
* Slices are just PNGs arranged in the right folder (corresponding to the Slice Type).&lt;br /&gt;
* Some slice types can accommodate front and back, but at minimum they need a base&lt;br /&gt;
** eg: in the &amp;lt;code&amp;gt;hair/&amp;lt;/code&amp;gt; folder, we can put &amp;lt;code&amp;gt;bowlcut.png&amp;lt;/code&amp;gt;. We could also put &amp;lt;code&amp;gt;bowlcut_front.png&amp;lt;/code&amp;gt; and/or &amp;lt;code&amp;gt;bowlcut_back.png&amp;lt;/code&amp;gt;&lt;br /&gt;
** but in the above example, we still need &amp;lt;code&amp;gt;bowlcut.png&amp;lt;/code&amp;gt;, even if it&#039;s a blank image&lt;br /&gt;
* all slices are 128 x 128px. You aren&#039;t guaranteed to see the top or the sides of this, depending on where the portrait is being displayed&lt;br /&gt;
* slices are displayed in the following order (subject to change)&lt;br /&gt;
&lt;br /&gt;
 clothing_outer_back&lt;br /&gt;
 accessory_jewelry_bac&lt;br /&gt;
 clothing_inner_back&lt;br /&gt;
 accessory_scarves_back&lt;br /&gt;
 accessory_hair_back&lt;br /&gt;
 hair_back&lt;br /&gt;
 body&lt;br /&gt;
 body_extra&lt;br /&gt;
 clothing_inner&lt;br /&gt;
 clothing_outer&lt;br /&gt;
 head&lt;br /&gt;
 ears&lt;br /&gt;
 eyes_back&lt;br /&gt;
 eyes&lt;br /&gt;
 eyebrows&lt;br /&gt;
 nose_back&lt;br /&gt;
 mouth_bac&lt;br /&gt;
 face_extra&lt;br /&gt;
 mouth&lt;br /&gt;
 mustache&lt;br /&gt;
 eyes_front&lt;br /&gt;
 nose&lt;br /&gt;
 accessory_jewelry&lt;br /&gt;
 accessory_other&lt;br /&gt;
 beard&lt;br /&gt;
 mouth_front&lt;br /&gt;
 accessory_scarves&lt;br /&gt;
 hair&lt;br /&gt;
 accessory_hair&lt;br /&gt;
 accessory_glasses&lt;br /&gt;
 hair_front&lt;br /&gt;
 accessory_hair_front&lt;br /&gt;
 accessory_other_front&lt;br /&gt;
 accessory_jewelry_front&lt;br /&gt;
 accessory_scarves_front&lt;br /&gt;
&lt;br /&gt;
== RGB Color System ==&lt;br /&gt;
The other main thing that define our portrait maker is that we dynamically recolor the image in a specific way. The important part to know is that you need to make your slices with very specific colors:&lt;br /&gt;
&lt;br /&gt;
* Magenta (#FF00FF) is used as a &amp;quot;mask&amp;quot;, covering up lower layers for slice types set up to do so (e.g. hats cover up hair at all pixels marked with magenta on the hat slice)&lt;br /&gt;
&lt;br /&gt;
* Red, Green, and Blue are our &amp;quot;primary&amp;quot;, &amp;quot;seconday&amp;quot;, and &amp;quot;tertiary&amp;quot; colors. The easiest way to know which color is being used is to copy another slice in the same category.&lt;br /&gt;
&lt;br /&gt;
* Specific colors map to specific indexes in our 7-color &amp;quot;color ramps&amp;quot;, that the user selects in-game. To be recolored, the pixel needs to be an &#039;&#039;&#039;exact&#039;&#039;&#039; match to one of these values.&lt;br /&gt;
&lt;br /&gt;
 Index Reds     Greens   Blues&lt;br /&gt;
    1  #ff0000  #00ff00  #0000ff&lt;br /&gt;
    2  #dd0000  #00dd00  #0000dd&lt;br /&gt;
   *3  #bb0000  #00bb00  #0000bb&lt;br /&gt;
    4  #990000  #009900  #000099&lt;br /&gt;
    5  #770000  #007700  #000077&lt;br /&gt;
    6  #550000  #005500  #000055&lt;br /&gt;
    7  #330000  #003300  #000033&lt;br /&gt;
&lt;br /&gt;
* NOTE: Artistically, we&#039;re using index 3 as the &amp;quot;base color&amp;quot; for that entire ramp (not index 4).&lt;br /&gt;
&lt;br /&gt;
=== Resources ===&lt;br /&gt;
* Photoshop color palette: [[File:Photoshop_recoloring_pallete.act]]&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=File:Photoshop_recoloring_pallete.act&amp;diff=113</id>
		<title>File:Photoshop recoloring pallete.act</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=File:Photoshop_recoloring_pallete.act&amp;diff=113"/>
		<updated>2026-07-22T16:30:58Z</updated>

		<summary type="html">&lt;p&gt;Olive: Color table for the pixels that get recolored by Lancer Tactics.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Color table for the pixels that get recolored by Lancer Tactics.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=112</id>
		<title>The Muse</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=112"/>
		<updated>2026-07-22T16:23:31Z</updated>

		<summary type="html">&lt;p&gt;Olive: /* Modding */&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;
* [[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>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Pixel_Art&amp;diff=111</id>
		<title>Pixel Art</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Pixel_Art&amp;diff=111"/>
		<updated>2026-07-22T16:22:59Z</updated>

		<summary type="html">&lt;p&gt;Olive: copied in carpenter&amp;#039;s pixel art guide from discord&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Portrait Slices ==&lt;br /&gt;
* Portraits are made by lining up a bunch of portraits in order, kind of like a complicated sandwich. These are called slices.&lt;br /&gt;
* Slices are just PNGs arranged in the right folder (corresponding to the Slice Type).&lt;br /&gt;
* Some slice types can accommodate front and back, but at minimum they need a base&lt;br /&gt;
** eg: in the &amp;lt;code&amp;gt;hair/&amp;lt;/code&amp;gt; folder, we can put &amp;lt;code&amp;gt;bowlcut.png&amp;lt;/code&amp;gt;. We could also put &amp;lt;code&amp;gt;bowlcut_front.png&amp;lt;/code&amp;gt; and/or &amp;lt;code&amp;gt;bowlcut_back.png&amp;lt;/code&amp;gt;&lt;br /&gt;
** but in the above example, we still need &amp;lt;code&amp;gt;bowlcut.png&amp;lt;/code&amp;gt;, even if it&#039;s a blank image&lt;br /&gt;
* all slices are 128 x 128px. You aren&#039;t guaranteed to see the top or the sides of this, depending on where the portrait is being displayed&lt;br /&gt;
* slices are displayed in the following order (subject to change)&lt;br /&gt;
&lt;br /&gt;
 clothing_outer_back&lt;br /&gt;
 accessory_jewelry_bac&lt;br /&gt;
 clothing_inner_back&lt;br /&gt;
 accessory_scarves_back&lt;br /&gt;
 accessory_hair_back&lt;br /&gt;
 hair_back&lt;br /&gt;
 body&lt;br /&gt;
 body_extra&lt;br /&gt;
 clothing_inner&lt;br /&gt;
 clothing_outer&lt;br /&gt;
 head&lt;br /&gt;
 ears&lt;br /&gt;
 eyes_back&lt;br /&gt;
 eyes&lt;br /&gt;
 eyebrows&lt;br /&gt;
 nose_back&lt;br /&gt;
 mouth_bac&lt;br /&gt;
 face_extra&lt;br /&gt;
 mouth&lt;br /&gt;
 mustache&lt;br /&gt;
 eyes_front&lt;br /&gt;
 nose&lt;br /&gt;
 accessory_jewelry&lt;br /&gt;
 accessory_other&lt;br /&gt;
 beard&lt;br /&gt;
 mouth_front&lt;br /&gt;
 accessory_scarves&lt;br /&gt;
 hair&lt;br /&gt;
 accessory_hair&lt;br /&gt;
 accessory_glasses&lt;br /&gt;
 hair_front&lt;br /&gt;
 accessory_hair_front&lt;br /&gt;
 accessory_other_front&lt;br /&gt;
 accessory_jewelry_front&lt;br /&gt;
 accessory_scarves_front&lt;br /&gt;
&lt;br /&gt;
== RGB Color System ==&lt;br /&gt;
The other main thing that define our portrait maker is that we dynamically recolor the image in a specific way. The important part to know is that you need to make your slices with very specific colors:&lt;br /&gt;
&lt;br /&gt;
* Magenta (#FF00FF) is used as a &amp;quot;mask&amp;quot;, covering up lower layers for slice types set up to do so (e.g. hats cover up hair at all pixels marked with magenta on the hat slice)&lt;br /&gt;
&lt;br /&gt;
* Red, Green, and Blue are our &amp;quot;primary&amp;quot;, &amp;quot;seconday&amp;quot;, and &amp;quot;tertiary&amp;quot; colors. The easiest way to know which color is being used is to copy another slice in the same category.&lt;br /&gt;
&lt;br /&gt;
* Specific colors map to specific indexes in our 7-color &amp;quot;color ramps&amp;quot;, that the user selects in-game. To be recolored, the pixel needs to be an &#039;&#039;&#039;exact&#039;&#039;&#039; match to one of these values.&lt;br /&gt;
&lt;br /&gt;
 Index Reds     Greens   Blues&lt;br /&gt;
    1  #ff0000  #00ff00  #0000ff&lt;br /&gt;
    2  #dd0000  #00dd00  #0000dd&lt;br /&gt;
   *3  #bb0000  #00bb00  #0000bb&lt;br /&gt;
    4  #990000  #009900  #000099&lt;br /&gt;
    5  #770000  #007700  #000077&lt;br /&gt;
    6  #550000  #005500  #000055&lt;br /&gt;
    7  #330000  #003300  #000033&lt;br /&gt;
&lt;br /&gt;
* NOTE: Artistically, we&#039;re using index 3 as the &amp;quot;base color&amp;quot; for that entire ramp (not index 4).&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Pixel_Art&amp;diff=104</id>
		<title>Pixel Art</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Pixel_Art&amp;diff=104"/>
		<updated>2026-07-13T22:56:40Z</updated>

		<summary type="html">&lt;p&gt;Olive: /* Portrait Slices */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Portrait Slices ==&lt;br /&gt;
* Portraits are made by lining up a bunch of portraits in order, kind of like a complicated sandwich. These are called slices.&lt;br /&gt;
* Slices are just PNGs arranged in the right folder (corresponding to the Slice Type).&lt;br /&gt;
* Some slice types can accommodate front and back, but at minimum they need a base&lt;br /&gt;
** eg: in the `hair/` folder, we can put `bowlcut.png`. We could also put `bowlcut_front.png` and/or `bowlcut_back.png`&lt;br /&gt;
** but in the above the example, we *need* `bowlcut.png`, even if it&#039;s a blank image&lt;br /&gt;
* all slices are 128 x 128px. You aren&#039;t guaranteed to see the top or the sides of this, depending on where the portrait is being displayed&lt;br /&gt;
* slices are displayed in the following order (subject to change)&lt;br /&gt;
&lt;br /&gt;
ZCAT.clothing_outer_back: 15,&lt;br /&gt;
ZCAT.accessory_jewelry_back:17,&lt;br /&gt;
ZCAT.clothing_inner_back: 20,&lt;br /&gt;
ZCAT.accessory_scarves_back: 25,&lt;br /&gt;
ZCAT.accessory_hair_back: 29,&lt;br /&gt;
ZCAT.hair_back: 30,&lt;br /&gt;
ZCAT.body: 50,&lt;br /&gt;
ZCAT.body_extra: 51,&lt;br /&gt;
ZCAT.clothing_inner: 55,&lt;br /&gt;
ZCAT.clothing_outer: 59,&lt;br /&gt;
ZCAT.head: 60,&lt;br /&gt;
ZCAT.ears: 63,&lt;br /&gt;
ZCAT.eyes_back: 65,&lt;br /&gt;
ZCAT.eyes: 66,&lt;br /&gt;
ZCAT.eyebrows: 67,&lt;br /&gt;
ZCAT.nose_back: 68,&lt;br /&gt;
ZCAT.mouth_back:69,&lt;br /&gt;
ZCAT.face_extra: 71,&lt;br /&gt;
ZCAT.mouth: 72,&lt;br /&gt;
ZCAT.mustache: 73,&lt;br /&gt;
ZCAT.eyes_front: 76,&lt;br /&gt;
ZCAT.nose: 77,&lt;br /&gt;
ZCAT.accessory_jewelry: 80,&lt;br /&gt;
ZCAT.accessory_other: 81,&lt;br /&gt;
ZCAT.beard: 86,&lt;br /&gt;
ZCAT.mouth_front: 87,&lt;br /&gt;
ZCAT.accessory_scarves: 89,&lt;br /&gt;
ZCAT.hair: 90,&lt;br /&gt;
ZCAT.accessory_hair: 91,&lt;br /&gt;
ZCAT.accessory_glasses: 92,&lt;br /&gt;
ZCAT.hair_front: 94,&lt;br /&gt;
ZCAT.accessory_hair_front: 95,&lt;br /&gt;
ZCAT.accessory_other_front: 96,&lt;br /&gt;
ZCAT.accessory_jewelry_front: 97,&lt;br /&gt;
ZCAT.accessory_scarves_front: 99,&lt;br /&gt;
&lt;br /&gt;
== RGB Color System ==&lt;br /&gt;
* The other main thing that define our portrait maker is that we dynamically recolor the image in a specific way. The important part to know is that you need to make your slices with very specific colors&lt;br /&gt;
&lt;br /&gt;
* Magenta (#FF00FF) is used as a &amp;quot;mask&amp;quot;, covering up parts of other slices, sometimes&lt;br /&gt;
&lt;br /&gt;
* Red, Green, and Blue are our &amp;quot;primary&amp;quot;, &amp;quot;seconday&amp;quot;, and &amp;quot;tertiary&amp;quot; colors. The easiest way to know which color is being used is to copy another slice in the same category.&lt;br /&gt;
&lt;br /&gt;
* Specific colors map to specific indexes in our 7-color &amp;quot;color ramps&amp;quot;, that the user selects in-game&lt;br /&gt;
&lt;br /&gt;
 Index Reds     Greens   Blues&lt;br /&gt;
    1  #ff0000  #00ff00  #0000ff&lt;br /&gt;
    2  #dd0000  #00dd00  #0000dd&lt;br /&gt;
   *3  #bb0000  #00bb00  #0000bb&lt;br /&gt;
    4  #990000  #009900  #000099&lt;br /&gt;
    5  #770000  #007700  #000077&lt;br /&gt;
    6  #550000  #005500  #000055&lt;br /&gt;
    7  #330000  #003300  #000033&lt;br /&gt;
&lt;br /&gt;
* NOTE: it&#039;s extremely important you use &#039;&#039;exactly&#039;&#039; the color above. At this point #222200 doesn&#039;t map to anything (though it may in the future &amp;quot;blend&amp;quot; the two colors together). And #210000 also doesn&#039;t map to anything&lt;br /&gt;
&lt;br /&gt;
* NOTE: Index 3 is important, because that&#039;s the &amp;quot;base color&amp;quot; for that entire ramp (not index 4). Not all of the slices currently respect this, but they will. eventually&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Pixel_Art&amp;diff=103</id>
		<title>Pixel Art</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Pixel_Art&amp;diff=103"/>
		<updated>2026-07-13T22:46:28Z</updated>

		<summary type="html">&lt;p&gt;Olive: /* RGB Color System */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Portrait Slices ==&lt;br /&gt;
- First and foremost, our portraits are made by lining up a bunch of portraits in order, kind of like a complicated sandwich. These are called **slices**&lt;br /&gt;
* Slices are just PNGs arranged in the right folder (corresponding to the **Slice Type**).&lt;br /&gt;
* Some slice types can accommodate front and back, but at minimum they need a base&lt;br /&gt;
** eg: in the `hair/` folder, we can put `bowlcut.png`. We could also put `bowlcut_front.png` and/or `bowlcut_back.png`&lt;br /&gt;
** but in the above the example, we *need* `bowlcut.png`, even if it&#039;s a blank image&lt;br /&gt;
* all slices are 128 x 128px. You aren&#039;t guaranteed to see the top or the sides of this, depending on where the portrait is being displayed&lt;br /&gt;
* slices are displayed in the following order (subject to change)&lt;br /&gt;
&lt;br /&gt;
ZCAT.clothing_outer_back: 15,&lt;br /&gt;
ZCAT.accessory_jewelry_back:17,&lt;br /&gt;
ZCAT.clothing_inner_back: 20,&lt;br /&gt;
ZCAT.accessory_scarves_back: 25,&lt;br /&gt;
ZCAT.accessory_hair_back: 29,&lt;br /&gt;
ZCAT.hair_back: 30,&lt;br /&gt;
ZCAT.body: 50,&lt;br /&gt;
ZCAT.body_extra: 51,&lt;br /&gt;
ZCAT.clothing_inner: 55,&lt;br /&gt;
ZCAT.clothing_outer: 59,&lt;br /&gt;
ZCAT.head: 60,&lt;br /&gt;
ZCAT.ears: 63,&lt;br /&gt;
ZCAT.eyes_back: 65,&lt;br /&gt;
ZCAT.eyes: 66,&lt;br /&gt;
ZCAT.eyebrows: 67,&lt;br /&gt;
ZCAT.nose_back: 68,&lt;br /&gt;
ZCAT.mouth_back:69,&lt;br /&gt;
ZCAT.face_extra: 71,&lt;br /&gt;
ZCAT.mouth: 72,&lt;br /&gt;
ZCAT.mustache: 73,&lt;br /&gt;
ZCAT.eyes_front: 76,&lt;br /&gt;
ZCAT.nose: 77,&lt;br /&gt;
ZCAT.accessory_jewelry: 80,&lt;br /&gt;
ZCAT.accessory_other: 81,&lt;br /&gt;
ZCAT.beard: 86,&lt;br /&gt;
ZCAT.mouth_front: 87,&lt;br /&gt;
ZCAT.accessory_scarves: 89,&lt;br /&gt;
ZCAT.hair: 90,&lt;br /&gt;
ZCAT.accessory_hair: 91,&lt;br /&gt;
ZCAT.accessory_glasses: 92,&lt;br /&gt;
ZCAT.hair_front: 94,&lt;br /&gt;
ZCAT.accessory_hair_front: 95,&lt;br /&gt;
ZCAT.accessory_other_front: 96,&lt;br /&gt;
ZCAT.accessory_jewelry_front: 97,&lt;br /&gt;
ZCAT.accessory_scarves_front: 99,&lt;br /&gt;
&lt;br /&gt;
== RGB Color System ==&lt;br /&gt;
* The other main thing that define our portrait maker is that we dynamically recolor the image in a specific way. The important part to know is that you need to make your slices with very specific colors&lt;br /&gt;
&lt;br /&gt;
* Magenta (#FF00FF) is used as a &amp;quot;mask&amp;quot;, covering up parts of other slices, sometimes&lt;br /&gt;
&lt;br /&gt;
* Red, Green, and Blue are our &amp;quot;primary&amp;quot;, &amp;quot;seconday&amp;quot;, and &amp;quot;tertiary&amp;quot; colors. The easiest way to know which color is being used is to copy another slice in the same category.&lt;br /&gt;
&lt;br /&gt;
* Specific colors map to specific indexes in our 7-color &amp;quot;color ramps&amp;quot;, that the user selects in-game&lt;br /&gt;
&lt;br /&gt;
 Index Reds     Greens   Blues&lt;br /&gt;
    1  #ff0000  #00ff00  #0000ff&lt;br /&gt;
    2  #dd0000  #00dd00  #0000dd&lt;br /&gt;
   *3  #bb0000  #00bb00  #0000bb&lt;br /&gt;
    4  #990000  #009900  #000099&lt;br /&gt;
    5  #770000  #007700  #000077&lt;br /&gt;
    6  #550000  #005500  #000055&lt;br /&gt;
    7  #330000  #003300  #000033&lt;br /&gt;
&lt;br /&gt;
* NOTE: it&#039;s extremely important you use &#039;&#039;exactly&#039;&#039; the color above. At this point #222200 doesn&#039;t map to anything (though it may in the future &amp;quot;blend&amp;quot; the two colors together). And #210000 also doesn&#039;t map to anything&lt;br /&gt;
&lt;br /&gt;
* NOTE: Index 3 is important, because that&#039;s the &amp;quot;base color&amp;quot; for that entire ramp (not index 4). Not all of the slices currently respect this, but they will. eventually&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Pixel_Art&amp;diff=102</id>
		<title>Pixel Art</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Pixel_Art&amp;diff=102"/>
		<updated>2026-07-13T22:44:17Z</updated>

		<summary type="html">&lt;p&gt;Olive: copied in color system&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== RGB Color System ==&lt;br /&gt;
* The other main thing that define our portrait maker is that we dynamically recolor the image in a specific way. The important part to know is that you need to make your slices with very specific colors&lt;br /&gt;
&lt;br /&gt;
* Magenta (#FF00FF) is used as a &amp;quot;mask&amp;quot;, covering up parts of other slices, sometimes&lt;br /&gt;
&lt;br /&gt;
* Red, Green, and Blue are our &amp;quot;primary&amp;quot;, &amp;quot;seconday&amp;quot;, and &amp;quot;tertiary&amp;quot; colors. The easiest way to know which color is being used is to copy another slice in the same category.&lt;br /&gt;
&lt;br /&gt;
* Specific colors map to specific indexes in our 7-color &amp;quot;color ramps&amp;quot;, that the user selects in-game&lt;br /&gt;
&lt;br /&gt;
 Index Reds     Greens   Blues&lt;br /&gt;
    1  #ff0000  #00ff00  #0000ff&lt;br /&gt;
    2  #dd0000  #00dd00  #0000dd&lt;br /&gt;
   *3  #bb0000  #00bb00  #0000bb&lt;br /&gt;
    4  #990000  #009900  #000099&lt;br /&gt;
    5  #770000  #007700  #000077&lt;br /&gt;
    6  #550000  #005500  #000055&lt;br /&gt;
    7  #330000  #003300  #000033&lt;br /&gt;
&lt;br /&gt;
* NOTE: it&#039;s extremely important you use &#039;&#039;exactly&#039;&#039; the color above. At this point #222200 doesn&#039;t map to anything (though it may in the future &amp;quot;blend&amp;quot; the two colors together). And #210000 also doesn&#039;t map to anything&lt;br /&gt;
&lt;br /&gt;
* NOTE: Index 3 is important, because that&#039;s the &amp;quot;base color&amp;quot; for that entire ramp (not index 4). Not all of the slices currently respect this, but they will. eventually&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=101</id>
		<title>The Muse</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=101"/>
		<updated>2026-07-12T01:36:22Z</updated>

		<summary type="html">&lt;p&gt;Olive: /* Editors */&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;
&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>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Combat_Editor_Cookbook&amp;diff=100</id>
		<title>Combat Editor Cookbook</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Combat_Editor_Cookbook&amp;diff=100"/>
		<updated>2026-07-12T01:34:38Z</updated>

		<summary type="html">&lt;p&gt;Olive: initial commit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here are some common patterns for triggers in the [[Combat Editor]].&lt;br /&gt;
&lt;br /&gt;
Other good ways to learn:&lt;br /&gt;
* You can inspect the triggers used for all the stock sitreps through the Edit Sitreps button at the bottom of the Triggers tab &amp;amp; adding them to your combat.&lt;br /&gt;
* You can open the Tutorial by pressing Open → Stock → tutorial in the Combat Editor. It&#039;s a good example of a fairly complex scenario choreography managed via triggers.&lt;br /&gt;
&lt;br /&gt;
== Deploy PCs at start of combat ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[ Combat start ]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Effects:&#039;&#039;&lt;br /&gt;
; Play combat intro banner&lt;br /&gt;
: (optional) Plays a UI animation announcing what, where, and who will be involved in this upcoming combat.&lt;br /&gt;
&lt;br /&gt;
; Deploy lancers&lt;br /&gt;
: Then pick the zone or zones that you want the player to be able to arrange their Lancers in.&lt;br /&gt;
&lt;br /&gt;
== Deploy the OpFor at start of round 1 ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[ Round started ]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Conditions:&#039;&#039;&lt;br /&gt;
; Round count - is - Number&lt;br /&gt;
: Check if the current round count is 1. You can omit this condition if you instead want additional reinforcements to be deployed every round; unless &amp;quot;can re-deploy units&amp;quot; is checked in the event, once all units have been deployed from the group it will stop deploying new ones.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Effects:&#039;&#039;&lt;br /&gt;
; Deploy Reinforcements&lt;br /&gt;
: Pick how many reinforcements you want. What reinforcements to spawn are indicated via &amp;lt;code&amp;gt;String: Specific Reinforcement Group&amp;lt;/code&amp;gt;, the list of which is populated in the Units tab (you&#039;ll have to make a new Group).&lt;br /&gt;
: You can also enter the magic string &amp;quot;Reserves&amp;quot; to use the OpFor defined on the Instant Action screen, if you&#039;ll be playing the combat through that.&lt;br /&gt;
: There&#039;s a good number of flags for this event. Some of the more useful ones:&lt;br /&gt;
&lt;br /&gt;
*; Extend or shrink to match sitrep&lt;br /&gt;
*: If the provided reinforcement group doesn&#039;t meet the recommended size requirement for the number of Lancers (e.g. 2 normal NPCs per PC) the group will have additional units added or be shrunk to try and match the recommended number of NPCs.&lt;br /&gt;
&lt;br /&gt;
*; Cap maximum NPC activations&lt;br /&gt;
*: If the current number of NPCs on the field already dramatically exceed the number of PCs, this will prevent additional NPCs from spawning in this round. The limits are, for PC:NPC → 1:2, 2:3, 3:5, and 4:6.&lt;br /&gt;
&lt;br /&gt;
*; Maintain minimum Opfor rating&lt;br /&gt;
*: If the PCs are wiping the floor with the Opfor and have prematurely cleared the field, this will spawn additional NPCs from the reserve group (if available) this round. The recommended ratings are, for PC:NPC and a normal NPC being worth .5 → 1:0.5, 2:1.5, 3:2.5, 4:3.5&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=99</id>
		<title>The Muse</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=99"/>
		<updated>2026-07-12T00:43:54Z</updated>

		<summary type="html">&lt;p&gt;Olive: &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;
&lt;br /&gt;
== Editors ==&lt;br /&gt;
* [[Module Editor]]&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>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=98</id>
		<title>Module Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=98"/>
		<updated>2026-07-12T00:42:37Z</updated>

		<summary type="html">&lt;p&gt;Olive: &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;
== 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;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=97</id>
		<title>Module Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=97"/>
		<updated>2026-07-12T00:41:53Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DRAFT DRAFT DRAFT&lt;br /&gt;
&lt;br /&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;
== 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;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=96</id>
		<title>Module Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=96"/>
		<updated>2026-07-12T00:41:26Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DRAFT DRAFT DRAFT&lt;br /&gt;
&lt;br /&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;
== 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;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=95</id>
		<title>Module Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=95"/>
		<updated>2026-07-12T00:38:07Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DRAFT DRAFT DRAFT&lt;br /&gt;
&lt;br /&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;
== 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;
&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;
&lt;br /&gt;
; Exposition&lt;br /&gt;
: A flexible text box, optional image media, and player choices.&lt;br /&gt;
&lt;br /&gt;
; Dialogue&lt;br /&gt;
: Runs a cutscene of characters speaking to each other, defined in the Conversation tool.&lt;br /&gt;
&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;
&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;
&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;
&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;
&lt;br /&gt;
; Diorama&lt;br /&gt;
: A miniature map, created in a feature-reduced version of the combat editor.&lt;br /&gt;
&lt;br /&gt;
; Mech&lt;br /&gt;
: The image of a mech from a module origin character or NPC.&lt;br /&gt;
&lt;br /&gt;
; Pilot&lt;br /&gt;
: The image of one of the player&#039;s character portraits.&lt;br /&gt;
&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;
&lt;br /&gt;
&lt;br /&gt;
TODO: EXAMPLE SCREENSHOT&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;
&#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;
TODO: EXAMPLE SCREENSHOT&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;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=File:ExpositionMedia.png&amp;diff=94</id>
		<title>File:ExpositionMedia.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=File:ExpositionMedia.png&amp;diff=94"/>
		<updated>2026-07-12T00:35:08Z</updated>

		<summary type="html">&lt;p&gt;Olive: Example of an Exposition Moment screen with a Diorama provided as the Handout Media.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Example of an Exposition Moment screen with a Diorama provided as the Handout Media.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=File:Custom_Module_Banner.png&amp;diff=93</id>
		<title>File:Custom Module Banner.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=File:Custom_Module_Banner.png&amp;diff=93"/>
		<updated>2026-07-12T00:34:31Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Example view of the screen where you pick what module to play, showing the description and banner.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=File:Custom_Module_Banner.png&amp;diff=92</id>
		<title>File:Custom Module Banner.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=File:Custom_Module_Banner.png&amp;diff=92"/>
		<updated>2026-07-12T00:30:27Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=91</id>
		<title>Module Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=91"/>
		<updated>2026-07-11T00:20:26Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DRAFT DRAFT DRAFT&lt;br /&gt;
&lt;br /&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 Activities. Beats are like a room and Activities are like the things you can do in that room.&lt;br /&gt;
&lt;br /&gt;
== Beats ==&lt;br /&gt;
&lt;br /&gt;
Unless an active Activity specifies otherwise, a Beat determines the current [[Module Editor#Backgrounds|background]] that underlays whatever&#039;s going on in the UI.&lt;br /&gt;
&lt;br /&gt;
Beats also determine what the player can do with the Lancers character-sheet-wise whenever another Activity 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;
== Activities ==&lt;br /&gt;
&lt;br /&gt;
The current Activity types are:&lt;br /&gt;
&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 Activity becomes active.&lt;br /&gt;
&lt;br /&gt;
; Exposition&lt;br /&gt;
: A flexible text box, optional image media, and player choices.&lt;br /&gt;
&lt;br /&gt;
; Dialogue&lt;br /&gt;
: Runs a cutscene of characters speaking to each other, defined in the Conversation tool.&lt;br /&gt;
&lt;br /&gt;
; Branch&lt;br /&gt;
: Automatically proceeds to one of two connected Activities depending on whether its condition returns true/false.&lt;br /&gt;
&lt;br /&gt;
; Signal receiver&lt;br /&gt;
: Immediately becomes the active Activity when a Trigger emits a matching module signal effect and proceeds to whatever it&#039;s connected to.&lt;br /&gt;
&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;
== Backgrounds ==&lt;br /&gt;
&lt;br /&gt;
(something to do with media types)&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Modding&amp;diff=90</id>
		<title>Modding</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Modding&amp;diff=90"/>
		<updated>2026-07-06T03:01:40Z</updated>

		<summary type="html">&lt;p&gt;Olive: use definitions instead of lists&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Get help at [https://wick.itch.io/lancer-tactics/community wick.itch.io/lancer-tactics] or [https://discord.com/invite/2t7Efg2Fbj Discord]&lt;br /&gt;
&lt;br /&gt;
== Modkit ==&lt;br /&gt;
&lt;br /&gt;
To make mods, you&#039;ll first need to get your hands on the source of the game. It’s possible to decompile any game made in Godot which is what bootleg (affectionate) modders have been doing up til now, but we’re making the source available through official channels for convenience. Lancer’s TTRPG creator ecosystem is based on a belief that it should be hackable &amp;amp; extensible, and we want to carry that culture forward.&lt;br /&gt;
&lt;br /&gt;
We (Wickworks) are talking to a lawyer to make sure we have all our hatches buttoned down legally to make sure we maintain ownership of the game code itself (and maybe like watermark some assets?), but once we get that squared away we’ll add the modkit alongside the rest of the downloads on itch. Until then, you can request early access to it on [https://discord.com/invite/2t7Efg2Fbj Lancer Tactic’s Discord server].&lt;br /&gt;
&lt;br /&gt;
Finally, before getting started with the modkit, please be sure you&#039;ve reviewed and agree to the [[Modding EULA]].&lt;br /&gt;
&lt;br /&gt;
== Background — how do Godot mods work? ==&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics is made in the [https://godotengine.org/ Godot] game engine; at time of writing on version 4.7. In order to make mods for anything besides asset packs, you&#039;ll need to become comfortable working in its editor. I hope this doesn&#039;t scare you off; of all the major game engines, it has a reputation of being easy to pick up.&lt;br /&gt;
&lt;br /&gt;
Godot projects have an internal filesystem much like the one on your computer; a series of folders and files. The root is referred to as &amp;lt;code&amp;gt;res://&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Godot_filesystem.png]]&lt;br /&gt;
&lt;br /&gt;
However, to run the game Godot needs assets (images, music, etc) to be in a different format than you’d find with them sitting in your filesystem. It compiles these files into a big pile of files that look like this, all jumbled together in one folder.&lt;br /&gt;
&lt;br /&gt;
[[File:Mod_background_imports.png|thumb|A scattering of processed image files from Godot&#039;s .import folder. ]]&lt;br /&gt;
&lt;br /&gt;
To keep knowing where things are, it maintains a skeleton of the original filesystem with all the orignal files swapped out with “.remap” placeholders that just point to where in that big pile the asset they represent went. Furthermore, whenever the game attempts to load a specific asset at a location (e.g. &amp;lt;code&amp;gt;res://assets/icons/mech.svg&amp;lt;/code&amp;gt;), it caches whatever it loaded into memory. Whenever we ask it to load that asset again, it doesn’t have to go ask the .remap file where the original one went and load it up — it just returns whatever it ended up loading from there last time. This cache is like a ghost sitting on top of a skeleton.&lt;br /&gt;
&lt;br /&gt;
For modding, this gives us an opportunity. Instead of needing to actually copy in modded files and override the originals, we can manipulate this ghost-filesystem-cache by lying about what files are at what locations. Here’s what a mod looks like for Lancer Tactics (using a modified system from Godot Mod Loader):&lt;br /&gt;
&lt;br /&gt;
[[File:ModBackgroundUnpacked.png]]&lt;br /&gt;
&lt;br /&gt;
We have a special folder where we put the actual mod files: “unpacked”, then another folder with the specific mod’s identifier “Wickworks-Sawhorse”. Within that, we have a “res” folder, and that’s where the lying starts. When loading up the mod, we can grab everything inside of the mod’s “res” and tell the ghost-cache that the mod’s files are the ones that are actually at that location. In this example, by the end of it when we ask Godot to load &amp;lt;code&amp;gt;res://assets/frames/horus/mf_sawhorse.png&amp;lt;/code&amp;gt;, it will return the file that’s actually over in &amp;lt;code&amp;gt;res://unpacked/Wickworks-Sawhorse/res/assets/frames/horus/mf_sawhorse.png&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Now that we have the power to insert files as we’d like, Godot Mod Loader additionally has some functions that through dark magic allows multiple mods to all alter the same script instead of overriding it. I’m a little fuzzy on these details, but the shape of it is that while loading each successive script that extends the same file actually extends the previous one that also extended that script so all the changes end up getting applied.&lt;br /&gt;
&lt;br /&gt;
In order to change what mods are active, the out-of-the-box Godot Mod Loader addon expects you to restart the game so it can start work with a clean slate each time. For Lancer Tactics, I modified this so it tracks all files inserted so we can go and undo all of our lies and reset the ghost-cache to files’ original locations. This was important because I’m expecting people to want to be able to make maps and modules with bundled-in mods that substantially alter the content of the game, and requiring a restart whenever you load one up would be a terrible experience.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mod Loader ==&lt;br /&gt;
Lancer Tactics is using the [https://wiki.godotmodding.com/ Godot Mod Loader addon], but has made some changes to it:&lt;br /&gt;
&lt;br /&gt;
=== Implicit Overrides ===&lt;br /&gt;
Instead of having to manually declare each asset you want to override in code (via an overwrites.gd that the Mod Tools would generate and put into an extensions/ or overwrites/ sub-directory), assets and resources are overridden implicitly by matching file paths and names from a mod&#039;s res/ directory. See [[Modding Cookbook#Replacing Resources|replacing resources]] for details. This should allow people to make texture asset pack mods fully outside the Godot editor by downloading a template, dropping images into a folder, and zipping it up.&lt;br /&gt;
&lt;br /&gt;
=== Hooks and class_name scripts ===&lt;br /&gt;
Unfortunately, it ended up not being feasible to support their script Hook system, which means it&#039;s not possible to change class_name scripts (or is unreliable to do so). Hooks were designed to work around a bug in Godot that has been unaddressed since 4.3 and do some crazy preprocessing of scripts that involves decompiling them, editing names of functions, and swapping in the copies. For the time being, we decided to instead convert the most likely targets of mods (UnitCondition, UnitTile, UnitAction, etc) into autoloads so they can be accessed by normal script Extensions instead. This will provide better backwards compatibility for mods once the bug is addressed than having to go back and tear out all the Hook code.&lt;br /&gt;
&lt;br /&gt;
TL;DR: You are NOT able to currently extend a script with a class_name. If you want to make a mod that extends a class_name script and it looks like it could be an Autoload, let me know and I&#039;ll see if I can convert it!&lt;br /&gt;
&lt;br /&gt;
The engine bug necessitating hooks: [https://github.com/godotengine/godot/issues/83542 github.com/godotengine/godot/issues/83542]&lt;br /&gt;
&lt;br /&gt;
A possible fix to the godot engine that&#039;ll solve all this: [https://github.com/godotengine/godot/pull/116556 github.com/godotengine/godot/pull/116556]&lt;br /&gt;
&lt;br /&gt;
=== Formatting and Paths ===&lt;br /&gt;
Additionally, we&#039;ve made some path and formatting tweaks for styling and ease of use:&lt;br /&gt;
&lt;br /&gt;
* We&#039;re using &amp;lt;code&amp;gt;res://unpacked/&amp;lt;/code&amp;gt; instead of &amp;lt;code&amp;gt;res://mods-unpacked/&amp;lt;/code&amp;gt; for the directory in the godot project that mods are unpacked into. I don&#039;t like hypens in filenames, it&#039;s a bit shorter, and will be sorted alphabetically to the end of the project folders. Plus mod zips will be structured like &amp;lt;code&amp;gt;unpacked/Author-ModName/manifest.json&amp;lt;/code&amp;gt; which is a bit cleaner than having an extra &amp;quot;mods-&amp;quot; at the start of it.&lt;br /&gt;
&lt;br /&gt;
* Our manifest.json doesn&#039;t have the &amp;lt;code&amp;gt;&amp;quot;extra&amp;quot;: {&amp;quot;godot: {...}}&amp;lt;/code&amp;gt; keys, opting instead to just put all that stuff at the root.&lt;br /&gt;
&lt;br /&gt;
* Mod config files are stored in &amp;lt;code&amp;gt;user://mod_configs/&amp;lt;/code&amp;gt; instead of straight &amp;lt;code&amp;gt;user://&amp;lt;/code&amp;gt; for mod-tool-plugin-save.json, mod_user_profiles.json, and mod_loader_cache.json. Keeps the user directory cleaner.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Mod Types &amp;amp; Security ==&lt;br /&gt;
&lt;br /&gt;
Mods are code that some rando wrote that the game downloads and then runs on your machine. Godot does not have built-in sandboxing for gdscript, so this code has just as much access as the game does, ie, can read or write any file on your computer and talk to the internet. Uh oh!&lt;br /&gt;
&lt;br /&gt;
To be fair, this is a issue with most mods for most games. It’s a very trust-based at-your-own-risk sort of country. This is fine if mods aren’t tightly integrated, but as soon as you as a developer start removing barriers and letting people accidentally stumble into downloading harmful code by just pressing buttons in-game, you start taking on the responsibility in the case of something bad happening.&lt;br /&gt;
&lt;br /&gt;
Slay The Spire 2, another game made in Godot, handles this by putting a big warning screen that it forces you to click through before you can start installing mods. We’ve done something similar:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;TODO INSERT IMAGE&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
To help manage this, Lancer Tactics distinguishes between three mod types:&lt;br /&gt;
&lt;br /&gt;
; Asset Pack&lt;br /&gt;
: Just images and tres files. Doesn&#039;t even have a mod_main.gd; just a json manifest and images in various places to get picked up by the appropriate resources. These can be required by combats/modules and they&#039;ll be treated as safe since not having scripts makes them risk-free. We allow tres files to be in asset packs as long as they do not contain any inline scripts.&lt;br /&gt;
: Mods that do not contain any .gd files (including mod_main.gd) will be treated as Asset Packs.&lt;br /&gt;
&lt;br /&gt;
; Content Pack&lt;br /&gt;
: Can have scripts and a mod_main.gd to do non-standard things, but are responsible for making sure anything off-standard they do is reversible without a restart. Since these allow arbitrary code execution, they will prompt additional warnings to the player before they are enabled.&lt;br /&gt;
: Mods that contain .gd files and are marked as &amp;lt;code&amp;gt;requires_restart&amp;lt;/code&amp;gt; as &amp;quot;false&amp;quot; in their manifest will be treated as Content Packs.&lt;br /&gt;
&lt;br /&gt;
; Substantial Mod&lt;br /&gt;
: As above, but the changes are not cleanly reversible so require a restart to turn off or on.&lt;br /&gt;
: Mods that contain .gd files and are marked as &amp;lt;code&amp;gt;requires_restart&amp;lt;/code&amp;gt; as &amp;quot;true&amp;quot; in their manifest will be treated as Substantial Mods.&lt;br /&gt;
&lt;br /&gt;
An area for future growth, given substantially more resources, would be to add the ability to script game content in a nice sandboxed environment by setting up an internal .lua API for new abilities to use. This would allow new mechs and whatnot to count as asset packs, but the time-benefit tradeoff isn’t favorable given our current time and labor constraints.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=89</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=89"/>
		<updated>2026-07-06T03:01:06Z</updated>

		<summary type="html">&lt;p&gt;Olive: spacing for definitions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* latin */&lt;br /&gt;
@import url(&#039;https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&amp;amp;family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&amp;amp;display=swap&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
  background: #1a212b;&lt;br /&gt;
  font-family: &#039;Open Sans&#039;, &#039;Segoe UI&#039;,&#039;Segoe UI Emoji&#039;,&#039;Segoe UI Symbol&#039;,&#039;Lato&#039;,&#039;Liberation Sans&#039;,&#039;Noto Sans&#039;,&#039;Helvetica Neue&#039;,&#039;Helvetica&#039;,sans-serif;&lt;br /&gt;
&lt;br /&gt;
  dt {&lt;br /&gt;
    font-family: &#039;Open Sans&#039;, &#039;Segoe UI&#039;,&#039;Segoe UI Emoji&#039;,&#039;Segoe UI Symbol&#039;,&#039;Lato&#039;,&#039;Liberation Sans&#039;,&#039;Noto Sans&#039;,&#039;Helvetica Neue&#039;,&#039;Helvetica&#039;,sans-serif;&lt;br /&gt;
    margin: 0 1em 4px;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  h1, h2, h3, h4, h5, h6 {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  input {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .mw-createacct-benefits-heading, .mw-number-text, .mw-number-text strong {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
    background: none !important;&lt;br /&gt;
    padding: 0 !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #simpleSearch {&lt;br /&gt;
    border: solid 1px #36455C;&lt;br /&gt;
&lt;br /&gt;
    #searchInput {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      background: #11151C;&lt;br /&gt;
      color: white;&lt;br /&gt;
      border-radius: 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #searchButton {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/search-ltr-light.svg);&lt;br /&gt;
      background-size: 20px 20px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-container {&lt;br /&gt;
    background: #1a212b;&lt;br /&gt;
    border-bottom: 4px solid #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    #p-logo-text a {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      text-transform: uppercase;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #personal h2 {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/user-light.svg);&lt;br /&gt;
      @media screen and (min-width: 850px) {&lt;br /&gt;
        background-size: 20px 20px;&lt;br /&gt;
        background-position: left 13px;&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #p-search {&lt;br /&gt;
      padding-top: 1px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #site-navigation, #site-tools, #page-tools {&lt;br /&gt;
    background: #eee !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @media screen and (max-width: 850px) {&lt;br /&gt;
    #site-navigation h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/menu-large-light.svg);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #site-tools h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/gear-large-light.svg);&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-hack {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-nav-hack {&lt;br /&gt;
    background: #eee !important;&lt;br /&gt;
&lt;br /&gt;
    .color-middle, .color-left, .color-right {&lt;br /&gt;
      background: #E5B91A;&lt;br /&gt;
      height: 4px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-content-container {&lt;br /&gt;
    background: #36455C;&lt;br /&gt;
    border-bottom: solid 4px #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    input[type=&amp;quot;button&amp;quot;], input[type=&amp;quot;submit&amp;quot;], #wpCreateaccount {&lt;br /&gt;
      background-color: #E5B91A !important;&lt;br /&gt;
      color: #11151C !important;&lt;br /&gt;
      border-color: #E5B91A !important;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:hover {&lt;br /&gt;
        color: #fff !important;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #mw-content {&lt;br /&gt;
      background: #eee !important;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-body h1.firstHeading {&lt;br /&gt;
      border-color: #52698C;&lt;br /&gt;
      padding-bottom: 6px;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-indicators {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      .mw-helplink-icon { display: none; }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .tools-inline li {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      padding-bottom: 2px;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;.selected { border-color: #52698C; }&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:not(.mw-watchlink) a {&lt;br /&gt;
        background: none;&lt;br /&gt;
        padding: 0 2px;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-editsection {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
      background: none;&lt;br /&gt;
      margin: 0;&lt;br /&gt;
&lt;br /&gt;
      a:first-of-type {&lt;br /&gt;
        padding: 0;&lt;br /&gt;
        margin: 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-footer-container {&lt;br /&gt;
    color: #8197b8;&lt;br /&gt;
&lt;br /&gt;
    a {&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #footer-poweredbyico {&lt;br /&gt;
      background: #8197b8;&lt;br /&gt;
      padding: 4px;&lt;br /&gt;
      border-radius: 5px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=88</id>
		<title>Module Editor</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=Module_Editor&amp;diff=88"/>
		<updated>2026-07-05T23:55:32Z</updated>

		<summary type="html">&lt;p&gt;Olive: Created page with &amp;quot;DRAFT DRAFT DRAFT  The &amp;lt;strong&amp;gt;Module Editor&amp;lt;/strong&amp;gt; is a tool for adding downtime scenes between combats.  == Beats &amp;amp; Notes ==  A player is always within exactly one active Beat, which itself can contain one or more Notes. Beats are like a room and Notes are like the things you can do in that room.  File:ModuleEditorBeats.png  Unless an active Note specifies otherwise, a Beat determines the current background that underlays whatever&amp;#039;s...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;DRAFT DRAFT DRAFT&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;
== Beats &amp;amp; Notes ==&lt;br /&gt;
&lt;br /&gt;
A player is always within exactly one active Beat, which itself can contain one or more Notes. Beats are like a room and Notes are like the things you can do in that room.&lt;br /&gt;
&lt;br /&gt;
[[File:ModuleEditorBeats.png]]&lt;br /&gt;
&lt;br /&gt;
Unless an active Note specifies otherwise, a Beat determines the current [[Module Editor#Backgrounds|background]] that underlays whatever&#039;s going on in the UI.&lt;br /&gt;
&lt;br /&gt;
Beats also determine what the player can do with the Lancers character-sheet-wise whenever another Note isn&#039;t currently active. The available values:&lt;br /&gt;
** &#039;&#039;&#039;Hidden:&#039;&#039;&#039; All Lancers are hidden. The player cannot open characters sheets or see who&#039;s in the current party.&lt;br /&gt;
** &#039;&#039;&#039;None:&#039;&#039;&#039; The player can inspect character sheets, but not spend repairs or otherwise modify their Lancers.&lt;br /&gt;
** &#039;&#039;&#039;Short repair:&#039;&#039;&#039; The player can spend repairs to restore Structure/Stress or destroyed systems and mechs, but not modify their current loadout.&lt;br /&gt;
** &#039;&#039;&#039;Full repair:&#039;&#039;&#039; All stats are restored to full and the player is free to modify loadouts.&lt;br /&gt;
** &#039;&#039;&#039;Level up:&#039;&#039;&#039; 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;
&lt;br /&gt;
The current Note types are:&lt;br /&gt;
&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 Note becomes active.&lt;br /&gt;
&lt;br /&gt;
; Exposition&lt;br /&gt;
: A flexible text box, optional image media, and player choices.&lt;br /&gt;
&lt;br /&gt;
; Dialogue&lt;br /&gt;
: Runs a cutscene of characters speaking to each other, defined in the Conversation tool.&lt;br /&gt;
&lt;br /&gt;
; Branch&lt;br /&gt;
: automatically proceeds to one of two connected Notes depending on whether its condition returns true/false.&lt;br /&gt;
&lt;br /&gt;
; Signal receiver&lt;br /&gt;
: Immediately becomes the active Note when a Trigger emits a matching module signal effect and proceeds to whatever it&#039;s connected to.&lt;br /&gt;
&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;
== Backgrounds ==&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=87</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=87"/>
		<updated>2026-07-05T23:55:19Z</updated>

		<summary type="html">&lt;p&gt;Olive: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* latin */&lt;br /&gt;
@import url(&#039;https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&amp;amp;family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&amp;amp;display=swap&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
  background: #1a212b;&lt;br /&gt;
  font-family: &#039;Open Sans&#039;, &#039;Segoe UI&#039;,&#039;Segoe UI Emoji&#039;,&#039;Segoe UI Symbol&#039;,&#039;Lato&#039;,&#039;Liberation Sans&#039;,&#039;Noto Sans&#039;,&#039;Helvetica Neue&#039;,&#039;Helvetica&#039;,sans-serif;&lt;br /&gt;
&lt;br /&gt;
  dt {&lt;br /&gt;
    font-family: &#039;Open Sans&#039;, &#039;Segoe UI&#039;,&#039;Segoe UI Emoji&#039;,&#039;Segoe UI Symbol&#039;,&#039;Lato&#039;,&#039;Liberation Sans&#039;,&#039;Noto Sans&#039;,&#039;Helvetica Neue&#039;,&#039;Helvetica&#039;,sans-serif;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  h1, h2, h3, h4, h5, h6 {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  input {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .mw-createacct-benefits-heading, .mw-number-text, .mw-number-text strong {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
    background: none !important;&lt;br /&gt;
    padding: 0 !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #simpleSearch {&lt;br /&gt;
    border: solid 1px #36455C;&lt;br /&gt;
&lt;br /&gt;
    #searchInput {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      background: #11151C;&lt;br /&gt;
      color: white;&lt;br /&gt;
      border-radius: 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #searchButton {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/search-ltr-light.svg);&lt;br /&gt;
      background-size: 20px 20px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-container {&lt;br /&gt;
    background: #1a212b;&lt;br /&gt;
    border-bottom: 4px solid #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    #p-logo-text a {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      text-transform: uppercase;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #personal h2 {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/user-light.svg);&lt;br /&gt;
      @media screen and (min-width: 850px) {&lt;br /&gt;
        background-size: 20px 20px;&lt;br /&gt;
        background-position: left 13px;&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #p-search {&lt;br /&gt;
      padding-top: 1px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #site-navigation, #site-tools, #page-tools {&lt;br /&gt;
    background: #eee !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @media screen and (max-width: 850px) {&lt;br /&gt;
    #site-navigation h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/menu-large-light.svg);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #site-tools h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/gear-large-light.svg);&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-hack {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-nav-hack {&lt;br /&gt;
    background: #eee !important;&lt;br /&gt;
&lt;br /&gt;
    .color-middle, .color-left, .color-right {&lt;br /&gt;
      background: #E5B91A;&lt;br /&gt;
      height: 4px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-content-container {&lt;br /&gt;
    background: #36455C;&lt;br /&gt;
    border-bottom: solid 4px #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    input[type=&amp;quot;button&amp;quot;], input[type=&amp;quot;submit&amp;quot;], #wpCreateaccount {&lt;br /&gt;
      background-color: #E5B91A !important;&lt;br /&gt;
      color: #11151C !important;&lt;br /&gt;
      border-color: #E5B91A !important;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:hover {&lt;br /&gt;
        color: #fff !important;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #mw-content {&lt;br /&gt;
      background: #eee !important;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-body h1.firstHeading {&lt;br /&gt;
      border-color: #52698C;&lt;br /&gt;
      padding-bottom: 6px;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-indicators {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      .mw-helplink-icon { display: none; }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .tools-inline li {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      padding-bottom: 2px;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;.selected { border-color: #52698C; }&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:not(.mw-watchlink) a {&lt;br /&gt;
        background: none;&lt;br /&gt;
        padding: 0 2px;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-editsection {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
      background: none;&lt;br /&gt;
      margin: 0;&lt;br /&gt;
&lt;br /&gt;
      a:first-of-type {&lt;br /&gt;
        padding: 0;&lt;br /&gt;
        margin: 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-footer-container {&lt;br /&gt;
    color: #8197b8;&lt;br /&gt;
&lt;br /&gt;
    a {&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #footer-poweredbyico {&lt;br /&gt;
      background: #8197b8;&lt;br /&gt;
      padding: 4px;&lt;br /&gt;
      border-radius: 5px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=File:ModuleEditorBeats.png&amp;diff=86</id>
		<title>File:ModuleEditorBeats.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=File:ModuleEditorBeats.png&amp;diff=86"/>
		<updated>2026-07-05T23:23:24Z</updated>

		<summary type="html">&lt;p&gt;Olive: A series of three beats connected by intervening dialogue or combat nodes.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
A series of three beats connected by intervening dialogue or combat nodes.&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=84</id>
		<title>The Muse</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=84"/>
		<updated>2026-07-05T23:09:29Z</updated>

		<summary type="html">&lt;p&gt;Olive: lancer disclaimer to bottom&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;
&lt;br /&gt;
== Combat Editor ==&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
== Module Editor ==&lt;br /&gt;
* TODO&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>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=83</id>
		<title>The Muse</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=The_Muse&amp;diff=83"/>
		<updated>2026-07-05T22:13:51Z</updated>

		<summary type="html">&lt;p&gt;Olive: seo edit trigger&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;&lt;br /&gt;
&lt;br /&gt;
Lancer Tactics is a port of the [https://massifpress.com/lancer Lancer TTRPG] by Tom Bloom and Miguel Lopez-Hall.&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;br /&gt;
&lt;br /&gt;
&#039;&#039;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.&#039;&#039;&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;
&lt;br /&gt;
== Combat Editor ==&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
== Module Editor ==&lt;br /&gt;
* TODO&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;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=82</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=82"/>
		<updated>2026-07-05T21:52:29Z</updated>

		<summary type="html">&lt;p&gt;Olive: eee background&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* latin */&lt;br /&gt;
@import url(&#039;https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&amp;amp;family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&amp;amp;display=swap&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
  background: #1a212b;&lt;br /&gt;
  font-family: &#039;Open Sans&#039;, &#039;Segoe UI&#039;,&#039;Segoe UI Emoji&#039;,&#039;Segoe UI Symbol&#039;,&#039;Lato&#039;,&#039;Liberation Sans&#039;,&#039;Noto Sans&#039;,&#039;Helvetica Neue&#039;,&#039;Helvetica&#039;,sans-serif;&lt;br /&gt;
&lt;br /&gt;
  h1, h2, h3, h4, h5, h6 {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  input {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .mw-createacct-benefits-heading, .mw-number-text, .mw-number-text strong {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
    background: none !important;&lt;br /&gt;
    padding: 0 !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #simpleSearch {&lt;br /&gt;
    border: solid 1px #36455C;&lt;br /&gt;
&lt;br /&gt;
    #searchInput {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      background: #11151C;&lt;br /&gt;
      color: white;&lt;br /&gt;
      border-radius: 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #searchButton {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/search-ltr-light.svg);&lt;br /&gt;
      background-size: 20px 20px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-container {&lt;br /&gt;
    background: #1a212b;&lt;br /&gt;
    border-bottom: 4px solid #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    #p-logo-text a {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      text-transform: uppercase;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #personal h2 {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/user-light.svg);&lt;br /&gt;
      @media screen and (min-width: 850px) {&lt;br /&gt;
        background-size: 20px 20px;&lt;br /&gt;
        background-position: left 13px;&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #p-search {&lt;br /&gt;
      padding-top: 1px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #site-navigation, #site-tools, #page-tools {&lt;br /&gt;
    background: #eee !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @media screen and (max-width: 850px) {&lt;br /&gt;
    #site-navigation h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/menu-large-light.svg);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #site-tools h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/gear-large-light.svg);&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-hack {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-nav-hack {&lt;br /&gt;
    background: #eee !important;&lt;br /&gt;
&lt;br /&gt;
    .color-middle, .color-left, .color-right {&lt;br /&gt;
      background: #E5B91A;&lt;br /&gt;
      height: 4px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-content-container {&lt;br /&gt;
    background: #36455C;&lt;br /&gt;
    border-bottom: solid 4px #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    input[type=&amp;quot;button&amp;quot;], input[type=&amp;quot;submit&amp;quot;], #wpCreateaccount {&lt;br /&gt;
      background-color: #E5B91A !important;&lt;br /&gt;
      color: #11151C !important;&lt;br /&gt;
      border-color: #E5B91A !important;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:hover {&lt;br /&gt;
        color: #fff !important;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #mw-content {&lt;br /&gt;
      background: #eee !important;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-body h1.firstHeading {&lt;br /&gt;
      border-color: #52698C;&lt;br /&gt;
      padding-bottom: 6px;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-indicators {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      .mw-helplink-icon { display: none; }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .tools-inline li {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      padding-bottom: 2px;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;.selected { border-color: #52698C; }&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:not(.mw-watchlink) a {&lt;br /&gt;
        background: none;&lt;br /&gt;
        padding: 0 2px;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-editsection {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
      background: none;&lt;br /&gt;
      margin: 0;&lt;br /&gt;
&lt;br /&gt;
      a:first-of-type {&lt;br /&gt;
        padding: 0;&lt;br /&gt;
        margin: 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-footer-container {&lt;br /&gt;
    color: #8197b8;&lt;br /&gt;
&lt;br /&gt;
    a {&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #footer-poweredbyico {&lt;br /&gt;
      background: #8197b8;&lt;br /&gt;
      padding: 4px;&lt;br /&gt;
      border-radius: 5px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=80</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=80"/>
		<updated>2026-07-05T20:52:50Z</updated>

		<summary type="html">&lt;p&gt;Olive: padding&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* latin */&lt;br /&gt;
@import url(&#039;https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&amp;amp;family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&amp;amp;display=swap&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
  background: #1a212b;&lt;br /&gt;
  font-family: &#039;Open Sans&#039;, &#039;Segoe UI&#039;,&#039;Segoe UI Emoji&#039;,&#039;Segoe UI Symbol&#039;,&#039;Lato&#039;,&#039;Liberation Sans&#039;,&#039;Noto Sans&#039;,&#039;Helvetica Neue&#039;,&#039;Helvetica&#039;,sans-serif;&lt;br /&gt;
&lt;br /&gt;
  h1, h2, h3, h4, h5, h6 {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  input {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .mw-createacct-benefits-heading, .mw-number-text, .mw-number-text strong {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
    background: none !important;&lt;br /&gt;
    padding: 0 !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #simpleSearch {&lt;br /&gt;
    border: solid 1px #36455C;&lt;br /&gt;
&lt;br /&gt;
    #searchInput {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      background: #11151C;&lt;br /&gt;
      color: white;&lt;br /&gt;
      border-radius: 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #searchButton {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/search-ltr-light.svg);&lt;br /&gt;
      background-size: 20px 20px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-container {&lt;br /&gt;
    background: #1a212b;&lt;br /&gt;
    border-bottom: 4px solid #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    #p-logo-text a {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      text-transform: uppercase;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #personal h2 {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/user-light.svg);&lt;br /&gt;
      @media screen and (min-width: 850px) {&lt;br /&gt;
        background-size: 20px 20px;&lt;br /&gt;
        background-position: left 13px;&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #p-search {&lt;br /&gt;
      padding-top: 1px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @media screen and (max-width: 850px) {&lt;br /&gt;
    #site-navigation h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/menu-large-light.svg);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #site-tools h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/gear-large-light.svg);&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-hack {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-nav-hack {&lt;br /&gt;
    .color-middle, .color-left, .color-right {&lt;br /&gt;
      background: #E5B91A;&lt;br /&gt;
      height: 4px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-content-container {&lt;br /&gt;
    background: #36455C;&lt;br /&gt;
    border-bottom: solid 4px #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    input[type=&amp;quot;button&amp;quot;], input[type=&amp;quot;submit&amp;quot;], #wpCreateaccount {&lt;br /&gt;
      background-color: #E5B91A !important;&lt;br /&gt;
      color: #11151C !important;&lt;br /&gt;
      border-color: #E5B91A !important;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:hover {&lt;br /&gt;
        color: #fff !important;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-body h1.firstHeading {&lt;br /&gt;
      border-color: #52698C;&lt;br /&gt;
      padding-bottom: 6px;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-indicators {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      .mw-helplink-icon { display: none; }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .tools-inline li {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      padding-bottom: 2px;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;.selected { border-color: #52698C; }&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:not(.mw-watchlink) a {&lt;br /&gt;
        background: none;&lt;br /&gt;
        padding: 0 2px;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-editsection {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
      background: none;&lt;br /&gt;
      margin: 0;&lt;br /&gt;
&lt;br /&gt;
      a:first-of-type {&lt;br /&gt;
        padding: 0;&lt;br /&gt;
        margin: 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-footer-container {&lt;br /&gt;
    color: #8197b8;&lt;br /&gt;
&lt;br /&gt;
    a {&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #footer-poweredbyico {&lt;br /&gt;
      background: #8197b8;&lt;br /&gt;
      padding: 4px;&lt;br /&gt;
      border-radius: 5px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=79</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=79"/>
		<updated>2026-07-05T20:51:58Z</updated>

		<summary type="html">&lt;p&gt;Olive: !important&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* latin */&lt;br /&gt;
@import url(&#039;https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&amp;amp;family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&amp;amp;display=swap&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
  background: #1a212b;&lt;br /&gt;
  font-family: &#039;Open Sans&#039;, &#039;Segoe UI&#039;,&#039;Segoe UI Emoji&#039;,&#039;Segoe UI Symbol&#039;,&#039;Lato&#039;,&#039;Liberation Sans&#039;,&#039;Noto Sans&#039;,&#039;Helvetica Neue&#039;,&#039;Helvetica&#039;,sans-serif;&lt;br /&gt;
&lt;br /&gt;
  h1, h2, h3, h4, h5, h6 {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  input {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .mw-createacct-benefits-heading, .mw-number-text, .mw-number-text strong {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
    background: none !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #simpleSearch {&lt;br /&gt;
    border: solid 1px #36455C;&lt;br /&gt;
&lt;br /&gt;
    #searchInput {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      background: #11151C;&lt;br /&gt;
      color: white;&lt;br /&gt;
      border-radius: 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #searchButton {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/search-ltr-light.svg);&lt;br /&gt;
      background-size: 20px 20px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-container {&lt;br /&gt;
    background: #1a212b;&lt;br /&gt;
    border-bottom: 4px solid #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    #p-logo-text a {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      text-transform: uppercase;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #personal h2 {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/user-light.svg);&lt;br /&gt;
      @media screen and (min-width: 850px) {&lt;br /&gt;
        background-size: 20px 20px;&lt;br /&gt;
        background-position: left 13px;&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #p-search {&lt;br /&gt;
      padding-top: 1px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @media screen and (max-width: 850px) {&lt;br /&gt;
    #site-navigation h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/menu-large-light.svg);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #site-tools h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/gear-large-light.svg);&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-hack {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-nav-hack {&lt;br /&gt;
    .color-middle, .color-left, .color-right {&lt;br /&gt;
      background: #E5B91A;&lt;br /&gt;
      height: 4px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-content-container {&lt;br /&gt;
    background: #36455C;&lt;br /&gt;
    border-bottom: solid 4px #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    input[type=&amp;quot;button&amp;quot;], input[type=&amp;quot;submit&amp;quot;], #wpCreateaccount {&lt;br /&gt;
      background-color: #E5B91A !important;&lt;br /&gt;
      color: #11151C !important;&lt;br /&gt;
      border-color: #E5B91A !important;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:hover {&lt;br /&gt;
        color: #fff !important;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-body h1.firstHeading {&lt;br /&gt;
      border-color: #52698C;&lt;br /&gt;
      padding-bottom: 6px;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-indicators {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      .mw-helplink-icon { display: none; }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .tools-inline li {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      padding-bottom: 2px;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;.selected { border-color: #52698C; }&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:not(.mw-watchlink) a {&lt;br /&gt;
        background: none;&lt;br /&gt;
        padding: 0 2px;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-editsection {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
      background: none;&lt;br /&gt;
      margin: 0;&lt;br /&gt;
&lt;br /&gt;
      a:first-of-type {&lt;br /&gt;
        padding: 0;&lt;br /&gt;
        margin: 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-footer-container {&lt;br /&gt;
    color: #8197b8;&lt;br /&gt;
&lt;br /&gt;
    a {&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #footer-poweredbyico {&lt;br /&gt;
      background: #8197b8;&lt;br /&gt;
      padding: 4px;&lt;br /&gt;
      border-radius: 5px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=78</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=78"/>
		<updated>2026-07-05T20:51:29Z</updated>

		<summary type="html">&lt;p&gt;Olive: no icons&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* latin */&lt;br /&gt;
@import url(&#039;https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&amp;amp;family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&amp;amp;display=swap&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
  background: #1a212b;&lt;br /&gt;
  font-family: &#039;Open Sans&#039;, &#039;Segoe UI&#039;,&#039;Segoe UI Emoji&#039;,&#039;Segoe UI Symbol&#039;,&#039;Lato&#039;,&#039;Liberation Sans&#039;,&#039;Noto Sans&#039;,&#039;Helvetica Neue&#039;,&#039;Helvetica&#039;,sans-serif;&lt;br /&gt;
&lt;br /&gt;
  h1, h2, h3, h4, h5, h6 {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  input {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .mw-createacct-benefits-heading, .mw-number-text, .mw-number-text strong {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
    background: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #simpleSearch {&lt;br /&gt;
    border: solid 1px #36455C;&lt;br /&gt;
&lt;br /&gt;
    #searchInput {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      background: #11151C;&lt;br /&gt;
      color: white;&lt;br /&gt;
      border-radius: 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #searchButton {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/search-ltr-light.svg);&lt;br /&gt;
      background-size: 20px 20px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-container {&lt;br /&gt;
    background: #1a212b;&lt;br /&gt;
    border-bottom: 4px solid #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    #p-logo-text a {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      text-transform: uppercase;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #personal h2 {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/user-light.svg);&lt;br /&gt;
      @media screen and (min-width: 850px) {&lt;br /&gt;
        background-size: 20px 20px;&lt;br /&gt;
        background-position: left 13px;&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #p-search {&lt;br /&gt;
      padding-top: 1px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @media screen and (max-width: 850px) {&lt;br /&gt;
    #site-navigation h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/menu-large-light.svg);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #site-tools h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/gear-large-light.svg);&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-hack {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-nav-hack {&lt;br /&gt;
    .color-middle, .color-left, .color-right {&lt;br /&gt;
      background: #E5B91A;&lt;br /&gt;
      height: 4px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-content-container {&lt;br /&gt;
    background: #36455C;&lt;br /&gt;
    border-bottom: solid 4px #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    input[type=&amp;quot;button&amp;quot;], input[type=&amp;quot;submit&amp;quot;], #wpCreateaccount {&lt;br /&gt;
      background-color: #E5B91A !important;&lt;br /&gt;
      color: #11151C !important;&lt;br /&gt;
      border-color: #E5B91A !important;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:hover {&lt;br /&gt;
        color: #fff !important;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-body h1.firstHeading {&lt;br /&gt;
      border-color: #52698C;&lt;br /&gt;
      padding-bottom: 6px;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-indicators {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      .mw-helplink-icon { display: none; }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .tools-inline li {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      padding-bottom: 2px;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;.selected { border-color: #52698C; }&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:not(.mw-watchlink) a {&lt;br /&gt;
        background: none;&lt;br /&gt;
        padding: 0 2px;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-editsection {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
      background: none;&lt;br /&gt;
      margin: 0;&lt;br /&gt;
&lt;br /&gt;
      a:first-of-type {&lt;br /&gt;
        padding: 0;&lt;br /&gt;
        margin: 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-footer-container {&lt;br /&gt;
    color: #8197b8;&lt;br /&gt;
&lt;br /&gt;
    a {&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #footer-poweredbyico {&lt;br /&gt;
      background: #8197b8;&lt;br /&gt;
      padding: 4px;&lt;br /&gt;
      border-radius: 5px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
	<entry>
		<id>https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=77</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.lancertactics.com/index.php?title=MediaWiki:Common.css&amp;diff=77"/>
		<updated>2026-07-05T20:50:23Z</updated>

		<summary type="html">&lt;p&gt;Olive: font&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* CSS placed here will be applied to all skins */&lt;br /&gt;
&lt;br /&gt;
/* latin */&lt;br /&gt;
@import url(&#039;https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300..800;1,300..800&amp;amp;family=Space+Mono:ital,wght@0,400;0,700;1,400;1,700&amp;amp;display=swap&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
body {&lt;br /&gt;
  background: #1a212b;&lt;br /&gt;
  font-family: &#039;Open Sans&#039;, &#039;Segoe UI&#039;,&#039;Segoe UI Emoji&#039;,&#039;Segoe UI Symbol&#039;,&#039;Lato&#039;,&#039;Liberation Sans&#039;,&#039;Noto Sans&#039;,&#039;Helvetica Neue&#039;,&#039;Helvetica&#039;,sans-serif;&lt;br /&gt;
&lt;br /&gt;
  h1, h2, h3, h4, h5, h6 {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  .mw-createacct-benefits-heading, .mw-number-text, .mw-number-text strong {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  input {&lt;br /&gt;
    font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #simpleSearch {&lt;br /&gt;
    border: solid 1px #36455C;&lt;br /&gt;
&lt;br /&gt;
    #searchInput {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      background: #11151C;&lt;br /&gt;
      color: white;&lt;br /&gt;
      border-radius: 0;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #searchButton {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/search-ltr-light.svg);&lt;br /&gt;
      background-size: 20px 20px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-container {&lt;br /&gt;
    background: #1a212b;&lt;br /&gt;
    border-bottom: 4px solid #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    #p-logo-text a {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      text-transform: uppercase;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #personal h2 {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace;&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/user-light.svg);&lt;br /&gt;
      @media screen and (min-width: 850px) {&lt;br /&gt;
        background-size: 20px 20px;&lt;br /&gt;
        background-position: left 13px;&lt;br /&gt;
      } &lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #p-search {&lt;br /&gt;
      padding-top: 1px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  @media screen and (max-width: 850px) {&lt;br /&gt;
    #site-navigation h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/menu-large-light.svg);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #site-tools h2 {&lt;br /&gt;
      background-image: url(/skins/Timeless/resources/images/gear-large-light.svg);&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;::after {&lt;br /&gt;
        background-image: url(/skins/Timeless/resources/images/arrow-down-light.svg);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-hack {&lt;br /&gt;
    display: none;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-header-nav-hack {&lt;br /&gt;
    .color-middle, .color-left, .color-right {&lt;br /&gt;
      background: #E5B91A;&lt;br /&gt;
      height: 4px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-content-container {&lt;br /&gt;
    background: #36455C;&lt;br /&gt;
    border-bottom: solid 4px #E5B91A;&lt;br /&gt;
&lt;br /&gt;
    input[type=&amp;quot;button&amp;quot;], input[type=&amp;quot;submit&amp;quot;], #wpCreateaccount {&lt;br /&gt;
      background-color: #E5B91A !important;&lt;br /&gt;
      color: #11151C !important;&lt;br /&gt;
      border-color: #E5B91A !important;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:hover {&lt;br /&gt;
        color: #fff !important;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-body h1.firstHeading {&lt;br /&gt;
      border-color: #52698C;&lt;br /&gt;
      padding-bottom: 6px;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-indicators {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      .mw-helplink-icon { display: none; }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .tools-inline li {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;,monospace !important;&lt;br /&gt;
      padding-bottom: 2px;&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;.selected { border-color: #52698C; }&lt;br /&gt;
&lt;br /&gt;
      &amp;amp;:not(.mw-watchlink) a {&lt;br /&gt;
        background: none;&lt;br /&gt;
        padding: 0 2px;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .mw-editsection {&lt;br /&gt;
      font-family: &#039;Space Mono&#039;, monospace !important;&lt;br /&gt;
      background: none;&lt;br /&gt;
      margin: 0;&lt;br /&gt;
&lt;br /&gt;
      a:first-of-type {&lt;br /&gt;
        padding: 0;&lt;br /&gt;
        margin: 0;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  #mw-footer-container {&lt;br /&gt;
    color: #8197b8;&lt;br /&gt;
&lt;br /&gt;
    a {&lt;br /&gt;
      color: #8197b8;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #footer-poweredbyico {&lt;br /&gt;
      background: #8197b8;&lt;br /&gt;
      padding: 4px;&lt;br /&gt;
      border-radius: 5px;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Olive</name></author>
	</entry>
</feed>