@startuml

hide empty members
skinparam classAttributeIconSize 0
skinparam linetype polyline
skinparam shadowing false

interface Movable {
  + setMoveStrat(MoveStrategy)
  + genMoves(Room, Element) : List<Position>
}

abstract class Element {
- moveStrategy
+ genMoves(Room) : List<Position>
}

class ImovableBehaviour {}
class MovableBehaviour {}
class Civilian {}
class MeleeGuy {}
class RangedGuy {}

interface MoveStrategy {
+ genMoves(Room, Element)
}

abstract class ChaseStrat {
# addRayPos(Room, List<PosDist>, source: Position, target: Position) : double
# checkRayScent(Room, source: Position, scentPos: Position) : boolean
# convertToSortPosList(List<PosDist>, Position) : List<Position>
# chaseScent(Room, elemPos: Position, listPos: List<PosDist>)
}
class MeleeMoveStrat {}
class RangedMoveStrat {}
class ScaredMoveStrat {
- canSeeSkane(Room, skanePos: Position)
}

ImovableBehaviour .up.^ Movable
MovableBehaviour .up.^ Movable

Element -up-> ImovableBehaviour
Element -up-> MovableBehaviour

Civilian -up-^ Element
MeleeGuy -up-^ Element
RangedGuy -up-^ Element

ChaseStrat .up.^ MoveStrategy
ScaredMoveStrat .up.^ MoveStrategy
MeleeMoveStrat -up-^ ChaseStrat
RangedMoveStrat -up-^ ChaseStrat

MovableBehaviour -left-> MoveStrategy 

@enduml

