@startuml DiagramaDeAplicacion

class App {
    - WorldController worldController
    - World gameWorld
    - WorldView gameWorldView

    + main()
    - initializeGame()
    - runGameCycle()
}

package "Model" {
    class World {
        - Map map
        - Entity[] entities
        - Time time

        + simulateCycle()
        + addEntity(Entity newEntity)
        - updateTime()
    }

    class Time {
        - TimesOfDay timeOfDay
        - int currentTime

        + advanceTime()
        + setTimeOfDay(int currentTime)
        - resetDay()
    }

    class Map {
        - Tile[][] tiles

        + updateTile(Point point, Tile newTile)
        + getTile(Point point)
    }

    class Tile {
        - TileTypes type

        + changeType(TileTypes newType)
        + getType() 
    }

    abstract class Entity {
        - Point position
        - Transport transportInUse

        + moveTo(Point newPosition)
        + changeTransport(Transport newTransport)
        + getCurrentTransport()
    }

    class Character extends Entity {
        - CharacterType characterType
        - Transport[] availableTransports

        + getAvailableTransports()

    }

    class Transport {
        - TransportTypes type
        - Tile[] allowedTiles

        + getAllowedTiles()
    }

    class Point {
        - int x
        - int y

        + getLocation()
        + setLocation(int x, int y)
    }

    enum TileTypes {
        Floor
        Sand
        Wall
        ShortGrass
        MediumGrass
        TallGrass
        Water
        DeepWater
        Mountain
    }

    enum TimesOfDay {
        Morning
        Afternoon
        Evening
        Night
    }

    enum TransportTypes {
        Foot
        Horse
        Boat
        MagicCarpet
    }

    enum CharacterType {
        Playable
        NonPlayable
    }
}

package "View" {
    class WorldView {
        - String[][] View
        + showWorld(World world)
        - showWorldTime(Time time)
        - showWorldMap(Map map)
        - showWorldEntities(Entity[] entities)
    }
}

package "Controller" {
    class WorldController {
        - World world
        - WorldView worldView

        + initializeGame()
        - initializeWorldMap()
        - initializeWorldEntities()
        - runGameCycle()
        - moveCharacter(Character character)
        - getCharacterMovement(Character character)
        - getRandomCharacterMovement()
        - getUserInput()
        - processUserInput(char input)
    }
}

World --> Map
World --> Entity
World --> Time
Map --> Tile
Tile --> TileTypes
Entity --> Point
Entity --> Transport
Transport --> TransportTypes
Time --> TimesOfDay
Character --> CharacterType
WorldController --> World
WorldController --> WorldView
App --> WorldController
@enduml