Woah, was it a saturated month! Or two months? So many things happened, and I had a pretty valid reason to not come here for so long. First, I had a vacation and was out of the country, then I fell ill. Then immediately ill again. And then ill! Again! And then we had a Game Jam at my job. And that's what I want to talk about. It gonna be just as long as my absence.
Now, this Game Jam was hosted by a mobile game company, who was hungry for fresh ideas - preferably match-3 or hidden object ones. They wanted these ideas in a form of a power point presentation, and no one was looking for new mechanics. You could make a prototype, but it won't influence your chances. So as you might imagine, this was a quite boring jam! But the boring jam had a cash prize, and the task sounded like something suitable for my skill level. So I decided to try anyway. Two colleagues joined me and agreed to do arts and stuff.
While we were waiting for jam's requirements to be announced, I made some preparations in advance. I made a test...err...gaaaame? to see if I truly understand how to do hidden objects. I downloaded a plugin which should have turned a PSD file into a scene in godot, and tested it. It worked perfectly, although I had to contact the plugin's creator for some instructions. I also wanted to make randomized placing of objects in the scene, so each time someone plays the game, they will look for different things. I would have had a scene with all possible objects placed on it but hidden (keke). The list of these objects would have been an array, from which you take five random things, place then into a new array called "the task", and then unhide in the scene - alongside with several distractions. The player would click on objects, the program would compare objects to the list and then tell the player if they were correct. I haven't finished that, however, because there was not enough time. The jam started, and with it came the hustle.
First obstacle raised up immediately. Upon reading requirements for the presentation it became clear that I have to join my colleagues in arts and stuff too, or we won't make it in time. The time was suuuuper limited - only two days. And at first I felt pretty discouraged. My whole point to take part was to challenge myself in programming, not writing or talking to AI-generators. However we chewed through the problem surprisingly fast, and at least I could dedicate the second day to what I truly wanted. Which, as you would imagine, gave a whole new level of complexity!
Then the second obstacle came. The psd import plugin, tested and working, now refused to do shit! It just ignored me. No complaints. No errors. Just gfy. Ugh, umh... happily I kinda felt that things will go south, and looked up for workarounds beforehand. There is a way to export layers from PSD file so they would keep the original dimensions, so they would be automatically placed where I need them in godot if imported in a batch.
Third obstacle was lack of time to make the array thing. Even the routine things like bashing together Dialogic nodes took surprisingly much time. Or rather, they took very little time, but there was a lot of them. I needed to recall how arrays work, to test my idea, to make sure I did not break something in the process. I needed some kind of a workaround. And the workaround I found was somehow the most programmer thing I did, but also the most embarrassing thing I did.
Without a better idea I just wrote the same script to each and every object the player will be looking for, only changing the signal name. Should they all be a class or something? Of course. Should they have only one shared signal and only one shared function? Absolutely! But I am an idiot with roughly six hours left.
I wrote some dialogue without thinking, and it worked. Placed characters, made them the proper size and position - all in Dialogic. Tried to change the design of dialogue windows and buttons; windows changed, buttons didn't. Made a menu, somehow even recalled how to make it nice-looking; it worked.
Placed the scene and objects together, and then came the third obstacle - I had no idea how to tell the player that he is good and found all the stuff. Ideally it should be some region on the screen where the objects are listed and then the words grey out or disappear. So probably it should be some container with text labels, maybe....how do you make the text in a label grey?... or strikethrough? Time was growing shorter and shorter, I couldn't google it immediately and had to invent something once again. I had a psd file left after I explained to colleagues how I see the field. And I knew how to change sprites. So I took the buttons from the psd file, made grey and strikethrough versions of it and saved it as plain .pngs, with normal buttons being 0, and grey one - 1. So, on a click on the respective object the sprite would change and the object would disappear. A win!
But that's not the end. Because the end should be defined. How do I tell the program that the player found everything? If I had an array, I would check if its empty. I do not have an array. But I only have 6 objects.
Stay strong, it gonna hurt.
I made a variable with just a number - 6 - and added a string to every object function to subtract 1 and check if the variable is 0 yet. And if it is 0, it calls the "you win" function.
Just look at this abomination. I have six of them:
Horrible as it was, it was most of the game done. I had to connect it to two dialogues I had written, which somehow worked first try, which was fantastic because I had like 15 minutes left.
Original plan included the Reward sticking to the player's cursor so they could place it where they want in the final location. It would have included an invisible grid and an inventory-like system. But there was no time left and I used in-program animation tools to just whack the Reward on the table and be done. Which was quite the accomplishment for me because I did not even know godot can animate before.
So tested it, exported as an .exe, tested the .exe, and happily uploaded the perfectly working hunchback of a program I created. The next step - the presentation itself - should have been done by one of my colleagues, while my job here was done.
On the day of the presentation the said colleague tested the file on her enormous monitor and found a horrible bug! On each and every screen size but mine the layout was messed up HORRIBLY. It was so bad it sometimes did not even work! I immediately knew what happened. In the hurry I forgot to change window scaling in the preferences, not a big deal. Asked the orgs if I can replace a file, they allowed. I open the project, press "yes" to something it asked me about, repack it and throw into our google disk. Voila! Adventure for one minute.
Except during this time I installed godot 4.4, which had one important change since 4.3. And what it asked me about, was if I want to refresh file paths and use UIDs. Everything seemed to be working, except for Dialogic, which did not get the joke and lost all the dialogues alongside with all the characters. And I only noticed it when the same colleague asked "Patchy, what did you do? You made it worse!" I mean, it worked for me! So now it's less than an hour before the presentation, my prototype doesn't work, I do not have a backup, I have no idea how to fix it, and it's a middle of the week and I have a job to do. I uploaded the old file in hopes that people will just take a brief look and won't try to resize the window.
Later I returned to this weird new bug. Turned out, it wasn't my fault, it should have worked anyway but had a minor incompatibility with the plugin which is now fixed, and all you need is to install the newest version. It's stunning how the simplest solutions may elude you when you're under stress and in a hurry.
Anyway. It was quite the experience and I understand why people recommend new devs to take part in game jams. I had to mobilize all my elusive knowledge and use the limited tools I have in order to fulfill a goal. Those stupid workarounds there are the result of this determination, and a point into a skill to throw away perfect but unknown and unpredictable solutions and leave the ones working here and now. It makes you evaluate yourself and your knowledge.
I'd love to take part in another jam when I am rested. Now it's time to fill the holes this one uncovered.