PromiseLand (working title)
A creature-collector action game where you control both your tamer and your creature,
battling wild creatures in real time.
- Role
- Gameplay Programmer (volunteer)
- Studio
- Mirage Studios (remote)
- When
- Jul 2025 – present
- Status
- In development · working title · prototype art
- Tech
- Unity 6 · C# · URP 2D
What I built
Timeline-based skill system
Every skill is a set of steps, and each step runs a timeline of timed events: animation,
aim lock, movement and casting restrictions, dashes, VFX and SFX, and spawning proxies.
Proxies are the projectiles and zones a skill leaves in the world. Each one runs its own
timeline and reacts to a hit or to expiring, and proxies can spawn other proxies, so
chained skills need no new code.
The combat designer proposed the timeline approach. I built it, then made it
designer-friendly with custom inspectors that list every event type through reflection.
Creatures cast through the same pipeline as the player, so AI and players share every
skill.
C# · ScriptableObjects · SerializeReference · Custom editors
The runner: events fire at their time, and anything that lasts is always cleaned up,
even when a skill is interrupted.
IEnumerator TimelineCoroutine(SkillTimeline timeline, SkillContext ctx)
{
float elapsed = 0;
foreach (SkillTimelineEvent e in timeline.GetTimelineEvents())
{
while (elapsed < e.timing)
{
yield return null;
elapsed += Time.deltaTime;
CleanupExpired(elapsed);
}
e.Execute(ctx);
if (e is ILastingEvent lasting && lasting.Duration > 0f)
_activeEffects.Add(new ActiveEffect { SkillEvent = e, EndTime = e.timing + lasting.Duration });
}
while (_activeEffects.Count > 0)
{
yield return null;
elapsed += Time.deltaTime;
CleanupExpired(elapsed);
}
OnTimelineComplete?.Invoke();
}
// Interrupting a skill cleans up everything still active,
// so a creature can never be left rooted or with its aim locked.
public void StopTimeline()
{
CleanupAllActive();
StopAllCoroutines();
}
Creature AI: context steering + state machine
Creatures score 16 directions every tick. Each steering behavior (seek, avoid, strafe,
run away, NavMesh pathing) adds danger and interest, and a solver blends them into one
direction. It moves more naturally than a plain NavMesh agent, each creature can be tuned
to move its own way, and skills and stats can affect movement without fighting the
pathfinding.
A state machine (unaware, aware, aggressive) decides which behaviors are active. States
never move the creature directly.
C# · Context-based steering · NavMesh · FSM
The solver: every behavior writes into the same two arrays, so adding a behavior never
touches this code.
public Vector2 GetDirectionToMove(List<SteeringBehavior> behaviors, AIData aiData)
{
int count = Directions.sixteenDirections.Count;
float[] danger = new float[count];
float[] interest = new float[count];
foreach (SteeringBehavior behavior in behaviors)
(danger, interest) = behavior.GetSteering(danger, interest, aiData);
Vector2 output = Vector2.zero;
for (int i = 0; i < count; i++)
{
interest[i] = Mathf.Clamp01(interest[i] - danger[i]);
output += Directions.sixteenDirections[i] * interest[i];
}
return output == Vector2.zero ? output : output.normalized;
}
Capture
Built the capture system from the design spec. The tamer throws a catching tool along a
curved arc. Each hit stuns the creature and chips its breakbar, then the tool bounces away
and homes back in for another hit. When the breakbar breaks, the creature is yours and goes
into your party, or into storage if the party is full.
Also built getting creatures back out of storage and creature ownership, on top of a
storage system by another programmer.
C# · Animation curves · State machine
Spawning
Spawn areas wake up when the player walks in. Each one has a weighted table with a level
range per creature, and groups spawn in a ring whose radius grows with the group size, so
bigger groups never stack on top of each other.
C# · Weighted tables
A problem I solved
The problemCreatures chasing a target on the other side of a wall would jitter,
then stop dead against it.
WhyThe direction to the target scored high interest, but the wall in that same
direction scored high danger. Subtracting one from the other cancelled them out, leaving no good
direction to pick.
The fixA NavMesh steering behavior that feeds the next corner of a path in as
the interest, instead of the target itself. Creatures now aim around walls rather than at them.
About the game
PromiseLand (working title) is a creature-collector action game in development
at Mirage Studios. You control both your tamer and your creature, catching new creatures and
battling others in real time with their skills. Shown with the studio's permission.