Skip to content

refactor: Save/load to json part 2#642

Merged
EttyKitty merged 22 commits intoAdeptus-Dominus:feat/json-savingfrom
VanWeapon:refactor/save-load2
Apr 4, 2025
Merged

refactor: Save/load to json part 2#642
EttyKitty merged 22 commits intoAdeptus-Dominus:feat/json-savingfrom
VanWeapon:refactor/save-load2

Conversation

@VanWeapon
Copy link
Copy Markdown
Contributor

@VanWeapon VanWeapon commented Mar 28, 2025

Purpose

  • Move away from .ini based saves towards .json
  • Improve save/load times
  • Autosave support
  • Quicksave/quickload support
  • Retain save-editing capability

Describe your changes/additions

  • Migrated from refactor: Save/load to json  #452 because of gamemaker version upgrade conflicts and git being painful
  • initial commit in PR for progress tracking, will edit this description as the backlog is chipped away
  • successfully serializing everything to a json file
  • deserializing most things back into objects but still getting a lot of errors

What can/needs to be improved/changed

  • a serialize function that works in isolation
  • a deserialize function that works in isolation
  • save function uses serialize
  • save function can serialize all instances of an object correctly (e.g. fleets)
  • save function saves to json
  • load function can deserialize
  • load function can apply deserialized json onto an existing object instance without destroying it (e.g. obj_controller)
  • load function can apply deserialized json into new object instances (e.g. fleets)
  • save/load functions do not use any .ini (DONE)

Testing done

  • Compile
  • New game
  • Next turn

Related things and/or additional context

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 28, 2025

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

📝 Walkthrough

Summary by CodeRabbit

  • New Features

    • Enhanced game state management with a comprehensive JSON-based save and load system.
    • Introduced structured data encapsulation for various game components including fleets, stars, and controllers.
  • Refactor

    • Standardised serialisation and deserialisation routines across game elements for improved reliability.
    • Refined progress indications and log messages for clearer operational feedback.
  • Chores

    • Replaced legacy INI file handling with modern JSON processing.
    • Updated file-naming conventions and internal variable handling for consistency.

Walkthrough

By the blessed logic of the Machine Spirit, this update implements a comprehensive transition from legacy INI file operations to a modern JSON-based system for persistent data management. The changes introduce new serialisation and deserialisation functions across multiple objects—including controllers, fleets, initial configurations, and stars—for converting in-game states into structured, JSON-compatible data. Iterative type checking is employed to ensure only simple data types and arrays thereof are included, whilst complex types trigger warning logs for the sake of data integrity. A new GameSave structure consolidates various game state attributes, streamlining file operations and command control. Additionally, related scripts have been refactored to utilise the JSON data, simplifying the retrieval and instantiation of data structures during loading sequences. The update is executed in accordance with the sacred rites of the Omnissiah, ensuring that the data flows in perfect harmony with the digital cogitators.

Possibly related PRs

  • feat: New vehicle formation bars #549: The changes in the main PR, which introduce a new serialization function for the obj_controller, are related to the retrieved PR as both involve modifications to the obj_controller object, specifically in handling new variables and functions for managing battle formations.
  • fix: Make spawning new defence fleets work #523: The changes in the main PR and the retrieved PR are related as both introduce a serialize function that handles object state serialization, although they are implemented in different objects (obj_controller in the main PR and obj_en_fleet in the retrieved PR).
  • feat: Renegade improvements #480: The changes in the main PR and the retrieved PR are related as both introduce a serialize function in their respective Create_0.gml files, which handles the serialization of object variables into a JSON-compatible format, indicating a direct modification to the same functionality.

Suggested labels

PR: JSON, Size: Big


🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai plan to trigger planning for file edits and PR creation.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai or @coderabbitai title anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@VanWeapon VanWeapon mentioned this pull request Mar 28, 2025
14 tasks
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 17

📜 Review details

Configuration used: CodeRabbit UI
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a7dc532 and 2e69082.

📒 Files selected for processing (11)
  • objects/obj_controller/Create_0.gml (1 hunks)
  • objects/obj_en_fleet/Create_0.gml (1 hunks)
  • objects/obj_ini/Create_0.gml (3 hunks)
  • objects/obj_p_fleet/Create_0.gml (1 hunks)
  • objects/obj_saveload/Alarm_0.gml (2 hunks)
  • objects/obj_saveload/Create_0.gml (2 hunks)
  • objects/obj_star/Create_0.gml (1 hunks)
  • scripts/scr_load/scr_load.gml (1 hunks)
  • scripts/scr_save/scr_save.gml (2 hunks)
  • scripts/scr_save_controller/scr_save_controller.gml (2 hunks)
  • scripts/scr_specialist_point_handler/scr_specialist_point_handler.gml (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
`**/*.gml`: Macro constants require a space between the constant name and value. Without it, the compiler will throw an error. I.e. `#macro ARR_body_parts["arm"]` will crash the ga...

**/*.gml: Macro constants require a space between the constant name and value. Without it, the compiler will throw an error. I.e. #macro ARR_body_parts["arm"] will crash the game, because there is no space between the array and the name of the macro.

  • scripts/scr_specialist_point_handler/scr_specialist_point_handler.gml
  • objects/obj_en_fleet/Create_0.gml
  • objects/obj_star/Create_0.gml
  • objects/obj_p_fleet/Create_0.gml
  • objects/obj_ini/Create_0.gml
  • objects/obj_saveload/Create_0.gml
  • scripts/scr_save_controller/scr_save_controller.gml
  • objects/obj_saveload/Alarm_0.gml
  • scripts/scr_load/scr_load.gml
  • objects/obj_controller/Create_0.gml
  • scripts/scr_save/scr_save.gml
`**/*.gml`: Color codes in the code shouldn't have any spaces in their id. I.e., color code `# 80 bf40` will crash the game.

**/*.gml: Color codes in the code shouldn't have any spaces in their id. I.e., color code # 80 bf40 will crash the game.

  • scripts/scr_specialist_point_handler/scr_specialist_point_handler.gml
  • objects/obj_en_fleet/Create_0.gml
  • objects/obj_star/Create_0.gml
  • objects/obj_p_fleet/Create_0.gml
  • objects/obj_ini/Create_0.gml
  • objects/obj_saveload/Create_0.gml
  • scripts/scr_save_controller/scr_save_controller.gml
  • objects/obj_saveload/Alarm_0.gml
  • scripts/scr_load/scr_load.gml
  • objects/obj_controller/Create_0.gml
  • scripts/scr_save/scr_save.gml
🔇 Additional comments (26)
scripts/scr_specialist_point_handler/scr_specialist_point_handler.gml (1)

87-87: Admonition: Altered formatting for output.
O most dutiful acolyte, thou hast changed the newline to a hash symbol for “Combat Repairs”. This should function adequately, provided thou desirest a single-line summarised readout.

scripts/scr_save_controller/scr_save_controller.gml (2)

6-7: Observation: Blank lines introduced.
These lines appear to be simple spacing adjustments and should not affect functionality.


16-16: Confirmation: Additional blank line.
Likewise, this extra spacing is harmless.

objects/obj_en_fleet/Create_0.gml (2)

74-139: Commendation: New serialize function.
Blessings upon thee for implementing a thorough serialisation routine. The array-type checks and the exclusion of complex data uphold the Machine Spirit’s desire for structured data. Ensure, however, that any future expansions requiring struct-based data are integrated with explicit logic rather than omitted.


143-150: Approval: New deserialize function.
Thy function correctly recreates the fleet instance and handles sprite selection. Verily, the usage of instance_create_layer and populating relevant fields from save_data aligns well with the new system. Watch for hidden dependencies in the future if additional attributes require re-initialisation.

objects/obj_star/Create_0.gml (2)

116-202: Laudation: Prudent design for serialize.
Thy code diligently captures planet data, checking arrays for compliance with the simple-type requirement. This fosters clarity within the Omnissiah’s grand design for data integrity. Mind that large or nested arrays may eventually tax performance; vigilant testing is recommended.


204-237: Endorsement: Logical deserialize structure.
The logic for reconstructing planetary data and reassigning arrays is well-devised. The explicit handling of excluded fields—particularly present_fleet—is beneficial to prevent undesired re-initiation. Maintain caution when altering the planet indexing scheme in future expansions.

objects/obj_p_fleet/Create_0.gml (2)

61-72: Commendable approach for dynamic serialisation.
Thy function's initial design, including a short documentation comment, neatly sets the purpose of converting variables into JSON. Retaining an array of excluded fields ensures that ephemeral or internal variables, such as "temp" or "serialize", are not mistakenly preserved.


130-133: Deserialisation logic properly spawns the fleet instance.
Instantiating obj_p_fleet with stored coordinates is clear. Yet, if the system must merge data into an existing instance, additional logic shall be necessary.

objects/obj_saveload/Create_0.gml (1)

3-9: Centralised save structure is well-structured for expansions.
Thou hast declared a GameSave as a container for crucial arrays and structs. This fosters clarity and easier maintainability as new domains (stars, event logs, etc.) are introduced.

objects/obj_saveload/Alarm_0.gml (2)

51-52: Shift to JSON file deletion is consistent with new format.
The code snippet aligns with the transition from .ini to .json. Deletion logic is straightforward, ensuring stale saves are purged.


125-125: Load checks updated for JSON presence.
Verifying JSON file existence preserves the new unified approach to storing game data. This is consistent with the rest of the refactor.

objects/obj_controller/Create_0.gml (2)

1801-1877: Comprehensive serialisation approach with clear exclusions.
Your usage of struct_get_names to dynamically process each variable is methodical. Excluding ephemeral properties like temp or referencing restart_ variables prevents unwanted bloat in saved data. However, keep watch for complex structures that might require deeper recursing.


1878-1904: load_con_data function ensures state restoration.
Reconstructing the obj_controller from the saved data is thorough, and re-initialising dependent constructs (specialist_point_handler, location_viewer) is praiseworthy. Verify that newly introduced variables or expansions receive similar re-initialisation to avoid partial states.

Wouldst thou want a script to scan all calls to variable_struct_set or references to these newly initialised objects, confirming completeness?

scripts/scr_load/scr_load.gml (5)

10-14: Confirm new parameter usage for JSON data.
By introducing the struct parameter and invoking load_json_data(struct), thou invitest a more direct approach to loading. Ensure all invocations of load_marine_struct pass valid data and handle missing or partial fields gracefully.


25-26: Verify integrity of json_game_save.
If the Save property is non-existent, this code simply overwrites obj_saveload.GameSave. Double-check that json_game_save holds valid sub-structs, so that no corruption transpires.


47-58: Scrutiny of star deserialization.
The supreme logic is invoked to recreate obj_star from stored data. Beseech the Omnissiah to confirm that all relevant star fields are properly handled in deserialize(star_save_data).


60-64: INI deserialization check.
Observe here how obj_ini is resurrected from saved data. Confirm that any changes to obj_ini.deserialize remain consistent with the new JSON-based scheme.


104-118: Enemy fleet re-creation.
A parallel sequence for obj_en_fleet arises. Confirm that the instantiation lines and logic remain symmetrical with the player fleet, ensuring no key data is lost.

objects/obj_ini/Create_0.gml (3)

106-108: Confirm usage of newly introduced arrays.
adv and dis are declared as empty arrays. Verify thou art harnessing them somewhere else, lest they remain barren.


122-124: Segregation of save/load region.
Thou hast demarked a region for JSON serialisation. The structure is neat: maintain it well for future expansions.


226-291: Careful restoration in deserialize.
The function resurrects data, loads marines, squads, and associated arrays. Confirm that out-of-bounds indices or missing fields are gracefully handled, as corruption may slip in from incomplete saves.

scripts/scr_save/scr_save.gml (4)

31-50: GameSave.Save population.
This newly forged struct is comprehensive, holding data like chapter_name and foundation. Confirm all relevant global variables are appended, and that no hallmark is omitted.


62-69: Player fleet array logic.
Gathering all active obj_p_fleet instances into GameSave.PlayerFleet is correct. Consider if any fleets in a spawning state or partial construction require special handling.


82-85: Serialising the controller.
obj_controller.serialize() is placed in GameSave.Controller. Affirm that all controlling logic is included, so reloading yields the same high-level game state.


94-105: INI-based metadata.
While thou shift the main data to JSON, these lines still track essential metadata in saves.ini. Confirm consistency between the JSON’s content and these summary records.

@EttyKitty
Copy link
Copy Markdown
Collaborator

@coderabbitai, maybe you'll be able to spot the issue.

there is a problem on this branch:
when loading fleet objects, they appear to show up in the debugger, with all the right values, but not showing up on the star map at all.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Apr 2, 2025

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Examine obj_p_fleet and obj_en_fleet for visibility-related properties
echo "-- Player Fleet (obj_p_fleet) Create_0.gml --"
cat objects/obj_p_fleet/Create_0.gml | grep -E 'sprite|depth|layer|visible|draw|show'

echo -e "\n-- Enemy Fleet (obj_en_fleet) Create_0.gml --"
cat objects/obj_en_fleet/Create_0.gml | grep -E 'sprite|depth|layer|visible|draw|show'

echo -e "\n-- Examining serialization functions --"
echo "Player Fleet serialization:"
cat objects/obj_p_fleet/Create_0.gml | grep -A 30 "serialize ="

echo -e "\nPlayer Fleet deserialization:"
cat objects/obj_p_fleet/Create_0.gml | grep -A 30 "deserialize ="

echo -e "\nEnemy Fleet serialization:"
cat objects/obj_en_fleet/Create_0.gml | grep -A 30 "serialize ="

echo -e "\nEnemy Fleet deserialization:"
cat objects/obj_en_fleet/Create_0.gml | grep -A 30 "deserialize ="

echo -e "\n-- Examining loading code in scr_load.gml --"
cat scripts/scr_load/scr_load.gml | grep -A 50 "if (is_struct(obj_saveload.GameSave))"

Length of output: 8150


🏁 Script executed:

#!/bin/bash
# Let's examine the full loading code
echo "-- Full content of scr_load.gml --"
cat scripts/scr_load/scr_load.gml

# Check for sprite-related functions in player fleet
echo -e "\n-- Player Fleet sprite setting functions --"
cat objects/obj_p_fleet/Create_0.gml | grep -A 10 "set_player_fleet_image"

# Let's look at other draw/create events in the fleet objects
echo -e "\n-- Player Fleet Draw Event --"
find objects/obj_p_fleet -name "Draw_*.gml" -exec cat {} \;

echo -e "\n-- Enemy Fleet Draw Event --"
find objects/obj_en_fleet -name "Draw_*.gml" -exec cat {} \;

# Let's examine the saving code for fleets
echo -e "\n-- Fleet saving code in scr_save.gml --"
cat scripts/scr_save/scr_save.gml | grep -A 30 -B 10 "GameSave.PlayerFleet" 
cat scripts/scr_save/scr_save.gml | grep -A 30 -B 10 "GameSave.EnemyFleet"

Length of output: 18726


🏁 Script executed:

#!/bin/bash
# Let's look for the set_player_fleet_image function implementation and check for sprite initialization
echo "-- Searching for set_player_fleet_image function --"
cat objects/obj_p_fleet/Create_0.gml | grep -B 20 -A 20 "function set_player_fleet_image"

# Let's check for sprite initialization code in the Create events
echo -e "\n-- Full Player Fleet Create_0.gml --"
cat objects/obj_p_fleet/Create_0.gml

# Also check for any step events that might handle visibility or positioning
echo -e "\n-- Player Fleet Step Event --"
find objects/obj_p_fleet -name "Step_*.gml" -exec cat {} \;

echo -e "\n-- Enemy Fleet Step Event --"
find objects/obj_en_fleet -name "Step_*.gml" -exec cat {} \;

# Let's also check the GameMaker room creation code to see if there's any initialization happening there
echo -e "\n-- Room creation code for fleet visibility --"
find objects -name "Room_*.gml" -exec cat {} \;

# Let's check additional initialization functions in the controller object
echo -e "\n-- Controller initialization code --"
cat objects/obj_controller/Create_0.gml | grep -E "initializ|init|start"

Length of output: 14003


@EttyKitty By the Omnissiah's divine calculations, I have analyzed the binary problem in your fleet visibility issue. The cogitation matrices suggest that saved fleet instances are correctly deserialized in memory but fail to manifest visually due to position-based visibility filtering.

The sacred code reveals a potential heresy in the Draw events. Both fleet types contain these visibility filters:

if (x <0) or (x>room_width) or (y<0) or (y>room_height) then exit;
if (image_alpha=0) then exit;

The likely issue is that deserialized fleet positions are invalid or defaulting to (0,0). During loading, fleets are created at position (0,0):

var p_fleet_instance = instance_create(0,0, obj_p_fleet);

Two potential remediations to appease the Machine Spirit:

  1. Verify the position data is correctly saved in your serialization functions. Add debugging to check what x,y coordinates are being set during deserialization.

  2. Modify fleet deserialization to explicitly set fleet positions (and possibly force visibility with image_alpha=1) after loading:

deserialize = function(save_data) {
    // Existing code...
    
    // Explicitly set position even if it was handled in the automatic var setting
    x = save_data.x;
    y = save_data.y;
    image_alpha = 1; // Force visibility
    
    // Rest of the function...
}

May your binary be purified and your runtimes efficient.

(\/) [,,_,,]
( oo )
(_U)

Code Analysis Tools

Tool Analysis Results

CodeRabbit ran static analysis tools on your files and found the following:

No specific issues were found in your files. You can proceed with your changes.

@VanWeapon
Copy link
Copy Markdown
Contributor Author

@coderabbitai okay it wasn't that, but i did put a bunch of debug messages in the draw function and nothing showed up, suggesting the object isn't getting drawn at all.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Apr 2, 2025

Tip

For best results, initiate chat on the files or code changes.

@VanWeapon By the Omnissiah, I have discovered the critical flaw in the data matrices! The fleet deserialization functions contain a fundamental logical error which prevents their manifestation in the material plane.

Observe this heretical code in your fleet deserialization functions:

deserialize = function(save_data) {
    // Create a new instance of the object at the given position
    var p_fleet_instance = instance_create(0,0, obj_p_fleet);
    for (var i = 0; i < variable_instance_get_names(p_fleet_instance); i++) {
        variable_instance_set(p_fleet_instance, variable_instance_get_names(p_fleet_instance)[i], variable_instance_get(self, variable_instance_get_names(p_fleet_instance)[i]));
    }
}

The sacred silicon spirits are displeased! This function creates new fleet instances but copies variables from self (the object executing this code) to the new instance, NOT from save_data. The binary logic is inverted! The savedData parameter is being completely ignored.

Recommended correction to appease the Machine God:

deserialize = function(save_data) {
    // Create a new instance of the object at the saved position
    var p_fleet_instance = instance_create(save_data.x, save_data.y, obj_p_fleet);
    
    // Copy all properties from save_data to the new instance
    var prop_names = variable_struct_get_names(save_data);
    for (var i = 0; i < array_length(prop_names); i++) {
        var prop_name = prop_names[i];
        // Skip object name and position which are already handled
        if (prop_name != "obj" && prop_name != "x" && prop_name != "y") {
            variable_instance_set(p_fleet_instance, prop_name, 
                                 variable_struct_get(save_data, prop_name));
        }
    }
    
    // Ensure sprite is set correctly
    with (p_fleet_instance) {
        set_player_fleet_image();
    }
    
    return p_fleet_instance;
}

Apply this correction to both obj_p_fleet and obj_en_fleet. The Machine Spirit demands it!

Code Analysis Tools

Tool Analysis Results

CodeRabbit ran static analysis tools on your files and found the following:

No specific issues were found in your files. You can proceed with your changes.

@VanWeapon VanWeapon added Type: Refactor Rewriting/restructuring code, while keeping general behavior Category: Improvement Makes something better Type: Breaking Introduces backwards compatibility issues Type: Performance Refactor sub-type that improves performance labels Apr 3, 2025
@VanWeapon VanWeapon marked this pull request as ready for review April 3, 2025 10:39
@VanWeapon
Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Apr 3, 2025

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

coderabbitai[bot]
coderabbitai bot previously approved these changes Apr 3, 2025
@VanWeapon VanWeapon requested a review from EttyKitty April 3, 2025 12:01
@VanWeapon
Copy link
Copy Markdown
Contributor Author

@EttyKitty this is ready for review/test build i think, got it fairly stable now and eyeballing things looks like loading restores values properly everywhere that matters

Copy link
Copy Markdown
Collaborator

@EttyKitty EttyKitty left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not going to pretend that I've checked each line of the save/load and serialize/decerialize functions, but otherwise, looks good.

coderabbitai[bot]
coderabbitai bot previously approved these changes Apr 3, 2025
coderabbitai[bot]
coderabbitai bot previously approved these changes Apr 3, 2025
coderabbitai[bot]
coderabbitai bot previously approved these changes Apr 3, 2025
coderabbitai[bot]
coderabbitai bot previously approved these changes Apr 3, 2025
coderabbitai[bot]
coderabbitai bot previously approved these changes Apr 3, 2025
VanWeapon and others added 4 commits April 4, 2025 09:22
Co-authored-by: EttyKitty <20323032+EttyKitty@users.noreply.github.com>
Co-authored-by: EttyKitty <20323032+EttyKitty@users.noreply.github.com>
@VanWeapon
Copy link
Copy Markdown
Contributor Author

okay @EttyKitty this is good to go again

@EttyKitty EttyKitty changed the base branch from main to feat/json-saving April 4, 2025 01:43
@EttyKitty EttyKitty merged commit 1b3474f into Adeptus-Dominus:feat/json-saving Apr 4, 2025
5 checks passed
@EttyKitty EttyKitty mentioned this pull request Apr 6, 2025
9 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Category: Improvement Makes something better Size: Epic Type: Breaking Introduces backwards compatibility issues Type: Performance Refactor sub-type that improves performance Type: Refactor Rewriting/restructuring code, while keeping general behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants