Files

77 lines
2.1 KiB
Go

package scripting
import (
"aego/contracts/persistence"
"aego/contracts/scriptevents"
"aego/contracts/scriptfields"
"aego/contracts/scriptpool"
"aego/contracts/scriptwait"
"aego/contracts/signals"
"aego/engine"
"aego/engine/module"
scriptstdlib "aego/modules/scripting/stdlib"
scriptsystems "aego/modules/scripting/systems"
"aego/scene/scriptcomp"
"aego/script/stdlib"
)
const ID = "script"
type Module struct {
opt stdlib.Options
}
func New(opt stdlib.Options) Module {
return Module{opt: opt}
}
func (Module) Info() module.Info {
return module.Info{ID: ID, Version: engine.Version, Builtin: true, DisplayName: "Aego Script", DocsOrder: 10, DocsIcon: "cat.scripts", DocsGroup: "script"}
}
func (m Module) Register(r *module.Registry) error {
if err := module.Component[scriptcomp.ScriptComponent](r, scriptcomp.Options()...).
Category("Scripts").
Display("Scripts").
Icon("comp.script").
NodeIcon(20).
ScriptNone().
Err(); err != nil {
return err
}
r.Types().SetOverlay(scriptcomp.Overlay{})
if b := r.Bindings(); b != nil {
scriptstdlib.Install(b, m.opt)
}
r.Use(scriptsystems.New())
r.Finalize(bindEvents)
r.Finalize(bindMethods)
registerDev(r)
return nil
}
func (Module) AttachWorld(ctx *module.AttachContext) error {
if !ctx.Play || ctx.World == nil {
return nil
}
ctx.World.SetView(scriptevents.ServiceID, scriptsystems.EventSink(ctx.World))
ctx.World.SetView(scriptfields.ServiceID, scriptsystems.FieldAccess(ctx.World))
ctx.World.SetView(scriptwait.ServiceID, scriptsystems.Waker(ctx.World))
ctx.World.SetView(signals.ServiceID, scriptsystems.Hub(ctx.World))
ctx.World.SetView(scriptpool.ServiceID, scriptsystems.Lifecycle(ctx.World))
ctx.World.SetView(persistence.ScriptsID, scriptsystems.Persist(ctx.World))
return nil
}
func (Module) DetachWorld(ctx *module.AttachContext) {
if !ctx.Play || ctx.World == nil {
return
}
ctx.World.RemoveService(scriptevents.ServiceID)
ctx.World.RemoveService(scriptfields.ServiceID)
ctx.World.RemoveService(scriptwait.ServiceID)
ctx.World.RemoveService(signals.ServiceID)
ctx.World.RemoveService(scriptpool.ServiceID)
ctx.World.RemoveService(persistence.ScriptsID)
}