Changelogs
697 changes
- #697
Merge branch 'refs/heads/auto/agitated-brattain-665491'
- #696
Merge branch 'refs/heads/auto/gifted-dubinsky-7b7fb7'
- #695
Give the Host Server window a light theme after Garry's Mod's New Game page: a white rounded page, Gmod fields and selects, the game mode as the green gamemode dropdown and Host as the blue Start Game button
- #694
Style the main and pause menus after Garry's Mod's menu in their existing layout: shadowed white actions that turn yellow on hover and focus, grouped with gaps, a black version badge, and shadowed title and footer
- #693
Add GradientBox, a StyleBox with a vertical gradient fill, a top-to-bottom border, rounded corners and an inner top highlight
- #692
Draw a drop shadow behind GUI button text when the button's theme has font_shadow_color, with Label's shadow offset and outline constants
- #691
Make the flashlight pull-back smoothing frame-rate independent
- #690
Snap feet yaw using the normalised angle difference so it doesn't overshoot across 180 degrees
- #689
Refuse to pick up the prop the player is standing on
- #688
Forget the old shadow mesh when reloading the player model, so a failed load can't leave it pointing at a freed node
- #687
Take a looped WAV's end frame from its length instead of copying its sample data
- #686
Prune freed props from PropSpawner whenever it tracks a new one
- #685
Turn off physics interpolation on the fly camera, which moves in _Process
- #684
Remove the leftover TMP prop spawns from MapViewer
- #683
Match sky_camera case-insensitively and read fogenable as an integer
- #682
Treat a material DX level too long to parse as not matching instead of throwing
- #681
Resolve autolayer pose parameters as model pose parameter indices, as studiomdl writes them
- #680
Reject truncated or oversized model, collision and pakfile data with InvalidDataException instead of out-of-range reads and huge allocations
- #679
Subscribe the mount window to mount changes in _EnterTree to pair with the unsubscribe in _ExitTree
- #678
Register GUI command handlers that take a Control subclass, and call them only for sources of that type
- #677
Guard the weapon wheel's sector and number geometry against zero radii
- #676
Stamp GUI script changes before flagging them so a hot reload can't skip the debounce
- #675
Compare colour picker values by their text form so the colour setting's round trip doesn't reset the picker on every drag tick
- #674
Fail GUI number conversion on NaN, infinities and out-of-range values instead of throwing out of the canvas update
- #673
Apply only the settings the player changed, so untouched values aren't snapped to their slider steps
- #672
Lock the host window's map choice while a world is selected, since hosting uses the world's map
- #671
Report unreadable world saves as WorldSaveException, and flush a world save to disk before it replaces the old file
- #670
Resolve a bare world save file name in the saves directory instead of the working directory
- #669
End a value with an unclosed quote or bracket at the next section header or key instead of swallowing the rest of the settings file
- #668
Reschedule the settings save when it fails
- #667
Retry a failed Steam asset revalidation on the next request instead of keeping the failure for the session
- #666
Raise MountStateChanged with no sources when mounting Garry's Mod fails, so screens waiting on AreSourcesOpen stop waiting
- #665
Skip unreadable folders when listing mounted directories and Garry's Mod addons instead of throwing
- #664
Reject drive-qualified segments in VirtualPath.IsSafe so a rooted path can't escape a mounted directory
- #663
Send acks on their own schedule: reliable sends no longer postpone them, and a busy unreliable stream is acked every half ack window
- #662
Time out connections that never finish the handshake, even while keepalives keep arriving
- #661
Keep connect handshakes inside the protocol's limits: truncate names and server strings on write, cap the total user info size, reject a client whose accept message doesn't fit instead of throwing, and strip format characters and split surrogates from player names
- #660
Carry fractional damage between hits so repeated damage under 1 HP still hurts
- #659
Make GameSession.Kill always kill instead of passing the player's health through the mode's damage scale
- #658
Fix ClientSettings.ConVars throwing on first use: the cleanup moved All below the fields that index it, so read the convars through getters instead
- #657
Chore: code cleanup
- #656
UID spam
- #655
Drive the player camera's field of view from the field of view setting instead of the view preset
- #654
Apply the window mode and vertical sync settings at startup and whenever they change: Borderless uses Godot's fullscreen window, Fullscreen uses exclusive fullscreen, and Windowed leaves a maximized window alone
- #653
Make the Gravity Gun style play like HL2's physcannon: hold attack to pull and pick up props up to 250 kg and release to drop, attack2 launches the held prop or punts the aimed one with mass-scaled force and pushes the player back, the claws open at pickable targets, and no freeze, wheel or rotate
- #652
Let PlayerPickup take its own settings and be driven from outside: Grab, Hold, Launch, the held mass and centre, and a standing-on check; wait HL2's 1 s grace after attaching before the hold error counts toward a drop
- #651
Keep beam sear trails from jumping between burn points: match each burn point to the nearest trail that was entering or leaving the same face, bridge only when one trail and one burn point could pair at a nearby beam position, let a trail survive a 0.1 s miss, and split the ribbon into capped runs wherever a quad twists or turns back
- #650
Add the loading screen scope: its pieces, how it draws during blocking work, startup, theme variations and use
- #649
Load maps behind the loading screen through LoadingTransition, with SourceMap and LocalGame reporting progress for reading the BSP, lightmaps, world geometry, each static prop, collision and spawning
- #648
Add the HL2 loading screen: a LoadingScreen autoload showing a themable Lua screen whenever a hold is open, from the first frame at startup, forcing frames during blocking work so its bar moves, in the HL2 colors as ThemeBase variations, with a black boot splash to match
- #647
Add Progress and StatusText GUI elements that draw straight onto their own canvas item when their value changes, so they update in frames forced while the main thread is blocked; Progress draws Source's segmented progress bar from theme styles and segment constants
- #646
Add the Godot uid for BeamSears
- #645
Add BeamSears: the physgun beam sears every solid surface its curve crosses, entering or leaving, as a ribbon trail that glows in the beam tint, cools to char and dissolves over 4.5 s, bridged across fast sweeps on the same surface and attached to props it crosses
- #644
Mark the netcode scope's net core done, with its codecs, channel, string table and signon details and what it left for later items
- #643
Add the Godot uids for the Net scripts
- #642
Add NetServer and NetClient with the connect, accept or reject, load, signon and active stages: protocol, build, password, slot and approval checks with their reasons, server info and string tables on accept, a userinfo table per slot, game messages once active, kicks, shutdown and timeouts
- #641
Add string tables: indexed strings with optional data, written in full for signon and as additions and data changes after, rejecting gaps and garbage instead of throwing
- #640
Add NetChannel: sequenced unreliable messages acked through the newest sequence and a 32-bit window, round-trip time and loss from those acks, fragments for messages over 1,200 bytes that lose only their own message, reliable messages over the transport's reliable delivery, and keepalives
- #639
Add LaggedTransport, which holds incoming packets for net_fakelag and net_fakejitter, drops unreliable ones at net_fakeloss, keeps reliable packets in order and delivers a disconnect after what was held
- #638
Add INetTransport and an in-memory LoopbackTransport that connects clients to a server end, delivers each side's packets on its next poll and queued packets before a disconnect and its reason
- #637
Add INetState with delta writes against a baseline that cost one bit per unchanged field, and a check that round-trips every INetState in the game and test assemblies with random values against random baselines
- #636
Add BitWriter and BitReader over spans with overflow flags instead of exceptions, float, angle and smallest-three rotation codecs for origins at a thirty-second of a unit, velocities and fractions, and an EvilEngine.Net.Tests project covering them
- #635
Document the Server options' cvars as applied through the game mode's server rules
- #634
Apply the spawn menu's Server options in local games: build the session's server rules from sbox_noclip, sbox_godmode, sbox_weapons, sbox_playershurtplayers and mp_falldamage and rebuild them when one changes
- #633
Add server rules to game sessions: Sandbox reads noclip, god mode, weapons, player damage and realistic fall damage from them through new game mode hooks, and Kill ignores god mode
- #632
Document the spawn menu's menu bar, the convars settings section and the snapshot's menu options
- #631
Open Derma dropdowns from the spawn menu's menu bar: checked cvar options that toggle on press, disabled cheat options, spacers and a hover submenu, switching menus on hover and closing on a press elsewhere
- #630
Read the spawn menu's menu bar from Garry's Mod's menubar.lua: menus, cvar options with their host and cheat requirements, spacers, and the NPC weapon override submenu filled from ADD_NPC_WEAPON calls in mounted games
- #629
Store Garry's Mod's menu bar cvars as client settings with Gmod's defaults, and apply cl_drawhud, physgun_drawbeams, physgun_halo, effects_freeze and effects_unfreeze
- #628
Add a zindex common property that sets an element's Godot z_index, leaving it alone on elements that never set it
- #627
Mark the netcode scope's simulation and presentation split done, with what it left for later items, and keep toggle crouch in movement as predicted state with its flag in userinfo
- #626
Add the Godot uids for GameEvents, PlayerUserInfo, SharedRandom, ViewPunch and WeaponSequences
- #625
Gather everything PlayerMovement keeps between ticks into PlayerMovementState with Save and Restore, and check in MovementLab that replaying 60 ticks of strafing, jumping and crouching from a saved state lands on the same origins
- #624
Give each player a PlayerUserInfo with its model, player and weapon colors, physgun style, continuous physgun, toggle crouch and auto jump, which the body, weapons and movement read instead of ClientSettings, bound to the client settings for the local player
- #623
Raise sounds, tracers, impact decals, world muzzle flashes and freeze outline flashes from player simulation through GameEvents, which plays them only when first predicted, and keep the physgun hum in the per-frame view update
- #622
Draw weapon spread, view kick, eye snap and sequence picks from a SharedRandom reseeded from each command's number, so replaying a command fires the same way
- #621
Pick weapon sequences and time them from the view model's .mdl through WeaponSequences instead of the built view-model rig, which only plays the picked sequence now
- #620
Integrate view punch per tick in the player's simulation instead of the camera's frame loop, so bullet aim and the machine-gun kick read the simulated punch, and have the camera draw it blended between ticks
- #619
Carry flashlight, noclip and undo as command impulses, weapon and mode picks, held-prop mouse rotation and physgun wheel notches in PlayerCommand, number each command, and aim weapons and the pickup from the command's eye angles
- #618
Wrap the spawn menu's missing tool gun warning to the tool panel's width, as Gmod's markup label does, so its large font doesn't widen the tool menu
- #617
Document the Garry's Mod spawn menu, the Derma skin and control skins, and settle that the stock theme is Garry's Mod's
- #616
Make the stock spawn menu Garry's Mod's Q menu in the Derma skin: the menu bar, Gmod's margins, creation tabs with search, node trees and spawn or content icons, the tool menu with its quick filter and categories, and the tool menu toggle, keeping the engine layout as EngineSpawnMenu
- #615
Read the spawn menu's tool and utility lists from Garry's Mod's Lua: tool categories and menu options registered with literal arguments, and each stool's category and name
- #614
Add the Derma skin: Garry's Mod's default skin regions and colors from the GWEN atlas for buttons, text boxes, scroll bars, splits, tooltips, property sheets, tabs, trees, category lists, check boxes, the menu strip and content icons, in Tahoma
- #613
Add Derma-drawn Tab, TabStrip, TreeNode and ContentIcon elements that read their parts from skin theme items, an iconalign button property, and a fading hover overlay and popup switch on SpawnIcon
- #612
Localize string properties that start with #, reading Garry's Mod's resource/localization/en .properties files alongside Source's resource files, and reload them on mount changes
- #611
Add Lua control skins: skin definitions of atlas borders, regions, images, atlas colors, flat and empty boxes and system fonts, built into a Godot theme per skin that an element picks with theme, plus a tooltip property
- #610
Load GUI images from Garry's Mod material paths such as icon16/folder.png, reading PNGs and JPGs from mounted materials and other paths as VMTs
- #609
Add Save World to the pause menu: a window naming the save after the map and time, warning before it replaces an existing world, and reporting where it saved
- #608
Pick a game mode and optionally a saved world in the Host Server window, showing the mode's description and switching to the world's map and mode when one is chosen
- #607
Save the spawned props and NPCs to user://worlds as a world save and load one with --world=<name or path>, restoring its entities on its map in its game mode unless --gamemode= picks another
- #606
Track each spawned prop and NPC with its spawnable, and place props at an exact transform, frozen or not, and NPCs at an exact position and yaw
- #605
Write negative zero coordinates in world saves as zero
- #604
Add the world save format: a versioned .evilworld JSON file naming the map and game mode and listing each spawned prop or NPC with its spawnable, model, skin, body, Source origin and angles and frozen state, plus a library that saves, lists and loads them by name
- #603
Convert Godot positions and rotations back to Source units and pitch, yaw and roll angles
- #602
Scope Source-style netcode: an authoritative server with listen, single-player loopback and headless dedicated roles, usercmd prediction, delta snapshots, interpolation, lag compensation, and transports behind one interface for ENet now and Steam later
- #601
Run LocalGame under a game mode: start the launch map in --gamemode=, give the mode's loadout, drop the spawn menu and block noclip and undo where the mode disallows them, apply fall damage, and on death strip weapons and freeze input until the mode's respawn delay puts the player back at a random player start
- #600
Move the sandbox loadout into SandboxMode, have GiveLoadout take the weapons and ammo it gives, and add StripAll to take every weapon and all ammo
- #599
Add game modes: a GameMode with loadout, spawn menu, noclip, undo, damage and respawn rules, a registry of Sandbox and Survival read from --gamemode=, and a GameSession that tracks the player's health, death and respawn
- #598
Settle that Lua HUD styles draw through a paint context, dropping it from the theme scope's open questions
- #597
Dry fire the physgun and gravity gun on right click when there is nothing held to freeze
- #596
Scope a Lua theme system: theme tokens, per-element HUD styles drawn from C# or Lua, Derma control skins from the GWEN atlas, and HUD animations owned by the theme
- #595
Open the Character overlay from a Character button in the pause menu, returning to the menu on Back or Escape
- #594
Add a Character overlay for picking the player model, player color and physgun color, with an animated, turnable preview of the chosen model
- #593
Add a ColorPicker GUI element that reports picks through onChange as rgba text and through its command
- #592
Check that citizen player models tint their clothes sheet through the PlayerColor proxy
- #591
Dress the player in the chosen player model, player color and weapon color, swapping body and hands when the model setting changes
- #590
Store the chosen player model, player color and weapon color as character settings, with a three-number vector setting type
- #589
List Garry's Mod's player models by name, title and category, with their hands, from player_manager's AddPlayerModel table
- #588
Tint model materials by the player color through the PlayerColor proxy on $color2, blending by base alpha and $blendtintcoloroverbase like VertexLitGeneric
- #587
Select the hovered weapon mode when alt mode is released over a different mode than the current one
- #586
Add the Godot uids for PhysgunOutline and PhysgunHold
- #585
Unfreeze with the physgun's reload press: free the aimed frozen prop, or every prop the player froze on a second press within 0.25 seconds of one that missed, flashing each red and chirping with Garry's Mod's unfrozen-objects message
- #584
Flash a prop green for 0.3 seconds when the physgun freezes it, through a per-flash PhysgunOutline overlay that fades out without the flicker and gives way to the held outline
- #583
Check that every physgun sound resolves to installed waves in Garry's Mod
- #582
Freeze a physgun-held prop on the secondary press: stop it in place as a static body and release it, ending the beam in standard mode without dry-firing until attack is released, and keeping a continuous beam from relatching the frozen prop
- #581
Let the physgun grab frozen props, unfreezing them at rest when it latches
- #580
Rotate a physgun-held prop with the mouse while Use is held, turning it about the player's up and right axes around the grab point instead of turning the view, and stop Use from releasing it or starting a hand pickup
- #579
Lay out the settings header in the scene: page tabs on the left and Credits at the far right, driving a TabContainer with its own tabs hidden
- #578
Give the physgun its sounds: loop the super gravity gun hum while the beam is on and play the physgun off sound when it ends, or the gravity gun's pickup, hold and drop sounds in that style
- #577
Equip the physgun by default when the player spawns
- #576
Hold props with the physgun: grab on the press in standard mode or the first prop a continuous beam sweeps over, outline it, end the beam at its grab point, push or pull it with the wheel, and release on attack release, holster or use
- #575
Add PhysgunHold: latch a rigid body at a grab point and distance, spring the grab point to the aim ray and the rotation to the player's yaw with gravity off, and keep its velocity on release
- #574
Add PhysgunOutline: a stencil-writing overlay whose next pass draws the mesh's back faces grown 3 pixels in screen space outside the stencil, additive in a flickering tint
- #573
Let the physgun grab on the attack press through TryGrab and keep its beam on while it holds something, dry-firing only when the press finds nothing
- #572
Take Crouch off C, leaving Ctrl and the gamepad's B
- #571
Take Walk off Alt so Alt only drives Alt-mode; Walk has no default key
- #570
Fire the physgun beam while continuous mode holds attack: trace 4096 units from the eye each tick, ease the end toward the hit, bow the curve toward the aim, and start it at the view or world model muzzle
- #569
Add PhysgunBeam: a camera-facing quadratic Bézier strip scrolling sprites/physbeama with three noise strands pinned at its ends and a physgun_glow sprite at the end point, extending over 0.06 s and fading over 0.12 s
- #568
Let HudSnapshot hold Alt-mode with the loadout's physgun through --modes=<current>,<hovered>
- #567
Add HudWeaponModes: while Alt-mode is held with a weapon that has modes, show its modes as HL2 selection boxes in the middle of the screen, steer between them with the mouse and click to switch, with the current mode underlined in its accent color
- #566
Move the weapon selector's color, glyph, text and sound helpers into HudPanel so other HUD panels can draw the same way
- #565
Give weapons selectable modes and the physgun two styles: GMod's blue Physics Gun and HL2's orange Gravity Gun, which swaps to c_physcannon and its name, redeploys when switched, and persists as game/physgun_style
- #564
Add Alt-mode: an alt_mode input action on Alt and an AltMode autoload that tracks whether it's held and raises Changed, for scripts to show alternate info or controls while Alt is down
- #563
Hold the physgun beam on while attack is held in continuous mode instead of dry-firing, dropping it on release or holster
- #562
Add a Continuous physgun toggle to the Game tab's Weapons section, stored as game/continuous_physgun
- #561
Smear the room echo when it plays on its own: low-pass it at the preset's echo cutoff before the delay and add a second tap 13 ms later at 35%, so the first slap stops being a full-bright copy of the sound
- #560
Keep the direct sound out of the room delay's feedback loop when it feeds the reverb: turn feedback off and play the second repeat on tap 2, since Godot recirculates the dry signal and doubled every echo
- #559
Damp the physgun view model's idle tremble to 40%
- #558
Center the room delay's echo: Godot's delay tap defaults to a 0.2 right pan, which leaned every echo and repeat about 2 dB into the right ear
- #557
Add a view punch strength setting and soften punches to 70% in the view presets
- #556
Shrink the physgun dry-fire view kick
- #555
Dry-fire the physgun on left click with the physcannon shake and sound
- #554
Move the Credits tab to the right end of the settings tab bar
- #553
Stop GameFileSystem's background source open from calling into Godot after the node leaves the tree
Opening sources and loading spawnables now report their errors, timings and issues from the main thread, and the deferred completion is only queued under a lock that _ExitTree and FreeEditorInstance close.
- #552
Thank the @syhgma YouTube audience in Special thanks
- #551
Credit Valve and Half-Life 2 in Special thanks
- #550
Credit Garry's Mod and Garry Newman in a Special thanks section
- #549
Stop AudioManager's background sound reload from calling into Godot after the node leaves the tree
The reload task now does no Godot calls on its worker thread: warnings and errors are reported from FinishReload on the main thread, and the deferred FinishReload is only queued under a lock that _ExitTree closes.
- #548
Group settings into titled sections with collapsible cards for nested categories, scrolling each tab
- #547
Theme FoldableContainer as a bordered card with a chevron title bar and add a SectionHeading label variation
- #546
Show credits links as labelled hyperlinks instead of raw URLs
- #545
Add IBM Plex Sans Bold and Bold Italic as weight-700 variations and set RichTextLabel bold, italic and bold-italic theme fonts
- #544
Document the input settings and where they apply
- #543
Add invert look, controller look speed and deadzone, toggle crouch, toggle sprint and hold-to-jump to the Controls tab
- #542
Bind settings window controls to their settings through one load/apply list
- #541
Apply input settings in the player: mouse sensitivity (replacing the view resource's), inverted X/Y look, controller look speed and stick deadzone, toggle crouch, toggle sprint and hold-to-jump
- #540
Persisted settings backend setup
- #539
Document the client settings store
- #538
Move bus volumes, the first-person body toggle and the settings window onto ClientSettings, persisting video and input values and reloading the form each time it opens
- #537
Declare the client settings on a store at user://settings.cfg and add a SettingsManager autoload that saves them after changes and on exit
- #536
Add PersistentStore: typed settings over a ConfigFile-format file that keeps unknown keys, writes atomically, merges with other processes' saves and backs up damaged files
- #535
Show the Dazzle search icon in the spawn menu's search box
- #534
Give the Lua TextBox element an icon property drawn at its right edge
- #533
Add the Dazzle refresh icon to the server browser's Refresh button and a search icon to its filter field
- #532
Add Dazzle folder, external-link and globe icons to the mount card's Show in folder, Open in Steam and Open in browser buttons
- #531
Add Dazzle file-pencil and refresh icons to the mount manager's Open mounts.cfg and Refresh buttons
- #530
Replace the mount card's +/− text toggle with recoloured Dazzle plus and minus icons
- #529
Replace the default SpinBox arrows with recoloured Dazzle chevrons tinted per button state
- #528
Replace the default LineEdit clear button with a recoloured Dazzle xmark
- #527
Enlarge settings form rows: 18px labels and dropdowns, wider column and row spacing
- #526
Give the settings footer buttons a 120x40 minimum size
- #525
Set IBM Plex Sans import to light hinting with auto subpixel positioning and preload size 16 glyphs
- #524
Make IBM Plex Sans the theme's default and label font at size 14, keeping Coolvetica for window titles and tree headers
- #523
Credit IBM Plex Sans and its SIL OFL license in the Settings credits tab
- #522
Add IBM Plex Sans variable fonts (upright and italic) with their SIL OFL license and attribution
- #521
Turn the Game tab's camera setting into a first-person body toggle: on keeps the head-attached body camera, off hides the body and uses the static eye camera
- #520
Add a Game settings tab with a checkbox to detach the first-person body camera from the playermodel's head, keeping it at the motor eye with no head-driven sway
- #519
Redraw the weapon selector on the frame it hides, so its last faded frame no longer lingers on screen
- #518
Fade the main menu backdrop in from black only on game launch, not when returning from a game through a scene transition
- #517
Drop the Paused subtitle from the pause menu, as GMod's menu has none, and make MenuScreen's subtitle optional
- #516
Keep the world simulating while the pause menu is open, as GMod does: the menu only captures game input and no longer pauses the tree
- #515
Give the player GMod's default weapon color and feed it to the view and world weapon models with the PlayerWeaponColor proxy's sine pulse, so the physgun core glows cyan
- #514
Render VMT $selfillum on lit models as Source does, blending the lit color toward $selfillumtint x albedo by the base alpha, and let a PlayerWeaponColor proxy on $selfillumtint take the tint from a per-instance weapon color
- #513
Add Godot uid for the weapon manifest reader
- #512
Add GMod's physgun as a placeholder weapon: weapon_physgun in slot 1 of the sandbox loadout with GMod's c_superphyscannon view model and physgun hold type, and no attacks yet
- #511
Resolve weapon scripts through scripts/weapon_manifest.txt like Source, so GMod's scripts/weapons/ files win over HL2's loose scripts and its beta weapon_physgun.txt
- #510
Chore: code cleanup
- #509
Build history
- #508
Build hist
- #507
Build hist
- #506
Add GMod's classic bucket weapon selection as HudWeaponSelection: small numbered slot boxes, the open slot's weapons as name rows with the selection in a large box with its glowing icon, laid out from hudlayout.res and switched against the wheel by each element's visible key
- #505
Move weapon selection state, input, sounds and fades out of the wheel into a HudWeaponSelector base that other selection layouts can paint
- #504
Split HudPanel's rounded background into a DrawBox helper that draws a rounded box at any rectangle, like vgui's Panel::DrawBox
- #503
Add Godot uids for the localization reader
- #502
Add an HL2-styled weapon wheel: six bucket segments with the HL2 font icons, ammo and slot numbers, held on Tab to aim with the mouse and scroll within a bucket, and opened by slot keys and the mouse wheel with HL2's click-to-confirm and timeout fade
- #501
Expose the player's weapons to the HUD: bucket, slot position, print name, TextureData icon glyphs, selectability and secondary ammo, plus selecting a weapon and holding off attack while a HUD element takes the click
- #500
Copy the font glyph atlas before converting it to RGBA for a font-character HUD icon, so the font's own cache texture stays LA8 and text drawn at that size keeps its color
- #499
Read Source localization files and resolve #tokens from the valve, gameui, hl2 and garrysmod English token tables
- #498
Read weapon script TextureData sprites, the font glyphs and sprite sheet rects the HUD draws weapon and ammo icons from
- #497
Clean
- #496
Chore: Formatting
- #495
Thanks junie for doing a full Rider cleanup pass
- #494
Chore: Formatting and codebase cleanup
- #493
Size the model preview's render target in physical pixels through the root window's stretch transform, and take that stretch from the root so controls inside embedded windows don't count their own window's transform twice
- #492
Light static props with the map's baked sp_hdr/sp_ vertex lighting, decoded as (2 x color)^2.2 like Source's vertex shader, and fall back to the model lighting when a prop has none or it doesn't match the model
- #491
Read VRAD's static prop vertex lighting files and map their per-strip-group colors onto the mesh vertices BuildMesh emits, which can now report each vertex's source index
- #490
Pick scheme font entries and sizes at a 1080p reference and scale them by screen height, so yres font buckets don't change HUD text proportions as the window resizes
- #489
Include the window stretch transform when converting GUI canvas units to screen pixels, so fonts aren't sized for the smaller window and then shrunk again by canvas_items stretch, and the crosshair and quick info snap to real pixels
- #488
Light NPCs, physics props and the player body with the model lighting at their illumposition each frame, and give the bonemerged weapon the body's row
- #487
Light static props once at load from their lighting origin, or their model's illumposition when they have none, tracing every reachable light
- #486
Keep model lighting in texture rows that shared lit materials read through an instance uniform, owned by a ModelLighting node the map adds, and move the view model onto a row of its own
- #485
Make model lighting queries safe to run on several threads and report when a probe has stopped tracing and fading
- #484
Light the view model with the map's lighting through a model shader that evaluates the ambient cube and up to four Source world lights per pixel instead of the flat environment ambient
- #483
Compute Source model lighting at a point: the leaf's ambient samples weighted by inverse squared distance, the four strongest PVS-visible, unoccluded world lights as local lights and the rest folded into the ambient cube, with occlusion faded over 0.15 s
- #482
Add a BSP ray trace that clips against the brushes in each leaf the ray crosses and reports the hit side's texinfo, and decompress the PVS per cluster
- #481
Parse the world light and leaf ambient lighting lumps, both LDR and HDR, with ambient cubes decoded in Source's linear light scale and v19 leaves' embedded light cubes
- #480
Draw HUD numeric labels in HudDefault, the font GMod uses for them, instead of Default, which scaled to 27px at 1080p and pushed AMMO into the digits
- #479
Warn about a player model only when it lacks the movement activities PlayerAnimState plays, since wOS DynaBase includes runtime-generated local_*.dat files and a pointer model GMod itself skips when absent
- #478
Skip unmounted player model animation includes before loading them, so a missing addon include like wOS's anim_dynamic_pointer_male.mdl doesn't also raise an asset cache load warning with a full stack trace
- #477
Crossfade view model sequences in model space so the SMG doesn't swing down and back when ACT_VM_RECOIL2, which leaves Bip01 at its bind pose, fades to idle after a three-shot burst
- #476
Add a model-space pose blend to StudioBoneSetup that crossfades bone transforms globally, so animations that park a parent bone differently and compensate in the child don't swing the child mid-blend
- #475
Draw the painted sky per pixel from env_skypaint with GMod's g_sky gradient, dusk, sun and scrolling star layers instead of sampling its low-res fallback cube faces, which creased at every edge
- #474
Parse env_skypaint with the GMod entity defaults, taking the sun normal from env_sun when the map has one
- #473
Hard-limit the World bus at -1 dB and Master at -0.3 dB so loud shots plus their reverb return can't clip the output
- #472
High-pass the room reverb input at 120 Hz so gunshot sub-bass doesn't build up in Godot's unscaled combs into a wash louder than the shots in large rooms
- #471
Snapshot the outgoing sequence's cycle before resetting it so a finished draw or fire animation doesn't restart during the crossfade to the next sequence
- #470
Add bullet tracers from the muzzle every second shot, multiply-blended subrect impact decals that keep the surface's lighting, and brass ejected from the view model's eject events
- #469
Parse decals_subrect.txt: game material translation, weighted decal groups and subrect materials
- #468
Collapse the hidden head and arms onto their root bone so the first-person body leaves no stick-figure of thin triangles in front of the camera
- #467
Give the player weapons: inventory and ammo, slot, wheel and reload input, bullet and melee traces that push props and play impact sounds, view punch, the sandbox loadout, and weapons from the spawn menu
- #466
Bonemerge the weapon's world model onto the player body, shadow-only in first person, and hide the body's arms in the body view while a weapon is out
- #465
Add the first-person view model: c_ models with bonemerged hands at viewmodel_fov 54 through material FOV override and z clip scale, HL2 bob and lag, sound events and muzzle flashes
- #464
Port HL2 weapon logic: CBaseCombatWeapon's frame loop, the pistol, .357, SMG, AR2, shotgun, crowbar and stunstick, Source ammo forces, and Garry's Mod's hands per playermodel
- #463
Translate player activities through Garry's Mod hold types and play attack and reload gestures in the attack-and-reload slot, stretched to a given duration
- #462
Parse weapon scripts: models, buckets, clip sizes, ammo types and SoundData
- #461
Let a StudioAnimator follow a leader's bones by name like Source's bone merge, restart sequences from cycle 0, report sequence durations, and play gestures at a given rate
- #460
Spawn NPCs as a hull body with a StudioCharacter playing its idle activity, placed 32 units off the surface and dropped to the floor as Gmod does
- #459
Add an Npc collision layer that players, physics props and view traces collide with
- #458
Emit the flashlight from the body's chest in third person, aimed at what the view ray hits
- #457
Give noclip its own friction and apply it before acceleration so flight stops and turns quickly instead of coasting
- #456
Toggle between first and third person with P, returning to the last first-person mode
- #455
Low-pass the animated eye offset in first-person body view so the camera keeps the motor eye plus procedural bob instead of riding the run cycle
- #454
Character imports and animation editor setup
- #453
Other
- #452
Free the editor GameFileSystem by instance id on assembly unload, since Godot has already disposed its managed wrapper, and connect the root's tree_exiting only once so reloads stop failing
- #451
Show the spawn menu only while Q is held, closing it on release or when the window loses focus
- #450
Document the bone setup, Garry's Mod playermodel pose parameters and the player animation controller
- #449
Give the player a Garry's Mod playermodel driven by the base gamemode's animation logic, with a first-person body view from the eyes attachment, a headless body that hides from the flashlight's shadows, a shadow-only full body, and F5 to cycle third person and the classic view
- #448
Expose AnimDucking like Source's FL_ANIMDUCKING: set while crouch is held or a ducked player can't stand
- #447
Add StudioAnimator: runs the bone setup for a StudioCharacter with a main sequence, Source's sequence transitions, gesture slots and attachments, and writes poses through the humanoid rig
- #446
Port Source's bone setup: blend grids with three-way blending, delta and post layers, auto layers, realtime and autoplay sequences, cycles per second and ground speed, evaluated on the Source skeleton
- #445
Read MDL attachments into StudioSkeleton as Godot-space locals on skeleton bones
- #444
Preview spawn menu tiles on hover and spawn them on a single press
- #443
Drop the recent tools row and tool options from the spawn menu and let the model preview fill the details panel
- #442
Add an onHover handler to GUI buttons that runs when the mouse moves onto them
- #441
Render Lua GUI screens in the editor: GuiCanvas and the built-in elements are tools, non-tool elements become placeholder controls, and the canvas follows Lua edits and export changes live
- #440
Let the game file system and GUI scripts run in the editor: an editor-only GameFileSystem that mounts without spawnables, LuaJIT loaded from res://Native, and both released when the editor quits or the assembly reloads
- #439
Document that dynamic models render posed at sequence 0
- #438
Bump the spawn icon render version so icons of models posed by sequence 0 are redrawn
- #437
Pose non-skinned studio meshes at sequence 0, frame 0 like Source, so doors, turrets, weapon world models and characters face the way their collision does
- #436
Show the mouse when the main menu loads so returning from the pause menu doesn't restore the in-game captured mode
- #435
Add Godot uids for the skeleton, animation and character scripts
- #434
Document MDL bone animation, sequences, facing and the humanoid retargeting port
- #433
Add GMod's flashlight on F: a shadowed spotlight with the flashlight_border cookie, 60 degree FOV, 20 units below the eye with the look-down swing, pull-back traces near walls, and the HL2Player.FlashLightOn/Off sounds
- #432
Light world surfaces with Source's flashlight: lightmap as emission plus a light() that applies the cookie, min(1, 100/d) falloff, far fade from 450 to 750 units, Lambert term and shadow attenuation from global flashlight parameters
- #431
Add StudioCharacter: a skinned Skeleton3D normalized to SkeletonProfileHumanoid, lazily built native and humanoid animation libraries, blend spaces for pose-parameter grids, and a modifier for quaternion helper bones
- #430
Turn the studio skeleton's root bones so the bind pose faces the same way as the animations, which studiomdl rotates 90 degrees from it
- #429
Optionally write four bone indices and weights per vertex when building studio model meshes
- #428
Check the automatic room every 0.25 s from raw rays and switch once the listener has moved 4 ft (6 ft outdoors) since the last change, like Source, instead of smoothing and waiting for a second matching sample
- #427
Crossfade room delay and reverb between two send buses over Source's 0.2 s, or the previous preset's fade time, so the old room's tail rings out instead of morphing one reverb for a second
- #426
Build Godot-space skeletons, skin binds and quaternion helper bones from MDL bones, and turn sequences from included models into skeleton animations with root motion
- #425
Port Godot's humanoid rest fixer: map a skeleton onto SkeletonProfileHumanoid, fix its silhouette to the T-pose, overwrite bone axes, and convert animations and skin binds to match
- #424
Read MDL animation descriptions, pose parameters, blend grids, animation blocks and quaternion helper bones, and decode compressed bone animation
- #423
Match room reverb to Source's comb reverb: decay from the shortest delay, wet level from tail energy, Godot's inverted damping, no default predelay echo, and delay taps at gain times feedback
- #422
Mix each world sound into the room reverb by distance and sound level like Source: 20% near to 70% at 1440 units, halved at 80 dB and below, with the send bus back at 0 dB
- #421
Let a one-shot sound steal the quietest looping voice when every voice is a loop, so a loop-saturated map can't mute impacts and footsteps
- #420
Drop fully-dead undo entries on every add and cap the list at 256 entries
- #419
Refuse a pickup while already holding a body, so a second attach can't orphan the held prop's restored mass and gravity
- #418
Purge freed bodies from collision sound tracking even while disabled or before surfaces load
- #417
Build skinned static props through ModelMeshes with their prop skin instead of always rendering skin 0
- #416
Bounds-check surfedge, edge, plane, face and leaf indices in the BSP walkers so corrupt maps fail with a clear error instead of raw index crashes
- #415
Honor maxSize on partial VTF mip chains by picking the smallest available mip instead of always decoding mip 0
- #414
Reject non-finite hull planes and points so a corrupt plane lump can't hand the physics engine a NaN hull
- #413
Always resolve workshop detail completions and fail preview fetches instead of leaving pending tasks cached forever on unexpected exceptions
- #412
Skip Steam manifests and library folders that fail to read or parse mid-write instead of failing the whole mount
- #411
Limit KeyValues section nesting to 128 levels so a hostile file can't overflow the parser's stack
- #410
Cap GIF canvas and frame sizes so hostile dimensions can't overflow the pixel math or allocate multi-gigabyte buffers
- #409
Bound a compressed game lump by the container instead of its uncompressed length, so repacked maps keep their static props
- #408
Still invoke workshop callbacks when a details or preview fetch fails, so cards fall back to local thumbnails instead of staying blank
- #407
Route the pause menu's mouse mode through WindowManager's game input capture instead of writing Input.MouseMode past its bookkeeping
- #406
Clamp the quick info warning alpha instead of wrapping a byte cast, so the caution pulse fades smoothly rather than flashing inverted
- #405
Create the sky shader once at type initialization instead of racing a lazy field across converter threads
- #404
Restore the Lua stack top on throw in SetGlobal, GetGlobal and GetReference, and grow the stack with lua_checkstack before pushes
- #403
Finish an audio reload even when a step fails, so listeners and room DSP see whatever did load
- #402
Check the window type before registering in Open<T>, instead of showing the wrong window and then throwing
- #401
Raise SceneChangeStarted inside the scene change's try block, so a throwing subscriber can't leave the input-blocking overlay and IsChanging stuck
- #400
Log and notify instead of silently dropping a background mount failure, so listeners still hear about the mount state
- #399
Keep an acquired icon handle queued while its key renders as precache, so a cache hit on the precache pass still delivers to the handle
- #398
Formatting
- #397
Remove the player, impact and pickup probes and their MapViewer flags, and the crosshair sound tester from LocalGame
- #396
Show a spawn menu tile's name in a small label below it on hover, the same for every category, drawn above the rest of the menu
- #395
Let the spawn icon snapshot select a spawnable and capture its live preview, and record the model preview
- #394
Show the selected spawnable's live model preview in the spawn menu's preview panel
- #393
Add a ModelPreview GUI element that turns a live render of a model, shows its icon while loading and turns by dragging
- #392
Load turntable previews through SpawnIcons on a worker, sharing the icon asset cache
- #391
Let a spawn icon stage take any size and turn its model on a pivot, with framing that fits a model swept through a full turn
- #390
Tighten the spawn menu: inset panels, a compact collection tree with chevrons, smaller tiles with 4px gaps, muted captions, and the selected name as the details heading
- #389
Spawn a spawn menu entry on the first press of its tile instead of the second
- #388
Record the spawn icon renderer, its cache and its timings in the spawnables scope
- #387
Add a SpawnIconSnapshot scene that opens the spawn menu, waits for its icons and reports timings, frame costs and memory
- #386
Show spawn icons on the spawn menu's tiles, with the name as a tooltip on props and under the icon for other kinds
- #385
Add a SpawnIcon GUI element, a button that shows a model's spawn icon once it's ready
- #384
Add the SpawnIcons autoload, rendering model icons on offscreen stages with async readback, caching them on disk and precaching every spawnable on mount changes
- #383
Add spawn icon keys, a fingerprinted disk cache, and camera framing that fits a model's drawn vertices and refines from a render's visible box
- #382
Add an --impact-probe MapViewer mode that drops, throws and slides props and logs the collision sounds they make
- #381
Play impact and scrape sounds when spawned props hit or slide on the world, other props or the player
- #380
Add Source's physics impact and scrape sound rules: impact volume from speed, soft or hard by hit hardness, per-frame merging, and scrape volume from friction energy
- #379
Move skin and body mesh building from PropSpawner into ModelMeshes
- #378
Let VtfFile.ToTextureData skip mips larger than a max size
- #377
Add a --pickup-probe MapViewer mode that picks up, carries, drops and throws spawned props and logs the results
- #376
Add Source-style prop pickup: E picks up liftable props and holds them in front on a spring, left click throws, E or right click drops, and props drop when blocked or stood on
- #375
Let PlayerHullTracer exclude one extra body from its traces
- #374
Add use, attack and attack2 player buttons on E, left and right mouse
- #373
Add PlayerPickupMath with Source's hold position, angle snapping, throw speed and drop error, and an implicit spring step for holding props
- #372
Mark GUI work item 6 done and record the scheme layers, scheme fonts, font icons and the HUD stat elements
- #371
Record the per-player undo list and the undo action
- #370
Add each spawned prop to the player's undo list, named Prop or after the spawnable
- #369
Give each player an undo list and an undo action on Z that removes the newest entry's nodes with Gmod's undo sound, also while the spawn menu is open
- #368
Keep the player in MapViewer screenshots with --player, so the HUD can be captured in a map
- #367
Add HUDQuickInfo, drawing health and clip brackets beside the crosshair as cropped font icons, blinking and playing the low health and ammo sounds on warnings, and dimming after a second without changes
- #366
Add UndoList, a newest-first list of named undo entries that skips entries whose items are all gone
- #365
Give PlayerController a Health of 100 and an ActiveWeapon slot for the HUD to read
- #364
Add a HudSnapshot scene that builds the HUD canvas under a test player with set health and weapon, prints scheme fonts, colors, icons and element rectangles, and saves a screenshot
- #363
Add HudHealth and HudAmmo on a HudNumericDisplay that draws scheme fonts, colors and the rounded corner background from hudlayout.res keys, reading health and ammo from an IHudPlayer ancestor
- #362
Push the opposite anchor when setting an element's left and top anchors, so right and bottom anchored layout positions don't clamp to the left edge
- #361
Read enum GUI properties from numbers written as strings, as Source layouts write PaintBackgroundType
- #360
Keep GuiLength values for GuiLength properties, reading layout strings as GUI units and Lua numbers as canvas units, and convert them through GuiCanvas.ToCanvasUnits
- #359
Render font character icons from scheme fonts into textures at the screen height, and reload the crosshair icon when the window resizes
- #358
Load ClientScheme.res fonts and CustomFontFiles into Godot fonts sized by screen height, and let Label take a scheme font name with its size, additive blending, shadow and outline
- #357
Record spawning from the spawn menu
- #356
Spawn the spawn menu's requests at the player's aim point in LocalGame
- #355
Add PropSpawner, spawning props, weapons and items as physics props from their PHY hulls, mass, skin and body groups, and refusing NPCs and vehicles
- #354
Add SpawnPlacement for Garry's Mod style spawn placement: flush against the aimed surface, facing the player, with collision bounds and body group strings
- #353
Resolve GUI color names from ClientScheme.res layered under the theme's GuiScheme colors and user://gui/ClientScheme.txt
- #352
Add GuiSchemeFile, reading ClientScheme.res colors through name references, fonts with their yres ranges and custom font files
- #351
Read a PHY solid's mass from its key values
- #350
Record the spawn menu's collection sidebar and its state
- #349
Add a collection sidebar to the spawn menu with expandable spawnlists, games and addons, showing a picked collection's tiles in sections under its headers
- #348
Feed the spawn menu every spawnable with a listed flag and the registry's collections as state, with SelectCollection
- #347
Record the spawnables registry scope and the spawn menu filling from it
- #346
Cap the spawn menu at 200 tiles with a label giving the match count
- #345
Fill the spawn menu from GameFileSystem.Spawnables on each mount change instead of the samples, with each entry's spawnlist or class category as its group
- #344
Load the SpawnableRegistry on the background mount task and expose it as GameFileSystem.Spawnables before MountStateChanged
- #343
Add SpawnableRegistry, building spawnables and collections from mounted spawnlists, each mount group's models and built-in Half-Life 2 NPCs, weapons, vehicles and entities
- #342
Give MountGroupSnapshot a display title from its game or addon info and an IsAddon flag
- #341
Add SpawnlistFile, reading Garry's Mod spawnlist files into their id, parent, name, icon, needsapp and ordered headers, models and class items
- #340
Mark GUI work item 5 done and record user layers, layout watching, origins and the debug overlay
- #339
Check the user layout layer, its origins and the debug overlay in the GUI test scene
- #338
Rebuild layout canvases from a user://gui layer when their files change, and add a gui_debug overlay on F8 that outlines elements and shows where each setting came from
- #337
Watch GUI layout and icon files alongside Lua scripts, bump a layout version on change, and read user://gui/HudTextures.txt as the last icon layer
- #336
Record the Q spawn menu toggle, its Escape handling and game input captures by owner
- #335
Toggle the spawn menu with Q in LocalGame on a layer under the pause menu, capturing game input while open and closing on Escape before the pause menu sees it
- #334
Track the file and line each GUI setting came from through KeyValues merging, layout nodes and patches
- #333
Add a toggle_spawn_menu input action on Q
- #332
Let nodes other than windows capture game input through WindowManager.CaptureGameInput and ReleaseGameInput
- #331
Record the spawn menu's state, commands and sample entries, TextBox onChange and Button wrap in the GUI scope
- #330
Drive the spawn menu from state: tiles mapped from the entries by filter and search, selection shown in the details, and a second press on the selected tile issuing spawn
- #329
Add SpawnMenu.cs as the spawn menu's command target, feeding entries and recent spawns to its state and raising SpawnRequested on the spawn command, with sample Half-Life 2 entries until real spawnlists exist
- #328
Give Button a wrap property for its text
- #327
Give TextBox an onChange handler that gets the text and the box's name, and skip setting text that hasn't changed so typing keeps the caret
- #326
Record the spawn menu port and the new GUI elements and properties in the GUI scope
- #325
Render SpawnMenu.lua against the real element registry in a test and expect no warnings
- #324
Port the spawn menu stub to SpawnMenu.lua on a GuiCanvas, keeping its fonts, hint color and centered tiles
- #323
Add Godot uid files for the new GUI elements
- #322
Add Frame, TextBox, Scroll, Flow, Grid, Split, HSeparator and VSeparator GUI elements
- #321
Give Button toggle, pressed, group, icon and iconwidth properties, with button groups kept per canvas and icon loading shared with Image
- #320
Give Label font, fontsize, valign and wrap properties
- #319
Give elements a stretch ratio and Margin per-side margin properties
- #318
Mark GUI work item 4 done and record the main menu port, mount change handling and declared property order
- #317
Keep main menu backdrops from loading in menu snapshots, pin the build number, and list windows opened by the accepted button
- #316
Port the main menu to MainMenu.lua on MenuScreen, with GuiCommand handlers in MainMenu.cs and the launch map state driving the backdrop
- #315
Register MainMenuBackdrop as a GUI element with playOnReady, and keep its veil above children added by a layout
- #314
Give Label color and linespacing properties
- #313
Set declared GUI properties before elements enter the tree, and keep built elements across mount changes, reloading icons in place
- #312
List onPress among Button's declared properties in the registry test
- #311
Record the pause menu port and the menu snapshot comparison in the GUI scope
- #310
Port the pause menu to PauseMenu.lua on a shared MenuScreen, with GuiCommand handlers in PauseMenu.cs and MenuDim in the theme's GuiScheme
- #309
Add a menu snapshot scene that opens a menu, records layout and focus, and pixel-compares screenshots against a baseline
- #308
Narrow the spawn menu mock to half the screen and stack the preview and tool options below the spawn list
- #307
Add a recoloured Dazzle star icon for the spawn menu Favorites chip
- #306
Mark GUI work item 3 done and record how canvases load, render and route Lua screens
- #305
Add a GUI test scene that presses Lua and command buttons, writes a user patch, and checks the screen reloads
- #304
Drive GUI canvases from shared Lua scripts: Screen export, kit-first loading of res:// and user:// GUI files with reload on change, dirty-screen rendering, canvas state, patches on layout canvases, onPress and GuiCommand routing
- #303
Let GUI Lua properties hold functions: keep them in Lua under their element path and call them from C# through GuiHandler
- #302
Add spawn menu mock: left drawer with search, filter chips, flowing tile grid, recent tools strip, and a preview panel with metadata and tool options
- #301
Record how GuiLua builds screens, orders children, tracks state and applies patches
- #300
Add GuiLua: a Lua DSL with element constructors, presets, units, children, map, screens with read-tracked state, and patches, producing GuiNode trees
- #299
Add GuiPatch: set properties, remove, replace and insert elements by name path, warning with the patch's origin
- #298
Place GUI elements with canvas units, GUI units, percentages and screen pixels, measured from the start, center or far edge
- #297
Read Lua tables into LuaTable snapshots, pass dictionaries, lists and references into Lua, and call Lua functions by reference
- #296
Note length snapping and automatic DSP retarget rules in the soundscape scope
- #295
Retarget automatic DSP only when the room changes shape or clearly changes size or diffusion on two samples in a row
- #294
Stop DSP zipper noise: fades snap predelay, spread and echo times to 10 ms and 0.1 steps instead of sliding them
- #293
Fade replaced and stolen world voices out over 20 ms and free them after a short silent hold instead of stopping them mid-waveform
- #292
Describe the parallel WorldReverb send in the soundscape scope
- #291
Send delay and reverb through a parallel WorldReverb bus at -6 dB: a second player per world voice feeds it, muted while the room has no delay or reverb
- #290
Record surface movement in the footsteps scope
- #289
Resolve the player's ground surface through the motor with a short-range cache and play footsteps from it
- #288
Apply the ground surface to player movement as Source does: friction scaled by 1.25 and capped at 1, maxspeedfactor on max speed and jumpfactor on jump speed
- #287
Bucket static props into a 256-unit grid for surface lookups
- #286
Mark underwater DSP done in the soundscape scope
- #285
Add the footsteps scope: surface properties, surface lookup, player and NPC footsteps, survey results and open questions
- #284
Push the water DSP preset while the player's eyes are under water
- #283
Play Source's step sound when the player jumps and on hard landings, with the landing volumes and step delay
- #282
Mark automatic DSP done in the soundscape scope
- #281
Run automatic DSP for preset 1: rays from the listener every 0.5 s, sky hits found through the BSP, smoothed into a room that picks and blends the shape templates
- #280
Soften mapped DSP: scale wet and echo levels by 0.45 with a 0.6 cap and saturate reverb room size with decay time
- #279
Play NPC footsteps from animation events: client footstep and material footstep events, sound events, and the zombie, vortigaunt, antlion, guard, hunter, strider and black headcrab handlers
- #278
Read MDL sequences with their animation events and frame rates, attachments and include models
- #277
Add AutoDsp: classify ray distances into Source's automatic room shapes, size and diffusion, and blend that shape's templates
- #276
Map reverb room dimensions, per-axis reflectivity and predelays, and size room-relative delays from the room
- #275
Play player footsteps from the ground's surface property with Source's step velocities, volumes, water, wading and ladders, and Garry's Mod's step times
- #274
Carry the contact point on HullTrace
- #273
Mark the DSP preset file and room DSP done in the soundscape scope
- #272
Cycle room DSP presets 2-29 with F6 and return to the soundscape's preset with F7 in local games
- #271
Add RoomDsp: load dsp_presets.txt, apply the soundscape's room preset to the WorldRoom effects with 1 s fades, plus an override stack with timed presets
- #270
Route world sounds through a WorldRoom bus with a disabled DSP effect chain, keeping # waves dry on World
- #269
Map DSP presets to Godot effect settings: reverb, delay, filters, chorus, distortion and gain, with cross-fade interpolation
- #268
Find the surface property under a point: brush sides through the BSP tree, displacements with surfaceprop2 by alpha, brush entities and static props
- #267
Read a PHY solid's surfaceprop from its key values
- #266
Parse Source's dsp_presets.txt into presets and processors with its symbolic values
- #265
Mark soundscape scripts, entities and playback done in the soundscape scope
- #264
Play soundscapes: env_soundscape nodes from the map pick the active soundscape, whose loops crossfade and random sounds fire around the listener
- #263
Parse surface property scripts and their manifest into a SurfacePropertyTable with vphysics' default and base inheritance
- #262
Record the LuaJIT binding spike results in the GUI scope
- #261
Add a LuaJIT 2.1 binding spike: lua51 import resolver, sandboxed chunks, C# callbacks that return errors to a Lua wrapper
- #260
Flatten soundscapes into loops and random sounds with nested volumes, position offsets and overrides
- #259
Add non-spatial ambient voices to WorldAudio and let callers play a SoundDefinition directly
- #258
Add SoundscapeSelector: sticky active soundscape, closer heard soundscapes take over, radius and line-of-sight checks
- #257
Read env_soundscape and env_soundscape_proxy entities with radius, start state and resolved position targets
- #256
Parse soundscape scripts and the soundscapes manifest into a SoundscapeRegistry with map overlays, reloaded beside the soundscripts
- #255
Pick LuaJIT 2.1 through our own C# binding as the GUI and addon Lua runtime
- #254
Keep soundscapes on for the gm_construct menu backdrop in the soundscape scope
- #253
Mark GUI work item 2 done and record how the canvas applies node trees
- #252
Build the GUI canvas from GuiNode trees through GuiDiff, with declared element properties and Panel, Label, Button, Image, Stack, Margin and Scene elements
- #251
Add GuiDiff: compare GUI node trees by name path into creates, frees, updates and moves
- #250
Add GuiNode, GuiProperty declarations with Source aliases, and GuiValues conversion for GUI property values
- #249
Scope soundscapes, env_soundscape selection and DSP presets on a WorldRoom bus
- #248
Rescope GUI screens around a Lua DSL, keeping the KeyValues path for Source .res files
- #247
Mark map ambience done in the audio scope
- #246
Spawn map ambient_generics as sound emitters and layer a map's level sounds over the soundscripts while it's loaded
- #245
Read ambient_generic entities with Source's radius-to-sound-level conversion, spawn rules and source entity origins
- #244
Mark the music subsystem done in the audio scope
- #243
Let main menu scenarios bring their own music, started with the stage and stopped when the backdrop leaves
- #242
Add MusicAudio: two decks on the Music bus with worker loading, fade-in, crossfade and stop fades
- #241
Move stream loop and level helpers out of WorldAudio into AudioStreams
- #240
Mark the world sound subsystem done in the audio scope
- #239
Play a soundscript at the crosshair with F3 and toggle a looping sound with F4 in local games
- #238
Add WorldAudio: a player per 3D sound freed on finish, a voice cap, channel rules, Source falloff, delays, loop overrides, precache and scene-change cleanup
- #237
Track playing voices with Source's exclusive channels and quietest-oldest one-shot stealing in VoiceList
- #236
Add Source's sound level falloff as SoundAttenuation: unit distance, gain and audible distance
- #235
Plan world sounds as a player per sound with a voice cap instead of a pool
- #234
Play UI sounds through one polyphonic AudioStreamPlayer instead of a pool of players
- #233
Mark the AudioManager and UI sounds done in the audio scope and settle where volumes persist
- #232
Apply and save master, world, interface and music volumes from the settings window
- #231
Add an AudioManager autoload with World, UI, Music and Dialogue buses, saved bus volumes, soundscript reloads and themed UI button sounds
- #230
Raise WindowDismissed when Escape or an outside click closes a managed window
- #229
Expose whether GameFileSystem has finished opening its mounted sources
- #228
Reload SoundRegistry scripts in place so registered sounds and level overlays survive a mount change
- #227
Run the editor's main scene with --fastlaunch
- #226
Mark soundscripts done in the audio scope
- #225
Add a SoundRegistry that loads soundscripts from mounted content, resolves names or file paths, and layers registered and level sounds on top
- #224
Parse Source soundscripts and the game sounds manifest into sound definitions with channel, volume, pitch and level ranges
- #223
Add --fastlaunch to cut scene changes and show the menu backdrop without fades
- #222
Mark sound asset loading done in the audio scope
- #221
Load sounds from mounted games as WavFile, SoundData and Godot AudioStream assets, converting WAV, MP3 and Ogg
- #220
Parse Source sound characters into SoundFlags with SoundName and use it to normalize sound asset keys
- #219
Record the crosshair's fixed screen-pixel size in the GUI scope
- #218
Draw the HUD crosshair at its pixel size in screen pixels, snapped and unfiltered, as Source does
- #217
Mark the HUD canvas and crosshair done in the GUI scope and match it to the code
- #216
Draw Garry's Mod's crosshair from a GUI canvas on the player HUD, placed by hudlayout.res
- #215
Read VGUI layout and icon files with #base, per-key layering and Source positions
- #214
Mark the WAV reader done in the audio scope and correct the WAV format survey
- #213
Decode every WAV shipped with Garry's Mod in a real-install test that reports formats and loop markers
- #212
Size PCM WAV frames from channels and bit depth, since Valve's combined VO files store a block size of 1
- #211
Add a WAV reader that decodes PCM, float and MS ADPCM to 16-bit samples and loops from the first cue point to the end
- #210
Scope a VGUI-compatible GUI definition system, starting with a player HUD crosshair
- #209
Scope an AudioManager autoload with world, UI, music and dialogue subsystems that loads sounds and soundscripts from mounted games
- #208
Add a pause menu to local games that pauses the tree on Escape or Start, with resume, settings, main menu and quit actions
- #207
Keep WindowManager and its windows processing while the scene tree is paused
- #206
Move the main menu title, root margin, shade and button style into a shared GameTitle scene, MenuShade texture and theme variations
- #205
Pause menu stub
- #204
Chore: Formatting
- #203
Add a --map= launch option that skips the main menu and starts a local game on that map
- #202
Give Garry's Mod search paths a gmod path ID and document mount prefixes on asset names
- #201
Let asset names take a <path id>: prefix that limits resolving to that mount
- #200
Turn off physics interpolation on the skybox camera, which follows the main camera in _Process
- #199
Defer filling a mount tree folder until after the expand click so Godot allows creating its items
- #198
Add movement lab tests for walking and stopping on a floor at -144 and for trace hits stopping 1/64 unit or more off floors and walls
- #197
Hold hull trace hits 1/32 unit off the surface so Jolt still sees ground the hull rests on
Jolt's cast_motion ignores a surface the shape already touches within its collision tolerance. Stick-to-ground snapped the hull flush to the floor, so the next ground trace passed through it, the player went airborne on flat ground and drifted without friction.
- #196
Chore: Formatting
- #195
Document how main menu scenarios are found, picked and written
- #194
Play a looping gm_construct scenario behind the main menu, built off the main thread and faded in under a left-side shade
- #193
Add main menu scenarios: Source map and packed scene types, camera rigs with a looping Lissajous sway, and a registry that picks by priority and weight
- #192
Add a SourceMapInstance node that disposes its SourceMap when freed
- #191
Add a Files tab to the mount manager that lists the selected game's mounted files, or all mounted content when no game is selected
- #190
Highlight game cards on hover and let them toggle a selected state
- #189
Load the chosen map with one local player at a random info_player_start when hosting
- #188
Add a marker for every info_player_start instead of only the first
- #187
Lock the host window's settings and focus the Host button
- #186
Disable the Join and Server Browser buttons on the main menu
- #185
Add the Godot UID for the Steam BBCode converter
- #184
Show the expand button on every mount card, with a local detail panel for addons without Steam data
- #183
Track a build ID that increments on each compile, log it to Builds/build_history.csv, and show it in the main menu footer
- #182
Fade mount card borders on hover and expand Workshop cards into a Steam detail panel
- #181
Set the project version and show it in the main menu subheader
- #180
Write the bullet trim's tab as an escape
- #179
Convert Steam Workshop BBCode to Godot rich text and plain text
- #178
Read Workshop subscriber, favorite and view counts and the creator, with page links
- #177
Move mount counts into the Loaded and Failed buttons and toggle them to filter the card list
- #176
Replace the mount tree with addon cards that show Steam Workshop titles and previews, local thumbnails and a show-in-folder button
- #175
Decode thumbnails by their file signature, with GIF support
- #174
Add a GIF decoder that reads the first frame into RGBA pixels
- #173
Add Godot UIDs for the addon info and workshop cache scripts
- #172
Read addon titles, tags and thumbnails from addon.json, addon.txt and GMA headers into mount snapshots
- #171
Read the preview metadata through a pattern so the cache hit compiles without a nullable warning
- #170
Add a Steam Workshop cache that batches item details and stores resized previews
- #169
Move credits from a main menu button into a Settings tab
The Credits tab lists the studio line and third-party attributions, with links that open in the browser.
- #168
Ignore window rects smaller than their contents and skip windows.cfg in headless runs
A headless run has a 64x64 root, so clamping saved 1x1 sizes that later opened windows at 1x1 in the real game.
- #167
Open the mount manager from the main menu's Edit Mounts button instead of Settings
The window has no owner, so it stays open across scene changes like the F2 toggle. Settings loses its Content tab.
- #166
Mount window style and layout
- #165
Toggle the mount manager on F2 and remember window positions in windows.cfg
- #164
Block player and fly camera input and free the mouse while a managed window is open
- #163
Remove the unused Main boot scene
The game launches into MainMenu, and the mount manager opens from Settings.
- #162
Wire the main menu to its windows and launch into it
MainMenu opens each window through WindowManager with itself as owner, routes browser picks into the join window as its child, and answers host and join requests with a not-implemented status.
- #161
Add a stub settings window with a link to the mount manager
Video, audio, controls and content tabs. Apply only logs the values for now. The content tab opens the mount manager as a child window.
- #160
Add stub host, direct join and public server browser windows
Each window raises a request event (HostRequested, JoinRequested, ServerChosen, DirectConnectRequested) and shows a status line. The browser lists placeholder servers until a master server exists.
- #159
Add a deferred focus helper for controls in managed windows
- #158
Close managed windows with their parent window or owner node, children first
- #157
Main menu stub
- #156
Add a SceneManager autoload with threaded scene loading and a fade transition
ChangeScene loads through ResourceLoader's threaded loader while a SceneTransition plays on a canvas overlay. A transition decides when the swap happens: Swap frees the old scene first, SwapLayered parks it live in a SubViewport shown under the overlay so mask transitions can blend both scenes. FadeTransition is the default: fade to black, swap, fade back.
- #155
Add Godot UIDs for the window option scripts
- #154
Dismiss managed windows on outside clicks and Escape, with modal and dimmed backdrop options
- #153
Mark window manager core done in its scope
- #152
Open the mount manager through WindowManager instead of placing it in main.tscn
- #151
Add a WindowManager autoload that owns overlay window lifetime and stacking
- #150
Scope a root-level window manager for overlay and config windows
- #149
Mount Half-Life 2, its episodes and Lost Coast as separate games
- #148
Add a theme preview scene covering the themed controls
- #147
Apply the base theme project-wide and replace per-node overrides with theme variations
- #146
Flesh out the base theme with component styleboxes, flat control icons and a shared palette
- #145
Add Game Library sidebar with Steam thumbnail game cards to the mount manager
- #144
Add Steam CDN asset cache with ETag revalidation and hash-based busting
- #143
List mounted games with AppID, title and mount path on the mount plan
- #142
Spawn the player at info_player_start in the map viewer, keeping the fly camera for --fly and screenshots
- #141
Add player probe that drives a scripted walk and reports stuck and ground stats
- #140
Add a resizable full height sidebar to the game mount manager window
- #139
Add movement lab course with headless movement checks
- #138
Add player controller node, camera, default input actions and HL2, Gmod and view presets
- #137
Port Source player movement: walk, air, step, slide, duck, water, ladder and noclip
- #136
Add player hull tracer over Jolt shape casts in Source units
- #135
Add player movement and view settings resources and the player command
- #134
Add a Player collision layer
- #133
Show live mount state in the game mount manager window
- #132
Raise MountStateChanged after GameFileSystem opens mounted sources
- #131
Add mounted path state and a mount snapshot for viewing live mount state
- #130
Replace the window close icon with a recoloured Dazzle xmark
- #129
Give embedded windows a title bar and frame through central window styleboxes
- #128
Formatter
- #127
Theme
- #126
Add game mount manager window mock under UI/GameMounts and instance it in main
- #125
Fonts and attrib
- #124
Add collision bodies for map brushes, displacements, brush entities and static props
- #123
Build BSP collision models with shared shapes
World brushes match Valve's PHYSCOLLIDE solids on all 80 installed GMod and HL2 maps.
- #122
Read PHY collision models and the PHYSCOLLIDE lump
- #121
Remove duplicate and contained hulls and merge boxes whose union is a box
- #120
Build convex hulls from brush planes
- #119
Share the displacement grid between meshes and collision
- #118
Mark engine mount config and boot done in the Gmod mount scope
- #117
Boot GameFileSystem through the Gmod mount plan with user://mounts.cfg
- #116
Add GarrysModMounter running locate, discover, config, plan and apply
- #115
Add engine mount config layered over Garry's Mod's cfg files
- #114
Document the Gmod mount plan order and the floating addon finding in the scope
- #113
Test the Garry's Mod mount plan against the installed game
- #112
Add Garry's Mod mount plan ordering addons, workshop, game, mount.cfg, depots and fallbacks
- #111
Create parent folders in the GMA and VPK test writers
- #110
Let source-based Mount carry a GameInfo
- #109
Move mountable VPK rules into VpkFiles for reuse outside gameinfo resolution
- #108
Discover floating GMAs in addons and gamemode content folders
- #107
Mark mount groups done in the Gmod mount scope
- #106
Replace MountedGame with mount groups built from any sources, ordered by priority
- #105
Render the 2D sky and composite the 3D skybox
SourceMap loads the worldspawn skyname faces (falling back from _hdr to the LDR names), splits world faces, brush entities and static props in the sky_camera's area into a separate skybox scene, and SkyboxView draws that scene from sky_camera.origin + camera / scale into a SubViewport shown as the background canvas layer, behind the main world.
- #104
Add sky shader that samples Source skybox faces
Converts the view direction to Source axes, picks the face with the skybox table and stretches half-height side faces over the upper half.
- #103
Find the 3D skybox camera and assign faces to BSP areas
Adds point-in-leaf lookup, face areas from the centroid nudged along the face normal, a sky_camera reader, and a face filter for the mesh builder. All 57 installed maps with a 3D skybox put it in an area apart from the player start.
- #102
Add Source skybox face layout
Faces are rt, lf, bk, ft, up, dn for +X, -X, +Y, -Y, +Z, -Z, with each face's s/t axes from Source's sky table. Colours match across cube edges on the HL2 skies (seam difference 1.0-3.6 against 6.5-33 for the Quake 2 order or a rotated up face), and the sun in the HL2 sky textures lines up with each map's light_environment (median 23 degrees over 70 maps, 77-117 for mirrored or turned skies).
- #101
Add BC1, BC2 and BC3 block decoder to RGBA8
- #100
Correct the Gmod mount scope with the depot table and mount rules from filesystem_stdio
- #99
Test depot table against installed Garry's Mod and Half-Life 2
- #98
Add Garry's Mod depot table taken from filesystem_stdio and locate depot folders
- #97
Expose install path lookup by AppID on GameLocator
- #96
Load and render BSP maps with a map viewer scene
SourceMap loads the BSP through the asset cache, mounts its pakfile at the head of the GAME search path while loaded, builds the lightmap atlas and per-map lightmapped materials, and instantiates the world, brush entities, static props and spawn marker. MapViewer loads a map with a fly camera and can save a screenshot from the command line.
- #95
Add lightmapped world material with generated shader variants
Unshaded spatial shader that multiplies albedo by the lightmap on UV2, with variants for alpha test, blend, additive, double-sided and the WorldVertexTransition blend by vertex alpha. The shader code is built in C# and cached per variant.
- #94
Map VMT blend textures, tint, unlit, additive and water onto MaterialData
- #93
Test Garry's Mod content discovery against the installed game
- #92
Discover Garry's Mod depots, mount.cfg, workshop items and legacy addons
- #91
Test GMA reader against installed Garry's Mod workshop addons
- #90
Convert Source pitch/yaw/roll angles to Godot rotations
- #89
Add GMA archive reader as a file source for Garry's Mod addons
- #88
Move ArchiveEntryStream's Godot uid file with it
- #87
Move VPK entry stream to IO as ArchiveEntryStream for reuse by other archives
- #86
Add BSP lightmap atlas and lightmap UVs
Decodes RGBExp32 luxels, sums enabled light styles (named styles stay off when every light using them starts dark), prefers HDR lighting, and shelf-packs faces with a 1-luxel border, bump pages side by side and a white rect for unlit faces. BspMeshBuilder fills TexCoords2 and puts the bump page offset in CUSTOM0 when given an atlas. Displacement luxel coordinates follow the grid rather than the lightmap vectors: on gm_construct, lighting across displacement seams differs by 0.008 with the grid mapping and 0.74 with it transposed.
- #85
Add Garry's Mod mount scope
- #84
Add second UV set and a float CUSTOM0 channel to MeshSurface
- #83
Add BSP reader with entities, static props, pakfile and mesh builder
Reads BSP 18-22 headers in both lump orders, decompresses LZMA lumps, and exposes typed planes, texdata, faces, edges, models, nodes, leafs, brushes, displacements, cubemaps and game lumps. Parses the entity lump, static props versions 4-11, and the pakfile as a mountable file source with stored, Deflate and LZMA entries. BspMeshBuilder turns a brush model into MeshData with displacements, UVs, tangents and displacement alpha. Face normals come from the face's plane: across the installed GMod and HL2 maps the winding matches the plane on 99.9% of faces, while the side byte disagrees on 39%.
- #82
Add optional tangents and vertex colours to MeshSurface
- #81
Add LZMA1 decoder for Valve LZMA streams and a CRC32 helper
Tested against raw LZMA1 streams from Python's lzma module with three lc/lp/pb settings.
- #80
Give GameFileSystem an asset cache with Source and Godot loaders registered
- #79
Load shipped Garry's Mod models with materials and textures through the asset cache
- #78
Register VTF, VMT and MDL data loaders on the asset cache
- #77
Track file reads in asset loaders so mount changes revalidate them
- #76
Add MDL, VVD and VTX readers with a studio model mesh builder
Reads MDL 44-49 headers, bones, textures, skin families and body parts, VVD vertices, tangents and fixups, and VTX strip groups in the classic and v49 topology layouts. StudioModel checks the files agree, picks the skin, body group and LOD, unrolls strips, resolves materials through the texture directories and builds MeshData in Godot space.
- #75
Use bare texture names in VMT MaterialData to match asset keys
- #74
Add VMT reader with conditions, shader fallbacks and patch materials
Evaluates DX/GPU/CPU level blocks, cond?$key keys and _dx9/_hdr_dx9 fallback blocks, follows patch include chains with insert and replace, and exposes typed parameter helpers, proxies, texture transforms and a MaterialData mapping.
- #73
Add KeyValues option to close unterminated sections at end of file
Source keeps what it parsed when a file ends inside a section; shipped VMTs such as props_lab/tank_glass001_dx60.vmt rely on that.
- #72
Register Godot texture, material and mesh loaders on the asset cache
- #71
Add asset cache with shared loads, cached failures and mount-aware revalidation
- #70
Add asset resolver mapping Source asset names to mounted files
- #69
Read unquoted brackets as values unless they start with $ or !
VMTs write vectors such as $color [1 0.5 0] without quotes, which the tokenizer used to read as a condition.
- #68
Add VTF reader with resource parsing, mip layout and pixel conversion
Reads VTF 7.0-7.5 headers, the 7.3+ resource dictionary, envmap face counts and volume slices, and converts each supported image format to TextureData with the largest mip first. Adds Rg8, Rf, Rgbf, Bc4 and Bc5 to TextureFormat for UV88, R32F, RGB323232F, ATI1N and ATI2N.
- #67
Add GameFileSystem autoload owning the MountedFileSystem and mounting installed known games
- #66
Add VTF/VMT, MDL and BSP format reference notes from toy-lab
- #65
Cleanup
- #64
Parse VPK header and directory tree with SpanReader
- #63
Add Formats test project guarding the formats namespace against Godot types
- #62
Add thin Godot conversion layer from format data to Image, ArrayMesh and StandardMaterial3D
- #61
Let SpanReader report offsets relative to an enclosing file
- #60
Add Godot-free shared texture, mesh and material data for format parsers
- #59
Test SpanReader primitives, strings, slicing and corrupt input
- #58
Add bounds-checked little-endian SpanReader for binary formats
- #57
Add xUnit test project for the game mounter
- #56
Add mounted file system resolving paths across games by search path ID
- #55
Read VPK v1/v2 directories and open entries from search paths
- #54
Add file source abstraction with case-insensitive loose directory source
- #53
Resolve gameinfo.txt search paths into typed, ordered entries
- #52
Locate external games by AppID, starting with Garry's Mod
- #51
Add Steam install locator using registry, libraryfolders.vdf and app manifests
- #50
Add KeyValues parser with conditions, escapes, #base and #include
- #49
Enable nullable reference types
- #48
C# and rider setup
- #47
Stub layout
- #46
C#
- #45
Going to remove this stuff for now and focus on engine infra
- #44
creature crawler body pitch and roll ride the same leg spring, rocked by each footfall and by touchdowns that land on one side first
- #43
creature crawler legs hold the body up with a spring-damper scaled by how many feet support it, so landings sag and rebound and each footfall dips the body into a walking bob
- #42
creature crawler body falls under gravity until enough legs support it or its belly rests on something, and legs search inward for footholds when their home spot is over empty space
- #41
creature crawler body pivot eases its height and tilt toward a plane fitted through the feet, leaving the root transform to the user
- #40
creature crawler legs step when they drift from home or strain, predicted from the body's motion, never alongside a neighbouring leg, along an arc to a raycast landing ahead of the body, settling when it stops
- #39
crawler terrain test scene with a floor, a ramp and three boxes under the crawler's feet
- #38
creature crawler plants feet by raycasting from each home spot onto ground colliders, falling back to the idle ground height, with a replant button
- #37
creature crawler legs respect hip, knee, ankle and foot joint limits via a search from the previous pose, and report a strain value with an optional debug tint
- #36
creature crawler plants feet in world space and re-poses legs as the body moves, swinging hips toward feet within a limit and bending the femur to keep reach between fold and stretch limits
- #35
creature crawler thickness taper control for how fast legs thin as more are added
- #34
creature crawler spaces any number of legs per side along a curve through the front, middle and back sockets, blending spread and size along it and thinning legs as they crowd
- #33
creature crawler places six legs on the torso leg sockets and solves each into a spider idle stance toward a foot target marker on the ground
- #32
creature crawler tool script builds the torso and snaps the head to its head socket, rebuilding live in the editor without saving the parts into the scene
- #31
crawler torso head socket moved back and down to where the head sits in the crawler layout
- #30
import settings for crawler leg
- #29
crawler leg glb: spike leg hanging from a hip origin, skinned to a femur, tibia, metatarsus and tarsus chain with a tip marker bone
- #28
import settings for crawler head
- #27
crawler torso uses the head's body material
- #26
crawler head glb: open-mouthed head facing -z with its origin at the back of the head for the torso head socket
- #25
import settings for crawler torso
- #24
crawler torso glb: sculpted torso facing -z with head socket and front, mid and back leg socket pairs
- #23
creature creator assembles a proto creature from body, jaw and mirrored leg parts on body bone attachments, standing on a floor
- #22
import settings for body and leg parts
- #21
leg part glb: hip-origin leg facing +y with thigh, shin, foot and a sole marker bone
- #20
body part glb: capsule skinned to a centre-rooted spine with per-vertebra girth bones and head/tail sockets
- #19
jaw glb imports without tangents since it has no uvs
- #18
jaw part glb with tooth and head shape blend shapes
- #17
creature creator view tools get a kill/revive toggle for the preview creature
- #16
crawler ragdolls on death through physical bones on their own layer, and wander holds still while it is dead
- #15
crawler becomes a skinned skeleton rig: a lumpy flesh core with raised leg sockets, legs built once in a standing rest pose and posed each frame by a gait SkeletonModifier3D
- #14
creature creator previews a wandering crawler on a collidable floor under a key light, driven by the crawler body sliders
- #13
crawler wander paces its parent between random nearby points with pauses
- #12
crawler grows seeded IK legs and a strand-knot body, steps feet to raycast targets with neighbour-gated gait, lead, skitter and twitch, and meshes itself every frame
- #11
tube mesher sweeps capped catmull-rom tubes with parallel-transport rings, per-point radius and vertex colour
- #10
hud layout fits the wide pixel font: body sliders sit under their labels, headers use theme header sizes, button rows get wider gaps
- #9
hud uses a base theme with the BigBlueTerm font and flat bordered panels
- #8
spider body type renamed to crawler
- #7
viewport camera orbits with left drag and keeps momentum after release, scroll zooms smoothly between distance limits
- #6
behaviour drawer starts collapsed, collapse/expand button toggles it and dragging the split opens it or snaps it closed at its minimum
- #5
viewport gets a 3d floor plane with an anti-aliased grid that fades radially into the clear color, framed by a camera lens-shifted onto the viewport hole
- #4
body panel drops the tab container background so its rows get the panel padding like the organs panel
- #3
creator panes sit in split containers so body, viewport, organs and behaviour can be resized by dragging
- #2
creature creator hud layout: type tabs, body panel per type, organ palette, part inspector, behaviour graph drawer
- #1
godot 4.7 project with an empty creature creator scene