///|
/// 让己方 creep 朝目标移动。
pub fn[T : MoveTarget] MyCreep::move_to(
  self : MyCreep,
  target : T,
) -> ActionResult {
  action_result_of(self.to_raw().move_to_raw(target.as_move_target().to_raw()))
}

///|
/// 若给定动作结果为不在范围内,则自动朝目标移动。
pub fn[T : MoveTarget] MyCreep::move_if_not_in_range(
  self : MyCreep,
  target : T,
  result : ActionResult,
) -> Unit {
  match result {
    Failed(NotInRange) => ignore(self.move_to(target))
    _ => ()
  }
}

///|
/// 让己方 creep 采集目标 source。
pub fn[T : HarvestTarget] MyCreep::harvest(
  self : MyCreep,
  target : T,
) -> ActionResult {
  action_result_of(
    self.to_raw().harvest_raw(target.as_harvest_target().to_raw()),
  )
}

///|
/// 尝试采集目标;若目标不在范围内,则自动朝目标移动。
pub fn[T : HarvestTarget] MyCreep::harvest_or_move(
  self : MyCreep,
  target : T,
) -> Unit {
  self.move_if_not_in_range(target.as_harvest_target(), self.harvest(target))
}

///|
/// 让己方 creep 向目标转移指定资源。
pub fn[T : TransferTarget] MyCreep::transfer(
  self : MyCreep,
  target : T,
  resource : ResourceKind,
) -> ActionResult {
  action_result_of(
    self
    .to_raw()
    .transfer_raw(target.as_transfer_target().to_raw(), resource.to_raw()),
  )
}

///|
/// 尝试向目标转移指定资源;若目标不在范围内,则自动朝目标移动。
pub fn[T : TransferTarget] MyCreep::transfer_or_move(
  self : MyCreep,
  target : T,
  resource : ResourceKind,
) -> Unit {
  self.move_if_not_in_range(
    target.as_transfer_target(),
    self.transfer(target, resource),
  )
}

///|
/// 让己方 creep 向目标转移能量。
pub fn[T : TransferTarget] MyCreep::transfer_energy(
  self : MyCreep,
  target : T,
) -> ActionResult {
  self.transfer(target, Energy)
}

///|
/// 尝试向目标转移能量;若目标不在范围内,则自动朝目标移动。
pub fn[T : TransferTarget] MyCreep::transfer_energy_or_move(
  self : MyCreep,
  target : T,
) -> Unit {
  self.move_if_not_in_range(
    target.as_transfer_target(),
    self.transfer_energy(target),
  )
}

///|
/// 让己方 creep 从目标提取指定资源。
pub fn[T : WithdrawTarget] MyCreep::withdraw(
  self : MyCreep,
  target : T,
  resource : ResourceKind,
) -> ActionResult {
  action_result_of(
    self
    .to_raw()
    .withdraw_raw(target.as_withdraw_target().to_raw(), resource.to_raw()),
  )
}

///|
/// 尝试从目标提取指定资源;若目标不在范围内,则自动朝目标移动。
pub fn[T : WithdrawTarget] MyCreep::withdraw_or_move(
  self : MyCreep,
  target : T,
  resource : ResourceKind,
) -> Unit {
  self.move_if_not_in_range(
    target.as_withdraw_target(),
    self.withdraw(target, resource),
  )
}

///|
/// 让己方 creep 从目标提取能量。
pub fn[T : WithdrawTarget] MyCreep::withdraw_energy(
  self : MyCreep,
  target : T,
) -> ActionResult {
  self.withdraw(target, Energy)
}

///|
/// 尝试从目标提取能量;若目标不在范围内,则自动朝目标移动。
pub fn[T : WithdrawTarget] MyCreep::withdraw_energy_or_move(
  self : MyCreep,
  target : T,
) -> Unit {
  self.move_if_not_in_range(
    target.as_withdraw_target(),
    self.withdraw_energy(target),
  )
}

///|
/// 让己方 creep 建造目标工地。
pub fn[T : BuildTarget] MyCreep::build(
  self : MyCreep,
  target : T,
) -> ActionResult {
  action_result_of(self.to_raw().build_raw(target.as_build_target().to_raw()))
}

///|
/// 尝试建造目标工地;若目标不在范围内,则自动朝目标移动。
pub fn[T : BuildTarget] MyCreep::build_or_move(
  self : MyCreep,
  target : T,
) -> Unit {
  self.move_if_not_in_range(target.as_build_target(), self.build(target))
}

///|
/// 让己方 creep 对目标执行近战攻击。
pub fn[T : AttackTarget] MyCreep::attack(
  self : MyCreep,
  target : T,
) -> ActionResult {
  action_result_of(self.to_raw().attack_raw(target.as_attack_target().to_raw()))
}

///|
/// 尝试近战攻击目标;若目标不在范围内,则自动朝目标移动。
pub fn[T : AttackTarget] MyCreep::attack_or_move(
  self : MyCreep,
  target : T,
) -> Unit {
  self.move_if_not_in_range(target.as_attack_target(), self.attack(target))
}

///|
/// 让己方 creep 对目标执行远程攻击。
pub fn[T : RangedAttackTarget] MyCreep::ranged_attack(
  self : MyCreep,
  target : T,
) -> ActionResult {
  action_result_of(
    self.to_raw().ranged_attack_raw(target.as_ranged_attack_target().to_raw()),
  )
}

///|
/// 尝试远程攻击目标;若目标不在范围内,则自动朝目标移动。
pub fn[T : RangedAttackTarget] MyCreep::ranged_attack_or_move(
  self : MyCreep,
  target : T,
) -> Unit {
  self.move_if_not_in_range(
    target.as_ranged_attack_target(),
    self.ranged_attack(target),
  )
}

///|
/// 让己方 creep 治疗目标 creep。
pub fn[T : HealTarget] MyCreep::heal(
  self : MyCreep,
  target : T,
) -> ActionResult {
  action_result_of(self.to_raw().heal_raw(target.as_heal_target().to_raw()))
}

///|
/// 尝试治疗目标;若目标不在范围内,则自动朝目标移动。
pub fn[T : HealTarget] MyCreep::heal_or_move(
  self : MyCreep,
  target : T,
) -> Unit {
  self.move_if_not_in_range(target.as_heal_target(), self.heal(target))
}