About This Game#
Socratic Smackdown is a 2.5D platform fighter where you play as animalized versions of classic philosophers as they fight for a thought in a king-of-the-hill style game mode.
Do cool combos, use special philosophy-inspired moves, and send opponents flying off the stage in a fun-for-all fighting game experience!

Project Details#
Roles: Lead Programmer, Systems & Tools Programmer, Repo Master
Team Size: 15
Duration: September 2025 - Present
Technology: Unity, C#
- Built using Scrum and Agile methodologies
- Pitched to Champlain College faculty & alumni and was chosen to be “Greenlit” to continue working in the following semester
State Machine#
Designed and implemented a character state machine system supporting multiple states, accurate state tracking, and smooth transitions between states.
Developed a reusable Base State template to streamline the creation of individual state classes and ensure consistent structure and behavior across all states.
Base State#
// All states inherit this class
public abstract class BaseState : IState
{
public abstract StateID stateID { get; }
public virtual void EnterState(PlayerController context) { }
public virtual void UpdateState(PlayerController context) { }
public virtual void ExitState(PlayerController context) { }
}Transition#
public delegate bool Condition(PlayerController context);
public class Transition
{
public StateID to;
public Condition condition;
public Transition(StateID to, Condition condition)
{
this.to = to;
this.condition = condition;
}
}State Machine#
public class StateMachine
{
public BaseState currentState
{
get; private set;
}
public BaseState nextState
{
get; private set;
}
private Dictionary<StateID, BaseState> states = new();
private Dictionary<StateID, List<Transition>> transitions = new();
// Register states for each character's state machine
public void RegisterState(BaseState state, PlayerController context)
{
states[state.stateID] = state;
if(currentState == null)
{
currentState = state;
currentState.EnterState(context);
}
}
// Add transitions from one state to another
public void AddTransition(StateID from, StateID to, Condition condition)
{
if(!transitions.ContainsKey(from))
{
transitions[from] = new List<Transition>();
}
transitions[from].Add(new Transition(to, condition));
}
// Update the state and check for transitions
public void Update(PlayerController context)
{
if (currentState == null)
return;
if(transitions.TryGetValue(currentState.stateID, out var stateTransitions))
{
foreach (var transition in stateTransitions)
{
if(transition.condition(context))
{
ChangeState(states[transition.to], context);
break;
}
}
}
currentState.UpdateState(context);
}
// Changes the state once a transition is valid
public void ChangeState(BaseState newState, PlayerController context)
{
nextState = newState;
currentState.ExitState(context);
currentState = newState;
currentState.EnterState(context);
}
}
