Alec Wolf

Team Size: 12          Duration: 7 months          Role: Lead Programmer
Updated June 2021

A 2D classic pixel art style platformer and exploration game where the player lives as a hermit in a dangerous forest, the player stumbles across a group of refugees escaping a mysterious magical attack on their home. Explore, forage, and cook to nurse them back to health.

For this project, we used the MonoGame framework. MonoGame is a basic C# cross-platform framework implementing the XNA API. We chose this framework rather than an engine like Unity in order to learn by essentially building our own engine to best fit our game and learn along the way. With this in mind we created many of the libraries in this project from scratch rather than using pre-existing libraries. We used OpenGL in order to create builds for both Windows and MacOS.

My Contributions

2D Physics Engine

CollisionBox – The basic physics component added to any physics object. Based on MonoGame.Extended.RectangleF class, contains all additional functionality necessary for platformer physics with custom collision and overlap events.

Collision/Overlap info – All information associated with a collision or overlap event, created and passed to event handlers when event called.

PhysicsHandler – The core class that handles all physics interactions with layers based on object labels and masks for collision and overlap with other objects.

CellGrid – Container used for PhysicsHandler layers in order to cull unnecessary comparisons in collision and overlap updates.


Idle NPC Dialogue System

NPCDialogueSystem – Core class for holding and managing all interactions, with functionality for weighted selection of possible interactions based on conditions. Reads and separates interactions from a tsv created by our writer, sending unparsed interactions to interaction class.

NPCDialogueInteraction – Class for a single interaction, with all relevant information and events. Parses information when loaded, sending unparsed individual line info to dialogue line class.

NPCDialogueLine – Class for a single line of dialogue. Contains the all relevant information for a single line of dialogue, parsed fully when loaded.


AI Movement/Behavior

NavMesh – Class containing all relevant information about a character’s navigation map, including edges. Generated on construction.

NavMap – Class containing all possible navigation points, generated dynamically when entity is created based on collision box size and wall tile information.

NavPoint – Information about a single point with relevant tile and platform type information.

BaseCharacter – A basic abstract class for movement and animation behavior shared by all characters.

AICharacter – An abstract class inheriting from BaseCharacter for all behavior control and navigation shared by all AI characters. Uses a simple state machine for behavior.

Enemy – Class used by all enemy objects inheriting from AICharacter, with all relevant information to define individual monster types and behavior states with wandering, attacking, and cool down.

NPC – Refugee class inheriting from AICharacter with behavior states for wandering and conversing.


Tile Map System

TileMap – Extends the MonoGame.Extended.Tiled tile map loading and rendering classes to generate collision objects, populate spawn/forage points, world lights, and manage map entities.

SpawnPoint – Abstract class for all information common for game entity spawn locations, including type or range of types that can be spawned at given location.

EnemySpawn – Inherits from SpawnPoint, defining Spawn() to create a new enemy of given type at spawn point.

ItemSpawn – Inherits from SpawnPoint, defining Spawn() for a dropped item.

ForageSpot – Class containing all relevant texture and growth information for a foraging location of type given by the TileMap.

ForageInfo – Static class defining growth and name information for all possible foraging types.

PickupItem – Simple class for items that have been dropped, with collision and despawn timer.


Stylized Shadow Shader

LightManager – Class managing static and dynamic light objects, as well as formatting arrays of data for the shader.

AreaLight/DirectionalLight – Classes for easily defining relevant information for a given light object.

CastShadows – A custom HLSL shader that casts rays from light sources given light info and occlusion mask to calculate light value of each given pixel, assigning the value to the alpha of the pixel. Smooth shadow render target is then drawn with a custom HLSL shader created by a teammate to map opacity to a dither spritesheet.


Stylized Weather Shaders (Not in current build)

WeatherElement – Abstract class for general information about a given type of weather common among all weather, including a generated noise texture.

Rain

C# class – Generates a random noise texture and manages scroll of rain falling as well as direction.

Shader – An HLSL shader that draws only the pixels above a given density value as the specified color.

Fog

C# class – Generates an OpenSimplex noise texture with horizontal wrap and manages horizontal scroll of fog.

Shader – An HLSL shader that uses a vertical falloff and density to determine the opacity based on the noise texture of a given pixel, finally clamping opacity values based on a user defined step value and drawing pixel as specified color.

TextureWrap – An HLSL shader that draws a texture in a given space with a given offset, tiling to fill in the space. Used by both weather classes for continuous textures.


Custom Camera Controller

Extends the MonoGame.Extended.OrthographicCamera class to manage pixel dimensions of game world in both windowed and full screen views, as well as controlling camera movement with the player’s location, world bounds, and player bounds.


Custom Debugging Display

A series of debug views that can be cycled between for both the game world camera overlay and a smaller mini-display of the entire current scene. States include camera debug, physics debug, AI debug, and player debug.


Sprite Font Manager

Simple class managing the loaded in sprite fonts and adding functionality for formatted printing of text with different alignments and custom parsing for line breaks.


Texture Atlas Manager

An extension of the XNA Texture2D class, adding functionality for reading in a json file associated with a texture to generate a texture atlas. Contains functionality for different methods of drawing textures from atlas, as well as a default error texture.


Content Loading Scene

A scene which uses the main graphics thread to display the amount of time spent loading and the current batch being loaded. ThreadPool is then used to load, initialize, and generate all game content, tracked by the main thread to give user feedback.