Modkit & Bugfixing

Modkit

The release two months ago added official mod support. Since then, 36 mods have been uploaded, adding many of the 1st party supplemental frames and talents, totally new homebrew mechs, new assets, and rules tweaks. I’ve been astonished at how fast modders have been getting these out.

Until now, to get the modkit you had to ask for access to a locked channel on the Discord. I wanted to get it into folks’ hands as fast as possible but also protect ourselves, so that was the easiest way to do both. Now that we’ve had some time to batten down our hatches with a lawyer-approved EULA and do some light source & asset watermarking, we’re now able to offer the full source of Lancer Tactics in a modkit alongside the game on itch.io.

Bugfixing Programming role

At time of writing, Trello backlog for Lancer Tactics is currently sitting at 207 bug tickets and 202 UI improvement tickets. That’s a lot! Most of the last two updates have been almost entirely consisted of bugfixes!

As such, we’re looking for a GDscript programmer to join the team as a part-time contractor to help stay on top of these and work through the backlog. If you or someone you know is fluent in Godot, comfortable wading into an in-progress project, and experienced with QA processes we want to hear from you! You can find the full job posting here.

Zooming out a bit: I think the reason that we’re seeing this many bugs is because we opened up such a huge surface area by offering in-game editors, and it’s only expanded with the addition of modding. The number of straight Lancer-mechanics bugs we’re seeing is a relatively small porportion overall. There are SO many edge cases that we’d never hit if we were only authoring content ourselves through Godot. Additionally, I have hella automated tests that simulate and run through a lot of in-game mechanical situations to make sure they continue working, but it’s a lot harder to write these sorts of tests for user UI like the editor.

Having a map editor is a core part of LT’s appeal so it’s here to stay, but there’s a lesson to be learned here about how deceptively much that is to bite off to chew. I’m not sure what I would change if I was starting over… perhaps spend even more time standardizing my UI toolbox and establishing a shared pipeline that all data changes went through using that toolbox.

Changelog (1.3.3)

Character sheet / roster

  • fix NHP dossier not being editable
  • Added ability to set any mech stat to an arbitrary value in the character sheet
  • add structure/stress readouts to NPC character sheets (so they can be overridden)
  • added a level-up wizard to the character sheet that shows on level-up beats

alt text

  • highlight areas of the character sheet that have unallocated choices

alt text

  • bracing mounts don’t count as “unallocated” in terms of being warned
  • add “unallocated” and “level up!” messages to the character sheet buttons in-module when that’s true (still feels like a very placeholder design)

alt text

  • fix “hologram color” showing up for non-hologram portraits in the slice type list

Modules

  • Critical fix: add .dialogue as valid asset file for module uploads. If you uploaded a module that had dialogue, you’ll definitely need to re-upload it using this build! It’s missing for all players who downloaded the module. Sorry about that!
  • Automatically applies any pending levelups before launching module combats (in case the player didn’t do it themselves)
  • Fixed Lancers who melted down disappearing from the list of current PCs during repairs
  • losing or repairing personalizations correctly removes or adds max HP
  • dioramas start looking at camera-start zones correctly
  • Fix being able to allocate a reserve to a chosen lancer + losing that reserve if a lancer tries to transfer it to themselves.

Mechanics

  • EXPERIMENT: All weapons can attack setpiece obstructions. It may not work for some weapons with custom target requirements. Depending on how positive/problematic this change ends up being, it may be dropped in the future OR expanded to being able to target totally empty tiles.
  • can lock onto neutral characters
  • PCP repulse works on allied units with Heavy Frame
  • aegis shield generator requires a reaction to use and deactivates on owner death
  • Caltrop markers now deploy to every tile indicated (instead of a single central point that projects a blast-1 aura), so has correct behavior when bisected by a hardlight shield
  • Fixed Aegis Defense Net’s difficulty buff not being removed when an npc exited the shield
  • Fix Ultra’s orbital eye getting stuck trying to be used over and over when there are no valid targets
  • Demolisher shock armor now only resists weapons (not ram/improvised attack)

UI / FX

  • move tooltips to the topmost layer so they’re actually visible in the options screen
  • Indicate when an ability applies a buff that persists past the owner’s death, or has “until end of X” timing.

alt text

  • LT list item button size back to 32x32
  • correctly reset portrait textures on mod reloading
  • Don’t show “exit” on resolution banner for instant action campaigns (so it saves your progress by default)
  • Confirm exit at end of a battle; any unsaved data is lost, so warn about that
  • alt frames now appear in the catalog rings

alt text

  • fix speech bubbles only growing in size downwards
  • event text popcorn (such as when searching a zone) now correctly uses the zone’s translated name
  • Add “it costs 0 SP to equip” to technophile talent descriptions to prompt that they need equipping
  • Disable the launch-modules screen when there’s no modules available
  • correctly hide telegraphed buff UI after you dismiss it
  • fix windmill rotating on the wrong axis
  • fix generic text banner text wrapping the whole thing offscreen
  • fix: Cannot Edit NPC Roster
  • Token standees are only shown for the base unit in a stackup (you’re welcome Taraxacum mod)

Misc

  • NHP lines no longer always override pilot ones when the pilot baseline temperament is set to UNKNOWN
  • Tutorial now actually renames “actual goblin” to “jackal” when she says that she’ll do that
  • Add user setting to allow toggling background loading and multithreading (may fix some niche issues)
  • “mount up” pilot action now automatically sets the faction of the mounted mech to match the pilot’s
  • Fix re-using old downloads for maps and modules (so you don’t have to go delete the cached download to re-enable it)
  • Fix typo crash on changing summary/icon/desc during uploading to the omninet
  • fix “Clicking on unit without pilot can cause crash”
  • Fix bark crash when passed in an off-map unit
  • fix missing capacitor discharge fxg for cataphract causing crash

Editor

  • Can move / mirror beats and moments en masse
  • fix rearranging origin characters causing narrative npcs to be deleted
  • setting heat via trigger correctly updates danger zone status
  • fix: autoplay checkbox not always visible on autoplayable moments
  • fix: speaker id box deselects itself
  • fix “insert” mode for blocks adding multiple layers in a single operation
  • update all trigger group listings when any trigger is modified (so they correctly show having/not having an error)
  • trigger groups start with warnings instead of only showing them after a change
  • can no longer delete or duplicate the narrator speaker
  • deleting a zone in the editor removes its pointer label
  • fix crash on rotate-transforming map with units on it
  • Added editable “author” text entry to modules and combats
  • can toggle dioramas locked to max zoom in diorama settings
  • Some module editor styling: combat nodes are green, smaller media previews
  • fix flex seats causing the module editor to fill up the lancer squad with as many units as it could

Events & triggers

  • fix dynamically-set zone labels not surviving save/load
  • Update recon objective text to say that the PCs need to be inside the final zone
  • Fix LOS and Sensors options for Unit Tiles fetcher always returning no tiles
  • fix “is alive and on map” fetcher always returning true
  • add “no fx” flag to teleport event
  • Added “play ambience” event. Music and ambience names have human-friendly translations
  • Fixed slowdown when large numbers of event blocks (like 60+) are all queued up at once
  • Per-round and per-turn limits correctly reset for zone and weather actions on new turns/rounds. (fixing “Is Resuable” flag not working for zone actions)
  • Add flag to skip combat resolution banner

Modding & implementation nodes

  • Large refactor of how token assets are collected and stored. Frames no longer handle it themselves; there’s now a TokenBase class that collects them up and serve as shareable resources for TokenCores (prev. TokenCustomization) to point at. This had no direct effect on outside system, except for enabling the next bullet point.
  • Mech sprites can now specify a “ui_center” position that will be the center focus whenever that mech is drawn in the UI. Barbarossa faces are now in frame! Yay!
  • Mech frames can also specify a default ui_center for all their tokens; all the human tokens’ focus is down low.
  • add an overridable can_target_self func for actions
  • additional event flags moved to EventService
  • Check/save contexts now have access to all statuses they’re saving against, not just the Prone special case. Fixed a number of missing cases where Stable Structure should have applied.
  • Condense AiActionOption and UnitTargetingPick down into one shared class: TargetingPick. Left temporary depreciation shunts behind to help with backwards compat.
  • Removed all instances of await within things that are passed to a worker thread to help with certain multithreading issues.
  • Require context.unit (and target_units) to be on-map by default; needs to be toggled off by the event in question (“I can handle off-map units”)
  • Actions have a “requires LOS” bool so can be toggled in data instead of only by script
  • Move TargetActionUtil to an autoload
  • TokenCore has a “is_hologram” property
Editor features for days