games developer

Jared Fisher

Games Developer · Unity & C#

About Me

I'm a final-year Games Development (Programming) student at ACM Guildford, graduating in August 2026. I've built games in Unity and C# both solo and as the programmer on Agile teams, working across gameplay programming, engine systems and version control with Git and GitHub, and I've taken projects through the full development cycle from prototype to finished build. Alongside my studies I've worked in customer-facing roles, which sharpened how I communicate and solve problems under pressure. I'm looking for a graduate or junior programming role where I can keep developing technically while contributing to something people actually play.

Course
BA (Hons) Games Development
Institution
ACM Guildford
Graduating
August 2026
Focus
Gameplay & Systems Programming
Status
Open to graduate roles

Systems Playground

A working slice of the generator that lays out each floor in Tasting Menu. A normal floor is three or four enemy rooms with at most one treasure room, and the treasure is a roll rather than a promise. A cuisine runs five floors deep, so every fifth floor drops the usual structure for a short one: spawn, one treasure room to prepare, then the boss.

This demo needs JavaScript to run. The algorithm it uses is written out below.

  • Start
  • Enemy
  • Treasure
  • Exit
  • Boss
Floor- Rooms- Enemy- Treasure- Seed-
How the generator above works
// A cuisine runs five floors deep and the last one is the boss floor.
const floorInCycle = ((floorCount - 1) % FLOORS_PER_CYCLE) + 1;
const isBossFloor = floorInCycle === FLOORS_PER_CYCLE;

// Decide what the floor is made of before deciding where any of it goes.
// A boss floor is deliberately short: spawn, one treasure to prepare, then
// the fight. A normal floor is three or four enemy rooms and at most one
// treasure, which is a coin flip rather than a promise.
function buildManifest(rng, isBossFloor) {
  if (isBossFloor) return ['start', 'treasure', 'boss'];

  const enemyCount = MIN_ENEMY_ROOMS
    + Math.floor(rng() * (MAX_ENEMY_ROOMS - MIN_ENEMY_ROOMS + 1));
  const middle = new Array(enemyCount).fill('enemy');
  if (rng() < TREASURE_CHANCE) middle.push('treasure');

  return ['start', ...shuffle(rng, middle), 'end'];
}

// Random walk across the grid, biased rightward so a floor reads left to right.
function generatePath(rng, cols, rows, roomCount) {
  const visited = new Set();
  const path = [{ col: 0, row: Math.floor(rng() * rows) }];
  visited.add(`${path[0].col},${path[0].row}`);

  while (path.length < roomCount) {
    const { col, row } = path[path.length - 1];
    const candidates = [
      { col: col + 1, row, weight: 3 }, // forward through the floor
      { col, row: row + 1, weight: 1 },
      { col, row: row - 1, weight: 1 },
    ].filter(c => inBounds(c, cols, rows) && !visited.has(`${c.col},${c.row}`));

    if (!candidates.length) break; // walked into a dead end
    const next = weightedPick(rng, candidates);
    visited.add(`${next.col},${next.row}`);
    path.push(next);
  }
  return path;
}

// The walk can dead-end before it has placed everything the manifest asks
// for, so retry rather than shipping a floor that is missing its exit.
function layOutFloor(rng, manifest) {
  for (let attempt = 0; attempt < MAX_PATH_ATTEMPTS; attempt++) {
    const path = generatePath(rng, COLS, ROWS, manifest.length);
    if (path.length === manifest.length) return { path, manifest };
  }
  // Every attempt dead-ended: drop enemy rooms until the floor fits,
  // because the entrance and the exit are the parts that cannot be cut.
  ...
}

Projects

Little Pig

This was a University group project inspired by a game called Little Nightmares.

View GitHub Repository →

CAGED

This was a University solo project inspired by a game called Hollow Knight

View GitHub Repository →

Sinner's Belt

This was a University group project in collaboration with the Birmingham campus

View GitHub Repository →

Tasting Menu

This was a University solo project inspired by a game called Into The Unwell

View GitHub Repository →

Contact