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 }