RingSlinger — Game Mechanics

(Paste contents into the "Game Mechanics" tab. All numbers below are v1 targets — to be tuned in playtesting. Ring interactions live in the matrix tab, not here.)


1. Player Stats (base)

Stat Base Cap Source of growth
HP 100 999 Heartstone ring (+50 ea, stackable); Bloom blend; level-up
Mana 50 500 Ether-family rings; Mana Pool blend
Move speed 100 200 (≈2× base) Speed ring; Wind ring (+10% ea)
XP-gain rate 1.0× 3.0× Luck ring (+25% ea, mults)
Pickup radius 1 tile 6 tiles Magnet ring (+1 ea); Beacon thumb (×2)
Crit chance 5% 75% Luck ring (+5%); Lucky blends
Crit damage 150% 400% Power ring; Glass Cannon combo

2. Damage Model

final_dmg = base_dmg
          × (1 + power_mods)
          × (1 + element_resist_neg)
          × crit_multiplier
          × stance_modifier
          × dimension_affinity
  • power_mods — sum of all Power-related modifiers from rings, blends, gems.
  • element_resist_neg — many monsters resist some element by -25% to -75%.
  • crit_multiplier — 1.0 normally; rolls vs. crit_chance.
  • stance_modifier — see §6.
  • dimension_affinity — Fire rings hit harder in Lava World, weaker in Water

World (±15%).

3. Ring Trigger Cadence

Each ring fires on its own internal clock:

Ring class Base cadence (sec) Notes
Elementals 1.2s Some blends shorten this.
Esoteric 2.0s Heavier effects, longer wind-up.
Mechanical (projectile/sword) 0.9s Faster — they're the workhorse.
Mechanical (shield/reflect) passive Always-on.
Stat rings passive Buff aura, no trigger.

Cadence is multiplied by 1 / (1 + speed_mods).

4. Knuckle Layout & Fill Rules

Each hand has 14 knuckles arranged in 4 columns (fingers) with stepped row counts. Visual (palm facing player, left hand shown):

                  ╔═══╗ ╔═══╗
                  ║M-4║ ║R-4║                    ← row 4 (distal tips)
              ╔═══╣   ╠═╣   ╠═══╗
              ║I-3║   ║ ║   ║P-3║                ← row 3
   ╔═══╗  ╔═══╣   ╠═══╣ ╠═══╣   ╠═══╗
   ║T-2║  ║I-2║ M-2 ║   ║ ║   ║ R-3║ P-2║       ← row 2
   ╠═══╣  ╠═══╣     ╠═══╣ ╠═══╣     ╠═══╣
   ║T-1║  ║I-1║ M-1 ║   ║ ║   ║ R-1║ P-1║       ← row 1 (palm-most, fills first)
   ╚═══╝  ╚═══╝     ╚═══╝ ╚═══╝     ╚═══╝
   thumb  index    middle  ring     pinky

Connect-4 fill rule:

  • A ring placed on a finger fills the lowest empty knuckle of that finger.
  • Row N+1 across all 4 fingers cannot start until Row N is fully filled

(across all 4 fingers of that hand).

  • Thumbs are independent — they accept thumb-modifier rings only and have no

fill ordering with the other fingers.

Adjacency definitions (no-stance baseline):

  • Horizontal: two rings on the same row and adjacent fingers.
  • Vertical: two rings on the same finger and adjacent knuckles.
  • Diagonal: two rings on adjacent fingers and adjacent rows

(off by exactly 1 in both dimensions).

  • The thumbs share a vertical-only adjacency with each other (T1↔T2).

5. Cross-Hand Effects

Hands are independent by default — left-hand rings do not interact with right-hand rings adjacency-wise. Exceptions:

  • 🔗 Tether (thumb modifier): when worn on both thumbs, thumb modifiers

apply to both hands.

  • 🪞 Mirror (thumb modifier): duplicates the other hand's rings for 5s

every 30s.

  • 💗 Heart Hands stance: temporarily merges both hands into one 28-knuckle

grid where all original adjacencies still apply AND new cross-hand horizontal edges count.

6. Stances ("Paradigms")

Stance H mult V mult D mult Special
Splayed (default) 1.0× 1.0× 1.0×
Balled Fist 0.5× 2.0× 1.0× Knuckles touch; +25% melee dmg
Finger Guns 1.0× Only index column fires, ×3 rate
Slapping Hands 1.5× 0.5× 1.0× All rings AoE-tagged; -range
Heart Hands 1.0× 1.0× 1.5× Cross-hand adjacencies count
(more unlocked in-game) secret behaviors

The active stance is per-hand. You can wield Balled Fist + Splayed if desired (left hand vs right). Stance is cycled by tapping the hand thumbnail in the inventory screen.

7. Power Paradigm (the radar chart)

The character's overall power is summarized as a 6-axis radar chart in the inventory screen:

  • Offense (raw damage output)
  • Defense (HP, shield, DR)
  • Mobility (movement, dodge, evasion)
  • Utility (luck, magnet, time, etc.)
  • Spread (AoE / chain / explosion footprint)
  • Sustain (lifesteal, regen, rewind)

Every active ring contributes to one or more axes. The chart updates live as the user re-arranges rings, giving immediate feedback. (Inspired by Image #1 reference.)

Used for:

  • Build feedback to the player.
  • Portal requirements — dimension portals demand a minimum total power and

sometimes a min on a specific axis ("Spirit World requires ≥ 5 Utility").

8. Gems & Leveling

Gem tier Drop weight Levels granted
⚪ White 50% +1 to a Lvl-1 ring (→ Lvl 2)
🟡 Yellow 25% +1 to a Lvl-2 ring (→ Lvl 3)
🟢 Green 12% +1 to a Lvl-3 ring (→ Lvl 4)
🔵 Blue 7% +1 to a Lvl-4 ring (→ Lvl 5 max)
🟣 Purple 4% Re-roll one ring to a random new type
🔴 Red 2% Adds a gilded trait to a ring (permanent +25% all effects)

Ring level multipliers: Lvl1=1.0×, Lvl2=1.5×, Lvl3=2.0×, Lvl4=2.75×, Lvl5=4.0×.

Alternative leveling path: stacking the same ring vertically also levels it. Two Fires on one finger = Lvl 2; three = Lvl 3; etc. Stacks cap at Lvl 5 regardless of gem use (so stacking past 5 yields diminishing returns — the extra Fires only contribute to adjacency effects, not damage scaling).

9. Enemies

  • 3 size classes: Minion (1-shot kills), Brute (5–10 hits), Elite (boss-lite).
  • Affinities: Each monster has 1 primary element. Resists own element 25%,

weak to its opposite 25%.

  • Wave pacing: 1-min waves, mini-boss every 5 min, boss every dimension.
  • Drop table: Minions drop white gems; Brutes drop yellow–green; Elites

drop blue–purple; Bosses drop a guaranteed new ring + red gem chance.

10. Data Model (for Xcode port)

The matrix CSVs become the canonical interaction data. Sketch of the iOS model:

enum RingID: String, Codable, CaseIterable {
    case fire, water, earth, wind, lightning, ice, light, shadow, plant, metal
    case spirit, ether, gravity, time, sound
    case projectile, sword, shield, reflect, pierce, chain, explosion, magnet
    case speed, power, delay, rewind, luck, random, vampire
}

enum RingCategory { case elemental, esoteric, mechanical, stat }

struct Ring: Identifiable, Codable {
    let id: UUID                 // instance ID
    let type: RingID
    var level: Int               // 1...5
    var gilded: Bool             // red-gem trait
}

struct HandPosition: Hashable {  // (finger, knuckle)
    let finger: Finger           // .index/.middle/.ring/.pinky/.thumb
    let row: Int                 // 1-based
}

struct Hand {
    var stance: Stance
    var slots: [HandPosition: Ring]
}

struct InteractionEngine {
    // Loaded from the 3 CSVs at app start
    let hMatrix: [RingID: [RingID: BlendDescriptor]]
    let vMatrix: [RingID: [RingID: SequenceDescriptor]]
    let dMatrix: [RingID: [RingID: BleedDescriptor]]

    func evaluate(hand: Hand) -> [ActiveEffect] {
        // For each ring, sum: base + H neighbors + V neighbors + D neighbors,
        // apply stance multipliers, return effects to render in combat.
    }
}

11. Save & Run Structure

  • Per-run state (procedurally generated): current dimension, level seed,

enemies defeated, gems collected, run-locked rings.

  • Meta state (persistent): unlocked rings (gallery), stances learned,

quest rings collected, dimensions cleared, cosmetics owned.

  • Auto-save every minute; manual save between dimensions.

12. Controls (iOS)

  • Left thumb: virtual joystick (or tap-to-move on a setting).
  • Right thumb: stance cycle (long press) / dash (tap, with cooldown).
  • Pause: top-right button.
  • Inventory: swipe up from bottom OR pause and tap.
  • All rings auto-fire — no manual aim. (Future: manual aim mode for hardcore.)