Secret of Malarith Reflective Journal Anthony Sturdy

Research & Idea Development

The main idea for the game was a top down, open world RPG. Our ideas were similar to the original Zelda games (with heavy inspiration from the first one). I've always been interested in Zelda as a series, it just seemed like a great fantasy adventure type game, but I especially became interested in the first one when I saw a YouTube video by a guy called Mark Brown about the mystery and adventure of the first zelda.

This is why Zelda was one of the main inspirations for the game, it made me realise how there are hardly any games now that have this sort of adventure, where you're just set free in the world to make your own story. It made me want to try something like this, although it'd be a challenge to not hold the players hand through it and tell them how everything works, I think the experience would be great for the player.

When Me, Tom & Mitch started talking about it all we decided that we should stick with the retro art style because it looks great, and it's quicker to produce. As we only have 4 months to make the game we need to be able to make things quickly. Mitch is going to be doing the sound and world design. Tom is doing the Art & Lore, and I'm doing the programming & gameplay, so I want everything to be as customizable as it can be, so things can be easily tweaked and added to without having to write a load of code. For example, I want to try and make an easy quest system instead of having to code each quest. I think this would be make everything quicker in the long run and would allow all of us to design quests however we want.

Other inspirations we used are games such as Skyrim and Pokemon. We're referencing Skyrim for the general Medieval themes in the world, and Pokemon for the art style & SFX reference. We didn't want the game to have such a simple art style as the original Zelda, because it is a modern game after all, but we still wanted to keep that retro kind of feel to it. Tom decided to work with a limited colour palette to try and keep that feel of the game as much as possible.

Week 1

This week I worked on the Inventory System, Dialogue and Movement in the game. The most challenging part was probably the Inventory System, but the dialogue also took a while to get working.

With the Inventory I have a class which holds all the properties of the items, which is then added to an available inventory slot when AddItem() is called, then when you click the inventory slot it passes that Item to an Equip slot. Having an Item class makes passing around a bunch of variables from script to script really simple as they're all grouped in the class. It saves having to reference each variable when moving around items.

The movement was really simple, it just creates a Vector2 holding the Raw Horizontal and Vertical input axis (either 0, -1 or 1. No imbetweens), which are then multiplied by a float called PlayerSpeed. That Vector2 is then applied to the player's Velocity which makes him move.

The dialogue loads a .txt file, which is then split at every line break, and is then displayed character by character when you interact with an NPC. This took a while to figure out because I've not worked much with loading and splitting .txt files in C#, also getting each letter to scroll took a while to get working.

Week 2

This week I worked hard to get a few of the main mechanics in the game such as Melee and Ranged Combat, as well as a few smaller things such as an Audio Manager script and optimizing tileset colliders.

NPC's

When discussing the NPC's AI, we decided we wanted some of them to be able to walk around while others would stay still. I worked on the walking NPC's this week which I think could still use some work to make them seem smarter, but it's not too bad. At the moment the NPC picks a random direction and then walks in that direction. The way I did it is similar to how the player moves except it's just picking a random direction instead of the player's input.

I also made it so the NPC dialogue can now just say a random line of dialogue from a text file, rather than only pre-determined lines. This took a while to figure out as it was designed with just set lines of dialogue in mind but in the end it turned out fine. This will be used just for random NPC's which make the world feel more populated but don't have any actual use in the story.

Lastly I made it so an NPC can give an item when you interact with them. This will be used when you complete a quest or talk to a hidden enemy which will give loot.

Armour, Weapons & Combat

I added loot pickups to the game, this will be for items which you find around the map or drop when you kill certain enemies. At the moment there is just a sword and 2 spells, but we're hoping to add a lot of loot to the game for when it's finished so you have a wide range of items & armour to mess around with, we're also hoping for them to have different buffs and nerfs depending on what you're trying to do. For example if you want to be more of a tank, you can equip heavy armour but you might be slowed down, or if you wanted a lighter setup for more speed you will take more damage.

I also added Melee & Ranged combat. This was quite difficult because I had to instantiate the item which is equipped on the player, then give it the ability to actually kill something. There were a few bugs when doing the ranged combat, such as it going through objects and it would weirdly follow the mouse when you move it. They have been fixed but I still want to try and improve it some more as it's quite glitchy when you shoot one after the other quickly. Lastly, I added the SFX to each individual weapon. I did this by editing the item class to have an AudioClip with it. This allows me to assign a different attack sound to each weapon easily.

Other

I made an AudioManager script, which allows me to manage multiple audio sources in 1 script. It's easier than editing the audio sources directly because you can name each one and it stops it from getting confusing. In the script I have 3 AudioSource's, In Game, UI & Music. If there are other objects with sounds such as enemies or environmental sounds, they won't go through the Audio Manager, it's only for sounds from the player.

I also had to optimize the colliders on the tileset, so instead of having 50 individual colliders for each tile, there would be for example, 5 groups of tiles. This should be more efficient and have less bugs, but it does take more time to line them all up properly.

Week 3

NPC's & Enemies

I made a few changes and additions to the NPC's and AI this week. Firstly I made it so the NPC's can say a name assigned by the Player at the start of the game. This will make the game feel more immersive or personal to the player.

I also implemented the NPC walk cycle that Tom made. I did this the same way I made the player walk but just with a different spritesheet. It's a lot better than the walking NPC's just floating around when they walk and makes them look a lot more like they're actually in the world.

I started on the enemy AI too, which is only in it's early stages at the moment because it doesn't actually attack the player. It does have health though and can die when it takes too much damage. At the moment the Enemy is only a red version of the NPC though, Tom is currently working on designing the first enemy.

Sound

Mitchell made some new Grass, Concrete and Wood footstep SFX this week which I implemented into the game. I made it so it picks a random Audio Clip out of an array of sounds so we can have as many variations as we need. He also added a looping music clip which I added to the game. It makes the game feel a lot more finished even though it's just a small addition. I helped record the footsteps sounds, we went outside and Mitchell recorded me walking on different surfaces.

Me walking while Mitch records. Pictures by Tom.

Different footsteps sounds will now play depending on what surface you're walking on too, so if you're walking on Concrete, it'll be a different walking sound to when you walk on Grass. I also did this for wood, which is inside the interiors. I did it by creating trigger colliders around wherever the footsteps change (e.g. a concrete path), when the player walks over this collider it will change the footstep sound to whatever the surface is set to.

Other

I updated the combat this week, I wasn't happy with it before as it felt unpolished, especially the ranged combat, but I've fixed it now and I'm really happy with how it works. The first change was making it so once you attacked, you cant rotate/move the weapon until the next attack. This gets rid of a weird mouse following bug with the ranged combat and just makes the melee more challenging as well as making it feel more finished. Another bug which really annoyed me with the ranged combat is that if you attacked rapidly it would just teleport the projectile back and forth and most of the shots didn't register. I fixed this by instantiating a new projectile every time you shoot, instead of resetting the position of only 1 projectile when it hits something. Which also allows the game to have more than 1 projectile out at once rather than having to wait until the last shot had finished before shooting another.

The camera also now locks to the world bounds. Before this the player would always be in the centre of the camera, but now if you get too close to the edge of the map, the camera will lock in place to stop the player seeing out of the map. I've also placed colliders around the edges of the map which stops the player from walking through any gaps in the trees.

Example of camera locking to edge

You can now buy items from Vendors in the game too. It works like talking to an NPC, you walk up, press F and a menu opens where you can buy things using currency (which I also added this week). At the moment you can't sell items or get currency in the game (other than just changing the value in the inspector), but I want to add them next week. I also recorded a timelapse of me making the vendor, I recorded my 2 monitors and then sped up about an hours work to 5 minutes. Click here to see the timelapse.

When I was at work I had nothing to do, so I decided to design a dungeon on a piece if receipt paper too. We're hoping to have a few dungeons around the map which you'll find loot or progress with the story inside. I feel like this could be expanded but I tried to make it as interesting as possible without it being a complete maze to anyone who doesn't know their way around.

Lastly, I made it so you can walk inside the buildings. I did this by making the screen fade to black, then the player gets teleported somewhere out of the map where the interior is. This gives the illusion that the player is going inside the house but they're really being teleported far away. I then did this the other way around to leave the house. I could also use this if we wanted an upstairs area, it'd work the same but you'd just teleport from interior to interior rather than exterior to interior (or vice versa).

Week 4

Player

This week I added Player rolling. So now when you press space you can quickly roll out of the way of any attacks, but you can only do it every 1.5 seconds. This makes movement slightly faster when just walking around places too which is nice. I also implemented the animation which Tom made for it.

The main inspiration for the roll came from the Dark Souls Series. I did some research about how the movement and combat in Dark Souls keeps the game fun and adds a level or strategy to killing bosses with your stamina and the small window you have to attack. In the document I also wrote "Without the roll, I think it’d feel a lot more dull and less intense, it gets your heart racing when you dodge away from a boss and just miss it’s fist by a small amount". I really want the player to get this adrenaline rush when trying to fight the bosses. You can read the full research document here.

One of the biggest things I added this week was the quest system. The most difficult part was editing the dialogue system to work with quests. When an NPC gives a quest it displays different lines of dialogue depending on what part of the quest you're at. (Quest activation, talking to NPC before quest finished, then quest finished). We also decided against having UI with all your active quests as it takes away from the "decide your own journey" and no hand-holding idea. We want the NPC to just simply tell you what to do, whether its go kill something or collect an item or anything, then you can go and do it if you want but you don't feel any pressure of having on a list of things to do. Then if you forget you can go back to the NPC and they'll remind you. We thought this would work well because it feels more free and less like we're telling the player what to do.

Sound

The way the game used to decide which footstep to play (depending on what surface you're on) was broken. The trigger areas weren't precise enough so when paths were spaced out, it still made concrete (path) sounds when walking on the bits of grass inbetween. This is now fixed by using the Tileset colliders, which I set to trigger and put the same script on. It works exactly the same but now only plays concrete footsteps when standing directly on a path tile.

We also drove down to Cannock Chase to get SFX for the game. It's the same sort of forest setting which most of our game is in so there were plenty of places to record the SFX we needed but couldn't get just at college (Such as a stream flowing). We spent the whole day there and got a lot of SFX with loads if different variations so they don't sound like they're repeating. I helped by doing the walking while Mitch recorded the sounds, and suggested different surfaces to get footstep sounds on. Tom took pictures of us recording the sounds and inspiration for the Art.

Other

I got bored at work again so I decided to draw out another dungeon design, I'm going to try and do as many of these as I can so we can just pick the best ones to put in the game. The main idea I had for this dungeon was that you have to go up the left route, grab the key and then backtrack to get through the locked door on the right.

I fixed the sorting order on the buildings and other NPC's/Enemies. With the building I made part of it which renders under the player, and then most of it renders over the player which lets me have the player walk behind the building. This makes it feel a lot more like it's actually in the world (and that the world has depth) and not just pasted over the top, which is quite difficult to achieve when the game is actually just 2D and has no proper depth.

I also changed how the sorting orders work with the Players, NPC's and Enemies. They've now got a dynamic sorting order depending on their Y position. The script was really simple and only took 1 line of code to work.

What this does is it changes the sprites sorting order to negative their Y position. (Negative because the world is in the negative co-ords and I need it to be positive, so it makes a double negative). I also multiply it by 16 because it wasn't precise enough when just doing it on the Y. It would often have weird bugs where the player would be rendered above someone that they should be below because it only changes the sorting order once per Unit, now that I've multiplied by 16 it changes 16 times per Unit, which should be once for every pixel.

Week 5

Saving & Loading

This was the one of the most difficult things I've had to make for the game because of having to Serialize the data and save it to a file. Luckily Unity has a built in Binary Formatter which will serialize most things for me, but the problem is that it can't serialize things such as Vectors or AudioClips. This meant I got errors when it tried saving Items (because they contain attack sounds). To fix it I had to move all the Audio to the Resources folder and load the sound using a string with the sound effect's directory (e.g. "Audio/SFX/In Game/Fireball").

One thing which I'd like to improve with this is not having to go into the code whenever there's a new thing which needs to save. At the moment I have it so it saves each variable which can be changed, and loads it, but if I add something new (for example, Player Health) I'll have to go into the data class and add new variables for the health, then go into the Saving & Loading and make it so it applies the health when saving/loading.

Overall I'm proud that I finally got it working, it took about 5 hours and I had a lot of problems with it but I think it's worth it as you can play the game and come back to it when you want now, without having to worry about your progress resetting.

Player Health

I made it so the player has health and can take damage now too. Tom made an 8x8 heart for the health bar and I made it so when you take damage it goes down half a heart per damage taken. The player starts with 6 health (3 hearts) and can go up to 20 health (10 hearts) maximum. There will most likely be an item you can use which gives you another heart, but they'll be quite rare and only given when you defeat a boss or find a secret area. Tom also made the outline of a heart which shows the how much health you've lost (and how much you can regain by drinking a potion or something which isn't in the game yet).

This also ties with the Enemy attack which I added this week. Tom made the animation for him slamming the ground and I made it so he attacks when at a certain distance. We thought that him just hitting the ground was a bit boring though, so I implemented screen shake into the game and made a particle effect which looks like dirt exploding. This particle effect is played when the ground is hit.

I want to improve the player taking damage by having more feedback when he's hit. I'll do this next week by adding the player damage sound effect Mitch recorded a few weeks ago, and I want to make it so the player flashes white. The white flash is done in a lot of games to show something taking damage so people should know when they see that, they've taken damage.

Cannock Chase SFX

I also implemented almost all of the sound effects that we recorded at Cannock Chase last week. It was mainly footsteps so no we have loads of variations for everything, but there were some others like the waterfall sounds.

Week 6

Research

At the start of the week I found out about this fake 3D technique, where you have a bunch of layers of sprites which are rendered slightly above each other, and can give the illusion of being a 3D model. I thought this was really interesting and the result looked amazing, it's quite simple but there's just something which looks unique about it which caught my interest.

The fact that it's still technically 2D would make it easy to convert a top-down 2D to this '3D' effect too. We probably wouldn't have time to convert Secret of Malarith to this style before the deadline, but I asked Tom and Mitch if they liked it and we decided we might make the game like this style after the deadline.

Damage & Death

This week I made it so the player can die, which makes the game feel a lot more finished even though it's just something simple. Tom did the animation for it where the player falls to his knees then to his side, he also added some blood so it feels a bit more graphic. At the moment the game just loads the previous save when you respawn, I also added an autosave every 5 minutes so you don't lose too much progress if you die. In the future I might change this so you autosave at certain points such as when going into a new zone or dungeon, which should fix the possibility of getting stuck in certain places where you have low health and are surrounded by enemies.

Another thing I added was more feedback when you take damage. When you took damage before, the only way you knew is if you checked the health bar which didn't work well. Now it makes a damage sound which Mitch recorded a few weeks ago and it also flashes white a few times. I added this to the enemies too for more feedback. I really like the result.

Dungeon

Basic outline with tree's filled in. --> Polished all the visual bugs & removed seams. --> Added the secret overlay.

I made a start on the first 'dungeon' today. It's in a different setting compared to what most of the others will be but I think it turned out well for tribe-like enemies. There aren't any actual enemies in there at the moment, I just put the layout in the map and added the secret room in there. The secret is disguised into the trees, but when you attack it, the trees will disappear revealing a secret passage which'll have loot in it. The dungeon is based off my first dungeon design which I did. There were a few changes and the proportions are slightly different, but it still resembles the dungeon.

Item Dropping

I also added a few buttons to the Inventory when you select an item which gives you the option to either equip the item or drop the item. It just creates a new loot drop below the player, and sets the loot drop's item to the item which is being dropped. This lets you go back later and pick it up if you want it back.

Week 7

New Weapons

This week Tom drew 6 new weapons. There's a Steel Longsword, Steel Curved Blade Sword, Holy Sword, Holy Hammer, Demon Sword and a Demon Hammer. The Holy & Demon weapons will likely be end-game items, we're thinking of having it one of them drop half way through the final boss battle so we'll be able to make it hard but fair, and we can control the difficulty better if we know what weapon the player will be using. The rest of them just have different speeds and damages, for example the longsword hits harder, has a longer range but is slower to swing.

Map

I've started on the village now, it's a slow process to make the houses and it's difficult to get variations, but I'm trying my best to get each building looking different to and extent. I also made the interious, at the moment it's quite difficult to have varied interiors because we don't have many items for inside, but Tom said he will do some more in the future which shouldn't be hard to quickly add in.

I also worked some more on the dungeon by adding 'Rooms' to it, so the player will be locked in until he kills all of the enemies inside the room. I still think the dungeon could use some more objects to make it feel more interesting, and we need enemies in there but for now I'm just going to work on the next dungeon and villages until Tom makes some enemy animations.

NPC Generation

The other night we were talking about the variations of NPC's when I realised that we could just have the game create randomly generated variations of NPC's, which would take a lot less work for Me and Tom in the long run. It's slightly more difficult to make the animations for this but we only need to do it once, rather than re-colour the NPC however many times. It's also easier for me because I don't have to go and make new animation files for every new NPC, I can only have to do it once per gender.

The way it's done, is the NPC is animated and drawn on seperate layers, and they're all full white (other than shading, which is grey), then in the code I have it pick a random colour from a gradient I set and set the white sprite to that colour. This way I can pick a range of colours (e.g. Skin colours), then Unity will pick a random colour from that skin colour gradient and set the NPC's skin as that. We only have Female at the moment too but hopefully we'll have Male NPC's soon, which will also be randomly picked.

What the sprite looks like before ran through the code compared to when the code re-colours it.

Week 8

NPC's

This week I worked more on the NPC generator. Before we only had the female sprites for it but now I've made it so it randomly picks a gender as well as all the colours on the character. For this Tom had to create the Male version of the sprites, which are then picked depending on what gender is set.

I also made a huge list of random quotes that NPC's can say. These will be just for the NPC's that make the world feel more full, not for the meaningful ones or the NPC's which give quests. I took reference from a lot of medieval games and tried to think of as many as I could on the spot, it was actually harder than I thought to keep it varied and try and keep it sort of Medieval/Fantasy style.

Map

I've done some more on the game world this week as well. Firstly, I did some small details, such as tree's spread around the fields between the starting area and the first village. I also added some more buildings to the village and started on a kind of mountain area. The reason it takes so long is because each tile has to be placed by hand, I don't know of any way to quickly produce the cliff edges so it's really slow.

Another part of the map I did this week is the 2nd dungeon. It was a lot easier making this underground style dungeon that it was creating the dungeon in the trees, as there was a lot less that needed cleaning up and going over. I think it looks really good too, it has quite a dark, closed feel to it which I like a lot.

I haven't yet added the rooms, because there are no enemies yet to put in the rooms so it's a bit pointless for now. This dungeon is also based off the 2nd dungeon design which I did while I was at work.

Main Menu & Multiple Savegames

Lastly, I started on the main menu and added a system for multiple savegames. The main menu has a long way to go aesthetically, but the main functionality of it is pretty much finished. If you click New Game, it'll create a new save and ask for your player name (which is also the name of the savegame), or if you click Load Game, it'll give you a list of your already existing savegames for you to pick from. The main problem with this was trying to load the game in the main scene, from the main menu. To get around this I made the MainMenuManager object not automatically destroy when loaded into a new scene, then when it is loaded into scene it triggers the LoadGame() function from the SaveGameManager and then destroys itself. There might be a better way of doing this but I couldn't think of any, and this works just fine it just feels a bit 'hacky'.

Background art temporary to test parallaxing

To improve the loading savegames, I'd like to have the time that you saved it, and if possible a screenshot of when you last saved the game as a small preview, not sure if I'll end up doing them things though. It'd also be cool to be able to delete saves from in-game but I'm not sure if it's necessary. I do really like how it is though, I think it's one of them small things which makes the game feel a lot more like a 'proper' game.

Conclusion

In conclusion, I think this week had some great progress. I'm happy with how the main menu is coming along and will hopefully have some more final art in there next week or the week after. I'm also going to try and work a lot more on the map (in-game world) next week because I think it's a priority to get that done as soon as possible so we can start adding NPC's with quests and other things which give the game actual gameplay.

Week 9

Pause Menu

This week I implemented pausing and a pause menu into the game. Unity makes this really simple, you can just set Time.timeScale to 0 to freeze everything, then back to 1 to resume. I'm glad we have this in the game because it's another one of them things which really makes the game feel more like a proper game. You can now start a game, play it, save & quit, then load it again later which feels really good to have all of that now in the game and finished. There are also 3 volume sliders in the menu, they need graphics or text to show the player what they are, but they do already work. The sliders are for Music, In-Game SFX and UI Sounds.

Inventory

The thing that took up the most of this week was trying to redo how items work in the game. It was bugging me that the items are set manually for each Loot item, or Vendor sale. So for example if I wanted to have multiple instances of the Steel Sword item, lets say there's 3 loot pickups and 5 vendors selling it around the map. If I wanted to tweak that sword I'd have to remember every vendor which is selling it and every loot pickup, and have to go and change each one, which is inefficient and would be annoying especially later into the game. Now that I've redone the inventory & item system, all of the possible items are stored in a database and referenced from there, which means I can just edit an item once and it'll change every version of it.

Tom also made new sprites for the inventory instead of the temporary white boxes, so I implemented them too.

Other

I also spent a lot of time trying to fix an annoying bug with the multiple savegame system this week. It'd work fine if you only had 1 save, there were no problems with saving or loading, but if you had more than 1 it wouldn't be able to find the save you're trying to load and create a new one. I spent a lot more time on it than I wanted on it, but I'm glad it works now and it's a lot more solid than it was.

Week 10

Enemies

This week I implemented 3 different slime enemies which Tom made the sprites for. They increase in strength so they're not all just the same enemy, but they do have the same sort of attack and attack distance. Firstly we have the green slime which is the weakest and slowest, then the blue slime which is a mid-point, and the orange slime which is the fastest and strongest. We're planning to have a dungeon filled with these slimes and have a slime boss at the end which Tom is still sketching out and figuring what we want it to look like. It'll most likely look similar to the other slimes, just with more detail and maybe a few more features such as body parts floating around inside it.

I also optimised the enemies & NPCs so that they don't walk around or do anything when the player is a certain distance away from them. This will ensure that they don't start wondering away from where they should be before the player can get to an area and it also causes less lag because it means not every enemy is going through the walk around code even when the player isn't near them.

Map

Another thing which took a lot of time is the map, I recorded myself working on it and even though it doesn't look like I made much progress, it was about 40 minutes of work which went into it. It's one of the main things which are slowing me down at the moment and there's nothing I can really do to speed up the workflow when working on the map, so for now I'll just have to keep working at it bit by bit. Here's the timelapse of what I recorded:

Conclusion

It feels like I didn't do much work this week because of a few slow-downs I had, one of which was having to implement the slimes 3 times because of the Animators corrupting when syncing the project from my PC to my Laptop. Also I worked on the map as much as I could but because of how slow and tedious it is, it just takes up a lot of time when working on it without much result. Next week I want to work on the map a lot more and try and get a big portion of it out the way, hopefully there'll be a new boss next week as well which should be fun to implement. The boss will be for the tree-styled dungeon.

Week 11

Items

This week I wanted to get all of the items into the game so I don't have to worry about it in the future. Firstly, I planned all the items I'd need on paper, then input all of the items into the database with all of their values (damage, price, etc). Then I made the placeholders for the rest of the items so Tom could work on the boss and other harder sprites, he's going to go back over what I've done if he gets time when we've finished the rest of the enemies/bosses. After that I had to put all of the sprites into icons for when you equip then and make all of the weapon prefabs that are instantiated when you attack.

Health & Armour

I also gave food a purpose, before if you used it, nothing would happen. Now when you use food it'll add however much health is set for that food. I've also priced the food items so the more health it gives, the more it costs from vendors. One of the consumable items is called an 'Orb of Life', which when you eat it gives you another heart onto your max health. This is quite a rare item though which is only dropped by bosses or bought from specific vendors for 100 coins.

I also gave armour a purpose, the max damage it can protect you from is 2 damage (1 heart), I did this because I don't want armour to be overpowered. Which is difficult because of how low the value always is, the maximum health you can possibly have is 20. The way this is worked out is it generates a random number, then if it's less than 50 you have a chance of taking 1 less damage, if its above you have a possibility of taking 2 less damage. It then checks if the random number is less than your protection value, if it is then it'll take the amount off the damage you're about to take, if not then nothing will happen. This means that if your protection value is lower than 50 its only possible to protect 1 damage.

Map

Lastly, I worked on a part of the map this week. It was only a small amount but it was about an hour of work, hopefully next week I'll be able to work on it for a bit longer. It gets quite tedious when constantly working on it though. Here's a timelapse of me working on it:

Week 12

I started this week writing down the main things I needed to do in the next few weeks before hand-in. I had a while to think about it at work and these are the main things I could think of. Throughout the week it got cut down a bit when we realised it'd be better to cut one of the bosses out and focus on making what we do already have, better. Rather than spreading it all out thin. Here's the list I got when writing it all down. (We cut out the slime boss).

Rock Boss

Tom has been working on the Rock Boss sprites for a while, he was struggling with the animations because they'd always look weird or just something wouldn't be right about them. So when he finished it I got right to work on the AI of the boss and managed to finish it fairly quickly. I think there are a few things which need to be changed/fixed with it but I'll probably iron them out when we play test the game and get feedback from some people. I also recorded most of me programming & testing it which you can watch here:

The main problems I had with the boss was making it damage the player at the right time. I didn't want you to be able to walk into his fist and take damage, I only wanted it when he actually attacks. I got this working by enabling the fist collider at a certain point in the animation so it's just a split second of attack. Then I had the problem that the player wouldn't get damaged if he was standing still, this was because OnTriggerEnter doesn't get called until theres movement in/into the collider. OnTriggerEnter had the same problem or would damage the player multiple times if I left it there for too long. So, in the end to get around the problems, I used OnTriggerEnter but had a slight gravity scale to the boss so he's technically always moving downwards (not noticeably) which makes OnTriggerEnter work.

The part I like most about the boss is how impactful the fist attack feels, with the screenshake, dirt explosion and animation I think it all comes together to feel like a really powerful attack. I think to improve on the boss I could add a bit more variation to his attack pattern and make it so he doesn't walk into walls. At the moment it makes him look stupid when he's flying into a wall not getting anywhere.

The boss also drops an 'Orb of Life' (which gives the player an extra heart) and a random Meteor item (Weapon or Armour piece)

Necromancer Boss

The necromancer boss came very shortly after the Rock Boss. Tom managed to make the sprites for the Necromancer and zombies really quickly, so it was really nice for me to be able to just dig straight into the AI when I could. The attack pattern for the Necromancer is that when he takes either 300 damage or after he walks around for a bit, he'll spawn a 'wave' of zombies. Each time he spawns a wave, it spawns 8 more than last time so the quicker you kill him the easier it'll be on the player. I wanted this to be a later game boss so this discourages new players from trying the boss. The boss drops a random spell and an Orb of Life.

The only real problem I had with making the boss was having it so he didn't spawn enemies outside of the map. When spawning the zombies it just picks random points in a circle with a 5 unit radius, so if he was pressed against a wall it'd sometimes spawn them outside of the dungeon and make it impossible to complete or even continue with the game unless you restarted without saving. This was a problem so I added 5 unit wide borders around the edges of the room that reverse the boss's move direction when he collides with them so it's impossible for him to get close to the edges.

What I like about the boss fight is how it gets harder and harder throughout it. Unlike the rock boss how it stays the same difficulty, this one is actually better to try and get it finished as soon as possible. What I don't like about it though is that you can very easily keep spam hitting the boss while the zombies aren't spawned. I'd like him to attack back or stun the enemy while he's getting hit.

Map

I also tried to get the map mostly finished this week. I think it still needs tweaking but for the most part I've got everything I need for the hand-in.

The first thing I did was the 2nd town, I wanted to make this bigger than the last, but when I got most of the way through doing all the buildings, we decided we're going to most likely restrict this area from the player so we can focus more on the other stuff without having to worry about all the quests and interiors in this town. That's why it's got a portion of buildings missing on the left.

Second Town in the Map

Tom also made the spritesheet for the castle, which I made into a castle in the map editor but we're also deciding to keep this closed off from the player so he can't go inside. If we were to expand the game further after hand-in, you'd be able to explore the castle and there would be a final boss fight here. I personally love how the castle looks though I think it has a lot of potential to be a really cool looking building if we do plan to expand it after.

Some other things I did to the map was I added new paths to the castle, second village and mountain, added trees everywhere and made the water cover the bottom and left part of the map instead of just the right. Here's a zoomed out picture of the map, you can't really make out much detail but you can see the basic layout of everything.

We planned to have much more than this and full up the empty spaces more, but with the time constraints we have it's not really possible. It's something we'd definitely want to look into if we planned on expanding the game at any point though.

Week 13

Debug Console

This week I've been adding a lot of the finishing touches to the game and finalizing everything, so I've been testing a lot of things. This started to get annoying when I wanted to test a boss, or a quest because I needed items or needed to heal myself, so I created a debug console where you can enter commands to perform certain actions in the game. At the moment it's very basic, and I probably won't add many more commands to it anytime soon, but it was really helpful when I just needed a weapon to test something or heal myself while making sure the dungeon works smoothly.

At the moment the console is really simple, it has a few hard-coded commands, and then applies the parameters you give it to go along with the command. For example, if one command is teleport, which takes 2 parameters (x and y), so the command would look something like "teleport -150 -100". It's just separated by spaces. Other commands include "give itemID", "heal" and "settime time". The settime one helped me find a bug which caused the game to go from day to night instantly, I hadn't seen this before because it was difficult to test night/day because of waiting 5 minutes until it becomes night.

The way I did this is when you type something into the input box and press enter, it splits the string by each space, then puts each split string into an array. It then searches to see if the first string in the array is equal to any of the hard-coded commands, if it is, run the command and use the parameters also input with it.

This was really useful to have a go at making, because even when I'm finished with this project, I can re-use the code on other projects to create a debug console on them. To improve it, I'd like to show the past 5 or so commands you've entered above the console. This wouldn't be super hard to do, but it's just not something I'd like to spend time on right now because this was just meant to be for testing.

Enemies

One of the main things which I implemented this week is the ranged enemy AI. We had wanted this for a long time but never had an enemy animation where he throws or shoots anything, but Tom said he was making the small ogre this week so we thought it'd be a great opportunity to have a ranged enemy in the game. To make a ranged enemy I basically did the same thing which the player does when he uses a ranged attack, except he just throws a rock when the player becomes within a certain range of him. He also chases the player a bit or will walk to get a bit closer to the player, this makes it harder for the player to dodge or walk out the way of the projectile. I also didn't want this enemy to be super overpowered, so the rock only deals 1 damage, but if there are 4-5 of them in 1 room you can easily get swamped with rocks and die.

I also implemented the small ogre once I had setup the ranged attack, this wasn't hard I just had to add all of the ogre's animations and fill in his stats.

Dungeons

I finished both dungeons this week. I already had the layouts and the final boss battles, but I now have enemies in all of the other rooms too. In the underground dungeon, it's full of the slimes, I tried to keep it varied, but have it get harder as you progress (Green - Easiest, Blue - Medium, Orange - Hardest). There are also 2 routes, one of them has a piece of loot at the end, the other has the necromancer boss.

I also added the enemies to the tree dungeon too because of implementing the small ogre. I was waiting for another ogre before finishing it because I didn't want you to just be fighting 1 enemy throughout the dungeon so now I could do that, I tried to keep a variety, such as some smaller rooms with just melee ogres, larger rooms with only ranged ogres, then a few with a mix of both. Then there is the boss at the end of course, and if you take the side routes there are 2 pieces of loot on opposite corners of the dungeon.

If I were to improve the dungeons in the future, I'd add some more complexity to them, make them bigger and add some puzzles to make them feel more like zelda dungeons. At the moment I think they're a bit shallow and don't really take much thinking/navigating to get through. Maybe this is just because I already know the layout of the dungeon, but I still would like it to be more complex.

Quests

I've been putting off writing the quests until the last minute because I wanted to include all the different types of enemies in the game. Now we've got all of the final enemies (most likely), I started writing the quests. Most of them are pretty much the same thing, you kill X amount of enemies and you get a reward for it. I tried to make this a bit more interesting by adding small backstories behind them or reasons why they want the enemies to be killed.

Finishing Touches

Next week I want to focus on bug fixes and making the user experience better, so this week I added all the 'final touches' to the game, which were things I was just putting off until the end of development because they might change or just didn't need to be done immediately.

Firstly I populated the world with NPC's, there are now loads of NPC's which'll say random things, as well as NPC's with quests. There is now a restricted area which lets you know that you can't enter the certain town in this build (because of time restraints) and has a collider to stop you entering the town. I've made it so the main walking around music stops when you enter the bar, which lets you hear the acoustic music Mitch made which really helps with the relaxed bar mood. I added a collider which stops NPC's from wandering away from the towns too, Tom suggested this a while ago, but I didn't have any NPC's in the map to use it on so I kept delaying it until now. I've also added a few Vendors in the town, which lets you spend some of the money you get from the quests on food, armour and weapons. Lastly I added an exclamation point above the heads of NPC's with quests because it was hard to tell which NPC's had quests and which didn't.

Week 14

Main Menu

Tom finished the menu art this week, which meant I could get it in the game and have it slowly parallax. We had the parallaxing setup before, I just needed to split up the layers and set the parallax values on the scripts. You can see how it works in the video below.

Sounds

Me and Mitch recorded a few sounds this week, we wanted a sound for the campfires in the game, so we got some wood and made a fire in a pot. We had a few problems because it started to rain, and the ash from the cardboard we put in there kept making it go out, but we managed to get around it all with an umberella and a metal pole to move the wood to the top of the pile.

Evaluation

The original idea of the game was to make something similar to a Zelda game. All 3 of us were interested in Breath of the Wild at the time and the way that it gives you so much freedom really interested us. We wanted to do something similar, but it had to be 2D, and we noticed a lot of people doing sidescrolling games so we decided to make it top-down to be a bit different. And so we could make it more like the older Zelda games, we also decided to limit the colours to 32 colours, this was to make the game feel more retro, but looking back, we've all decided this wasn't the best idea. The game probably would've looked a lot better if we had just used as many colours as we'd liked, but now we know and it's something to keep in mind for next time. We also didn't want it to be exactly the same as Zelda, so we decided on a medieval theme similar to Skyrim, we did this so it wasn't a Zelda clone, we just wanted specific elements from the games.

The game engine we decided to use is Unity, we went with this over Unreal Engine because I'm more comfortable programming in Unity and I think the 2D tools are better than Unreal Engines from my experience of using them both. Tom and Mitch were fine with this as long as it didn't effect the development of the game at all. I personally think the game turned out better because we used Unity, if we had used Unreal Engine, I wouldn't achieved as much as I have whilst making the game.

The first thing I added was the movement. We were testing it to see if it'd be better to have a more sluggish movement with momentum, or to just have it feel really responsive, and we decided to go with the responsive movement to make it less frustrating in tight combat situations.

After that I added the Inventory System, I had tried this before so I had a basic knowledge of how it works, but I wanted to make it really natural and clear to use. I think it works well, but there are a few things which I'd like to have improved on and what I'd probably do if I make an inventory again; firstly I'd have a grid of items showing their icons instead of a list of items. I think it's better for the player to just be able to see the icon and know what it is, rather than having to read the name of every item in their inventory. I'd also like it to either automatically sort itself and fill in the gaps from when you use items (at the moment the slot is just blank until something else occupies it), or if you could click and drag items around (would probably work better as a grid) I think it'd work well so the player can organise their inventory if they like. I didn't do this in Secret of Malarith because I didn't think it was necessary. If it was a game where you can craft/builds things (Like Minecraft or Terraria) I think I would've had to make it so you can click and drag items around, but seeing as the placement of items in your inventory doesn't matter in this game, I decided to just leave it and move onto the next task.

After that I added the dialogue system. There's not a lot I can really do to improve it, but if I were to expand it at all, I'd have the name of the NPC displayed and maybe a portrait of the NPC to give it more personality. For what we're going with, I think it's fine though.

Next was NPC AI, I didn't spend much time on this but I'd like to make them feel a bit smarter. At the moment they just walk, stop, walk stop. It'd be nice if they walked in certain paths or in and out of buildings to make them feel smarter and more immersive. Their dialogue is also just random lines taken from a document, I would prefer that you could have conversations with them. In the time we had to make the game I think this would've been a bit too much, but if we were to expand the game it's definitely something I'd like.

Then I added combat to the game, which is one of the things I have the biggest problem with. It works fine and I'm happy with it, but it just doesn't feel amazing in my opinion. I think maybe adding something like an animation, or limiting the attack to only 4 directions would've made it more interesting, but at the moment I think it feels uncomfortable. This would probably take a lot of tweaking to get it to perfect, and I'd have to look at how other games do it further. I did change it a bit here and there throughout the development but I think it could really use a big overhaul.

The rolling was a big feature which made the combat more interesting in my opinion. Before it was implemented, combat felt really flat and slow in my opinion, but when I added rolling it let the player take more risks, you could try and get that extra hit before the enemy hits you, then you could roll away. It also makes just walking around more entertaining, rather than just holding a button down, you're always trying to roll to go faster.

Adding Saving & Loading was a big task for me. It took me a few hours to mentally plan it out while I was at work or driving. In the end, the easiest approach I could think of is to store each variable (that changes whilst playing) in a class, then I found out that Unity has a built in serializer to turn that array of classes into an actual file, which could then be loaded back and have all the variables set to what they were before. I had a few problems with the loading when trying to add multiple savegames, but in the end it now works exactly how I want it to work, and I know how to do it in the future, so I'm really happy with that, I learnt a lot.

After that I added all of the items to a database to overhaul the inventory system. I think this was really helpful, it was so much easier to give items and add loot drops. It also let me see the power and cost of all the items in one place which let me balance them better than I would have been able, if I individually input the values for each item. I also learnt a lot about this because I came across quite a few problems with reading the .csv. It works great now though and if I ever make an inventory in the future, I will most likely use something similar to this.

The last big thing I added was the boss AI's. All the AI that was in the game at the moment was quite simple, it was mainly just for the NPC's or normal enemies so they were fairly simple. For the bosses, I wanted them to be a bit more complex rather than just walking toward you and attacking. For the rock boss, he'll fly around quickly which is the players main time to attack him, then he'll fly towards the player and attack. I think to improve this, I'd like to make him try and corner the player, or if I made the playing space bigger, he could circle the player for a bit. I think it's good for now though, in my opinion he feels powerful. The next boss was the Necromancer, who doesn't actually directly attack you, but we did discuss him maybe having a stun type of attack, if you hit him excessively. We decided not to add this yet because we wanted to focus on other things, but if we were to expand the game I think this would make the boss battle more interesting. At the moment the necromancer will walk around (Like the Rock Boss does), but then after 300 damage is taken, or after walking around for a certain amount of time (whichever comes first), he'll spawn '8*CurrentWave' zombies. The current wave is the amount of times he has spawned enemies already.

In conclusion, I'm really happy with how the game turned out. There's a favourable amount of content to keep the player entertained for probably about an hour or so, depending on how much of the game they complete. For the amount of time we had to make the game, I think there is a lot to do in the game, and a lot of interesting mechanics/features. Out of everything, I'm probably most proud of the saving/loading system, because of how much of a challenge it was and how well it turned out. It was what I learned the most from out of anything in the project. Working in a group has also been a big learning experience, having other people doing the parts that they enjoy the most was really fun, because I then got to focus on the parts that I enjoy the most. It can be demotivating to have to create sound effects for a game when you don't enjoy that part of the development, so when someone else is doing it and they enjoy it, it helps motivate the team to work more and achieve more.

Created By
Anthony Sturdy
Appreciate

Report Abuse

If you feel that this video content violates the Adobe Terms of Use, you may report this content by filling out this quick form.

To report a Copyright Violation, please follow Section 17 in the Terms of Use.