# Architecture Overview

The OtterLib is composed of different static libraries:

  • OtterCore
  • OtterNetwork
  • OtterGraphic

In this section, we'll fly over the OtterCore architecture, which will allow you to create game components and their behavior.

# Core composition

classDiagram

class OtterCore
class Orchestrator
class SystemManager
class Factory
class EntityManager
class ComponentManager
class sparse_array
class light_array


OtterCore "1" *-- Factory
OtterCore "1" *-- Orchestrator
OtterCore "1" *-- SystemManager

Orchestrator "1" o-- Factory
Orchestrator "1" *-- EntityManager
Orchestrator "1" *-- ComponentManager

ComponentManager "many" *-- sparse_array
ComponentManager "many" *-- light_array

OtterCore : -init()
OtterCore : +engineStart()int
OtterCore : +registerComponents()
OtterCore : +registerSystem()

class Orchestrator {
createEntity()Entity

 +register_component()sparse_array~C~

 +get_components()sparse_array~C~


+add_component(Entity const &add, C&& component)optional~C~

+remove_component(Entity const&)
+remove_entity(Entity const &)
}

class sparse_array {
+operator[](size_t)reference_type
+size()size_type
+insert_at(size_type, C const&)reference_type
+isEmpty()bool
+erase(size_type)
+get_index(optional~C~ const &)size_type
}

class EntityManager {
+CreateEntity()Entity
+destroyEntity(Entity)
}

class SystemManager {
+registerSystem(F &&, Phase)
+operator(Orchestrator &, Phase)
}

class Factory {
+createFromFile(path, Orchestrator&)Entity
loadEntitiesFromFolder(path, Orchestrator&)vector~Entity~
}

# Core Details

# the core is made of many part; the essential one are:

  • dataManagement (storing game data)
  • Execution of function/script (system)
  • Factory to create scene of object without touching the code base
  • Abstraction of the EndPoint

# DataManagement

# In short, A class who store data and give methode to retrieve them when needed.

# This class:

  • Optimize the space the data take
  • Optimize the speed witch it take to retrive and store
  • Store many type of data
  • Give a user interface with the less boilerplating

# Implementation

  • The same data are stored in optized a storage

    • see sparse_array

  • Each group of data are stored in a generic way

    • see component_manager

  • Each data are assigned/linked to an Id (entity)

    • see EntityManager

  • All fonctionality a centralize in a user friendly interface

    • see Orchestrator

# Execution of function/script

# In short, this is the part who run function in a order to permit the game to run.

the fonction are write by the game developer and register in the engine.

Here - How to create a system -

# Factory

# A Class implementing a factory from json giving right to creating ensemble of object without coding

2 ways of creating object:

  • creating from a file
  • creating from folder

# abstract

# main

the main is already implemented. Actualy the main use 2 fonction who need to be implement by game developpeur

  • registerComponents

function where we register all component who will be used

  • registerSystems

function where we register all system who will be used

# Base loop

Implement a actual loop

sequenceDiagram
	Graphique->>ClientCore: Event detected
	ClientCore->>ClientNetwork: push message
	ClientNetwork-->ServerNetwork:Bit comunication
	ClientCore->>ClientNetwork: push RPC
	ClientNetwork-->ServerNetwork:Bit comunication
	ClientCore->>Graphique: DrawMe something
	ClientNetwork-->ServerNetwork:Bit comunication
	ServerNetwork ->> ServerCore:Recieving mesage
	ClientNetwork-->ServerNetwork:Bit comunication
	ServerNetwork ->> ServerCore:Recieving RPC
	ClientNetwork-->ServerNetwork:Bit comunication
	ServerCore->>ServerNetwork: Push Verified Updated Component
	ClientNetwork->>ClientCore: Receive Autorirator update
	ClientCore->>Graphique: DrawMe something
 	

int main() {
}```