Portfolio



Kamikaze Warrior is a 2D-platformer produced for the Nokia 3310 Jam event. Make a game within a week abiding by certain restrictions on the resolution and color.

Animation/A.I.

The enemies in the game are animation based.

The skeleton slams its hand down to crush the player, or causes an explosion to erupt from the center of its chest. Either one is triggered randomly, and the appropriate animation plays.

The eye simply moves left and right, and has a plethora of orbs flying around it. If the player collides with these orbs, they are sent back to their spawn. There are also platforms circling around it for the player to use and reach the checkpoint above the eye.

The swordsman plays one of the three types of animations. Either a quick slash, dither with the sword, or a swift blow towards the center.

What I Learned

The game’s controls were far too frustrating. As the developer of the game, I played it numerous times and thought the difficulty was good enough. However, the first jump that is required had many players stuck. They got frustrated and quit the game in a couple minutes even before they got past the first obstacle. This was due to the height of the jump, and the rounded edges I had given the player. Even if the player made it onto the platform, there was a strong likelihood of them slipping off. Play testing from a friend or family member could have easily solved this issue, but because I was too focused on making content for my game, I missed out on the opportunity to allow my players to even experience it.

Also, the puzzle aspect of the game could be improved. I was afraid that the player would not know how to progress. I wondered if they would figure out that they should be using their death as a means to reach locations unreachable by their movement. And so, I detailed the answers on the game page. Going forward, I will be cautious with my time and use some of it to find better ways of incorporating hints into my games.


Esoteric Land is a text-based video game produced for the Lost Cartridge Jam event. Make a game waitin three days abiding by certain restrictions. I created a simple algorithm that looped over every object (which I call ‘entity’) in my game and executed their functionality

Map Generation

The Scene class contains all the units participating in the game, along with the map. The map contains two types of tiles: ground and wall. Calling the Generate method, procedurally generates a map. The ‘generateCount’ variable keeps track of the number of times the ‘Generate’ method is called, and is used to adjust the difficulty of the generated map.

Looping over the entire map, a list of Vector2 is kept track of, marking the starting-positions of rooms randomly chosen. Then, paths are generated between the rooms, allowing units to traverse from one to the other.

Certains advantages are given to the user, depending on how many maps they have conquered, and the amount of gold they possess. Regenerative values are increased, along with health.

Finally, enemy units are placed across the map. Depending on the difficulty, the map is littered with a number of and different types of enemies.

There is always an exit at each side of the map. Going through one of the exits, loads the next map.

Colliding with an enemy unit will result in battle. Taking the user to another screen, where they are provided with options on how to defeat their enemy.

Defeating an enemy has the chance to drop gold and items.

In battle, the user can view their inventory. They can equip weapons, armor, and use potions they have acquired, giving them different options to deal with their enemy.

A.I.

The artificial-intelligence contains a base class which all A.I. inherits from. This class contains overridable methods such as ‘CanMove’ which determines if the A.I. can move to a specified position. This allows for unique behavior, where some A.I. can move to certain positions which are unreachable by other A.I. or maybe even the user.

Modularity

The UnitControls class allows different algorithms to control a given unit. A class inheriting from ‘UnitControls’ can read the inputs from the keyboard to allow the user to control a unit. Or, it can read the state of the game, and commit to an action using that data, independent of the user. This modularity allows mixing unit behavior, where a ‘Bandit’ might start behaving like a ‘Vampire,’ or even allow the user to control it.

Algorithm

The UnitRandomControls picks a random direction to move. An integer with range of [0, 4) (min is inclusive, max is exclusive), is picked from randomly, and the direction goes clockwise in ascending order: up (0), right (1), down (2), left (3).

If the distance from the user’s unit is less than a specific threshold, the unit instead goes towards the user, either first trying to move horizontally, and if failed, then vertically. Or, vice versa. [0, 1], [2, 3], respectively.

The distance is not calculated using trigonometry because the game is played on a square-based grid, however, if one wanted to calculate it differently, the abstraction of the class allows the possibility of overriding the method.

A BattleBrain is A.I. that is used during battle, when the user has collided with an enemy unit. Each type of unit has a unique battle brain, consisting of different methods the enemy will use to try to defeat the user.

What I Learned

The lesson for this game didn’t have to do with the game itself. It had to do with the launch of the game. I uploaded the build, went to bed, and forgot about the game. After the judging was done, I was told that the game could not run. To my dismay, I went to figure out what had gone wrong. The problem was that the game was dependent on a specific version of .NET Core, and most people did not have it. I had to rebuild the game, include all the required files, and then upload it again. Although it was too late for it to be judged, I learned to keep up with my published projects to squash any bugs and mishaps that could prevent potential players from playing my game.