///|
/// 所有可作为游戏对象观察视图的类型都应满足这一层最小能力。
pub(open) trait GameObjectLike {
  as_game_object(Self) -> GameObject
  id(Self) -> String
  x(Self) -> Int
  y(Self) -> Int
  exists(Self) -> Bool
}

///|
/// 带有所有权关系语义的对象应实现这一 trait。
pub(open) trait MyLike {
  relation(Self) -> Relation
  is_my(Self) -> Bool
  is_enemy(Self) -> Bool
}

///|
/// 带有 Store 的对象应实现这一 trait。
pub(open) trait HasStore {
  store(Self) -> Store
}

///|
/// 带有 hits / hits_max 语义的对象应实现这一 trait。
pub(open) trait HasHits {
  hits(Self) -> Int
  hits_max(Self) -> Int
}

///|
/// Move 的目标对象。
pub(open) trait MoveTarget: GameObjectLike {
  as_move_target(Self) -> GameObject
}

///|
/// 近战攻击目标。
pub(open) trait AttackTarget: GameObjectLike {
  as_attack_target(Self) -> GameObject
}

///|
/// 远程攻击目标。
pub(open) trait RangedAttackTarget: GameObjectLike {
  as_ranged_attack_target(Self) -> GameObject
}

///|
/// 治疗目标。
pub(open) trait HealTarget: GameObjectLike {
  as_heal_target(Self) -> GameObject
}

///|
/// Tower 的攻击目标。
pub(open) trait TowerAttackTarget: GameObjectLike {
  as_tower_attack_target(Self) -> GameObject
}

///|
/// 采集目标。
pub(open) trait HarvestTarget {
  as_harvest_target(Self) -> Source
}

///|
/// 转移资源目标。
pub(open) trait TransferTarget: GameObjectLike {
  as_transfer_target(Self) -> GameObject
}

///|
/// 提取资源目标。
pub(open) trait WithdrawTarget: GameObjectLike {
  as_withdraw_target(Self) -> GameObject
}

///|
/// 建造目标。
pub(open) trait BuildTarget {
  as_build_target(Self) -> ConstructionSite
}