Howto:Creating a simple modding framework

From FlightGear wiki
Jump to navigation Jump to search
This article is a stub. You can help the wiki by expanding it.


Status

Objective

Background

Directory Structure

Mods should be using their own directory structure, resembling $FG_ROOT (the base package), e.g.:

  • Aircraft
  • GUI
  • Textures
  • Sounds
  • Nasal

etc

Requirements

  • register hooks to invoke callbacks for specific simulator/addon events
  • mutual dependencies

Versioning

1rightarrow.png See FlightGear Version Check for the main article about this subject.

Prototype

The protoype will be set up like this:

  • an optional Nasal submodule stored in $FG_ROOT/Nasal/modding
  • mods live under $FG_ROOT/Mods, each in its own folder
  • each mod folder's structure will basically resemble the structure of the base package, with its sub-folders for resources like scripts, textures, sounds etc
  • each mod will have a top-level specs.mod file
  • each specs.mod file is a conventional Nasal file that inherits from an interface class living in the Mod namespace
  • the specs.mod file implements routines for enabling/disabling and configuring the mod


Proof of Concept

The following snippet of code assumes that you put it into $FG_ROOT/Nasal/mod/mod.nas In addition, you need to add a folder to $FG_ROOT named Mods, beneath this folder you can add other folders - with each folder being treated as a separate "mod".

##
# $FG_ROOT/Nasal/mod/loader.nas

var ModdingRegistry = {};

var ModdingInterface = {
 new: func() {},
 del: func() {},
 register: func(name) {
 var slotNotEmpty = contains(ModdingRegistry, name);
 if (slotNotEmpty) {
 print("Warning: Overwriting/re-adding mod:", name);
 ModdingRegistry[name].del(); # invoke the destructor of the mod
 # ModdingRegistry[name] = 
 }

 },
};

var fgroot = getprop("/sim/fg-root");
var modFolder = fgroot ~ '/'~ getprop('/sim/modding/mod-directory','Mods/');

# http://wiki.flightgear.org/Nasal_library#directory.28.29
var modDirectories = directory( modFolder );

# debug.dump( modDirectories );

foreach(var mod; modDirectories) {
print("Mod directory found:", mod);
}

## invoke:
# init code
# setup  code
# loading code
# clean up code