<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-03-04T13:20:15+00:00</updated><id>/feed.xml</id><title type="html">Alistair Clark</title><subtitle>Computer games programmer, currently in 4th year at Abertay University - Dundee</subtitle><entry><title type="html">Honours Project: Hex Grid Procedural Generation</title><link href="/university/project/2026/03/04/honours-project.html" rel="alternate" type="text/html" title="Honours Project: Hex Grid Procedural Generation" /><published>2026-03-04T08:47:52+00:00</published><updated>2026-03-04T08:47:52+00:00</updated><id>/university/project/2026/03/04/honours-project</id><content type="html" xml:base="/university/project/2026/03/04/honours-project.html"><![CDATA[<p>UE 5.6 Cave Map Generation
<!--more--></p>

<h2 id="skills-developed">Skills Developed</h2>
<ul>
  <li>c++ to blueprints</li>
  <li>pathway algorithms</li>
  <li>landscape algorithms</li>
  <li>UI implementation</li>
  <li>Save &amp; loading system</li>
</ul>

<p>Link to up-to-date project: <a href="https://github.com/AliClark2023/HonorsTesting/tree/main">Up-to-date build</a></p>

<h1 id="project-in-progress">—Project-In-Progress—</h1>
<h2 id="040326">04/03/26</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/mPZAbz5Ou28?si=RAc1isJ5nh-6A1i7" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>
<p><br />
Huge changes to project since November with the main changes being:</p>
<ul>
  <li>Tighter focus on path generation instead of multiple layers</li>
  <li>All path techniques integrated into project (Perlin Worms, DLA &amp; Cellular Automata)</li>
  <li>Save &amp; loading system implemented to use generated map layouts on demand</li>
  <li>Player character implemented for playtest &amp; exploring generated layouts</li>
  <li>Specific tiles added that trigger the end of a level or move player to next layer of map layout</li>
  <li>Playtest UI and system implemented</li>
</ul>

<h3 id="map-generation">Map Generation</h3>
<p>Landscape, region and layer generation remains similar to the November build, with the main changes being how the path generation is performed.
Can now specify which pathway algorithm is being used as well as its unique parameters. When specified, the layout can then be saved to a data asset file which can then be used for loading and testing.</p>

<h3 id="island-detection--joining">Island detection &amp; Joining</h3>
<p>With the addition of multiple pathway techniques, a problem arose that the algorithms can generate pathways that were non-contiguous and isolated from each other. To fix this, a method of island detection using a flood-fill technique called Breadth-First Search (BFS) was implemented. 
After islands are detected a method was then employed to join them by:</p>
<ul>
  <li>calculating the centroids of the islands (noting that this can produce incorrect tiles if the island shape is concave)</li>
  <li>drawing a line between island centroids and returning all grid coords fall within that line (requires converting Even-Q grid coords to cube coords)</li>
  <li>changing these returned tiles into path tiles</li>
</ul>

<h3 id="path-generation">Path Generation</h3>
<p>Drunkard Walk implementation remains the same but have added the following algorithms:</p>

<h4 id="perlin-worms">Perlin Worms</h4>
<p>Modifies the Perlin noise function used by generating the landscape into a set amount of user defined “Worms” that create pathways either at random points within the grid or joins these worms together to create a singular pathway.
Number, length, frequency and seed parameters can all be adjusted to change the behaviours of these worms.
Island detection &amp; joining is applied after generation to ensure valid layout.</p>

<h4 id="diffuse-limited-aggregation-dla">Diffuse-Limited Aggregation (DLA)</h4>
<p>Employs multiple specific drunkards walks around a starting “Seed” area to generate the pathways. Each walker travels until it comes into contact with a path tile, in which its previous tile becomes a path and the walker dies. Process is repeated until a layout size has been met.
3 types of DLA are implemented:</p>
<ul>
  <li>Inwards: Walks are performed at random points throughout the map and travels towards the seed area.</li>
  <li>Outward: Walks are performed at random points within the starting seed area towards the map boundaries.</li>
  <li>Central: Similar to Inwards but a line is drawn from walkers starting point to the centre of the map and the walker follows this route.</li>
</ul>

<h4 id="cellular-automata">Cellular Automata</h4>
<p>Considers all tiles within a grid as either Path or non-Path. Changes the state of these tiles depending on the states of the surrounding neighbouring tiles. Many rules exist for this type of generation but only two methods are implemented within the project. Currently only considers immediate neighbours (1 tile away) and can progress iteration of generation to produce differing layouts.</p>

<ul>
  <li>Wolfram codes: system that determines the existing tiles state based on the outcome of its Northwest, Central and Northeast neighbours. A config parameter was added that allows the editor to alter all possible neighbour states (8 combinations) and their resultant state. With this system known wolfram codes can be entered and performed on the current map layout.</li>
  <li>Game of Life: considers all neighbouring tile states to determine the current state according to the number of Path tiles (alive) or non-Path (dead) tiles. This depends on the following adjustable parameters:
    <ul>
      <li>Death limit: determines number of dead tiles needed to kill central tile if it was alive.</li>
      <li>Birth limit: determines number of alive tiles needed to make central tile also alive.</li>
    </ul>
  </li>
</ul>

<h3 id="playtesting">Playtesting</h3>
<p>UI environment:
<img src="/assets/img/MenuSS.png" alt="UIMenu" /></p>

<p>In-game environment:
<img src="/assets/img/InGameSS1.png" alt="In-Game" />
For the dissertation side of the project, a build is created that employs a testing environment containing a UI and multiple saved layouts for participants to explore. The goal of the environment is for the player to explore the layout with a controlled character and reach a specified exit tile. Questions about the layouts are then asked of the particpant regarding the nature and suitability of the layout.</p>

<p>Currently this aspect of the project is for internal University use only but may be opened up in the future.</p>

<h2 id="271125">27/11/25</h2>
<iframe width="560" height="315" src="https://www.youtube.com/embed/RQ8pqYNIEN0?si=CnMCo62koo0OrYL3" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>
<p><br /></p>

<p>This project will look at the effectiveness of multiple procedural generation technqiues in generating a cave system for isometric games.
Goal of project is to create a continuous game map by stacking multiple layers of procedural generated levels.</p>

<p>Link to 27/11/25 build: <a href="https://github.com/AliClark2023/HonorsTesting/tree/FeasibilityDemo">Demo</a></p>

<p>The current formation structure:</p>

<h3 id="pathway-generation">pathway generation</h3>
<p>Uses drunkards walk to generate a path from a designated start point until a specified path size or iteration limit has been met.
Iteration ends when path is no longer able to proceed (all surrounding neighbouring tiles have already been visited) or has met path size.</p>

<h3 id="landscape-generation">landscape generation</h3>
<p>Uses UE defualt perlin noise to adjust all height values of landscape tiles. This can be adjusted by modifying the noise scale and the height multipler which governs the max height of the generation.</p>

<h3 id="region-generaion">Region generaion</h3>
<p>Voronoi regions are created by using seed locations planted at random within the grid. TIles calculate and are assigned to the seed location they are closest to. 
Number of seeds can be adjusted but currently there are only 5 unqiue biomes immplemented.</p>

<h3 id="level-formation">Level formation</h3>
<p>Combining each of the previous techniques generates a map with random characteristics</p>

<h3 id="world-formation">World formation</h3>
<p>Specifying how many layers to generate will perform the level formation for each layer. The result is that each layer will have its own unque properties.</p>

<h3 id="current-development-notes">Current development notes</h3>
<p>At time of this post, all layered levels will share the same generation parameters (output still random) but will be individually assigned in later builds
Perlin noise is currently normalised to give a flat base, this is for testing and will be reverted in future builds.
Other notable developments are in the readme of the project files.</p>

<p><img src="/assets/img/WorldGenGif2.gif" alt="LayerStack" /></p>]]></content><author><name></name></author><category term="University" /><category term="Project" /><summary type="html"><![CDATA[UE 5.6 Cave Map Generation]]></summary></entry><entry><title type="html">Synaptic (Dare Academy)</title><link href="/further/development/2025/08/30/synaptic-dare-academy-copy.html" rel="alternate" type="text/html" title="Synaptic (Dare Academy)" /><published>2025-08-30T08:47:52+00:00</published><updated>2025-08-30T08:47:52+00:00</updated><id>/further/development/2025/08/30/synaptic-dare-academy%20copy</id><content type="html" xml:base="/further/development/2025/08/30/synaptic-dare-academy-copy.html"><![CDATA[<p>Dare Academy 2025 project in UE 5.4
<!--more--></p>

<h2 id="skills-developed">Skills Developed</h2>
<ul>
  <li>Creating controller functionality</li>
  <li>Reiterating on past code</li>
  <li>Animation blueprints</li>
  <li>Sound attenuation fields/attributes</li>
  <li>Light attenuation fields/attributes</li>
  <li>Identifying optimization areas</li>
</ul>

<p><img src="/assets/img/DCAEvent.jpg" alt="DCAEvent" />
Continuing the project from DES315 my team (Bonny Bandits) have improved upon “Synaptic” during the summer and have showcased our game to the public at the Dundee Contempoary Arts (DCA) building during its annual Drop-in and Play event.</p>

<p>Link to the build used at the event: <a href="https://bonny-bandits.itch.io/synaptic/devlog/1029909/final-synaptic-build">DCAFinalBuild</a></p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/GeDYPSRBskA?si=0DIg8njw1VeBaS0D" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>
<p><br /></p>

<h2 id="breakdown">Breakdown</h2>
<h5 id="goals">Goals</h5>
<p>During DARE feedback from the mentors and discussion with the team members it was decided that we would iterate on:</p>
<ul>
  <li>Retool narrative</li>
  <li>Record new narrative lines</li>
  <li>Redesign playable levels into a more shorter, segemented design</li>
  <li>Adjust target behaviours and add new ones</li>
  <li>Adjust weapon mechanics</li>
  <li>Add controller support</li>
</ul>

<p>As system programmer for the team my job was to retool the systems to accomodate these proposed changes, starting with the major one:</p>

<h5 id="level-activation">Level activation</h5>
<p>Since the levels where being redesigned into shorter more intense segments the previous target activation system needed to be expanded upon.</p>

<p>Previously, upon activation, the level barriers would query the game world for all objects with the target interface. While this worked for the beta build it was very resource intensive and would not scale well.</p>

<p><img src="/assets/img/BarrierTargetTrace.png" alt="Barrier Target Trace" />
<em>targets detected by barrier</em></p>

<p>To remedy this, the barrier was modified to include an activation volume in which it will query this space for the targets.
This allows each level to be split into segments and allows the designer to add/remove as many targets as necessary.</p>

<p>As a consequence of this change, it was found that with the addition of these segments (and the number of targets increased dramatically) performance started to drop.
In investigating this problem it was found that it was the number of targets being rendered in the game level were causing the performance issues.
To fix this, a spawner object was created that did not render anything in-game. It allowed the designer what target to spawn, when to activate the target and which (when applicable) track for the target to traverse on.</p>

<h4 id="diary-page-unlocks">Diary Page unlocks</h4>
<p>Another system to iterate on was the diary page unlock system. Previously, a set number of pages to unlock (determined by designer) were assigned to each level and unlocked pages where then signaled to the game mode when the player travels back to the main hub area.
For this new segmented design, a singular lore page is unlocked after the end of each shooter segment. This page is then able to be displayed in game when the player interacts with a new object (statue) and also unlocks the entrance to the next area.</p>

<p><img src="/assets/img/Statue.png" alt="Statue object" />
<em>Statue in-game</em></p>]]></content><author><name></name></author><category term="Further" /><category term="Development" /><summary type="html"><![CDATA[Dare Academy 2025 project in UE 5.4]]></summary></entry><entry><title type="html">Synaptic (Des315 project)</title><link href="/university/project/2025/04/24/synaptic-des315.html" rel="alternate" type="text/html" title="Synaptic (Des315 project)" /><published>2025-04-24T08:47:52+00:00</published><updated>2025-04-24T08:47:52+00:00</updated><id>/university/project/2025/04/24/synaptic-des315</id><content type="html" xml:base="/university/project/2025/04/24/synaptic-des315.html"><![CDATA[<p>UE 5.4 Cross-discipline, narrative focused project
<!--more--></p>

<h2 id="skills-developed">Skills Developed</h2>
<ul>
  <li>Project Management (Jira, gantt chart)</li>
  <li>Cross disciple collaboration</li>
  <li>Data table usage</li>
  <li>Game mode and game mode component creation</li>
  <li>Interaction interfaces</li>
  <li>Blueprint usage</li>
  <li>Protoyping VFX</li>
  <li>UI logic</li>
  <li>Audio narration progression</li>
</ul>

<p>Link to the beta build: <a href="https://bonny-bandits.itch.io/synaptic/devlog/935211/synaptic-gold-master-is-out">beta build</a></p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/PXlDNm1oWtM?si=uZ48GaDZ_laoyEym" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p><br /></p>

<h2 id="breakdown">Breakdown</h2>
<p>University group project simulating a studio environment to produce a playable demo with the brief “Fire Walk with Me” A lynchian genre.</p>

<p>Made in UE 5.4 my role was system programmer and was responsible for creating aspects of the game that governed:</p>
<ul>
  <li>Target behaviour</li>
  <li>Wave formations (target activation)</li>
  <li>Level loading</li>
  <li>Audio narration</li>
  <li>Object Interactions</li>
</ul>]]></content><author><name></name></author><category term="University" /><category term="Project" /><summary type="html"><![CDATA[UE 5.4 Cross-discipline, narrative focused project]]></summary></entry><entry><title type="html">Roguelike Weapon Mechanic</title><link href="/university/project/2024/12/18/roguelike-wepon-mechanic.html" rel="alternate" type="text/html" title="Roguelike Weapon Mechanic" /><published>2024-12-18T08:47:52+00:00</published><updated>2024-12-18T08:47:52+00:00</updated><id>/university/project/2024/12/18/roguelike-wepon-mechanic</id><content type="html" xml:base="/university/project/2024/12/18/roguelike-wepon-mechanic.html"><![CDATA[<p>UE 5.4 Weapon and inventory mechanics project
<!--more--></p>
<h2 id="skills-developed">Skills Developed</h2>
<ul>
  <li>C++ in UE 5</li>
  <li>Exposing C++ code to blueprints</li>
  <li>Niagara VFX systems</li>
  <li>Applying physics to objects</li>
  <li>Skeletal mesh sockets</li>
  <li>UI &amp; input logic</li>
  <li>Weapon state machines</li>
</ul>

<iframe width="560" height="315" src="https://www.youtube.com/embed/Sg8J6A2iyek?si=stfhqjKZCdkweN-x" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>Link to the <a href="https://github.com/AliClark2023/MechanicsAssessment">mechanics project</a></p>

<p>Third year Uni project that uses UE 5 to create a weapon system that allows the player to pick up available weapons and modify their behavior depending on the location within the players inventory.</p>

<p>The player can drag and drop equipped weapons (in inventory) to change the weapon behavior on the fly and cause additional interactions with the weapons in game.</p>]]></content><author><name></name></author><category term="University" /><category term="Project" /><summary type="html"><![CDATA[UE 5.4 Weapon and inventory mechanics project]]></summary></entry><entry><title type="html">Magnus Library</title><link href="/further/development/2024/09/28/magnus-library.html" rel="alternate" type="text/html" title="Magnus Library" /><published>2024-09-28T08:47:52+00:00</published><updated>2024-09-28T08:47:52+00:00</updated><id>/further/development/2024/09/28/magnus-library</id><content type="html" xml:base="/further/development/2024/09/28/magnus-library.html"><![CDATA[<p>Unity Game Jam Project
<!--more--></p>
<h2 id="skills-developed">Skills Developed</h2>
<ul>
  <li>Unity</li>
  <li>C# coding</li>
  <li>Inventory management</li>
  <li>UI logic</li>
  <li>Level logic (timers, level triggers)</li>
</ul>

<h1 id="document-in-progress">—Document-in-Progress—</h1>
<p><img src="/assets/img/MagnusLibrarySS.png" alt="MagnusLibrary" />
Game developed during <a href="https://itch.io/jam/agds-freshers-jam-2024/entries">AGDS Freshers Jam 2024</a>
<br />
Link to <a href="https://alex-onions.itch.io/magnuss-libary">Magnus Library</a></p>

<h2 id="key-notes">Key notes</h2>
<p>Developed inventory system that governed the addition and sequence of books for each level.</p>]]></content><author><name></name></author><category term="Further" /><category term="Development" /><summary type="html"><![CDATA[Unity Game Jam Project]]></summary></entry><entry><title type="html">PS5 project(Friends in Space)</title><link href="/university/project/2024/05/07/friends-in-space.html" rel="alternate" type="text/html" title="PS5 project(Friends in Space)" /><published>2024-05-07T08:47:52+00:00</published><updated>2024-05-07T08:47:52+00:00</updated><id>/university/project/2024/05/07/friends-in-space</id><content type="html" xml:base="/university/project/2024/05/07/friends-in-space.html"><![CDATA[<p>C++, PS5 proprietary engine project
<!--more--></p>
<h2 id="skills-developed">Skills Developed</h2>
<ul>
  <li>Entity Component System (ECC) architecture</li>
  <li>Further C++</li>
  <li>Procedural level generation</li>
  <li>Box 2D usage</li>
  <li>Haptic feedback (Controller)</li>
</ul>

<h1 id="document-in-progress">—Document-in-Progress—</h1>
<iframe width="560" height="315" src="https://www.youtube.com/embed/V8haehQ-hus?si=rhjw2hwltwK22H8G" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>Second year group project developed using university in-house game engine (Skateboard) for the PS5.
Recording listed above does not include audio.
Project files are unlisted due to NDA.</p>

<h2 id="keynotes">Keynotes</h2>
<p>Developed level progression system that pans camera to new segment of the map when a player reaches the edge threshold.
Developed multiple level layouts and a system that randomly picks between them to produce unique games.
Developed multiple platform types to add variation within each layout.</p>]]></content><author><name></name></author><category term="University" /><category term="Project" /><summary type="html"><![CDATA[C++, PS5 proprietary engine project]]></summary></entry></feed>