207 lines
5.1 KiB
Go
207 lines
5.1 KiB
Go
/*
|
|
Package monsters is the active record implementation for monsters in the game.
|
|
|
|
# Basic Usage
|
|
|
|
To retrieve a monster by ID:
|
|
|
|
monster, err := monsters.Find(db, 1)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Printf("Found monster: %s (level: %d, HP: %d)\n", monster.Name, monster.Level, monster.MaxHP)
|
|
|
|
To get all monsters:
|
|
|
|
allMonsters, err := monsters.All(db)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
for _, monster := range allMonsters {
|
|
fmt.Printf("Monster: %s\n", monster.Name)
|
|
}
|
|
|
|
To filter monsters by level:
|
|
|
|
level5Monsters, err := monsters.ByLevel(db, 5)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
To get monsters within a level range:
|
|
|
|
monsters1to10, err := monsters.ByLevelRange(db, 1, 10)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
To filter monsters by immunity type:
|
|
|
|
hurtImmune, err := monsters.ByImmunity(db, monsters.ImmuneHurt)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
# Creating Monsters with Builder Pattern
|
|
|
|
The package provides a fluent builder interface for creating new monsters:
|
|
|
|
monster, err := monsters.NewBuilder(db).
|
|
WithName("Fire Dragon").
|
|
WithMaxHP(500).
|
|
WithMaxDmg(100).
|
|
WithArmor(50).
|
|
WithLevel(25).
|
|
WithMaxExp(1000).
|
|
WithMaxGold(500).
|
|
WithImmunity(monsters.ImmuneHurt).
|
|
Create()
|
|
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
fmt.Printf("Created monster with ID: %d\n", monster.ID)
|
|
|
|
# Updating Monsters
|
|
|
|
Monsters can be modified and saved back to the database:
|
|
|
|
monster, _ := monsters.Find(db, 1)
|
|
monster.Name = "Enhanced Blue Slime"
|
|
monster.MaxHP = 10
|
|
monster.Level = 2
|
|
|
|
err := monster.Save()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
# Deleting Monsters
|
|
|
|
Monsters can be removed from the database:
|
|
|
|
monster, _ := monsters.Find(db, 1)
|
|
err := monster.Delete()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
# Monster Immunity Types
|
|
|
|
The package defines immunity type constants:
|
|
|
|
monsters.ImmuneNone = 0 // No immunity
|
|
monsters.ImmuneHurt = 1 // Immune to Hurt spells (Pain, Maim, Rend, Chaos)
|
|
monsters.ImmuneSleep = 2 // Immune to Sleep spells (Sleep, Dream, Nightmare)
|
|
|
|
Helper methods are available to check immunity:
|
|
|
|
if monster.IsHurtImmune() {
|
|
fmt.Println("This monster is immune to Hurt spells")
|
|
}
|
|
if monster.IsSleepImmune() {
|
|
fmt.Println("This monster is immune to Sleep spells")
|
|
}
|
|
if monster.HasImmunity() {
|
|
fmt.Printf("Monster has immunity: %s\n", monster.ImmunityName())
|
|
}
|
|
|
|
# Database Schema
|
|
|
|
The monsters table has the following structure:
|
|
|
|
CREATE TABLE monsters (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
max_hp INTEGER NOT NULL DEFAULT 0,
|
|
max_dmg INTEGER NOT NULL DEFAULT 0,
|
|
armor INTEGER NOT NULL DEFAULT 0,
|
|
level INTEGER NOT NULL DEFAULT 0,
|
|
max_exp INTEGER NOT NULL DEFAULT 0,
|
|
max_gold INTEGER NOT NULL DEFAULT 0,
|
|
immune INTEGER NOT NULL DEFAULT 0
|
|
)
|
|
|
|
Where:
|
|
- id: Unique identifier
|
|
- name: Display name of the monster
|
|
- max_hp: Maximum hit points
|
|
- max_dmg: Maximum damage per attack
|
|
- armor: Armor class/defense rating
|
|
- level: Monster level (affects encounter chances)
|
|
- max_exp: Maximum experience points awarded when defeated
|
|
- max_gold: Maximum gold awarded when defeated
|
|
- immune: Immunity type (0=none, 1=hurt spells, 2=sleep spells)
|
|
|
|
# Monster Statistics
|
|
|
|
## Combat Stats
|
|
|
|
The core combat statistics define the monster's fighting capability:
|
|
|
|
fmt.Printf("HP: %d, Damage: %d, Armor: %d\n",
|
|
monster.MaxHP, monster.MaxDmg, monster.Armor)
|
|
|
|
## Rewards
|
|
|
|
Monsters provide experience and gold rewards when defeated:
|
|
|
|
fmt.Printf("Rewards: %d exp, %d gold\n",
|
|
monster.MaxExp, monster.MaxGold)
|
|
|
|
## Utility Methods
|
|
|
|
The package provides several utility methods for analyzing monsters:
|
|
|
|
// Difficulty rating based on stats relative to level
|
|
difficulty := monster.DifficultyRating()
|
|
fmt.Printf("Difficulty: %.2f\n", difficulty)
|
|
|
|
// Experience efficiency (exp per HP)
|
|
expEfficiency := monster.ExpPerHP()
|
|
fmt.Printf("Exp per HP: %.2f\n", expEfficiency)
|
|
|
|
// Gold efficiency (gold per HP)
|
|
goldEfficiency := monster.GoldPerHP()
|
|
fmt.Printf("Gold per HP: %.2f\n", goldEfficiency)
|
|
|
|
These methods help with:
|
|
- Balancing monster difficulty
|
|
- Identifying efficient farming targets
|
|
- Analyzing risk/reward ratios
|
|
|
|
# Level-Based Queries
|
|
|
|
Monsters are commonly filtered by level for encounter generation:
|
|
|
|
// Get all monsters at a specific level
|
|
level10Monsters, err := monsters.ByLevel(db, 10)
|
|
|
|
// Get monsters within a level range (inclusive)
|
|
earlyGameMonsters, err := monsters.ByLevelRange(db, 1, 5)
|
|
|
|
// All monsters are ordered by level, then ID for consistent results
|
|
|
|
# Immunity System
|
|
|
|
The immunity system affects spell combat mechanics:
|
|
|
|
// Check specific immunities
|
|
if monster.IsHurtImmune() {
|
|
// Hurt spells (Pain, Maim, Rend, Chaos) won't work
|
|
}
|
|
if monster.IsSleepImmune() {
|
|
// Sleep spells (Sleep, Dream, Nightmare) won't work
|
|
}
|
|
|
|
// Get all monsters with specific immunity
|
|
hurtImmuneMonsters, err := monsters.ByImmunity(db, monsters.ImmuneHurt)
|
|
|
|
# Error Handling
|
|
|
|
All functions return appropriate errors for common failure cases:
|
|
- Monster not found (Find returns error for non-existent IDs)
|
|
- Database connection issues
|
|
- Invalid operations (e.g., saving/deleting monsters without IDs)
|
|
*/
|
|
package monsters |