Conversation
Integration Test Results15 tests 7 ✅ 4s ⏱️ Results for commit c16256c. ♻️ This comment has been updated with latest results. |
…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.
…ts not fully obstructed (beyond-all-reason#9026)
# 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.
<!--
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).
…tracking stats history (beyond-all-reason#9266)
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Work done
Test steps