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 | 0× | 1.0× | 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.)