(function(){ document.querySelectorAll('[data-topbar]').forEach((topbar) => { if (topbar.dataset.init) return; topbar.dataset.init = "1"; const openBtn = topbar.querySelector('[data-open]'); const closeBtns = topbar.querySelectorAll('[data-close]'); const links = topbar.querySelectorAll('[data-link]'); const close = () => { topbar.classList.remove('isOpen'); document.documentElement.style.overflow = ''; document.body.style.overflow = ''; }; const open = () => { if (window.innerWidth <= 1180) { topbar.classList.add('isOpen'); document.documentElement.style.overflow = 'hidden'; document.body.style.overflow = 'hidden'; } }; const toggle = () => { if (topbar.classList.contains('isOpen')) { close(); } else { open(); } }; if (openBtn) openBtn.addEventListener('click', toggle); closeBtns.forEach((b) => b.addEventListener('click', close)); links.forEach((a) => a.addEventListener('click', close)); close(); const handleResize = () => { if (window.innerWidth > 1180) { close(); } }; window.addEventListener('resize', handleResize); window.addEventListener('orientationchange', handleResize); window.addEventListener('pageshow', close); }); })();

Hymettus: The Hidden Lab is a multiplayer survival game set in a hidden military research base on top of Mount Hymettus in Athens, Greece.

After scientists discover evidence of extraterrestrial life, they capture alien specimens and a mysterious core for experimentation. When the core is powered up, the aliens gain superhuman abilities and break loose, killing everyone inside the lab.

A containment team is sent in to secure the base, stop the aliens from escaping, and destroy the alien core before anyone finds out what happened.

This was a small school project where we were tasked with creating a compact multiplayer game. I did most of the Game / Level Design, level art, and helped implement gameplay and story elements through scripting.

The project was developed over roughly 8 weeks half-time, while I was also working on Abtos Covert at the same time.

Project Info
👤 Role: Game / Level Design, Level Art & Scripting Support
👥 Team Size: 2
⏱️ Time frame: 8 Weeks Half-Time
🛠️ Engine: Unity
🎮 Type: Multiplayer Survival Game

Major Contributions

Level Design: Designed both playable levels (outdoor front + interior base) with spawn pacing, routes, and defensive positions for 4-player co-op.Combat Flow: Planned enemy entry points and pressure angles so teams rotate positions instead of camping.Readability: Used strong goal cues and landmark routing to keep players oriented during chaos.Level Art / Set Dressing: Set-dressed the levels using asset store packs (no dedicated artist on the project), doing a fair amount of asset flipping to quickly build readable cover, landmarks, and mood.Collaboration: Worked closely with my programmer teammate to align the level layout with what we could actually build, iterate fast, and keep the scope shippable.


OVERVIEW

PITCH

4-player co-op horde shooter set in a ruined military base on a real mountain near Athens.

GOAL

The goal was to push players through chaos toward one clear endpoint, reach the hidden lab and destroy the core.


LEVEL STRUCTURE

The experience is split into two connected spaces to control pacing and teamwork.Level 1 – The Front: Fast entry into combat and a clear first objective: survive the first waves and push forward.Secret Path: A short connector that gives a breather and sets up a tone shift.Level 2 – The Base → Hidden Lab: A larger space with an interior push that funnels the squad toward one endpoint: the core.


THE GOAL

In Level 2, the team fights through the base and holds out against the waves until the Hidden Lab doors unlock.That door is the main endpoint of the match: push forward → survive the last wave → enter the lab and destroy the core.

THE HIDDEN LAB


LEVEL DESIGN

LEVEL 1: THE FRONT

This first space is the onboarding arena. It’s readable, not too punishing, and it teaches the team how the waves “flow” before the tighter second level.You arrive as the “last squad in” after earlier teams failed. The base is already damaged: fire, alarms, debris, and a weird quiet right before it starts.

GOAL

Give players one clear objective (the locked gate) and a simple loop spawn → reach a strong position → survive waves → gate opens.

How the layout supports that
- Spawn (green): drops you into the action fast, but with cover nearby so you can stabilize.
- Vantage Zone (green area): the “safe-ish” high-value spot. It gives a better view and makes teamwork feel smart (hold angles, call targets).
- Goal cue (blue): a big visual marker that keeps the main direction in your head even while fighting.
- Enemy spawns (red): placed to create pressure from multiple sides, so the player can’t camp one corner forever.- Helicopter moment: quick exposition + mood before the chaos kicks in (sets the scenario without long dialogue).


BLOCKOUT

For this project I kept the workflow simple and fast I mostly blocked out the space first, ran quick playtests to check movement speed, sightlines, and wave pressure, then adjusted the layout before moving to the final dressing.Because we were on a tight schedule, I relied a lot on placeholder boxes and asset dimensions (using rough measurements early so cover heights and routes feel consistent). I also did a fair amount of asset flipping / reuse to fill the space quickly while keeping the main reads clear.

The before/after below shows the first playable blockout of Level 1 (cleaned up slightly for presentation) and how it evolved into the final version.

(function(){ function initAll(){ document.querySelectorAll('.hym-ba1').forEach(root => { if (root.dataset.hymBa1Init) return; const range = root.querySelector('.hym-ba1-range'); if(!range) return; const set = (v) => root.style.setProperty('--pos', v); set(range.value); range.addEventListener('input', (e) => set(e.target.value), { passive:true }); range.addEventListener('pointerdown', (e) => { const r = range.getBoundingClientRect(); const x = Math.min(Math.max(e.clientX - r.left, 0), r.width); const v = Math.round((x / r.width) * 100); range.value = v; set(v); }); root.dataset.hymBa1Init = "1"; }); } initAll(); window.addEventListener('load', initAll); setTimeout(initAll, 300); setTimeout(initAll, 900); })();


LEVEL 2: THE BASE

A circular space with multiple hold spots so players move and rotate instead of camping. One strong high-ground gives a power moment, and the Hidden Lab door stays the clear endpoint after the waves.After the Front, you enter the real facility behind it. More sci-fi, interiors, and “Area-51” vibes. The team starts seeing what the military was hiding.

GOAL

Survive the next wave set and unlock the Hidden Lab door at the far end.

- Circular flow: the base is built as a loop, so players naturally choose a route and rotate around the space instead of holding one line forever.- Multiple “okay” holds: there are several spots to fight from, but none are perfect, so the team is pushed to reposition when pressure shifts.- One strong high-ground: a raised vantage gives a clear moment of “we found the good spot”, but it’s still contestable, so it doesn’t become permanent camping.- Reveal pacing: moving deeper shows more tech + interiors, so progression feels like entering restricted territory, not just “another arena”.- Locked endpoint: keeping the Hidden Lab door visible/known helps players always understand what they’re fighting toward.


BLOCKOUT

This blockout was focused on flow + choices.I laid it out as a round/looping space so the team can rotate positions instead of holding one corner forever. I kept multiple routes between areas, with short cover chains, so moving feels possible even when waves pressure you.I also tested high ground vs. low ground early, to make sure it feels strong but not “free.” The goal was a space that supports 4-player teamworkSplit, regroup, and keep moving as the wave intensity ramps up.

(function(){ function initAll(){ document.querySelectorAll('.hym-ba1').forEach(root => { if (root.dataset.hymBa1Init) return; const range = root.querySelector('.hym-ba1-range'); if(!range) return; const set = (v) => root.style.setProperty('--pos', v); set(range.value); range.addEventListener('input', (e) => set(e.target.value), { passive:true }); range.addEventListener('pointerdown', (e) => { const r = range.getBoundingClientRect(); const x = Math.min(Math.max(e.clientX - r.left, 0), r.width); const v = Math.round((x / r.width) * 100); range.value = v; set(v); }); root.dataset.hymBa1Init = "1"; }); } initAll(); window.addEventListener('load', initAll); setTimeout(initAll, 300); setTimeout(initAll, 900); })();
(function(){ function initAll(){ document.querySelectorAll('.hym-ba1').forEach(root => { if (root.dataset.hymBa1Init) return; const range = root.querySelector('.hym-ba1-range'); if(!range) return; const set = (v) => root.style.setProperty('--pos', v); set(range.value); range.addEventListener('input', (e) => set(e.target.value), { passive:true }); range.addEventListener('pointerdown', (e) => { const r = range.getBoundingClientRect(); const x = Math.min(Math.max(e.clientX - r.left, 0), r.width); const v = Math.round((x / r.width) * 100); range.value = v; set(v); }); root.dataset.hymBa1Init = "1"; }); } initAll(); window.addEventListener('load', initAll); setTimeout(initAll, 300); setTimeout(initAll, 900); })();

NIKOLAS JOUKOWSKI