itch.io is community of indie game creators and players

Devlogs

​COMBAT ENGINE OVERHAUL

Project Void
A browser game made in HTML5

A full look at how combat, actions, equipment and the effects engine work and what it makes possible.

THE NUMBERS FIRST

Before anything else, here is what this engine is capable of.

Using every parameter available in the effects system, the number of structurally unique single effects you can create is approximately 515,000,000. That is five hundred and fifteen million distinct effects from dropdown choices alone, before a single numeric value is touched. Before damage numbers, durations, tick intervals, proc chances, or stack thresholds are set.

With up to 10 effects per action/equipment, the number of unique actions/equipment that can be built from this system reaches:

363,078,054,770,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000

That is a number with 81 digits. For comparison, scientists estimate there are roughly 10^80 atoms in the entire observable universe. Project Void's action space is larger.

This is not a marketing claim. It is the direct result of combinatorial math across four independent design layers. Every enemy in the game, every ability in every zone market, every piece of equipment with passive effects, all of it is drawn from the same pool. That pool is, for all practical purposes, infinite.

This is what the combat engine is built on.

OVERVIEW

Project Void's combat system is fully server-authoritative and real-time. Every action you take, every effect that fires, every piece of damage dealt, all of it is validated and resolved server-side. There is no client-side cheating. What you see is what actually happened.

This post breaks down the three interconnected systems that make combat work: the action system, the effects engine, and how they combine to produce gameplay that goes far deeper than it looks on the surface.

THE ACTION SYSTEM

Every player has a 6-slot action bar. All six slots are yours to configure freely. Core abilities like Basic Attack, Provisions, and Flee can be equipped and unequipped from any slot just like purchased actions. Your bar is entirely your own.

Using an action costs 80 energy. Energy builds over time during combat, so timing matters. Burning your energy on the wrong action at the wrong moment can leave you unable to respond. You start each combat at zero energy.

Every action also has a cooldown (measured in milliseconds) and a difficulty rating, the percentage chance it misses entirely. A slow, devastating ability might have a 45% miss chance. A quick poke might never miss. This is the tradeoff system that keeps combat from being a DPS race.

Action Types

Actions are locked to the equipment you have equipped. This creates natural build paths and loadout decisions.

MELEE Requires a melee weapon. High damage, close quarters. Generally higher difficulty ratings.

RANGED Requires a ranged weapon. Consistent output, often lower difficulty. Strong for sustained pressure.

MAGIC No weapon requirement. Works regardless of what you have equipped. Universal but often slower cooldowns.

LIGHT ARMOR Requires light armor. Typically mobility and evasion-focused abilities.

MEDIUM ARMOR Requires medium armor. Balanced offense and defense options.

HEAVY ARMOR Requires heavy armor. Tanking and sustained defense. Slow but durable.

Targeting Modes

Actions also have a targeting mode that determines who they affect: enemy, self, ally, area_enemy, area_ally, area_all, random_enemy, random_ally.

Area targeting hits every valid target simultaneously. Random targeting is unpredictable by design. Building a party that can exploit these modes together, stacking AoE pressure, chaining heals across allies, landing a random-target debuff at just the right time, is where the strategic depth of multiplayer combat lives.

THE EFFECTS ENGINE

Actions by themselves are just delivery mechanisms. The real design space lives in the effects engine, a fully modular sandbox system that defines what actually happens when an action lands.

A single effect is built from four independent layers. Each layer adds a dimension of control. Together they let a single effect be as simple as "deal 10 damage" or as intricate as "deal damage that scales with the target's missing HP, only if the target has a specific status, spawning a secondary heal effect on expiry that transfers to a random ally on kill."

Layer 1 - Atom

The core of the effect. Defines what it does, who it targets, how it scales, when it fires, and the value range it rolls between.

Effect types: damage, dot, heal, hot, energy_stop, energy_boost, shield, stat_mod

Scaling options: flat, weapon_dmg, pct_hp, pct_max_hp

Effects also have a duration (how long they last) and a tick interval (how often they pulse), enabling damage-over-time, heal-over-time, and persistent debuffs with full control over timing.

Layer 2 - Conditions

Gates the effect behind one or more real-time conditions. All conditions must pass for the effect to fire. You can stack multiple conditions for precise situational control.

Available checks: target_hp_below, target_hp_above, caster_hp_below, caster_hp_above, caster_has_status, target_has_status, consecutive_hits

Example: an execute effect that only deals its bonus damage when the target is below 25% HP.

Layer 3 - Chains

Chains spawn secondary child effects. Two independent chain slots are available per effect.

onExpire fires when the effect's duration ends. Use this to detonate a DoT into a burst of damage, or have a shield turn into a heal when it fades.

onStack fires when the effect reaches a defined stack threshold. Reward players for hitting the same target repeatedly, or punish enemies for letting a debuff build up.

Child effects have their own type, target, value range, and an optional condition check, giving chains their own Layer 2 logic.

Layer 4 - Modifiers

Global flags and numeric controls that change how the effect behaves as a whole.

Proc Chance % The effect does not always fire. Set below 100 for a probabilistic effect.

Stackable Can multiple instances exist on the same target simultaneously?

Max Stacks If stackable, how many layers can build up before it caps?

Dispellable Can the effect be cleansed by abilities or provisions?

Transfer on Kill When the target dies, this effect jumps to a random surviving enemy.

TRIGGERS

The trigger determines when an effect fires. Setting a trigger to none means the effect fires immediately on use. Everything else is conditional, the effect sits dormant until its specific trigger event occurs during combat. This is what separates static abilities from reactive ones.

There are 87 distinct triggers across the following categories:

Dealing Damage: on_hit, on_crit, on_kill, on_miss, on_kill_streak

Taking Damage: on_damage_taken, on_crit_taken, on_evade, on_reflect, on_absorb

Health Events: on_hp_threshold, on_death, on_revive, on_survive_lethal, on_execute

Healing: on_heal, on_heal_cast, on_overheal

Abilities: on_ability_use, on_ability_ready, on_first_action, on_channel_start, on_channel_end

Status & Stacks: on_status_self, on_status_applied_to_target, on_dot_tick, on_hot_tick, on_stack_threshold

Energy: on_energy_threshold, on_energy_spent, on_energy_gained

Combat Flow: on_enter_combat, on_combat_win, on_turn_start, on_round, on_interval

Allies: on_ally_damage_taken, on_ally_death, on_ally_heal, on_ally_revive

Shield & Special: on_shield_gained, on_shield_broken, on_interrupt, on_interrupted, on_rage

WHAT THIS MEANS FOR YOU

As a player, you do not interact with the effects engine directly. You interact with its output. You see it in how enemies fight. You feel it in how your equipped actions change with different gear. You experience it every time a status you did not expect shows up in the combat log.

Builds matter. Your weapon type gates your action types. Your armor type gates others. All six slots on your action bar are yours to build with deliberately. Core actions can be moved, swapped, or dropped entirely to make room for something more suited to your playstyle.

Party composition matters. Area-targeting heals, on-kill transfers, ally death triggers, stacking debuffs that chain into burst damage, none of this is designed to be solved by one player alone. The engine is built for parties to create interactions that no single loadout could pull off.

Enemies are built on the same system. Every hostile and boss in the game uses the exact same effects engine for their abilities. That consistency means if you understand how effects work on your own actions, you already understand what is hitting you and you can build around it.

MORE TO COME

The combat engine is live and expanding. New zones bring new enemies built with this system. New content brings new actions into zone markets. The design space is, as the math suggests, essentially without limit.

Get into a fight. Pay attention to what fires and when. Build a loadout that makes sense. Then build one that does not and see what happens.

Project Void Dev Team

Leave a comment