10/02/2022 - Brainstorming Write-up
Since last year, I've had the idea to create a 'Tower Defense' game in the back of my head. I knew the FMP was coming up and that it would likely entail making either an animation or game independently, so I already went through the list of considered genres way in advance.
The requirement of our project to have themes of Mythology completely caught me off guard, though (in hindsight, I should've expected it). Still, thankfully I came up with a new story concept for the game and gave an in-universe reason (albeit a rather silly one) as to why the player is playing a tower defence game.
I will try to maintain myth accuracy as much as possible, except for a few ridiculous adjustments.
The thought of making a game independently is stressful yet exciting. To succeed, I have to create the art assets myself, which I am still not confident in doing. I can either go back and edit the existing assets I created for this purpose or create new ones. Thankfully, I chose a tower defence for this exact reason, as tower defences don't require a lot of unique or complex assets. While improving my art skills would be nice, I would prefer to continue improving my skills in anything concerning game design that doesn't entail art.
21-24/02/2022 - Weekly Reflections (Week 1)
Mythology Discussion / Brainstorming
Today, we discussed the definition of Mythology as a class and what they entail.
Mythology is expansive and defined as a group or collection of traditional stories & events that belong to certain cultures or religions and go over numerous characteristics of humanity.
An example is the story of King Midas and his wish for a golden touch that turned anything into gold. Anything. Including his own daughter. A tragedy that taught Midas (and the reader) to be happy with what you have and not take it for granted.
Afterwards, we were split into groups and tasked to add any mythologies we were aware of and discuss them. I added the Chinese dragon, Ra, Chaos, and Disney's Hades.
Lastly, the class got together and named numerous media pieces that utilise mythology in one way or another. I added Hades and Smite to the list, as they are both games I've played in the past.
Overall, the lesson was beneficial (and fun). But, sadly, no new ideas really came to mind from this.
22 + 23/02/2022 - Semiotics / Todorov's Narrative Theory
On the 22nd, we learned about Semiotics, what objects are defined as in semiotic analysis, and the three categories they can fit under. From this lesson, I feel it might help me when making a game, especially when critically analysing different mythological-based media texts in the future. Though my core idea for the game remains unchanged, it can definitely help me add more to it.
On the 23rd, we learned about Todorov's Narrative Theory and the 5 beats a narrative can be broken into. This lesson definitely made me re-evaluate my game idea--more than the Semiotics. My initial game concept didn't have much of a complex plot and was more for getting the gameplay rolling instead of being filled with engaging details. After this lesson, I am considering adding story cutscenes in-between game levels.
This week as a whole helped reinforce my ideas for my game. I have a better understanding of Mythology and what it means now, so I can use this knowledge to further make some creative liberties concerning the original myths for comedic purposes. I think I got a good grasp of Semiotics and Todorov's Theory, which will undoubtedly aid me during the planning.
24/02/2022 - Course Review
02/03/2022 - Drawing from Objects to develop Characters
03/03/2022 - Weekly Reflections (Week 2)
This week was tiring and draining. While developing characters from random objects was surprisingly insightful and fun, the Contextual Analysis was frustrating for me. Usually, the art lessons are the frustrating ones.
While I think I can analyse media texts and recognise the signs fine enough, I find putting them down into words/sentences tough. I had to keep asking for assistance, which felt demoralising, and it felt like it took me way too long to finish just one analysis.
On the flip side, I am still steadily getting the work done, and I am doing some small secondary research for my game in my own time to hopefully make the future proposal and planning easier. Doing the contextual analysis also gave me a few new ideas for my project.
I learned how much mythologies can be changed or interpreted from secondary research, even when there is little to work off.
The results from it have definitely reinforced my own ideas in relation to ignoring myth accuracy.
07-10/03/2022 - Weekly Reflections (Week 3)
This week was painful--literally. I missed two days this week due to insane toothache pain, so I need to catch up. At least I've learned of my operation date, which is nice. The week was a blur, and there wasn't much for me to reflect on. I'm dreading the upcoming PechaKucha, though, as I absolutely hate presenting. I hope next week goes better for me.
14-17/03/2022 - Game Character Development (Week 4)
Yesterday, we were tasked to write down our characters and descriptive words for them. Afterwards, we chose one character and made a quick sketch of them to give ourselves a basic idea of their design. We then further adapted/finalised them to flesh them out.
I chose the fill-in for the player, who is described as ghostly and incredibly generic. I got inspiration from the Pac-Man Ghosts and Bloo from Foster's Home, both being very simplistic in design.
While fundamentally basic, the ghost has incredibly expressive facial features that are its primary (or only way) method of expressing emotions.
The Ghost's design directly links to previous research on the Greek Underworld and the souls of the dead that reside there. The souls are said to be insignificant and indistinguishable from each other, which is why the Ghost has such an unimaginative name and basic design--they are not meant to be unique.
I believe my outcome was successful, as the character does match the descriptive words I initially wrote down. Whether it's actually good or not is up for debate.
17/03/2022 - Game Character Development (Hades & Persephone)
Now, this is where the dumb stuff happens. Everything here I did in my own time out of college.
Because I can't draw to save my life, I needed another method of making Hades & Persephone. So I decided to make them both in a 3D avatar maker called
VRoid Studio. Conveniently, it recently came out of Beta with many new presets (around 350~).
Is it a bit too easy to take a bunch of presets and customise them in Photoshop?
Maybe, but that's the whole point.
Their character bios will be added to the GDD when it is made.
Despite taking extreme creative liberties, some of the design choices and relations still make sense (e.g. Hades is crimson red and Persephone is a grassy green to reflect their statuses).
Next, I put them in Blender, posed them, and used the built-in Dynamic Sky addon to create the dark red sky. I'm doing all this Blender stuff now to have a test render for when I need it in the future.
The throne and how Hades sits on it uses Dracula and his throne from Symphony of the Night as inspiration.
Sadly, I never recorded my progress on making it, so the best I can do is try to explain the basic process and why it was so time-consuming.
On the right is a
cc0 wooden chair model that I heavily edited and transformed into what is seen on the left. Some elements of the original chair survived, like the pointed headrest and the general shape of the model.
Keeping it simple, I edited a lot of the chair's
vertices, edges and faces while
extruding others to morph them into the structure that I was looking for. Combined with my lack of expertise in 3D modelling, one could see how this would take quite a bit of time.
It also explains why it's so basic and low-poly: I'm simply not good enough.
21 - 24/03/2022 ~ Weekly Reflections (Week 5)
This week, I mainly need to finish my Pechakucha, finish the script and present it. It's been too long, and I am the last one to do it. I'm hoping that the presentation itself is good, at least because there is no chance I will be able to look at the audience.
---
On Wednesday, I finally presented my Pechakucha and received some well-needed feedback. As expected, I didn't engage with the audience enough, and there were a few minor concerns with my idea (I went more in-depth on the PechaKucha blog page), but everything else was okay enough. I'm happy I got it out of the way. In the future, I should rehearse the presentation more so I am more prepared to present.
24/03/2022 - Game Pre-Production
Visual Moodboard
Game Design Document
28-31/03/2022 - Weekly Reflections (Week 6)
This week, I made the 3D model of the Ghost in Blender. So now all three characters are in 3D.
Writing down the whole process is beyond me and this blog, but it was a bit of a challenge.
I experimented with different colours for the body and hat, but none seemed to fit as well as purple and black. Even then, this shouldn't really matter if I go with manga-Esque cutscenes.
Thankfully, the character design was simple enough to translate into 3D, so I didn't waste much time.
Next, I quickly started the game slide/game itself.
It was started through the Turret Defense template, which saves me time adding the Pathfinding and Turret behaviours and some other minor things.
The first thing I did was create the system for drag & dropping towers.
I followed
this tutorial to achieve this.
Once you click the big tower icon, it creates the chosen tower and is flagged as "Floating".
The game checks if a tower is Floating and pins it to the mouse.
Then, if the player left-clicks a black tile and isn't overlapping another tower, it places it down and enables the tower.
I also utilised tilemaps to create map layouts with relative ease.
Finally, I was testing text scrolling text--nothing special.
04-18/04/2022 - Weekly Reflections (Week 7)
Due to having an operation on the 31st of March, I needed to recover for most of the break.
As such, I did nothing over the holiday.
Sorry.
19-22/04/2022 - Weekly Reflections (Week 8)
On Tuesday, I made sprites for the basic enemy and Artemis' bow in Piskel.
They aren't the most grandiose, but they will do.
Now, let's talk about the ghost itself.
The health system is fairly simple. This ghost enemy has an instance variable aptly named "Health" (In this case, is set to 12)
An instance variable says what it does in its name. It allows each enemy instance to store its own separate health value.
So, when the bolt projectile hits an enemy, 3 is subtracted from that specific enemy's health instance variable.
When an enemy's health value is 0 or less, it gets destroyed, and the kill/enemy count gets changed accordingly. The EnemyCount is set to the current wave's enemy count, so when it has reached 0, the game then knows that every enemy is dead, and the game can move on.
To ensure the player doesn't gain too much money, I added a variable (KillCount) that goes up when an enemy is killed. When it reaches 2, it returns to 0 and gives you $1.
Essentially, you need to kill two enemies to get $1.
Finally, if the ghost reaches the end, then it is destroyed, and both the CoreHealth and EnemyCount go down accordingly while the KillCount does not change.
The CoreHealth, in this case, is actually a global variable instead.
Global variables store their value between layouts. The reason for this was that I wasn't sure if I wanted to have the core's health to last the entire game or not
(Example: You lose 10 hp in the first level, so now you're stuck with 40 for the next level).
Here is all the code for the ghost enemy, so I don't have to repeat myself later when other enemies are added.
The next day, I coded in Artemis' bow as the game's second tower.
It does more damage than a basic and pierces through enemies but is slower.
Most of the code is copied from the basic tower but with an added check for piercing.
An arrow can only pierce three enemies before destroying itself.
Finally, I made the basic tower projectile: a thunderbolt.
I thought it would be funny to have the Zeus tower be the most basic one.
I still have no clue what to visually have as the tower itself, though, and getting the bow animation to work took longer than expected.
On Thursday, I started looking at what fonts I may want to use in my game. I initially had '
Press Start 2P' as a placeholder until I began to consider my options--and that time is now.
The creator of Press Start 2P mentions the '
Ultimate Oldschool PC Font Pack' (which I forgot existed) on their site, which is precisely what it sounds like.
There are a lot of reproduced fonts and documentation, but I ended up going with the 'IBM VGA 8x16' font. I have put credit in my Bibliography, and I will include recognition in the game somewhere when I can.
Finally, I implemented an enemy wave-based system. Making this work was incredibly annoying, but I got it done. There are a couple of global variables at play here.
Now, I can easily create groups to keep track of waves. Next, I need to add a new enemy and see if this whole system breaks or if it can handle multiple enemy spawns.
If I can get that working, then I should be good.
25-29/04/2022 - Weekly Reflections (Week 9)
On Monday, I finally finished the visual for the thunderbolt tower. This was a pain to sprite, so I have to settle with this; otherwise, I'll be stuck on it forever.
Next, I made the next enemy type: The Cyclops. It is the slow and tanky enemy of this game.
Since I have a bow and arrow as a tower, I thought a cyclops was a fitting parallel.
In fact, that's the whole point--the bow does extra damage to the cyclops.
As the cyclops copies code from the ghost enemy, I don't feel the need to repeat myself with it.
The main difference is the values in its pathfinding behaviour. Literally two changes.
On Tuesday, I mainly experimented with how I wanted the cutscenes to look once I started making them.
I finally settled on these four filters in Photoshop in this exact order with some tweaks to the settings.
This creates what I can only describe as a really cool black-white, fabric-y effect. The ghost's colour doesn't matter too much, as they are unlikely to be seen outside the cutscenes.
Sadly this took most of the day to figure out, so that really sucks. Progress still feels slow, and I am unsure if I have enough time.
On Wednesday, I experimented with backgrounds--to no avail. Nothing was fitting
As I was visibly struggling and out of ideas, my teacher gave me a logical question: If the game itself is being played in universe by the ghost, wouldn't the UI/Background logically reflect that?
I have no clue how I didn't come up with this, but it is a perfect idea.
Immediately what comes to mind are the Tiger Electronics LCD standalone handheld games.
They are cheap, low-end plastic garbage, which fits with the concept of Hades punishing you. Being forced to play one of those things may be considered torture. As such, I'm going to base my UI off of them.
Specifically, I will use the Sonic 2 and Lion King LCD games as references.
On Thursday, I made two sprites based on the LCD games. Specifically, the control buttons.
What they do is self-explanatory.
Speaking of Game Speed, that's exactly what I added next. Tower defences usually have some speed-up button, and this was the perfect time to add that now.
The code for it is surprisingly simple--what you see is what you get. The left button lowers the counter, the right button increases the counter, and the time scale changes accordingly.

The game's GUI as a whole is seeing some good progress. It still needs refining, but it's definitely serviceable now.
This was a reasonably productive week, and I am happy with the progress. I am still afraid that I don't have enough time and will have to cut the game's length in half, but that's an issue for future me.
03-06/05/2022 - Weekly Reflections (Week 10)
On Tuesday, I made 1 new tower and an enemy type, totalling 3 for both.
Unless I somehow have spare time, these two will likely be the last tower/enemy, I add.
The new tower is the Trident of Poseidon. Poseidon is one of the most well-known greek gods, so I figured it was fitting for him to be represented.
Spriting this was a nightmare. I tried four different approaches, but I had to just accept what I had and move on to actually putting it in the game. On the other hand, the attack itself took maybe 2 minutes (it's just a circle).
In-game, the Trident's attack is a complete 360 attack with infinite pierce and a slowing debuff.
It cannot consistently kill enemies on its own, but it certainly does some damage.
It uses the tween behaviour to increase the size of the attack by x5 in half a second.
The slow effect is hardcoded to reduce an enemy's speed by 25%. This means the slow has a more significant impact the faster an enemy is, perfect for the next enemy type.
Later at home, in my own time, I made the new enemy: The Harpy.


The harpy is a half-human and half-bird mythical creature.
I needed a speedy-type enemy, and the Harpy was the most fitting creature I could think of.
I didn't make the same mistake when making the sprite and just went with what I thought was 'passable', even if it's essentially just a head with wings.
Again, the code and behaviour are copied from the ghost and cyclops, so I won't put it here.
Overall, some good progress today. I just wish I didn't waste so much time making pixel-art.
Next, I need to attempt to make a cutscene, if not the tutorial.
On Wednesday, I started making the first level, which doubly functions as a short-ish tutorial.
This is harder than I initially expected it to be. I have to keep in mind numerous things when creating it.
I need to:
- Make sure the bolt tower is balanced.
- Make sure the player can't intentionally put the first tower in a horrible spot--making it impossible.
- Make it not too easy and not too hard.
- Have a system for text to actually teach the player.
- Allow the tutorial to be ignored entirely.
The end result is me working on multiple other things first, which then adds up to a functional tutorial.
On Thursday, I (tried to) improve my reflections on my blog.
I also further worked on the dialogue system.

Now I can call functions to move the textbox and switch between Hades & Persephone when necessary.
Over the weekend, I started making the opening cutscene for the game.
To actually get started, I needed some sort of scene/room.
The small 'room' was made using the Archimesh addon. There is a fair amount it can do, but one of them is making a room with many customisations.

The method of reaching the end result is mostly the same as in week 9 but with some extra additions. Specifically, Lens Correction adds a vignette effect and the original render using the Color blending mode on top to re-add colour to the image (as one of the filters forces monochrome).
It was pretty productive like last week, and I am happy with my progress.
Though, I am still afraid that I don't have enough time to finish it.
09-12/05/2022 - Weekly Reflections (Week 11)
On Monday, I made the sprites for the enemy spawner and target. The target is literally just stairs made out of 10 squares, so I will skip that one.
The spawner was made using a custom shape that Photoshop has built in.
Due to the tiny size, there are a lot of semi-transparent pixels, which is not what I want.
To get around this, I switch the image mode to Index. This essentially forces all semi-transparent pixels to be fully opaque. I don't know if there is another way to do this, but it worked, so who cares.
Next, I added the 'Reverse Mode' gimmick that level 2 has. The way it's done is very raw--moving the start wave button off-screen and swapping the enemy spawner & target locations with a tween behaviour.
The rest of the week was honestly just me play-testing and finishing Level 2. This was much harder than I thought it would be.
Trying to make Level 2 flow correctly resulted in me rebalancing every tower and enemy.
I essentially had to do play-testing every single time I made a change. I even had to go back and ensure that my re-balancing didn't mess up Level 1.
There are simply too many small changes to document here.
Now I am genuinely sceptical that I'll finish the game in time.
I honestly thought that making a tower defense would be simple/straightforward. Apparently, I was wrong, or not as simple as I initially anticipated.
16-19/05/2022 - Weekly Reflections (Week 12)
On Monday, I made the layout for Level 3 and prepared the portal split gimmick for future me to worry about later on (e.g. two extra enemy spawners & movable walls). Don't ask how it took me the entire lesson to do it--I'm not entirely sure myself.
Regardless, things are looking good.
On Tuesday, I added in level 3's first gimmick: A wall that switches sides. Using a simple set position action, I can change its position and therefore choose which path the enemies take.
This is what I would say if the pathfinding didn't completely break.
As it turns out, I am an idiot and didn't know how the pathfinding behavior worked.
When a path is calculated, it checks for any obstacles (in this case, any objects with a Solid behavior) and then generates a path to get around them.
This means that if you change the locations of the obstacles, the pathfinding objects will not care and follow their original path--even if it means going straight through solids.
This lead me to try numerous things for about 30 mins-1hr, trying to get it to work before I caved in and looked it up.
All it required was 1 action that regenerates the obstacle map. I'm dumb.
So, I made a function that regenerates the obstacle maps and called it anytime the wall moved.
On Wednesday, I primarily focused on making all 15 waves for level 3. The first 10 waves are essentially a remix of level 2, with the addition of the Harpy enemy and some enemy count adjustments.
Wave 15/666 is technically unbeatable, as the game breaks in-universe in the middle of the wave due to Hades' tampering.
Other than that, there isn't really a lot for me to reflect on here.
On Thursday, I generated a couple of sound effects using a free tool called
ChipTone, using the built-in generator.
I also spent a bit of time debugging an issue where some of level 2's enemies' pathing would just cease to work, but
only if level 1 was played in that session. The issue would not occur if the layout was previewed.
After trying a few things and going through the process of elimination, it turns out the issue was similar to the issue I ran into on Tuesday. I can only assume that the pathfinding behavior doesn't like the layout switch, but I am not 100% sure because only some enemies got stuck and the bug happened at random.
The solution was simple: Call the PathRegen function on every wave. It's messy, but it works.
Overall, I'm surprised by the progress I made this week. Gameplay-wise, the game is effectively in a finished and playable state. Other than presentation refining, the only things missing are music and the ending cutscene.
No matter what happens with the game from this point, I am proud of what I made--which is an extremely rare thing for me to say.
23-26/05/2022 - Weekly Reflections (Week 13)
On Monday, I added a zoom effect to the opening cutscene right before the gameplay starts.
First, there is an invisible object with the ScrollTo behaviour. This forces the object to stay centred in the view. As the layout is scroll bounded, nothing happens--unless the layout scale itself is changed.
That's exactly what happens here. When ZoomTrigger is true, the layout scale is set to its current value + 0.005 every 0.01 seconds, resulting in the scale constantly increasing and creating a zoom effect.
The effect ain't perfect, but it will suffice.
On Tuesday, I mainly researched and found some CC0 chiptune music that I can use for my game.
(It's not required, but I've added credit to my bibliography and in-game)
As cc0 is fair game, it means I can edit them too.
One track, in particular, was perfect but a bit too fast for the mood.
The solution is to simply use the stretch & pitch effect.
Now, my game now has both music and SFX. It really does add to the whole experience, so I'm glad I got it done.
On Wednesday, I let a few people do a quick playtest of my game. From the playtests, I found out that the bug I thought I fixed last week was still present. I tried replicating it, but it seemed totally unpredictable so I caved and added a final failsafe.

If an enemy fails its pathfinding for whatever reason, it is destroyed. I have no clue if this works, but I'm hoping it does.
On Thursday and Friday, I created the ending cutscene and the accompanying images.
I've already explained the process for making these in the past for the opening cutscene, so I won't repeat myself.
With that, the game is finally in a complete state--and right at the deadline too.
If needed, I may make some extra changes, but otherwise, it's finished.
I genuinely can't believe it.
No comments:
Post a Comment