mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-15 08:32:41 +00:00
Adv 2.0 D&D layer: Phases 1-8 + Phase 9 SP1+SP2
Combines all uncommitted D&D work into one checkpoint: Phases 1-8 (per gogobee_dnd_session_summary.md): - Race/class/stats system, !setup flow, !sheet, !respec - d20-vs-AC combat with race/class passives, auto-migration - XP/level-up, skill checks, NPC refund hooks - Equipment slot mapping, rarity, !rest short/long - Pre-arm active abilities, resource pools - Bestiary, !roll/!stats/!level, onboarding DM - Audit fixes A-I, flavor wiring under internal/flavor/ - Phase 8 weapon dice + armor AC tables (gogobee_equipment_appendix) Phase 9 SP1 — spell system foundations: - 79 SpellDefinitions (76 in-scope + 3 reaction-deferred) - dnd_known_spells, dnd_spell_slots tables - pending_cast / concentration_* columns on dnd_character - Slot tables for Mage/Cleric/Ranger, DC + attack-bonus math - Long-rest refreshes slots; respec wipes spell state - Auto-grant default known list on !setup confirm and auto-migration Phase 9 SP2 — !cast / !spells / !prepare commands: - Out-of-combat HEAL and UTILITY resolve immediately - Damage/control/buff queue as pending_cast for next combat - Audit-style save-then-debit, slot refund on save failure - !cast --drop, concentration supersession, prep-cap enforcement - Reaction spells refused with Phase 11 note SP3 (combat-time resolution of pending_cast) and SP4 (full prep/learn tests) are next. Build clean, full test suite green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
354
gogobee_equipment_appendix.md
Normal file
354
gogobee_equipment_appendix.md
Normal file
@@ -0,0 +1,354 @@
|
||||
# GogoBee — Equipment Appendix
|
||||
> **Companion to:** `gogobee_dnd_design_doc.md`
|
||||
> **Version:** 1.0
|
||||
> **Source:** D&D 5e SRD, adapted for GogoBee bot mechanics
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Implementation Notes
|
||||
|
||||
- All damage dice and stat values are **starting baselines**. Balance tuning is a human responsibility.
|
||||
- Weapon/armor names may be reskinned for flavor (e.g., "TwinBee Aegis" instead of "Shield") but base mechanics must match this spec.
|
||||
- Class proficiency restrictions from the main design doc apply here. An unproficient player may equip an item but incurs **-4 to attack rolls** and cannot add stat modifiers to damage.
|
||||
- All gold (gp) costs map 1:1 to GogoBee **coins** unless the economy team decides otherwise.
|
||||
- Item IDs follow the format: `wpn_<name>` for weapons, `arm_<name>` for armor.
|
||||
|
||||
---
|
||||
|
||||
## 1. Weapon Properties Glossary
|
||||
|
||||
| Property | Effect |
|
||||
|---|---|
|
||||
| **Ammunition** | Requires ammo (arrows, bolts, etc.) to fire. Recover half after combat. |
|
||||
| **Finesse** | Player may use STR or DEX modifier for attack and damage (choose one, apply consistently). |
|
||||
| **Heavy** | Small creatures (Halfling) have disadvantage on attack rolls with this weapon. |
|
||||
| **Light** | Can be dual-wielded. Bonus action attack with off-hand (no stat modifier to damage). |
|
||||
| **Loading** | Can only fire once per turn regardless of extra attacks. |
|
||||
| **Range** | Listed as normal/long range. Attacks beyond normal range have disadvantage. |
|
||||
| **Reach** | +5 ft attack range. Relevant if zone/range mechanics are ever added. |
|
||||
| **Thrown** | Can be thrown as a ranged attack using STR modifier. |
|
||||
| **Two-Handed** | Requires both hands. Cannot use a shield simultaneously. |
|
||||
| **Versatile** | Can be wielded one-handed (lower damage) or two-handed (higher damage). |
|
||||
| **Special** | See individual entry for unique rules. |
|
||||
|
||||
---
|
||||
|
||||
## 2. Simple Weapons
|
||||
|
||||
Simple weapons are proficient for **all classes**.
|
||||
|
||||
### 2.1 Simple Melee Weapons
|
||||
|
||||
| Weapon | Cost | Damage | Damage Type | Weight | Properties |
|
||||
|---|---|---|---|---|---|
|
||||
| Club | 1 gp | 1d4 | Bludgeoning | 2 lb | Light |
|
||||
| Dagger | 2 gp | 1d4 | Piercing | 1 lb | Finesse, Light, Thrown (20/60) |
|
||||
| Greatclub | 2 gp | 1d8 | Bludgeoning | 10 lb | Two-Handed |
|
||||
| Handaxe | 5 gp | 1d6 | Slashing | 2 lb | Light, Thrown (20/60) |
|
||||
| Javelin | 5 gp | 1d6 | Piercing | 2 lb | Thrown (30/120) |
|
||||
| Light Hammer | 2 gp | 1d4 | Bludgeoning | 2 lb | Light, Thrown (20/60) |
|
||||
| Mace | 5 gp | 1d6 | Bludgeoning | 4 lb | — |
|
||||
| Quarterstaff | 2 gp | 1d6 / 1d8 | Bludgeoning | 4 lb | Versatile |
|
||||
| Sickle | 1 gp | 1d4 | Slashing | 2 lb | Light |
|
||||
| Spear | 1 gp | 1d6 / 1d8 | Piercing | 3 lb | Thrown (20/60), Versatile |
|
||||
|
||||
### 2.2 Simple Ranged Weapons
|
||||
|
||||
| Weapon | Cost | Damage | Damage Type | Weight | Properties |
|
||||
|---|---|---|---|---|---|
|
||||
| Crossbow, Light | 25 gp | 1d8 | Piercing | 5 lb | Ammunition (80/320), Loading, Two-Handed |
|
||||
| Dart | 5 cp | 1d4 | Piercing | 0.25 lb | Finesse, Thrown (20/60) |
|
||||
| Shortbow | 25 gp | 1d6 | Piercing | 2 lb | Ammunition (80/320), Two-Handed |
|
||||
| Sling | 1 sp | 1d4 | Bludgeoning | — | Ammunition (30/120) |
|
||||
|
||||
---
|
||||
|
||||
## 3. Martial Weapons
|
||||
|
||||
Martial weapons require class proficiency. See main design doc Section 3.2 for class proficiency tables.
|
||||
|
||||
### 3.1 Martial Melee Weapons
|
||||
|
||||
| Weapon | Cost | Damage | Damage Type | Weight | Properties |
|
||||
|---|---|---|---|---|---|
|
||||
| Battleaxe | 10 gp | 1d8 / 1d10 | Slashing | 4 lb | Versatile |
|
||||
| Flail | 10 gp | 1d8 | Bludgeoning | 2 lb | — |
|
||||
| Glaive | 20 gp | 1d10 | Slashing | 6 lb | Heavy, Reach, Two-Handed |
|
||||
| Greataxe | 30 gp | 1d12 | Slashing | 7 lb | Heavy, Two-Handed |
|
||||
| Greatsword | 50 gp | 2d6 | Slashing | 6 lb | Heavy, Two-Handed |
|
||||
| Halberd | 20 gp | 1d10 | Slashing | 6 lb | Heavy, Reach, Two-Handed |
|
||||
| Lance | 10 gp | 1d12 | Piercing | 6 lb | Reach, Special (disadvantage vs. adjacent) |
|
||||
| Longsword | 15 gp | 1d8 / 1d10 | Slashing | 3 lb | Versatile |
|
||||
| Maul | 10 gp | 2d6 | Bludgeoning | 10 lb | Heavy, Two-Handed |
|
||||
| Morningstar | 15 gp | 1d8 | Piercing | 4 lb | — |
|
||||
| Pike | 5 gp | 1d10 | Piercing | 18 lb | Heavy, Reach, Two-Handed |
|
||||
| Rapier | 25 gp | 1d8 | Piercing | 2 lb | Finesse |
|
||||
| Scimitar | 25 gp | 1d6 | Slashing | 3 lb | Finesse, Light |
|
||||
| Shortsword | 10 gp | 1d6 | Piercing | 2 lb | Finesse, Light |
|
||||
| Trident | 5 gp | 1d6 / 1d8 | Piercing | 4 lb | Thrown (20/60), Versatile |
|
||||
| War Pick | 5 gp | 1d8 | Piercing | 2 lb | — |
|
||||
| Warhammer | 15 gp | 1d8 / 1d10 | Bludgeoning | 2 lb | Versatile |
|
||||
| Whip | 2 gp | 1d4 | Slashing | 3 lb | Finesse, Reach |
|
||||
|
||||
### 3.2 Martial Ranged Weapons
|
||||
|
||||
| Weapon | Cost | Damage | Damage Type | Weight | Properties |
|
||||
|---|---|---|---|---|---|
|
||||
| Crossbow, Hand | 75 gp | 1d6 | Piercing | 3 lb | Ammunition (30/120), Light, Loading |
|
||||
| Crossbow, Heavy | 50 gp | 1d10 | Piercing | 18 lb | Ammunition (100/400), Heavy, Loading, Two-Handed |
|
||||
| Longbow | 50 gp | 1d8 | Piercing | 2 lb | Ammunition (150/600), Heavy, Two-Handed |
|
||||
| Net | 1 gp | — | — | 3 lb | Special: Restrained condition on hit (STR DC 10 to escape). Large or smaller targets only. |
|
||||
|
||||
---
|
||||
|
||||
## 4. Ammunition
|
||||
|
||||
Ammo is tracked as a consumable. Players recover **half their spent ammo** after each combat (round down).
|
||||
|
||||
| Ammunition | Cost (20 units) | Used By |
|
||||
|---|---|---|
|
||||
| Arrows | 1 gp | Shortbow, Longbow |
|
||||
| Bolts | 1 gp | Crossbow (light, heavy, hand) |
|
||||
| Sling Bullets | 4 cp | Sling |
|
||||
| Blowgun Needles | 1 gp | Blowgun |
|
||||
| Darts | 5 cp each | Darts (see Simple Ranged) |
|
||||
|
||||
---
|
||||
|
||||
## 5. Armor
|
||||
|
||||
### 5.1 Light Armor
|
||||
|
||||
Proficiency: Rogue, Ranger, Cleric (and Fighter by inheritance).
|
||||
|
||||
| Armor | Cost | AC | STR Req. | Stealth | Weight |
|
||||
|---|---|---|---|---|---|
|
||||
| Padded | 5 gp | 11 + DEX mod | — | Disadvantage | 8 lb |
|
||||
| Leather | 10 gp | 11 + DEX mod | — | — | 10 lb |
|
||||
| Studded Leather | 45 gp | 12 + DEX mod | — | — | 13 lb |
|
||||
|
||||
### 5.2 Medium Armor
|
||||
|
||||
Proficiency: Fighter, Ranger, Cleric.
|
||||
DEX bonus to AC capped at **+2** for all medium armor.
|
||||
|
||||
| Armor | Cost | AC | STR Req. | Stealth | Weight |
|
||||
|---|---|---|---|---|---|
|
||||
| Hide | 10 gp | 12 + DEX mod (max +2) | — | — | 12 lb |
|
||||
| Chain Shirt | 50 gp | 13 + DEX mod (max +2) | — | — | 20 lb |
|
||||
| Scale Mail | 50 gp | 14 + DEX mod (max +2) | — | Disadvantage | 45 lb |
|
||||
| Breastplate | 400 gp | 14 + DEX mod (max +2) | — | — | 20 lb |
|
||||
| Half Plate | 750 gp | 15 + DEX mod (max +2) | — | Disadvantage | 40 lb |
|
||||
|
||||
### 5.3 Heavy Armor
|
||||
|
||||
Proficiency: Fighter only.
|
||||
Heavy armor grants **no DEX bonus** to AC. STR requirements must be met or movement is reduced (flavor only in bot context — apply -2 to DEX-based rolls as penalty).
|
||||
|
||||
| Armor | Cost | AC | STR Req. | Stealth | Weight |
|
||||
|---|---|---|---|---|---|
|
||||
| Ring Mail | 30 gp | 14 | — | Disadvantage | 40 lb |
|
||||
| Chain Mail | 75 gp | 16 | STR 13 | Disadvantage | 55 lb |
|
||||
| Splint | 200 gp | 17 | STR 15 | Disadvantage | 60 lb |
|
||||
| Plate | 1,500 gp | 18 | STR 15 | Disadvantage | 65 lb |
|
||||
|
||||
### 5.4 Shield
|
||||
|
||||
| Item | Cost | AC Bonus | Proficiency | Weight |
|
||||
|---|---|---|---|---|
|
||||
| Shield | 10 gp | +2 | Fighter, Ranger, Cleric | 6 lb |
|
||||
|
||||
A shield occupies the **off-hand slot**. Cannot be used with Two-Handed weapons.
|
||||
|
||||
---
|
||||
|
||||
## 6. Adventuring Gear & Consumables
|
||||
|
||||
These are available at Thom Krooke's shop or as dungeon loot.
|
||||
|
||||
### 6.1 Potions
|
||||
|
||||
| Item | Cost | Effect | Notes |
|
||||
|---|---|---|---|
|
||||
| Potion of Healing | 50 gp | Restore 2d4+2 HP | Bonus action to drink in combat |
|
||||
| Potion of Greater Healing | 100 gp | Restore 4d4+4 HP | Bonus action to drink in combat |
|
||||
| Potion of Superior Healing | 500 gp | Restore 8d4+8 HP | Rare drop only; not in shop |
|
||||
| Antitoxin | 50 gp | Advantage on CON saves vs. poison for 1 hour / 3 combats | — |
|
||||
| Potion of Speed | 250 gp | +1 attack per turn for 1 minute / 1 combat | Rare drop only |
|
||||
| Potion of Resistance | 300 gp | Resistance to one damage type for 1 hour | Type specified on item |
|
||||
|
||||
### 6.2 Utility Items
|
||||
|
||||
| Item | Cost | Effect |
|
||||
|---|---|---|
|
||||
| Rope, Hemp (50 ft) | 1 gp | Enables Athletics checks for climbing/binding |
|
||||
| Torch | 1 cp | Removes darkness penalty in underground zones (future) |
|
||||
| Thieves' Tools | 25 gp | Required for Rogue lockpicking checks |
|
||||
| Herbalism Kit | 5 gp | Required for crafting basic potions (future) |
|
||||
| Spell Component Pouch | 25 gp | Required for Mage spells with material components |
|
||||
| Holy Symbol | 5 gp | Required for Cleric divine abilities |
|
||||
| Arcane Focus (Staff) | 5 gp | Alternative to Spell Component Pouch for Mage |
|
||||
| Arrows (20) | 1 gp | Ammunition |
|
||||
| Bolts (20) | 1 gp | Ammunition |
|
||||
| Quiver | 1 gp | Holds 20 arrows or bolts |
|
||||
|
||||
---
|
||||
|
||||
## 7. Magic Weapons (Base Templates)
|
||||
|
||||
Magic weapons drop from dungeon encounters and high-CR monsters. They use the mundane weapon as a base, then add a bonus and optionally a magical property. Attunement required for +2 and above.
|
||||
|
||||
### 7.1 Bonus Weapon Tiers
|
||||
|
||||
| Tier | Attack Bonus | Damage Bonus | Rarity | Attunement |
|
||||
|---|---|---|---|---|
|
||||
| +1 | +1 to attack rolls | +1 to damage | Uncommon | No |
|
||||
| +2 | +2 to attack rolls | +2 to damage | Rare | Yes |
|
||||
| +3 | +3 to attack rolls | +3 to damage | Very Rare | Yes |
|
||||
|
||||
### 7.2 Named Magic Weapons (Starter Set)
|
||||
|
||||
These are specific named items with unique properties. Each requires attunement.
|
||||
|
||||
| Item | Base | Rarity | Bonus | Special Property |
|
||||
|---|---|---|---|---|
|
||||
| **Flame Tongue** | Longsword | Rare | +1 | On hit: +2d6 fire damage. Command word activates flame (light source). |
|
||||
| **Sword of Wounding** | Shortsword | Rare | +1 | On hit: target cannot regain HP until start of their next turn. |
|
||||
| **Frost Brand** | Greatsword | Very Rare | +1 | On hit: +1d6 cold damage. Cold resistance while attuned. |
|
||||
| **Dagger of Venom** | Dagger | Rare | +1 | Once per day: coat blade with poison. Next hit: +2d10 poison, CON DC 15 or Poisoned. |
|
||||
| **Bow of Speed** | Longbow | Very Rare | +2 | Ignore Loading property on any crossbow. +1 attack per turn. |
|
||||
| **Mace of Smiting** | Mace | Rare | +1 | On crit vs. construct: +2d6 bonus damage. |
|
||||
| **Staff of the Adder** | Quarterstaff | Uncommon | +1 | Cleric/Ranger only. Bonus action: animate as snake (1d4 piercing, poison on bite CON DC 11). |
|
||||
| **Rapier of Puncturing** | Rapier | Uncommon | +1 | On crit: target makes CON DC 13 or loses 2d4 HP at start of their next 3 turns (bleed). |
|
||||
|
||||
---
|
||||
|
||||
## 8. Magic Armor (Base Templates)
|
||||
|
||||
### 8.1 Bonus Armor Tiers
|
||||
|
||||
| Tier | AC Bonus | Rarity | Attunement |
|
||||
|---|---|---|---|
|
||||
| +1 | +1 to AC | Rare | No |
|
||||
| +2 | +2 to AC | Very Rare | Yes |
|
||||
| +3 | +3 to AC | Legendary | Yes |
|
||||
|
||||
### 8.2 Named Magic Armor (Starter Set)
|
||||
|
||||
| Item | Base | Rarity | Special Property |
|
||||
|---|---|---|---|
|
||||
| **Armor of Resistance** | Any | Rare | Resistance to one damage type (specified on item). Attunement. |
|
||||
| **Demon Armor** | Plate | Very Rare | +1 AC. Unarmed strikes deal 1d8 + STR slashing. Cursed: cannot be removed without *Remove Curse* spell. |
|
||||
| **Dragon Scale Mail** | Scale Mail | Very Rare | +1 AC. Resistance to one dragon damage type. Advantage on saves vs. dragons. |
|
||||
| **Elven Chain** | Chain Shirt | Rare | Treated as light armor for proficiency. No Stealth disadvantage. |
|
||||
| **Mithral Armor** | Medium or Heavy | Uncommon | No STR requirement. No Stealth disadvantage. No attunement. |
|
||||
| **Adamantine Armor** | Medium or Heavy | Uncommon | Any critical hit against wearer becomes a normal hit instead. |
|
||||
| **Spellguard Shield** | Shield | Very Rare | Advantage on saves vs. spells. Magic missiles cannot hit wearer. |
|
||||
| **Cloak of Protection** | — (Amulet slot) | Uncommon | +1 to AC and all saving throws. Attunement. |
|
||||
|
||||
---
|
||||
|
||||
## 9. Class-Weapon Affinity Matrix
|
||||
|
||||
Summary of which weapon categories each class can use with full proficiency:
|
||||
|
||||
| Weapon Category | Fighter | Rogue | Mage | Cleric | Ranger |
|
||||
|---|---|---|---|---|---|
|
||||
| Simple Melee | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| Simple Ranged | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| Martial Melee | ✅ | ⚠️ Shortsword, Rapier, Scimitar, Longsword only | ❌ | ❌ | ✅ |
|
||||
| Martial Ranged | ✅ | ⚠️ Hand crossbow only | ❌ | ❌ | ✅ |
|
||||
| Heavy Armor | ✅ | ❌ | ❌ | ❌ | ❌ |
|
||||
| Medium Armor | ✅ | ❌ | ❌ | ✅ | ✅ |
|
||||
| Light Armor | ✅ | ✅ | ❌ | ✅ | ✅ |
|
||||
| Shield | ✅ | ❌ | ❌ | ✅ | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 10. Carry Weight (Optional Mechanic)
|
||||
|
||||
If inventory weight is implemented, use these rules:
|
||||
|
||||
- **Carry Capacity:** STR score × 15 lbs
|
||||
- **Encumbered** (> STR × 5 lbs): -10 to movement speed (flavor; -1 to DEX rolls)
|
||||
- **Heavily Encumbered** (> STR × 10 lbs): -20 to movement; disadvantage on STR/DEX/CON checks
|
||||
- **Over capacity:** Cannot move. Combat actions at disadvantage.
|
||||
|
||||
Recommended: implement carry weight as a soft warning only in v1. Hard enforcement deferred to future patch.
|
||||
|
||||
---
|
||||
|
||||
## 11. Go Data Structures — Equipment Extension
|
||||
|
||||
```go
|
||||
// WeaponProfile extends the base Item struct for weapons.
|
||||
type WeaponProfile struct {
|
||||
ItemID string `json:"item_id"`
|
||||
DamageDie string `json:"damage_die"` // e.g. "1d8", "2d6"
|
||||
DamageType string `json:"damage_type"` // slashing, piercing, bludgeoning
|
||||
Properties []string `json:"properties"` // finesse, light, thrown, etc.
|
||||
RangeNormal int `json:"range_normal"` // 0 if melee
|
||||
RangeLong int `json:"range_long"` // 0 if melee
|
||||
VersatileDie string `json:"versatile_die"` // e.g. "1d10"; empty if not versatile
|
||||
MagicBonus int `json:"magic_bonus"` // 0 for mundane
|
||||
MagicProp string `json:"magic_prop"` // empty for mundane
|
||||
}
|
||||
|
||||
// ArmorProfile extends the base Item struct for armor.
|
||||
type ArmorProfile struct {
|
||||
ItemID string `json:"item_id"`
|
||||
ArmorType string `json:"armor_type"` // light, medium, heavy, shield
|
||||
BaseAC int `json:"base_ac"`
|
||||
MaxDEXBonus int `json:"max_dex_bonus"` // -1 = unlimited (light), 2 = medium, 0 = heavy
|
||||
STRRequire int `json:"str_require"` // 0 if no requirement
|
||||
StealthDisad bool `json:"stealth_disad"`
|
||||
MagicBonus int `json:"magic_bonus"`
|
||||
MagicProp string `json:"magic_prop"`
|
||||
}
|
||||
|
||||
// AmmoStack tracks a player's ammunition supply.
|
||||
type AmmoStack struct {
|
||||
PlayerID string `json:"player_id"`
|
||||
Type string `json:"ammo_type"` // arrows, bolts, sling_bullets, etc.
|
||||
Quantity int `json:"quantity"`
|
||||
}
|
||||
|
||||
// ACResult holds the resolved AC for a player at combat time.
|
||||
// Computed from equipped armor + DEX modifier + magic bonuses.
|
||||
type ACResult struct {
|
||||
Base int `json:"base"`
|
||||
DEXApplied int `json:"dex_applied"`
|
||||
MagicBonus int `json:"magic_bonus"`
|
||||
ShieldBonus int `json:"shield_bonus"`
|
||||
Total int `json:"total"`
|
||||
}
|
||||
|
||||
// ComputeAC resolves a player's AC from their equipped gear and stats.
|
||||
func ComputeAC(armor *ArmorProfile, shield *ArmorProfile, dexMod int) ACResult {
|
||||
ac := ACResult{}
|
||||
if armor == nil {
|
||||
// Unarmored: 10 + DEX
|
||||
ac.Base = 10
|
||||
ac.DEXApplied = dexMod
|
||||
} else {
|
||||
ac.Base = armor.BaseAC + armor.MagicBonus
|
||||
switch armor.MaxDEXBonus {
|
||||
case -1: // light: full DEX
|
||||
ac.DEXApplied = dexMod
|
||||
case 2: // medium: cap at +2
|
||||
if dexMod > 2 { ac.DEXApplied = 2 } else { ac.DEXApplied = dexMod }
|
||||
case 0: // heavy: no DEX
|
||||
ac.DEXApplied = 0
|
||||
}
|
||||
}
|
||||
if shield != nil {
|
||||
ac.ShieldBonus = 2 + shield.MagicBonus
|
||||
}
|
||||
ac.Total = ac.Base + ac.DEXApplied + ac.ShieldBonus
|
||||
return ac
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
*End of Equipment Appendix. Reference alongside `gogobee_dnd_design_doc.md` in all Claude Code sessions.*
|
||||
Reference in New Issue
Block a user