114 lines
3.1 KiB
Go

package achievements
import (
"fmt"
"eq2emu/internal/common"
)
// MasterList manages the global list of all achievements
type MasterList struct {
*common.MasterList[uint32, *Achievement]
}
// NewMasterList creates a new master achievement list
func NewMasterList() *MasterList {
return &MasterList{
MasterList: common.NewMasterList[uint32, *Achievement](),
}
}
// AddAchievement adds an achievement to the master list
// Returns false if achievement with same ID already exists
func (m *MasterList) AddAchievement(achievement *Achievement) bool {
if achievement == nil {
return false
}
return m.MasterList.Add(achievement)
}
// GetAchievement retrieves an achievement by ID
// Returns nil if not found
func (m *MasterList) GetAchievement(id uint32) *Achievement {
return m.MasterList.Get(id)
}
// GetAchievementClone retrieves a cloned copy of an achievement by ID
// Returns nil if not found. Safe for modification without affecting master list
func (m *MasterList) GetAchievementClone(id uint32) *Achievement {
achievement := m.MasterList.Get(id)
if achievement == nil {
return nil
}
return achievement.Clone()
}
// GetAllAchievements returns a map of all achievements (read-only access)
// The returned map should not be modified
func (m *MasterList) GetAllAchievements() map[uint32]*Achievement {
return m.MasterList.GetAll()
}
// GetAchievementsByCategory returns achievements filtered by category
func (m *MasterList) GetAchievementsByCategory(category string) []*Achievement {
return m.MasterList.Filter(func(achievement *Achievement) bool {
return achievement.Category == category
})
}
// GetAchievementsByExpansion returns achievements filtered by expansion
func (m *MasterList) GetAchievementsByExpansion(expansion string) []*Achievement {
return m.MasterList.Filter(func(achievement *Achievement) bool {
return achievement.Expansion == expansion
})
}
// Removes an achievement from the master list
// Returns true if achievement was found and removed
func (m *MasterList) RemoveAchievement(id uint32) bool {
return m.MasterList.Remove(id)
}
// UpdateAchievement updates an existing achievement
// Returns error if achievement doesn't exist
func (m *MasterList) UpdateAchievement(achievement *Achievement) error {
if achievement == nil {
return fmt.Errorf("achievement cannot be nil")
}
return m.MasterList.Update(achievement)
}
// Returns all unique categories
func (m *MasterList) GetCategories() []string {
categories := make(map[string]bool)
m.MasterList.ForEach(func(_ uint32, achievement *Achievement) {
if achievement.Category != "" {
categories[achievement.Category] = true
}
})
result := make([]string, 0, len(categories))
for category := range categories {
result = append(result, category)
}
return result
}
// Returns all unique expansions
func (m *MasterList) GetExpansions() []string {
expansions := make(map[string]bool)
m.MasterList.ForEach(func(_ uint32, achievement *Achievement) {
if achievement.Expansion != "" {
expansions[achievement.Expansion] = true
}
})
result := make([]string, 0, len(expansions))
for expansion := range expansions {
result = append(result, expansion)
}
return result
}