From a3db545be3946fb0065cb294877ae8d7347c210f Mon Sep 17 00:00:00 2001 From: Hamcha Date: Tue, 27 Aug 2019 11:59:07 +0200 Subject: [PATCH] Update convertset to add boosted manes --- tools/convertsets/convert.go | 296 ++++++++++++++++++----------------- tools/convertsets/loadxml.go | 1 + 2 files changed, 155 insertions(+), 142 deletions(-) diff --git a/tools/convertsets/convert.go b/tools/convertsets/convert.go index b8535bb..33e3c20 100644 --- a/tools/convertsets/convert.go +++ b/tools/convertsets/convert.go @@ -28,6 +28,7 @@ type jsonCard struct { ProblemBonus *int `json:",omitempty"` ProblemOpponentPower int `json:",omitempty"` ProblemRequirement jsonPowerRequirement `json:",omitempty"` + Boosted *jsonCard `json:",omitempty"` } type jsonPowerRequirement map[string]int @@ -35,152 +36,163 @@ type jsonPowerRequirement map[string]int func convert(xmlset xmlSet) (s jsonSet) { s.Name = xmlset.Name for _, xmlcard := range xmlset.Cards { - jsoncard := jsonCard{ - Name: xmlcard.Name, - Keywords: []string{}, - Traits: []string{}, - Element: []string{}, - } + jsoncard := decodeCard(xmlcard) - type reqUnit struct { - Element string - Count int - } - requirements := make([]reqUnit, 3) - problemreq := make([]reqUnit, 2) - - for _, property := range xmlcard.Properties { - switch property.Name { - case "Cost": - if property.Value != "" { - cost, _ := strconv.Atoi(property.Value) - jsoncard.Cost = &cost - } - case "Element": - if property.Value != "" && property.Value != "Multicolor" { - jsoncard.Element = append(jsoncard.Element, property.Value) - } - case "Keywords": - if property.Value != "" { - jsoncard.Keywords = strings.Split(strings.TrimRight(property.Value, "."), ", ") - } - case "Number": - jsoncard.ID = strings.ToLower(property.Value) - case "PlayRequiredElement": - if property.Value != "" { - requirements[0].Element = property.Value - } - case "PlayRequiredPower": - if property.Value != "" { - requirements[0].Count, _ = strconv.Atoi(property.Value) - } - case "Power": - if property.Value != "" { - power, _ := strconv.Atoi(property.Value) - jsoncard.Power = &power - } - case "ProblemBonus": - if property.Value != "" { - bonus, _ := strconv.Atoi(property.Value) - jsoncard.ProblemBonus = &bonus - } - case "ProblemOpponentPower": - if property.Value != "" { - jsoncard.ProblemOpponentPower, _ = strconv.Atoi(property.Value) - } - case "ProblemPlayerElement1": - if property.Value != "" { - problemreq[0].Element = property.Value - } - case "ProblemPlayerElement1Power": - if property.Value != "" { - problemreq[0].Count, _ = strconv.Atoi(property.Value) - } - case "ProblemPlayerElement2": - if property.Value != "" { - problemreq[1].Element = property.Value - } - case "ProblemPlayerElement2Power": - if property.Value != "" { - problemreq[1].Count, _ = strconv.Atoi(property.Value) - } - case "Rarity": - if property.Value != "" { - jsoncard.Rarity = property.Value - } - case "SecondaryPlayRequiredElement": - if property.Value != "" { - requirements[1].Element = property.Value - } - case "SecondaryPlayRequiredPower": - if property.Value != "" { - requirements[1].Count, _ = strconv.Atoi(property.Value) - } - case "Subname": - if property.Value != "" { - jsoncard.Subname = property.Value - } - case "TertiaryPlayRequiredElement": - if property.Value != "" { - requirements[2].Element = property.Value - } - case "TertiaryPlayRequiredPower": - if property.Value != "" { - requirements[2].Count, _ = strconv.Atoi(property.Value) - } - case "Text": - jsoncard.Text = property.Value - case "Traits": - if property.Value != "" { - jsoncard.Traits = strings.Split(property.Value, ", ") - } - case "TriElement", - "TriPrimaryElement", - "TriSecondaryElement", - "MultiPrimaryElement", - "MultiSecondaryElement": - if property.Value != "" { - jsoncard.Element = append(jsoncard.Element, property.Value) - } - case "Type": - jsoncard.Type = property.Value - } - } - - // Fill card requirements - if requirements[0].Element != "" { - jsoncard.Requirement = make(jsonPowerRequirement) - } - for _, req := range requirements { - if req.Element != "" { - jsoncard.Requirement[req.Element] = req.Count - } - } - - // Fill problem requirements (this is a bit more tricky) - if problemreq[0].Element != "" { - jsoncard.ProblemRequirement = make(jsonPowerRequirement) - jsoncard.ProblemRequirement[problemreq[0].Element] = problemreq[0].Count - /* - The way OCTGN problems are managed is like this (I think): - - If there are two problem requirements, then both are specified - - If there is one problem requirement and it's "WILD", then - there is just one problem requirement specified (which is colorless) - - If there are two problem requirements, one of which is colorless, - then there is JUST the colored requirement specified, and a - colorless extra requirement is assumed to exist with the same - non-wild requirement amount - */ - if problemreq[0].Element != "Wild" { - if problemreq[1].Element != "" { - jsoncard.ProblemRequirement[problemreq[1].Element] = problemreq[1].Count - } else { - jsoncard.ProblemRequirement["Wild"] = problemreq[0].Count - } - } + if jsoncard.Type == "Mane Character" && xmlcard.Alternate != nil { + boosted := decodeCard(*xmlcard.Alternate) + jsoncard.Boosted = &boosted } s.Cards = append(s.Cards, jsoncard) } return } + +func decodeCard(xmlcard xmlCard) jsonCard { + jsoncard := jsonCard{ + Name: xmlcard.Name, + Keywords: []string{}, + Traits: []string{}, + Element: []string{}, + } + + type reqUnit struct { + Element string + Count int + } + requirements := make([]reqUnit, 3) + problemreq := make([]reqUnit, 2) + + for _, property := range xmlcard.Properties { + switch property.Name { + case "Cost": + if property.Value != "" { + cost, _ := strconv.Atoi(property.Value) + jsoncard.Cost = &cost + } + case "Element": + if property.Value != "" && property.Value != "Multicolor" { + jsoncard.Element = append(jsoncard.Element, property.Value) + } + case "Keywords": + if property.Value != "" { + jsoncard.Keywords = strings.Split(strings.TrimRight(property.Value, "."), ", ") + } + case "Number": + jsoncard.ID = strings.ToLower(property.Value) + case "PlayRequiredElement": + if property.Value != "" { + requirements[0].Element = property.Value + } + case "PlayRequiredPower": + if property.Value != "" { + requirements[0].Count, _ = strconv.Atoi(property.Value) + } + case "Power": + if property.Value != "" { + power, _ := strconv.Atoi(property.Value) + jsoncard.Power = &power + } + case "ProblemBonus": + if property.Value != "" { + bonus, _ := strconv.Atoi(property.Value) + jsoncard.ProblemBonus = &bonus + } + case "ProblemOpponentPower": + if property.Value != "" { + jsoncard.ProblemOpponentPower, _ = strconv.Atoi(property.Value) + } + case "ProblemPlayerElement1": + if property.Value != "" { + problemreq[0].Element = property.Value + } + case "ProblemPlayerElement1Power": + if property.Value != "" { + problemreq[0].Count, _ = strconv.Atoi(property.Value) + } + case "ProblemPlayerElement2": + if property.Value != "" { + problemreq[1].Element = property.Value + } + case "ProblemPlayerElement2Power": + if property.Value != "" { + problemreq[1].Count, _ = strconv.Atoi(property.Value) + } + case "Rarity": + if property.Value != "" { + jsoncard.Rarity = property.Value + } + case "SecondaryPlayRequiredElement": + if property.Value != "" { + requirements[1].Element = property.Value + } + case "SecondaryPlayRequiredPower": + if property.Value != "" { + requirements[1].Count, _ = strconv.Atoi(property.Value) + } + case "Subname": + if property.Value != "" { + jsoncard.Subname = property.Value + } + case "TertiaryPlayRequiredElement": + if property.Value != "" { + requirements[2].Element = property.Value + } + case "TertiaryPlayRequiredPower": + if property.Value != "" { + requirements[2].Count, _ = strconv.Atoi(property.Value) + } + case "Text": + jsoncard.Text = property.Value + case "Traits": + if property.Value != "" { + jsoncard.Traits = strings.Split(property.Value, ", ") + } + case "TriElement", + "TriPrimaryElement", + "TriSecondaryElement", + "MultiPrimaryElement", + "MultiSecondaryElement": + if property.Value != "" { + jsoncard.Element = append(jsoncard.Element, property.Value) + } + case "Type": + jsoncard.Type = property.Value + } + } + + // Fill card requirements + if requirements[0].Element != "" { + jsoncard.Requirement = make(jsonPowerRequirement) + } + for _, req := range requirements { + if req.Element != "" { + jsoncard.Requirement[req.Element] = req.Count + } + } + + // Fill problem requirements (this is a bit more tricky) + if problemreq[0].Element != "" { + jsoncard.ProblemRequirement = make(jsonPowerRequirement) + jsoncard.ProblemRequirement[problemreq[0].Element] = problemreq[0].Count + /* + The way OCTGN problems are managed is like this (I think): + - If there are two problem requirements, then both are specified + - If there is one problem requirement and it's "WILD", then + there is just one problem requirement specified (which is colorless) + - If there are two problem requirements, one of which is colorless, + then there is JUST the colored requirement specified, and a + colorless extra requirement is assumed to exist with the same + non-wild requirement amount + */ + if problemreq[0].Element != "Wild" { + if problemreq[1].Element != "" { + jsoncard.ProblemRequirement[problemreq[1].Element] = problemreq[1].Count + } else { + jsoncard.ProblemRequirement["Wild"] = problemreq[0].Count + } + } + } + + return jsoncard +} diff --git a/tools/convertsets/loadxml.go b/tools/convertsets/loadxml.go index a3de0f2..b23d580 100644 --- a/tools/convertsets/loadxml.go +++ b/tools/convertsets/loadxml.go @@ -16,6 +16,7 @@ type xmlCard struct { ID string `xml:"id,attr"` Name string `xml:"name,attr"` Properties []xmlProperty `xml:"property"` + Alternate *xmlCard `xml:"alternate"` } type xmlProperty struct {