ModuleSystem

Revision as of 10:31, 5 April 2024 by Watertoon (talk | contribs) (Start a general synopsis)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

ModuleSystem is the unofficial name of Nintendo EPD's latest game engine, based on the name of the singular sead::Task at the heart of the mainloop. It's actor system appears to be a sequel in design to KingSystem, the engine created for The Legend of Zelda: Breath of the Wild. ModuleSystem appears to have replaced both ActionLibrary and LunchPack2 as the new primary engine for Nintendo EPD's and NST's game development teams. While each game shares a common set of engine features, each series appears to have a custom fork extending the engine with varying degrees of game specific functionality.

Games

Name Extension/Differences summary
Nintendo Switch Sports Graphics Module contains a Mii data manager.
Splatoon 3 ModuleSystem is extended to thunder::ModuleSystem, notably adding the ability to run the CPU side of the mainloop multiple times per frame. Omits gamedata for a custom save system.
The Legend of Zelda: Tears of the Kingdom Major version up from Splatoon 3 and Nintendo Switch Sports. Some engine namespaces were updated between version 1.0.0 and 1.1.0. Includes the TerrainModule and LODModule, while most other games only contain references to these systems.
Super Mario Wonder Some libraries are newer than Tears of the Kingdom, some are older.
Mario Vs Donkey Kong Appears to be slightly behind version of Tears of the Kingdom. IActor has a new Stasus state used when swapping actors between "combined scenes". Replaces physics handling with a custom 2d physics engine, yet leaves the PhysicsModule with an unused version of the phive library implemented on top of PhysX instead of Havok.

Namespaces

The top level namespace for ModuleSystem is engine. Sub-namespaces typically include a module wrapping a system for a dedicated purpose, whether unique to the engine or contracted out to an external library. Interfaces to the system are typically provided to Actors or Scenes.

Namespace Description
actor Implements the actor system.
ai Wraps the ai library. Integrates with PreActors through ActorAIGroups, ActorBase through the AIComponent, and IScene through the SequenceComponent.
as Wraps the as library. Integrates with ActorBase through the RetargetScaleComponent, ASInfoComponent, ASOptimizeComponent, and ASComponent.
bake Wraps the bake library.
banc Implements BancEntities via the BancModule. Banc handles the parsing of map units into PreActors, actor ai groups, rails, placement groups, far delete groups, and custom game extensions.
bb (Unofficial) Wraps the bb library, responsible for managing bb::Blackboards. Integrates with ActorBase through BlackboardComponentActor and IScene with BlackboardComponentScene.
camera Implements a camera system. Integrates with ActorBase via the CameraComponent.
component Houses all engine components from the other namespaces for engine::actor::ActorBase and engine::scene::IScene.
controller Implements a controller manager.
debug Stubbed in retail. Seemingly implements a debug menu called "ClickMenu".
effect Wraps shaft::effect for managing effect resources.
erepo (unofficial) Wraps the erepo library for PlayReport management.
event Implements an event system on top of the evfl library for Event Flows and Timelines, and the sdk movie library for prerendered video. Integrates with ActorBase through the BeforehandLoadEventComponent, EventMemberComponent, and EventPerformerComponent.
framework Implements a minor extension to sead::GameFrameworkNx, and the SpStepRateMgr.
gamedata Wraps the gmd library for managing a global, computable, and savable hash map of game data.
graphics (unofficial) Wraps the gsys library, which extends the agl library. Integrates with ActorBase through the ModelComponent and ModelBindComponent.
lod Implements a level of detail system. Integrates with ActorBase through the LODComponent.
lua Stubbed in retail. Provides lua support for debugging purposes.
module Implements the ModuleSystem sead::Task, as well as the IModule interface.
physics Wraps the phive library. Integrates with ActorBase through the PhysicsComponent.
rail Implements the RailMgr, manages rails parsed from banc.
reaction Implements a system for triggering reactions through reaction actors and XLink commands somehow (unknown at time of writing). Integrates with ActorBase via the ReactionComponent.
resource Wraps the ares library and implements ares::IApplicationImpl to provide asynchronous file resource management through ResourceBinders. Also wraps the pp library and implements pp::GfMgrCallback to provide a general parameter system via hierarchical Documents.
rsdb Wraps the pp::rsdb sub library. Manages a set of engine as well as game extended resource databases.
rumble Implements a rumble call system to allow sending vibrations to controllers.
scene Implements the scene system.
sound Wraps the alto library, which extends the aal library, which extends the aal::atom sub library.
system Implements the RomConfigMgr and PauseMgr
terrain Wraps the tera library. Provides terrain management.
transceiver (unofficial) Implements a transceiver based message systems. Messages can be sent to directly to a destination, or to a whole set of listeners.
ui Wraps the eui library, which in turn extends nn::ui2d. Provides ui processing and resource management through a layout category based system.
xlink Wraps the xlink2 library. Implements an XLink PreActor Manager. Integrates with ActorBase through the ELinkComponent, SLinkComponent, XLinkComponent, and XLinkSubComponent.

Non-Canon Namespaces

These are engine namespaces, that for one reason or another, appear to be game specific extensions.

Name Game(s) Description
coll2d Mario Vs Donkey Kong Implements a 2d collision system the game uses instead of phive.
level Mario Vs Donkey Kong
message Mario Vs Donkey Kong
move2d Mario Vs Donkey Kong Implements a 2d movement system.

Main Loop

The mainloop is implemented as a single sead::Task in the standard sead::GameFrameworkNx mainloop. The mainloop consists of 4 sead::DependencyJobGraph's submitted and ran in a sead::DependencyJobWorkerMgr in succession. These are unofficially called as of writing BeforeActor, AfterActor, GSys, and GSysCalcGpu.