package game import ( "fmt" "log" "strconv" "strings" ) type Attack struct { attacks []int } func INVALID_ATTACK(a Attack) bool { return a.attacks == nil || len(a.attacks) == 0 } func (a Attack) MaxRange() int { return len(a.attacks) } func (a Attack) DamageInRange(r int) int { if r > a.MaxRange() { return 0 } return a.attacks[r-1] } func (a Attack) String() string { if INVALID_ATTACK(a) { return "invalid attack" } if len(a.attacks) == 1 { return fmt.Sprintf("%d", a.attacks[0]) } r := a.MaxRange() return fmt.Sprintf("%d range %d", a.DamageInRange(r), r) } func parseAttack(attack interface{}) Attack { if damage, ok := attack.(int); ok { return Attack{[]int{damage}} } attackStr := attack.(string) tokens := strings.Split(attackStr, " ") a, err := strconv.Atoi(tokens[0]) if err != nil { log.Panicf("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.Panicf("Attack %s has no valid Range value\n", attackStr) } } attacks := make([]int, 0, r) for i := 0; i < r; i++ { attacks = append(attacks, a) } return Attack{attacks} }