KaipaBots — PR-Review
Offene Pull Requests, die deine Entscheidung brauchen
#1359Pause-opened windows: 'Esc = Back' hint in the header merge ? CI rot GitHub ↗
Card c014ac — analyst Rec A. Pause-opened Options/Save windows had no back affordance (Esc-only, undiscoverable). Right-aligned localized hint in the shared header (DrawOptions) and title strip (DrawSaveGames), gated on GLOBALClientStage == "Game" so standalone menus (back button) and title screens stay unchanged. Merge-note: locale-table insert conflicts trivially with #1358 — whichever lands second rebases.
#1358Options: rename 'Menu Space Background' to 'Space Map Background' sauber CI rot GitHub ↗
Card c140b3 — label fix per Kai. Option gates only SpaceMap's MenuShader; menus draw StarNest unconditionally. Literal renamed; new entries added to both locale tables (previously had none — DE showed the English literal). Option key GLOBALOptionsTable["MenuBackground"] unchanged — no behavior delta.
#1357Buttons: derive hover/pressed faces from custom colors sauber CI rot GitHub ↗
Card d78ec9. Custom Color / Changes["WindowColor"] killed the hover/active face swap → frozen-looking buttons. Faces now derived: +25%-to-white hover, ×0.7 press, O preserved. No tint helper existed — inline derive per analyst.
#1356DrawLayerToggle: hover fill, press face, click sound sauber CI rot GitHub ↗
Card d465df. Layer strip was static-looking: hover fired only the tooltip, toggle flipped silently. Now: HoverColor tint (α0.2) on hover, ActiveColor tint (α0.35) while held, standard PlayEffect click on Pressed.Left. Returns unchanged.
#1355ScrollContainer.WheelMoved: resolve overlaps by draw order sauber CI rot GitHub ↗
Card 7bd409. ppairs hash order decided which overlapping container got the wheel — luck, not Z-order. Start now stamps a monotonic DrawIndex (entries were already frame-refreshed via LastSeen); WheelMoved takes the highest-index eligible hover → last drawn wins.
#1354Menu stages: don't Esc out under an open Confirm dialog sauber CI rot GitHub ↗
Card 9b100e — soft-lock: Esc on Options/LoadGame left the stage while a Confirm modal held MouseTable.SetModalCapture(true); on Intro the dialog never draws → mouse dead until restart. Mirrors BlueprintEditor's ConfirmWindow.IsActive() guard. GUI.lua:211 already guarded.
#1353DrawSoundOptions: stop clobbering GLOBAL_OptionsTable on save sauber CI rot GitHub ↗
Card fbb70a — real data-loss: Save & Update overwrote live GLOBALOptionsTable + disk with a require-time snapshot (reverted key rebinds/theme/toggles written since load). Now mirrors DrawGameOptions: FILE values written INTO GLOBALOptionsTable, then saved.
#1352GetHoverData: gate Wire/Unit hovers on WindowHover sauber CI rot GitHub ↗
Card 9b8ebf. getWireHover/getUnitHover early-returned before any WindowHover check — wires and units under open windows still produced hover data while all five later types (item/wall/building/conveyor/terrain) were gated. Inline not WindowHover on both conditions.
#1351Intern: Bake-Fehler-Klassifikator + Wrapper-Muster gepinnt sauber CI rot GitHub ↗
Watch-Pass 5aa56135..3799bc20 (spec-only).
#1350DrawComplexWindow: measure min-width on drawn headbar text sauber CI rot GitHub ↗
Card e7696a. Headbar draws (MachineName or Title) at :193 but keepMinimumWindowSize measured Title only — longer MachineName (e.g. CombatAlert) under-measured MinWidth and the text ran into the X zone. One-arg fix; dead-code half of the card was already absent on main (verified stale by analyst).
#1349ConfirmWindow: click sound + pressed face on Confirm/Cancel sauber CI rot GitHub ↗
Card f53642. Confirm/Cancel (delete/quit) had no audible or visual click feedback — hover composite only, silent toggle+Stop.
#1348Intern: Ordner-Aktionen + Re-Klick-Deselect + Binaer-Kopie gepinnt merge ? CI rot GitHub ↗
Watch-Pass 4619489a..3144c071 (spec-only + eine Pin-Reparatur).
#1347Tests: Repins + Headless-Require-Fixes (Freecam/CRAFINGBONUS/Locale) sauber CI rot GitHub ↗
Fixt die Test-Regressions der letzten Merges + nachgezogene Pins:
#1346Intern: Freecam (F8/Layer-Toggle) per Unit-Tests gepinnt (watch 508) sauber CI rot GitHub ↗
Spec-PR fuer den Watch-Delta 610d71b0..4619489a (084e5a9a Freecam).
#1345fix(GUI): left resize border zone collapses on approach sauber CI rot GitHub ↗
Card c35a60 (analyst sign-correction confirmed).
#1344refactor(GUI): OnTop Boolean-assert contract (Kai-Entscheid) sauber CI rot GitHub ↗
Card 2e40bf — Kai's pin: crash loudly + caller sweep.
#1343fix(GUI): DrawComplexWindow global leaks + dead writes sauber CI rot GitHub ↗
Card cc9419 (analyst count-correction applied: 2 real leaks, not 6).
#1342fix(GUI): Textfield pressed-edge activation + l10n + nav keys sauber CI rot GitHub ↗
Card d82be3 (analyst correction honored: up/down already handled at :493/:501 — only delete/home/end added).
#1341fix(GUI): tab-bar sound, shared-timer block, arrow OnTop sauber CI rot GitHub ↗
Card c82304 (both analyst corrections honored).
#1340fix(GUI): DrawScrollBar track paging + edge grab + blocked dim sauber CI rot GitHub ↗
Card eb45ab (analyst: all sites confirmed).
#1339fix(GUI): centered cursor pivots + ibeam over textfields sauber CI rot GitHub ↗
Card 0e588a (analyst mechanism-correction applied).
#1338fix(GUI): DrawToggle label hit-area + blocked glow + sound sauber CI rot GitHub ↗
Card 06683a (analyst impl note honored: hit-rect uses the label's real localized width).
#1337refactor(GUI): live DrawButton callers → DrawButton02 sauber CI rot GitHub ↗
Re-pointed the five live legacy DrawButton users at DrawButton02 (same (Position, Size, Changes) shape — Changes.WindowColor honored, BorderWidth was ignored by the old impl too): DrawAsteroidButton, DrawNoItemButton, DrawTextButton, DrawTilePreviewButtonViaFunction, DrawSplitterCW 'All' button
All five now get real hover/active beveled faces instead of the legacy identical-color path
drawButtons in DrawSplitterCW ga…
#1336fix(GUI): OnTop propagation kills dead affordances sauber CI rot GitHub ↗
Card c502b3 (analyst corrections applied).
#1335feat(GUI): centralized Disabled state for canvas buttons sauber CI rot GitHub ↗
GuiConfig.DisabledOpacity = 0.4 — one constant replacing the sprinkled setColor(1,1,1,0.4) wraps
Optional Disabled flag on DrawCanvasButton, DrawRoundedCanvasButton, DrawGuiButton, DrawWideGuiButton, DrawSmallGuiButton: draws Canvas['Disabled'] or Canvas['Idle'] dimmed, returns inert {Pressed={}, Release={}} — no hover/active/sound/click
Migrated the three manual-alpha sites: DrawBlueprintEditor craft, DrawUpgradeDet…
#1334fix(GUI): DrawSlider drag latch + occlusion/scissor checks sauber CI rot GitHub ↗
FILEActiveSliderID latch (FILEActiveScrollBar pattern): drag starts on press in-box, persists while left is held with pointer X clamped to the track, releases on mouse-up — knob no longer drops when the pointer leaves the box
Optional ID param (position-derived fallback key) so sibling sliders can't steal each other's latch
Optional OnTop param + active-scissor check: covered/clipped sliders can't start drags or fire…
#1333ChatWindow: remove dead API + dedupe helpers sauber CI rot GitHub ↗
ToggleInput + DrawCollapsed had zero callers — deleted.
getLineHeight/getColorForPriority were duplicated across ChatWindow/DrawChatWindow (identical semantics at font 14+4). DrawChatWindow exports both; ChatWindow now calls the shared versions so they cannot drift (priority color vs GuiConfig.ErrorColor was already drifting post-#1314).
#1332Buttons: click sound on press edge, not held sauber CI rot GitHub ↗
handleSound in DrawButton, DrawButton02 and DrawActionSlot fired COMMANDPlayEffect on the per-frame HELD state — the cached static source refires each time the 50-150ms sample ends, so a held click keeps ticking. All three now read the Pressed edge like DrawCanvasButton already does.
#1331Intern: Pfad-Legemodus + Rechtsklick-Drop + SaveList-Scroll-Fix gepinnt (watch 507) sauber CI rot GitHub ↗
Spec-PR + ein Failspec-Fix (2 Zeilen Source) fuer den Watch-Delta aad0b7fb..610d71b0.
#1330Chat input: left-align + placeholder + limit flash + outside-click sauber CI rot GitHub ↗
Card a63abc — four small UX fixes on the chat input field.
#1328Chat: collapse identical mirrored lines to (xN) sauber CI rot GitHub ↗
InfoText.AddLine mirrors every line unconditionally into the chat log — action spam (button mashing, blocked actions) flooded it with identical rows.
#1326Chat: '/' secondary binding - command quick-open sauber CI rot GitHub ↗
/ opens the chat input with the slash already typed - command quick-open as users expect from other games.
#1325Chat: scrollbar track inside window edge + text gap sauber CI rot GitHub ↗
The track is drawn at Position.x + Size.x while logSize.x = overlaySize.x - padding2 — with padding=6 and a 12px track it ended +6px past the window edge. Text scissor ran flush into the track (0px gap).
#1324Chat: localize command output, stop draw-time re-translation sauber CI rot GitHub ↗
DrawLineOfText gains a RawText flag. Stored log lines are display-final and must not re-run LocaleManager.Get every frame - a stored string that happens to equal a locale key silently swaps at draw time (e.g. a save name matching a key). Both chat draw sites (active DrawChatWindow, collapsed ChatWindow overlay) pass RawText=true.
#1321Chat: Tab-completion for slash commands sauber CI rot GitHub ↗
TextField.Key gains per-field OnTab (global tab would break stage-level handlers); CommandParser.MatchPrefix returns sorted matches + common prefix; chat completes then cycles. Editing resets the cycle.
#1320Chat overlay: shadow pass on collapsed lines sauber CI rot GitHub ↗
Collapsed overlay drew bare text on the world - OldSkool's black TextColor unreadable on dark space. Each line gets a dark 8-offset halo via DrawLineOfShadowText (explicit dark shadow for theme-independent contrast).
#1318Chat overlay: fade stale lines out of the collapsed view sauber CI rot GitHub ↗
entry.Time was stored but never read. Lines now hold full alpha for 10s (game time), fade linearly to gone at 15s - matching the InfoText mirror's 8s feel. Loaded saves clamp negative age to fresh.
#1317Chat history: draft stash on up-recall + consecutive-dupe skip sauber CI rot GitHub ↗
First Up stashes the in-progress input as 'slot 0' (Down below newest restores it, not ''); identical resubmits no longer burn history slots. Stash clears on submit.
#1314Chat errors render in GuiConfig.ErrorColor sauber CI rot GitHub ↗
CommandParser returns a second severity value (non-breaking - {string} shape unchanged); all error returns mark 1; parseInput threads to AddLog; priority color now reads the theme ErrorColor instead of hardcoded {1,0.3,0.3}.
#1313Chat: /help hint on unknown, bare '/' shows help, usage on missing args sauber CI rot GitHub ↗
Unknown command gains localized '- type /help for a list'; bare '/' runs the help handler; commands with registered Usage print 'Usage: /name <args>' on missing args. EN+DE keys.
#1311Game.KeyPressed: typing gate for Game-level hotkeys sauber CI rot GitHub ↗
GUI.KeyPressed still receives keys while typing (TextField), but handleGameSpeed/OverLays/PlayerController/f12/f7/'#' no longer fire out of a chat field. Rest-gap to #1248.
#1310GUI and pause menu on dedicated layer canvases sauber CI rot GitHub ↗
FrameCompositor shims love.graphics.setCanvas during the GUI.Draw bracket: bare resets in the 135-file GUI call-graph resolve to the active layer canvas; targeted calls pass through - zero factory edits. Game.Draw composites Scene -> GUI -> Pause -> screen. Save thumbnails build from scene+GUI via CaptureShot -> the open save/pause menu no longer lands in the image; F12 captureScreenshot unchanged.
#1308Save-list sweep: bounded caches, Travel-Save label, info order, Open Folder sauber CI rot GitHub ↗
Per-title canvas buffers were unbounded (unique generated save names) -> ClearBuffer exports + outpost-switch clear in SaveNameList. TransitionSave/MapTransferSave rows show localized 'Travel Save' with preserved datetime suffix. Info line reordered Date|Mode|Playtime. Shared OpenSaveFolder lib extracted; 'Open Folder' added to the healthy save-detail pane (4-button row, zoom 3->4).
#1307Save folders: show per-outpost save count + active marker sauber CI rot GitHub ↗
SaveFolderList stores counts computed during enumeration, exposes GetCount(FolderName); folder labels render 'name (n)' and '> ' for the active outpost. Selection logic still uses raw folder names.
#1306Save Options: amber WarningColor for unsaved state + cap explainer sauber CI rot GitHub ↗
New WarningColor theme key exposed via GuiConfig; unsaved Save Options highlight uses amber instead of error red; localized explainer 'Oldest saves are removed beyond these limits' (EN+DE).
#1305Selected save rows render via ActiveColor canvas, not a border sauber CI rot GitHub ↗
MakeSaveNameButtonCanvas gains a Selected flag + selected-canvas variant (keyed with a suffix); SaveNameList and DrawSaveGameFolders pass selection state; obsolete drawHighlight blocks/constants removed. ClearBuffer() exports on all three row-button modules; buffers cleared on outpost switch.
#1304Save feedback via chat only; delete DrawFeedbackWindow sauber CI rot GitHub ↗
All save kinds (AutoSave, QuickSave, menu Save, Overwrite) report via localized InfoText.AddLine -> ChatWindow.AddLog. DrawFeedbackWindow widget, its requires and the getShowFeedBackWindow helper deleted.
#1303MakeLabelCanvas: font floor + ellipsis instead of newFont(0) crash sauber CI rot GitHub ↗
Shrinking loop could hit fontsize 0 -> newFont(0) crash. Floor at 8px; text still too wide is truncated with '...' so the drawn label always fits.
#1301Save-detail rename flow sauber CI rot GitHub ↗
Renaming saves was impossible; only filesystem support existed.
#1300Localize all save-menu user-facing strings sauber CI rot GitHub ↗
Save menu shipped mixed-language text for German sessions.
#1299New-save form: autofocus, placeholder, inline error, cancel sauber CI rot GitHub ↗
The form needed click-to-activate, showed a hardcoded Input... ghost, failed silently on invalid names, and had no way out.
#1298Save-detail nil-safety + font floor + stacked overflow sauber CI rot GitHub ↗
Legacy saves missing GameMode/PlayTime/TimeStamp crashed the whole save-menu frame (fields healGameData never heals).
#1297Save kind badge + keep-N hint (fleet 851f65) sauber CI rot GitHub ↗
Colored Auto/Quick/Transit tags on save rows (healed flags); localized keep-N line under the title reading live MaxAutoSaves cap. Fleet 851f65.
#1295Confirm on save-name collision (fleet 77b5b9) sauber CI rot GitHub ↗
Typed name checked against preview FolderName entries; collision routes through localized ConfirmWindow before FILETriggerSave. Fleet 77b5b9.
#1294Real OnTop gate in DrawContainer (fleet b05605) sauber CI rot GitHub ↗
Signature (Position,Data,OnTop,SlotGap): BonusInventory call becomes natively correct, DrawContainerWithTooltip forwards OnTop. Hover/highlight/press gated. NOTE: overlaps ready PR #1289 in same file — rebase whichever lands second. Fleet b05605.
#1293Context slot-gesture hints + options toggle (fleet 206fc2) sauber CI rot GitHub ↗
Hand x slot-state gesture hints appended to slot tooltips; ShowSlotHints toggle default ON; EN+DE locales; UsedBattery maps to swap. Fleet 206fc2.
#1291No amount badge on 1-stacks (fleet b0d3e8) sauber CI rot GitHub ↗
Both DrawSlotVisual amount wrappers early-return on amount <= 1. Fleet b0d3e8.
#1290Gate actionbar unbind on unarmed state (fleet 8758a7) sauber CI rot GitHub ↗
Right-click on a slot no longer unbinds while an action is armed — the armed click only deselects. Fleet 8758a7.
#1289Click sound on inventory-slot press (fleet dd7347) sauber CI rot GitHub ↗
DrawContainer fires COMMANDPlayEffect (buttontest1 @ 0.5) on Pressed Left/Right edges — pattern ported from dead DrawContainerSlot.lua, which is deleted. Covers every container caller. Fleet card dd7347.
#1288Centralize shift+left quick-transfer in UpdateHandSlot (fleet a9bfc6) sauber CI rot GitHub ↗
24 dupe moveStackToInventory/handleShortcuts blocks deleted; UpdateHandSlot.handleLeftClick handles shift+left via new QuickTransfer.SlotToPlayer; LootOnly gains quick-loot. MERGE-ORDER NOTE: touches Radar/Teleporter DrawEnergyTab which #1283 deletes — whichever lands second needs a rebase. Fleet card a9bfc6.
#1287Unify window-size writeback (fleet f4edb5) sauber CI rot GitHub ↗
All 17 outliers normalized to WindowData["Size"] = windowSize: 5 in-place towers, 11 no-write machines (DefenceTower trivially conforming), MagicEnergy delegation now return-assigns. Fleet card f4edb5.
#1286Stop silent item loss on capped-slot deposits (fleet a7e98b) sauber CI rot GitHub ↗
Caller-side cap in UpdateHandSlot + OverPlayerInventory twins; command-side clamp in AddItemToSlot/AddItemToPlayerInventorySlot returning the un-inserted remainder. Fleet card a7e98b.
#1285UsedBattery merge guard in loot windows (fleet 0f440b) sauber CI rot GitHub ↗
LootOnly.sameItem gains the UsedBattery exclusion both siblings carry. Fleet card 0f440b.
#1284Splitter filter picker: legacy TabBar -> DrawCWTabs (fleet 5a734c) sauber CI rot GitHub ↗
Tab state moves from module-global FILETabData to MachineData["CurrentTab"] (persisted); canvas tabs; title/grid +TABBARHEIGHT; MachineData threaded into DrawFilterChoice. Fleet card 5a734c.
#1282Clamp grown windows fully on screen (fleet 567924) sauber CI rot GitHub ↗
FirstOpenPosition.ClampToScreen exported; re-applied in drawComplexWindow at-rest block — tab-refit and post-release resize growth can no longer overflow right/bottom. Fleet card 567924.
#1281Show I/O numbers toggle for six more machines (fleet 2611c8) sauber CI rot GitHub ↗
Adds the toggle after Show Status in Drill, MetalWorker, Smelter, Storage, DarkPyramidB/C — the world-overlay gate honors ShowSlotNumbers for pyramids too (MachineOverlayLayer :482). Fleet card 2611c8.
#1280Delete five dead config-window files (fleet d33566) sauber CI rot GitHub ↗
DrawResources, DrawIOMCW, StorageModule x3 — zero external requires. Fleet card d33566.
#1279Drop TABBARHEIGHT offsets in tab-less CWs (fleet f55efc) sauber CI rot GitHub ↗
BatteryLight, Capacitor, PyramidLeech — 56px dead band under the header. Fleet card f55efc.
#1278Un-shadow BORDERWIDTH in SmallPort storage tab (fleet 88b067) sauber CI rot GitHub ↗
SLOTBORDERWIDTH=6 for the slot pitch vs GuiConfig border for paddings; duplicate HEADERHEIGHT decl dropped. Fleet card 88b067.
#1277Unify tab labels: Show Process -> Process (fleet 9b74bb) sauber CI rot GitHub ↗
Renames all nine occurrences (grep-truth: Drill included, card listed 8). Fleet card 9b74bb.
#1276Debounce ResearchLab sort button (fleet 60b792) sauber CI rot GitHub ↗
BlockTimer Main gate + Set(0) + ConsumeClick — the button fired on raw Pressed.Left. Fleet card 60b792.
#1275Rename edit-button tooltip (fleet 88433b) sauber CI rot GitHub ↗
Localized TooltipManager.Trigger on edit hover, OnTop-gated. Fleet card 88433b.
#1274TrashCannon details tab: add rename row (fleet 78f1a5) sauber CI rot GitHub ↗
Adds the standard bottom-pinned DrawMachineRenameRow (lazy-require pattern per Storage). Fleet card 78f1a5.
#1272QuantumCrank tab-fit memory per machine (fleet 73d6d2) sauber CI rot GitHub ↗
FILELastActiveTab file-global -> MachineData["LastFitTab"] — the shared global made two open crank CWs fight the refit per frame and skipped refits on reopen. Fleet card 73d6d2.
#1271Splitter filter window: count partial last row (fleet 819571) sauber CI rot GitHub ↗
rowAmount mfloor -> math.ceil — the partial item row was dropped from the window-size calc, so the CANCEL/BLOCK/ALL button row overlapped items. Fleet card 819571.
#1270QuantumCrank tab label typo (fleet e8d9ed) sauber CI rot GitHub ↗
Quatum Prediction -> Quantum Prediction. Fleet card e8d9ed.
#1268Fix dead click-edge into drawActiveWindow (fleet 6fd277) sauber CI rot GitHub ↗
Pass leftClick as parameter into drawActiveWindow — it was read as an undeclared global (always nil), so the click edge never reached DrawComplexWindow (X, lock, drag, resize). Fleet card 6fd277.
#1267Smelter/Furnace icon export scenario (a0c1f5) sauber CI rot GitHub ↗
Item icons and Machines/Icons glyphs show the generic 'flame-in-house' instead of the real machine. Kai-agreed approach: throw-away scenario that renders the actual body canvas rather than screenshots.
#1266Area-demolish: type+position mark keys — wires under machines (f851f8) sauber CI rot GitHub ↗
With the wire layer visible, a tile carries both Type.Machine and Type.Wire — but getHoverTargetType returned only the priority winner and FILEMarkMap deduped by position alone, so wires under every footprint cell (not just the anchor) survived demolish.
#1265Sound options: per-channel preview samples (651bd1) sauber CI rot GitHub ↗
All 5 channels were staged-only until 'Save & Update' — volume was tuned blind. Now a representative sample plays at the STAGED volume × staged master.
#1264Robot window redesign — Modules/Upgrades tabs (8e47d3) sauber CI rot GitHub ↗
Kai-agreed design: the 'Modules' window becomes 'Robot' — smaller landscape format, tabs Modules/Upgrades, structured stats with base/upgrade/module breakdown, list-style upgrade view.
#1256PyramidLeech: chaining + LeechRange overlay + anchor details sauber CI rot GitHub ↗
Implements card b09805 (3 Kai-coordinated parts; analyst CONFIRMED with flags, all addressed).