Editor features for days

This month has been mostly focusing on getting through Campaign 1, which has forced me to fix a lot of issues with the editors. (along with adding some long-awaited features) (didn’t get to the auto-ramp painter yet tho. Hopefully next time!) Since we’re not ready to share Campaign 1 yet, this changelog isn’t going to have any big headliners unless you’re the in the slice of editor freaks who have had their fingers all up in the editors and/or modding guts of the engine.

We also have a healthy bug backlog to still get to. If you’ve submitted something but don’t see it listed here, thank you for your patience & we’ll get to it when we can!

Changelog (1.2.2)

Character sheet / roster

  • When you level up or down a character, it saves that character’s previous loadout at the old level. When you return to that level, the saved loadout will automatically be restored. There is a button to clear the saved loadout and match the LL below it. This should make it so you don’t have to make many versions of a pilot at various LLs.
  • Unlocking an NPC character sheet allows you to remove any baseline class or template trait, or add literally any kit in the game (wow)
  • Add text search to pilot roster
  • can delete custom NPCs via the roster
  • randomize kits go last in the pick list
  • Removed the barricade sprite as an alt token for the Support, oops
  • Fix dossier not being available for NPCs
  • correct color channel names for mech tokens vs pilots
  • hide add-systems button when out of SP and have no 0-cost systems
  • fix not being able to delete pilots from the roster
  • fix dossier background darkening effect not covering up entire character sheet on larger screens

Misc

  • Increased maximum lancer party size to 6. Instant action defaults to 4 but it can be changed in the combat modifiers. I personally it’s a terrible idea to start trying to play with more than 4 lancers, but we’ll be asked about it until the end of time if it’s not an option. Could have left this as the domain for modders, but setting it up as moddable was the same as basically implementing it so may as well.
  • Fixed the issue where new saves were not saving the combat path & were not able to be loaded. The game now saves correctly, and attempt to repair old ones with available data in instant action.

Mechanics

  • when moving as a katamari, give a bit more leeway in elevation changes. this might let you move somebody further up a ramp than you really should, but also you’re less likely to lose them on a little bump
  • Jericho cover is correctly classified as a deployable; should stop being such an attack magnet
  • Can pick tech-attack-granting systems as targets for system destruction
  • Fearless defender can’t trigger for self
  • Storm of violence melee half can be triggered by basic attacks
  • skyhammer salvo only telegraphs when it’s about to do damage or if the target isn’t already locked on
  • napoleon can brace even when shredded
  • fix sekhmet not being able to use its free action to attack with the same weapon twice
  • Tell the AI’s pathfinders about tiles they’d like to avoid and calculate best-paths as if those tiles cost more, so they should be less likely to walk into dangerous terrain and hostile effects.
  • Fix extra “unit stepped” triggers due to erroneous gain/lose flying detection when moving through a zero-g map
  • Fix manticore charged exeskeleton not triggering if its CP’s charge die has already been ticked up that turn
  • Hard cover is now sufficient for any unit to hide, not just size-half mechs.

UI / FX

  • Retry combat correctly restores starting module and lancer states
  • implemented an update unit chit and action bar design from alicia

alt text

  • fixed the last-picked sitrep not being preserved when returning to the instant action screen
  • Add scrollbar for title screen to prevent 4x UI softlocks
  • added alias for cheat max in the console: cheat high
  • add console commands to set/check clocks
  • Added secret alt+enter for fullscreen hotkey
  • improved the fxgs for lasers (they weren’t reaching all the way & had lackluster hit particles)
  • Don’t show the objective panel when there are no visible objectives
  • launch unit entry falls back to mech names instead of immediately UNKNOWN
  • Instant action max NPC activation cap modifier increased from 4 to 8 for a madlad on the discord
  • fixed a number of typos in tutorial and ability text
  • Loading screen now blocks mouse to prevent double-clicking transition buttons
  • fix terrain readout staying visible after clicking a unit
  • fix shadow discs not showing up under units
  • Pilots use their tokens correctly when shown in downtime dioramas. Unmodified tokens fall back to using the portrait’s colors.
  • Show zone actions disabled when they’re only unavailable due to action cost
  • zone name labels no longer show up on top of rest of interface
  • Fetch updated filename for user pilots/npcs at save time instead of determining it when the sheet opens (callsign might change). Strip out special characters from the potential filename so they don’t get mysteriously deleted.
  • Glossing system fails more gracefully when given an unknown kit ID
  • fix clocks all always showing the number of the ticks
  • fix control & recon zones all getting the same name
  • fix: Scrollbar on frame’s flavor description covers up text
  • Save instant action labels with the campaign title “Instant Action” instead of “campaign_instant_action”
  • Catalog ring uses vertical kit tooltip component instead of plaintext.

Editor

  • Soft-launched a wiki for the editor: https://wiki.lancertactics.com/
  • Fix combats leading to other moments getting victory/defeat paths switched around
  • Moved inputs for moments and beats in the module editor off the nodes themselves and into the sidebar. More screen efficient and makes it easier to see what’s going on on the actual graph.
  • Add ability to switch between graph edit pages in the module editor & mirror nodes between them
  • can flip and rotate maps

alt text

  • Added new smoke cloud setpiece.
  • Added new “breakable interior” setpiece that acts like an out-of-bounds tile but can be destroyed by select wall-busting weapons and abilitiies

alt text

  • can copy/paste trigger effects and conditions, and triggers flash when changed
  • Added a “difficulty” tool in the module editor where you can define different difficulty levels and pick which one you want when launching a module.
  • Add a text search to the block/setpiece/doodad tool
  • fix doodad variation not doing anything
  • Added a new “comment”-style moment for notating module graphs
  • sort combats in module tool by ID
  • fix filling in lancers at the appropriate seat when playtesting a module
  • moment text, choices, and clocks can insert player names with the {p0.callsign} format
  • Better interface for setting up objectives for a combat — can set if they start hidden, etc. Show or hide them through the new objectives event, mentioned below.
  • Can set the faction of narrative NPCs with mechs in the module editor
  • Add checkbox for combats to allow them to keep generating rounds and playing even without PCs on the field.
  • Can share pilot outfit colors throughout an opfor, and pilot/mech colors through a reinforcement group in the editor
  • don’t lose custom color scheme information on changing unit factions
  • Duplicate and clear all tiles buttons for zones
  • zones have brush sizes and shapes
  • duplicate button for narrative NPCs and origin characters
  • narrative NPC id length increased to 12, as claimed in the description
  • Fix camera getting locked to zoom if you exit a beat and then go to the editor.
  • fixed reserves not being able to grant frames
  • shared reserves can now grant gear and frames
  • Added text field for modules to describe how long they are. (e.g. “3 missions spanning LL0-3”)
  • Added play/stop preview buttons for the “play music” event.
  • add bbcode hints to formatting tooltips
  • fix weather not deserializing to combats correctly after re-entering the combat editor
  • Checkboxes for modules that lock origin character builds and/or names+portraits. Leveling up a locked origin character will have it automatically follow the level-up path you define for it.

Dialogues

  • Added “Condition” dialogue block that only plays its children lines if the condition passes. “Choice” lines can have a condition associated with them to only be available if that condition passes. Checkbox for the whole conversation for whether to hide or just disable unavailable choices.
  • Added comment blocks
  • Added syntax highlighting for the conversation raw-script editor

alt text

  • Broke speaker tool into its own sub-tab. Added conversation groups into the dialogue tool for organization.

alt text

  • Conversations can have human-readable labels. Asks for an ID on conversation creation instead of having it be an open text field.
  • export and import conversation buttons now preserves the speakers and metadata
  • fix chorusing not working if it happens right as a character enters
  • Add hurt animation cue for dialogue
  • Better filling out of pilot callsign text with last name or mech fallbacks, so {p0.callsign} will never return an empty string.
  • New cues for locking and unlocking the camera for purposes of camera jumping to the speaker (so there can be dialogue while looking somewhere on the map without the camera moving back to the speaker)
  • Fixed adding a Context fetcher as an option for Speakers
  • Fix handling swapping out speakers when more than 5 characters get added to a conversation.
  • fix speech panel position sometimes being way up at the top of the screen
  • Added a radio wave fx for speaking mechs
  • Hologram-style speakers blip/flash into conversations instead of fading in
  • add safeties to fix soft lock that happens if a player mechanical decision comes up in the middle of a dialogue (due to a trigger signal that could do anything)

Events & triggers

  • [BREAKING CHANGE] “Add lancer” now takes “object” instead of “resource”. Added ability to stash units in module/combat state and feed it into event_module_lancer_add to add dynamic units to the team. Old triggers will not work until they’re updated.
  • [DEPRICATION] New batch of objective events that can pull from the starting objectives instead of referencing by index. Depreciated the old objective event; it should still work but won’t show up as an option in the list.
  • [DEPRICATION] Replace event_zone_launch with event_unit_deploy_team which can have the player deploy arbitrary units instead of just Lancers.
  • New event that can set the objective pointer text on a unit (e.g. the “Objective” text over a payload)
  • New “Unit flies” event that flies them to a spot instead of walking or teleporting
  • New “Abort” event that cancels its trigger; used to prevent self-destructs, friendly fire, etc
  • New “damage multiple units” event helper that can do damage to a list of units all in one go.
  • Add event to set the LL of a lancer, and added getting the current LL and NPC tier to the unit state int fetcher.
  • A number of fixes for “within/contains”: strings checks in both directions, asking if a unit is in an array of unit cores now works.
  • New fetcher types: general multi-unit collection, angle between two groups of tiles, gets all units on a particular faction’s side
  • add NHP to unit boolean fetcher, made it available in the module editor
  • Added a fetcher to check if an attack hit/misses/crits
  • “Attach units” event can attach multiple target units at the same time
  • spawning event has flag to suppress barks
  • Faction unit count fetcher can get current activations/structure/stress
  • New flag on event_unit_spawn that randomly assigns a generic mook portrait for NPCs on spawn. Zone Reinforce event gets it automatically.
  • NPC mechs don’t automatically play their name text on deploy
  • event_dialogue_face takes target_units instead of only a single one
  • when event_map_effect is given both a unit and tiles, the FXG will target the given tiles from the unit
  • add “due to stress” flag for event_unit_cool for modders to hook into
  • Flag for map effect to ignore setpiece height. Depricated boolean for map effect event (use flags instead)
  • add flag to skip logging for actions
  • PRE sitrep trigger events can opt into being queued instead of executing immediately (so you can trigger off of a unit dying before they die, but only execute afterwards)
  • Sitrep triggers can set their queue priority
  • Display a warning when an effect block is missing a selected event

Crash fixes

  • Fix crash on extracting mid-move
  • Temporarily disabled text-to-speech until this godot bug is resolved.
  • fix crash on collateral damage triggering
  • fix crash on loading reinforcement groups in editor
  • Use Gavstar’s solution for fixing a crash on jumping to the catalog ring when there are multiple rings

Modding & implementation nodes

  • [IMPORTANT] Units are no longer Nodes! They’re now resources! This has been a structural problem for years, and I finally spent a few hours seeing if I could get them out of the node tree. Very surprisingly, it wasn’t hard. If you were referecing unit.position or passing a unit into an FXG directly, you’ll now need to look at its token instead… but that should be the extent of direct changes due to this update.
  • However, this also means that we can create Units dynamically without worrying about queue_freeing them, which means we can create them dynamically in the Trigger/Context system. Long story short: I have dropped FetchUtil.TYPE.UNIT_CORE from existance — all triggers should now be able to deal with Units directly instead of having to worry if it’s a Unit or UnitCore.
  • This also means that I was able to re-enable safe mode for multithreading. On the off chance you were using X.start_worker_thread and accessing the scene tree, that will no longer work.
  • Dropped support for FmodEmitter3D. FXGs should now use the SfxEmitter node (to make it easier in the future to swap out our audio solution, if we need to drop or change the FMOD plugin)
  • Did a major refactor for how dialogue files are saved for combats & modules. Instant-action Combats still save them internally so they can stay as a single JSON to be passed around, but modules are allowed to save their .dialogue files externally for ease of manual access and ability to merge changes in git.
  • Moved “Finished loading initial content” signal on global instead of contentlibrary so mods can hook into it
  • Refactored how choice_bus handles requests. Instead of having a single list and asking each request how it should behave, it maintains separate lists of different types of requests. This should prevent the reoccuring issue where a variant-action request gets prematurely aborted due to something happening deeper into the event stack.
  • Setpieces and doodads have hard link references to FXEs instead of soft ones.
  • add reference to self in event_gear_activate’s virtual event for reactions (request by Gavstar)
  • pass through the “is_knockback” flag to event_unit_move for caliban rxns (request by Gavstar)
  • rename rest_type.long -> full
  • Explicitly refer to in-script static functions for a number of autoloads services (to prevent the weird thing where overloading doesn’t work for them). I didn’t get to all the services, but all the ones folks flagged as problematic (e.g. UnitPrinter)
  • Fix mod tool inability to create new asset packs
  • fix PassiveStatIncrease frame traits not working for limited bonuses
  • Moved AiNpc and AiActionDecider to autoload for extension access. The bulk of AiBehavior’s functions were moved into AiActionDecider.
  • Moved a handful of LoadoutCore functions to UnitPrinter and MountCore funcs into MountType for the same reason.
  • Converted action metatags to stringnames. If you’re using any metatags, you’ll have to update your resources.
Mod suppport!!