<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://developer.vellocetsoftware.com/index.php?action=history&amp;feed=atom&amp;title=Grimwar%2FVSig</id>
	<title>Grimwar/VSig - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://developer.vellocetsoftware.com/index.php?action=history&amp;feed=atom&amp;title=Grimwar%2FVSig"/>
	<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/VSig&amp;action=history"/>
	<updated>2026-08-25T07:57:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/VSig&amp;diff=26&amp;oldid=prev</id>
		<title>DocumentationBot: Publish SDK documentation</title>
		<link rel="alternate" type="text/html" href="https://developer.vellocetsoftware.com/w/index.php?title=Grimwar/VSig&amp;diff=26&amp;oldid=prev"/>
		<updated>2026-08-25T05:12:57Z</updated>

		<summary type="html">&lt;p&gt;Publish SDK documentation&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{GameNav}}&lt;br /&gt;
{{Notice|title=Version target|This guide covers the VSig compiler and standard library included with Vellocet SDK 1.0.3.}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;VSig&amp;#039;&amp;#039;&amp;#039; is Grimwar&amp;#039;s map-logic language. A VSig program listens to entity or game outputs, changes state, calls entity inputs, schedules work, and exchanges bounded signals with VMods. The Map Exporter validates and compiles it into the map package.&lt;br /&gt;
&lt;br /&gt;
Use VSig for map orchestration. Use an entity marker when the thing has a position, volume, renderer, collider, or native game behavior. Use [[Grimwar/VMod|VMod]] for server rules that need players, commands, persistent storage, permissions, or game-mode control.&lt;br /&gt;
&lt;br /&gt;
== Create the map script ==&lt;br /&gt;
&lt;br /&gt;
A map scene and its VSig source share a name and folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Assets/CustomContent/Maps/Range/Range.unity&lt;br /&gt;
Assets/CustomContent/Maps/Range/Range.vsig&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Create a script with &amp;#039;&amp;#039;&amp;#039;Assets &amp;gt; Create &amp;gt; Vellocet &amp;gt; SDK &amp;gt; VSig Script&amp;#039;&amp;#039;&amp;#039;. A marker Inspector can also create or open the current scene&amp;#039;s file and insert refs for selected entities.&lt;br /&gt;
&lt;br /&gt;
Install syntax support from &amp;#039;&amp;#039;&amp;#039;SDK Workbench &amp;gt; Project &amp;gt; VSig Editor Support&amp;#039;&amp;#039;&amp;#039;. Unity still performs the authoritative parse and validation.&lt;br /&gt;
&lt;br /&gt;
== First working script ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
scene &amp;quot;Example&amp;quot;&lt;br /&gt;
&lt;br /&gt;
ref trigger: trigger_multiple match Triggers/Entrance&lt;br /&gt;
ref door: func_door match Doors/MainDoor&lt;br /&gt;
&lt;br /&gt;
var door_start: DoorEntityState = null&lt;br /&gt;
&lt;br /&gt;
once on map.ready:&lt;br /&gt;
    door_start = door.state&lt;br /&gt;
&lt;br /&gt;
on trigger.start_touch:&lt;br /&gt;
    door.open&lt;br /&gt;
&lt;br /&gt;
on trigger.end_touch_all:&lt;br /&gt;
    door.restore(door_start)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The two &amp;lt;code&amp;gt;ref&amp;lt;/code&amp;gt; declarations bind authored markers to short aliases. &amp;lt;code&amp;gt;map.ready&amp;lt;/code&amp;gt; runs after server-side map entities are bound. The trigger&amp;#039;s &amp;lt;code&amp;gt;start_touch&amp;lt;/code&amp;gt; output calls the door&amp;#039;s &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt; input. The script captures the starting door state once and restores it after the last toucher leaves.&lt;br /&gt;
&lt;br /&gt;
Marker Inspectors list the inputs, outputs, state type, and access rules for that entity class. Use that contract instead of guessing a signal name.&lt;br /&gt;
&lt;br /&gt;
== Refs and groups ==&lt;br /&gt;
&lt;br /&gt;
A ref can match one hierarchy path or a wildcard:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ref main_door: func_door match BuildingA/Door&lt;br /&gt;
ref spawn_doors: func_door match SpawnDoors/Door*&lt;br /&gt;
&lt;br /&gt;
group exits:&lt;br /&gt;
    main_door&lt;br /&gt;
    spawn_doors&lt;br /&gt;
&lt;br /&gt;
on round.post_round:&lt;br /&gt;
    exits.close&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An input sent to a wildcard ref or group broadcasts to every match. Property reads and state capture require exactly one entity.&lt;br /&gt;
&lt;br /&gt;
Stable GameObject names make refs readable and keep wildcard matches predictable. A marker&amp;#039;s hidden runtime ID is managed by the SDK; VSig authoring uses the object hierarchy and entity class.&lt;br /&gt;
&lt;br /&gt;
== Values and expressions ==&lt;br /&gt;
&lt;br /&gt;
Primitive types are &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt;. Entity state uses the state type declared by its marker contract. Durations accept seconds or milliseconds, including &amp;lt;code&amp;gt;1.5s&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;250ms&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
seed 1847&lt;br /&gt;
&lt;br /&gt;
const max_score: int = 10&lt;br /&gt;
var score: int = 0&lt;br /&gt;
var title: string = &amp;quot;Arena&amp;quot;&lt;br /&gt;
&lt;br /&gt;
on button.pressed:&lt;br /&gt;
    score = clamp(score + 1, 0, max_score)&lt;br /&gt;
    label.set_text(&amp;quot;{0}: {1}/{2}&amp;quot;, title, score, max_score)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Strings must be quoted. Declare and initialize map variables and module state before use. Handler parameters and procedure parameters are immutable; assign mutable data to a map &amp;lt;code&amp;gt;var&amp;lt;/code&amp;gt; or module &amp;lt;code&amp;gt;state&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Operators include arithmetic, comparisons, &amp;lt;code&amp;gt;and&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;or&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;not&amp;lt;/code&amp;gt;. Built-in functions include:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;min&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;clamp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;abs&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;round&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;lerp&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;remap&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;random&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;random_int&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;shuffle&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;choose&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;time&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;format&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;convar&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;bool&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;float&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;string&amp;lt;/code&amp;gt; conversions&lt;br /&gt;
&lt;br /&gt;
Without &amp;lt;code&amp;gt;seed&amp;lt;/code&amp;gt;, each map runtime starts with fresh random entropy. A declared seed makes random sequences repeatable. &amp;lt;code&amp;gt;shuffle(self, count)&amp;lt;/code&amp;gt; gives each module instance its own shuffle bag.&lt;br /&gt;
&lt;br /&gt;
== Conditions and matching ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
on counter.changed(value: float):&lt;br /&gt;
    if value &amp;gt;= 10:&lt;br /&gt;
        door.open&lt;br /&gt;
    elif value &amp;gt; 0:&lt;br /&gt;
        light.on&lt;br /&gt;
    else:&lt;br /&gt;
        light.off&lt;br /&gt;
&lt;br /&gt;
    match int(value):&lt;br /&gt;
        case 1:&lt;br /&gt;
            label.set_text(&amp;quot;one&amp;quot;)&lt;br /&gt;
        case 2:&lt;br /&gt;
            label.set_text(&amp;quot;two&amp;quot;)&lt;br /&gt;
        default:&lt;br /&gt;
            label.set_text(&amp;quot;many&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Indentation defines the statement block. A type mismatch, unknown name, invalid call, missing ref, or wrong handler payload is a compile error.&lt;br /&gt;
&lt;br /&gt;
== Procedures and schedules ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
def announce(message: string, delay: float = 0s):&lt;br /&gt;
    wait delay&lt;br /&gt;
    label.set_text(message)&lt;br /&gt;
&lt;br /&gt;
on round.live:&lt;br /&gt;
    call announce(&amp;quot;Fight!&amp;quot;, 0.25s)&lt;br /&gt;
    schedule heartbeat every 1s times 10:&lt;br /&gt;
        light.toggle&lt;br /&gt;
&lt;br /&gt;
on round.post_round:&lt;br /&gt;
    cancel heartbeat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;wait&amp;lt;/code&amp;gt; suspends the current handler or procedure. &amp;lt;code&amp;gt;schedule name after duration&amp;lt;/code&amp;gt; runs once. &amp;lt;code&amp;gt;schedule name every duration&amp;lt;/code&amp;gt; repeats, and &amp;lt;code&amp;gt;times&amp;lt;/code&amp;gt; limits the count. Starting a named schedule replaces the existing task with that name. Cancelling a task that is not running is safe.&lt;br /&gt;
&lt;br /&gt;
Cancel round-owned repeating work on &amp;lt;code&amp;gt;round.post_round&amp;lt;/code&amp;gt; or another lifecycle event that always closes the activity.&lt;br /&gt;
&lt;br /&gt;
== Reusable modules ==&lt;br /&gt;
&lt;br /&gt;
A module contains parameters, private state, inputs, outputs, procedures, and handlers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
module counter(start: float = 0, max_value: float = 10):&lt;br /&gt;
    state value: float = start&lt;br /&gt;
    output changed(value: float)&lt;br /&gt;
    output reached(value: float)&lt;br /&gt;
&lt;br /&gt;
    input add(amount: float = 1):&lt;br /&gt;
        value = min(value + amount, max_value)&lt;br /&gt;
        emit changed(value)&lt;br /&gt;
        if value &amp;gt;= max_value:&lt;br /&gt;
            emit reached(value)&lt;br /&gt;
&lt;br /&gt;
    input reset:&lt;br /&gt;
        value = start&lt;br /&gt;
        emit changed(value)&lt;br /&gt;
&lt;br /&gt;
use counter as captures(max_value = 3)&lt;br /&gt;
&lt;br /&gt;
ref capture_point: game_capture_point&lt;br /&gt;
ref exit: func_door&lt;br /&gt;
&lt;br /&gt;
on capture_point.captured:&lt;br /&gt;
    captures.add&lt;br /&gt;
&lt;br /&gt;
on captures.reached(value: float):&lt;br /&gt;
    exit.open&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Module parameters are immutable configuration. State is private mutable data and can be inspected as &amp;lt;code&amp;gt;instance.state_name&amp;lt;/code&amp;gt;. Inputs are typed procedures. Outputs carry typed payloads and work like entity outputs.&lt;br /&gt;
&lt;br /&gt;
Put shared modules in &amp;lt;code&amp;gt;.vsiglib&amp;lt;/code&amp;gt; files and import only the required module:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
from &amp;quot;Packages/com.vellocet.sdk/Runtime/VSig/Libraries/Logic.vsiglib&amp;quot; use counter&lt;br /&gt;
use counter as captures(max_value = 5)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The standard logic library contains &amp;lt;code&amp;gt;counter&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;accumulator&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;relay&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timer&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;selector&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;random_selector&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;sequence&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;latch&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;toggle&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;state_machine&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;debounce&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;cooldown&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
These modules are compiled logic. They do not create GameObjects or network objects.&lt;br /&gt;
&lt;br /&gt;
== Spatial modules and logic_script ==&lt;br /&gt;
&lt;br /&gt;
A spatial module declares local refs and binds each instance to a scene hierarchy:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
module gate:&lt;br /&gt;
    ref trigger: trigger_multiple&lt;br /&gt;
    ref door: func_door&lt;br /&gt;
&lt;br /&gt;
    on trigger.start_touch:&lt;br /&gt;
        door.open&lt;br /&gt;
&lt;br /&gt;
    input reset:&lt;br /&gt;
        door.close&lt;br /&gt;
&lt;br /&gt;
use gate as exits match Gates/Exit_*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A wildcard &amp;lt;code&amp;gt;use&amp;lt;/code&amp;gt; creates one module instance per matching root and a broadcast group named by the authored alias.&lt;br /&gt;
&lt;br /&gt;
Place a &amp;lt;code&amp;gt;logic_script&amp;lt;/code&amp;gt; marker when a designer should choose a module and its arguments in the scene Inspector. Select the &amp;lt;code&amp;gt;.vsiglib&amp;lt;/code&amp;gt;, module name, alias, arguments, and local-ref binding mode. The compiler expands the marker into the same form as a source-authored &amp;lt;code&amp;gt;use&amp;lt;/code&amp;gt;. It does not become a runtime entity.&lt;br /&gt;
&lt;br /&gt;
== Map and round lifecycle ==&lt;br /&gt;
&lt;br /&gt;
Lifecycle sources need no scene marker:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
once on map.ready:&lt;br /&gt;
    doors.close&lt;br /&gt;
&lt;br /&gt;
on round.warmup:&lt;br /&gt;
    warmup_lights.enable&lt;br /&gt;
&lt;br /&gt;
on round.pre_round:&lt;br /&gt;
    round_timer.reset&lt;br /&gt;
&lt;br /&gt;
on round.live:&lt;br /&gt;
    round_timer.start&lt;br /&gt;
&lt;br /&gt;
on round.overtime:&lt;br /&gt;
    overtime_alarm.play&lt;br /&gt;
&lt;br /&gt;
on round.post_round:&lt;br /&gt;
    cancel heartbeat&lt;br /&gt;
&lt;br /&gt;
on round.intermission:&lt;br /&gt;
    doors.open&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Available lifecycle sources are &amp;lt;code&amp;gt;map.ready&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;round.warmup&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;round.pre_round&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;round.live&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;round.overtime&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;round.post_round&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;round.intermission&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;once on map.ready&amp;lt;/code&amp;gt; to capture an authored entity&amp;#039;s initial state or perform setup that must run once per map load.&lt;br /&gt;
&lt;br /&gt;
== Safe server commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;server_command()&amp;lt;/code&amp;gt; sends one command through the server&amp;#039;s content-accessible command boundary:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
once on map.ready:&lt;br /&gt;
    server_command(&amp;quot;mp_roundtime 3&amp;quot;)&lt;br /&gt;
    server_command(&amp;quot;sv_gravity -6&amp;quot;)&lt;br /&gt;
    server_command(&amp;quot;say Map rules loaded&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
on door.open:&lt;br /&gt;
    server_command(&amp;quot;gm_message major DOOR HAS BEEN OPENED&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The server allows a curated set of match timing, chat or HUD messages, round completion, friendly fire, movement tuning, class enforcement, and weapon-slot rules. It rejects semicolons, newlines, secret-like identifiers, and commands without the &amp;lt;code&amp;gt;ContentAccessible&amp;lt;/code&amp;gt; flag. Any changed console variable is restored when the map unloads.&lt;br /&gt;
&lt;br /&gt;
Server operators can disable map commands with &amp;lt;code&amp;gt;sv_allow_content_commands 0&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;convar()&amp;lt;/code&amp;gt; reads use the same allowlist.&lt;br /&gt;
&lt;br /&gt;
== Signals shared with VMod ==&lt;br /&gt;
&lt;br /&gt;
VMods can emit a source under &amp;lt;code&amp;gt;mod:&amp;amp;lt;mod-id&amp;amp;gt;&amp;lt;/code&amp;gt;. Handle that signal like any other output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
on mod:community.hello.round_started(mode_id: string):&lt;br /&gt;
    status_label.set_text(&amp;quot;Mode: {0}&amp;quot;, mode_id)&lt;br /&gt;
&lt;br /&gt;
on mod:community.hello.stage.opened(index: int, gate_name: string):&lt;br /&gt;
    gate_counter.set(index)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The first handler receives output &amp;lt;code&amp;gt;round_started&amp;lt;/code&amp;gt; from source &amp;lt;code&amp;gt;mod:community.hello&amp;lt;/code&amp;gt;. The second receives output &amp;lt;code&amp;gt;opened&amp;lt;/code&amp;gt; from child source &amp;lt;code&amp;gt;mod:community.hello.stage&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A VMod can subscribe to a map entity or module output by source alias and output name. This exchange carries scalar values only. It does not expose scene objects to VMod code.&lt;br /&gt;
&lt;br /&gt;
== Compile and debug ==&lt;br /&gt;
&lt;br /&gt;
Press Play for quick testing. The compiled VSig runtime Inspector shows validation state, live module state, scheduled tasks, and a bounded recent-event trace. Marker Inspectors can show signal routes and add selected refs or a group to the paired script.&lt;br /&gt;
&lt;br /&gt;
Before export:&lt;br /&gt;
&lt;br /&gt;
# Save the scene and VSig file.&lt;br /&gt;
# Resolve parser, type, ref, module, and entity-contract diagnostics.&lt;br /&gt;
# Check wildcard refs against the final hierarchy.&lt;br /&gt;
# Exercise each round-phase handler more than once.&lt;br /&gt;
# Confirm repeating schedules stop at the intended lifecycle boundary.&lt;br /&gt;
# Run &amp;#039;&amp;#039;&amp;#039;Compile Scene&amp;#039;&amp;#039;&amp;#039; in the Map Exporter before building the addon package.&lt;br /&gt;
&lt;br /&gt;
The exporter expands imported modules, validates the final program, and embeds a compact compiled program in the map. A Release export refuses incomplete required bakes or invalid VSig.&lt;br /&gt;
&lt;br /&gt;
[[Category:Grimwar]] [[Category:VSig]] [[Category:Mapping]]&lt;/div&gt;</summary>
		<author><name>DocumentationBot</name></author>
	</entry>
</feed>