LunyScript Architecture

Design Principles

  1. Convention over configuration: Sane defaults, minimal boilerplate
  2. Explicit is better than implicit: Clear contracts over magic behavior
  3. Performance by default: Fast path should be the easy path
  4. Progressive disclosure: Simple things simple, complex things possible
  5. Engine parity: Feature set must work identically across all supported engines
  6. Fault Tolerant: No exceptions, visual error display, hold on to debug information (Name, ID)

Core Layers

LunyScript follows a three-layered architecture model:

  1. LunyEngine abstraction layer (interfaces, proxies, observers)
  2. LunyScript block execution engine (Sequences, StateMachine, BehaviorTree)
  3. Engine Adapters & Bridges (API Services)

1. Luny

Namespace: Luny

2. LunyScript

Namespace: LunyScript

3. Engine Adapters & Bridges (engine-native glue)

Namespaces: LunyScript.Unity, LunyScript.Godot, ..

Size Notes


Namespace Usage

using Luny;                    // Implementers extending core (abstractions only)
using LunyScript;              // Everyone - the main user-facing API
using LunyScript.Unity;        // Unity projects - bootstrap and setup only

// User code - derived from LunyScript, must implement abstract Build() method.
// LunyScripts are front-loaded and converted into runtime-optimized block patterns.
// GC or "Find" implications are of little concern since scripts convert when 'loading' the game/scene.
When.Collision.With("ball")
    .Begins(Audio.Play("kick"));

// Implementer code - uses Luny abstractions, registers automatically
class MyObserver : Luny.ILunyEngineObserver {
    // Implement engine lifecycle methods as needed:
    void OnEngineStartup() {}
    void OnEnginePreUpdate() {}
    void OnEngineFixedStep(Double fixedDeltaTime) {}
    void OnEngineUpdate(Double deltaTime) {}
    void OnEngineLateUpdate(Double deltaTime) {}
    void OnEnginePostUpdate() {}
    void OnEngineShutdown() {}
    void OnSceneLoaded(ILunyScene loadedScene) {}
    void OnSceneUnloaded(ILunyScene unloadedScene) {}
    // ...
}

Key Architectural Decisions

Abstraction Decoupling

Decision: Decouple low-level abstractions (interfaces/contracts) from concrete implementations (coroutines, FSMs, BTs)

Rationale:

Execution Model


Critical Architectural Concerns

1. ✅ Object/Node/Actor Registration System (Implemented)

Requirements:

Considerations:

2. ✅ Event Ordering Contract (Implemented)

Requirements:

Considerations:

3. ✅ Execution Tracing & Profiling Hooks (Implemented)

Requirements:

Design approaches:

Data to expose:

4. ✅ Memory Management Strategy (Verified)

Requirements:

5. Error Handling & Recovery

Requirements:

6. Serialization & Hot Reload

Desirable:

7. Concurrency Model

Requirements:

Desirable:

8. API Versioning & Compatibility

Requirements:

Desirable: