Object registration

prism makes use of a number of registries both for ease of use and for some core functionality. The primary interface for registering your own objects is prism.loadModule(), which expects a directory containing a module. Subdirectories are processed recursively.

An example module might look like this:

  • module/

    • actors/

      • goblins.lua

      • items/

        • potion.lua

        • sword.lua

    • systems/

      • .lua

Below is a walk through of how and when each type of object is loaded.

module.lua

module.lua is ran. You can use it to create move types with Collision.assignNextAvailableMovetype(), or to perform other miscellaneous set up.

Components

Files in module/components/ are assumed to return a single Component each. These are loaded into prism.components.

modules/components/pushable.lua
--- @class Pushable : Component
--- @overload fun(): Pushable
local Pushable = prism.Component:extend "Pushable"

return Pushable
Targets

All files in module/targets/ are ran. Targets must be registered by providing a name and a factory function to prism.registerTarget(); these are loaded into prism.targets. Factories can accept parameters.

module/targets/movetarget.lua
prism.registerTarget("MoveTarget", function(range)
  return prism.Target():isPrototype(prism.Vector2):range(range)
end)
Cells

All files in module/cells/ are ran. Cells must be registered by providing a name and a factory function to prism.registerCell(); these are loaded into prism.cells. Cell.fromComponents() is useful here.

Caution

Factories for cells and actors can have parameters, but ensure they are optional!

module/cells/floor.lua
prism.registerCell("Floor", function()
  return prism.Cell.fromComponents {
      prism.components.Name("Floor"),
      prism.components.Drawable(271),
      prism.components.Collider{ allowedMovetypes = { "walk" } },
  }
end)
Actions

Files in module/components/ are assumed to return a single Action each. These are loaded into prism.actions.

Actors

All files in module/actors/ are ran. Actors must be registered by providing a name and a factory function to prism.registerActor(); these are loaded into prism.actors. Actor.fromComponents() is useful here.

module/actors/goblins.lua
prism.registerActor("Goblin", function(health)
  return prism.Actor.fromComponents {
    -- goblin stuff
    prism.components.Health(health or 10)
  end
end)

prism.registerActor("GoblinArcher", function()
  local goblin = prism.actors.Goblin()

  local inventory = goblin:expect(Inventory)
  inventory:addItem(prism.actors.Bow())

  return goblin
end)
Messages

Files in module/messages/ are assumed to return a single Message each. These are loaded into prism.messages.

Decisions

Files in module/decisions/ are assumed to return a single Decision each. These are loaded into prism.decisions.

Systems

Files in module/systems/ are assumed to return a single System each. These are loaded into prism.systems.