114 lines
3.3 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"`
}
// Achievement represents a complete achievement definition
type Achievement 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"`
}
// NewAchievement creates a new achievement with empty slices
func NewAchievement() *Achievement {
return &Achievement{
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 achievement
func (a *Achievement) AddRequirement(req Requirement) {
a.Requirements = append(a.Requirements, req)
}
// AddReward adds a reward to the achievement
func (a *Achievement) 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 achievement
func (a *Achievement) Clone() *Achievement {
clone := &Achievement{
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
}