119 lines
3.6 KiB
Go
119 lines
3.6 KiB
Go
package achievements
|
|
|
|
import "time"
|
|
|
|
// Requirement represents a single achievement requirement
|
|
type Requirement struct {
|
|
AchievementID uint32 `json:"achievement_id"`
|
|
Name string `json:"name"`
|
|
QtyRequired uint32 `json:"qty_required"`
|
|
}
|
|
|
|
// Reward represents a single achievement reward
|
|
type Reward struct {
|
|
AchievementID uint32 `json:"achievement_id"`
|
|
Reward string `json:"reward"`
|
|
}
|
|
|
|
// LegacyAchievement represents the old achievement definition for master list compatibility
|
|
type LegacyAchievement struct {
|
|
ID uint32 `json:"id"`
|
|
Title string `json:"title"`
|
|
UncompletedText string `json:"uncompleted_text"`
|
|
CompletedText string `json:"completed_text"`
|
|
Category string `json:"category"`
|
|
Expansion string `json:"expansion"`
|
|
Icon uint16 `json:"icon"`
|
|
PointValue uint32 `json:"point_value"`
|
|
QtyRequired uint32 `json:"qty_required"`
|
|
Hide bool `json:"hide"`
|
|
Unknown3A uint32 `json:"unknown3a"`
|
|
Unknown3B uint32 `json:"unknown3b"`
|
|
Requirements []Requirement `json:"requirements"`
|
|
Rewards []Reward `json:"rewards"`
|
|
}
|
|
|
|
// UpdateItem represents a single achievement progress update
|
|
type UpdateItem struct {
|
|
AchievementID uint32 `json:"achievement_id"`
|
|
ItemUpdate uint32 `json:"item_update"`
|
|
}
|
|
|
|
// Update represents achievement completion/progress data
|
|
type Update struct {
|
|
ID uint32 `json:"id"`
|
|
CompletedDate time.Time `json:"completed_date"`
|
|
UpdateItems []UpdateItem `json:"update_items"`
|
|
}
|
|
|
|
// GetID returns the achievement ID (implements common.Identifiable interface)
|
|
func (a *LegacyAchievement) GetID() uint32 {
|
|
return a.ID
|
|
}
|
|
|
|
// NewLegacyAchievement creates a new legacy achievement with empty slices
|
|
func NewLegacyAchievement() *LegacyAchievement {
|
|
return &LegacyAchievement{
|
|
Requirements: make([]Requirement, 0),
|
|
Rewards: make([]Reward, 0),
|
|
}
|
|
}
|
|
|
|
// NewUpdate creates a new achievement update with empty slices
|
|
func NewUpdate() *Update {
|
|
return &Update{
|
|
UpdateItems: make([]UpdateItem, 0),
|
|
}
|
|
}
|
|
|
|
// AddRequirement adds a requirement to the legacy achievement
|
|
func (a *LegacyAchievement) AddRequirement(req Requirement) {
|
|
a.Requirements = append(a.Requirements, req)
|
|
}
|
|
|
|
// AddReward adds a reward to the legacy achievement
|
|
func (a *LegacyAchievement) AddReward(reward Reward) {
|
|
a.Rewards = append(a.Rewards, reward)
|
|
}
|
|
|
|
// AddUpdateItem adds an update item to the achievement update
|
|
func (u *Update) AddUpdateItem(item UpdateItem) {
|
|
u.UpdateItems = append(u.UpdateItems, item)
|
|
}
|
|
|
|
// Clone creates a deep copy of the legacy achievement
|
|
func (a *LegacyAchievement) Clone() *LegacyAchievement {
|
|
clone := &LegacyAchievement{
|
|
ID: a.ID,
|
|
Title: a.Title,
|
|
UncompletedText: a.UncompletedText,
|
|
CompletedText: a.CompletedText,
|
|
Category: a.Category,
|
|
Expansion: a.Expansion,
|
|
Icon: a.Icon,
|
|
PointValue: a.PointValue,
|
|
QtyRequired: a.QtyRequired,
|
|
Hide: a.Hide,
|
|
Unknown3A: a.Unknown3A,
|
|
Unknown3B: a.Unknown3B,
|
|
Requirements: make([]Requirement, len(a.Requirements)),
|
|
Rewards: make([]Reward, len(a.Rewards)),
|
|
}
|
|
|
|
copy(clone.Requirements, a.Requirements)
|
|
copy(clone.Rewards, a.Rewards)
|
|
return clone
|
|
}
|
|
|
|
// Clone creates a deep copy of the achievement update
|
|
func (u *Update) Clone() *Update {
|
|
clone := &Update{
|
|
ID: u.ID,
|
|
CompletedDate: u.CompletedDate,
|
|
UpdateItems: make([]UpdateItem, len(u.UpdateItems)),
|
|
}
|
|
|
|
copy(clone.UpdateItems, u.UpdateItems)
|
|
return clone
|
|
}
|