2025-10-21

Written: 2025-10-21
Project: Project Fragmentation

  • Settings Float Widget will now show a rounded version of the value in Raw mode if the step value is a whole number
  • Fixed audio bus volume’s not being updated initially and not applying their loaded setting until the value had been adjusted at least once.
  • Created DisplayManager autoload. Moved the fullscreen logic out of GameManager to it.
  • Added a bunch of low-hanging-fruit options:
    • Added the gameplay_fov option. UI slider covers range 60 to 100 in increments of 1
    • Added the gameplay_camera_shake option. Starts enabled. Currently disables wind shake at high speeds if turned off.
    • Added the gameplay_walk_by_default option. Starts disabled. Inverts walk behaviour.
    • Added the gameplay_auto_bhop option. Stards enabled. When disabled, jumping only ever triggers when a jump is buffered and pressing jump on the ground does buffer a jump.
    • Added the display_fullscreen option and added it to UI. Previous fullscreen toggle bind has been moved from T to Alt+Enter as would be standard
    • Added the display_vsync option and added it to the UI. Starts enabled.
    • Added the display_max_fps option. UI Slider covers the range 30 to 240 in increments of 10. Starts at 120
  • Removed the “release_mouse” binding now that pausing always frees the mouse
  • Added a “quit to desktop” button to the options menu so the game can be closed from fullscreen
  • Settings heading section spacing is no longer hardcoded at 25
  • Added custom icons for settings widgets and audio players
  • OptionEntry now supports can_be_not_set. Options set this way support being saved as null. Null values are saved to the ini file as the “UNSET”
    • Caveat: optional settings must be typed as Variant instead of a static type, or setting to null doesn’t work
  • Options will now log and reset values from the config which have an incompatible value (e.g from manual tampering)
  • Options supports adding new OptionEntries programatically. Dynamically named options have their values stored in RUNTIME_ADDED_OPTION_VALUES as new properties can’t be set if they’re not defined in the code at compile time
  • Options now has get_option, functions similar to get but will check if the property exists in RUNTIME_ADDED_OPTION_VALUES first.
  • Options now has input_event_to_bindstring() and bindstring_to_input_event() to convert InputKeyEvent and InputMouseButtonEvents to and from a simple string form (e.g. “key_w”, “key_space”, “mouse_left_button”, “mouse_wheel_up”, etc)
  • Options now automatically generates primary and alternative input_keybind_<action> options for all actions in the InputMap (except for those in HIDDEN_BINDS) on start . Default primary and secondary bindings are based on what’s configured in the InputMap
    Screenshot of options.cfg
  • Whenever an input_keybind_<action> option is updated, the InputMap is updated to match
  • Added bind action primary_button [secondary_button] to update keybinds conveniently.
  • Added unbind action to clear bindings for an action
  • Fixed an bug where pressing jump for a single frame didn’t trigger the jump (is_action_pressed triggers the frame after is_action_just_pressed if its still held down). This has the knock-on effect of allowing jump on mouse wheel actions, which has interesting results

what if a bug had a website

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