Skip to content

Fix/builder priority constructor energy budget - #1

Draft
Rysicaa wants to merge 161 commits into
fix/builder-priority-stall-budgetfrom
fix/builder-priority-constructor-energy-budget
Draft

Rysicaa wants to merge 161 commits into
fix/builder-priority-stall-budgetfrom
fix/builder-priority-constructor-energy-budget

Conversation

@Rysicaa

@Rysicaa Rysicaa commented Sep 1, 2026

Copy link
Copy Markdown
Owner

Work done

Test steps

  • Write the steps needed to test out the changes. Include the expected result.

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown

Integration Test Results

15 tests   7 ✅  4s ⏱️
 1 suites  8 💤
 1 files    0 ❌

Results for commit c16256c.

♻️ This comment has been updated with latest results.

Ruwetuin and others added 29 commits September 1, 2026 15:10
…d-all-reason#9019)

Gadgets that gated behavior on hardcoded unit names now auto-detect
units via unitdef customparams (or derive from def properties), so new
units pick up behaviors without gadget edits. Along the way this
surfaced and fixed several long-standing bugs, some gameplay-affecting.

### Auto-stamped in alldefs_post.lua (mirroring isscavenger):
israptor — all raptor* defs (name prefix is airtight; subfolder is
unreliable, e.g. raptor_antinuke carries a copy-pasted one)
iscritter — all critter_* defs

### Behavior flags on unit defs:
- reaimtime / reaim_spam — continuous-aim reaim frames (~124 defs),
replaces the largest name table
- tombstone = "<featuredef>" — commander tombstones (38 defs)
- quickstart_discountable — quick-start factory discount (18 T1/hover
factories; techlevel can't derive this, hovercraft are 1.5)
- hasdeathanimation, stompable, paralyzetime_uncapped, islrpc,
isnanoturret, canwearcosmetics, spawnpad_unit, areaattack_unlimited,
stealths_passengers, allow_set_target, guards_own_builder,
mine_resistant, stealths_transport, attached_con_turret(+_noselect,
_mex), juno_kill, juno_deny
- holidayhatcount — derived from holiday_models.lua (model + hat count
now live in one entry)
- weapondef land_damage_mult — torpedo damage reduction vs land targets
(8 weapons)

Reused existing params instead of names: mine (Juno, commando mines),
paratrooper (unload momentum, fall damage), iscommander (xmas wrecks),
airfactory (air plants), isscavenger/israptor (cus_gl4 shader bins).

awards gadget: The eco-kill award set is derived from properties
(immobile + wind/tidal/solar/energyMake/converter params, excluding
israptor/paratrooper)

### Gameplay-affecting fixes
- unit_no_land_damage was a complete no-op (name-keyed table checked
with numeric weapon IDs). Fixed: torpedo aircraft now actually deal 20%
damage to land targets — extended to all torpedo aircraft (armlance,
armseap, corseap, cortitan, legatorpbomber, legsptorpgunship, armtdrone,
cortdrone). Needs balance review.
- Juno never affected scav units — the _scav propagation loop had
reversed string.find arguments (dead code). Scav sensors/mines/mists are
now Juno-able; cormine4 and all Legion sensors are covered under
junorework.
- unit_stack_hack_fix was a complete no-op (string.find(ud.id, ...) on a
number). Fixed, plus a latent remove-during-iteration crash —
nano-turret anti-stacking now actually works.
- T3 Annihilator/Doomsday hitboxes were corrupted: unanchored substring
propagation in collisionvolumes.lua clobbered their per-piece volumes
with armanni/cordoom whole-unit boxes every armored toggle.
- Eco Killer award ignored all Legion economy (and geothermals); also
fixed an iterate-while-inserting-UB loop and unanchored name matches.
- LRPC notification false positive: "corint" also matched corintr
(amphib transport); leglrpc and legelrpcmech were missing entirely.
armbotrail now included.
- 4 aircraft plants missing the Fly/Land toggle
(armhaapuw/corhaap/corhaapuw/leghaap); armhaap was missing from both the
list and the param.
- unit_nanoradarpos was broken — passed a unitDefID where a unitID
belongs; radar-wobble removal now works. Legion nanos are now also
transport-exploit-protected in scav/ruins/zombie games (the old
modoption gate didn't match when legnanotc actually exists).
- Commando mine friendly-fire immunity was dead code (pinned to
cormine4, which cormando can't build) — now works for any commando-built
mine; paradrop unload-momentum exception now covers all paratrooper
units (lootboxes, scav beacons).
- Xmas wrecks: ~30 commander wreck types (evocom levels, arm/cor
evocoms, Legion T2 coms) were never swapped; now derived from
iscommander + corpse. Scav April Fools units also stop showing all
baked-in hats simultaneously.
- legaheattank had two conflicting reaim entries (3 shadowing 4 from
beyond-all-reason#8820) — resolved to 3 (live behavior)

### Other
- Juno's denial radius is published as GameRulesParam
juno_area_denial_radius (+ juno_mini_area_denial_radius);
gui_attack_aoe.lua reads it instead of a duplicated 450 constant.
- Two widgets migrated in lockstep with unit_areaattack_limiter
(cmd_exclude_walls_area_attacks, cmd_bomber_attack_building_ground —
shared command-handoff protocol); map_grass_gl4 adopted isnanoturret.
- Fixed unit_hats indexing hats by unitID instead of unitDefID
(hat-on-hat guard never worked), removed the dead raptor_hive disjunct
in cus_gl4 and the dead raptor shield-color branch (no raptor def has a
shield), dropped nonexistent legsco/legtriariusdrone entries, removed
five insert-during-pairs UB loops.
- collisionvolumes.lua: propagation is now exact _scav-only; the
accidental substring inheritances are preserved as explicit aliases
(corgolt4, corhalab, leggatet3, leginfestor, legsrailt4; seal renamed to
corseal) — worth reviewing whether they're wanted.
# Terraform Brush v1.12 changelog
### New

- The Dimensions window's HEIGHT BOUNDS became HEIGHT RANGE, with two
modes. RESCALE remaps the whole relief onto a new min/max, so lowering
the max compresses the terrain instead of shearing the mountain tops
off; CLAMP keeps the old cut behavior for shaving a runaway peak. Both
act on the whole map, are undoable like any brush stroke, and the
sliders seed from the live extremes with CURRENT and RESET (the map's
own range) refills.
- WATER LEVEL is now a slider with a WYSIWYG shoreline preview: dragging
draws the resulting coastline in the world at that height, APPLY slides
the terrain so the water lands exactly on the previewed line, and RESET
returns the map to its own level. The Water window carries a mirrored
FLUID LEVEL track, kept in lockstep.
- The brush cursor no longer dies at the map border. Every editor brush
(terraform, splat, diffuse, grass, metal, features) follows the mouse
past the edge through a shared resolver and fades out with distance, so
terrain and paint right against the border are comfortable to work. The
feature placer drops off-map placements per symmetry copy instead of
clamping them, which used to pile features up along the edge line.
- SMUDGE: a third MODIFY submode that drags terrain along the stroke,
GIMP's smudge for the heightfield. A height grab is carried with the
cursor and folded into the ground as it moves, so relief smears along
the drag and tapers off; intensity sets how long the tail survives. L
cycles SMOOTH, LEVEL and SMUDGE.
- AUTORAMP: a third RAMP type. Click an existing cliff and it is rebuilt
at a chosen angle with wavy lips, ridged erosion gullies and a scree fan
at the base. Cliff start anchors the face (Extend keeps the top lip,
Subtract keeps the bottom one, Average pivots on the mid line), and a
WYSIWYG hover preview shows the exact resulting terrain as a translucent
fill/cut mesh before the click - the preview and the apply run the same
seeded math. R toggles RAMP and AUTORAMP.
- SURFACE grew from two paintable variant slots to seven: slots 1-3 in
the first mask, 4-7 in a second one. The DETAIL SLOT 3 metal-suite
toggle this branch briefly carried is gone again; slot 3 is a regular
slot and the metal spots always keep their material.
- DISPLAY, INSTRUMENTS and FILTERS are now canonical sections shared by
the SURFACE and LAYERS submodes. The soft submode gains smart filters
(avoid water, avoid cliffs, alt min/max), LAYERS gets a Layer Map
overlay chip, and grid snap, protractor, measure, symmetry and the
height colormap all work with the SURFACE brush.
- Sneak Peek: while it is on, holding Ctrl renders the selected layer
inside the brush ring as if the stroke had landed, in both submodes, so
where a texture's fixed features fall can be judged before committing.
It re-arms on every entry into the tool.
- The Tileset window's EXTRA LAYER (slot 4) has its own section with a
mode switch, and its texture choice is a tile grid with real albedo
thumbnails instead of a prev/next name stepper. The first tile restores
the biome's own pick, so the material follows biome swaps again.
- The Tileset window gains a WATER section: walkable depth, shallows
tint, clarity, curve, hue, saturation and power, and a deep-floor glow,
driving the tileset shader's terrain-based water shading.
- Feature Placer scale variation groundwork: Scale Min / Max sliders
roll a per-feature scale at placement time, realized by snapping to
pre-baked model variants since the engine exposes no feature-scale API.
No variant sets ship yet, so the sliders are inert for now; the fir
variants and the tree clump work are shelved on a separate branch. With
clustered distribution the roll correlates size with distance to the
cluster core.
- Map projects round-trip the full Tileset configuration through a new
`tileset.lua` section: biome, metal-spot style, glow lights, the EXTRA
LAYER material and every tuning knob survive save and open. All SURFACE
slots persist too, with a second mask saved whenever slots 4-7 carry
paint.
- Map projects record the skybox picked at runtime in the ENVIRONMENT
panel instead of the one the canvas booted with, env configs carry the
skybox path, and a project reopens with its sky even if the skybox panel
was never opened that session.

### Improvements

- The smooth brush computes a true dense box mean (summed-area table)
instead of a sparse 9-tap blur. The sparse taps were blind to ripples
whose wavelength matched their spacing, so grid-aligned stripes survived
every smoothing pass while everything else flattened.
- The SURFACE slot rail is thumbnail-first tiles: the texture takes the
tile, PICK opens the library for that slot, X clears it, and clicking a
tile only arms the brush. Selecting used to also open the library, which
threw the whole catalog on screen every time the brush changed.
- The SURFACE texture picker gained a large hover preview big enough to
judge a material by; the coverage meter is retired, since an artist
reads the ground rather than a histogram.
- The SURFACE brush modes (DOT, WASH, FILL, ERASE) are proper icon
buttons matching the terrain modes.
- The MODIFY MODE row got real icons too, including a hand-drawn SMUDGE
glyph, at the same visual weight as the tool set. Panel icons are
authored with their brightness in the RGB channels now, since RmlUi
clamps mid-to-high alpha to fully opaque and alpha-authored softness
rendered as solid white.
- The Dimensions height extremes readouts poll while the window is open;
the refresh button is gone.
- The metal brush's Metal Value slider stays usable in remove submode,
since the erase rate scales with it.

### Fixes

- Skybox and texture thumbnails no longer hang over the world after the
panel closes. The GL overdraw passes kept rendering against stale layout
boxes; they now bail when the panel is disengaged or hidden.
- The metal brush's remove submode always erases, regardless of which
mouse button started the drag.
- An environment config saved while the engine reported no sun position
no longer blacks out the map it is later applied to: a degenerate sun
direction is neither serialized nor applied.
- The ENV sun sliders reseed after a project load applies an
environment, instead of writing their stale attach-time values back
through the engine on the next nudge.
- Fast brush drags no longer leave gaps between stamps: the stroke
interpolator used to widen its stamp spacing past the brush radius on
quick flicks (visible as evenly spaced terrain ribs with SMUDGE), and
now lags the cursor at proper overlap instead, catching up over the
following ticks.
- Slider restamps no longer fight the thumb mid-drag (the erode repose
marble used to stick while the track still worked).
- The Feature Placer no longer crashes the engine on model-less feature
defs such as the geo vent crack.



## AI/LLM usage statement
Written and implemented with Claude Code under my direction and testing
each step manually.
### Work done

Removes five unreferenced `local function` definitions from
`gui_pip.lua`, along with the declarations and multiple-return tails
only they used.

Four have live, named replacements from the pip's own rewrites; the
fifth was never called.

This PR has no functional impact.

Found by repeatedly running luacheck with `unused = true`.

Dead code cleanup PR 5 of 8.

#### Notable exceptions

- `GL4FlushCommandLines` and `RenderPipContents` are also unreferenced
and are deliberately left alone. The first claims a caller it has never
had, and the second is described as live by three comments while being
the only caller of `BlitMapRuler`. I will follow up on those separately
to figure out what needs to be done.
- `positionCmds` is left in place even though this change makes it
unused. It encoded a filter that the replacement path does not carry but
could use again.

### AI / LLM usage statement

Claude Opus 5 authored 95% of code, 100% of commit message, 80% of PR
description. It ran the analysis and investigation and performed the
edits. It presented me with an explanation for the history of each of
the dead functions, two of which I decided to keep as described above. I
have reviewed this PR, understand the changes, and endorse it.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
### Work done

Removes 65 unreferenced `local function` definitions across 37 files,
along with their doc comments and 12 declarations that share a diff hunk
with them.

Found by repeatedly running luacheck with `unused = true`.

Three more are commented out rather than deleted, for preservation
reasons. I expect some reviewer will ask to keep some others as well.

Each removal was traced through the file's history to the commit that
introduced the function and then forward to the commit that took its
last call away.

This change should have no functional impact.

Dead code removal PR 4 of 8.

#### Notable exceptions

- `luarules/gadgets.lua` is left alone. Its `SAFEWRAP` machinery is
dead, but it is dead in the engine's `LuaGadgets/gadgets.lua` that we
forked it from, and has been since 2007. I am raising that upstream;
removing our copy first would only widen the fork.

### AI / LLM usage statement

Claude Opus 5 authored 90% of code, 100% of commit message, 60% of PR
description. It ran the analysis and investigation and performed the
initial round of edits. I made modifications and asked it to make
others. I have reviewed this PR, understand the code, and endorse it.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ond-all-reason#9028)

Work done

Since now spawn at GamePreload (since beyond-all-reason#8842).
The team resource setup runs at GameStart to account for commanders
adding storage, and it resets every team's storage, including Gaia. That
wipes Gaia's storage from all the ruins, and every storage ruin that
later dies additionally substracts it. Gaia's storage goes negative and
defensive ruins are no longer able to attack.

Fix: the GameStart reset skips Gaia. Gaia has no commander, so the reset
has no purpose for it, and it keeps the storage its ruins provide. The
initial setup at load is unchanged.

Reported by Cookiebee, cause identified by Damgam.

Test steps
- [x] Spectate a Ruins game (Very dense makes it obvious) and watch
Gaia's resources in the player list
- [x] Destroy or capture a few storage or generator ruins
- [x] Gaia's storage stays positive and energy-firing ruin defences keep
returning fire (on master the bar goes negative and they stop)

Before:
<img width="642" height="364" alt="negative storage"
src="https://github.com/user-attachments/assets/18e3849c-416b-4407-9e3c-be2aaed6ae1a"
/>

After:
<img width="773" height="517" alt="Ruins have storage"
src="https://github.com/user-attachments/assets/29b3cbce-8635-4607-9459-020474a72e0a"
/>

AI usage statement:
Used Claude Fable to help write the optimal fix
…d-all-reason#9020)

Close chat input before running slash commands so cancelChatInput no
longer tears down text ownership after commands like /widgetselector
claim it.

Currently we tear down the Chat input after every command. Some commands
(like /widgetselector) use chat for the filter. This breaks text input
for /widgetselector (when invoked via /widgetselector, f11 goes through
a different code path)

This fix tears down chat before the command executes so any commands
that open a chat don't have it automatically closed.

Tested:
confirmed that /widgetselector now allows you to filter. Confirmed via
inspection that other code paths still close chat.


Cursor used for understanding code, wrote, tested manually.

Co-authored-by: Rysica <rysica@noreply.github.com>
### Work done

Types the six unit tables in `api_resource_spot_builder`, naming the
record its mex and geo constructor registries share, so `cmd_area_mex`'s
`constructorIds` parameter can say what it takes instead of `table`.

Typing the three def-keyed lookup tables surfaces eleven latent
warnings, none introduced here: two on dead code to be eliminated in
another PR, and the rest where a unit def ID used as a key is typed
`number` or is an unguarded `Spring.GetUnitDefID` result. Four are
cleared by beyond-all-reason#9003 / beyond-all-reason#9008.

Annotations only, no runtime changes.

### AI / LLM usage statement:

Claude Opus 5 authored 90% of code, 100% of commit message, 50% of PR
description. I have reviewed the annotation changes, understand them,
and endorse them.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
<!--
PR Template! Please make sure to give your PR a relevant title so a
squash merge remains descriptive
If any commented sections are not relevant to this PR, remove them.
Please fill out the uncommented sections with any relevant information.
-->

### Work done
Light from shots and explosions is drawn as a volume. For every pixel
inside the volume the shader checks whether it is occluded, and that
check costs 16 samples from the depth buffer. The result is then
multiplied by the light strength at that point, which is often zero, and
everything the check computed goes in the bin. In my measurements that
zero happens a lot: shots in flight above the ground, flak and air
explosions, surfaces past the light radius, and the outer 1.1x shell
every volume is drawn with.

This patch checks the light strength first and skips it when it is zero.
The check is per quad rather than per pixel because the quadGather after
the march needs all four lanes to have run it.

Measured on a late-game 8v8 replay, 1300-1800 units, 3440x1888. 116 fps
became 124 fps median over nine interleaved runs. The widget went from
1.14 ms to 0.74 ms of an 8.8 ms frame.

Pixel diff on a paused frame from six camera angles shows no difference
beyond what two runs of unmodified master differ by on their own.

<!-- If relevant
#### Addresses Issue(s)
- Issue URL
-->

<!-- If relevant
#### Setup
Describe any setup requirements to test this work (Specific settings,
widgets, etc))
-->

#### Test steps
- [ ] Watch a replay with heavy fighting, artillery and flak. Lighting
on the ground, on unit hulls and around explosions looks the same as
before.
- [ ] Look at the edge of a light pool on flat ground while a unit is
firing. The falloff is smooth, no step or ring.
- [ ] Put a unit right at the edge of an explosion light. Its shadowing
does not pop.
- [ ] Check Screen Space Shadows on low, medium and high, Same as before
everywhere.

<!-- If relevant
### Screenshots:
If you're making visible changes, add before/after screenshots or videos
of the major
changes so it's easier for reviewers to see what is different in this PR

#### BEFORE:
(screenshot from master)

#### AFTER:
(screenshot from branch)
-->

<!-- If relevant
### AI / LLM usage statement:
Tell us if you used an AI or LLM in the creation of this code, which AI
tool was used, and to what extent.
-->
…all-reason#9030)

Work done

Ruins exist before start positions are chosen (since beyond-all-reason#8842).

The start footing check (isFootingUntraversable) used TestMoveOrder with its default object test, so any spot occupied by a ruin was rejected.

Fix: the placement check now ignores units when deciding if a spot is valid, since any ruin there is cleared when the commander spawns. Everything else is checked as before.
…emove type warnings (beyond-all-reason#9046)

Clamps `delta_ceiling` at zero in `emmylua_compare.py`, so a change that shrinks the files it touches no longer loses type-warning allowance for doing so.
…ason#8826)

Snap pending deaths to the closest matching unitDef instead of exact position hashes so resurrected units (including commanders) retain veterancy.
New Track: Alien Scouts
Updated Track: Extermination Order
…son#9001)

This alias is handled by beyond-all-reason/RecoilEngine#3231 which has been merged and will make it into recoil-lua-library on the next update there and here.
…eyond-all-reason#9003)

beyond-all-reason/RecoilEngine#3231 will appear in our `recoil-lua-library` soon and the type check failure on this PR will clear. This PR uses the new aliases where appropriate.
…9045)

- disable depth testing before drawing the waypoint drag indicator
- keep the dragged waypoint line visible instead of letting terrain occlude parts of it
The synced Builder Priority gadget throttles low-priority builders by setting build speed to 0 when the team can't afford them. The stall budget math had a bug, which has been fixed.
Change all of the anti air strings to be Anti-Air, this keeps it more consistent, and is the generally preferred spelling
Draws no-rush zones from the actual startbox polygon instead of its bounding box. Also deletes the much older Start Polygons widget.
### Work done

Add `types/ObjectOrPosition.lua`, naming the two "a simulation object or a point in the world" unions that were already in use under three different spellings in multiple files.

Eliminate `---@alias ObjectID` which collides with beyond-all-reason/RecoilEngine#3231 and was also misleading.
Use ePull minus converter draw instead of theoretical high-prio builder cost, and add back passive cons' current draw to avoid double-counting.
Ruwetuin and others added 30 commits September 13, 2026 02:54
<!--
PR Template! Please make sure to give your PR a relevant title so a
squash merge remains descriptive
If any commented sections are not relevant to this PR, remove them.
Please fill out the uncommented sections with any relevant information.
-->

### Work done
Removed godmode exploit.
A widget with this line can enable godmode in multiplayer.
`Spring.SendLuaRulesMsg("$dev$:godmode:1")`

<!-- If relevant
#### Addresses Issue(s)
- Issue URL
-->

<!-- If relevant
#### Setup
Describe any setup requirements to test this work (Specific settings,
widgets, etc))
-->

#### Test steps
- [x] Verified exploit in multiplayer.
- [ ] Test exploit before and after.

<!-- If relevant
### Screenshots:
If you're making visible changes, add before/after screenshots or videos
of the major
changes so it's easier for reviewers to see what is different in this PR

#### BEFORE:
(screenshot from master)

#### AFTER:
(screenshot from branch)
-->


### AI / LLM usage statement:
No AI was used.
… to clipboard buttons, track all changes that deviate from the defaults, added tooltips to actions (beyond-all-reason#9242)
…9244)

Puts the space meta key back on the shipped keymaps, which is what the
factory queue presets on meta+0-9 have been missing since profiles
replaced the preset files. Follows up on beyond-all-reason#8153.

The old preset files never mentioned fakemeta, so the tempting fix is to
go back to emitting nothing and let the engine's default stand. That
doesn't hold up any more: loading a keymap leaves the meta key alone, so
saying nothing now means inheriting whatever the last profile set rather
than getting the engine's back, and there's no Lua getter to read it
with. Naming it in the profile is what keeps a keymap a whole snapshot.

Existing players need a hand, though: every uikeys.txt written so far
says "fakemeta none", so without the store version bump they would all
quietly fork a "Grid (2)" holding the broken value and never see the
fix. The rewrite runs after the usual hand-edit check, so anything
someone actually changed is still kept.

Not touching the editor's refusal to capture a bare modifier, so space
still can't be bound on its own; same gap as ctrl and alt, and it wants
fixing all together.

AI disclosure: written with assistance from Claude Code.
Removes the yardmap key from the 16 mobile defs that carry one.
Texture mode has changed:
 - Atlas is supported
 - Up to 8 different effects on the atlas 
 - Red channel control opacity (as before)
 - Green channel controls strength of perlin distortion effect 

Three new parameters have been added to airjet effects
- jetType [integer 0-7], choose which jet from the atlas to use
- xzVelSizeMult, default 0, controls how much XZ velocity effects jet
length (can only increase it)
- yVelSizeMult: default 1.0, controls how much Y velocity effect jet
length (can reduce it)

AI used: Qwen3.8-27b for concepting
Note the configs in
```lua
local printfPass = "forward" -- Chose which pass to print debug information for. Can be any of "forward", "shadow", "deferred", "reflection"
local printfMaterial = "unit"
```
Ruins no longer spawn units that have been blocked. This does not provide them any replacements; any likely substitute unitdefs are likely to be, themselves, blocked. Restoring some ruin density is up to the choice of lobby settings, for now.
…ll-reason#9249)

Resolves a keyload of one of the deleted luaui/configs/hotkeys bind
files to what that file used to bind, so migrating a player's own
uikeys.txt no longer drops it. The four preset paths already resolve by
name to the profile that replaced them, but the fragments those presets
pulled in - the chat and UI keys, the grid menu, the number row - name
no profile, and a uikeys.txt built by copying a preset carries exactly
those three keyload lines.

Their contents go in a new file under common/configs rather than
restoring the four .txt files. Restoring them is the smaller change and
needs no code, but it leaves files sitting at a path nothing selects any
more, and the next cleanup deletes them and quietly reopens this.

The new spec migrates a uikeys.txt holding those three keyloads plus one
bind of the player's own: 1 binding on master, 192 with this.

AI disclosure: written with assistance from Claude Code.
Legion mex now has same yardmap as arm/cor mex.
T2 sub has the mini-torpedo effect for its 3 round burst. 
Alaris shotgun given groundbounce to prevent dps loss from shots hitting the ground in front of its target.
Prometheus weapon sound effect corrected.
…c. (beyond-all-reason#9128)

- Give the Perdition a fixed range while maintaining the interesting rigging of its unit model. It ignores gravity, has a fixed range ring, and is still very neat. The fact it is a Cannon type underneath does not have meaning to players.
- Disables flying drones in any modes that disable air units, instead of relying on the manual `_noair_` tag.
- Reworks Legion unit lights, which are generally dim but tend to be larger than the unit's hull. This washes out the entire unit in a bath of gloried light, which looks awful. Fixed.
- Defense range ring corrections for Legion units.
- Drone weapons use the drones' engagement range as their "attack" range.
- Some missing references for build pics and wrecks. The Seaplane Lab needs a new wreck, still.
- Added heat distortion to Legion units (jammers, heat exhausts, etc).
…ond-all-reason#8047)

Adds `factory_preset_toggle` action.

If that action is used, then preset load actions only fire and consume the keypress while the preset panel is open. In practice this means that a preset load which was triggered by `space+1` before, now only triggers on `space, space+1` (the first space is to open the preset panel, the second to load a preset).
Inelegant method of solution for separating the quota-mode and command-mode control planes for factory queues.
…reason#9201)

Dragging a waypoint currently replaces its command with a `CMD.INSERT` payload whose command options are hardcoded to zero, losing the original modifiers.

Preserve `options.coded` in the inserted command for both point and area waypoints. This also preserves modifiers when Alt-dragging to copy a waypoint. Remove the obsolete commented-out insertion calls.
…eyond-all-reason#9262)

Gives exact version pinning for each step in the validation and CI testing pipeline.

Describes our type checks and the warning-ratcheting approach taken in the warning budget for CI.

Adds .github/spec-instructions.md for what a spec has to be, what it must not do, and how much of it to write. These are early days and I don't like some of what's in there but it is better than what we are being given now.
…eyond-all-reason#8846)

Fixes beyond-all-reason#8845

Swaps the mex+turret units that combine to make the completed Fortifier.

The mex is now carried, hidden, and invulnerable. Its collision volume is tiny, and previously this caused units to have to approach closely to the unit to target or attack it. This is fixed. Areas of effect now collide with the unit at its edges.

The turret is now the transport, so no longer is blocked from being targeted by the modrule targetableTransportedUnits (which is false for BAR).
…son#8773)

Closes beyond-all-reason#8772

Tracks the end-of-salvo on units with the ground-variant of Area Attack (to be renamed, "bombard", etc) and uses it to reseed the attack command entirely. The command is disposed via Finish or Remove and a new one inserted.

This replaces the broken Area Attack that becomes stuck on its first randomly-selected position and continues to fire on it. This is the more useful version with large selections of units; they attempt to destroy any hardened target in their range; but it is unwanted for all other cases.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.