58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
package actions
|
|
|
|
import (
|
|
"dk/internal/models/items"
|
|
"dk/internal/models/users"
|
|
)
|
|
|
|
// UserEquipItem calculates equipment updates for a user equipping an item.
|
|
// Returns map of database field updates without modifying the user struct.
|
|
func UserEquipItem(user *users.User, item *items.Item) map[string]any {
|
|
updates := make(map[string]any)
|
|
|
|
// Calculate stat changes
|
|
newAttack := user.Attack
|
|
newDefense := user.Defense
|
|
|
|
// Remove old item stats if slot occupied
|
|
switch item.Type {
|
|
case items.TypeWeapon:
|
|
if user.WeaponID != 0 {
|
|
if oldItem, err := items.Find(user.WeaponID); err == nil {
|
|
newAttack -= oldItem.Att
|
|
}
|
|
}
|
|
// Add new item
|
|
newAttack += item.Att
|
|
updates["weapon_id"] = item.ID
|
|
updates["weapon_name"] = item.Name
|
|
|
|
case items.TypeArmor:
|
|
if user.ArmorID != 0 {
|
|
if oldItem, err := items.Find(user.ArmorID); err == nil {
|
|
newDefense -= oldItem.Att
|
|
}
|
|
}
|
|
// Add new item
|
|
newDefense += item.Att
|
|
updates["armor_id"] = item.ID
|
|
updates["armor_name"] = item.Name
|
|
|
|
case items.TypeShield:
|
|
if user.ShieldID != 0 {
|
|
if oldItem, err := items.Find(user.ShieldID); err == nil {
|
|
newDefense -= oldItem.Att
|
|
}
|
|
}
|
|
// Add new item
|
|
newDefense += item.Att
|
|
updates["shield_id"] = item.ID
|
|
updates["shield_name"] = item.Name
|
|
}
|
|
|
|
updates["attack"] = newAttack
|
|
updates["defense"] = newDefense
|
|
|
|
return updates
|
|
}
|