///|
/// StructureContainer 的通用观察视图。
pub struct StructureContainer {
  priv raw : @raw.JsStructureContainer
  priv relation : Relation
}

///|
/// 从 raw container 构造高层视图。通常下游无需直接调用。
pub fn StructureContainer::create(
  raw : @raw.JsStructureContainer,
) -> StructureContainer {
  StructureContainer::{
    raw,
    relation: relation_of_my_flag(raw.my().to_option()),
  }
}

///|
/// 返回底层 raw container 句柄。通常下游无需直接调用。
pub fn StructureContainer::to_raw(
  self : StructureContainer,
) -> @raw.JsStructureContainer {
  self.raw
}

///|
/// 将 container 转成通用 `GameObject` 视图。
pub fn StructureContainer::as_game_object(
  self : StructureContainer,
) -> GameObject {
  GameObject::create(self.raw.to_game_object())
}

///|
/// 返回 container 的敌我关系。
pub fn StructureContainer::relation(self : StructureContainer) -> Relation {
  self.relation
}

///|
/// 返回该 container 是否属于己方。
pub fn StructureContainer::is_my(self : StructureContainer) -> Bool {
  self.relation == Mine
}

///|
/// 返回该 container 是否属于敌方。
pub fn StructureContainer::is_enemy(self : StructureContainer) -> Bool {
  self.relation == Enemy
}

///|
/// 返回 container 的唯一 id。
pub fn StructureContainer::id(self : StructureContainer) -> String {
  self.as_game_object().id()
}

///|
/// 返回 container 当前的 x 坐标。
pub fn StructureContainer::x(self : StructureContainer) -> Int {
  self.as_game_object().x()
}

///|
/// 返回 container 当前的 y 坐标。
pub fn StructureContainer::y(self : StructureContainer) -> Int {
  self.as_game_object().y()
}

///|
/// 返回 container 当前是否仍存在于场上。
pub fn StructureContainer::exists(self : StructureContainer) -> Bool {
  self.as_game_object().exists()
}

///|
/// 返回 container 的存储视图。
pub fn StructureContainer::store(self : StructureContainer) -> Store {
  Store::create(self.raw.store())
}

///|
/// 返回 container 当前生命值。
pub fn StructureContainer::hits(self : StructureContainer) -> Int {
  self.raw.hits()
}

///|
/// 返回 container 最大生命值。
pub fn StructureContainer::hits_max(self : StructureContainer) -> Int {
  self.raw.hits_max()
}