Agni, my first published game | My Gamedev Journey #4

Hey all, I know its been a while now since I last posted. I was busy with exams and some stuff at home. Lets talk about Agni. Agni in my head is this Jojo’s Bizarre Adventure/Link-esque character where for every story I want to tell I use the same protagonist, but with a different personality, a different generation, etc. I designed her (yes my Agni is female) to be the protagonist for the more story based games that I would make. I do enjoy the immersive design that a game like Half Life or Portal takes with the silent protagonist, but I feel like that takes away from the story telling since that is one less character for me to attach myself to. This isn't something I had thought of back then, but I knew intuitively. How I came to learn it a story for next time :)

For the first game in my new series, I wanted to try out a maze generation algorithm. Essentially, the idea was that the player would use swipe controls to tell Agni which direction to move in, and find some coins in a deep procedural maze. I wanted to make the entire game in a month, so my main focus was on two things. 1) Getting the player movement to feel awesome. 2) Getting the maze to feel random but also solvable.

For the player movement, I knew I was going to use a top down perspective, I feel like phone controls haven't reached the point where 3D controls are fun. They always essentially boil down to covering half the screen with a joystick control. I’ve been looking for a way to get rid of that. A way to have the player not cover the screen with their hands. My solution was the aforementioned swipe controls. I didn't really know how swipe controls worked back then, nor that Unity had a convenient implementation so I ended up designing my own system.

It was simple enough, I would mark the point where the player started their swipe, and the position where they lifted their finger.

Vector2 direction = start — end;
int xSign = Mathf.Sign(direction.x);
int ySign = Mathf.Sign(direction.y);
direction.x = (Mathf.Abs(direction.x) > threshold)?1:0;
direction.y = (Mathf.Abs(direction.y) > threshold)?1:0;
if(direction.x == direction.y)
direction.x = 0;
direction *= new Vector2(xSign, ySign);
player.moveDirection = direction;

So the code is simple enough, if the swipe reaches a certain threshold, the value of direction assigned accordingly. the only edge case that was becoming an issue was if the user somehow made a perfectly diagonal swipe. if both x and y exceed the threshold, then the player would start to move diagonally and not only that, the player would move faster than usual. My fix was a simple if statement, I made it so that it prioritizes the y value and not the x.

There are drawbacks to this definitely. For one, if the player swiped really slowly and in a ? pattern, that would register as a downward swipe. because the end position is below the start point.

As for the Maze, I used a simple Recursive BackTracker Algorithm. The explanation is that I would create a square grid of nodes which have a marker for their adjacent walls. I would place a node in a stack, and then destroy a wall adjacent to the node, and the add the adjacent node to my stack. Lather rinse repeat until every node is visited. It was always a closed maze, there would not be any open points or any closed points, but it added a level of randomness which I liked. I also made it so that if my node had 3 adjacent walls, i.e. if the node was a dead end, it would add a coin there, and there was a 20% chance that that coin would be a trap coin! The trap coins are supposed to glow red and explode when collected.

The game was simple enough, I learned a lot from it though. I had never made a game that I had to make from start to finish, and I refused to get assets from elsewhere. The Maze was in 3D but their colliders were in 2D, so I had a 2.5D system in that way. I drew all the art myself. I composed the music using The Legend Of Zelda’s Water level as reference. I used the exact same notes, but I played around with the instrument and the timing to create different vibes. The intro has a dark mystery vibe to it because its slow and methodical. The in level music is bouncy and the beat has a detective style vibe to it. The coin collect sound is the same note sped up! I really enjoyed how I was able to use the same notes to come up with different styles of music which is big considering how tone deaf I can be at times!

So that was Agni, from the next blog post I will be talking about Criminal Cleaners and Chasers co. it was a large project for PC with a lot of planning replanning, throwing away, which is why it took a while. I also really wanted to make it as scaleable as possible, and that's how I got into tools programming! See ya then!

P.S. I know I spelt it wrong, but its canon now, cant do anything about it! XD




Indie Game Developer, check out my portfolio over at He/They/She/Xe/Zer/etc. whatever pronouns you prefer!

Love podcasts or audiobooks? Learn on the go with our new app.

Recommended from Medium

LeetCode Weekly Contest 238 Report

JDK, JRE, JVM in Java

XSS from Semicolon Vulnerability in Microsoft IIS/6.0

Let’s Talk About Synchronized

版本控制(version control)實在太重要了 (上) 沒有的話我會想離職

Install & Manage Docker Using Ansible Pla

Create a coin distraction system in Unity Part 1

How to Use Github Professionally

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store


Indie Game Developer, check out my portfolio over at He/They/She/Xe/Zer/etc. whatever pronouns you prefer!

More from Medium

How to increase your energy for performance & to shine? Running, moving, breathing in Flow

Chris Evans Run Fest Run

4 Effective Ways to Improve Your Wedding Limousine Experience in Toronto

Ladies — Swap your throw-away, single use, period products and use re-usable period wear instead.

The Curse of Abandoned Carts — What’s Going On?