#
Technical Overview
Two map types get generated procedurally where the town map contains multiple event maps. While there is some overlap there is a split between the required functionality and the visual representation of the underlying information.
When a new game starts the town map is generated and populated with a pseudo-random selection of event nodes. When a play selects an event node on the town map and starts an expedition the map zooms in to the node as the details get generated and drawn onto the screen.
#
Expedition
The player starts an expedition by selecting the location on the town map.
#
Preparation
MVP: Skips this phase: The player is presented with the town map and possible expeditions to choose from.
The player uses downtime to move across the map and or gather resources.
High-level object overview:
%%{init: { 'theme': 'forest', 'darkMode': true } }%% classDiagram TheTown --> TownMap TheTown --> TownGrid TheTown --> EventGrid TheTown --> EventMap TownMap *-- TownNode TownGrid *-- TownHex EventMap *-- EventNode EventGrid *-- EventHex TownMap <--> TownCreator TheTown --o TownCreator TownGrid <-- TownCreator EventGrid <-- EventCreator TheTown --o EventCreator EventMap <--> EventCreator TownMap : path [] TownMap : road [] TownMap : nodes {} TownMap : get_node(vec2) TownMap : set_node(vec2) TownGrid : path {} TownGrid : road {} TownGrid : grid HexGrid TownGrid : get_hex(vec2) TownGrid : get_path(from, to) EventMap : path [] EventMap : road [] EventMap : nodes {} EventMap : get_node(vec2) EventMap : set_node(vec2) EventGrid : path {} EventGrid : road {} EventGrid : grid HexGrid EventGrid : get_hex(vec2) EventGrid : get_path(from, to) TownHex : type TownHex : barrier TownHex : obstacle TownHex : coords TownHex : position TownNode : size TownNode : links TownNode : region TownNode : coords TownNode : position EventHex : type EventHex : barrier EventHex : obstacle EventHex : coords EventHex : position EventNode : size EventNode : type EventNode : group EventNode : coords EventNode : position
#
Select an Event
In the preparation phase, the user is presented with a town map and has a certain amount of time to complete the daily tasks.
For the MVP the only available progress is expedition events.
%%{init: { 'theme': 'forest', 'darkMode': true } }%% sequenceDiagram participant Mouse participant TownEvents Mouse-->>TownEvents: enters event node TownEvents-->>TheTown: focus event (coords) TheTown-->>Overlay: focus event (coords) Overlay->>Overlay: display event info Mouse-->>TownEvents: leaves event node TownEvents-->>TheTown: clear event (coords) TheTown-->>Overlay: clear event (coords) Overlay->>Overlay: clear event info opt when focused Mouse-->>TownEvents: click event node TownEvents-->>TheTown: select event (coords) TheTown-->>Overlay: select event (coords) Overlay->>Overlay: open confirm dialog alt when confirmed Overlay->>Overlay: close confirm dialog Overlay->>TheTown: start select event (coords) else when canceled Overlay->>Overlay: close confirm dialog Overlay->>TheTown: cancel select event (coords) end end
#
Shopping Event
TODO Implementm Not part of the MVP
#
Research Event
TODO Implementm Not part of the MVP
#
Expedition Event
Expedition events start with the player hovering the mouse over an event on the town map and then deciding to select the event. Once the event is started the town map fades out while zooming in and enters the expedition mode.
Entering the expedition mode means the start of the expedition loop. Where the goal is?
%%{init: { 'theme': 'forest', 'darkMode': true } }%% sequenceDiagram participant EventsMap participant TownEvents participant TheTown participant Overlay Overlay-->>TheTown: set select event (coords) Overlay-->>Overlay: hide TownHud Overlay-->>Overlay: show EventHud TheTown-->>TownEvents: start event (coords) TownEvents-->TownEvents: Hide Town Grid & Gfx TheTown-->>EventsMap: start event (coords) EventsMap-->EventsMap: Show Event Grid & Gfx
%%{init: { 'theme': 'forest', 'darkMode': true } }%% sequenceDiagram participant EventsMap participant TheTown participant Overlay TheTown-->>EventsMap: start event (coords) opt pause menu EventsMap-->>Overlay: pause expedition Overlay->>Overlay: open pause dialog alt when continue Overlay->>Overlay: close pause dialog Overlay->>TheTown: resume expedition else when run to safety Overlay->>Overlay: close pause dialog Overlay->>TheTown: escape expedition end end
#
Generator Configs
#
Config v1
Big Map (+-90 Nodes)
var cfg = {
"zoom": 16,
"nodes": 192,
"culler": 0.35,
"spread": Vector2(620.0, 40.0),
"type_a_dist": 7680000,
"type_a_offset": 384,
"type_b_dist": 25600000,
"type_b_offset": 512,
"type_c_dist": 76800000,
"type_c_offset": 768,
}
Small Map (+-60 Nodes)
var cfg = {
"zoom": 14,
"nodes": 96,
"culler": 0.25,
"spread": Vector2(160.0, 20.0),
"type_a_dist": 5120000,
"type_a_offset": 384,
"type_b_dist": 12800000,
"type_b_offset": 512,
"type_c_dist": 51200000,
"type_c_offset": 768,
}
#
Config v2
Big Map (+-60 Nodes)
const BIG_MAP = {
"zoom": 16,
"nodes": 128,
"culler": 0.35,
"spread": Vector2(620.0, 40.0),
"grid_size": Vector2(1280.0, 720.0),
"center": 7680000,
"center_offset": 384,
"outer": 25600000,
"outer_offset": 512,
"edge": 51200000,
"edge_offset": 768,
}
Small Map (+-30 Nodes)
const SMALL_MAP = {
"zoom": 14,
"nodes": 56,
"culler": 0.25,
"spread": Vector2(160.0, 20.0),
"grid_size": Vector2(1024.0, 576.0),
"center": 2560000,
"center_offset": 128,
"outer": 7680000,
"outer_offset": 256,
"edge": 25600000,
"edge_offset": 512,
}