I liked the graphics, sound, and general vibe of the game. Couple notes though, some of which the other comments touch on:
- For others stuck on the locked door, the code is "928". I don't know why this is the code, since I count 10 candles and 3 book piles in this screenshot
- Every time you interact with the locked door and press the back button on this screen, the mirror shard by the entrance respawns. You can use this to infinitely farm the shards. I think similar things happen when you backtrack to previous rooms
- The door in this screenshot and the next level seem to infinitely loop into each other; I think someone else mentioned this door connecting to the exit of the next room instead of/in addition to the entrance, and that would explain this.
- As others have said, it would be nice if there was a restart/retry button in the game over menu.
Since I see you asking for how to implement checkpoints in the comments, I can try to give some short notes based on how I've approached implementation in one of my games before. I do not guarantee that this is the best way, but it is a way:
I assume the doors are currently programmed to load a packed scene containing the next room. If you create an autoload singleton that stores a variable identifying the current scene, and have the doors also update that variable, you can have global access to what scene the player is currently in. I suspect you already have an autoload singleton set up since the number of mirror shards the player has picked up persists between rooms, so you should be able to identify the current scene with a variable there. You can then use this information to have the retry button on the game over screen reload that scene. You can also store other information you want to persist between room transitions in the autoload singleton, such as a set of boolean flags tracking which items have already been picked up, and reference those in the _ready() function of each room to determine whether or not to spawn the item.