Devlogs

Short updates for what I've done on a given day

2025-10-20 - Project Fragmentation

  • Added Options autoload. Manages automatically saving and loading configuration values to user://options.cfg and emitting signals when any value changes
  • Added options_set and options_get commands for manually interacting with option values
  • Added options_dump to print all options in the config
  • Added options_save and options_reload to update values to and from file
  • Player mouse sensitivity now tracked as the input_mouse_sensitivity option. Command i_mouse_sensitivity now updates this option.
  • UI crosshair toggle now tracked as the gameplay_show_crosshair option. Command r_show_crosshair now updates this option.
  • Speedrun mode and Timetrial mode now disable all cheats, not just noclip.
  • Added a debug build only command force_cheats to reenable cheats when they wouldn’t otherwise be available.
  • Added ch_ prefix to all cheats other than noclip
  • Added ch_free_slide_boost, disables slide boost cooldown. (just for fun :3)
  • Updated both AudioMultiPlayer classes to support setting a specific bus
  • Added SoundFX and Ambience audio busses and configured all emitters to use one
  • Added audio_master_volume, audio_sfx_volume and audio_ambience_volume options.
  • Added AudioManager autoload, currently just responsible for setting the bus volumes based on their Option value
  • Added option for mouselook inverted y. Added input_mouse_invert_y option to set it.
  • Spent a bunch of time defining several UI widgets for a settings menu!
    • Added BooleanSettingsWidget and FloatSettingsWidget for automatically reading and updating a setting
    • Added SettingsSectionHeader for subtitles
  • GameManager now handles pausing and unpausing the game via escape. Pausing currently just displays settings.
  • Mouse capture code has now been moved to the GameManager

2025-10-19 - Project Fragmentation

  • Added Cooldown to automatically manage a timer that can be triggered and cancelled.
  • Added CooldownThresholdTrigger, for triggering one or more signals at specific points during a cooldown.
  • Fixed the bug with slide boost recharge not being interrupted by respawning by stripping out the old _execute_after_delay system with a Cooldown
  • Replaced the checkpoint zone sfx cooldown timer with a Cooldown

2025-10-18 - Project Fragmentation

  • Updated the original map to the new system of lightmap layers
  • Added time trial triggers to the original map
  • Forced respawn (from trigger_respawn) is now also deferred to GameManager
  • Hitting a respawn trigger in timetrial mode will now attempt to respawn you at the last checkpoint.
  • The default respawn/segmented run behaviour is now “Practice mode”. Added tt_practice to toggle practice mode. When practice mode is disabled, all respawns are replaced with return to start. This enforces that all runs are valid
  • Added r_show_crosshair. Toggles visibility of a 2px square in the center of the screen. Starts disabled
    alt text
  • Hitting a force respawn in speedrun_mode now correctly restarts the level
  • Timetrial UI now shows the stored best time next to the current time
    best time ui
  • Fixed depth sorting on fogplanes so they now appear correctly behind checkpoint zones
  • Removed hardcoded player spawn for the original map, now uses an info_spawnpoint. Also rotated it to be slightly more forgiving
    alt text
  • Added env_lightblocker. Uses very tiny lightmap size to still effect shadows and is manually hidden after bake via script. Once #96538 is fixed this won’t be necessary.
    alt text
  • Added AudioMultiPlayer and AudioMultiPlayer3D. Automates playing sounds across cycling set of AudioStreamPlayers to get multi-sample polyphony.
  • Massive refactor of PlayerController.gd, reduced linecount by 50%
    • Moved all sound related code out of PlayerController.gd into PlayerSoundManager.gd and switched to using the above mentioned AudioMultiPlayers. (Reduced PlayerController.gd by ~250 lines)
    • Migrated all the state specific logic out of PlayerController.gd into PlayerAirState, PlayerSlideState, PlayerLedgeGrabState, etc. (Reduced PlayerController.gd by ~250 lines)

2025-10-17 - Project Fragmentation

  • Added info_spawnpoint.
  • trigger_timetrial_checkpoint now has a name and links up to two followup
  • Added trigger_timetrial_start. Almost identical to trigger_timetrial_checkpoint except green and triggers trigger_time_trial_start when the player leaves its Area3D.
  • Added PlayerStateSnapshot for stashing and restoring things about the player (position, speed, state, various cooldowns). Used to rewinding back to the moment the player reached a timetrial checkpoint
  • Slide Boost Reacharge prompt no longer plays if slideboost has already restored before the cooldown ran out
  • Respawn actions are now managed by the GameManager. Depending on input, Player will call either perform_short_respawn_action or perform_long_respawn_action. GameManager will then either defer back to Player for default behaviour, or intervene for speedrun or timetrial mode behaviour.
  • Added new timetrial_restart input, bound to “F”
  • Added most of the timetrial mode implementation!
    • Split times are stored for each checkpoint. A set of “ephemeral splits” are stored for any run in progress, and on a completed run if the ephemeral times are better than the existing best run, the new times are used instead.
    • Supports respawning at the last checkpoint, rolling back to the previous checkpoint, and restarting from scratch. Uses trackmania style splits (the run continues but won’t store a time if you respawn or roll back), useful for practicing.
    • To avoid depth-test issues, only one set of timetrial volumes are shown at a time, reaching a checkpoint hides itself and reveals the next set of volumes, etc etc.
    • UI scene now has TimeTrialUI to manage timetrial specific widgets.
    • Added tt_clear_splits to manually clear splits without reloading.
    • Each checkpoint gets its own split time, but histories are not currently differentiated by route (e.g. A -> B -> C and A -> D -> C both share the same time for C, despite route snot necessarily being the same length)
      • I’ll fix this in the future but its a low priority, linearity is fine for now and i don’t wanna burn more time on this system
    • Splits are not saved right now, times reset on load. This will depend on me solving the routes issue.

2025-10-15 - Project Fragmentation

  • Added r_drawhud command for disabling the hud (for screenshots mostly)
  • Added trigger_timetrial_checkpoint as a brush entity definition so I can place them in trenchbroom.
    • They don’t have any configuration yet, but they do correctly replace their material with the shader version
  • Figured out how to get the dual-layer material with a single mesh by using next_pass, the inner material with front culling has the outer material with back culling marked as the next pass
  • Created test_timetrial, which is just a corridor with two slightly different routes, to help me test the upcoming work for checkpoint times/splits and multiple routes
    screenshot
    screenshot2


what if a bug had a website

emily/chloe
it/its/she/her
occasional maker of things and poster of thoughts