@startuml Pokemon

package data {
    package elements {
        class Element
        class CollidingElement
    }

    package options {
        class BattleOptionsModel
        class FightOptionsModel
        class Option
        class OptionsMenuModel
    }

    package pokemon {
            class Pokemon
            abstract class PokemonExperience
            class PokemonMove
            class PokemonSpecies
            class PokemonStats
            class PokemonType
        }

    class BattleModel
    class Grass
    class Obstacle
    class Player
    class PokemonTile
    class Position
    class Rect
    class Tile
    class WorldModel
}

package gui { 
    package renderers {
        package bar {
            abstract class BarRenderer
            class ExperienceBarRenderer
            class HealthBarRenderer
        }

        package menu {
            class BattleMenuRenderer
            class BattleOptionsMenuRenderer
            class FightOptionsMenuRenderer
            abstract class OptionsMenuRenderer
}

        package "pokemon " {
            class PokemonRenderer
            class PokemonInfoRenderer
        }

        package text {
            class CharRenderer
            class TextRenderer
        }

        class BackgroundRenderer
        class PlayerRenderer

        interface Renderer
    }

    class BattleView
    class GameView
    class Sprite
    class Image
    class WorldView
}

package rules {
    package commands {
        package optionsmenu {
            class OptionsMenuDownCommand
            class OptionsMenuGoBackCommand
            class OptionsMenuLeftCommand
            class OptionsMenuRightCommand
            class OptionsMenuUpCommand
        }

        package player {
            class PlayerMoveDownCommand
            class PlayerMoveLeftCommand
            class PlayerMoveRightCommand
            class PlayerMoveUpCommand
        }

        class ChoseOptionCommand
        interface Command
        class DoNothingCommand
        class QuitCommand
        class UsePokemonMoveCommand
    }

    class BattleController
    class GameController
    class OptionsMenuController
    class WorldController
}

class Game

Game *-- GameView
Game *-- GameController

GameController *-- GameView

BattleModel *-- Pokemon
BattleModel *-- OptionsMenuModel

BattleController *-- BattleView
BattleController *-- BattleModel
BattleController *-- OptionsMenuController

BattleView *-- BattleModel
BattleView *-- BackgroundRenderer
BattleView *-- PokemonRenderer
BattleView *-- PokemonInfoRenderer
BattleView *-- BattleMenuRenderer

WorldModel *-- Player
WorldModel *-- CollidingElement
WorldModel *-- Tile

WorldController *-- WorldView   
WorldController *-- WorldModel  

WorldView *-- PlayerRenderer
WorldView *-- BackgroundRenderer
WorldView *-- WorldModel

Element <|-- CollidingElement
Element *-- Position

CollidingElement <|-- Player
CollidingElement <|-- Obstacle
CollidingElement *-- Rect

Player *-- Pokemon 

Pokemon *-- PokemonSpecies
Pokemon *-- PokemonStats
Pokemon *-- PokemonMove

PokemonMove *-- PokemonType

PokemonSpecies *-- PokemonType

OptionsMenuModel *-- Option
OptionsMenuModel <|-- BattleOptionsModel
OptionsMenuModel <|-- FightOptionsModel

Command <|-- DoNothingCommand
Command <|-- PlayerMoveDownCommand
Command <|-- PlayerMoveLeftCommand
Command <|-- PlayerMoveRightCommand
Command <|-- PlayerMoveUpCommand
Command <|-- UsePokemonMoveCommand
Command <|--  OptionsMenuDownCommand
Command <|--  OptionsMenuGoBackCommand
Command <|--  OptionsMenuLeftCommand
Command <|--  OptionsMenuRightCommand
Command <|--  OptionsMenuUpCommand
Command <|--  QuitCommand

Sprite *-- Image

Renderer <|-- BarRenderer
Renderer <|-- BackgroundRenderer
Renderer <|-- BattleMenuRenderer
Renderer <|-- OptionsMenuRenderer
Renderer <|-- PlayerRenderer
Renderer <|-- PokemonInfoRenderer
Renderer <|-- PokemonRenderer
Renderer <|-- CharRenderer
Renderer <|-- TextRenderer
Renderer <|-- TileRenderer

BarRenderer *-- Position
BarRenderer *-- Sprite
BarRenderer <|-- ExperienceBarRenderer
BarRenderer <|-- HealthBarRenderer

BackgroundRenderer *-- Sprite
BackgroundRenderer <|-- BattleOptionsMenuRenderer
BackgroundRenderer <|-- FightOptionsMenuRenderer

BattleMenuRenderer *-- Sprite
BattleMenuRenderer *-- OptionsMenuRenderer

PlayerRenderer *-- Sprite
PlayerRenderer *-- Player

PokemonInfoRenderer *-- Position
PokemonInfoRenderer *-- Sprite
PokemonInfoRenderer *-- TextRenderer
PokemonInfoRenderer *-- ExperienceBarRenderer
PokemonInfoRenderer *-- HealthBarRenderer

PokemonRenderer *-- Pokemon
PokemonRenderer *-- Sprite

CharRenderer *-- Position
CharRenderer *-- Sprite

TextRenderer *-- CharRenderer

TileRenderer *-- Tile
TileRenderer *-- Sprite

@enduml