use super::{area::*, map::*};
use crate::*;
use std::cell::RefCell;
use std::rc::Rc;
struct NeutralData {
unit_id: UnitId,
unit_type: UnitType,
pos: Position,
top_left: TilePosition,
bottom_right: TilePosition,
size: TilePosition,
blocked_areas: Vec<WalkPosition>,
}
pub trait AsNeutral {
fn is_mineral(&self) -> Option<&Mineral> {
None
}
fn is_geyser(&self) -> Option<&Geyser> {
None
}
fn is_static_building(&self) -> Option<&StaticBuilding> {
None
}
}
pub trait Neutral: AsNeutral {
fn unit_id(&self) -> UnitId;
fn unit_type(&self) -> UnitType;
fn pos(&self) -> Position;
fn top_left(&self) -> TilePosition;
fn bottom_right(&self) -> TilePosition;
fn size(&self) -> TilePosition;
fn blocking(&self) -> bool;
fn set_blocking(&mut self, blocked_areas: &[WalkPosition]);
fn blocked_areas(&self) -> Vec<Rc<RefCell<Area>>>;
fn next_stacked(&self) -> *mut dyn Neutral;
fn put_on_tiles(&self);
fn last_stacked(&self) -> Rc<dyn Neutral>;
}
macro_rules! neutral_delegate {
($l:ident) => {
impl Neutral for $l {
fn unit_id(&self) -> UnitId {
self.neutral.unit_id
}
fn unit_type(&self) -> UnitType {
self.neutral.unit_type
}
fn pos(&self) -> Position {
self.neutral.pos
}
fn top_left(&self) -> TilePosition {
self.neutral.top_left
}
fn bottom_right(&self) -> TilePosition {
self.neutral.bottom_right
}
fn size(&self) -> TilePosition {
self.neutral.size
}
fn blocking(&self) -> bool {
unimplemented!()
}
fn set_blocking(&mut self, blocked_areas: &[WalkPosition]) {
self.neutral.blocked_areas = blocked_areas.to_vec();
}
fn blocked_areas(&self) -> Vec<Rc<RefCell<Area>>> {
unimplemented!()
}
fn next_stacked(&self) -> *mut dyn Neutral {
unimplemented!()
}
fn put_on_tiles(&self) {
unimplemented!()
}
fn last_stacked(&self) -> Rc<dyn Neutral> {
unimplemented!()
}
}
};
}
pub struct ResourceData {
initial_amount: isize,
neutral: NeutralData,
}
pub trait Resource: Neutral {
fn initial_amount(&self) -> isize;
}
impl AsNeutral for ResourceData {}
neutral_delegate!(ResourceData);
impl ResourceData {
fn initial_amount(&self) -> isize {
self.initial_amount
}
fn amount(&self) -> usize {
unimplemented!()
}
}
pub struct Mineral {
initial_amount: isize,
neutral: NeutralData,
}
impl AsNeutral for Mineral {
fn is_mineral(&self) -> Option<&Mineral> {
Some(self)
}
}
impl Resource for Mineral {
fn initial_amount(&self) -> isize {
self.initial_amount
}
}
impl Mineral {
pub fn new(unit: &Unit, map: &Map) -> Self {
unimplemented!()
}
}
neutral_delegate!(Mineral);
pub struct Geyser {
initial_amount: isize,
neutral: NeutralData,
}
impl AsNeutral for Geyser {
fn is_geyser(&self) -> Option<&Geyser> {
Some(self)
}
}
impl Resource for Geyser {
fn initial_amount(&self) -> isize {
self.initial_amount
}
}
impl Geyser {
pub fn new(unit: &Unit, map: &Map) -> Self {
unimplemented!()
}
}
neutral_delegate!(Geyser);
pub struct StaticBuilding {
neutral: NeutralData,
}
impl AsNeutral for StaticBuilding {
fn is_static_building(&self) -> Option<&StaticBuilding> {
Some(self)
}
}
impl StaticBuilding {
pub fn new(unit: &Unit, map: &Map) -> Self {
unimplemented!()
}
}
neutral_delegate!(StaticBuilding);