High Frontier 4 All

High Frontier 4 All is the digital adaptation of Ion Game Design's strategy title, recognized as one of the most complex board game experiences due to its intricate resource management and abstracted orbital mechanics. Developed as a dedicated mobile experience, the project involved translating a high-density system of solar system colonization and fuel-based transit into a functional, portable format. During my six-month internship, I worked across the codebase to refine the multiplayer experience using Unity’s UNet system, optimize computational logic, and implement the gameplay rules that define the High Frontier universe.

Engine:

Unity, C#

Backend & Infrastructure dropdown

Managing a project with the structural density of High Frontier 4 All required significant technical discipline. Because the ruleset is so deeply interconnected, the architecture had to be carefully managed to ensure that updates to one system would not negatively impact another. This complexity demanded a rigorous approach to code stability and logic verification to keep the simulation accurate across all platforms. A major part of the development process involved balancing the game's data-heavy mechanics with the constraints of mobile hardware. I focused on refining our systems to be performant enough for a smooth user experience without compromising the integrity of the board game's original logic. Transitioning into the Lead Developer role during this project allowed me to oversee these high-level architectural decisions and ensure the final product met the studio's standards for both performance and rule accuracy.

Multiplayer & Session Resilience

I was responsible for maintaining and extending the peer-to-peer multiplayer framework built on UNet for High Frontier 4 All. Because matches can last many hours, resilience to unstable mobile connections was critical. To address this, I implemented a reconnection layer that cached session credentials on the client, allowing players to re-authenticate with the host after a disconnect. Once reconnected, the host triggered a full state synchronization, sending an full snapshot of all component stacks, resource levels, and the game state in general to restore the client to the current simulation state. This system worked alongside a persistent save mechanism that allowed the host to preserve the entire game state during full session interruptions, ensuring that no progress was lost regardless of connection quality. I also implemented fallback logic that transitioned disconnected players into a passive state, allowing matches to continue without blocking gameplay.

Automated Bug Reporting dropdown

To streamline the QA process for such a complex simulation, I built an in-game bug reporting system that automated data collection for the development team. Previously, users had to manually fill out external forms, but this new system allowed players to submit reports directly from the interface, including a description of the issue and a "severity" rating. Upon submission, the tool automatically gathered the current Unity console logs and game-state data, sending it via a web request to the company’s existing spreadsheet database. This ensured that every report was backed by technical context, making it significantly easier to diagnose logic errors in the game’s deep ruleset while working within the studio’s established workflow.

Mobile UX & UI Systems dropdown

Adapting High Frontier 4 All for mobile required a minimalist approach to a data-heavy simulation. To keep the focus on the solar system map, we utilized a radial "wheel" element to house global menus like player inventories and auctions, keeping them accessible but hidden when not in use. Detailed information, such as component stacks, was anchored directly to map nodes, opening contextual UIs only when selected. This hierarchy ensured the screen remained uncluttered, allowing players to manage the game’s deep complexity without losing sight of the navigational map.

UX Feedback and Action Validation dropdown

The UI is designed to give the player instant feedback while keeping the game state synced. Since buttons stay visible even when an action isn't allowed, the game uses local checks to explain exactly why a player can’t do something at that moment. This helps teach the rules directly through the interface. If a move looks valid locally, the UI updates to show the result while sending the data to the host in the background. If the host finds a problem, usually due to a desync, the game reverts the UI to the correct state and notifies the player. This keeps the game feeling fast on mobile while ensuring everyone stays in sync.

Faction Selection and Rocket Rendering dropdown

For the faction selection and player summary screens, I implemented a performant 3D preview system that showcases unique rocket models alongside their respective stats. To minimize mobile rendering overhead, I utilized a single-camera setup—active only when a rocket is in view—that excludes shadows and shares a single renderer across all previews. As the player scrolls through factions, the system only fully renders the focused model while keeping the others turned off. This setup delivers a high-fidelity look that remains lightweight, ensuring a smooth transition between menus and the main game.

Card, Component, and Stack Systems dropdown

In High Frontier 4 All, spacecraft are not singular objects but "Stacks" of individual parts represented by cards, known as Patents. There are six distinct types of cards, including Thrusters for propulsion, Robonauts for prospecting sites, and Refineries for industrialization. For these primary components to function, the system must validate a chain of supporting hardware; for instance, a Thruster may require a specific Reactor for energy, which in turn might require a Radiator for cooling. This architecture uses a modular framework of ScriptableObjects and interfaces to ensure all dependencies are met in real-time without circular logic.

Hierarchical Data Structure

To manage the game's diverse deck, a strict inheritance hierarchy was implemented to create a robust and performant database of patents. The structure begins with a generic CardObject base class, which provides a clean foundation for any card-based logic. This is then inherited by a PatentObject that contains shared data common to all game patents, such as Mass (used for fuel and thrust calculations), Radiation Hardness, and a reference to the card's upgraded "flipped" side. Specialized classes for each of the six card types—including Thrusters, Robonauts, and Refineries—inherit directly from the PatentObject. These subclasses store the unique data required for their specific roles in the simulation. This hierarchical approach allows the game to treat all patents as a unified database while still maintaining the specific properties needed for high-fidelity space flight and industrialization mechanics. Because the rules of High Frontier 4 All contain many unique exceptions, Interfaces were utilized to handle functionality that spans multiple types. For example, while propulsion is primarily the domain of Thrusters, certain Crew cards can also provide thrust under specific conditions. By having both types implement a shared thrust interface, the simulation can calculate vessel performance across different component types without duplicating logic or creating rigid, messy dependencies between unrelated classes.

Modular Ability System dropdown

Beyond base statistics, many cards possess unique abilities that are handled through a decoupled, event-driven architecture. This system was designed to allow the core engine to process complex rule exceptions without having to hard-code specific card behaviors. Each PatentObject holds a list of Ability ScriptableObjects that function on a Trigger and Result model. When an action occurs, such as a movement or a radiation check, the stack scans all its components for abilities with a matching trigger enum. When an ability is triggered, the system sends a comprehensive data package containing the current stack, the specific component, the trigger type, and player metadata. While most abilities only require a fraction of this information, providing a standardized context ensures the system can handle even the most complex card interactions. The ability processes this data and returns a generic result structure to the triggering code. This structure includes a success flag, a return type enum, and a list of affected components, allowing the engine to determine if the result is relevant to the current action. For example, during a radiation check, the engine triggers all abilities with a radiation roll trigger. A Solar Sail component might return a specific result type for immunity. The radiation logic specifically looks for this type; if found, it checks for the returned component or components and exempts them from the roll. This architecture allows multiple different abilities to trigger simultaneously without interference. If one ability returns a result for a refuel multiplier while the engine is looking for radiation immunity, the irrelevant data is simply ignored. To maintain the integrity of the 50-page ruleset, all ability logic is verified strictly on the host. The system waits for the host to confirm the result of an ability before finalizing the game state. This ensures that the complex rules are followed perfectly across the network, even if high-latency conditions cause a brief delay in action processing.

1 [Header("Activation")]
2 [SerializeField] private AbilityTrigger trigger;
3
4 [SerializeField] private AbilityLimit limit;
5 [Tooltip("If the return is unused leave as None")]
6 [SerializeField] private AbilityReturnType returnType = AbilityReturnType.None;
7
8 [Header("Ability")]
9 [TextArea(10, 7)][SerializeField] private string abilityExplanation;
10
11 public AbilityReturn TryActivateAbilitiesOfComponent(AbilityData data)
12 {
13 AbilityReturn returnData = new AbilityReturn(false, 0);
14
15 //If the ability is on a component
16 if (Validate(data))
17 {
18 returnData = Activate(data);
19 }
20
21 returnData.returnType = returnType;
22
23 return returnData;
24 }
25
26 /// <summary>
27 /// Only Validates that the ability should be activated (trigger and Limits)
28 /// NOT that the ability will be successful
29 /// </summary>
30 public bool Validate(AbilityData data)
31 {
32 if (trigger != data.trigger)
33 {
34 //Logger.LogWarning("Incorrect Trigger Type");
35 return false;
36 }
37
38 if (!limit.ValidateLimit(data))
39 {
40 //Logger.LogWarning("Limit not met");
41 return false;
42 }
43
44 if(!InnerValidate(data))
45 {
46 return false;
47 }
48
49 return true;
50 }
51
52 virtual protected bool InnerValidate(AbilityData data)
53 {
54 return false;
55 }
56
57 virtual protected AbilityReturn Activate(AbilityData data)
58 {
59 Logger.LogWarning("Standard Ability Activated");
60 AbilityReturn returnData = new AbilityReturn(false, 0);
61 return returnData;
62 }
63
64 public string GetExplanation() => abilityExplanation;

Stacks and Components dropdown

The transition from a static card in a player’s hand to a physical object in space is managed through a Component and Stack relationship. When a player spends Aqua to boost a patent into orbit, the PatentObject data is wrapped in a Component instance. A collection of these components forms a Stack. For a player to perform a move, they must first designate a Stack as a Rocket by assigning a source of thrust and ensuring that thrust has a valid, completed support chain. This structure allows the engine to distinguish between a simple collection of parts and a vessel capable of spaceflight. To maintain performance, these validation checks are not run constantly in the background; instead, they are triggered by specific game events. When a player attempts to assign thrust or when a component is lost—due to hazards or radiation—the system verifies if the rocket's configuration remains valid. If the support chain is broken or the thrust source is removed, the vessel is transferred back to being a simple Stack and loses its ability to move. Once a valid Rocket is confirmed, the player can then spend their Move action to navigate that specific vessel across the map.

Reflection

Working on High Frontier 4 All was a significant milestone as my first commercial project. Translating the immense complexity of the original board game into a functional digital space, particularly within a multiplayer environment, presented a unique set of challenges. This experience was incredibly rewarding, reinforcing a passion for tackling intricate and systems-heavy projects that require deep technical problem-solving. It demonstrated the importance of finding the balance between rigorous simulation and a fluid user experience, a challenge that I look forward to pursuing in future high-complexity titles. My transition into the Lead Programmer role after the game's launch provided a different and equally valuable perspective on software development. Taking over leadership for a live, published title involved managing ongoing stability while implementing new features for an active player base. Working on a live game taught me the importance of long-term maintainability and the specific discipline required to update a complex ecosystem without disrupting the existing experience. This role allowed me to oversee high-level architectural decisions and set technical standards, ensuring the project remained robust as it continued to evolve.