Skip to content

Conversation

@LifeHckr
Copy link
Contributor

@LifeHckr LifeHckr commented Apr 3, 2025

Reworks note system and arrow system, adds hold notes.

Fixes #108
Fixes #106

Summary by CodeRabbit

  • New Features
    • Introduced refreshed UI elements, including enhanced title and options menus that offer smoother navigation and improved visual feedback.
    • Added new gameplay elements for handling hold notes, providing more responsive input and refined visual effects.
  • Refactor
    • Streamlined code architecture and improved resource management for better performance and maintainability.
    • Standardized asset naming and updated resource paths for a more consistent visual experience.
  • Documentation
    • Expanded in-app documentation and summaries for enhanced clarity and ease of maintenance.

LifeHckr added 19 commits March 17, 2025 23:52
Reorganized scenes to have more reasonable structure, and pollute high level Scenes folder less

Naming conventions:
Folders and files should start capitalized
For images or other non-script file types use underscore to separate a category/type and the asset name itself
Name's themselves should not have underscores
Added IFocusableMenu
Implemented on menus that pass back and forth focus and handle processmode
Threaded preloading experiment
Volume now uses linear2db ad db2linear for simplified use.
Remove string paths in load into class dependent LoadPath attribute
Add LiveInstance to StageProducer to avoid tree lookup
ChartLength no longer needs to be divided by two lol
NoteArrows loop across their own interval, no longer needing an extra visual arrow
Created beat struct to more effectively handle beat and loop comparisons.
TimeKeeper and related infrastructure now keep track of loops.
NoteArrows handle their own misses
Auto miss dif is now more strictly >= one whole beat
Related funcs now take beat structs
*Also refined comboText to use Timing*

Still need to rework storing notes to add
Some add note functions still need ints
NoteArrow's handle their own auto miss and registering to be hit
Arrows are no pooled and spawned on demand instead of looping endlessly
CM purely handles spawning and pooling arrows
CD manages NoteArrowData for knowing when to spawn notes, and managing calculating timing
BattleDirector purely handles battle related things
Will work on documentation
Most floats are changed to doubles for precision security

*Also changed rewardSelect to use Stages instead of string*
I did it.
Will need to test other edge cases.
Also will need to readjust chart to make lengths < 1, otherwise too many notes will be hold notes.
Cleaned up charts for easier editing
Length taken into account, length and start pos snapped to eighth notes
Make sure all fields that were unreasonably not fitting standards, fit.
Some things should reasonably stay public, and some typical C# naming conventions broken, e.g. CD, BD, UI being full caps

Rename "ArrowData" and "NoteArrowData" to "CheckerData" and "ArrowData" for clarity
All functionality should still be 1:1
Split some smaller chunks into functions
Reorganized, and slightly refactored scripts

Made StageProducer 1% more self contained
Battle stage selection and reward items are now different based on room selected.
E.g. Two sibling chest rooms now have different item selections
Note Arrows are no longer moved as a modulo of playback position.
Moved song variables from chart manager to TimeKeeper, added more easy access song time properties
Renamed ChartLength to ChartWidth for clarity (mainly using length with time properties)
Round spawnbeat to CD to help handle slight float weirdness, which caused skipped notes
Slightly fixed up midi's
Some notes towards the end of the chart would loop with song position and not pool

Extra safety check purely based on enough beats passing, should replace later. 8 beats is arbitrary, though with reasonable chart length and bpm should not cause visual issues
@coderabbitai
Copy link

coderabbitai bot commented Apr 3, 2025

Walkthrough

This pull request implements extensive refactoring and organizational updates across the codebase. Core game logic classes and engine modules have been restructured with improved encapsulation, new event handling, and revised timing/beat calculations. Additionally, many resource import configurations and scene file paths have been standardized to a consistent naming convention and directory structure. Minor documentation, XML comments, and UI focus management improvements have been applied throughout, contributing to clearer, more maintainable code.

Changes

File(s) Change Summary
Core Gameplay & Engine Logic
(e.g. .../Classes/MidiMaestro/MidiMaestro.cs, .../Globals/StageProducer.cs, .../BattleDirector/scripts/BattleDirector.cs, .../Conductor.cs, .../ChartManager.cs, .../InputHandler.cs, .../NoteArrow.cs, .../Cartographer.cs, etc.)
Refactored properties and method signatures; introduced new types (e.g. Beat, CheckerData); updated event handlers for note hit/miss and improved timing, note spawn, and input handling logic.
UI & Scene Organization
(e.g. .../Scenes/UI/Options/*, .../Scenes/UI/TitleScreen/*, .../ChestScene/*, .../Maps/cartographer.tscn, etc.)
Standardized resource paths (casing, directory structure) and node properties; introduced new UI classes implementing IFocusableMenu; revised layout properties and focus management for seamless scene transitions.
Asset Import Configurations
(e.g. all *.import files in .../Assets/ under Scenes & SharedAssets, deletion of Enemy1.png.import)
Renamed and relocated texture, audio, font, and CSV import configuration files; updated unique identifiers, source and destination paths to conform with new naming conventions and directory structures.
Miscellaneous & Documentation
(e.g. LanguageSelection.cs, EnemyEffect.cs, NoteChecker.cs, Funk Engine.csproj)
Added XML and summary documentation comments; removed unused using directives; simplified code references to improve clarity and maintainability.

Sequence Diagram(s)

sequenceDiagram
    participant P as Player
    participant IH as InputHandler
    participant NC as NoteChecker/NoteArrow
    participant CM as ChartManager
    participant C as Conductor

    P->>IH: Press note key (Timing enum)
    IH->>NC: Invoke FeedbackEffect(ArrowType, Timing)
    NC->>CM: Trigger hit/miss event\n(CheckMissed, CheckHittable)
    CM->>C: Request note spawn/recycling
    C->>CM: Update beat/timing and spawn next note
Loading

Assessment against linked issues

Objective ([#108], [#106]) Addressed Explanation
Ensure long hold notes are not positioned using modulo-based calculations so they don’t pool before completion.
Prevent near-beat auto-spawned notes from popping in abruptly.

Poem

Oh, how I hop through lines of code so neat,
Refining notes and beats with every rhythmic beat.
Paths realigned and variables set anew,
With clarity and focus—what a breakthrough!
I’m the coding rabbit, leaping high and true!
🐇✨

✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 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 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.

Copy link

@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: 8

🔭 Outside diff range comments (2)
scenes/NoteManager/scripts/InputHandler.cs (1)

15-41: 💡 Verification agent

🧩 Analysis chain

Verify usage of new CheckerData type.
Using CheckerData in place of the previous data structure aligns with the new design. Ensure that any references to ArrowData are updated across the codebase to avoid mismatches or missing properties.


🏁 Script executed:

#!/bin/bash
# Description: Searching for references to the old ArrowData type
# in order to verify that all references are updated to CheckerData.
rg "ArrowData"

Length of output: 2819


Action Required: Update Legacy ArrowData References

The new implementation in InputHandler.cs correctly uses the CheckerData type. However, the repository still contains multiple references to the old ArrowData type. Please verify whether these references are intended to coexist with CheckerData or if a complete migration is required. Notable instances include:

  • scenes/NoteManager/scripts/NoteArrow.cs
    • Usage in field declarations and method parameters.
  • scenes/BattleDirector/scripts/BattleDirector.cs
    • Several method parameters and condition checks still reference ArrowData.
  • scenes/ChartViewport/scripts/ChartManager.cs
    • Several methods accept or instantiate ArrowData.
  • scenes/BattleDirector/scripts/Conductor.cs
    • Contains lists and delegate definitions using ArrowData.
  • Scenes/NoteManager/Scripts/HoldArrow.cs
    • Uses ArrowData in the initialization method.
  • Globals/FunkEngineNameSpace.cs
    • Definition of the ArrowData struct and associated properties/methods.

Please ensure that these are updated to use CheckerData or that a proper conversion mechanism is established to avoid mismatches or missing properties in the data flow.

Globals/StageProducer.cs (1)

142-158: 🛠️ Refactor suggestion

Blocking the main thread with _loadTask.Wait().
Invoking _loadTask.Wait() on Godot’s main thread can freeze the game if the task takes long. Consider using Godot signals or an await pattern to prevent blocking the UI.

🧹 Nitpick comments (46)
Funk Engine.csproj (1)

12-14: Update CSV file reference to align with new directory structure.
The new <Content Include="Globals\Translations\translations.csv" /> correctly moves the translations file into the updated directory. However, note the potential inconsistency in filename casing: the referenced file here is translations.csv (all lowercase) while other parts of the project (see the .import file) refer to Translations.csv (with an uppercase "T"). This may lead to issues on case-sensitive file systems.

scenes/ChestScene/ChestScene.cs (1)

23-29: Consider optimizing focus management.

The current implementation calls ChestButton.GrabFocus() every frame in _Process when the button is enabled. This approach might be inefficient.

Consider moving this to an event-based approach:

public override void _Ready()
{
    _player = GD.Load<PackedScene>(PlayerPuppet.LoadPath).Instantiate<PlayerPuppet>();
    AddChild(_player);

    ChestButton.Pressed += GetLoot;
+   ChestButton.GrabFocus();
}

public override void _Process(double delta)
{
-   if (!ChestButton.Disabled)
-   {
-       ChestButton.GrabFocus();
-   }
}

Or if you need to regain focus when the button becomes enabled, implement a method that specifically monitors state changes instead of checking every frame.

Scenes/NoteManager/HoldArrow.tscn (1)

22-26: Consider adding documentation for the RemoteTransform2D configuration

The RemoteTransform2D is correctly configured to update only position, but this design decision isn't immediately obvious.

 [node name="TrailTransform2D" type="RemoteTransform2D" parent="."]
 remote_path = NodePath("../CometTail/TrailRemote")
 update_rotation = false
 update_scale = false
+# Note: Only position updates are needed as rotation is handled separately
Globals/FunkEngineNameSpace.cs (4)

19-21: Inconsistent naming in doc comment
Doc comment references "ArrowData" but the struct is named "CheckerData" (line 22). Consider updating the doc comment to match the struct name.


22-28: CheckerData struct fields
Consider adding a constructor and/or per-field doc comments to improve clarity.


41-43: Possible doc comment mismatch
Doc comment says "NoteArrowData" while the struct is labelled "ArrowData" at line 44. Rename for consistency.


111-204: Beat struct operator precedence
GetBeatInSong() uses % TimeKeeper.BeatsPerSong only on (Loop * TimeKeeper.BeatsPerLoop). If you intend to apply the modulo to the entire expression, wrap in parentheses.

scenes/ChartViewport/scripts/HitParticles.cs (1)

3-5: Documentation Comment Enhancement
The added documentation comment improves clarity by summarizing the purpose of the class. Consider aligning with C# conventions by using triple-slash comments (e.g., /// <summary>...</summary>) for consistency with typical C# documentation styles.

Classes/Relics/RelicEffect.cs (1)

5-7: Enhanced Class Documentation
The new documentation comment clearly explains the role of the RelicEffect class. This additional context helps future maintainers understand the class's purpose. Verify that this style is consistent with the rest of the project’s documentation.

Classes/Relics/RelicTemplate.cs (1)

9-9: Good encapsulation improvement with readonly modifier

Making the Effects array readonly prevents its reference from being reassigned after initialization, which is a good encapsulation practice.

Note that while the array reference is now immutable, the contents of the array can still be modified. Consider returning a defensive copy or using IReadOnlyList for complete immutability if that's desired.

scenes/Puppets/Enemies/EnemyPuppet.cs (1)

5-5: Field renamed from _battleEvents to BattleEvents

The protected field has been renamed from the conventional _battleEvents (with underscore prefix) to BattleEvents (pascal case). While this is functionally equivalent, it's unusual to see protected fields with pascal case in C#.

Consider converting this to a proper property with a getter for better encapsulation:

-protected EnemyEffect[] BattleEvents = Array.Empty<EnemyEffect>();
+protected EnemyEffect[] BattleEvents { get; private set; } = Array.Empty<EnemyEffect>();
Classes/MidiMaestro/SongTemplate.cs (1)

8-12: Inconsistent immutability in struct fields

Only AudioLocation and EnemyScenePath are marked as readonly, while Name, MIDILocation, and SongData remain mutable. For structs, it's generally better to make all fields readonly to ensure full immutability and prevent unexpected behavior.

-    public string Name;
+    public readonly string Name;
     public readonly string AudioLocation;
-    public string MIDILocation;
+    public readonly string MIDILocation;
     public readonly string EnemyScenePath;
-    public SongData SongData;
+    public readonly SongData SongData;
Classes/Notes/Note.cs (1)

72-75: Consider making the player note check more robust

The IsPlayerNote() method relies on a string contains check which could be fragile if naming conventions change.

Consider using a case-insensitive comparison for more robustness:

public bool IsPlayerNote()
{
-    return Name.Contains("Player");
+    return Name.Contains("Player", StringComparison.OrdinalIgnoreCase);
}

Alternatively, a more structured approach might be to use an enum or a dedicated property to identify note types, which would be less dependent on naming conventions.

scenes/NoteManager/scripts/InputHandler.cs (3)

60-60: Reminder: Implement the TODO.
You’ve noted a plan to emit a control scheme signal rather than querying every frame. This could improve performance and clarity.

Would you like help implementing a signal-based approach so that input mode changes are only computed upon event triggers?


82-88: Check for toggling behavior.
Switching to "CONTROLLER" mode on the first joypad press might conflict if a user then presses arrow keys afterward. Consider whether you need a cooldown or detection approach to prevent frequent toggles back and forth.


90-113: Consider adding feedback for “Miss” timing.
At present, the code returns with no effect for Timing.Miss. Providing minimal negative or distinct visual feedback might improve the user experience.

 default:
-    return;
+    // Optionally add a "miss" effect
+    particleAmount = 2;
+    break;
scenes/BattleDirector/NotePlacementBar.tscn (1)

90-102: CPU particles usage for _fullBarParticles.
Using CPU particles might be a stylistic choice or necessary for the desired effect. Just confirm it’s intentional compared to GPUParticles2D.

Globals/TimeKeeper.cs (1)

9-16: Consider validating new static fields.
All these fields (e.g., CurrentTime, SongLength, LoopsPerSong) are publicly settable, which could lead to unexpected states (like zero or negative values).

+public static double CurrentTime { get; set; } = 0;
+private static double _songLength; 
+public static double SongLength
+{
+    get => _songLength;
+    set => _songLength = Math.Max(0, value);
+}
Globals/SaveSystem.cs (1)

70-71: XML documentation for AssertConfigFile could be more descriptive

While adding documentation is good, consider elaborating on the purpose and behavior of this method beyond just restating the code logic.

-/**<remarks>Either returns, loads current config, or if no config found inits one.</remarks>
+/**
+ * <summary>Ensures config file is available for operations</summary>
+ * <remarks>Either continues execution if config is already loaded, loads existing config, 
+ * or initializes a new one if no config file exists.</remarks>
 */
Scenes/UI/TitleScreen/Scripts/TitleScreen.cs (6)

6-12: Validate exported fields for null.
Although these fields are likely set within the Godot Editor, it’s safer to validate TextLight and Options in _Ready() to detect missing or unassigned nodes and avoid null reference issues.

 public override void _Ready()
 {
+    if (TextLight == null || Options == null)
+        GD.PushError("TextLight or Options is not assigned!");

     TweenLight();
     Options.Pressed += OpenOptions;
 }

14-15: Ensure _focused is valid during resume.
When resuming focus, _focused may be null if nothing was focused before PauseFocus(). Consider handling that scenario gracefully or defaulting to a known control.


23-28: Graceful fallback if _focused is empty.
If _focused is null, calling _focused.GrabFocus() will throw. Consider verifying _focused before accessing it or defaulting to the first focusable child.


40-44: Confirm the design choice to block returning here.
ReturnToPrev() also shows a warning. If the TitleScreen is truly the root, returning to it might be valid in certain flows. Revisit if needed.


45-52: Consider caching the loaded scene.
GD.Load<PackedScene>(OptionsMenu.LoadPath) is called each time the Options button is pressed. If performance or memory thrashing becomes an issue, you could cache the PackedScene in _Ready().


63-67: Check for BgAudioPlayer availability.
BgAudioPlayer.LiveInstance might be null if it has not yet been instantiated in the scene. Consider logging or gracefully handling that scenario.

scenes/BattleDirector/scripts/Conductor.cs (5)

20-38: Avoid re-initialization calls.
The check if (_initialized) return; is good. Make sure any subsequent re-initialization attempts are either blocked or safely reset. Also, consider verifying StageProducer.Config.CurSong is never null.


57-63: Efficient initial spawning.
SpawnInitialNotes loops up to _beatSpawnOffset and spawns notes for each beat. This approach is fine for small ranges, but if _beatSpawnOffset grows large, consider a more targeted spawning strategy.


107-116: One-liner arrow update logic.
Reconstructing the ArrowData (line 110+) is a valid approach for incrementing the loop, but it can be confusing. Consider a method on ArrowData that returns a new arrow with incremented loops.


118-125: Player note deduplication.
A duplicate note triggers an error. If duplicates are expected or appear often due to user input, you may want a more user-friendly approach like ignoring duplicates silently or merging them.


133-139: Double-check multi-loop timing.
GetTimingDif returns 1 if loops differ, but that’s a broad fallback. If the difference can be multiple loops, consider adjusting.

Classes/MidiMaestro/MidiMaestro.cs (2)

16-17: Be cautious about static properties in multi-file usage.
TempoMap and TimeSignature being static may cause unexpected behavior if multiple MIDI files are loaded consecutively in the same session. Always confirm that reassigning these properties at runtime won't conflict with other parts of the application.


26-29: Constructor documentation is helpful.
The documentation clarifies how a valid MIDI file path is required, which helps developers avoid misuse. Consider adding an exception note if the file is invalid or unreadable.

Scenes/UI/Remapping/ControlSettings.cs (1)

10-19: Renamed exported properties and backing fields.
Exported Sprite2D fields (LeftKey, RightKey, etc.) follow proper C# naming conventions. This improves readability and maintainability.

Consider documenting what each exported property represents (e.g., key sprite placeholders) to help new contributors.

scenes/ChartViewport/scripts/ChartManager.cs (3)

19-24: Introduction of arrow pools.
Reusing NoteArrow and HoldArrow objects is an efficient way to reduce garbage collection. Make sure to verify that all arrow states are fully reset in Recycle().


26-27: Consider making _chartLength configurable.
Hardcoding _chartLength = 2500 can cause unexpected constraints if your chart or level design requirements vary.


191-197: OnArrowMissed calls NoteHit().
Misnamed function might be confusing—“missed” logically differs from “hit.” If NoteHit() is your cleanup or finalize logic, consider renaming it to reflect a neutral outcome or a consistent “miss.”

- noteArrow.NoteHit();
+ noteArrow.ComputeMiss();
Globals/StageProducer.cs (1)

24-28: Centralized static references.
Storing Config, PlayerStats, and ContrastFilter statically suggests a strong global approach. This can be fine for a small codebase but can introduce fragility in larger projects. Monitor maintainability closely.

Consider whether these are truly global or could be injected/managed by a dedicated game state container.

scenes/NoteManager/scripts/NoteArrow.cs (1)

19-21: Consolidated ArrowData usage

Exposing Data publicly while also providing Beat and Type from the same struct is neat. Consider marking Data as read-only or using a private setter to prevent external mutations if immutability is desired.

scenes/BattleDirector/scripts/BattleDirector.cs (1)

31-31: Timing interval

Currently set to 0.1. Consider aligning it with BPM or configuring it externally for different difficulty levels.

scenes/BattleDirector/scripts/NotePlacementBar.cs (7)

6-9: Consider expanding the class summary and addressing the TODO comment.
The current docstring is quite brief, and the TODO suggests a future integration with the player. Providing more details (e.g., how the bar interacts with gameplay flow) may help other developers quickly understand its purpose.


10-27: Validate the usage of double vs. float and refine the inline comment.
Godot typically uses float-based properties for UI components (like TextureProgressBar), so confirm that double precision is truly necessary. Also, the comment //This is so goated might be unclear or unprofessional in production code. Consider replacing it with a more descriptive note or removing it altogether.

-            _particles.Emitting = CurrentBarValue >= MaxValue; //This is so goated
+            _particles.Emitting = CurrentBarValue >= MaxValue; // Emission depends on reaching max capacity

49-52: Leading spaces may be unnecessary.
_currentComboMultText.Text = $" x{ComboMult.ToString()}" adds fixed spacing. If indentation is desired, consider using UI layout features (e.g., margins or alignment) rather than string padding.


55-61: Extract magic numbers into configurable properties.
MaxValue = 80 and _notesToIncreaseCombo = 4 might be worth exposing as [Export] fields to allow tuning without code changes.


177-185: Consider preventing negative bar values in extreme cases.
If a placed note’s CostModifier is greater than 1, CurrentBarValue -= placedNote.CostModifier * MaxValue could drop below 0. This might be intended, but if not, clamp CurrentBarValue to a minimum of 0.

-        CurrentBarValue -= placedNote.CostModifier * MaxValue;
+        CurrentBarValue = Math.Max(
+            0,
+            CurrentBarValue - placedNote.CostModifier * MaxValue
+        );

187-197: Timing handler effectively routes to Hit/Miss methods.
This simplified structure is clean. Consider logging or visual feedback for debugging missed vs. hit cases.


216-244: Shake mechanic adds a nice “juice” to the UI.
The approach in ProcessShake is appropriate for occasional camera or control node “wobble.” If you want smoother or more continuous shaking behavior, consider removing or tweaking the _limiter modulus.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 6a25c58 and a7c8c04.

⛔ Files ignored due to path filters (41)
  • Classes/Notes/Assets/Note_PlayerBasic.png is excluded by !**/*.png
  • Classes/Notes/Assets/Note_PlayerDouble.png is excluded by !**/*.png
  • Classes/Notes/Assets/Note_PlayerHeal.png is excluded by !**/*.png
  • Classes/Notes/Assets/Note_PlayerQuarter.png is excluded by !**/*.png
  • Classes/Notes/Assets/Note_PlayerVampire.png is excluded by !**/*.png
  • Classes/Relics/Assets/Relic_Auroboros.png is excluded by !**/*.png
  • Classes/Relics/Assets/Relic_Colorboros.png is excluded by !**/*.png
  • Scenes/BattleDirector/Assets/NoteQueue_Frame.png is excluded by !**/*.png
  • Scenes/NoteManager/Assets/Arrow_Trail.png is excluded by !**/*.png
  • Scenes/Puppets/Enemies/BossBlood/Assets/Boss1.png is excluded by !**/*.png
  • Scenes/Puppets/Enemies/BossBlood/Assets/Boss1EmissionShape.png is excluded by !**/*.png
  • Scenes/UI/Assets/HowToPlay_Combo_Bar.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/A_Key_Light.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/Arrow_Down_Key_Light.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/Arrow_Left_Key_Light.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/Arrow_Right_Key_Light.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/Arrow_Up_Key_Light.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/D_Key_Light.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/E_Key_Light.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/Positional_Prompts_Down.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/Positional_Prompts_Left.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/Positional_Prompts_Right.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/Positional_Prompts_Up.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/Q_Key_Light.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/R_Key_Light.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/S_Key_Light.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/T_Key_Light.png is excluded by !**/*.png
  • Scenes/UI/Remapping/Assets/W_Key_Light.png is excluded by !**/*.png
  • Scenes/UI/TitleScreen/Assets/Background_BackTree.png is excluded by !**/*.png
  • Scenes/UI/TitleScreen/Assets/Background_FrontTree.png is excluded by !**/*.png
  • Scenes/UI/TitleScreen/Assets/Background_MidTree.png is excluded by !**/*.png
  • Scenes/UI/TitleScreen/Assets/Background_Moon.png is excluded by !**/*.png
  • Scenes/UI/TitleScreen/Assets/Background_Sky.png is excluded by !**/*.png
  • Scenes/UI/TitleScreen/Assets/TitleScreenFont.TTF is excluded by !**/*.ttf
  • Scenes/UI/TitleScreen/Assets/TitleSong.ogg is excluded by !**/*.ogg
  • SharedAssets/BackGround_Full.png is excluded by !**/*.png
  • SharedAssets/BattleFrame1.png is excluded by !**/*.png
  • SharedAssets/Character1.png is excluded by !**/*.png
  • SharedAssets/NoteArrow_Black_Outline.png is excluded by !**/*.png
  • SharedAssets/Player.png is excluded by !**/*.png
  • scenes/NoteManager/assets/outline_white.png is excluded by !**/*.png
📒 Files selected for processing (107)
  • Classes/MidiMaestro/MidiMaestro.cs (5 hunks)
  • Classes/MidiMaestro/SongTemplate.cs (1 hunks)
  • Classes/Notes/Assets/Note_PlayerBasic.png.import (1 hunks)
  • Classes/Notes/Assets/Note_PlayerDouble.png.import (1 hunks)
  • Classes/Notes/Assets/Note_PlayerHeal.png.import (1 hunks)
  • Classes/Notes/Assets/Note_PlayerQuarter.png.import (1 hunks)
  • Classes/Notes/Assets/Note_PlayerVampire.png.import (1 hunks)
  • Classes/Notes/Note.cs (4 hunks)
  • Classes/Relics/Assets/Relic_Auroboros.png.import (1 hunks)
  • Classes/Relics/Assets/Relic_Colorboros.png.import (1 hunks)
  • Classes/Relics/RelicEffect.cs (1 hunks)
  • Classes/Relics/RelicTemplate.cs (1 hunks)
  • Classes/Relics/assets/relic_Breakfast.png.import (1 hunks)
  • Classes/Relics/assets/relic_GoodVibes.png.import (1 hunks)
  • Funk Engine.csproj (1 hunks)
  • Globals/BgAudioPlayer/BgAudioPlayer.cs (1 hunks)
  • Globals/FunkEngineNameSpace.cs (6 hunks)
  • Globals/SaveSystem.cs (7 hunks)
  • Globals/Scribe.cs (14 hunks)
  • Globals/StageProducer.cs (5 hunks)
  • Globals/TimeKeeper.cs (1 hunks)
  • Globals/Translations/translations.csv.import (1 hunks)
  • Scenes/BattleDirector/Assets/NoteQueue_Frame.png.import (1 hunks)
  • Scenes/BattleDirector/BattleScene.tscn (4 hunks)
  • Scenes/ChartViewport/HitParticles.tscn (2 hunks)
  • Scenes/NoteManager/Assets/Arrow_Trail.png.import (1 hunks)
  • Scenes/NoteManager/HoldArrow.tscn (1 hunks)
  • Scenes/NoteManager/NoteArrow.tscn (1 hunks)
  • Scenes/NoteManager/NoteManager.tscn (1 hunks)
  • Scenes/NoteManager/Scripts/HoldArrow.cs (1 hunks)
  • Scenes/Puppets/Enemies/BossBlood/Assets/Boss1.png.import (1 hunks)
  • Scenes/Puppets/Enemies/BossBlood/Assets/Boss1EmissionShape.png.import (1 hunks)
  • Scenes/UI/Assets/HowToPlay_Combo_Bar.png.import (1 hunks)
  • Scenes/UI/DisplayButton.tscn (1 hunks)
  • Scenes/UI/Options/HowToPlay.tscn (2 hunks)
  • Scenes/UI/Options/OptionsMenu.tscn (2 hunks)
  • Scenes/UI/Options/Scripts/HowToPlay.cs (1 hunks)
  • Scenes/UI/Options/Scripts/LanguageSelection.cs (0 hunks)
  • Scenes/UI/Options/Scripts/OptionsMenu.cs (5 hunks)
  • Scenes/UI/Remapping/Assets/A_Key_Light.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/Arrow_Down_Key_Light.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/Arrow_Left_Key_Light.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/Arrow_Right_Key_Light.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/Arrow_Up_Key_Light.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/D_Key_Light.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/E_Key_Light.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/Positional_Prompts_Down.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/Positional_Prompts_Left.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/Positional_Prompts_Right.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/Positional_Prompts_Up.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/Q_Key_Light.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/R_Key_Light.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/S_Key_Light.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/T_Key_Light.png.import (1 hunks)
  • Scenes/UI/Remapping/Assets/W_Key_Light.png.import (1 hunks)
  • Scenes/UI/Remapping/ControlSettings.cs (4 hunks)
  • Scenes/UI/Remapping/Remap.tscn (1 hunks)
  • Scenes/UI/TitleScreen/Assets/2D_Shadow_Map.webp.import (1 hunks)
  • Scenes/UI/TitleScreen/Assets/Background_BackTree.png.import (1 hunks)
  • Scenes/UI/TitleScreen/Assets/Background_FrontTree.png.import (1 hunks)
  • Scenes/UI/TitleScreen/Assets/Background_MidTree.png.import (1 hunks)
  • Scenes/UI/TitleScreen/Assets/Background_Moon.png.import (1 hunks)
  • Scenes/UI/TitleScreen/Assets/Background_Sky.png.import (1 hunks)
  • Scenes/UI/TitleScreen/Assets/TitleScreenFont.TTF.import (1 hunks)
  • Scenes/UI/TitleScreen/Assets/TitleSong.ogg.import (1 hunks)
  • Scenes/UI/TitleScreen/SceneChange.tscn (1 hunks)
  • Scenes/UI/TitleScreen/Scripts/SceneChange.cs (2 hunks)
  • Scenes/UI/TitleScreen/Scripts/TitleScreen.cs (1 hunks)
  • Scenes/UI/TitleScreen/TitleScreen.tscn (1 hunks)
  • SharedAssets/BackGround_Full.png.import (1 hunks)
  • SharedAssets/BattleFrame1.png.import (1 hunks)
  • SharedAssets/Character1.png.import (1 hunks)
  • SharedAssets/NoteArrow_Black_Outline.png.import (1 hunks)
  • SharedAssets/Player.png.import (1 hunks)
  • project.godot (2 hunks)
  • scenes/BattleDirector/NotePlacementBar.tscn (5 hunks)
  • scenes/BattleDirector/notePoofParticles.tscn (1 hunks)
  • scenes/BattleDirector/scripts/BattleDirector.cs (4 hunks)
  • scenes/BattleDirector/scripts/Conductor.cs (1 hunks)
  • scenes/BattleDirector/scripts/NotePlacementBar.cs (4 hunks)
  • scenes/BattleDirector/scripts/NoteQueueParticlesFactory.cs (1 hunks)
  • scenes/BattleDirector/scripts/TextParticle.cs (1 hunks)
  • scenes/ChartViewport/ChartViewport.tscn (1 hunks)
  • scenes/ChartViewport/LoopMarker.png.import (1 hunks)
  • scenes/ChartViewport/scripts/ChartManager.cs (3 hunks)
  • scenes/ChartViewport/scripts/HitParticles.cs (1 hunks)
  • scenes/ChartViewport/scripts/Loopable.cs (1 hunks)
  • scenes/ChestScene/ChestScene.cs (2 hunks)
  • scenes/ChestScene/ChestScene.tscn (2 hunks)
  • scenes/ChestScene/assets/Chest.png.import (1 hunks)
  • scenes/Maps/assets/BattleIcon.png.import (1 hunks)
  • scenes/Maps/assets/BossIcon.png.import (1 hunks)
  • scenes/Maps/assets/ChestIcon.png.import (1 hunks)
  • scenes/Maps/cartographer.tscn (1 hunks)
  • scenes/Maps/scripts/Cartographer.cs (5 hunks)
  • scenes/NoteManager/assets/arrow_outline.png.import (1 hunks)
  • scenes/NoteManager/assets/new_arrow.png.import (1 hunks)
  • scenes/NoteManager/scripts/InputHandler.cs (4 hunks)
  • scenes/NoteManager/scripts/NoteArrow.cs (1 hunks)
  • scenes/NoteManager/scripts/NoteChecker.cs (1 hunks)
  • scenes/Puppets/Enemies/BossBlood/Boss1.tscn (2 hunks)
  • scenes/Puppets/Enemies/BossBlood/P_BossBlood.cs (2 hunks)
  • scenes/Puppets/Enemies/BossBlood/assets/Enemy1.png.import (0 hunks)
  • scenes/Puppets/Enemies/EnemyEffect.cs (1 hunks)
  • scenes/Puppets/Enemies/EnemyPuppet.cs (1 hunks)
  • scenes/Puppets/Enemies/EnemyPuppet.tscn (1 hunks)
  • scenes/Puppets/Enemies/Parasifly/P_Parasifly.cs (1 hunks)
⛔ Files not processed due to max files limit (25)
  • scenes/Puppets/Enemies/Parasifly/Parasifly.tscn
  • scenes/Puppets/Enemies/Parasifly/assets/Parasifly.png.import
  • scenes/Puppets/Enemies/TheGWS/GWS.tscn
  • scenes/Puppets/Enemies/TheGWS/P_TheGWS.cs
  • scenes/Puppets/Enemies/TheGWS/assets/GhostWolfSnake.png.import
  • scenes/Puppets/HealthBar.tscn
  • scenes/Puppets/PlayerPuppet.tscn
  • scenes/Puppets/scripts/HealthBar.cs
  • scenes/Puppets/scripts/PlayerPuppet.cs
  • scenes/Puppets/scripts/PuppetTemplate.cs
  • scenes/Remapping/ControlSchemes.cs
  • scenes/SceneTransitions/assets/2d_lights_and_shadows_neutral_point_light.webp.import
  • scenes/SceneTransitions/assets/titleSong.ogg.import
  • scenes/SceneTransitions/scripts/TitleScreen.cs
  • scenes/UI/EndScreen.tscn
  • scenes/UI/Pause.tscn
  • scenes/UI/RewardSelectionUI.tscn
  • scenes/UI/inventory.tscn
  • scenes/UI/scripts/DisplayButton.cs
  • scenes/UI/scripts/EndScreen.cs
  • scenes/UI/scripts/HowToPlay.cs
  • scenes/UI/scripts/Inventory.cs
  • scenes/UI/scripts/MenuModule.cs
  • scenes/UI/scripts/PauseMenu.cs
  • scenes/UI/scripts/RewardSelect.cs
💤 Files with no reviewable changes (2)
  • Scenes/UI/Options/Scripts/LanguageSelection.cs
  • scenes/Puppets/Enemies/BossBlood/assets/Enemy1.png.import
🧰 Additional context used
🧬 Code Definitions (18)
scenes/Puppets/Enemies/EnemyEffect.cs (1)
scenes/Puppets/Enemies/EnemyPuppet.cs (1)
  • EnemyEffect (7-10)
scenes/ChartViewport/scripts/Loopable.cs (1)
Globals/TimeKeeper.cs (2)
  • TimeKeeper (7-52)
  • PosMod (48-51)
scenes/Puppets/Enemies/Parasifly/P_Parasifly.cs (3)
scenes/Puppets/Enemies/TheGWS/P_TheGWS.cs (1)
  • _Ready (8-20)
scenes/BattleDirector/scripts/BattleDirector.cs (1)
  • _Ready (77-94)
scenes/Puppets/scripts/PlayerPuppet.cs (1)
  • _Ready (10-20)
Globals/BgAudioPlayer/BgAudioPlayer.cs (3)
scenes/Maps/scripts/Cartographer.cs (1)
  • _EnterTree (44-47)
Globals/StageProducer.cs (1)
  • _EnterTree (31-35)
Scenes/UI/TitleScreen/Scripts/TitleScreen.cs (1)
  • _EnterTree (63-66)
scenes/Maps/scripts/Cartographer.cs (3)
Globals/BgAudioPlayer/BgAudioPlayer.cs (3)
  • BgAudioPlayer (6-42)
  • PlayLevelMusic (32-35)
  • StopMusic (37-41)
Globals/StageProducer.cs (3)
  • StageProducer (9-215)
  • PreloadScene (116-140)
  • TransitionFromRoom (105-108)
scenes/UI/scripts/EndScreen.cs (1)
  • EndScreen (4-39)
scenes/NoteManager/scripts/InputHandler.cs (3)
scenes/BattleDirector/scripts/BattleDirector.cs (1)
  • Timing (178-196)
Globals/SaveSystem.cs (2)
  • SaveSystem (9-216)
  • UpdateConfig (46-68)
scenes/ChartViewport/scripts/HitParticles.cs (1)
  • Emit (8-26)
scenes/ChestScene/ChestScene.cs (3)
scenes/Puppets/scripts/PlayerPuppet.cs (2)
  • PlayerPuppet (3-33)
  • _Ready (10-20)
scenes/UI/scripts/RewardSelect.cs (2)
  • RewardSelect (4-138)
  • RewardSelect (83-96)
Globals/StageProducer.cs (2)
  • StageProducer (9-215)
  • TransitionStage (142-183)
Globals/FunkEngineNameSpace.cs (3)
Globals/StageProducer.cs (1)
  • BattleConfig (186-214)
Classes/MidiMaestro/SongTemplate.cs (1)
  • SongTemplate (14-27)
scenes/ChartViewport/scripts/ChartManager.cs (1)
  • ArrowData (202-231)
Scenes/UI/Options/Scripts/HowToPlay.cs (1)
Scenes/UI/Options/Scripts/OptionsMenu.cs (6)
  • _Ready (31-49)
  • ReturnToPrev (80-84)
  • ResumeFocus (60-64)
  • PauseFocus (66-71)
  • OpenMenu (73-78)
  • _Input (51-58)
scenes/BattleDirector/scripts/Conductor.cs (2)
Classes/MidiMaestro/MidiMaestro.cs (7)
  • MidiMaestro (12-87)
  • MidiMaestro (30-71)
  • MidiNoteInfo (76-86)
  • MidiNoteInfo (90-123)
  • MidiNoteInfo (94-97)
  • GetStartTimeBeat (99-103)
  • GetDurationBeats (115-122)
Globals/FunkEngineNameSpace.cs (6)
  • ArrowData (46-52)
  • ArrowData (62-66)
  • Beat (118-122)
  • Beat (124-128)
  • Beat (135-139)
  • Beat (141-145)
Scenes/UI/Remapping/ControlSettings.cs (5)
Scenes/UI/Options/Scripts/HowToPlay.cs (4)
  • ReturnToPrev (36-40)
  • ResumeFocus (18-22)
  • PauseFocus (24-27)
  • OpenMenu (29-34)
Scenes/UI/Options/Scripts/OptionsMenu.cs (4)
  • ReturnToPrev (80-84)
  • ResumeFocus (60-64)
  • PauseFocus (66-71)
  • OpenMenu (73-78)
scenes/UI/scripts/PauseMenu.cs (4)
  • ReturnToPrev (58-62)
  • ResumeFocus (39-43)
  • PauseFocus (45-49)
  • OpenMenu (51-56)
scenes/UI/scripts/Inventory.cs (4)
  • ReturnToPrev (74-78)
  • ResumeFocus (55-59)
  • PauseFocus (61-64)
  • OpenMenu (66-72)
Globals/FunkEngineNameSpace.cs (4)
  • ReturnToPrev (397-397)
  • ResumeFocus (396-396)
  • PauseFocus (395-395)
  • OpenMenu (394-394)
Scenes/UI/TitleScreen/Scripts/TitleScreen.cs (2)
Scenes/UI/Options/Scripts/OptionsMenu.cs (6)
  • _Ready (31-49)
  • ResumeFocus (60-64)
  • PauseFocus (66-71)
  • OpenMenu (73-78)
  • ReturnToPrev (80-84)
  • OptionsMenu (4-122)
Globals/BgAudioPlayer/BgAudioPlayer.cs (3)
  • _EnterTree (14-17)
  • BgAudioPlayer (6-42)
  • PlayLevelMusic (32-35)
Scenes/NoteManager/Scripts/HoldArrow.cs (3)
scenes/NoteManager/scripts/NoteArrow.cs (8)
  • NoteArrow (7-139)
  • Init (32-42)
  • Recycle (80-88)
  • CheckMissed (68-73)
  • RaiseMissed (66-66)
  • PosChecks (96-104)
  • RaiseKill (78-78)
  • IsInRange (135-138)
Globals/FunkEngineNameSpace.cs (6)
  • Beat (118-122)
  • Beat (124-128)
  • Beat (135-139)
  • Beat (141-145)
  • ArrowData (46-52)
  • ArrowData (62-66)
Globals/TimeKeeper.cs (2)
  • Beat (30-36)
  • TimeKeeper (7-52)
Scenes/UI/Options/Scripts/OptionsMenu.cs (3)
Scenes/UI/Options/Scripts/HowToPlay.cs (7)
  • _Ready (13-16)
  • ReturnToPrev (36-40)
  • _Input (42-49)
  • ResumeFocus (18-22)
  • PauseFocus (24-27)
  • OpenMenu (29-34)
  • HowToPlay (4-50)
Scenes/UI/Remapping/ControlSettings.cs (7)
  • _Ready (72-86)
  • ReturnToPrev (107-111)
  • _Input (137-144)
  • ResumeFocus (88-92)
  • PauseFocus (94-97)
  • OpenMenu (99-105)
  • ControlSettings (5-197)
Globals/FunkEngineNameSpace.cs (4)
  • ReturnToPrev (397-397)
  • ResumeFocus (396-396)
  • PauseFocus (395-395)
  • OpenMenu (394-394)
Globals/StageProducer.cs (4)
Globals/FunkEngineNameSpace.cs (6)
  • MapGrid (251-372)
  • Stages (336-343)
  • Room (257-260)
  • Room (262-288)
  • Room (270-275)
  • AddChild (282-287)
scenes/ChestScene/ChestScene.cs (1)
  • ChestScene (7-41)
Globals/Scribe.cs (1)
  • Scribe (9-254)
scenes/Puppets/Enemies/BossBlood/P_BossBlood.cs (1)
  • P_BossBlood (4-35)
scenes/BattleDirector/scripts/BattleDirector.cs (3)
scenes/Puppets/scripts/PlayerPuppet.cs (3)
  • PlayerPuppet (3-33)
  • _Ready (10-20)
  • TakeDamage (22-26)
scenes/BattleDirector/scripts/Conductor.cs (2)
  • Conductor (8-140)
  • Initialize (21-38)
scenes/Puppets/scripts/PuppetTemplate.cs (3)
  • _Ready (35-42)
  • TakeDamage (112-127)
  • PuppetTemplate (7-146)
scenes/NoteManager/scripts/NoteArrow.cs (5)
scenes/ChartViewport/scripts/ChartManager.cs (3)
  • NoteArrow (114-123)
  • NoteArrow (125-142)
  • ArrowData (202-231)
Globals/FunkEngineNameSpace.cs (6)
  • Beat (118-122)
  • Beat (124-128)
  • Beat (135-139)
  • Beat (141-145)
  • ArrowData (46-52)
  • ArrowData (62-66)
Globals/TimeKeeper.cs (2)
  • Beat (30-36)
  • TimeKeeper (7-52)
scenes/NoteManager/scripts/InputHandler.cs (1)
  • _Process (58-80)
scenes/NoteManager/scripts/NoteChecker.cs (1)
  • _Process (13-21)
scenes/ChartViewport/scripts/ChartManager.cs (5)
scenes/NoteManager/scripts/NoteArrow.cs (2)
  • NoteArrow (7-139)
  • Init (32-42)
scenes/NoteManager/scripts/InputHandler.cs (1)
  • InputHandler (7-114)
scenes/BattleDirector/scripts/Conductor.cs (1)
  • Initialize (21-38)
Globals/TimeKeeper.cs (3)
  • TimeKeeper (7-52)
  • GetTimeOfBeat (38-41)
  • Beat (30-36)
Globals/FunkEngineNameSpace.cs (6)
  • ArrowData (46-52)
  • ArrowData (62-66)
  • Beat (118-122)
  • Beat (124-128)
  • Beat (135-139)
  • Beat (141-145)
🔇 Additional comments (311)
scenes/Maps/assets/BossIcon.png.import (2)

6-6: Updated Texture Import Path Verification

The path attribute now points to a new compressed texture file with an updated hash. This update appears consistent with the new asset management conventions. Please verify that the new hash (-78fabe547636e3d1de7dad53eb9c2945) is correctly generated from the asset to avoid any runtime discrepancies.


13-14: Directory Casing and Destination File Update

The source_file and dest_files paths have been updated to use the proper casing (e.g., Scenes/Maps/Assets instead of scenes/Maps/assets). This change helps enforce consistency within the project, especially for environments where file paths are case-sensitive. Please make sure that all asset references across the codebase follow this new naming convention to prevent potential issues.

Scenes/UI/Remapping/Assets/S_Key_Light.png.import (3)

6-6: Updated Asset Import Path
The asset identifier and path have been updated to reflect the new naming convention and directory structure. Please confirm that all build and runtime processes reference the new path (res://.godot/imported/S_Key_Light.png-0b94f3ef8198c961a4767f9f25627e55.ctex).


13-13: Corrected Source File Location
The source_file now uses the updated directory casing and path (res://Scenes/UI/Remapping/Assets/S_Key_Light.png), aligning with the new project organization. Ensure that this change is propagated in any related scripts or documentation.


14-14: Synchronized Destination Files
The dest_files entry has been updated to mirror the new asset path. Verify that downstream processes and caching mechanisms correctly handle this updated configuration.

Scenes/UI/Remapping/Assets/T_Key_Light.png.import (3)

6-6: Update Asset Import Path.
The path attribute now points to the new unique identifier "T_Key_Light.png-5f9653ef3045ac239de1426add148130.ctex", which aligns with the updated asset version. Please verify that all references to this asset in the project have been updated accordingly.


13-13: Correct Source File Reference.
The source_file attribute has been updated to reflect the new directory structure (res://Scenes/UI/Remapping/Assets/T_Key_Light.png). This change improves consistency with the new asset organization across the project.


14-14: Update Destination Files Array.
The dest_files value now references the updated compressed texture file ID, ensuring consistency with the path attribute change. Confirm that the new identifier matches the asset generated by the import process.

Scenes/NoteManager/Assets/Arrow_Trail.png.import (3)

1-10: Configuration Section for Asset Import is Correct.
The [remap] section properly defines the importer type, asset UID, and the path to the compressed texture file. The metadata flag for vram_texture is clearly set, ensuring correct handling in the engine. Please verify that the UID remains unique across your project.


11-15: Dependencies Section Validation.
The [deps] section correctly links the source file with its corresponding generated destination file. This clear dependency mapping helps avoid asset mismatch issues during import.


16-35: Parameter Configuration Check.
The [params] section comprehensively covers compression, mipmap generation, roughness, and other processing settings. The values provided (e.g., compress/lossy_quality=0.7, mipmaps/generate=false, etc.) appear to be thoughtfully chosen based on expected quality and performance needs. Ensure that these parameter values have been validated against your game's visual and performance requirements.

Scenes/UI/Remapping/Assets/A_Key_Light.png.import (3)

6-6: New Texture Asset Path Updated:
The path on line 6 has been updated to reference the new compressed texture file (A_Key_Light.png-7329269aa31c1a16ab62d73e21666a01.ctex). Please ensure that this new asset identifier is consistent with the updated file in the repository and that any caching or asset lookup mechanisms are aware of the change.


13-13: Source File Path Revision:
The source_file on line 13 now points to res://Scenes/UI/Remapping/Assets/A_Key_Light.png, aligning with the new directory structure and naming conventions. Confirm that the asset actually exists at this new path and update any related asset references accordingly.


14-14: Destination Files Update:
The dest_files attribute on line 14 has been updated to match the new compressed texture file path. Verify that any downstream processing that relies on this attribute is updated to reflect the new file path, ensuring consistency throughout the asset pipeline.

SharedAssets/NoteArrow_Black_Outline.png.import (2)

6-6: Updated Texture Path Reference

The path attribute has been correctly updated to reference the new texture asset (NoteArrow_Black_Outline.png with the appropriate hash). This change aligns with the new naming convention and asset reorganization as part of the system overhaul.


13-14: Updated Asset Dependency References

The modifications to source_file and dest_files now consistently point to the newly named texture asset. This update ensures that the dependency information is accurate and conforms to the project's revised asset naming scheme.

Scenes/UI/Remapping/Assets/Q_Key_Light.png.import (2)

6-6: Update Asset Import Path and Identifier.
The path attribute has been updated to use the new unique identifier (dd437257d3d8fd0495a1334ffc31bac8) for the compressed texture asset. Please verify that this new identifier is consistent with the other asset entries and that the corresponding compressed file is generated correctly.


13-14: Refine Dependency Paths to Reflect New Directory Structure.
The source_file and dest_files values have been updated to the new directory structure (res://Scenes/UI/Remapping/Assets/), ensuring consistency with the project's naming conventions. Confirm that these changes are in line with similar updates across the project and that all scene references to these assets have been updated accordingly.

Scenes/UI/Remapping/Assets/R_Key_Light.png.import (3)

6-6: Update Compressed Texture Path

The path attribute has been updated to the new compressed texture identifier (...5f8abebbfccbe9a5417f1ebed1e3a199.ctex). This change aligns with the overall asset reorganization and appears to be consistent with the new naming conventions.


13-13: Revise Source File Path

The source_file path now reflects the new directory structure and capitalization (res://Scenes/UI/Remapping/Assets/R_Key_Light.png). Please ensure that all references to this asset have been updated accordingly throughout the project.


14-14: Revise Destination Files Configuration

The dest_files array has been updated to include the new compressed texture file identifier, matching the change in the path attribute. This update maintains consistency across asset import settings.

scenes/Maps/assets/BattleIcon.png.import (2)

6-6: Updated Texture Path for New Compressed Texture

The path attribute has been updated to the new compressed texture file (BattleIcon.png-7f2aaf8e14988b8f2fe2d26908d82e0b.ctex). This change aligns with the current asset versioning and should work seamlessly with the asset pipeline. Just verify that the new checksum and path are correctly generated by the build process.


13-14: Consistent Update of Source and Destination Paths

The source_file now uses the updated casing (Scenes/Maps/Assets/BattleIcon.png), and the dest_files entry has been updated to reference the new compressed texture file. This correction is important for case-sensitive file systems and ensures consistency across asset references. Please confirm that these path updates are reflected throughout related configuration files.

Scenes/UI/Remapping/Assets/D_Key_Light.png.import (2)

6-6: Texture Path Update Confirmed

The updated texture path now points to the new compressed texture asset with the updated unique identifier. This change aligns with the new asset naming conventions and supports the broader reorganization efforts.


13-14: Asset Path Structure Consistency

The modifications to the source_file and dest_files fields update the directory structure to use Pascal case ("Scenes/UI/Remapping/Assets"), ensuring consistency in asset management across the project.

scenes/NoteManager/assets/new_arrow.png.import (2)

6-6: Filename Casing Update in Texture Path

The path attribute now points to a texture file using "New_Arrow.png" in PascalCase with an updated unique identifier. This change ensures the filename complies with the new naming conventions. Please confirm that the file exists at the revised location and that the unique identifier correctly maps to the asset.


13-14: Consistent Asset Dependency Paths

The source_file and dest_files values have been updated to use the PascalCase filename "New_Arrow.png". This update enforces consistency with the standardized project naming conventions. Verify that all references across the project are updated accordingly.

scenes/NoteManager/assets/arrow_outline.png.import (2)

6-6: Texture Import Path Updated for Consistency

The path attribute has been modified to reflect the PascalCase filename "Arrow_Outline.png" along with a new unique identifier. This change aligns the file with the project's naming standards. Ensure this asset exists at the specified path.


13-14: Dependency Paths Aligned with New Naming Standard

Both source_file and dest_files now consistently refer to "Arrow_Outline.png" using the new casing. This update is critical for preventing potential file-not-found issues due to case sensitivity in certain environments. Please verify that all asset references throughout the project reflect this update.

Scenes/UI/Remapping/Assets/E_Key_Light.png.import (3)

6-6: Asset Import Path Update:
The updated path attribute now points to the new compressed texture file identifier (E_Key_Light.png-9fe72c49193260a50b1ed18d45117b1f.ctex). This change aligns with the new naming conventions and is consistent with the asset reorganization strategy.


13-13: Source File Path Reorganization:
The source_file attribute has been updated to res://Scenes/UI/Remapping/Assets/E_Key_Light.png, reflecting the new directory structure with proper casing. This update is crucial for ensuring compatibility on case-sensitive filesystems and supports the broader asset path standardization.


14-14: Destination Files Consistency:
The dest_files attribute now correctly references the updated compressed texture file identifier. This ensures consistency with the path attribute update and confirms that the asset import references are aligned with the new organizational scheme.

Scenes/UI/Remapping/Assets/W_Key_Light.png.import (2)

6-6: Update to Compressed Texture Path
The path attribute now points to the new compressed texture file with the updated unique identifier (0a27e3b3ab7dcb396c91bfe71e08d0f2). Please verify that this identifier is correct and that the file exists in the expected location.


13-14: Standardization of Asset Paths
The updates to source_file and dest_files correctly reflect the new directory structure (res://Scenes/UI/Remapping/Assets/...). Ensure that these changes are consistently applied across all asset references in the project to prevent any missing or misdirected resources.

scenes/ChestScene/assets/Chest.png.import (1)

6-6: Path standardization looks good.

These changes are part of a broader project-wide standardization effort, updating directory naming from lowercase to PascalCase (e.g., "scenes" to "Scenes", "assets" to "Assets"). The hash changes in the import paths are expected and automatically generated by Godot when source paths change.

Also applies to: 13-14

scenes/Maps/assets/ChestIcon.png.import (1)

6-6: Path standardization applied correctly.

The changes to file paths follow the standardization effort mentioned in the PR, converting from lowercase to title case format (scenes/Maps/assets → Scenes/Maps/Assets). This is consistent with the broader project reorganization and helps maintain uniform naming conventions throughout the codebase.

Note that these changes to the Godot import file are configuration updates that won't affect runtime functionality, but will improve project organization and maintainability.

Also applies to: 13-14

Globals/Translations/translations.csv.import (1)

9-13: Align translation file paths with the new directory structure.
The changes updating the files, source_file, and dest_files attributes now point to the correct and updated paths in the new "Translations" subdirectory. This ensures that all translation-related resources are correctly located. As noted in the csproj file review, verify that the casing of the file name (Translations.csv here) is consistent with other references across the project to avoid potential file system issues.

scenes/ChestScene/ChestScene.cs (5)

4-6: Good addition of XML documentation.

The XML comments provide clear documentation about the scene's purpose, making the code more maintainable and easier to understand for other developers.


9-10: Good encapsulation and path standardization.

These changes align with software engineering best practices in two ways:

  1. The static LoadPath provides a centralized location for the scene path, consistent with the pattern implemented across the codebase (like in PlayerPuppet and RewardSelect)
  2. Changing Player to a private _player field improves encapsulation

This standardization makes the codebase more maintainable and reduces the risk of hardcoded path errors.


17-18: Improved resource loading using centralized paths.

Using PlayerPuppet.LoadPath instead of hardcoded strings is a positive change that:

  1. Reduces duplication
  2. Makes path updates easier (only one place to change)
  3. Maintains consistency with the project-wide refactoring pattern

This change also correctly initializes and adds the player to the scene.


34-34: Good use of enum instead of string literal.

Changing from a string literal "Relic" to the enum value Stages.Chest improves type safety and makes the code more maintainable. This aligns with the updated RewardSelect implementation which now accepts a Stages enum parameter.


39-39: Simplified stage transition logic.

The method has been streamlined by directly calling TransitionStage on StageProducer.LiveInstance, removing unnecessary intermediate steps. This makes the code more straightforward and easier to follow.

Scenes/NoteManager/HoldArrow.tscn (3)

1-7: Scene setup with proper resource loading

The scene correctly loads all necessary resources for the hold arrow, including the main arrow texture, script, outline texture, and trail texture.


8-16: Well-structured main node with proper references

The main Sprite2D node is well configured with:

  • Appropriate z-index to ensure proper layering
  • Rotation to orient the arrow correctly
  • Properly exported node paths to critical components

This setup provides good organization and accessibility to child components.


32-43: Effective NinePatchRect configuration for the trail

The Trail node is well configured with:

  • Appropriate z-index to display under the arrow
  • Correct offset and pivot settings
  • Patch margins and axis stretch settings for proper scaling

This setup allows the trail to dynamically resize while maintaining its appearance.

Scenes/NoteManager/Scripts/HoldArrow.cs (6)

5-14: Clear class hierarchy and property definitions

The HoldArrow class properly extends NoteArrow with appropriate properties:

  • Correct override of LoadPath constant
  • Well-defined exported field for the trail
  • Clear property definitions for Length and EndBeat

The class structure establishes a good foundation for the hold note functionality.


16-24: Well-implemented initialization with proper base call

The Init method correctly:

  • Calls the base implementation first
  • Dynamically calculates the trail size based on note length
  • Sets the trail color to match the checker color

This ensures visual consistency and correct sizing of hold notes.


26-32: Robust recycling implementation

The Recycle method properly:

  • Calls the base implementation
  • Restores the trail's original color if it was released
  • Resets the release state

This ensures the object can be reused correctly from the object pool.


34-40: Guard against multiple release calls

The NoteRelease method includes a guard clause to prevent multiple releases, which is good defensive programming.


69-73: Enhanced range check for hold notes

The IsInRange method correctly checks if an incoming beat falls within the entire duration of the hold note (from start to end).

This implementation is a significant improvement over the base class behavior, as it allows interaction with the note throughout its duration rather than just at the beginning.


42-56:

Details

❓ Verification inconclusive

Check possible edge case in miss detection

The CheckMissed implementation has comprehensive handling for different states, but there's a potential issue with the second condition.

The condition on line 51 uses new Beat(Note.TimingMax) to check if the note has been held too long. Can you verify that Note.TimingMax represents an appropriate timing window for this check? Also, compare this value with Beat.One used in the earlier condition to ensure consistency in timing windows.


🏁 Script executed:

#!/bin/bash
# Check the definition of Note.TimingMax to understand its value and appropriate usage
rg -A 3 "TimingMax" --type cs

Length of output: 1106


Timing Threshold Discrepancy in Miss Detection

The current implementation uses two distinct timing windows: one for a general miss (Beat.One) and another for held notes (new Beat(Note.TimingMax)). Our investigation confirms that Note.TimingMax is defined as 0.5 (see Classes/Notes/Note.cs), which is notably different from the expected window represented by Beat.One. Please verify that using a 0.5-beat window for hit notes—which distinguishes late releases—is intentional. If this discrepancy is by design, consider adding a clarifying comment to document the differing behavior; otherwise, adjust the thresholds for consistency.

Scenes/UI/DisplayButton.tscn (1)

3-3: Resource Path Casing Update is Correct

The external resource path has been updated to use Pascal case, which is now consistent with the overall project naming conventions. Please verify that the physical file on disk uses the same case as referenced.

scenes/NoteManager/scripts/NoteChecker.cs (1)

3-5: Enhanced Documentation is a Good Improvement

The addition of the documentation comment above the NoteChecker class improves code clarity by quickly summarizing its responsibilities regarding visual input and particle effects. Removing the unneeded using System; is also a positive cleanup.

Scenes/NoteManager/NoteArrow.tscn (1)

3-5: Standardized External Resource Paths

The updated paths for the texture assets and the script now follow a consistent Pascal case naming convention. This should improve maintainability and prevent case-sensitivity issues across different operating systems. Please ensure that the file names on disk exactly match these new paths.

scenes/Puppets/Enemies/EnemyPuppet.tscn (1)

3-4: Consistent Resource Path Updates

The modifications to the external resource paths for both the Puppet template and the HealthBar scene correctly reflect the updated directory casing. This change aligns with the broader standardization effort in the project.

Scenes/ChartViewport/HitParticles.tscn (2)

3-3: Script Resource Path Standardization

Updating the script resource path to res://Scenes/ChartViewport/Scripts/HitParticles.cs ensures consistency with the project’s naming conventions. Verify that the target file exists with the proper casing to avoid runtime issues.


17-17: Correct Script Reference in Node Definition

The script reference set on the HitParticles node has been updated accordingly. This change looks correct.

SharedAssets/Player.png.import (1)

6-6: Asset path reorganization looks good

The Player texture has been properly moved from a Maps-specific directory to the SharedAssets folder, with all file paths updated accordingly. This change aligns with the project's asset reorganization effort.

Also applies to: 13-14

Scenes/UI/Assets/HowToPlay_Combo_Bar.png.import (1)

6-6: Good asset renaming and directory standardization

The texture has been appropriately renamed from the generic "combobar.png" to the more descriptive "HowToPlay_Combo_Bar.png" and the directory structure has been standardized to use PascalCase. This improves clarity about the asset's purpose.

Also applies to: 13-14

SharedAssets/BattleFrame1.png.import (1)

6-6: Asset relocation to SharedAssets is appropriate

The BattleFrame1 texture has been properly moved from the BattleDirector-specific assets folder to the SharedAssets directory. This consolidation makes sense for assets that may be used across multiple scenes.

Also applies to: 13-14

SharedAssets/Character1.png.import (1)

6-6: Character asset properly moved to shared location

The Character1 texture has been correctly relocated from the BattleDirector assets to the SharedAssets folder, with all paths updated accordingly. This move supports better asset reusability across the project.

Also applies to: 13-14

Classes/Notes/Assets/Note_PlayerQuarter.png.import (2)

6-6: Asset Path Update:
The updated path attribute now reflects the new naming convention and unique identifier for the imported texture. Please verify that this new path is consistent with how the texture is referenced elsewhere in the project.


13-14: Dependency Resource Update:
The source_file and dest_files entries have been updated to reference the new asset location and filename correctly. This change ensures that asset dependencies are properly managed.

Scenes/Puppets/Enemies/BossBlood/Assets/Boss1.png.import (2)

6-6: Asset Path Revision:
The asset path has been updated to include the new file name and unique identifier. This aligns with the intended reorganization of enemy assets. Ensure that any other references to this asset are similarly updated.


13-14: Resource Reference Update:
The changes made to the source_file and dest_files entries now point to the updated location of Boss1.png. This improves consistency in asset management across the project.

Scenes/UI/TitleScreen/Assets/Background_MidTree.png.import (2)

6-6: Texture Import Path Update:
The path attribute now correctly reflects the new naming scheme and unique identifier for the background texture. This change is consistent with the overall asset renaming effort.


13-14: Updated Resource File References:
The source_file and dest_files entries now reference the new asset location using the updated file name with proper casing (Background_MidTree.png). This ensures that the asset is correctly located during runtime.

Scenes/UI/TitleScreen/Assets/TitleScreenFont.TTF.import (2)

6-6: Font Data Import Path Update:
The path attribute has been revised to reflect the updated font file name and unique identifier. This ensures that the engine loads the correct font data.


10-11: Font Dependency Update:
Both the source_file and the dest_files entries have been updated to point to the new location and filename of the title screen font. This maintains consistency with the project's new asset structure.

Scenes/NoteManager/NoteManager.tscn (2)

3-6: Resource Paths Standardization:
The external resource paths for the InputHandler.cs, New_Arrow.png, NoteChecker.cs, and Arrow_Outline.png have been updated to use the correct casing and directory structure. This helps ensure that the scene references the proper assets and scripts following the reorganization.


8-8: Scene Resource Update:
The HitParticles.tscn resource path has been updated to the correct new location under Scenes/ChartViewport. This update is in line with the standardized naming conventions.

Scenes/UI/Remapping/Assets/Arrow_Right_Key_Light.png.import (1)

6-6: Path restructuring looks good!

The path updates properly reflect the new directory structure and follow the convention of capitalizing directory names (Scenes, UI, Remapping, Assets). This standardization improves project organization and findability of assets.

Also applies to: 13-13, 14-14

Scenes/UI/Remapping/Assets/Arrow_Down_Key_Light.png.import (1)

6-6: Path standardization looks good!

The path updates are consistent with the new directory structure and naming conventions. This change maintains consistency with other arrow key assets in the same directory.

Also applies to: 13-13, 14-14

Classes/Notes/Assets/Note_PlayerVampire.png.import (1)

6-6: File renaming and path updates look good!

The asset has been renamed from "vampire_note.png" to "Note_PlayerVampire.png", following a more consistent naming convention. The directory casing has also been standardized with "Assets" now capitalized. This improves consistency with other note assets.

Also applies to: 13-13, 14-14

scenes/ChartViewport/LoopMarker.png.import (1)

6-6: Path standardization looks good!

The capitalization of "Scenes" in the path is consistent with the project-wide directory naming convention being implemented. This improves consistency across the codebase.

Also applies to: 13-13, 14-14

SharedAssets/BackGround_Full.png.import (1)

6-6: Asset relocation and renaming looks good!

This texture has been:

  1. Renamed from "bgupdate.png" to the more descriptive "BackGround_Full.png"
  2. Moved from scene-specific assets to a shared asset directory

This is a good architectural change as it indicates this is a common asset used across multiple scenes, making it easier to maintain and update in one place.

Also applies to: 13-13, 14-14

Scenes/UI/Remapping/Assets/Positional_Prompts_Left.png.import (2)

6-6: Ensure Consistent Asset Identifier in the Path.
The updated path now reflects the new unique identifier and casing as part of the standardized asset reorganization.


13-14: Correct Source and Destination References.
The changes to source_file and dest_files correctly point to the new asset location, ensuring consistency with the project’s updated folder structure and naming conventions.

Scenes/UI/TitleScreen/Assets/Background_Sky.png.import (2)

6-6: Update Asset Identifier in the Path Attribute.
The path attribute has been updated with a new file name and hash, which aligns with the overall asset reorganization.


13-14: Align Source and Destination Paths.
The updated source_file and dest_files reflect the asset’s relocation to the new directory with adjusted casing. Verify that all asset references across the project are updated accordingly.

Scenes/UI/TitleScreen/Assets/Background_BackTree.png.import (2)

6-6: Revise Asset Path for Consistency.
The path attribute now includes the revised name and unique identifier, which standardizes the naming convention across the project.


13-14: Update Source and Destination File Paths.
The adjustments to source_file and dest_files correctly reflect the asset’s new location and naming, ensuring seamless integration with the new project structure.

Scenes/UI/TitleScreen/Assets/Background_Moon.png.import (2)

6-6: Refresh Asset Identifier in Import Configuration.
The change in the path attribute, including the updated file name and hash, is consistent with the standardized naming convention.


13-14: Reorganize Source and Destination Paths.
The new source_file and dest_files values now point to the correct asset location after the directory and case adjustments, promoting consistency across the asset pipeline.

Classes/Notes/Assets/Note_PlayerDouble.png.import (2)

6-6: Rename Asset in the Import Configuration.
The updated path now utilizes the new naming convention with a distinct identifier, ensuring the asset is properly recognized within the updated system.


13-14: Synchronize Source and Destination File References.
The modifications to source_file and dest_files correctly point to the new asset name and location, aligning with the broader change from lowercase to Pascal case.

Scenes/UI/Remapping/Assets/Positional_Prompts_Right.png.import (2)

6-6: Asset Path Update: The path attribute now uses the updated unique identifier (c530b7bc66d02f666feeec64f52e6b06) for the compressed texture. This change aligns with the new asset pipeline and naming conventions. Please ensure that any asset caching and reference lookups in the codebase are updated accordingly.


13-14: Updated Dependency Paths: The source_file and dest_files have been updated to reflect the new directory structure (with standardized casing) and identifier. This improves consistency with the overall asset management strategy in the project.

Scenes/UI/TitleScreen/Assets/Background_FrontTree.png.import (2)

6-6: Asset Identifier Revision: The path attribute now includes a new hash (e3154c7490a9bd01245c1f64710b66a0) for the Background_FrontTree asset, which is useful for cache busting and ensuring the latest asset version is loaded.


13-14: Consistent Source and Destination Update: Both the source_file and dest_files have been updated to point to the new location (res://Scenes/UI/TitleScreen/Assets/Background_FrontTree.png), reflecting a standardized naming convention and directory structure.

Scenes/UI/Remapping/Assets/Positional_Prompts_Up.png.import (2)

6-6: Asset Path Identifier Update: The path attribute now reflects a new unique identifier (239e554233dd2fd0b22ef9ebefbc3b5d) for this asset, ensuring that the asset system correctly recognizes the updated file version.


13-14: Harmonized Asset References: Updating the source_file and dest_files to res://Scenes/UI/Remapping/Assets/Positional_Prompts_Up.png aligns the asset’s location with the new directory standard. This enhances the overall consistency of asset paths in the project.

Classes/Relics/assets/relic_Breakfast.png.import (2)

6-6: Asset Identifier and Filename Update: The modified path now uses the new file identifier (71ab89b12909df408626427d83246628), ensuring proper tracking and cache invalidation for the asset.


13-14: Standardized Directory Casing: The update in the source_file (from .../assets/relic_Breakfast.png to .../Assets/Relic_Breakfast.png) along with the corrected dest_files aligns with the project's naming conventions. This standardization minimizes potential path issues across different platforms.

Classes/Relics/assets/relic_GoodVibes.png.import (2)

6-6: Updated Asset Identifier: The path attribute now reflects the new identifier (01d38d3d6a79fe959565a2bfe43c64ca) and uses the updated filename format. This change is crucial for proper asset management and cache handling.


13-14: Revised Source and Destination Paths: The changes to source_file and dest_files—updating from lowercase assets to PascalCase Assets—ensure consistency with the new directory structure across the project. This systematic update reduces the risk of file-not-found errors due to case sensitivity.

Globals/FunkEngineNameSpace.cs (13)

8-10: Doc Comments for SongData
No issues found. The doc comments are helpful and concisely describe the struct.


30-39: BattleConfig struct
Struct fields (RoomType, BattleRoom, EnemyScenePath, CurSong) look coherent for storing battle setup data.


44-106: ArrowData struct details

  1. The mutating method BeatFromLength() increments Beat within a value-type struct. Confirm this is intended and won't lead to subtle copying issues.
  2. Check whether the CompareTo method covers all tie-breakers accurately.

108-110: Doc Comments for Beat
Straightforward summary and usage explanation; no concerns here.


244-244: #endregion
No functional change here.


246-250: Doc comment for MapGrid
Clear explanation of how the grid is structured.


256-256: New field _curIdx
Storing the current index for room generation. Looks standard.


290-292: Doc comment for InitMapGrid
Documentation is consistent, outlining the parameters and process.


312-312: Doc comment for GeneratePath_r
No issues spotted; the recursive path generation is described appropriately.


374-374: #region Interfaces
Purely organizational; no functional code to review here.


375-377: Doc comment for IBattleEvent
Straightforward explanation of the event interface.


390-390: New interface IDisplayable
Defines a minimal contract for displayable items.


391-399: IFocusableMenu interface
Logical approach for implementing menu focus and navigation across UI.

scenes/Maps/cartographer.tscn (3)

8-8: Potential mismatch in node_paths
PackedStringArray("PlayerSprite") references "PlayerSprite" while the actual node is named "Player". Ensure this is intentional.


13-15: New CurSceneNode reference
Attaching CurSceneNode to the parent scene is a clear approach for UI layering and referencing.


3-6:

Details

❓ Verification inconclusive

Updated resource paths
Paths now point to the revised directory structure (Scenes, SharedAssets). Verify that they are valid and not broken references.


🏁 Script executed:

#!/bin/bash
# Checking if the relevant files exist in the project
fd Cartographer.cs
fd BackGround_Full.png
fd MenuModule.cs
fd Player.png

Length of output: 276


Resource paths have been updated and verified – please double-check folder name casing on case-sensitive systems.

The updated resource paths in scenes/Maps/cartographer.tscn (lines 3–6) now correctly reference the files as confirmed by the verification script:

  • Cartographer.cs: Referenced as res://Scenes/Maps/Scripts/Cartographer.cs and found at scenes/Maps/scripts/Cartographer.cs
  • BackGround_Full.png: Referenced as res://SharedAssets/BackGround_Full.png and found at SharedAssets/BackGround_Full.png
  • MenuModule.cs: Referenced as res://Scenes/UI/Scripts/MenuModule.cs and found at scenes/UI/scripts/MenuModule.cs
  • Player.png: Referenced as res://SharedAssets/Player.png and found at SharedAssets/Player.png

Note: There is a slight discrepancy in folder name casing (e.g., Scenes/Maps/Scripts in the resource reference vs. scenes/Maps/scripts in the repository). If your deployment environment is case-sensitive, please ensure the folder name casing is consistent to avoid potential broken references.

scenes/ChestScene/ChestScene.tscn (2)

27-27: UILayer node with CurSceneNode
Good approach for referencing the parent scene node. No further issues.

Also applies to: 29-29


3-3:

Details

✅ Verification successful

Resource path updates
Paths reflect the updated folder structure (Scenes/ChestScene, SharedAssets, etc.). Please confirm these files exist.

Also applies to: 5-9


🏁 Script executed:

#!/bin/bash
fd ChestScene.cs
fd MenuModule.cs
fd StarryNight.gdshader
fd BackGround_Full.png
fd Chest.png
fd BattleFrame1.png

Length of output: 440


Resource paths verified – updated folder structure confirmed.

I verified that all referenced files exist at their expected locations:

  • ChestScene.cs is found at scenes/ChestScene/ChestScene.cs
  • MenuModule.cs is found at scenes/UI/scripts/MenuModule.cs
  • StarryNight.gdshader is found at SharedAssets/StarryNight.gdshader
  • BackGround_Full.png is found at SharedAssets/BackGround_Full.png
  • Chest.png is found at scenes/ChestScene/assets/Chest.png
  • BattleFrame1.png is found at SharedAssets/BattleFrame1.png

These confirmations apply to the resource reference in ChestScene.tscn (lines 3 and 5-9), so no further changes are needed.

scenes/BattleDirector/scripts/TextParticle.cs (1)

3-4: Clear Class Summary Added
The summary comment succinctly describes the behavior of the TextParticle class—providing context on its role in displaying timing and damage information. This addition enhances code readability and maintainability.

scenes/BattleDirector/notePoofParticles.tscn (1)

3-3: Updated Texture Resource Path
The texture path has been updated to res://Classes/Notes/Assets/Note_PlayerHeal.png to reflect the new directory structure and naming convention. Ensure that related asset import settings and other references are updated accordingly for consistency.

Scenes/UI/TitleScreen/SceneChange.tscn (1)

3-3: Corrected External Resource Path
The external resource path for the SceneChange script has been updated to res://Scenes/UI/TitleScreen/Scripts/SceneChange.cs, which aligns with the new project directory structure. This change improves maintainability by enforcing consistent resource organization.

Classes/Relics/RelicTemplate.cs (1)

4-6: Good addition of XML documentation

Adding XML documentation for the RelicTemplate class improves code readability and helps developers understand the purpose of this class.

scenes/Puppets/Enemies/EnemyEffect.cs (1)

4-4: Appropriate removal of partial keyword

Removing the partial keyword indicates that this class is now consolidated into a single file, which improves code organization and readability. This aligns with the system overhaul objectives of the PR.

Scenes/UI/TitleScreen/Scripts/SceneChange.cs (3)

4-6: Good addition of XML documentation

Adding XML documentation for the SceneChange class improves code readability and helps developers understand the purpose of this button class.


13-13: Removed explicit initialization of _startFocused

Removing the explicit initialization to false has no functional impact since bool fields in C# are initialized to false by default. This change is likely for style consistency.


26-26: Improved access to StageProducer singleton

Changing from GetNode<StageProducer>("/root/StageProducer") to StageProducer.LiveInstance is a good improvement that:

  1. Reduces coupling to the scene tree structure
  2. Improves performance by avoiding scene tree lookup
  3. Makes the code more testable and maintainable

This change follows the singleton pattern best practice.

scenes/Puppets/Enemies/EnemyPuppet.cs (1)

9-9: Updated return statement to use renamed field

This change correctly updates the return statement to use the renamed BattleEvents field.

scenes/Puppets/Enemies/Parasifly/P_Parasifly.cs (1)

11-12: Good use of properties for health management

The change from direct field assignments to property usage (CurrentHealth, MaxHealth) aligns with the pattern used in other enemy classes and the player puppet. This improves encapsulation and allows for potential additional logic in property accessors.

Scenes/UI/TitleScreen/Assets/TitleSong.ogg.import (1)

1-19: Audio import configuration looks good

The import settings for the title song are properly configured with appropriate looping enabled, which is suitable for background music in a title screen.

Globals/BgAudioPlayer/BgAudioPlayer.cs (3)

3-5: Good addition of class documentation

Adding XML documentation improves code readability and maintainability by clearly describing the class purpose.


12-17: Singleton pattern implementation

The addition of the LiveInstance static property with a private setter and initialization in _EnterTree() implements the singleton pattern for easier access to the audio player throughout the codebase. This is consistent with similar patterns in other manager classes like StageProducer.


8-10:

Details

❓ Verification inconclusive

Path and resource loading improvements

The changes include:

  1. Using the generic ResourceLoader.Load<AudioStream>() for type safety
  2. Updated path to the new location for TitleSong.ogg

However, there's a potential issue with the path capitalization. If other resources use lowercase "scenes", this inconsistency could cause problems on case-sensitive file systems.


🏁 Script executed:

#!/bin/bash
# Check for path consistency across the codebase
echo "Checking for 'res://scenes' vs 'res://Scenes' usage:"
rg -i "res://[sS]cenes" --include="*.cs" | grep -i "res://" | sort

Length of output: 635


Below is an updated verification script that uses the correct file glob flag instead of --include. Please run the following script to check the resource path capitalization across all C# files:

#!/bin/bash
echo "Checking for 'res://scenes' vs 'res://Scenes' usage across all C# files:"
rg -i "res://[sS]cenes" -g "*.cs" | sort

Once you have the results from this command, please review whether the resource paths are consistently using the intended capitalization. We can then determine if any further action is needed based on the findings.

Classes/MidiMaestro/SongTemplate.cs (1)

3-6: Improved documentation and changed to struct type

The addition of documentation is good for code clarity. Changing from class to struct makes this a value type, which changes its behavior regarding copying and memory allocation. This is appropriate if SongTemplate is meant to be a small, immutable data container.

Scenes/UI/TitleScreen/Assets/2D_Shadow_Map.webp.import (1)

1-35: Asset configuration looks good!

This new import configuration file for the shadow map texture is properly set up with appropriate compression settings and processing parameters.

Classes/Notes/Assets/Note_PlayerHeal.png.import (1)

6-6: Path standardization looks good!

The updated path follows the new naming convention, providing better organization by using the "Note_Player" prefix and proper directory capitalization (Assets instead of assets).

Also applies to: 13-14

Classes/Relics/Assets/Relic_Colorboros.png.import (1)

6-6: Consistent naming convention applied correctly

Good job standardizing the asset naming with the "Relic_" prefix and updating the directory capitalization for consistency across the project.

Also applies to: 13-14

Classes/Notes/Note.cs (3)

5-7: XML documentation style improved

The comment has been properly reformatted to use XML documentation style, which improves code documentation and enables better IDE support.


17-17: Good addition of a timing constant

Adding a constant for the maximum timing window improves code maintainability by centralizing this important value that likely impacts gameplay mechanics.


39-42: Parameter naming consistency improved

The updated lambda function now consistently uses timing instead of mixing parameter and property names, which improves readability.

scenes/Puppets/Enemies/BossBlood/Boss1.tscn (2)

3-6: Resource path standardization looks good

The capitalization of directory names in resource paths (changing from "res://scenes/" to "res://Scenes/") improves consistency across the codebase and aligns with the overall standardization effort in this PR.


25-27: Variable renaming improves clarity

The renaming of _healthBar to HealthBar (removing the underscore prefix) is consistent with C# naming conventions for public properties. This change makes the code more readable and maintains better consistency with standard naming practices.

Scenes/BattleDirector/Assets/NoteQueue_Frame.png.import (1)

6-14: Asset naming improved from temporary to permanent convention

The asset has been renamed from "temp_note_queue.png" to "NoteQueue_Frame.png", moving from a temporary naming convention to a more descriptive and permanent one. This change aligns with the standardization efforts mentioned in the PR and improves asset management by using clear, consistent naming.

Classes/Relics/Assets/Relic_Auroboros.png.import (1)

6-14: Asset naming standardization with type prefix improves organization

Adding the "Relic_" prefix to the filename and updating directory capitalization to "Assets" enhances asset categorization and follows the project-wide standardization pattern. This naming convention makes it clearer what type of game element each asset represents, improving maintainability as the project grows.

Scenes/UI/Remapping/Assets/Arrow_Up_Key_Light.png.import (1)

6-14: Improved directory structure with UI categorization

The updated path now includes a "UI" directory and follows the standardized capitalization convention. This hierarchical organization provides better categorization of assets by their purpose and usage, making the project structure more intuitive and easier to navigate as the project scales.

Scenes/UI/Remapping/Assets/Arrow_Left_Key_Light.png.import (1)

6-6: Directory and path structure standardization

The path changes reflect a project-wide reorganization with consistent Pascal case naming conventions and a more structured directory hierarchy.

Also applies to: 13-14

scenes/ChartViewport/ChartViewport.tscn (1)

3-7: Resource path standardization with improved structure

The updated paths follow a consistent naming convention with Pascal case for directories and files. Moving the shader to SharedAssets is a good practice for resource sharing.

Scenes/UI/Remapping/Assets/Positional_Prompts_Down.png.import (1)

6-6: Directory structure standardization

These path updates match the project-wide reorganization pattern, ensuring consistency in asset references.

Also applies to: 13-14

scenes/ChartViewport/scripts/Loopable.cs (5)

4-5: Improved class documentation

The updated documentation clearly explains the purpose of the class and mentions its focus on modulo arithmetic, which helps other developers understand its intention.


13-15: Code organization improvement

Extracting the position update logic to a dedicated method improves readability and follows the single responsibility principle.


17-19: Helpful method extraction

Creating a separate UpdatePos() method encapsulates the looping logic, making the code more maintainable.


21-23: Conceptual change from ChartLength to ChartWidth

Using ChartWidth instead of ChartLength better represents the horizontal measurement used for looping calculations, making the code more intuitive.


25-30: Enhanced comments for complex mathematics

The added comments significantly improve maintainability by explaining the complex mathematical operations and even providing a link to a visual representation.

scenes/Puppets/Enemies/BossBlood/P_BossBlood.cs (3)

6-7: LGTM: Static LoadPath for scene reference

The addition of a static LoadPath standardizes scene path references and follows a consistent pattern across the codebase. This improves maintainability by centralizing path definitions.


11-12: LGTM: Using properties instead of direct field access

The change from accessing fields directly (_currentHealth, _maxHealth) to using properties (CurrentHealth, MaxHealth) improves encapsulation and follows good object-oriented practices.


22-22: LGTM: Using property for battle events

Similarly to the health changes, using the BattleEvents property instead of a direct field improves encapsulation and aligns with the overall refactoring approach in this PR.

Classes/Notes/Assets/Note_PlayerBasic.png.import (1)

6-6: LGTM: Updated asset paths

The path references have been updated to reflect the renaming from single_note.png to Note_PlayerBasic.png. This name is more descriptive and aligns with the note system rework mentioned in the PR objectives.

Also applies to: 13-14

Scenes/Puppets/Enemies/BossBlood/Assets/Boss1EmissionShape.png.import (1)

6-6: LGTM: Consistent asset naming and paths

The file references have been updated to change from Enemy1EmissionShape.png to Boss1EmissionShape.png with proper capitalization of directory names. This standardization aligns with the system overhaul mentioned in the PR objectives.

Also applies to: 13-14

Scenes/UI/Options/Scripts/HowToPlay.cs (5)

4-6: LGTM: Clean implementation of IFocusableMenu

The new HowToPlay class properly implements the IFocusableMenu interface for consistent menu navigation and focus management. The static LoadPath follows the pattern seen in other files.


13-16: LGTM: Button event handling

The _Ready method correctly subscribes to the button's Pressed event to handle navigation back to the previous menu.


18-34: LGTM: Focus management methods

The implementation of ResumeFocus, PauseFocus, and OpenMenu methods correctly manages UI focus state and process modes. This implementation aligns with other menus in the codebase as seen in the OptionsMenu.cs snippet.


36-40: LGTM: Return to previous menu implementation

The ReturnToPrev method correctly restores focus to the previous menu and removes the current menu from the scene tree, matching the pattern in OptionsMenu.cs.


42-49: LGTM: Input handling for cancel action

The _Input method correctly handles the "ui_cancel" action by returning to the previous menu and marking the input as handled to prevent further processing.

scenes/BattleDirector/scripts/NoteQueueParticlesFactory.cs (3)

3-4: Good documentation addition.

Adding XML summary documentation provides better clarity about the class's purpose and will help with IDE tooltips and documentation generation.


7-9: Improved resource loading pattern.

Converting from lazy loading to direct initialization with a properly named static readonly field is a good change. This simplifies the code and follows better C# naming conventions for constants. The capitalized path format also adheres to the project's new standardized naming convention.


17-17: Simplified particle instantiation.

Directly using the ParticlesScene field eliminates conditional logic and improves code readability.

project.godot (3)

14-14: Updated main scene path for new directory structure.

The path update reflects the project-wide standardization of scene organization, moving from the old "scenes/SceneTransitions" directory to a clearer hierarchical structure with "Scenes/UI/TitleScreen".


16-16: Moved icon asset to SharedAssets directory.

Moving the Character1.png to a shared assets folder is a good organizational change that centralizes common resources and separates them from scene-specific assets.


194-194: Standardized translation file naming convention.

The internationalization paths have been updated to follow consistent capitalization ("Translations" instead of "translations"), aligning with the project's new naming conventions.

Globals/Scribe.cs (7)

7-7: Improved class documentation.

The updated documentation better describes the class's purpose as a "single source of truth" for game data, which is clearer than the previous description.


29-29: Standardized note texture paths.

All note texture paths have been updated to follow consistent capitalization ("Assets" instead of "assets"), which aligns with the project-wide path standardization.

Also applies to: 43-43, 57-57, 71-71, 86-86


105-105: Standardized relic texture paths.

All relic texture paths have been updated to follow consistent capitalization, maintaining the standardized naming convention across the codebase.

Also applies to: 123-123, 140-140, 158-158


163-163: Balance adjustment for Colorboros relic.

The Colorboros relic has been rebalanced by:

  1. Reducing the charge value from 20 to 10 (quicker activation)
  2. Increasing the value increment from 1 to 5 (more powerful scaling)

This appears to be a deliberate balance change to make the relic more effective.

Also applies to: 167-167


215-215: Renamed parameter and improved filtering logic.

Changing from ownedRelics to excludedRelics makes the parameter's purpose clearer. The updated filtering logic correctly checks that available relics are not in the excluded list rather than the owned list, which is more logical for a randomization function.

Also applies to: 218-218


221-223: Implemented deterministic randomization.

Creating a new RandomNumberGenerator with a seed based on the global RNG and current room provides deterministic randomness for consistent gameplay results. This is good for reproducibility, testing, and potentially allowing "seeded" runs.


243-245: Implemented deterministic randomization for note rewards.

Similar to the relics, notes now use deterministic randomization tied to the room seed, ensuring consistent behavior across playthroughs with the same seed.

scenes/Maps/scripts/Cartographer.cs (9)

7-9: Added XML documentation for the class.

Adding XML summary documentation provides better clarity about the Cartographer class's purpose and responsibilities, which will help with maintainability and code discovery.


12-12: Added standardized LoadPath constant.

The addition of a static LoadPath constant follows a good pattern seen in other files like EndScreen, making scene loading more consistent throughout the codebase.


19-19: Simplified _focusedButton initialization.

Removed the explicit null initialization, which is redundant in C# as reference types are automatically initialized to null.


21-29: Introduced StageIcons dictionary for improved organization.

The addition of a static dictionary to map stage types to their icons eliminates the need for switch statements and provides a cleaner, more maintainable way to associate icons with stages.


46-46: Simplified music playback access.

Using BgAudioPlayer.LiveInstance directly simplifies the code and leverages the singleton pattern correctly, removing the need to find and cache the audio player node.


94-95: Simplified icon assignment using the StageIcons dictionary.

The code now directly accesses the icon from the StageIcons dictionary rather than using a switch statement, making it more maintainable and less error-prone when adding new stage types.


115-115: Improved scene loading with PreloadScene.

Using the new PreloadScene method from StageProducer.LiveInstance correctly delegates scene loading responsibility to the proper manager class.


129-130: Streamlined stage transition flow.

These changes improve the API usage by:

  1. Using BgAudioPlayer.LiveInstance.StopMusic() for music management
  2. Using StageProducer.LiveInstance.TransitionFromRoom() for scene transitions

This creates a cleaner separation of responsibilities between audio management and scene management.


136-136: Standardized scene loading using EndScreen.LoadPath.

Using the LoadPath constant from EndScreen ensures consistent scene loading throughout the codebase and centralizes path management, making future path changes easier to maintain.

scenes/NoteManager/scripts/InputHandler.cs (1)

5-6: Docstring clarity approved.
This updated summary clarifies the role of the InputHandler.

scenes/BattleDirector/NotePlacementBar.tscn (5)

3-6: Updated resource paths match naming conventions.
Switching to capitalized resource paths and reorganized directories ensures consistency across the project assets.


52-66: Refined node paths for improved clarity.
Introducing _notePlacementBar, _particles, _fullBarParticles, etc., clarifies references to child nodes. These changes look consistent with your new naming scheme.


67-77: Renamed to “PlacementBar” for clarity.
Renaming this Control node clarifies that it represents the note placement bar. No issues found.


78-89: GPU particles usage.
Rock node is set to GPUParticles2D. This is generally beneficial for performance, but ensure it’s consistent with how you handle other particles in the scene.


103-118: UI node rename aligns with naming style.
Renaming this TextEdit control to CurrentCombo clarifies its usage. Code references seem consistent.

Globals/TimeKeeper.cs (3)

1-6: Improved summary detailing purpose.
Expanding the class summary clarifies that this node manages global song position.


23-28: Initialization method is straightforward.
InitVals zeros out time and sets a fresh beat. Make sure it’s called before any calls to GetBeatFromTime.


21-21:

Details

❓ Verification inconclusive

Expose LastBeat with caution.
Publicly settable properties can be overwritten unintentionally. Verify that external writes won’t cause timing inconsistencies.


🏁 Script executed:

#!/bin/bash
# Description: Search for any direct writes to the `LastBeat` property 
# to confirm usage is controlled.
rg "LastBeat\s*="

Length of output: 156


Attention: Verify Controlled Modifications to LastBeat
The global property is directly written to both in its own file (initialization in Globals/TimeKeeper.cs) and externally (e.g., in scenes/BattleDirector/scripts/BattleDirector.cs). Since such external updates could unintentionally lead to timing inconsistencies or race conditions, please double-check that these assignments are deliberate and safely coordinated. If multiple writers are expected, consider encapsulating updates (for example, by using a private setter with a public update method) to ensure controlled modifications.

Globals/SaveSystem.cs (6)

6-8: Well-structured XML documentation for SaveSystem class

The addition of XML documentation improves code readability and provides clear context about the SaveSystem's purpose.


28-30: Good addition of XML documentation for InitConfig method

The remarks section clearly documents the side effect of overwriting existing files.


128-128: Simplified error message

Removing the method name from the error message is fine, but ensure consistent error messaging style across the codebase.


140-146: Excellent use of init-only properties for SaveFile class

Changing these properties from get; set; to get; init; enforces immutability after object initialization, which is a strong design improvement that prevents unintended modification of save data.


186-188: Clear XML documentation for LoadGame method

The addition of XML documentation with remarks clearly describes the return behavior of the method.


15-15:

Details

✅ Verification successful

Verify impact of DefaultVolume value change from 80f to 1f

This change aligns with the volume slider range modification (0-1 scale) in OptionsMenu.tscn, but ensure all volume-related code throughout the project has been updated to handle this new scale.


🏁 Script executed:

#!/bin/bash
# Search for code that might still be using the old volume scale (expecting values around 80)
rg -tcs "Volume.*[5-8]0" --glob "!*SaveSystem.cs"

Length of output: 51


Below is an additional verification script to re-check that no legacy volume values (specifically “80f”) remain in the repository outside of the updated file:

Please run this script to ensure that:

  • The DefaultVolume now set to 1f is confirmed in Globals/SaveSystem.cs.
  • There are no remaining references to the old scale value “80f” elsewhere in the codebase.

After verifying these results, we can confidently conclude that the volume-related changes align with the updated options (slider range 0–1) and that no legacy usages remain.


🏁 Script executed:

#!/bin/bash
echo "Verifying that DefaultVolume is correctly set to 1f in Globals/SaveSystem.cs:"
rg -tcs "DefaultVolume\s*=\s*1f" Globals/SaveSystem.cs

echo "Searching for any occurrence of the legacy value 80f (excluding Globals/SaveSystem.cs):"
rg -tcs "\b80f\b" --glob "!Globals/SaveSystem.cs"

Length of output: 624


Verified: Volume Scaling Update is Consistent

  • Confirmed that Globals/SaveSystem.cs now defines DefaultVolume as 1f.
  • No occurrences of the legacy value 80f were found elsewhere in the repository, indicating that all volume-related logic has been updated to use the new 0–1 scale.
Scenes/UI/Options/OptionsMenu.tscn (3)

3-4: Standardized resource paths

The update to resource paths aligns with a consistent directory structure and capitalization convention. This improves maintainability by enforcing a clearer organization of project assets.


9-9: Changed initial focus element

The focus has been moved from LanguageSelection to the high contrast CheckBox. Verify that this is the intended initial focus when the menu is opened.


99-101: Volume scale updated to 0-1 range

The volume slider has been reconfigured to use a 0-1 scale instead of 0-80, which aligns with the DefaultVolume constant change in SaveSystem.cs. The addition of a 0.01 step value provides finer control over volume adjustments.

Scenes/UI/Options/HowToPlay.tscn (2)

3-9: Updated resource paths to follow convention

Resource paths have been standardized to match the project's new directory structure and naming convention. This improves asset organization and maintainability.


23-23:

Details

✅ Verification successful

Added explicit layout_mode property

The addition of layout_mode = 0 to ColorRect, Label, and ReturnButton nodes explicitly sets their layout behavior. Ensure this is consistent with the UI system design throughout the project.

Also applies to: 29-29, 37-37


🏁 Script executed:

#!/bin/bash
# Check for consistent layout_mode usage in other UI scenes
rg "layout_mode = 0" --type-add="tscn:*.tscn" -t tscn

Length of output: 1020


Explicit UI Layout Confirmation: The addition of layout_mode = 0 in Scenes/UI/Options/HowToPlay.tscn (lines 23, 29, and 37) clearly sets the intended layout behavior. Our search confirms that this explicit setting is consistently applied across other UI scenes (e.g., Scenes/UI/Remapping/Remap.tscn, Scenes/UI/TitleScreen/SceneChange.tscn, etc.). Please ensure this aligns with the overall UI design specifications.

Scenes/UI/Options/Scripts/OptionsMenu.cs (7)

1-1: Implemented IFocusableMenu interface

Implementing the IFocusableMenu interface is an excellent architectural improvement that standardizes menu navigation and focus management. The addition of the Prev property enables proper transition between menus.

Also applies to: 4-4, 8-8


6-6: Added static LoadPath for consistent scene loading

Using a static LoadPath property improves consistency in scene loading and reduces the risk of path-related errors throughout the codebase.


29-29: Adjusted MinVolumeVal to match new volume scale

Changing MinVolumeVal from 50f to 0f aligns with the new 0-1 volume scale. This provides a full range of volume control from silence to maximum volume.


34-36: Improved volume handling with logarithmic scale

Converting between linear and decibel scales using Mathf.DbToLinear and Mathf.LinearToDb is a significant improvement. Human perception of loudness is logarithmic, so this approach provides a more natural volume control experience.

Also applies to: 104-107


60-71: Well-implemented focus management methods

The ResumeFocus and PauseFocus methods provide a clean mechanism for managing process modes and UI focus when transitioning between menus.


73-78: Improved menu navigation with IFocusableMenu

The OpenMenu and ReturnToPrev methods now properly implement the IFocusableMenu interface, ensuring consistent behavior across all menus in the application.

Also applies to: 80-84


88-92: Consistent scene loading using static paths

Updated scene loading to use static LoadPath properties from their respective classes improves consistency and maintainability.

Also applies to: 118-121

Scenes/UI/TitleScreen/Scripts/TitleScreen.cs (3)

35-39: Confirm the design choice to show a warning.
OpenMenu() is intentionally flagged as undefined behavior. Ensure this is the desired final behavior. If there's a future plan to allow opening the TitleScreen from other menus, consider implementing real logic here.


53-61: Monitor tween overhead.
An indefinitely looping tween is fine for small scenes. Just be aware of potential overhead if many such tweens run simultaneously in larger projects.


17-21:

Details

❓ Verification inconclusive

Handle potential null in event connections.
Calling Options.Pressed += OpenOptions; is convenient, but ensure Options is non-null at runtime to prevent a NullReferenceException.

Run this script to verify no occurrences of Options = null appear in prior lines or in other partial classes referencing TitleScreen:


🏁 Script executed:

#!/bin/bash
rg --context 3 "Options\s*=\s*null" 

Length of output: 37


Attention: Confirm Proper Initialization of Options

The code currently connects the event handler as follows:

public override void _Ready()
{
    TweenLight();
    Options.Pressed += OpenOptions;
}

The search for explicit assignments setting Options = null returned no results, which suggests that no part of the code explicitly assigns null to Options. However, this alone doesn’t guarantee that Options will always be non-null at runtime (e.g., if it’s expected to be injected via the scene editor or a GetNode() call elsewhere).

Please verify manually that:

  • Options is reliably initialized prior to the connection (for example, via editor wiring or through an initialization call) and cannot be inadvertently null.
  • A null-check is added if there’s any risk that Options might be unassigned, to avoid potential NullReferenceException.
Scenes/UI/Remapping/Remap.tscn (3)

11-11: Node path array check.
The node_paths property now expects "LeftKey", "RightKey", "UpKey", "DownKey", "_closeButton". Ensure these node paths exist under the Remap node at runtime, or an invalid path warning will appear.


14-17: Consistent naming of NodePath properties.
Renaming leftKeyLeftKey, etc., supports a more standardized naming convention. This is good for readability.


3-9:

Details

✅ Verification successful

Verify resource paths.
All references to external texture resources have changed. Confirm that these files exist in the new directory structure and load correctly at runtime.


🏁 Script executed:

#!/bin/bash
# Check for the presence of the new asset paths in the repository
fd "Arrow_Left_Key_Light.png" 
fd "Arrow_Down_Key_Light.png"
fd "Arrow_Up_Key_Light.png"
fd "Arrow_Right_Key_Light.png"
fd "BattleFrame1.png"
fd "NoteArrow_Black_Outline.png"

Length of output: 771


Resource paths verified:
After running the checks, all external texture assets are present in their new directory locations. Specifically:

  • Scenes/UI/Remapping/Assets:

    • Arrow_Left_Key_Light.png
    • Arrow_Down_Key_Light.png
    • Arrow_Up_Key_Light.png
    • Arrow_Right_Key_Light.png
  • SharedAssets:

    • BattleFrame1.png
    • NoteArrow_Black_Outline.png

No issues were found with the updated paths, so please ensure these resources load correctly at runtime.

scenes/BattleDirector/scripts/Conductor.cs (5)

12-18: Initialize private fields carefully.
Declaring MM, _noteData, _beatSpawnOffset, and _initialized is straightforward, but ensure _noteData is never accessed before calling Initialize(). Otherwise, it may cause partial or incomplete usage.


40-55: Validate dictionary key “0” usage.
Line 47 uses Scribe.NoteDictionary[0]. If “0” is not guaranteed in Scribe.NoteDictionary, this could throw a KeyNotFoundException. Ensure a safe fallback or confirm the dictionary always has index 0.


65-71: Event-based approach for note input.
Introducing NoteInputEvent offers a cleaner approach than direct function calls. Just ensure all listeners unsubscribed properly during scene shutdown.


74-91: BinarySearch usage.
AddNoteData leverages _noteData.BinarySearch(result). Confirm that ArrowData implements IComparable<ArrowData> or a suitable comparer is provided. Otherwise, the sort order and insertion logic may break unpredictably.


127-131: More flexible progressive spawning.
ProgressiveSpawnNotes spawns notes at beat + _beatSpawnOffset. If you allow multiple increments or real-time adjustments, confirm that you don’t skip too many beats.

Classes/MidiMaestro/MidiMaestro.cs (7)

8-11: Good use of XML documentation.
Your class summary clearly states the primary function of the MidiMaestro class, aiding maintainability and clarity.


20-23: Naming consistency improved.
Switching from midiNoteInfo[] to MidiNoteInfo[] aligns with .NET naming conventions.


50-52: Selecting notes for each track is concise and correct.
Using LINQ to extract and wrap notes in MidiNoteInfo is a clean approach.


73-75: XML doc clarifies usage.
This documentation block ensures future maintainers understand the purpose and expected return of GetNotes().


90-94: Renaming and constructor usage.
MidiNoteInfo is aptly named. The constructor properly stores a reference to the underlying note. No issues spotted.


111-113: Return type in ticks is consistent with DryWetMidi.
Using _note.EndTime for the end time in ticks is fine.


113-122: Added duration in beats method is beneficial.
GetDurationBeats() enriches your note logic by converting length to a measure of beats. This will simplify timing calculations.

Scenes/UI/Remapping/ControlSettings.cs (12)

1-2: Added library imports are valid.
You’ve introduced System.Collections.Generic likely for the new dictionary usage. Looks correct.


5-7: Implementing IFocusableMenu.
Having ControlSettings implement IFocusableMenu is consistent with your other menus. Good step toward unified navigation.


8-8: Static LoadPath is a good practice.
Centralized references like LoadPath facilitate future changes to the TSCN resource location.


21-21: Introducing Prev as an IFocusableMenu reference.
This property is crucial for returning to the previous menu. No pitfalls detected.


28-70: Centralized keyboard sprite mappings.
Storing dictionary-based sprite paths is cleaner than scattered references. This approach scales well if more control schemes are added.


85-86: Connecting button to new navigation.
Replacing _closeButton.Pressed += ReturnToPrev; is consistent with the new focusable menu design.


88-97: ResumeFocus and PauseFocus methods align with IFocusableMenu contract.
This ensures the node’s process mode is toggled appropriately without side effects.


99-105: OpenMenu sets Prev and calls GetCurrentSelection.
Pausing the previous menu and immediately setting the appropriate scheme visuals is a smooth approach for context switching.


107-111: ReturnToPrev resumes the previous menu.
This gracefully closes the current menu. The logic is straightforward and consistent with your other menu implementations.


113-135: Dynamic scheme selection.
GetCurrentSelection() automatically loads the correct button and sprite set based on saved config. This is an excellent way to reduce duplication.


141-141: Catching 'ui_cancel' input to close menu.
A simple, intuitive approach to let users back out of the menu quickly.


189-195: ChangeKeySprites usage.
Applying new textures by looking up the selected dictionary is efficient and flexible.

Scenes/UI/TitleScreen/TitleScreen.tscn (2)

4-13: Refactoring resource paths enhances organization.
Pointing scripts, textures, and shaders to res://Scenes/UI/TitleScreen/... clarifies ownership and location. Great for future maintainability.


225-229:

Details

✅ Verification successful

EnemPuppet node adjustments.
Hiding or disabling certain fields in the node might reduce flexibility if you plan to animate or show these puppets later. However, if they’re intentionally removed from gameplay, this is fine. Confirm that no references to these properties remain in other scripts.


🏁 Script executed:

#!/bin/bash
# Searching for references to removed EnemPuppet properties
rg "EnemPuppet.*(StartPos|hideHealth|InitScale)"

Length of output: 50


Below is a new shell script to re-run our search more broadly. The previous command’s lack of output makes it hard to confidently conclude that no references exist. Please run the following script to search for any occurrences of “EnemPuppet” as well as the individual properties “StartPos”, “hideHealth”, and “InitScale” throughout the repository. Once you verify that no relevant references appear, you can safely conclude that the removed properties are not in use elsewhere.

If these searches return no matches, then it is likely that the removed properties are no longer referenced, and hiding the node’s fields is intentional. If you spot any output, please review those references carefully to ensure they aren’t causing unintended behavior.

Next Steps:

  • Run the above script.
  • Manually inspect any output if found.
  • Confirm that no scripts are referencing the removed properties.

🏁 Script executed:

#!/bin/bash
echo "Searching for any references to 'EnemPuppet':"
rg -i 'EnemPuppet' -n .

echo "Searching for 'EnemPuppet' combined with 'StartPos':"
rg -i 'EnemPuppet.*StartPos' -n .

echo "Searching for 'EnemPuppet' combined with 'hideHealth':"
rg -i 'EnemPuppet.*hideHealth' -n .

echo "Searching for 'EnemPuppet' combined with 'InitScale':"
rg -i 'EnemPuppet.*InitScale' -n .

Length of output: 1532


EnemPuppet Node Adjustments Verified
Our extended search confirms that while the name "EnemPuppet" appears in multiple scenes (e.g., in enemy puppet files), none of these references include the removed properties (StartPos, hideHealth, InitScale). This indicates that hiding or disabling these properties in the TitleScreen.tscn node (lines 225–229) is intentional and safe from breaking dependent functionality.

  • Verified in TitleScreen.tscn that the adjustments are isolated.
  • No references to the removed properties were found across the repository.

Please ensure that any future changes (e.g., re-enabling animations or dynamic behaviors for these nodes) account for these adjustments.

scenes/ChartViewport/scripts/ChartManager.cs (11)

2-8: New imports and class summary.
Using System.Collections.Generic supports your new lists. The updated doc comment clarifies this class’s broader responsibility for battle visuals.


28-33: Connecting to InputHandler signals.
OnNotePressed and OnNoteReleased connections keep things modular. The subscription approach is a standard design for your event-based logic.


36-59: Initialize method enhances clarity.
You replaced a prior approach with a more explicit Initialize(SongData). This makes the chart length calculations and BPM assignment easier to follow. Checking _initialized helps prevent duplicate setup.


94-112: AddNoteArrow method separates hold and normal arrows well.
Using separate pools is a clean design. The new parameter preHit is helpful for adjusting arrow state if needed.


114-123: InstantiateNewArrow & DePoolArrow logic is well structured.
The queue-based approach to reusing arrows is correct. Good job wrapping each arrow with event handlers.


144-155: Pooling behavior.
Safely removing arrows from _queuedArrows before disabling them eliminates dangling references. This approach is robust.


158-160: Introduction of ArrowFromInput event.
Replacing direct signals with a single event is more flexible. This also allows for hooking up additional listeners in the future.


170-185: OnNoteReleased and HandleRelease.
Setting holds to null promptly and calling ArrowFromInput again ensures the correct beat data for the release. This is neat for tracking hold note durations.


200-231: GetArrowFromInput logic.
This function elegantly finds the closest arrow within a playable window. Returning ArrowData.Placeholder for an out-of-range arrow is a solid approach to avoid spurious arrow creation.


234-240: ComboText method.
Displaying combo text and triggering FeedbackEffect is straightforward. The Tr() usage is good for localization.


162-168:

Details

❓ Verification inconclusive

Preventing re-press input at start.
You skip logic if the user presses a note at beat zero or if a hold already exists. This effectively removes accidental early presses.

Could this inadvertently block intended inputs right at the start, e.g., a user intentionally pressing on beat zero? Verify game design requirements.


🏁 Script executed:

#!/bin/bash
# Searching references to confirm usage of TimeKeeper.LastBeat  
rg "TimeKeeper\.LastBeat"

Length of output: 2180


Clarification on Input Handling at Beat Zero

The check in ChartManager.csif (TimeKeeper.LastBeat.CompareTo(Beat.Zero) == 0 || _currentHolds[(int)type] != null)—appears to be an intentional measure to prevent processing note inputs when the game state is still at its initialization (i.e., beat zero) or when a hold is active. Our search confirms that similar logic is used consistently in other parts of the code (for example, in NoteArrow.cs), suggesting that this behavior is by design.

  • Ensure that the decision to block inputs at beat zero aligns with the game design requirements. If there is a scenario where an intentional note press at beat zero is needed, further discussion with the design team might be warranted.
Globals/StageProducer.cs (8)

6-8: Good use of documentation blocks.
These doc comments provide clarity for future maintainers about the purpose of this class.


16-17: Read-only properties for map data are maintainable.
Using read-only properties for MapSize and Map prevents external modification, improving encapsulation.


59-63: Initialization logic looks consistent.
Creating a fresh PlayerStats and regenerating the map is coherent. The approach to randomize the seed ensures a new run experience.


105-107: Transition logic clarity.
TransitionFromRoom delegates to TransitionStage, which helps keep logic centralized. Make sure any special transitions are handled properly elsewhere.


11-11:

Details

❓ Verification inconclusive

Confirm only one active instance can exist.
Declaring LiveInstance as a static property is fine if your design requires exactly one StageProducer at a time. Ensure there's no scenario where multiple instances cause unexpected behavior or references being overwritten.

Please run the following shell script to confirm no other StageProducer is instantiated in the codebase:


🏁 Script executed:

#!/bin/bash
# Find references to StageProducer constructor or instantiations
rg --context 5 $'new StageProducer'

Length of output: 36


Review Verification: Manual Check Recommended for StageProducer Instantiation

The automated search for new StageProducer returned no instances, which suggests that direct instantiation of StageProducer might not be occurring elsewhere in the codebase. However, the lack of output raises concerns about potential false negatives. Please manually verify that no additional instantiations occur (such as through reflection or other indirect patterns) to ensure that only the designated static instance (LiveInstance) is active.

  • Action: Manually inspect the codebase for non-direct instantiation methods of StageProducer.
  • Focus: Ensure no alternative instantiation paths exist that could inadvertently create multiple active instances.

14-14:

Details

❓ Verification inconclusive

Random number generator usage check.
GlobalRng is made static and shared. Ensure that concurrency issues do not arise if multiple threads (e.g., in Task.Run) might access GlobalRng simultaneously.

Please confirm that GlobalRng is only used from the main thread or is properly synchronized if used elsewhere.


🏁 Script executed:

#!/bin/bash
# Search for direct references to GlobalRng outside StageProducer
rg -A 5 "GlobalRng" 

Length of output: 4361


I'll now run an additional script to search if there's any usage of Task.Run in conjunction with GlobalRng that might indicate multithreaded access.


🏁 Script executed:

#!/bin/bash
# Search for Task.Run in the repository to check for potential concurrent usage of GlobalRng
rg -n "Task\.Run" .

Length of output: 169


Based on the results:

  • GlobalRng is referenced in multiple parts of the codebase (e.g., in NotePlacementBar.cs, SaveSystem.cs, FunkEngineNameSpace.cs, and Scribe.cs).
  • There are asynchronous invocations via Task.Run (observed in StageProducer.cs), which increases the likelihood of concurrent access to GlobalRng.

Action Required:
Verify that all access to GlobalRng is either confined to a single thread or is properly synchronized. If there is potential for concurrent access from within Task.Run (or elsewhere), consider guarding those accesses with appropriate locking or switch to a thread-safe RNG implementation.

Rewritten Review Comment:

Concurrent Access to GlobalRng Detected
The shared static GlobalRng is referenced across multiple files, and asynchronous invocations (via Task.Run in StageProducer.cs) suggest it may be accessed concurrently. Please ensure that:

  • All concurrent accesses to GlobalRng are properly synchronized (e.g., using locks), or
  • GlobalRng is limited to single-thread access to avoid potential race conditions.

21-22:

Details

❓ Verification inconclusive

Track concurrency if multiple tasks access these fields.
Storing _curScene and _preloadStage at the class level could be a source of race conditions when tasks are involved. Ensure only one scene is preloaded at a time.

Are there any parallel calls to PreloadScene()? If so, _preloadStage may be overwritten unexpectedly.


🏁 Script executed:

#!/bin/bash
rg "PreloadScene"

Length of output: 182


Concurrency Safety Alert:
The grep output shows that PreloadScene is called from one location in Cartographer.cs (via StageProducer.LiveInstance.PreloadScene(roomIdx)), with its definition in Globals/StageProducer.cs. Although we did not find multiple explicit callers, be mindful that even a single invocation from an asynchronous task could overlap with another, potentially leading to race conditions on _curScene and _preloadStage. Please verify that calls to PreloadScene()—now or in future revisions—are serialized or otherwise protected (e.g., via locking or similar concurrency controls) to ensure that only one scene is preloaded at any time.


53-57:

Details

❓ Verification inconclusive

Potential operator precedence hazard.
The expression on line 55 uses GlobalRng.Seed << 5 / 2. Since / has higher precedence than << in C#, this becomes GlobalRng.Seed << (5 / 2), which is effectively GlobalRng.Seed << 2 (integer division). Verify that this is the intended behavior.


🏁 Script executed:

#!/bin/bash
echo "Double-check expression in StageProducer.cs line 55 for clarified parentheses."

Length of output: 166


Action: Confirm operator precedence and clarify intended behavior

At line 55 in Globals/StageProducer.cs, the expression

GlobalRng.State = GlobalRng.Seed << 5 / 2;

is interpreted by the C# compiler as:

GlobalRng.State = GlobalRng.Seed << (5 / 2);

Since integer division yields 5 / 2 = 2, this is equivalent to shifting by 2 bits (i.e., GlobalRng.Seed << 2). Please verify if this is indeed the intended behavior. If your intention is to apply the left-shift by 5 bits before performing a division by 2 (i.e., (GlobalRng.Seed << 5) / 2), then adding explicit parentheses would make this clear and avoid any ambiguity.

Scenes/BattleDirector/BattleScene.tscn (6)

20-25: Node paths re-labeled.
Renaming the node paths to “CM”, “NPB” etc. is organized. Verify other scripts referencing them have the correct new names to avoid runtime errors.


32-34: UILayer now references MenuModule.cs.
Ensure any prior references to the old script path are updated. The CurSceneNode link is correct for parent references.


37-37: Conductor script ext resource updated.
Matches the new path. Double-check the Conductor node’s logic is still correct after re-path.


40-51: Instances for NotePlacementBar & SubViewport.
Paths updated to res://Scenes/BattleDirector/NotePlacementBar.tscn and res://Scenes/ChartViewport/ChartViewport.tscn. No concerns if the scenes exist.


61-62: Texture references.
Switching to SharedAssets/BackGround_Full.png and BattleFrame1.png is consistent with the new naming scheme. Approve if these files load without issues.

Also applies to: 68-68


3-9:

Details

❓ Verification inconclusive

Updated resource paths.
All references updated to the new directory structure. Confirm that these .cs scripts and assets exist at the specified paths.


🏁 Script executed:

#!/bin/bash
fd "BattleDirector.cs" --exec realpath {}
fd "MenuModule.cs" --exec realpath {}
fd "Conductor.cs" --exec realpath {}
fd "NotePlacementBar.tscn" --exec realpath {}
fd "ChartViewport.tscn" --exec realpath {}
fd "BackGround_Full.png" --exec realpath {}
fd "BattleFrame1.png" --exec realpath {}

Length of output: 664


Resource Path Verification Required:
The original verification script using fd with realpath did not produce the expected output due to the unavailability of the realpath command. Please run the above script to verify that the following updated resource paths exist in the repository:

  • Scenes/BattleDirector/Scripts/BattleDirector.cs
  • Scenes/UI/Scripts/MenuModule.cs
  • Scenes/BattleDirector/Scripts/Conductor.cs
  • Scenes/BattleDirector/NotePlacementBar.tscn
  • Scenes/ChartViewport/ChartViewport.tscn
  • SharedAssets/BackGround_Full.png
  • SharedAssets/BattleFrame1.png

Once confirmed manually, kindly update this information accordingly.


🏁 Script executed:

#!/bin/bash
for file in BattleDirector.cs MenuModule.cs Conductor.cs NotePlacementBar.tscn ChartViewport.tscn BackGround_Full.png BattleFrame1.png; do
    echo "Searching for $file:"
    find . -type f -name "$file" -print
done

Length of output: 2216


Action: Verify Resource Paths and Directory Name Casing

The updated resource paths have been confirmed as follows:

  • BattleDirector.cs: Found at ./scenes/BattleDirector/scripts/BattleDirector.cs
  • MenuModule.cs: Found at ./scenes/UI/scripts/MenuModule.cs
  • Conductor.cs: Found at ./scenes/BattleDirector/scripts/Conductor.cs
  • NotePlacementBar.tscn: Found at ./scenes/BattleDirector/NotePlacementBar.tscn
  • ChartViewport.tscn: Found at ./scenes/ChartViewport/ChartViewport.tscn
  • BackGround_Full.png: Found at ./SharedAssets/BackGround_Full.png
  • BattleFrame1.png: Found at ./SharedAssets/BattleFrame1.png

Note: While the resources exist, the asset references in the .tscn file use directory names with an initial uppercase (e.g., Scenes/BattleDirector/Scripts/...), whereas the actual directory names are lowercase (scenes/BattleDirector/scripts/...). Please verify that this casing difference is intentional and will not cause issues on target systems, especially on case-sensitive platforms.

scenes/NoteManager/scripts/NoteArrow.cs (14)

1-4: Adoption of file-scoped namespace and references

The switch to a file-scoped namespace and addition of using System; is modern and clear. No issues found.


9-11: Introducing constants and static fields

Defining LoadPath, LeftBound, and BeatBound as constants/static readonly fields is a good practice, ensuring clear configuration of arrow behavior.


23-25: New instance fields for timing and state

Adding _beatTime, IsHit, and _isQueued fields clarifies the note’s state. The naming is consistent, and it suits the class’s purpose.


27-27: Z-index assignment in _Ready

Calling ZIndex = 2 in _Ready() ensures proper draw order. No issues here.

Also applies to: 29-30


44-49: Preventing multiple hits

The early return if IsHit is already true prevents repeat hits. The modulate change to 70% is a clean way to indicate a successful hit.


52-60: Hittable event logic

The CheckHittable method and _isQueued mechanism effectively limit how often QueueForHit is invoked.


63-73: Missed check logic

Raising a missed event if the time difference is greater than a beat is consistent with typical rhythm game design.


75-79: Kill event and re-pooling

Raising QueueForPool provides a straightforward way to recycle or clean up arrows after their lifecycle ends.


80-88: Recycle method for pooling

Resetting visibility, process mode, and flags ensures a clean state for note reuse. Well-structured for object pooling workflows.


90-94: BeatChecks grouping

Encapsulating CheckMissed() and CheckHittable() in a single method keeps beat-based checks organized and maintainable.


96-104: Position & time boundary checks

Combining horizontal bounds and beat-based checks is a solid approach to remove stale or far-off arrows.


106-114: _Process method

Sequentially running beat checks, updating position, and then calling positional checks is logical. No issues found.


134-138: IsInRange method

Checking integer-rounded beat positions is valid for approximate match. No concerns.


116-132:

Details

❓ Verification inconclusive

GetNewPosX: guard against division by zero

This method depends on TimeKeeper.SongLength and TimeKeeper.LoopsPerSong being positive. Please confirm that zero or negative values are impossible:


🏁 Script executed:

#!/bin/bash
# Search references to ensure TimeKeeper.SongLength and LoopsPerSong are always set > 0
rg "TimeKeeper\.(SongLength|LoopsPerSong)"

Length of output: 732


Guard against division by zero in GetNewPosX

The search confirms that both TimeKeeper.SongLength and TimeKeeper.LoopsPerSong are set in scenes/ChartViewport/scripts/ChartManager.cs from songData, with no visible checks to ensure they are strictly positive. Please verify that the source of these values guarantees they are > 0. If there’s any risk they could be zero or negative, consider adding validation either when assigning these values or directly in GetNewPosX. For example:

if (TimeKeeper.SongLength <= 0 || TimeKeeper.LoopsPerSong <= 0) {
    // Handle error (e.g., return a safe default value or log an error)
}
scenes/BattleDirector/scripts/BattleDirector.cs (23)

5-5: Summary doc comment

A clear class-level summary helps maintain readability. No problems noted.


11-12: LoadPath constant

Storing a static resource path is consistent with other classes. Straightforward.


17-17: Conductor field

Declaring private Conductor CD; clarifies external dependencies. Integration looks fine.


20-20: ChartManager field

Retaining a separate chart manager object is logical. No issues found.


23-23: NotePlacementBar (NPB)

Renaming / referencing the placement bar is tidy and matches the event-driven approach for note placement.


29-29: _focusedButton

Ensure _focusedButton is always non-null prior to usage. If removed from the scene, method calls may throw errors.


33-33: _initializedPlaying

A clean boolean flag to indicate whether playback has started. No further issues.


38-48: PlayerAddNote method

Validates the bar can place a note, spawns and hits the note, and sends it to the Conductor. Good cohesive structure.


62-68: SyncStartWithMix

Scheduling BeginPlayback at the next mix and removing the button is a sensible approach to controlling game flow.


70-75: BeginPlayback

Starts tweens and audio, and sets _initializedPlaying to true—straightforward initialization logic.


79-79: Loading and validating song data

Obtaining SongData, using Audio.GetLength() if unspecified, and setting up the stream is a solid pattern.

Also applies to: 81-81, 83-83


86-91: Initializing game components

Initialization calls for TimeKeeper, Player, Enemies, and the Conductor are cohesive. No immediate flaws noted.


92-93: Button focus & press setup

Focusing and connecting the start button to SyncStartWithMix ensures an intuitive starting mechanism.


115-120: _Process to update beat

Updating TimeKeeper.CurrentTime with audio position, computing real beat, and calling UpdateBeat looks correct.


122-134: UpdateBeat method

Triggers additional note spawning if a new beat or loop is detected, then updates LastBeat. Proper for real-time sync.


149-169: OnTimedInput

Handles placeholders, empty beats, or valid notes. The fallback to ForceMiss if note placement fails is a solid design.


171-176: ForceMiss logic

Setting Timing.Miss on the placement bar, resetting combo, and applying damage to the player is consistent with a penalty system.


199-209: CheckBattleStatus

Flows correctly into OnBattleLost or OnBattleWon if the relevant puppet is defeated.


211-216: OnBattleWon

Pauses audio, cleans up relics, and displays rewards. Straightforward end-of-battle scenario.


218-224: OnBattleLost

Pauses audio, clears save data, and displays EndScreen for losing conditions. No issues.


228-235: Reward selection

Instantiating a reward selection UI, labeling it, and binding a callback to proceed post-selection is a well-organized approach.


238-241: TransitionOutOfBattle

Transitions the stage out of the battle state, finalizing the flow. No concerns identified.


298-298: DebugKillEnemy commented out

The debug function is now disabled. Consider removing it if no longer needed or keep it around for quick testing.

scenes/BattleDirector/scripts/NotePlacementBar.cs (10)

38-38: Note array usage looks good.
Copying the player's note data ensures immutability. This prevents unintended side effects, especially for shared data in a battle context.


40-47: Check integer division logic in combo multiplier calculation.
_currentCombo / _notesToIncreaseCombo can produce 0 if _currentCombo < _notesToIncreaseCombo. Likely intended, but verify that it matches your game’s design for partial combos.


83-83: Regions enhance readability.
Continuation of consistent region usage for “NoteQueue” is helpful for clearer organization.


84-89: Queue logic looks solid.
Exporting _currentNote and _nextNote clarifies references in the scene, and the shuffled queue approach ensures variety. The “ProgressQueue” method systematically manages empty queues, which is good for reliability.

Also applies to: 92-92, 109-109


154-158: Public accessor for combo is concise and clear.
No issues here; this getter ensures read-only exposure of _currentCombo.


160-165: Bonus multiplier updates are straightforward.
The current approach is simple yet effective. Good job ensuring that the UI (combo display) synchronizes.


167-170: Charge increment logic is correct.
Incrementing the bar by a simple integer value is consistent with the rest of the code. This approach grants flexibility in how many points to add externally.


172-175: CanPlaceNote check is well-defined.
This mirrors the setter logic used in CurrentBarValue. Good consistency for gating note placement.


199-205: HitNote logic is straightforward and covers the combo progression.
Incrementing _currentCombo and adding ComboMult to the bar is consistent with your design.


207-213: MissNote resets correctly.
Setting both _currentCombo and _bonusMult to 0 ensures that you lose all combo progress. Great clarity for player feedback.

Comment on lines +110 to +139
private Task _loadTask;

/**
* <summary>To be used from Cartographer. Preloads the scene during transition animation.
* This removes the occasionally noticeable load time for the scene change.</summary>
*/
public void PreloadScene(int nextRoomIdx)
{
TransitionStage(Map.GetRooms()[nextRoomIdx].Type, nextRoomIdx);
Stages nextStage = Map.GetRooms()[nextRoomIdx].Type;
Config = MakeBattleConfig(nextStage, nextRoomIdx);
switch (nextStage)
{
case Stages.Battle:
case Stages.Boss:
_loadTask = Task.Run(() =>
{
_preloadStage = GD.Load<PackedScene>(BattleDirector.LoadPath)
.Instantiate<Node>();
});
break;
case Stages.Chest:
_loadTask = Task.Run(() =>
{
_preloadStage = GD.Load<PackedScene>(ChestScene.LoadPath).Instantiate<Node>();
});
break;
default:
GD.PushError($"Error Scene Transition is {nextStage}");
break;
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Potential exception handling in background task.
Scenes are loaded asynchronously using _loadTask = Task.Run(() => { ... }). If GD.Load<PackedScene>() fails, no exception is caught and the load might silently fail. Consider wrapping with try/catch and logging errors.

+ try
+ {
    _preloadStage = GD.Load<PackedScene>(BattleDirector.LoadPath).Instantiate<Node>();
+ }
+ catch (Exception ex)
+ {
+    GD.PushError($"Scene load failed: {ex.Message}");
+    // handle fallback
+ }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
private Task _loadTask;
/**
* <summary>To be used from Cartographer. Preloads the scene during transition animation.
* This removes the occasionally noticeable load time for the scene change.</summary>
*/
public void PreloadScene(int nextRoomIdx)
{
TransitionStage(Map.GetRooms()[nextRoomIdx].Type, nextRoomIdx);
Stages nextStage = Map.GetRooms()[nextRoomIdx].Type;
Config = MakeBattleConfig(nextStage, nextRoomIdx);
switch (nextStage)
{
case Stages.Battle:
case Stages.Boss:
_loadTask = Task.Run(() =>
{
_preloadStage = GD.Load<PackedScene>(BattleDirector.LoadPath)
.Instantiate<Node>();
});
break;
case Stages.Chest:
_loadTask = Task.Run(() =>
{
_preloadStage = GD.Load<PackedScene>(ChestScene.LoadPath).Instantiate<Node>();
});
break;
default:
GD.PushError($"Error Scene Transition is {nextStage}");
break;
}
private Task _loadTask;
/**
* <summary>To be used from Cartographer. Preloads the scene during transition animation.
* This removes the occasionally noticeable load time for the scene change.</summary>
*/
public void PreloadScene(int nextRoomIdx)
{
Stages nextStage = Map.GetRooms()[nextRoomIdx].Type;
Config = MakeBattleConfig(nextStage, nextRoomIdx);
switch (nextStage)
{
case Stages.Battle:
case Stages.Boss:
_loadTask = Task.Run(() =>
{
+ try
+ {
- _preloadStage = GD.Load<PackedScene>(BattleDirector.LoadPath)
- .Instantiate<Node>();
+ _preloadStage = GD.Load<PackedScene>(BattleDirector.LoadPath).Instantiate<Node>();
+ }
+ catch (Exception ex)
+ {
+ GD.PushError($"Scene load failed: {ex.Message}");
+ // handle fallback
+ }
});
break;
case Stages.Chest:
_loadTask = Task.Run(() =>
{
_preloadStage = GD.Load<PackedScene>(ChestScene.LoadPath).Instantiate<Node>();
});
break;
default:
GD.PushError($"Error Scene Transition is {nextStage}");
break;
}
}

Comment on lines +32 to 42
public virtual void Init(CheckerData parentChecker, ArrowData arrowData, double beatTime)
{
Data = arrowData;
_beatTime = beatTime;

Position = new Vector2(GetNewPos(), parentArrowData.Node.GlobalPosition.Y);
RotationDegrees = parentArrowData.Node.RotationDegrees;
IconSprite.Texture = note.Texture;
Position = new Vector2(GetNewPosX(), parentChecker.Node.GlobalPosition.Y);
RotationDegrees = parentChecker.Node.RotationDegrees;
IconSprite.Texture = arrowData.NoteRef.Texture;
IconSprite.Rotation = -Rotation;
OutlineSprite.Modulate = parentChecker.Color;
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Initialization safeguards

Recommend null checks for arrowData.NoteRef and its Texture to avoid potential NullReferenceExceptions:

 public virtual void Init(CheckerData parentChecker, ArrowData arrowData, double beatTime)
 {
+    if (arrowData.NoteRef?.Texture == null)
+    {
+        GD.PrintErr("ArrowData or its Texture is null during initialization.");
+        return;
+    }
     Data = arrowData;
     ...
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
public virtual void Init(CheckerData parentChecker, ArrowData arrowData, double beatTime)
{
Data = arrowData;
_beatTime = beatTime;
Position = new Vector2(GetNewPos(), parentArrowData.Node.GlobalPosition.Y);
RotationDegrees = parentArrowData.Node.RotationDegrees;
IconSprite.Texture = note.Texture;
Position = new Vector2(GetNewPosX(), parentChecker.Node.GlobalPosition.Y);
RotationDegrees = parentChecker.Node.RotationDegrees;
IconSprite.Texture = arrowData.NoteRef.Texture;
IconSprite.Rotation = -Rotation;
OutlineSprite.Modulate = parentChecker.Color;
}
public virtual void Init(CheckerData parentChecker, ArrowData arrowData, double beatTime)
{
if (arrowData.NoteRef?.Texture == null)
{
GD.PrintErr("ArrowData or its Texture is null during initialization.");
return;
}
Data = arrowData;
_beatTime = beatTime;
Position = new Vector2(GetNewPosX(), parentChecker.Node.GlobalPosition.Y);
RotationDegrees = parentChecker.Node.RotationDegrees;
IconSprite.Texture = arrowData.NoteRef.Texture;
IconSprite.Rotation = -Rotation;
OutlineSprite.Modulate = parentChecker.Color;
}


[Export]
TextEdit currentComboMultText;
private TextureProgressBar _notePlacementBar;
Copy link

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Confirm that both particle emitters are fully utilized.
_notePlacementBar and _fullBarParticles are both exported. While _notePlacementBar is clearly used, _fullBarParticles doesn't seem to be referenced. If this is intentional or for future use, consider adding a reference or comment explaining its purpose. Otherwise, remove it to keep the code clean.

Also applies to: 36-36


🏁 Script executed:

#!/bin/bash
# Searching for all references to _fullBarParticles
rg '_fullBarParticles'

Length of output: 453


Attention: Review the utilization of the particle emitter references.

  • The _notePlacementBar is clearly used in the code.
  • The _fullBarParticles field, although assigned via the scene (as seen in NotePlacementBar.tscn), is only declared in the script and isn’t used in any logic.

Please confirm whether _fullBarParticles is intended for future use. If so, add a clarifying comment about its purpose; otherwise, consider removing it to keep the code clean. This recommendation also applies to the similar declaration at line 36.

@LifeHckr LifeHckr merged commit 1c36656 into main Apr 3, 2025
2 checks passed
@LifeHckr LifeHckr deleted the BoredDuringBreak branch April 7, 2025 05:20
This was referenced Jun 18, 2025
@coderabbitai coderabbitai bot mentioned this pull request Jul 1, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Really long hold notes will probably pool themselves before a player could finish playing them Near Beat ~= 0, auto-spawned notes can pop in.

2 participants