Пікірлер
@mvandevander
@mvandevander Ай бұрын
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
@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
@alphabravo3481 Ай бұрын
As a hobbyist, I recently switched from Pygame to Godot and it's very impressive.
@puzzlinggamedev
@puzzlinggamedev Ай бұрын
welcome to Godot! :)
@alphabravo3481
@alphabravo3481 Ай бұрын
I am curious why you chose 3D instead of 2D for this project? Interesting channel and game.
@puzzlinggamedev
@puzzlinggamedev Ай бұрын
I'm still pondering the possibility to switch to pure 2D but for now it works :)
@MrTomyCJ
@MrTomyCJ 2 ай бұрын
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!
@puzzlinggamedev
@puzzlinggamedev 2 ай бұрын
jajaja gracias a vos por mirar! hahaha Thanks to you for watching!
@noa_1104
@noa_1104 2 ай бұрын
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
@puzzlinggamedev
@puzzlinggamedev 2 ай бұрын
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_1104
@noa_1104 2 ай бұрын
@@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
@SRY295
@SRY295 2 ай бұрын
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.
@puzzlinggamedev
@puzzlinggamedev 2 ай бұрын
Thanks for the tip! I still have to investigate the editor scripting tools; perhaps I'll make a video about that sometime! :)
@jacksonwaschura3549
@jacksonwaschura3549 2 ай бұрын
I've been investigating this option as well and I would love to hear your thoughts after you try it!
@americoperez810
@americoperez810 2 ай бұрын
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.
@jacksonwaschura3549
@jacksonwaschura3549 2 ай бұрын
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.
@puzzlinggamedev
@puzzlinggamedev 2 ай бұрын
@@jacksonwaschura3549 Ah, sad but good to know! Thanks for the info :)
@Rikaisan
@Rikaisan 2 ай бұрын
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:(
@puzzlinggamedev
@puzzlinggamedev 2 ай бұрын
Yes, it's a pity. I hope they add something like it at some point. But it's nothing deal-breaking for now :)
@purefoton
@purefoton 2 ай бұрын
Thanks for sharing your thoughts.
@puzzlinggamedev
@puzzlinggamedev 2 ай бұрын
You're welcome!
@noncom
@noncom 2 ай бұрын
This is really helpful. Thank you for making the video.
@puzzlinggamedev
@puzzlinggamedev 2 ай бұрын
I'm glad! I hope you can decide better if Godot is for you. Good luck!
@DiegoSLTS
@DiegoSLTS 3 ай бұрын
So what's the solution??
@puzzlinggamedev
@puzzlinggamedev 3 ай бұрын
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_1104
@noa_1104 3 ай бұрын
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!
@puzzlinggamedev
@puzzlinggamedev 3 ай бұрын
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...
@istanbulprivate
@istanbulprivate 3 ай бұрын
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!
@puzzlinggamedev
@puzzlinggamedev 3 ай бұрын
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.
@istanbulprivate
@istanbulprivate 3 ай бұрын
@@puzzlinggamedev Thank you so much. I am going to try, hope I can do that.
@puzzlinggamedev
@puzzlinggamedev 3 ай бұрын
​@@istanbulprivateGood luck! let me know if it works.
@istanbulprivate
@istanbulprivate 3 ай бұрын
@@puzzlinggamedev of course thank you so much for helping
@miteshkumar5434
@miteshkumar5434 3 ай бұрын
Which software is that for note taking?
@puzzlinggamedev
@puzzlinggamedev 3 ай бұрын
I'm trying Obsidian, it's been nice so far
@miteshkumar5434
@miteshkumar5434 3 ай бұрын
@@puzzlinggamedev Thanks!
@cicada_games
@cicada_games 3 ай бұрын
Looks fun and interesting!
@JoePlaysPuzzleGames
@JoePlaysPuzzleGames 3 ай бұрын
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.
@puzzlinggamedev
@puzzlinggamedev 3 ай бұрын
Very interesting ideas, thanks! I doubt that I'll have more than one plate/bridge pair, though :)
@PrismFave
@PrismFave 4 ай бұрын
the todo list is smart, nice vid
@pytebyte
@pytebyte 4 ай бұрын
Very helpful
@puzzlinggamedev
@puzzlinggamedev 4 ай бұрын
Glad to know! If you do something with this, please let me know!
@woodsmanthepeasant
@woodsmanthepeasant 4 ай бұрын
nice! good to see gamedev stuff
@puzzlinggamedev
@puzzlinggamedev 4 ай бұрын
Thanks!
@gabrielward7289
@gabrielward7289 5 ай бұрын
cool game
@Patashu
@Patashu 5 ай бұрын
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
@patrickgh3
@patrickgh3 5 ай бұрын
Hahaha, you got me!
@c_o_m_e_t_
@c_o_m_e_t_ 5 ай бұрын
The fact I bought this wholesale is a testament to godot lol
@JoePlaysPuzzleGames
@JoePlaysPuzzleGames 5 ай бұрын
Omg, you totally fooled me. 🤦‍♂️
@ollllj
@ollllj 5 ай бұрын
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.
@ollllj
@ollllj 5 ай бұрын
looks like the REAL puzzle game is all the debugging.
@puzzlinggamedev
@puzzlinggamedev 5 ай бұрын
often it feels like that
@JoePlaysPuzzleGames
@JoePlaysPuzzleGames 5 ай бұрын
I'm impressed by how consistently you've been putting these videos out!
@puzzlinggamedev
@puzzlinggamedev 5 ай бұрын
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 :)
@10aded
@10aded 6 ай бұрын
Happy to see someone else streaming their game dev! Looking forward to checking out many of your other videos.
@puzzlinggamedev
@puzzlinggamedev 6 ай бұрын
Thanks! I'm a bit under the weather these days, but I'll resume development soon!
@rdg4333
@rdg4333 6 ай бұрын
Very nice to watch your a* implementation!!!
@puzzlinggamedev
@puzzlinggamedev 6 ай бұрын
technically I used the internal implementation embedded in Godot, adding post-processing :)
@puzzlinggamedev
@puzzlinggamedev 6 ай бұрын
Update: today I added entrances on the floor also, because why not :)
@Portponky
@Portponky 6 ай бұрын
That makes a big difference to how nice it looks. Great job!
@puzzlinggamedev
@puzzlinggamedev 6 ай бұрын
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.
@natering5215
@natering5215 6 ай бұрын
audio is nearly silent.
@puzzlinggamedev
@puzzlinggamedev 6 ай бұрын
yes, I will try to get a better mic and adjust the recording settings. I'm still learning to balance noise/volume/etc
@JoePlaysPuzzleGames
@JoePlaysPuzzleGames 7 ай бұрын
I'm terrified of the 95 moves required to reach that ore. 😱
@puzzlinggamedev
@puzzlinggamedev 7 ай бұрын
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...
@mvandevander
@mvandevander 7 ай бұрын
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)
@puzzlinggamedev
@puzzlinggamedev 7 ай бұрын
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).
@mvandevander
@mvandevander 7 ай бұрын
@@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.
@chapliboy
@chapliboy 7 ай бұрын
Thanks Marcos, I found this really interesting =)
@puzzlinggamedev
@puzzlinggamedev 7 ай бұрын
Thanks! I thought about more optimizations, so perhaps I'll make another video like this later.
@mvandevander
@mvandevander 7 ай бұрын
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.
@puzzlinggamedev
@puzzlinggamedev 7 ай бұрын
yes! profiling is the best option when thinking about these things. Perhaps I'll make a video about profiling...
@mabojaka
@mabojaka 7 ай бұрын
Nice devlog!
@puzzlinggamedev
@puzzlinggamedev 7 ай бұрын
Thanks!
@Kapendev
@Kapendev 7 ай бұрын
Looks good!
@puzzlinggamedev
@puzzlinggamedev 7 ай бұрын
Thanks!
@den1sk0v30
@den1sk0v30 7 ай бұрын
what is your setup? what linux/desk env u use in this one?
@puzzlinggamedev
@puzzlinggamedev 7 ай бұрын
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.
@LlamaBG
@LlamaBG 7 ай бұрын
Are you maybe continuing developement? I'd love to see a playthrough My bad, just saw that you are, awesome
@puzzlinggamedev
@puzzlinggamedev 7 ай бұрын
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 :)
@JoePlaysPuzzleGames
@JoePlaysPuzzleGames 7 ай бұрын
Nice video, Marcos! Love it when you update some stickiness code and all the blocks start falling through each other. Classic gamedev things!
@puzzlinggamedev
@puzzlinggamedev 7 ай бұрын
Thanks! yes, bugs are fun to show (and hopefully to solve haha)
@majik989s
@majik989s 7 ай бұрын
Brilliant, Marcos! Love the game concept and watching you work through bringing it to life.
@LlamaBG
@LlamaBG Жыл бұрын
this looks super sick
@Notester82
@Notester82 3 жыл бұрын
That looks pretty fun(ny), the way he's just tumbling around and whatnot! ;u;
@Portponky
@Portponky 4 жыл бұрын
Has puzzle script gone too far?
@puzzlinggamedev
@puzzlinggamedev 4 жыл бұрын
So far, so many parentheses...
@Portponky
@Portponky 5 жыл бұрын
Why is a robber installing safes?! That doesn't seem right.
@DanZaidan
@DanZaidan 5 жыл бұрын
Maybe a "pull" character has to steal the safe? :D
@puzzlinggamedev
@puzzlinggamedev 5 жыл бұрын
A good possibility! After one character installs it, the other one steals it. Thanks!
@DanZaidan
@DanZaidan 5 жыл бұрын
This looks fun!
@bluesnakeOVER9000
@bluesnakeOVER9000 5 жыл бұрын
Are you testing different engines or have you decided to use Unreal now?
@puzzlinggamedev
@puzzlinggamedev 5 жыл бұрын
I'ts complicated... I'll explain in time.
@antonklinger
@antonklinger 5 жыл бұрын
*Katamari Damacy music starts playing in the distance*
@bluesnakeOVER9000
@bluesnakeOVER9000 5 жыл бұрын
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!
@puzzlinggamedev
@puzzlinggamedev 5 жыл бұрын
I plan to add sound and particle effects for the stickiness :)