package game import ( "fmt" "log" "strconv" "strings" ) type Attack struct { Damage int Range int } func INVALID_ATTACK() Attack { return Attack{-1, -1} } func (a Attack) String() string { if a == INVALID_ATTACK() { return "invalid attack" } if a.Range == 1 { return fmt.Sprintf("%d", a.Damage) } return fmt.Sprintf("%d range %d", a.Damage, a.Range) } func parseAttack(attack interface{}) Attack { if damage, ok := attack.(int); ok { return Attack{damage, 1} } attackStr := attack.(string) tokens := strings.Split(attackStr, " ") a, err := strconv.Atoi(tokens[0]) if err != nil { log.Fatalf("Attack %s has no valid Damage value\n", attackStr) } r := 1 if len(tokens) == 3 { r, err = strconv.Atoi(tokens[2]) if err != nil { log.Fatalf("Attack %s has no valid Range value\n", attackStr) } } return Attack{a, r} }