HomeGamesUpdatesPricingMethodology
Steam News3 January 20266mo ago

Dev Diary Day 2

I woke up feeling great. feels good man dot jpeg to the max, so i dont know if its a manic upswing or what, but i'mma going to ride this feeling out and try to be as productive as i can today.

Full notes

Full Dungeon Flop update

Read the full published notes in a cleaner layout. The original post stays linked below.

What changed

1 fix3 additions13 changes2 removals
  • Gameplay
  • Balance
  • UI and audio
  • Fixes
added1. Ability execution was split into policiesYou moved away from monolithic [c]AbilityBase.Update()[/c] logic and introduced:
changed2. AbilityBase was reduced to orchestrationOwns cooldown state
removed2. AbilityBase was reduced to orchestrationIt no longer:
added3. FX and SFX were extractedYou introduced:
changed3. FX and SFX were extractedWhich now owns:
changed3. FX and SFX were extractedPFX / SFX IDs

I woke up feeling great. feels good man dot jpeg to the max, so i dont know if its a manic upswing or what, but i'mma going to ride this feeling out and try to be as productive as i can today. I'm refining the direct control features today. That means going back and re-evaluating my ability system. Which is now ability systemSSSSSSS because i hate my life so i refactored all the things. Now, instead of 1 big old honking script, i got like 7 tiny scripts. Single Responsibility Principle is a rule that gets shunted when you are developing fast and trying to get stuff done. So much work left to do.

Today is bike day, so i get to ride with the local bicycle club. No, i dont wear spandex; if you saw me on my bike you would think im homeless AF. Actually, thats a given most of the time. Got some risotto rice, couscous, chick peas and other things. It came to 40.40. Cool number, bad for my wallet. I'm hoping to release this for like, maybe 5 bucks a pop, maybe 10. Its just so expensive out there, and money is a metric for sure, but i actually want people to play my game. So i dont know, im not really good at business, never really was good at it. I think i just dont want to screw people over, and thats what it seems to be most of the time. Here, at least with this, its a thing i made with my own 2 hands and i dont feel so bad about asking for a few bucks for my hard work.

well, anyways, let me hand it over to GPT to summarize todays work. ---

High-Level Goal Clarified

You solidified the direction for Direct Control (DC) vs Tactical/Automatic ability execution:

  • Automatic mode: abilities self-fire when ready and valid

  • Direct Control mode: abilities listen for player input and resolve targets differently

  • Key insight: triggering and targeting must be decoupled from the ability itself

Major Architectural Decisions

1. Ability execution was split into policies

You moved away from monolithic [c]AbilityBase.Update()[/c] logic and introduced:

  • Trigger Policies

    • [c]IAbilityTriggerPolicy[/c]

    • [c]AutoTriggerPolicy[/c]

    • [c]ManualTriggerPolicy[/c]

  • Targeting Policies

    • [c]IAbilityTargetingPolicy[/c]

    • [c]AutoTargetingPolicy[/c]

    • [c]DirectControlTargetingPolicy[/c]

    • [c]CachedTargetingPolicy[/c] (scan + hysteresis)

This cleanly separates:

  • When an ability fires

  • How a target is chosen

  • Why an ability activates

This directly unblocks DC (Direct Control) input later without touching ability internals.

2. AbilityBase was reduced to orchestration

[c]AbilityBase[/c] now:

  • Owns cooldown state

  • Owns policies (trigger + targeting)

  • Owns lifecycle ([c]OnAdd[/c], [c]OnRemove[/c])

  • Delegates execution via [c]Fire()[/c]

It no longer:

  • Decides when to fire automatically

  • Contains targeting logic

  • Owns FX or stat mutation internals

3. FX and SFX were extracted

You introduced:

AbilityFXController

Which now owns:

  • PFX / SFX IDs

  • Attach resolution

  • Opacity control

  • Playback responsibility

[c]AbilityBase[/c] only calls:

fx.PlayActivateFX(); fx.PlayHitFX(...); fx.PlayReadyFX();

This removed a huge amount of clutter and eliminated Unity-specific FX knowledge from the core ability logic.

4. Passive stat mutation was identified as misplaced

You correctly noticed:

  • [c]ApplyPassiveBonuses()[/c] / [c]RemovePassiveBonuses()[/c] do not belong in AbilityBase

  • They caused type errors and architectural friction

Solution direction:

  • Extracted into [c] AbilityPassiveController [/c] (plain C#)

  • AbilityBase now declares bonuses but does not mutate stats directly

This aligns passives with:

  • equipment

  • auras

  • debuffs

  • future DC modifiers

5. Fire() flow was corrected

You identified and fixed that:

Fire()

must:

  • Delegate FX to [c]AbilityFXController[/c]

  • Not directly call old PFX/SFX helpers

  • Remain policy-agnostic

This finalized the separation: Trigger → Target → Activate → FX → Cooldown

Net Result

You now have:

  • A policy-driven ability system

  • DC-ready targeting hooks

  • Automatic vs manual execution without branching

  • FX, targeting, triggering, and passives cleanly separated

  • AbilityBase reduced to a coordinator instead of a god object

This is a foundational refactor, not a feature day — and it sets you up to add Direct Control input cleanly later without reopening this file again.

Source

Steam News / 3 January 2026

Open original post

Changelog.gg summarizes and formats this update. How we read updates.