Monotony

Monotony

61 devlogs
97h 47m
Created by Arjun

A minimalist, satirical platformer having intentionally repetitive and tedious design. It mocks both the repetitiveness of itself, as well as the not-so-evident lack of skill in the player, sort of like the taunts in The World's Hardest Game by Snubby Land, which they're inspired by. The design of the game was later prompted by the design of OCO by SPECTRUM48.

Timeline

Implemented the blur creation based on the theme, and now I just have to make the actual sketch use the correct blurs by adding in the appropriate dirs and navigation of the blurs based on the row, column, and theme.

Update attachment

Made the Achievement class's locked state follow the Button class's, and then made the max alpha 255 (the max max), instead of 100. It looks out of place right now, but next, I'll ask AI to generate a valid colour scheme for the blurs based on the current theme, meaning I'll have...calculates 320 .png files for blurs. Welp, that's totally not going to cause any problems.

Added the blur to Buttons, then had to debug it a lot because of like 5 visual bugs involving both animation and rendering. Sometimes, the shackle wouldn't render, the alpha would jump (truncation error bruh), the stroke would be there when it wasn't supposed to, the same with the fill, and there was no stroke with the image, so I had to bring back the original rectangle.

Update attachment

Started to work on the Button background and fixed the corners clipping the stroke due to the image not being rounded.

Update attachment
Arjun
Arjun
1h 31m 3 days ago

Added the first achievement, and started debugging the actual levels. There were bugs like player deaths not working because: the fade() function was only based on the levelClears ArrayList, not the levelDeaths one, and the targetLevel not being set. Another bug was that the Outro level wouldn't load because of no precautionary String checking, and thus creating an IndexOutOfBounds error. I need to fix some visuals and double-check that the levels are working, then I'll resume my work on the achievements.

Used AI to make a script that generates blurry gradients, as it involved downloading stuff (OS...I really need to learn more about OS), and then adapted it for my project. Next, I need to actually load those images, becase rn I'm not using them at all.

Update attachment
Arjun
Arjun
1h 10m 4 days ago

Added an Achievement class, where the video shows the locked state. However, when I tried to add a blur effect, I just wasn't able to do so, and wasted a lot of time trying to implement it. Next session, I might overlay an image and see if that works, but I'm not sure.

Added the SoM logo and resized it to fit accordingly, and then added the backButton to the achievements page, and I might or might not work on the Achievements class next, but idk if I want more of the achievements to be game-based, or generic such as exploring the UI, which I'll have to decide later.

Added the SoM logo thing, idk what it is. I'll resize it next time, and then the aboutScreen is finished!

Finished adding Hack Club's logo to the aboutScreen, and I might add the Summer of Making logo next (if I can find it lol). Otherwise, I'll add a to be added screen in the achievements page and the backButton.

Finished the aboutScreen text, and next I'll add Hack Club's logo :D. After that, it should be finished, and then idk what I'm going to do lol.

Found a few bugs in the menu, such as the backButton in the aboutScreen not working, and the player being at the default position in the tutorial. Fixed those, and the (hopefully) bug-free menu is showcased below. Next, I should probably work on the aboutScreen and achievements (I'll add a placeholder).

Fixed the aforementioned bug (just clamped the value to 255 if incrementing it would cause it to overshoot), but it still had a residual, barely noticeable bug where time would be stuck at 254. Turns out, I was using time instead of currentTime in the logic. I forgot that currentTime existed...well, at least it works now. Next session, I'll do debugging of the whole menu and showcase it.

Fixed that bug, turns out it was a simple truncation error, as something even a miniscule amount over 1 subtracted from x would lead to x-2, as the mantissa (which is almost 1) would get truncated. Fixed it with some rounding and then casting instead of just casting, and found another bug: the menu blinking due to overshooting the time and alpha, which I'll fix next.

Arjun
Arjun
1h 19m 5 days ago

Tried to implement crossfading, but eventually settled on the previous fading but with an easing effect, which made it better. Found an expanding button bug that I fixed, but there's still anothet bug: stuff like the menu's alpha appears to be 0 for a few seconds before fading in.

Arjun Arjun 3 days ago
Tysm lol, there are 4th wall breaks, and they’re usually in the title and description of the levels. I though about adding a narration menu, but idk if I have enough time to do that.
Eucatastrophe Eucatastrophe 5 days ago
that is very interesting haha. looking forward to playing this :0 I wonder if there will be any fourth-wall breaks.

Finished the aboutScreen. It's really basic, but it's more of a placeholder for whenever I get around to actually developing it. Next, I might make a crossfade effect, which should speed up the transitions and make it less boring.

Update attachment

Created the base of the aboutScreen and then fixed a few bugs caused by me removing some redundancies in how Sprites were being drawn, which caused a few bugs as a result. I'll finish the aboutScreen next session, then I'll move on to other things.

Update attachment

Added like 6 more themes to the menu. This should be all of the themes I need for now lol, and next I might focus on making the about page. P.S. the colours in the themes were chosen by AI, but they were actually implemented and added myself, as I'm bad at choosing good colours other than neon stuff (hence the prior colour scheme and name Cyan).

Arjun
Arjun
1h 21m 6 days ago

Fixed the mug, which took like 5 minutes, as it was a simple order of execution error, where an external func would reset the time var before the value could be checked for being at a set value, meaning that that boolean was never true. However, the testing for this led me to like 5 other bugs in my code, such as: improper fading when the level doesn't transition after time > 510, such as in the tutorial, no reinstantiating for most of the Sprites, redundant code, and inconsistencies here and there. Welp, that's all finished now.

Arjun Arjun 6 days ago
*bug not mug lol.
Arjun
Arjun
1h 15m 6 days ago

Added a greyscale theme, which meant I had to document every single colour. There's a bug now though, where most of the screen's black for some reason, even though that isn't a theme (yet!), which I spent a bit of time trying to fix but wasn't able to. I'll do that in the next session, but hopefully it won't take too long.

Update attachment

Made the audio settings and updated a few of the SFX, as some of them didn't really fit in that well (such as that analog click and hollow knock, for the button clicks and random clicks respectively), and I'll add themes next, which shouldn't be too hard, but I'll have to reorganise all the colours I have.

Finished the graphics settings, which meant that I had to change the layout of the setup() function a bit, but now it should be fine. I'll create the other settings next, but before that, I might make a procedurally generated soundtrack.

Everything related to the graphics settings page works now, the only thing left to do is to center the checkboxes and add text explaining what each of them do. The text is probably not gonna be integrated into the class, and instead it's going to be drawn in the individual function.

Finished some of the design, but not the functionality. I still have to make the backButton work, add text indicating what the checkboxes do, put them in the right positions, and then it should be done.

Made the settings menu actually work, and added basic functionalities such as checkboxes, but it still needs to be finished, which I'll do by adding text to the checkboxes and the backButton.

Organised my setup() file, which took a while. Oh well, at least I can debug easier now (by organise I mean refine the order and structure relative to itself and the globals.pde file).

Update attachment

Removed individual levelNCleared and levelNDeath booleans, as those were basically useless atp, as everything was just referencing the index of the ArrayList. To do this, I also had to add a levelDeaths ArrayList, and then replaced each levelNCleared/Death boolean with its corresponding index, as well and using the set() function for assignment.

Update attachment
Arjun
Arjun
2h 40m 9 days ago

Optimised the fading function to handle a lot more of the work that was previously delegated towards the IL (individual level) functions, but, as they're now retasked, I decided to expand the fading function that allowed me to remove a dozen or two now unnecessary variables here and there, particularly the ones relating to button clicks, such as the <button>Clicked ones, as without them, there were no smooth transitions back then. I didn't add ones like oneClicked, but I would have to eventually (I was about to), and there's 42 of those. In short, a few hundred lines and potential lines were saved! :yay: This involved a fair bit of debugging, and turns out the issue was simply that one line was before a chunk of code, and all I had to do to fix it was to put it after that chunk of code.

Update attachment

Fixed a few small bugs regarding variable types here any there, as there were a lot of mixups that used find and replace to solve, which created a lot of mixups, also using find and replace to solve (recursion in coding not involving code lol). But it works now, and now I'll make the graphics panel.

Update attachment

Actually implemented all of the functions, now all I have left to do is to turn them into a class for better handling, but I might do that later since it's not that important, and organise the setup() function now.

Update attachment

Added a level() function that optimises the repetitive levelN() functions, which means that there's only going to be a single level() file that acts as a structure instead of 42 individual files for each level. I'm going to turn this into a class later, so that the methods can be optimised further, reducing the line count again by 2.5-3x. Haven't implemented the functions though. As you can see in the screenshot, the structure of each of the 4 functions depending on what the level includes is quite repetitive.

Update attachment

Refined the variable scope using AI, having it scan every global variable, then made some edits to the Checkbox function to remove a few more variables, and required less updating. Next, I'll optimise the levelN() functions to hopefully, eventually, have a level base that takes a few variables in and outputs a level.

Update attachment

Actually added some checkboxes, and then updated the class to get rid of some redundant variables left over from the revamp towards the new Button class structure. Then organised the global variables, as a large chunk of them could be clarified by setting their type to the student class instead of the parent class, which took a while as there were over half a thousand lines to sift through. Next, I'll organise the setup() function the same way, and also get rid of redundant global variables or make them local if needed.

Update attachment

Used AI to make the Checkbox class' structure the same as the Button class' structure, then edited the class to fully match it, which should make the Checkbox class functional. Haven't gotten around to testing it yet, as I've only so far build the settings menu, not the actual settings themselves, but I'll focus on the graphics settings next (jump animations, trails, and anything else similar to that).

Update attachment
Arjun Arjun 11 days ago
Sure! I’ll do it once I’ve fully implemented the settings, bc it gets glitchy with unknown page errors so…(I might add a placeholder). Plus, I need to think of a new project name (it’s not even cyan anymore lol). Thanks for the reminder!
Eucatastrophe Eucatastrophe 12 days ago
hey you should upload a demo video :0

Fixed inconsistencies in the Button class due to the refactoring, both within and across the Cursor class. It should be fine now, and used the pre-inconsistency-fixing structure for a new class, the Checkbox class to be used in the Settings pages for toggling things on and off.

Update attachment
Arjun
Arjun
1h 28m 12 days ago

Spent a while fixing a bug that meant that rounded corners would no longer look rounded if the player stood still, which turned out to be because of bad rendering due to overlapping objects. The fix turned out to be kinda simple, which was that if 2 trail rectangles overlap, don't draw one of them. Also fully refactored the Button class following the state structure of the Cursor class, which meant that the code was way cleaner and easier to debug.

Update attachment

Made some optimisations to repetitive parts of the code, which probably saved around 800 lines in total (yay!), as all of the code was the same except which boolean it relied on, which was an exceptionally easy fix. Also dramatically improved the colour of the platform, which finally isn't camouflaged.

Update attachment

Fixed the naming scheme of the levels, which were mostly okay, but sometimes a bit unclear. Actually made the level select menu work now, which might even make it a bit easier for debugging. One thing this had made me realise though, is that the colour of the platforms is terrible, and against the sky, they're quite difficult to see.

Fixed the file structure and naming scheme, such as excessive names (inputHandling instead of simply input), and various inconsistencies regarding level and stage (due to my laziness in settings.json, which is now fixed, even though it technically worked without the fix, but might help in the future), which should be done for now. Had to modify the symlinks and the respective function as a result, but it wasn't too much effort.

Update attachment
Arjun
Arjun
1h 39m 13 days ago

Finished the settings page, and now I'll finally get around to organising my files and the names of each page. I also finished one final bug that the Cursor class had, which was turning its strokeWeight into an infinitesimal when hovering over the backButton, but turns out it was because the strokeWeight wasn't being resetted to blockSize * 0.15.

Finished the level select menu, except the actual level buttons (I'll get that working once I add JSON saving and loading), as the booleans will be based on JSONObjects or possibly a JSONArray that I'll have to configure once I get to that stage.

Arjun
Arjun
1h 45m 14 days ago

Fixed all the bugs I was talking about, guess it was just about weird lerping techniques (which is already weird, as it's non-linear even if you use a constant value of t), but I used an increasing value of t, which I guess evens it out, but not perfectly. Switched to mapping for a linear effect, which is probably more appropriate for cursors. Oh well, at least the cursor's finished (I'll finish the settings page next).

Arjun
Arjun
1h 32m 15 days ago

Added a blockedDefault state to the Cursor class, and modified the entire structure so that the transitions wouble lerp the values the same regardless of the previous state, simplifying logic used. There's one more transition I need to fix (going in and out of the blockedDefault state), as currently it jumps then transitions.

There's not much to say except...I finished all the debugging!! That took shorter than I though it would, but I guess that's a good thing. Next session, I'll focus on adding a waiting cursor, as well as organising some of my code, as for now, some of the placement's pretty messy and chaotic.

Adjusted a few constants in the code for better QoL and aesthetics, and then implemented the blockedHover state. This took a while for some reason, as it involved a lot of debugging because of the transitions between any combination of the cursor states, and I still have a lot to do (as you can see, the cursor isn't working correctly).

Arjun Arjun 15 days ago
Note: the screen recorder was focused on the wrong window, and as a result, the result wasn’t recorded. However, it looked like the video in the next devlog, except the state was implemented at the wrong times, and the transitions didn’t even feel like transitions.
Arjun
Arjun
2h 47m 17 days ago

Added jump animations, as well as minor tweaks to the UI here and there. Modified the Button class to be a child of the Sprite class, allowing greater compatibility in the ArrayLists utilised throughout. Tried adding debugging to VSCode, but sadly was unabled to. However, added a few useful extensions in the process that made coding outside of .pde files quite a bit better, so it wasn't all for nothing. Still have some debugging to do (Cursor class, as I redesigned the structure), but I've done enough to make it work.

Arjun
Arjun
3h 47m 17 days ago

Added small features such as a locked area to indicate progression, camera lerping to smooth the mountain transitions even further, as the parallax was based on the player positions, and whenever that jumped, such as at the end of a level, the camera jumped. I plan to add jump animations, such as maybe a hexagon expanding and eventually disappearing, as well as shifts in colour of the mountains based on how far you've progressed.

Created a mountain transition system, which took a lot of debugging, as well as a cursor hover animation. Used AI for ideas, as I had run out (for the cursor and mountain transitions), as well as for the debugging of the mountain transition. It was useless at first, but then actually helped later on. Turns out it was a mix of 2-3 issues, one, bad assignment for ArrayLists of PVectors, two, overshooting due to imperfections (frame rate and floating point errors), and maybe three, no buffer systems (which could or could not have caused errors).

Arjun
Arjun
3h 27m 20 days ago

Modified all the classes, as some of them now have parents, and a lot of the sprites are children of the Sprite class, allowing for categorisation and class managing, and thus easier modification. Added an entities folder for this, which has the classes, and had to modify the symlink creation as a result.

Update attachment
Arjun
Arjun
2h 54m 21 days ago

Modified the MountainRange class to have simpler procedural generation, as well as dependent on the integer value of a level, which factored into the noiseSeed() function, meaning that the mountains in each level now look different. Added a custom cursor to the whole thing, inspired by https://smooothy.federic.ooo/, which I looked at recently, and then adapted to hexagons. I need to add mountain transitions so that the mountains don't jump whenever the level is switched, as that would look unnatural.

Arjun
Arjun
3h 56m 22 days ago

Mapped the parallax to the player's coordinates, and then started playing around with the colour palettes. This used a lot of AI, as I usually have...weird colour taste, but now it looks good, I guess. My standards are weird. Then, I changed the folder structure to incorporate a larger source folder, which meant I ended up changing a lot of functions largely dependent on the exact paths, which...isn't that great of an idea, but still.

Excluded the files that start with level, and are in the root folder (basically all the symlinks), as this finally solved the whole problem. Then created a predictable mountain background based on the noiseSeed() function, with a parallax effect. Currently, it's based on the mouse's coordinates, but once it's incorporated into the main sketch, It'll be based on the player's coordinates instead. Used AI for the core structure, then modified the settings to tweak the visuals of the mountains, such as the fractal dimension, i.e. jaggedness, as well as a specific seed that showcased that well (1, 2, 3, and 4, but still).

Update attachment
Arjun
Arjun
5h 40m 29 days ago

Finally figured out how to add subfolders! I just have one more thing left to do, excluding files, and I should be fine. Used AI for this, as I'm not comfortable throwing around native JS methods, and had to use java.io for it to work. Adapted the code for my folder structure, and it works! I had a way to do it manually for a while, but had to create a file for inputting those commands automatically, as who would realistically open cmd and run 42 commands by hand to play a sadistic game. Lol, that took a while, way more than it should have. And a lot of the time was spent staring at the screen or conversing AI, or even using Stack Overflow, which barely helped.

Update attachment

Added optimisations to the Rectangle and Button class, with more syntaxes for future customisations (2-4). The only class optimisation I have left to do is adding superclasses, such as the rectangle class, which can be extended by the Player, Platform, DeathPlatform, and LevelClearArea classes. The image you see is of constructor chaining, which I had to learn using AI because there isn't any good Processing documentation, due to it being stemmed off of Java.

Update attachment

Finished the button hover animations! Optimised using AI, as well as shortened a lot of the var names, especially in the two classes. Started to add default colours, which should bring way to themes, probably using arrays. All the button properties use lerp() to update smoothly.

Update attachment

Fixed up the directory with the changes I couldn't make, and then completed the level select menu as well as added some hover animations, which were improved with AI by interpolating them using the lerp() function, which I'll learn to use.

Update attachment

Finished the directory editing, and used AI for just the errors where Processing was unable to find the source files, and the tasks.json file. I eventually created a small function using string manipulation with a specific structure which was then generalised with AI, in case any of the folder names were changed. The files shown in source are only a fraction of all of the actual files, and the rest were in the same structure.

Update attachment

Improved the Rectangle class, then split it up into itself and a Button class. This took a few hours, because hundreds of lines of code, maybe even thousands, were depending on the class structure, which had to be changed. Then, bug fixed all of that, with the help of DeepSeek. Didn't help that much, but gave me an idea (smh didn't think of commenting some sections) which led to me realising it was the exact same problem with alpha, except with x and y, while I was changing and updating the class. Started to play with a level select menu, and I should add hover animations to the buttons, and add a...more varied colour palette. Then, played with the directory for an hour or two, adding subdirs, but the .pde files were stubborn. Switched over to another extension, which AI did help me with, as a .json file made for easier execution, which I'm an absolute beginner at. I'll learn it before I use JSONArrays and JSONObjects for data saves. Also cleared up some files.

Update attachment

Added 14 more levels, and their titles and descriptions. Revamped the menu, including unfinished settings, achievements, and a level select menu. Carried out optimisations and bug fixing, turns out the reason the IDE wasn't recognising the constructor (OOP ofc) was because it was being treated like a function, missing the variable altogether as well as the new string. Another issue the audio sounded terrible because it was being played 30 times a second, as the player never stopped overlapping with the levelClearArea. Somehow someone forgot to include a boolean for that. Finally, removed some of the dozens of magic numbers in the files, and I'll finish that next time.

Update attachment
Arjun Arjun about 1 month ago
Also used DeepSeek for some of the achievement names, as I was running out of ranks and had to create some more.

I've leaned into the satirical idea of the game, and added titles and descriptions for each level. After this, I completed a LOT of bug fixing that was painful, and required me to go through the PDEs of every single level file...to just incorporate multiple screens in one PDE. Oh well, that reduced my file count by half from what it would have been, and helped me in the future. Plus, it snagged a few of the layering issues I would have encountered, so that's a bonus. Note: this session did use AI, but only for formulating ideas on the game. The image attatched was the most fun part ngl (looking at you, bug fixing), but sadly only took 20 minutes or so.

Update attachment
Arjun Arjun about 1 month ago
Thanks to Mixit, Pixabay, Freesound, and more SFX providers for the sound. I’ll create the credits at the end. I used AI for ideas to expand on the “sadistic” theme, so shoutout to DeepSeek as well.
Arjun Arjun about 1 month ago
I did, because the first comment took some time to register, and I wasn’t sure if it had gone through.
yousef yousef about 1 month ago
man💀💀 did u type this without copy and paste!?

Added a short tutorial as well as balancing updates to the current last level, as relative to the game's progression, it was way too hard, and may be moved dozens of levels ahead despite of its simplicity. Furthermore, some minor aesthetic updates such as fonts and layouts were made.

Update attachment
Arjun Arjun about 1 month ago
The tutorial is 6 parts long, and some text changes throughout the levels and screens were made. The next devlog aims to add titles of each level, as well as possible portals and moving death platforms!