93 lines
2.3 KiB
Go
93 lines
2.3 KiB
Go
package actions
|
|
|
|
import (
|
|
"dk/internal/database"
|
|
"dk/internal/helpers"
|
|
"dk/internal/models/items"
|
|
"dk/internal/models/towns"
|
|
"dk/internal/models/users"
|
|
"fmt"
|
|
"maps"
|
|
)
|
|
|
|
// RestAtInn handles the inn resting logic
|
|
func RestAtInn(user *users.User, town *towns.Town) error {
|
|
if user.Gold < town.InnCost {
|
|
return fmt.Errorf("you can't afford to stay here tonight")
|
|
}
|
|
|
|
return database.Transaction(func() error {
|
|
return database.Update("users", map[string]any{
|
|
"gold": user.Gold - town.InnCost,
|
|
"hp": user.MaxHP,
|
|
"mp": user.MaxMP,
|
|
"tp": user.MaxTP,
|
|
}, "id", user.ID)
|
|
})
|
|
}
|
|
|
|
// BuyShopItem handles purchasing an item from a town shop
|
|
func BuyShopItem(user *users.User, town *towns.Town, itemID int) error {
|
|
// Validate item exists in shop
|
|
if !town.HasShopItem(itemID) {
|
|
return fmt.Errorf("the item doesn't exist in this shop")
|
|
}
|
|
|
|
// Get item details
|
|
item, err := items.Find(itemID)
|
|
if err != nil {
|
|
return fmt.Errorf("error purchasing item: %v", err)
|
|
}
|
|
|
|
// Check user has enough gold
|
|
if user.Gold < item.Value {
|
|
return fmt.Errorf("you don't have enough gold to buy %s", item.Name)
|
|
}
|
|
|
|
// Get equipment updates from existing actions
|
|
equipUpdates, err := UserEquipItem(user, item)
|
|
if err != nil {
|
|
return fmt.Errorf("cannot equip item: %v", err)
|
|
}
|
|
|
|
// Execute purchase transaction
|
|
return database.Transaction(func() error {
|
|
// Start with gold deduction
|
|
updates := map[string]any{
|
|
"gold": user.Gold - item.Value,
|
|
}
|
|
|
|
// Add equipment updates
|
|
maps.Copy(updates, equipUpdates)
|
|
|
|
return database.Update("users", updates, "id", user.ID)
|
|
})
|
|
}
|
|
|
|
// BuyTownMap handles purchasing a town map
|
|
func BuyTownMap(user *users.User, townID int) error {
|
|
// Get the town being mapped
|
|
mappedTown, err := towns.Find(townID)
|
|
if err != nil {
|
|
return fmt.Errorf("error purchasing map: %v", err)
|
|
}
|
|
|
|
// Check user has enough gold
|
|
if user.Gold < mappedTown.MapCost {
|
|
return fmt.Errorf("you don't have enough gold to buy the map to %s", mappedTown.Name)
|
|
}
|
|
|
|
// Get current town IDs and add new one
|
|
townIDs := user.GetTownIDs()
|
|
townIDs = append(townIDs, townID)
|
|
newTownsString := helpers.IntsToString(townIDs)
|
|
|
|
// Execute purchase transaction
|
|
return database.Transaction(func() error {
|
|
return database.Update("users", map[string]any{
|
|
"gold": user.Gold - mappedTown.MapCost,
|
|
"towns": newTownsString,
|
|
}, "id", user.ID)
|
|
})
|
|
}
|