System Overview
Trait NFT Minting
Mint trait NFTs with deterministic attributes — rarity, stats, skills, and set affiliation, all determined by a single hash. Every piece is unique.
Soulforge & Character
Eight fragments, one soul. Forge locks all eight standard parts and any included optional Bonus in the contract; the input parts are not burned or destroyed. Stats stack, set bonuses ignite, and the original inputs remain redeemable through Unforge.
Token Economy & Progression
Enhance your character with DSG tokens (+1 to +20), gaining stats at every level. Unlock awakening at +15 for the ultimate form.
Combat & Gameplay
Take your character into battle. Combat formulas, on-chain PvP contracts, role counters, turn-based PvE dungeon raids, ELO-ranked PvP arena, and large-scale guild wars — all powered by on-chain attributes.
Trait Attribute System
Traits are the building blocks of every hero in Dungeon Saga. Every attribute is deterministically derived at mint time from txidSeed = SHA-256(txid + indexHex) and traitHash = SHA-256(blockHash + txidSeed) — verifiable, fair, and tamper-proof.
Rarity Tier
Soul Dimension Stats
Resistance
Skill & Set
Affixes
Part Weight
Seed Algorithm
SHA-256(blockHash + SHA-256(txid + indexHex)). Each attribute uses a separate byte, so no two stats influence each other. Fully verifiable.On-Chain Format
Collections
How It Plays
Soul Dimension Stats
Trait Rarity Tiers
Trait Rarity determines attribute strength — how powerful a trait's stats, resistances, and affixes are. It is fixed at mint time by byte[0] of the traitHash. Higher rarity means stronger stats, more affixes, and greater value.
Note: Trait Rarity is different from Design Scarcity, which measures how scarce a particular visual variant is based on production numbers. A Common-rarity trait can have a mythic design, and vice versa.
| Rarity | Byte Range | Prob | Main Stat | Sub Stat | Affixes |
|---|---|---|---|---|---|
| Common | 0 – 101 | 39.8% | 1–8 | 1–3 | 1 |
| Uncommon | 102 – 178 | 30.1% | 5–15 | 2–8 | 1–2 |
| Rare | 179 – 224 | 18.0% | 12–25 | 6–15 | 2 |
| Epic | 225 – 247 | 9.0% | 20–35 | 12–20 | 2–3 |
| Legendary | 248 – 255 | 3.1% | 36–50 | 22–35 | 3 + special |
Affix System
Beyond primary and secondary stats, each trait carries bonus affixes — extra effects that make every piece unique. The number of affixes scales with rarity (1 for Common, up to 3 + special for Legendary). Any affix can appear on any part type.
| Affix | Range | Stat |
|---|---|---|
| OFFENSIVE — 4 types | ||
| ATK Bonus | +1% ~ +4% | STR / INT |
| Crit Rate Bonus | +0.1% ~ +0.5% | LCK |
| Crit Damage Bonus | +2% ~ +8% | LCK |
| Armor Penetration | +0.5% ~ +3% | STR |
| DEFENSIVE — 4 types | ||
| HP Bonus | +1% ~ +5% | VIT |
| DEF Bonus | +1% ~ +4% | FOR |
| Evasion Bonus | +0.5% ~ +2% | DEX |
| CC Resistance | +1% ~ +5% | FOR |
| UTILITY — 3 types | ||
| Attack Speed | +1% ~ +4% | DEX |
| Lifesteal | +0.5% ~ +3% | VIT |
| Drop Bonus | +2% ~ +8% | LCK |
| Count by rarity: Common=1 · Uncommon=1~2 · Rare=2 · Epic=2~3 · Legendary=3+special | ||
Affix calculation details & algorithm
| Term | Definition |
|---|---|
affixBase | Floor value at given rarity. E.g. ATK "+1%~+4%" base=1, range=4. |
range | max-min+1. byte%range = random offset on base. |
affixPool | 11 types (4+4+3), indexed 0-10. |
affixTable | Base count per rarity. Uncommon/Epic +0|+1 via byte[13]%2. |
affixCount = affixTable[rarity] + (byte[13] % 2)
affix1_type = affixPool[ byte[7] % 11 ] // type
affix1_value = affixBase + byte[8] % range // value
affix2_type = affixPool[ byte[9] % 11 ] // if count >= 2
affix2_value = affixBase + byte[10] % range
affix3_type = affixPool[ byte[11] % 11 ] // if count >= 3
affix3_value = affixBase + byte[12] % range
Part Stats by Faction
Each cell shows Primary/Secondary for that faction. Weight indicates how much a part amplifies its primary stat — Weapon (×1.5) is the most impactful, Background/Emblem (×0.6) the least. ✓ marks parts that carry typed resistance.
| Part | Weight | Resist? | ☀ Light | ☠ Dark | ⚖ | ||||
|---|---|---|---|---|---|---|---|---|---|
| Knight | Adv. | Wizard | Grum | Plagued | Night. | Mithia | |||
| Weapon | ×1.5 | — | STR/VIT | STR/DEX | INT/DEX | STR/VIT | STR/DEX | INT/STR | INT/VIT |
| Body | ×1.2 | ✓ | VIT/FOR | VIT/FOR | VIT/FOR | VIT/STR | VIT/FOR | VIT/FOR | VIT/FOR |
| Clothing | ×1.2 | ✓ | FOR/STR | FOR/STR | FOR/INT | FOR/STR | FOR/STR | FOR/INT | FOR/STR |
| Head Wear | ×1.0 | ✓ | FOR/VIT | FOR/VIT | FOR/VIT | FOR/VIT | FOR/VIT | FOR/VIT | FOR/VIT |
| Hand | ×1.0 | — | DEX/STR | DEX/STR | DEX/STR | DEX/STR | DEX/LCK | DEX/STR | DEX/STR |
| Face | ×0.8 | — | INT/LCK | INT/LCK | INT/LCK | INT/LCK | INT/LCK | INT/LCK | INT/VIT |
| Background | ×0.6 | — | LCK/— | LCK/— | LCK/— | LCK/— | LCK/— | LCK/— | LCK/— |
| Emblem | ×0.6 | — | LCK/— | LCK/— | LCK/— | LCK/— | LCK/— | LCK/— | LCK/— |
Bold = this faction's assignment differs from most other factions on that part. Higher weight = stronger primary stat. ✓ = carries typed resistance (Physical/Magical/Fire/Ice/Poison/Lightning).
★ Bonus Part — The Hidden Jackpot
Only the luckiest will find one. When your mint transaction produces a special TXID pattern, the Soulforge grants you a Bonus part — a rare 9th piece beyond the 8 regular parts. Include it alongside your 8 regular pieces during fusion, and your character gains a unique passive power that nobody else's build can replicate. One Bonus per character. Every mint is a chance.
Universal patterns (trigger bonus for ANY faction):
666 Mark of the Beast •
777 Lucky Seven •
000 Void Echo •
d1ce Dice Roll •
cafe Dungeon Café
Under the Hood
Hex & Bytes Primer
Computers store data in bytes. One byte = 8 bits = a number from 0 to 255.
Bytes are often written in hexadecimal (base-16) using digits 0–9 and letters a–f.
Each hex digit represents 4 bits, so one byte = two hex digits.
Example:
f2 in hex = 15×16 + 2 = 242 in decimal.SHA-256 produces a 256-bit hash = 32 bytes = 64 hex characters.
We use different bytes from this hash to determine different attributes — each byte is independent, ensuring no attribute can influence another.
Attribute Seed Algorithm
Worked Example
A mint transaction produces the following traitHash:
txidSeed = SHA-256(txid + indexHex)
traitHash = SHA-256(blockHash + txidSeed)
= f2 a7 1b 03 8e 5c d1 44 b9 77 02 e6 3f 8a c5 91 d0 4e 72 b8 1f a3 56 e9 0d cb 64 f7 28 9e b5 13
| Rarity | Main | Sub | Resist Type | Resist Val | Skill | Set | Affix 1 | Affix 2 | Affix 3 | Count | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Byte | [0] | [1] | [2] | [3] | [4] | [5] | [6] | [7] | [8] | [9] | [10] | [11] | [12] | [13] |
| Hex | f2 | a7 | 1b | 03 | 8e | 5c | d1 | 44 | b9 | 77 | 02 | e6 | 3f | 8a |
| Dec | =242 | =167 | =27 | =3 | =142 | =92 | =209 | =68 | =185 | =119 | =2 | =230 | =63 | =138 |
⚙ Worked Example: How a Trait's Attributes Are Born
Step 1 — Rarity: byte[0] = 0xf2 = 242. Which tier does it fall into?
| Rarity | Byte Range | 242 in range? |
|---|---|---|
| Common | 0 – 101 | 242 > 101 → No |
| Uncommon | 102 – 178 | 242 > 178 → No |
| Rare | 179 – 224 | 242 > 224 → No |
| Epic | 225 – 247 | 225 ≤ 242 ≤ 247 → MATCH! |
| Legendary | 248 – 255 | — |
Result: Epic rarity (9.0% chance)
Step 2 — Core Attributes: Assume this is a Knight Head Wear (Primary=FOR, Secondary=VIT). The base and range come from the Rarity table (Epic row).
| Byte | Raw | Attribute | Source (from Rarity table) | Calculation | Result |
|---|---|---|---|---|---|
| byte[1] | 167 | Main Stat (FOR) | Epic main: 20~35, base=20, range=16 | 20 + 167%16 = 20+7 | FOR 27 |
| byte[2] | 27 | Sub Stat (VIT) | Epic sub: 12~20, base=12, range=9 | 12 + 27%9 = 12+0 | VIT 12 |
| byte[3] | 3 | Resist Type | 6 types (Phys/Magic/Fire/Ice/Poison/Lightning) | 3 % 6 = 3 | Ice |
| byte[5] | 92 | Skill | Knight Head Wear: Helm Guard / Skull Fortress / Deflection / Ward of Steel | 92 % 4 = 0 | Helm Guard |
| byte[6] | 209 | Set | Knight: Iron Vanguard / Knight Commander / Shadow Scout / Holy Guardian | 209 % 4 = 1 | Knight Commander |
Step 3 — Affix Count: Epic base = 2, byte[13] decides +0 or +1.
| Byte | Raw Value | Calculation | Affix Count |
|---|---|---|---|
| byte[13] | 0x3f = 63 | 63 % 2 = 1 → 2 + 1 | 3 affixes |
If byte[13] were even (e.g. 62): 62%2=0 → 2+0 = 2 affixes
Step 4 — Generate 3 Affixes: each affix uses 2 bytes (type + value).
| Affix | Type Byte | Type Result | Value Byte | Value Result |
|---|---|---|---|---|
| #1 | byte[7] = 68 | 68%11=2 → Crit DMG | byte[8] = 185 | 2+185%7=2+3 → +5% |
| #2 | byte[9] = 119 | 119%11=9 → Lifesteal | byte[10] = 2 | 0.5+2%6=0.5+2 → +2.5% |
| #3 | byte[11] = 230 | 230%11=10 → Drop Bonus | byte[12] = 63 | 2+63%7=2+0 → +2% |
Every value above is derived from a single SHA-256 hash. Different bytes, zero correlation, fully on-chain verifiable.
On-Chain Deployment
On-Chain Data Format
The attributes array in the NFT CBOR metadata includes rarity, stats, resistance, skill, set, and up to 3 affix slots.
Example: Knight Head Wear (Rare, 2 affixes)
View JSON: Knight Head Wear #12 (Rare)
{
"name": "Knight Head Wear #12",
"attributes": [
// Identity
{"trait_type": "Faction", "value": "Knight"}, //
{"trait_type": "Part Type", "value": "Head Wear"}, //
{"trait_type": "Design Variant", "value": 12}, //
{"trait_type": "Trait Hash", "value": "b0ad76db..."}, //
// Rarity & Stats
{"trait_type": "Rarity", "value": "Rare"}, //
{"trait_type": "FOR", "value": 18}, //
{"trait_type": "VIT", "value": 9}, //
// Resistance
{"trait_type": "Resistance", "value": "Physical"}, //
{"trait_type": "Resistance Value", "value": 12}, //
// Skill & Set
{"trait_type": "Skill", "value": "Deflection"}, //
{"trait_type": "Set", "value": "Iron Vanguard"}, //
// Affixes
{"trait_type": "Affix 1", "value": "DEF Bonus +3%"}, //
{"trait_type": "Affix 2", "value": "HP Bonus +2%"}, //
{"trait_type": "Affix 3", "value": ""} //
]
}
Example: Wizard Weapon (Legendary, no resistance)
View JSON: Wizard Weapon #7 (Legendary)
{
"name": "Wizard Weapon #7",
"attributes": [
// Identity
{"trait_type": "Faction", "value": "Wizard"},
{"trait_type": "Part Type", "value": "Weapon"},
{"trait_type": "Design Variant", "value": 7},
{"trait_type": "Trait Hash", "value": "ff001122..."},
// Rarity & Stats
{"trait_type": "Rarity", "value": "Legendary"},
{"trait_type": "INT", "value": 67},
{"trait_type": "DEX", "value": 28},
// Skill & Set
{"trait_type": "Skill", "value": "Chain Lightning"},
{"trait_type": "Set", "value": "Elemental Lord"},
// Affixes
{"trait_type": "Affix 1", "value": "ATK Bonus +4%"},
{"trait_type": "Affix 2", "value": "Crit Damage Bonus +7%"},
{"trait_type": "Affix 3", "value": "Armor Penetration +2%"}
]
}
Collection Lifecycle Context
| Asset Role | Forge State | Unforge State |
|---|---|---|
| Existing original-part collections | Eight standard parts and any included optional Bonus are locked without changing their collection assignments. | The exact original locked inputs return to the current Hero holder. |
| Existing Hero collection deployment | The forged PFP Hero represents the right to redeem its locked inputs. | The Hero is destroyed when Unforge returns those exact inputs. |
Original assets stay original. Forge and Unforge use the existing original-part and Hero collection deployments. Unforge returns the exact original inputs; it does not mint replacement, Salvaged, or Reforged parts, so no separate disassembly-output collection branch is required.
Soulforge & Character
From scattered fragments to a living legend. Forge locks all eight standard parts and any included optional Bonus in the contract; the input parts are not burned or destroyed. One Hero is created with every stat sealed on-chain.
Forge
4-Layer Stats
7 Factions
28 Sets
Resonance
Unforge
Fusion Rule
Same faction, one address, all 8 part types — invoke the Soulforge. Forge locks all eight standard parts and any included optional Bonus in the contract; the input parts are not burned or destroyed. The optional Bonus grants its unique passive and remains part of the same locked input set.
8 different part types
+ optional Bonus
Stats stacked & weighted
Set & resonance calculated
Skills & set bonuses active
+ Optional Bonus passive
Attribute Formula
Final stats = deterministic sum of four player-driven layers:
1. Faction Base
Innate stats by faction. e.g. Knight = STR 20, INT 5, VIT 22, FOR 18, DEX 8, LCK 7 (80 pts). The foundation before any parts.
2. Σ(8 Trait Stats)
Sum of all 8 parts’ primary (weighted) + secondary stats. Stack directly onto faction base.
3. Set Bonus
3/5/8 matching set pieces activate escalating bonuses. Multiple sets can be active (e.g. 5 pcs A + 3 pcs B).
4. Rarity Resonance
Same-rarity parts amplify all stats. 5 Rare = +14%. 8 Legendary = +40% + “Ancient” title + legendary glow.
Worked Example — Knight with mixed Rare parts
| Part | Primary | Secondary |
|---|---|---|
| Weapon | STR 27 | VIT 12 |
| Body | VIT 18 | FOR 15 |
| Clothing | FOR 20 | STR 10 |
| Head Wear | FOR 14 | VIT 9 |
| Hand | DEX 18 | STR 8 |
| Face | INT 12 | LCK 7 |
| Background | LCK 10 | — |
| Emblem | LCK 9 | — |
| Σ | STR 45 INT 12 VIT 39 FOR 49 DEX 18 LCK 26 | |
STR = (20+45+0) × 1.14 = 74 INT = (5+12+0) × 1.14 = 19 VIT = (22+39+0) × 1.14 = 69
FOR = (18+49+10) × 1.14 = 87 DEX = (8+18+0) × 1.14 = 29 LCK = (7+26+0) × 1.14 = 37
Final Character NFT Stats:
These 6 values are permanently sealed on-chain. They become the foundation for all combat calculations in Phase 4.
Faction Base Stats
Each faction starts with an innate stat baseline (65–80 points) before any parts are fused. Bold values = faction specialty.
| ☀ Light | ☠ Dark | ⚖ Neutral | |||||
|---|---|---|---|---|---|---|---|
| Stat | Knight | Adventurer | Wizard | Grum | The Plagued | Nightspawn | Mithia |
| Warrior | Swordsman | Warlock | Champion | Assassin | Dark Mage | Healer | |
| STR | 20 | 15 | 5 | 26 | 15 | 15 | 5 |
| INT | 5 | 5 | 30 | 3 | 5 | 30 | 15 |
| VIT | 22 | 10 | 10 | 20 | 10 | 11 | 15 |
| FOR | 18 | 7 | 5 | 15 | 7 | 5 | 10 |
| DEX | 8 | 25 | 15 | 5 | 25 | 5 | 10 |
| LCK | 7 | 12 | 5 | 11 | 12 | 4 | 10 |
| Total | 80 | 74 | 70 | 80 | 74 | 70 | 65 |
Set System
4 sets per faction, 28 total. Collect matching pieces to unlock escalating power — a full 8-piece set grants a unique ability that defines your playstyle.
to 1 of 4 faction sets
traitHash[6] % 4same-set trait pieces
25% chance per set
Multiple sets stackable
8 pcs = unique ability
Mix & match: 5 pcs Set A + 3 pcs Set B = both bonuses active. Full 8-piece requires all traits from one set.
☀ LIGHT FACTION SETS
Knight — Warrior
| Set Name | 3 Pcs | 5 Pcs | Full Set (8) |
|---|---|---|---|
| Iron Vanguard | FOR +15% | Heal 2% HP on hit taken | Taunt Aura: enemy ATK −20% |
| Knight Commander | STR +15% | Block rate +25% | Counter-attack after block |
| Vanguard Scout | DEX +15% | Move speed +20% | Always act first |
| Holy Guardian | VIT +20% | Absorb 15% ally damage | Survive lethal hit once |
Adventurer — Swordsman
| Set Name | 3 Pcs | 5 Pcs | Full Set (8) |
|---|---|---|---|
| Wind Walker | DEX +15% | Evasion +20% | Double strike: 50% chance to attack twice |
| Crimson Blade | STR +15% | Armor penetration +30% | Execute: instant kill target below 15% HP |
| Lucky Star | LCK +20% | Crit damage +40% | Lucky Dodge: 25% evade lethal hit + counter |
| Survivor's Will | VIT +15% | HP regen 3%/turn | Second Wind: revive once at 30% HP |
Wizard — Warlock · Leader
| Set Name | 3 Pcs | 5 Pcs | Full Set (8) |
|---|---|---|---|
| Arcane Scholar | INT +15% | Spell AOE radius +50% | Chain Lightning: hit jumps to 3 nearby enemies |
| Elemental Lord | DEX +15% | Cooldown −25% | Time Warp: extra turn every 3 rounds |
| Astral Walker | VIT +15% | Magic shield: absorb 20% damage | Arcane Barrier: team magic resist +30% |
| Chrono Mage | LCK +20% | Spell crit rate +15% | Wild Magic: random 200%~400% damage on crit |
☠ DARK FACTION SETS
Grum — Champion
| Set Name | 3 Pcs | 5 Pcs | Full Set (8) |
|---|---|---|---|
| Blood Berserker | STR +20% | ATK +5% per 10% HP lost | Bloodlust: lifesteal 25% of damage dealt |
| Iron Crusher | FOR +15% | Reflect 15% melee damage | Unstoppable: immune to CC for 3s after taking hit |
| War Chief | LCK +20% | Crit rate +10%, crit damage +25% | Predator: crit ignores 50% DEF |
| Primal Beast | VIT +20% | Regen 5% HP when below 30% | Last Stand: unkillable for 2 turns at 1 HP |
The Plagued — Assassin
| Set Name | 3 Pcs | 5 Pcs | Full Set (8) |
|---|---|---|---|
| Plague Lord | DEX +15% | Poison on hit: 3% HP/turn for 3 turns | Pandemic: poison spreads to adjacent enemies |
| Blight Reaper | STR +15% | Backstab: +50% damage to CC’d targets | Assassinate: 100% crit on first hit each fight |
| Blight King | LCK +20% | Evasion +15%, counter on dodge | Dance of Death: 3-hit combo on evade (60% ATK each) |
| Plague Priest | FOR +15% | Lifesteal +15% | Soul Harvest: killing blow heals 50% max HP |
Nightspawn — Dark Mage · Leader
| Set Name | 3 Pcs | 5 Pcs | Full Set (8) |
|---|---|---|---|
| Shadow Weaver | INT +15% | Dark spells ignore 20% magic resist | Void Eruption: AOE 250% INT + 3s silence |
| Phantom Invoker | STR +15% | Melee spells: spell damage + 50% STR bonus | Dark Harvest: each kill grants +10% ATK (stacks) |
| Night Harbinger | VIT +15% | Drain: heal 20% of spell damage dealt | Soul Link: share HP pool with 1 ally |
| Void Sovereign | FOR +15% | Dark Shield: reduce next hit by 40% | Doomsday: after death, AOE 200% INT to all enemies |
⚖ NEUTRAL SETS
Mithia — Healer
| Set Name | 3 Pcs | 5 Pcs | Full Set (8) |
|---|---|---|---|
| Light Weaver | INT +15% | Heal power +25% | Miracle: full heal all allies (once per battle) |
| Spirit Healer | VIT +20% | Ally damage taken −10% | Sanctuary: team immune to damage for 1 turn |
| Moon Guardian | FOR +15% | Purify: remove 1 debuff/turn | Mass Purge: cleanse all debuffs from team |
| Nature's Grace | LCK +20% | Team crit rate +5% | Fortune’s Favor: team LCK +30% + bonus loot |
Rarity Resonance
Same-rarity parts resonate, amplifying all stats. Common does not resonate. Only the highest qualifying tier applies.
| Same-Rarity Count | Uncommon | Rare | Epic | Legendary |
|---|---|---|---|---|
| 3 | +3% | +6% | +10% | +15% |
| 5 | +7% | +14% | +20% | +28% |
| 8 | +12% shimmer |
+20% rarity aura |
+30% epic aura |
+40% "Ancient" title + legendary glow |
Unforge & Original-Part Return
Unforge destroys the Hero and returns the exact original locked eight standard parts, plus the same Bonus if one was included at Forge, to the current Hero holder. No attributes are rerolled and no replacement parts are minted.
The right to Unforge and redeem those locked parts transfers with Hero ownership. Whoever currently holds the Hero receives the original inputs when Unforge completes.
No incomplete Hero remains.
No attributes are rerolled.
If a Bonus was locked, that same Bonus returns.
No replacement parts are minted.
Transferring the Hero transfers the right.
The original forger keeps no separate claim.
Token Economy & Progression
Two on-chain tokens — DSG and HP — drive all character growth and combat. Spend DSG to enhance your character from +1 to +20, gaining power at every level; push past +15 to unlock an awakened ultimate form. Stake HP to enter battle, and winners earn generous rewards. All DSG spent is permanently burned, ensuring total supply only ever decreases.
Dual-Token System
How HP Token Works
HP = VIT × staked + FOR × 5 + 100Grum stakes10 HP → Battle HP= 20×10 + 15×5 + 100 = 375
Grum loses: 10 HP
Burned: 10 - 9 = 1 HP
Knight net: +9 HP (safe bet)
Knight loses: 20 HP
Burned: 20 - 18 = 2 HP
Grum net: +18 HP (huge upset!)
The staking mechanic adds a strategic layer to every match: stake more for higher health and greater victory rewards; stake less for controlled risk and outsized returns when you pull off an upset. The optimal play depends on your character build and opponent analysis — giving every battle a distinct strategic dimension.
Enhancement Levels
Enhance your character from +1 all the way to +20, gaining power at every level. The first five levels succeed at 100% — an easy on-ramp for every player. From +6 onward, a success-rate mechanic is introduced; higher levels bring greater stat leaps but require more DSG investment. +16 and above is the arena for top-tier players — significant rewards matched by significant challenge. +20 is the true pinnacle of glory.
Awakening (Requires +15)
At +15, your character can pay a one-time DSG fee to unlock awakening — a new form name, a new visual, and an exclusive ultimate skill. Each of the 7 factions has its own awakening path, reinforcing that faction's core role.
Token Circulation
A healthy economy breathes: DSG flows in from gameplay, and flows out through permanent burns. Three earning channels ensure active players are always rewarded; three burn sinks ensure supply shrinks relentlessly. The result is a self-balancing loop where playing the game is the only way to mint value, and spending that value is the only way to grow.
▲ Sources (Earn)
▼ Sinks (Burn)
Combat & Gameplay
Take your character into battle. This section defines the complete combat system — formulas that turn stats into damage, the on-chain PvP contract protocol, role counters, balance proof, plus three gameplay modes: turn-based PvE dungeon raids, ELO-ranked PvP arena (1v1 & 3v3), and guild-scale warfare.
Combat Formulas
ATK = STR × 2 + WeaponBase // phys
= INT × 2.5 + WeaponBase // mag
DEF = FOR × 2 + ArmorSum
DMG = ATK × 100 / (100 + DEF)
SPD = 100 + DEX × 2
EXTRA = 20% // SPD gap ≥ 50
CRIT = LCK × 0.2%
CRIT_DMG = 150% + LCK × 2%
PEN = STR × 0.3% //
MRES = INT × 0.1% //
CC_RES = FOR × 1% //
REGEN = VIT × 0.5 // PvE regen
DROP = LCK × 1% // PvE loot bonus
On-Chain PvP Contract System
Dungeon Saga publishes an official PvP Contract Template (sCrypt). Each player deploys their own instance — a personal battle arena that doubles as a permanent combat record. Challenges are issued by staking HP tokens; before accepting, the opponent can verify the challenger's contract bytecode against the official template to ensure it is not a malicious contract. Once both sides commit, the contract deterministically executes all combat logic and distributes rewards. No server, no trust, fully on-chain.
opponent: playerB.address,
stakedHP: 20,
timeout: 144 blocks
})
playerA.pvpContract.accept({
stakedHP: 10
})
// A reclaims staked HP
masterSeed = sha256(
TX2.hashPrevouts + TX1.txid
)
// Per-round
roundSeed[n] = sha256(
masterSeed + n
)
evaCheck = seed[1] // EVA
dmgVariance = seed[2] // ±10%
extraCheck = seed[3] // EXTRA
// Result
contractState = {
winner, rounds,
hpLeft, combatLog,
rewardTx
}
Why is this fair?
masterSeed = sha256(TX2.hashPrevouts + TX1.txid). TX2’s hashPrevouts is only finalized when Player B submits. Neither side can predict the combat outcome before both commit.FOR=18 DEX=8 LCK=7
HP=630 ATK=60 DEF=36
SPD=116 CRIT=1.4%
FOR=15 DEX=5 LCK=11
HP=575 ATK=72 DEF=30
SPD=110 CRIT=2.2%
opponent: Grum, stakedHP: 20
})
TX2: Knight.pvpContract.accept({
characterB: Grum, stakedHP: 10
})
// TX2 triggers combat
TX2.hashPrevouts +
TX1.txid
) = 3f7ac891...
roundSeed[n] = sha256(
masterSeed + n
)
roundSeed[0] = sha256(masterSeed + 0) = 7af1c82ba355...
Knight attacks Grum:
EVA: byte[1]=0xf1=241, threshold=3.8 → 241>3.8 → hit
CRIT: byte[0]=0x7a=122, threshold=3.6 → 122>3.6 → no crit
DMG = 60 × 76.9% × 1.057 = 49
Grum HP: 575 → 526
Grum attacks Knight:
EVA: byte[4]=0xa3=163, threshold=6.1 → 163>6.1 → hit
CRIT: byte[3]=0x2b=43, threshold=5.6 → 43>5.6 → no crit
DMG = 72 × 73.5% × 0.967 = 51
Knight HP: 630 → 579
Rounds 2 – 12: Full Combat Log (click to expand)
roundSeed[1] = sha256(masterSeed + 1) = b20e55d911c4...
Knight attacks Grum:
EVA: byte[1]=0x0e=14 → 14>3.8 → hit
CRIT: byte[0]=0xb2=178 → 178>3.6 → no crit
DMG = 60 × 76.9% × 1.012 = 47
Grum HP: 526 → 479
Grum attacks Knight:
EVA: byte[4]=0x11=17, threshold=6.1 → 17>6.1 → hit
CRIT: byte[3]=0xd9=217 → 217>5.6 → no crit
DMG = 72 × 73.5% × 0.943 = 50
Knight HP: 579 → 529
// ══ Round 3
roundSeed[2] = sha256(masterSeed + 2) = 058ca173e2bb...
Knight attacks Grum:
EVA: byte[1]=0x8c=140 → 140>3.8 → hit
CRIT: byte[0]=0x05=5, threshold=3.6 → 5>3.6 → no crit
DMG = 60 × 76.9% × 0.969 = 45
Grum HP: 479 → 434
Grum attacks Knight:
EVA: byte[4]=0xe2=226 → 226>6.1 → hit
CRIT: byte[3]=0x73=115 → 115>5.6 → no crit
DMG = 72 × 73.5% × 1.031 = 55
Knight HP: 529 → 474
// ══ ... Rounds 4~11
// Each round: ~47 DMG to Grum, ~52 DMG to Knight on average
//
// ══ Round 12 (final)
roundSeed[11] = sha256(masterSeed + 11) = d103f78a...
Knight attacks Grum:
CRIT: byte[0]=0xd1=209 → 209>3.6 → no crit
DMG = 48
Grum HP: 5 → 0 — DEFEATED!
// ── Result (written to contract state)
contractState = {
winner: "Knight",
rounds: 12,
knightHpLeft: 31,
grumHpLeft: 0,
rewardTx: "auto-transfer 9 HP to Knight"
}
// Knight wins: receives floor(10 × 90%) = 9 HP, 1 HP burned
// Knight wins: receives floor(10 × 90%) = 9 HP, 1 HP burned
Stats used directly from the Faction Base Stats table (no fusion bonuses). Every formula step is traceable: STR=20 → ATK=60 → DMG=49. Anyone can replay from the contract state and verify.
stakedHP = 1~20 HP tokens staked. VIT amplifies each token’s worth. FOR × 5 + 100 is the guaranteed floor. HP = 0 means defeat — all staked HP lost.INT × 2.5 + WeaponBase // magical
CRIT_DMG = 150% + LCK × 2%
Secondary Effects (conditional)
Role Counter System
Cross-role matchups follow a Rock-Paper-Scissors triangle. Same-role mirrors remain 50/50, decided by gear and skill. The counter multiplier is set at 10% — meaningful enough to reward smart team composition, yet surmountable through character growth ensuring every matchup remains winnable.
The 10% counter gap is a nudge, not a wall. It encourages players to think about team composition and role synergy, while preserving individual agency — a well-built character can still triumph against a counter through superior enhancement, set bonuses, and awakening. Every character remains viable; none is ever a dead end.
Balance Simulation (10,000 runs)
We don't just claim balance — we prove it. 10,000 simulated battles using all 12 Soul Dimension effects, without counter multipliers, confirm that no faction has a built-in advantage. The playing field is level; victory comes from your choices.
| Test | Light Win Rate | Dark Win Rate | Assessment |
|---|---|---|---|
| 1v1 Knight vs Grum | 48.6% |
51.4% |
Excellent balance |
| 1v1 Wizard vs Nightspawn | 49.5% |
50.5% |
Excellent balance |
| 1v1 Adventurer vs The Plagued | 50.6% |
49.4% |
Excellent balance |
| 3v3 Team Battle | 48.5% |
51.5% |
Excellent balance |
| PVE Dungeon Clear Rate | 99.8% |
100% |
Balanced |
Simulation uses random targeting. In real gameplay with taunt, AoE, and focus-fire mechanics, the 3v3 gap would narrow. Mithia (Neutral Healer) joining Light makes it 4v3 with 100% Light win rate — Dark faction needs a healer counterpart for symmetric team design.
Dungeon Raids
- Turn-based dungeon exploration with on-chain combat resolution — all character stats read directly from NFT attributes
- Three dungeon tiers: Normal → Elite → Boss, each with escalating difficulty and exclusive loot tables
- DSG token + rare crafting material drops, scaled by dungeon tier and party performance
- Background trait grants environment-specific buffs (e.g., cave backgrounds boost DEF in underground dungeons)
- Higher tiers require strategic party composition: Tank + Healer + DPS synergies
Arena
- Deploy your personal on-chain PvP contract — simultaneously your battle arena and permanent combat chronicle
- 3-step protocol: Challenge (stake HP) → Verify & Accept (counter-stake) → Auto-resolve (deterministic combat)
- 1v1 duels and 3v3 team battles with ELO-based matchmaking and seasonal rankings
- DSG token rewards for seasonal rank milestones and arena achievements
- Zero trust required: all combat logic in sCrypt contracts, every result independently verifiable
Guild Wars
- Large-scale guild vs guild warfare: 5v5 structured battles with potential for larger campaigns
- Same-faction synergy bonuses: field a full faction lineup for enhanced team coordination
- Strategic depth: Tank / Healer / DPS composition, focus-fire targeting, and ability timing
- Seasonal guild rankings with exclusive rewards + permanent leaderboard recognition
Roadmap
Trait Attribute System
Before mainnet — Attribute mapping + mint logic + nft-info API + frontend trait cards
Character & Combat Design
After minting — Forge existing original-part inputs into PFP Heroes + attribute engine + set matching + Forge/Unforge UI
Token Economy & Progression
After Forge — CAT20 DSG token + enhancement + awakening while Unforge preserves exact-input return without adding replacement-part or Salvaged/Reforged collection branches
PvE Dungeon Raids
Combat engine + dungeon generation + loot system + party mechanics
PvP Arena
PvP contract template + matchmaking + seasonal rankings + leaderboard + spectator mode
Guild Wars
Large-scale battles + guild progression + territory control
Soulforge Blueprint v1.0 — Dungeon Saga © 2026
All NFT attributes are on-chain, verifiable, and immutable.

