About

I'm a gameplay programmer working in Unity and Unreal. I like building the systems underneath a game, like abilities, AI and combat, and making them feel right to play.

I studied Game Development at IADE in Lisbon, with an Erasmus semester at Cologne Game Lab in Germany. Based in Lisbon, Portugal.

Alongside game development I teach it. Explaining a system to a room of teenagers is the fastest way I know to find out whether I really understand it.

Teaching & education

  • Game Dev Workshop Leader, TUMO Lisboa · 2025 – present
    Unity game development workshops for ages 12–18.
  • Course Author, Universidade Europeia · 2025 – 2026
    Wrote two complete online courses for the Software Engineering degree: Multimedia Computing and Software Reuse.
  • Game Dev Teacher, Sharkcoders · 2024 – present
    Game development fundamentals for ages 4–12.

Code

Code I'm happy for people to read. Each link goes straight to the file on GitHub.

2D Turn-Based RPG · Unity 6 · C#

A data-driven turn-based combat framework: abilities, conditions and items are built as data in the editor, not new code. See the repo

  • Ability.cs Abilities as ScriptableObjects built from modules (damage, heal, conditions) with before/execute/after hooks, so new abilities are data, not code.
  • UnitConditions.cs Status effects: application chance, start/end-of-turn processing, and cleansing.
  • CombatManager.cs The coroutine-driven round and turn loop.
  • ConditionEditor.cs Custom inspector that finds every condition effect type through reflection, so designers pick effects from a list.
  • ItemEditorWindow.cs An editor window for creating and editing items without touching assets by hand.

Projects

Projects I've worked on professionally, at university, and in game jams.

Featured

More projects

Early work

Abomifighters: World League

A 2–4 player arena fighter where every limb you rip off is a new ability.

Role
Junior Gameplay Programmer
Studio
ProudTurkeys (remote)
When
Jun 2023 – Jan 2024
Status
Development stopped
Tech
UE 5.2 · C++ · GAS · EOS
Links
Steam page

What I built

A limb ability knocking an opponent back
Abilities with the Gameplay Ability System

Implemented limb abilities in GAS, including knockback and a distance-based stun, built from Gameplay Effects and Tags.

C++ · GAS · Gameplay Effects & Tags

Multiplayer HUD

Reworked and maintained the in-game UI: a dynamic display of each player's equipped limbs, radial cooldowns and health bars, kept in sync for up to 4 players.

UMG · C++ · Replication

The in-game HUD showing equipped limbs and cooldowns
Abomifighters key art
Networked gameplay

Debugged replication issues across UI, animations and ability execution, and verified the Server and Multicast RPCs and replicated variables the gameplay depends on.

Replication · RPCs · EOS

About the game

Abomifighters is a multiplayer arena fighter built on Lyra in Unreal Engine 5. Players pick up limbs to fight each other, and each limb brings its own skill, so you build your character as the match goes. The in-house MVP was shown at events and to publishers.

← Back to projects

Slimando

A top-down roguelite shooter built around 60+ abilities that combine into synergies.

Role
Gameplay Programmer
Team
2 programmers
When
2022 – 2023
Result
GameJamPlus 22/23 Grand Final
Tech
Unity 2D · C#

What I built

Several Slimando abilities combining on screen
Data-driven skill system

Architected the skill system behind 60+ abilities. Abilities are composed of modular effects, so new ones are mostly data, and they combine at runtime into synergies.

C# · ScriptableObjects · Modular effects

Performance with 100+ enemies

Optimised rendering and particle systems so the game stays stable with over a hundred enemies and their effects on screen at once.

Unity Profiler · Particle systems · Rendering

A screen full of enemies in Slimando
Slimando ability selection
Ability design & balancing

Designed and balanced abilities alongside the programming, wrote the project documentation, and integrated all the game's assets.

Game design · Balancing · Documentation

About the game

Slimando started as a GameJamPlus 22/23 entry and qualified for the Grand Final. It's a top-down roguelite shooter where you build up a set of abilities over a run, and the fun comes from how they stack and combine. It's playable for free on itch.io.

← Back to projects

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

A skill timeline asset in the Unity inspector
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.

← Back to projects

Ziniax Warriors

A 2v2 sci-fi MOBA with mix-and-match abilities and its own matchmaking server.

Role
Programmer
Team
3 programmers
When
2.5 months · 5th semester
Tech
UE 4.27 · C++ · C / WinSock
Ziniax Warriors gameplay
What I did
  • Implemented a modular skill system: 3 characters, 6 abilities, and players pick any 3, so any character can run any build.
  • Built the matchmaking server in C using WinSock.
  • Structured the game around Factory and Observer patterns, so new characters and skills were easy to add.

← Back to projects

Celestial Odyssey

A 3D elemental action-adventure: astral-project into the spirit world and defeat the 12 Chaos Signs.

Role
Programmer
Team
3 programmers, 6 designers/artists
When
2.5 months · university
Tech
Unity · C# · Windows & Mac
Celestial Odyssey gameplay
What I did
  • Implemented the elemental abilities, where each defeated Chaos Sign unlocks a new skill based on its element.
  • Implemented game mechanics and systems, and integrated assets from the 6 designers and artists.
  • Wrote documentation and worked in a 9-person, cross-discipline team, the biggest I'd worked in at that point.

← Back to projects

RadSquad

A fast-paced precision platformer for Windows, with an Android companion app.

Role
Programmer
Team
3 programmers
When
2.5 months · early university
Tech
Unity 2D · C# · Android
RadSquad gameplay
What I did
  • Implemented game mechanics and systems, including a movement kit with wall jumps, wall grabs, air jumps, slides, dashes and down-dashes.
  • Worked on the character roster, where each character's abilities suit different levels, and the radiation/infirmary recovery loop.
  • Documentation and asset implementation.

← Back to projects

Scrap Bots

A browser-based multiplayer scrapyard game: gather resources, build robots from parts, sell them.

Role
Programmer
Team
3 programmers
When
2.5 months · early university
Tech
JavaScript · p5.js · SQL
Scrap Bots robot building
What I did
  • Wrote the database code and managed the database.
  • Implemented game mechanics and systems: three resource types, part bundles, and robots built from 5 parts with attack, defence and speed stats.
  • Documentation and asset implementation.

← Back to projects

Knightmare

A 2D action platformer about a disgraced knight fighting through a demon-infested kingdom.

Role
Solo
When
2.5 months · early university
Tech
Lua · LÖVE (Love2D)
Knightmare gameplay
What I did
  • Designed and programmed the whole game solo in Lua with LÖVE, with no engine editor.
  • Built themed levels of increasing difficulty, with melee combat and magic abilities.

← Back to projects

Around Us

You're the ship's AI, about to be replaced, and the crew has to go before the update does.

Role
Programmer & designer
Team
5 people
When
Pirate Software Game Jam 16
Tech
Unity · C#
Around Us: watching the crew through the ship's cameras
Around Us gameplay
What I did
  • Programmed the crewmate AI the whole game depends on: the crew go about the ship while you track them through the cameras, waiting for one to let their guard down.
  • Programmed the main scene and worked on the game design.

← Back to projects

SplitSoul

A short top-down horror puzzle story about two people who seem to share one soul.

Role
Programmer
Team
Programmer + artist
When
Black & White Jam #9
Tech
Unity · C#
SplitSoul gameplay
SplitSoul dialogue or driving minigame
What I did
  • Did all the programming: room exploration, a dialogue system, inventory and objectives, and a driving minigame.
  • Built it around the jam theme “Death is a new beginning”, loosely based on a true story.

← Back to projects

Deflecto

An endless top-down shooter where you fight copies of yourself with your own deflected shots.

Role
Solo
When
Mini Jam 111 · 72 hours
Tech
Unity 2D · C#
Deflecto gameplay
Deflecto colour wheel in action
What I did
  • Programming, art and sound effects, solo, in 72 hours (music by Kubbi).
  • Built for the theme “Colors” with the limitation “You are your own enemy”: the opposing colour sends a projectile back where it came from, any other colour lets it pass straight through.

← Back to projects

Hydropop

Click the bubbles to stay hydrated, but don't overdo it.

Role
Solo
When
Trijam #231 · 3 hours
Tech
Unity · C#
Hydropop gameplay
Hydropop during an event
What I did
  • Made the whole game solo in 3 hours.
  • Random events speed the game up or slow it down, and working out what each one does is part of the challenge.

← Back to projects