The one time that I did mess with procedural generation, I did a similar thing. Was generating a basic Zelda dungeon and I would just regenerate until it met certain global properties that I wanted. I’m not sure why I gravitated towards that solution, other than it was a 7 day time limit and so I probably didn’t want to waste time trying to do things “properly”, but it also seemed like the only solution in a way. Because you really can’t be sure when you made a “mistake” in the generation process exactly, so it’s not like reversing the current thing back to some “known good point” and changing something is guaranteed to produce a good result. Either way, I agree that ideally generation is fast enough to just throw out the bad ones.
@puzzlinggamedevАй бұрын
Very true. Sometimes one can identify ways to do backtracking for example, but generally that is better suited for off-line kinds of searches.
@alphabravo3481Ай бұрын
As a hobbyist, I recently switched from Pygame to Godot and it's very impressive.
@puzzlinggamedevАй бұрын
welcome to Godot! :)
@alphabravo3481Ай бұрын
I am curious why you chose 3D instead of 2D for this project? Interesting channel and game.
@puzzlinggamedevАй бұрын
I'm still pondering the possibility to switch to pure 2D but for now it works :)
@MrTomyCJ2 ай бұрын
How nice that I could notice the argentine english accent just 10 seconds into the video with no prior clue haha. Thanks for sharing the project!
@puzzlinggamedev2 ай бұрын
jajaja gracias a vos por mirar! hahaha Thanks to you for watching!
@noa_11042 ай бұрын
The idea seems great, but the specific result surprised me, haha. From the thumbnail I thought it's the other way around: when you see the light brown, then surely that means you can look into the room, while otherwise there's darkness ... Maybe there's quite a few very different possible approaches to this, but either way it definitely sounds logical to also add fog to the corridors. Maybe you can do an actual fog like effect where everything else just fades out or is in shadow without modifying the geometry, I wonder
@puzzlinggamedev2 ай бұрын
I decided to use walls instead of fog because of the underground metaphor; I'm thinking about adding a "excavation" effect for the reveal of the levels instead of suddenly removing the fog-walls later, but I'm not sure about that yet. But what you say about the colors makes sense, I still have to tune many visual elements, including the color palettes :)
@noa_11042 ай бұрын
@@puzzlinggamedev that sounds really good, especially animated … I would still find it odd if the surrounding area around levels didn’t also have foreground walls I suppose, even if those are a different color that might influence things a lot
@SRY2952 ай бұрын
thank for sharing. 11:30 other workaround I can think of is make @tool script. this will make that script run in editor. then make the export checkbox that when you press, it's trigger function that generate level right in the editor. this can also help the performance when testing too, because you don't have to generate level every time the game run.
@puzzlinggamedev2 ай бұрын
Thanks for the tip! I still have to investigate the editor scripting tools; perhaps I'll make a video about that sometime! :)
@jacksonwaschura35492 ай бұрын
I've been investigating this option as well and I would love to hear your thoughts after you try it!
@americoperez8102 ай бұрын
My thoughts also went to creating a tool script. That's usually what people do when they need to be able to see the output of some code at in the scene view without having to run the game. These tool scripts help a lot to prototype quicker.
@jacksonwaschura35492 ай бұрын
Seems like turning everything into a tool script is a little annoying. Not sure if it's an issue or just the normal workflow, but all dependencies of a tool script must also be tool scripts, so it turns every procedural generation library / utility into a tool script.
@puzzlinggamedev2 ай бұрын
@@jacksonwaschura3549 Ah, sad but good to know! Thanks for the info :)
@Rikaisan2 ай бұрын
I was about to say "but there is a scene view!" However, you are right, it's only for the hierarchy and not for the viewport:(
@puzzlinggamedev2 ай бұрын
Yes, it's a pity. I hope they add something like it at some point. But it's nothing deal-breaking for now :)
@purefoton2 ай бұрын
Thanks for sharing your thoughts.
@puzzlinggamedev2 ай бұрын
You're welcome!
@noncom2 ай бұрын
This is really helpful. Thank you for making the video.
@puzzlinggamedev2 ай бұрын
I'm glad! I hope you can decide better if Godot is for you. Good luck!
@DiegoSLTS3 ай бұрын
So what's the solution??
@puzzlinggamedev3 ай бұрын
I knew I forgot something! 😄The solution was very boring compared with the bug: I corrected the generator to not allow those race conditions to appear, adding more conditions to the possible positionings of the plates and bridges.
@noa_11043 ай бұрын
Have you considered filling in the entire area around corridors and levels with walls in the foreground? visually they could still look different but maybe it makes sense if they are not holes!
@puzzlinggamedev3 ай бұрын
Interesting, I'll think about it. Perhaps there are ways to "excavate" a texture or mesh to construct the space instead of adding walls to remove space...
@istanbulprivate3 ай бұрын
Hi, I'm creating a painting program in Godot. I need users to paint within a specific shape (e.g., a letter "A" on a texture) and prevent them from moving to the next scene until the shape is fully painted. How can I ensure that painting only happens inside the shape and that users can't proceed without completing the painting? Thanks!
@puzzlinggamedev3 ай бұрын
mmm, it sounds tricky... I suppose you could compare pixels from the reference image with those on the screen, using get_pixel() to retrieve the pixels of the reference image, and screen_get_pixel() to retrieve the pixels from the screen, and check if they all match.
@istanbulprivate3 ай бұрын
@@puzzlinggamedev Thank you so much. I am going to try, hope I can do that.
@puzzlinggamedev3 ай бұрын
@@istanbulprivateGood luck! let me know if it works.
@istanbulprivate3 ай бұрын
@@puzzlinggamedev of course thank you so much for helping
@miteshkumar54343 ай бұрын
Which software is that for note taking?
@puzzlinggamedev3 ай бұрын
I'm trying Obsidian, it's been nice so far
@miteshkumar54343 ай бұрын
@@puzzlinggamedev Thanks!
@cicada_games3 ай бұрын
Looks fun and interesting!
@JoePlaysPuzzleGames3 ай бұрын
I feel like those natural edge cases like "bridge becomes solid while crate is in its position" have lots of potential for interesting mechanics. I personally would try to think of something cool that could happen. Like the simple possible interactions are that the bridge could break the block or the block could break the bridge, both of which I could imagine having interesting puzzles. For example, if the bridge breaks the block, it would give the player a way of splitting blocks that they have stuck together. That could be a cool aha moment. But I'm sure there are also other interesting possibilities. Like in Sokobrawn, Steven made it so that the "doors" are hollow boxes, and so can contain a crate. That's also interesting. Or to get a bit more abstract, maybe the bridge and block could fuse somehow. Or maybe the bridge could poke a hole in the block (i don't know what that would mean mechanically, just imagining weird possible interactions). Or in some other way, the bridge and/or block changes the other thing's properties. I feel like making the blocks fall in a particular order will just feel unnatural. Also, a thought more related to the animation issue you were showing at the start: what about a situation where the player presses a button, which makes a bridge non-solid, which drops a crate onto another button, which makes another bridge non-solid, which drops another crate, etc. I feel like you are going to need the equivalent of PuzzleScript's 'again' turns.
@puzzlinggamedev3 ай бұрын
Very interesting ideas, thanks! I doubt that I'll have more than one plate/bridge pair, though :)
@PrismFave4 ай бұрын
the todo list is smart, nice vid
@pytebyte4 ай бұрын
Very helpful
@puzzlinggamedev4 ай бұрын
Glad to know! If you do something with this, please let me know!
@woodsmanthepeasant4 ай бұрын
nice! good to see gamedev stuff
@puzzlinggamedev4 ай бұрын
Thanks!
@gabrielward72895 ай бұрын
cool game
@Patashu5 ай бұрын
I wish Godot was actually this laser focused on old systems compatibility, but it's fair, they only have so much development resources and they've chosen their focuses
@patrickgh35 ай бұрын
Hahaha, you got me!
@c_o_m_e_t_5 ай бұрын
The fact I bought this wholesale is a testament to godot lol
@JoePlaysPuzzleGames5 ай бұрын
Omg, you totally fooled me. 🤦♂️
@ollllj5 ай бұрын
When you have a lot of if() conditions (escpecially nested ones), there is an important paradigm, that makes debugging MUCH more efficient: - make more subroutines! - generally not use if() conditions as if(true){if(true){...}} trees (those are WAY too buggy and WAY too inflexible), but more as if(false or error or haltCondition){ return error code or do nothing GATE-FUNCTION } . - Each subroutine focuses on the constrains of its own activation or effect, that comes last within the subroutine. effects come AFTER the subroutine performs all if(false){return error code} "tests" that must be passed first. Include all tests/conditions In ANY context that it is possibly called in any future, the subroutine always has its own safe-guards. A lot of them may just result in returning "error codes" or "break" or just "return 0". - For geometry objects/properties for example, each geometric-subroutine has its own "bounding volume" and "collision-constrains" and "hit-boxes", and those may be their own subroutines or "inherit"s (if you hate data oriented programming for no good reason, in favor of OOP, that is slowly getting obsolete) - a subroutine itself ideally STARTS with all the fast-to-calculated miss/abort/break conditions, that return "halt/stop/break/nothing" or that prevent "division by 0" or that return "collision would happen so do not move this object", or "the ray/projectile mises the (bounding box) of this object (no nee to do root-solving for intersections, which is often slow code, if it already misses a simple shell-intersection test) , so a hit--event (that reduces hit-points) does not happen. - Pretty much all possible error-or-skip cases of a subroutine are caught FIRST within the subroutine. The more likely and faster-to-calculate ones are to be done first. - halt--or-error-case-checking (the start of subroutines) is always checking for math errors "division by zero, or low precision asymptotes" errors (where ever you divide by variables, check if those are too close to 0), but also physical glitches and game logic boundaries, that you seem to spend a lot of time on. NASA follows this (and others like "no recursion an no heap" to a teeth, for ALL remote-operated space vessels/probes, ever since apollo11 landing computer ran out of memory while in VERY low moon-orbit, causing it to miss its intended landing spot by a short distance.
@ollllj5 ай бұрын
looks like the REAL puzzle game is all the debugging.
@puzzlinggamedev5 ай бұрын
often it feels like that
@JoePlaysPuzzleGames5 ай бұрын
I'm impressed by how consistently you've been putting these videos out!
@puzzlinggamedev5 ай бұрын
Thanks! well, some days I'm a bit too tired to make one... but I try to add the issues or bugs or ideas I find along the way to the TODO list to add motivation for the next day :)
@10aded6 ай бұрын
Happy to see someone else streaming their game dev! Looking forward to checking out many of your other videos.
@puzzlinggamedev6 ай бұрын
Thanks! I'm a bit under the weather these days, but I'll resume development soon!
@rdg43336 ай бұрын
Very nice to watch your a* implementation!!!
@puzzlinggamedev6 ай бұрын
technically I used the internal implementation embedded in Godot, adding post-processing :)
@puzzlinggamedev6 ай бұрын
Update: today I added entrances on the floor also, because why not :)
@Portponky6 ай бұрын
That makes a big difference to how nice it looks. Great job!
@puzzlinggamedev6 ай бұрын
Thanks! I'll make something similar for the lava. In theory I could use the same mesh with two materials... but if not, I'll make another procWall for the lava.
@natering52156 ай бұрын
audio is nearly silent.
@puzzlinggamedev6 ай бұрын
yes, I will try to get a better mic and adjust the recording settings. I'm still learning to balance noise/volume/etc
@JoePlaysPuzzleGames7 ай бұрын
I'm terrified of the 95 moves required to reach that ore. 😱
@puzzlinggamedev7 ай бұрын
Hahaha don't worry, I'll try to make the final selection of the treasure more lenient than the Pontibus one. that was too brutal sometimes...
@mvandevander7 ай бұрын
Considering I've been doing a lot of optimization work at my day job, this type of thing is always interesting to me. With that said, I don't know too much about the profiling tools that you're using here, or the D language particularly. One thing that I definitely wonder about is if the ticks recorded in the profiler for AddCrateToThingsPushed() would include the ticks for Find() or if that gets excluded. It's also interesting that the Point + operator is your next most ticked function below those two. At least apparently from the CPU usage, a straightforward way to make the generator much faster is to just multithread it. (in so far as threading is ever straightforward)
@puzzlinggamedev7 ай бұрын
In the profiling table, "Tree time" is the time spent executing the function including functions called, and "Func time" is the time spent executing the function excluding functions called. I spent some time yesterday optimizing the "Find" thing (making a proper bidimensional array for the space-versus-wall map) and I achieved some more performance. Perhaps I'll show that in some video but it was not very glamorous hehe... The operator+ is next in line :) And yes, multi-thread could be useful, but I run several parallel instances of the generator anyway so I don't care about that (yet).
@mvandevander7 ай бұрын
@@puzzlinggamedevAh yeah, sometimes multi-process is fine enough. I hadn't really considered that approach. I remember years ago I multi-threaded an image resizing script and it ended up being slower than just spawning a bunch of copies of it due to the thread pool having so much overhead.
@chapliboy7 ай бұрын
Thanks Marcos, I found this really interesting =)
@puzzlinggamedev7 ай бұрын
Thanks! I thought about more optimizations, so perhaps I'll make another video like this later.
@mvandevander7 ай бұрын
Yeah, I have learned this lesson many times the hard way. It's basically impossible to just guess where the bottleneck in your code is. I'm thinking of a recent optimization I did where there was a large hitch when spawning a bunch of puzzles. My intuition said that the hitch must be caused by trying to calculate valid positions for all of these auto-generated puzzles. But after profiling, it turned out that most of the cost was actually after a valid position had already been found, and when moving the puzzle elements into their final position. This is because the engine was just defaulting to doing swept physics tests when the objects were moved, because they had not had physics disabled.
@puzzlinggamedev7 ай бұрын
yes! profiling is the best option when thinking about these things. Perhaps I'll make a video about profiling...
@mabojaka7 ай бұрын
Nice devlog!
@puzzlinggamedev7 ай бұрын
Thanks!
@Kapendev7 ай бұрын
Looks good!
@puzzlinggamedev7 ай бұрын
Thanks!
@den1sk0v307 ай бұрын
what is your setup? what linux/desk env u use in this one?
@puzzlinggamedev7 ай бұрын
In this particular video, I'm using Ubuntu, with the Plasma desktop environment. But sometimes I feel like using other desktop environments like Openbox or IceWM. I also use Windows often, depending on what tools I'm using that day. I use dual booting.
@LlamaBG7 ай бұрын
Are you maybe continuing developement? I'd love to see a playthrough My bad, just saw that you are, awesome
@puzzlinggamedev7 ай бұрын
Not for this project in particular, at least for now. I'm making another game currently. You can check out and share the recent devlogs :)
@JoePlaysPuzzleGames7 ай бұрын
Nice video, Marcos! Love it when you update some stickiness code and all the blocks start falling through each other. Classic gamedev things!
@puzzlinggamedev7 ай бұрын
Thanks! yes, bugs are fun to show (and hopefully to solve haha)
@majik989s7 ай бұрын
Brilliant, Marcos! Love the game concept and watching you work through bringing it to life.
@LlamaBG Жыл бұрын
this looks super sick
@Notester823 жыл бұрын
That looks pretty fun(ny), the way he's just tumbling around and whatnot! ;u;
@Portponky4 жыл бұрын
Has puzzle script gone too far?
@puzzlinggamedev4 жыл бұрын
So far, so many parentheses...
@Portponky5 жыл бұрын
Why is a robber installing safes?! That doesn't seem right.
@DanZaidan5 жыл бұрын
Maybe a "pull" character has to steal the safe? :D
@puzzlinggamedev5 жыл бұрын
A good possibility! After one character installs it, the other one steals it. Thanks!
@DanZaidan5 жыл бұрын
This looks fun!
@bluesnakeOVER90005 жыл бұрын
Are you testing different engines or have you decided to use Unreal now?
@puzzlinggamedev5 жыл бұрын
I'ts complicated... I'll explain in time.
@antonklinger5 жыл бұрын
*Katamari Damacy music starts playing in the distance*
@bluesnakeOVER90005 жыл бұрын
Exciting! Such a lovely idea, would be great to see some kind of state change or indicator of something being collected/magnetised. The robber character is very funny!
@puzzlinggamedev5 жыл бұрын
I plan to add sound and particle effects for the stickiness :)