Source File: curse-you-go-rogue/04_combat/combat.go

package main

import (
  "fmt"
  "math/rand"
)

func (game *Game) EnemyDeath() {
  is_dead := make([]Position, 0, len(game.Enemies))

  for pos, enemy := range game.Enemies {
    if enemy.HP < 0 {
      is_dead = append(is_dead, pos)
    }
  }

  for _, pos := range is_dead {
    delete(game.Enemies, pos)
  }
}

func (game *Game) ApplyDamage(attacker *Enemy, defender *Enemy) {
  damage := rand.Int() % attacker.Damage
  defender.HP -= damage
  if damage == 0 {
    game.SetStatus("MISSED!")
  } else if defender.HP > 0 {
    game.SetStatus(fmt.Sprintf("HIT %d damage", damage))
  } else {
    game.SetStatus("DEAD!")
  }
}

func (game *Game) Attack(target Position) {
  enemy, hit_enemy := game.Enemies[target]

  if hit_enemy {
    game.ApplyDamage(&game.Player, enemy)
    game.ApplyDamage(enemy, &game.Player)
  }
}