/* Package spells is the active record implementation for spells in the game. # Basic Usage To retrieve a spell by ID: spell, err := spells.Find(db, 1) if err != nil { log.Fatal(err) } fmt.Printf("Found spell: %s (MP: %d, Power: %d)\n", spell.Name, spell.MP, spell.Attribute) To get all spells: allSpells, err := spells.All(db) if err != nil { log.Fatal(err) } for _, spell := range allSpells { fmt.Printf("Spell: %s\n", spell.Name) } To find a spell by name: heal, err := spells.ByName(db, "Heal") if err != nil { log.Fatal(err) } To filter spells by type: healingSpells, err := spells.ByType(db, spells.TypeHealing) if err != nil { log.Fatal(err) } To get spells within MP budget: affordableSpells, err := spells.ByMaxMP(db, 10) if err != nil { log.Fatal(err) } To get spells of specific type within MP budget: cheapHurtSpells, err := spells.ByTypeAndMaxMP(db, spells.TypeHurt, 15) if err != nil { log.Fatal(err) } # Creating Spells with Builder Pattern The package provides a fluent builder interface for creating new spells: spell, err := spells.NewBuilder(db). WithName("Lightning Bolt"). WithMP(25). WithAttribute(70). WithType(spells.TypeHurt). Create() if err != nil { log.Fatal(err) } fmt.Printf("Created spell with ID: %d\n", spell.ID) # Updating Spells Spells can be modified and saved back to the database: spell, _ := spells.Find(db, 1) spell.Name = "Greater Heal" spell.MP = 8 spell.Attribute = 20 err := spell.Save() if err != nil { log.Fatal(err) } # Deleting Spells Spells can be removed from the database: spell, _ := spells.Find(db, 1) err := spell.Delete() if err != nil { log.Fatal(err) } # Spell Types The package defines spell type constants: spells.TypeHealing = 1 // Healing spells (Heal, Revive, Life, Breath, Gaia) spells.TypeHurt = 2 // Hurt spells (Hurt, Pain, Maim, Rend, Chaos) spells.TypeSleep = 3 // Sleep spells (Sleep, Dream, Nightmare) spells.TypeAttackBoost = 4 // Attack boost spells (Craze, Rage, Fury) spells.TypeDefenseBoost = 5 // Defense boost spells (Ward, Fend, Barrier) Helper methods are available to check spell types: if spell.IsHealing() { fmt.Println("This spell heals the caster") } if spell.IsHurt() { fmt.Println("This spell damages enemies") } if spell.IsSleep() { fmt.Println("This spell puts enemies to sleep") } if spell.IsAttackBoost() { fmt.Println("This spell boosts attack power") } if spell.IsDefenseBoost() { fmt.Println("This spell boosts defense") } fmt.Printf("Spell type: %s\n", spell.TypeName()) # Database Schema The spells table has the following structure: CREATE TABLE spells ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, mp INTEGER NOT NULL DEFAULT 0, attribute INTEGER NOT NULL DEFAULT 0, type INTEGER NOT NULL DEFAULT 0 ) Where: - id: Unique identifier - name: Display name of the spell - mp: Mana points required to cast the spell - attribute: Power/effectiveness of the spell - type: Spell type (1-5 as defined above) # Spell Mechanics ## Mana Point System All spells require MP to cast: if spell.CanCast(player.CurrentMP) { fmt.Printf("You can cast %s\n", spell.Name) } else { fmt.Printf("Not enough MP to cast %s (need %d, have %d)\n", spell.Name, spell.MP, player.CurrentMP) } ## Spell Efficiency Calculate efficiency as attribute per MP cost: efficiency := spell.Efficiency() fmt.Printf("%s efficiency: %.2f power per MP\n", spell.Name, efficiency) This helps players choose the most cost-effective spells. ## Offensive vs Support Spells Spells are categorized by their primary purpose: if spell.IsOffensive() { // Hurt and Sleep spells - used against enemies fmt.Println("Offensive spell - targets enemies") } if spell.IsSupport() { // Healing and boost spells - used to help player fmt.Println("Support spell - helps the caster") } # Spell Categories ## Healing Spells (Type 1) Restore hit points to the caster: - Heal: Basic healing - Revive: Moderate healing - Life: Strong healing - Breath: Very strong healing - Gaia: Ultimate healing ## Hurt Spells (Type 2) Deal damage to enemies: - Hurt: Basic damage - Pain: Moderate damage - Maim: Strong damage - Rend: Very strong damage - Chaos: Ultimate damage Note: Some monsters have immunity to Hurt spells. ## Sleep Spells (Type 3) Put enemies to sleep, preventing them from attacking: - Sleep: Basic sleep effect - Dream: Moderate sleep effect - Nightmare: Strong sleep effect Note: Some monsters have immunity to Sleep spells. ## Attack Boost Spells (Type 4) Temporarily increase the caster's attack power: - Craze: Basic attack boost - Rage: Moderate attack boost - Fury: Strong attack boost ## Defense Boost Spells (Type 5) Temporarily increase the caster's defense: - Ward: Basic defense boost - Fend: Moderate defense boost - Barrier: Strong defense boost # Query Patterns ## Finding Castable Spells Get spells a player can cast with their current MP: currentMP := 25 castableSpells, err := spells.ByMaxMP(db, currentMP) // Filter by type and MP budget castableHurtSpells, err := spells.ByTypeAndMaxMP(db, spells.TypeHurt, currentMP) ## Spell Progression Players typically learn spells in order of power/cost: // Get all healing spells ordered by cost healingSpells, err := spells.ByType(db, spells.TypeHealing) // Results are ordered by MP cost automatically ## Combat Spell Selection For combat AI or recommendations: // Get most efficient hurt spells within budget hurtSpells, err := spells.ByTypeAndMaxMP(db, spells.TypeHurt, availableMP) // Find most efficient spell var bestSpell *spells.Spell var bestEfficiency float64 for _, spell := range hurtSpells { if eff := spell.Efficiency(); eff > bestEfficiency { bestEfficiency = eff bestSpell = spell } } # Error Handling All functions return appropriate errors for common failure cases: - Spell not found (Find/ByName returns error for non-existent spells) - Database connection issues - Invalid operations (e.g., saving/deleting spells without IDs) */ package spells