draft/mlp/card.go

88 lines
2.0 KiB
Go

package mlp
import (
"errors"
"strings"
"git.fromouter.space/mcg/draft"
)
// Card is a single MLP:CCG card in a set
type Card struct {
ID string
Name string
Subname string
Element []string
Keywords []string
Traits []string
Requirement PowerRequirement `json:",omitempty"`
Cost *int `json:",omitempty"`
Power *int `json:",omitempty"`
Type string
Text string
Rarity Rarity
ProblemBonus *int `json:",omitempty"`
ProblemOpponentPower int `json:",omitempty"`
ProblemRequirement PowerRequirement `json:",omitempty"`
Boosted *Card `json:",omitempty"`
}
// ToDraftCard converts cards to draft.Card
func (c Card) ToDraftCard() draft.Card {
return draft.Card{
ID: c.ID,
}
}
// PowerRequirement denotes one or more power requirements, colored or not
type PowerRequirement map[string]int
// Errors involving loading cards
var (
ErrInvalidCardID = errors.New("invalid card id")
ErrCardNotFound = errors.New("card not found in their set")
)
// LoadCardList loads cards from sets, fetching them from HTTP if needed/wanted
func LoadCardList(list []string, fetch bool) (out []Card, err error) {
out = make([]Card, len(list))
for i, card := range list {
if len(card) < 3 {
err = ErrInvalidCardID
return
}
// Get Set ID
setid := SetID(strings.ToUpper(card[:2]))
// Check for promo card
for _, promoid := range promoIDs {
if strings.ToLower(card) == promoid {
card = strings.ToLower(card)
setid = SetPromo
break
}
}
// Get set
var set *Set
if fetch {
set, err = LoadSetHTTP(setid)
} else {
set, err = LoadSetMemory(setid)
}
if err != nil {
return
}
cdata, ok := set.CardData[card]
if !ok {
err = ErrCardNotFound
return
}
out[i] = cdata
}
return
}