point-n-clicky. feely-touchy. photoshop powered. fabulous.
The engine is based on Scenes loaded from .psd
files and can be scripted in Moonscript and Lua.
contains global assets (for now, the font).
contains 3rd party libraries. So far vrld's HUMP and HC are used, alongside Evine's artal.
contains the game code.
Files in this directory are specific to the game using the engine and except for Scenes no further structure is imposed.
contains the game's Scenes and shared mixins in the common
directory.
See Scenes below.
a Scene is a single gameplay sequence, contained on one (scrollable) screen. It can be navigated by the player using mouse controls and may contain objects and characters to interact with.
A Scene is defined via a directory in the scenes
game directory.
Every Scene consists of one photoshop document, main.psd
, whose layer structure is loaded and rendered.
Layers in a scene main.psd
may load Mixins using a mixin directive.
A mixin directive has the following format:
... mixin_name(p1,p2,...) ...
The directive consists of the mixin name and any number of parameters, seperated by commas and enclosed in parenthesis. It may be preceded and followed by any other string of text.
Mixins are a way of giving behaviours or distinct appearances to elements of a scene.
When a directive is encountered, the Mixin of the given name is searched. The following locations are searched for the Mixin:
- game/scenes/scene-name/mixin-name.EXT
- game/scenes/scene-name/init.EXT
- game/scenes/common/mixin-name.EXT
- game/scenes/common/init.EXT
The init
files above are loaded and expected to return a table;
if there is a value associated with the key mixin-name it is used as the mixin.
The other files are loaded if they exist and their return value is used directly.
The locations above are attempted in order and the first working path is used. Failure to require a module will be ignored.
If a Mixin cannot be loaded it is ignored and an error is logged in the console in debug mode.
When a mixin directive is encountered, the Mixin is loaded and called with the following arguments:
- the table representing the Scene Node that contains the directive
- the PSDScene instance loading the Mixin
- any additional arguments passed to the mixin via the directive (as strings)
the Mixin is expected to modify the Scene Node to achieve the desired results.
It may define draw
and update
methods for the node that override the default behaviour (drawing the binary pixel data).
The Mixin
parent class and the wrapping_
helper function defined in the util
module allow to write Mixins in moonscript.
The Mixin
parent class set's up hot-reloading and provides helper methods;
the wrapping_
helper function may be applied to a moonscript class to make the constructor wrap it's first argument as the instance table instead of creating a new one.
Example: game/common/mymixin.moon
import { wrapping_, Mixin } from require "util"
wrapping_ class MyMixin extends Mixin
new: (scene, ...) =>
super!
-- @ is the scene node
update: (dt) =>
-- update node
draw: =>
-- override default draw method
Scene Nodes are nodes in a Scene's rendering tree. They follow the structure given by artal but are nested in a tree. Integer keys inside a Scene Node are reserved for children nodes.
ox
,oy
: negative integers representing the offset of theimage
s origin.name
: the full layer name.image
: if available, a LÖVEImage
instance of the Layer's pixel data.type
: one of"empty"
,"image"
or"open"
.mask
: a table containing a list of vector mask paths underpaths
. Eachpath
is a sequence of Control Points, containg coordinates pairs (x
,y
) at the three keyspre
,cp
andpost
.
If a Scene Node contains a draw
method, it is invoked with two parameters:
-
draw_group
, a bound method of the PSDScene instance. Draws a group of Scene Nodes:draw: (draw_group, draw_layer) => draw_group @ -- no-op for layer groups
-
draw_layer
, a bound method of the PSDScene instance. Draws a single layer owning animage
key.
If no draw
method is defined and the Scene Node has a key image
, it is drawn at (-ox, -oy)
.
Otherwise, if the type
of the Node is "open"
, draw_group
is applied to it.
Updating works like Drawing, except:
- the method name is
update
, - there is no
image
key or anything similar, - there are no parameters to
update
exceptdt
.