Ess 0.5.0
The engine-native sweep, a UI kit that draws itself, and the visual editor finally fed from the source.
720 public functions, up from 434 — and every one of them now has a node definition, where before 509 of
them were invisible to the node editor entirely.
Most of this came out of live probing against a running game rather than reading the decompiled scripts, and
the traps below are recorded because none of them are guessable from a function name.
Added
Ess.Pda— the mission log, dossier, statistics and map layer.mission()/missionExists()register
a real trackable PDA mission; a blip naming one becomes a mission blip and inherits its icon and label.Ess.Hudgrewtitle(the stylised animated overlay),location,message(negative duration =
permanent),tutorial,image, and the cash/fuel readouts — display-only, they move the number on screen
and not the money.Ess.Hud.Faction— the faction meters, the pursuit gauge, andtimer(), the only on-screen countdown
the game exposes, with real HUD chrome and a callback on expiry.Ess.Minimap— the minimap widget, which noHud.*function reaches.lockRangeowns the update
handler so a zoom sticks; the game otherwise recomputes it from player speed every update.Ess.Gps,Ess.Shop(the game's real full-screen purchase UI, filled with your own items),
Ess.Sys,Ess.Atmosphere,Ess.UI.Theme.Ess.On.script(name, fn)— react to the ~28 named events the shipped game posts ("PDA Open",
"SupportUsed", the Satellite events…). Ess previously had no way to hear any of them.Ess.Soundgained cue validation (duration/isCue/isLooping— a mistyped cue is otherwise
completely silent) and the category mixer.tools/checksyntax.py— compiles everysrc/file plus the built dist offline.checkpure.pycovers
11 pure files; a syntax error in the other 73 was previously invisible until a live load.samples/recipes/theme_the_ui.lua— restyling the kit, and a smoke recipe.
Changed
- The UI kit draws at runtime from theme data. One movie replaces eight; the 8-line panel, 3-toast and
5-chat-line caps are gone because rows are built on demand.Ess.UI.Themeis ~36 plain values with seven
presets. Async load is handled throughSetSwfFile's completion callback instead of eight blind repaints. Ess.Mark's three layers agree. The world, radar and PDA surfaces do not share an icon namespace, and
the kind table only ever named two of the three — so a "destroy" objective drew a destroy icon in the world
and on the radar, and an anonymous dot on the map.Ess.Mark.KINDSnow names all three for every kind.natives.jsonis honest about what is native.Hud.*andPda.*are not engine natives — they are
resident Lua published under a different global, so 143 functions filed as black boxes have readable
source. Engine surface 1108 → 965.- The release zip carries
api/ess-nodes.generated.jsso a browser editor can load the node set from a
file://page.
Fixed
icon_yellow_mcdraws nothing. It is a registered icon name with no art, it was the engine's own
last-resort fallback, and it was Ess's default in three places — which is whyEss.Mark's PDA blips were
never visible. Earlier diagnosis blamed the missing label; that was only half of it.Ess.Object.angularImpulsedefaulted to world space while.impulsedefaults to local, under a
comment promising "same argument shape". Aligned.Ess.Human.setStatenow validates the posture. The native reports nothing for a valid state and for
garbage, so a wrapper guard is the only place a typo can ever be caught.Ess.UI.setScaleno longer builds the whole UI as a side effect of setting a number.- The widget rect counted the UI scale twice, so a 520-unit panel covered 61% of the screen instead of
27%. - Several silent-failure paths now report on the
Ess.DEBUGchannel instead of returning a barefalse.
Notes
- Not wrapped, because they are dead:
Pda.Database.AddHelpEntry(writes a table nothing reads),
Hud.FactionDisplay.RemoveMeter/RemoveAllMetersandShowAll(empty bodies), andHud.Tutorial's two
ShowTutorial*functions (broken for any explicit player). Ess.Hud.Faction.levelsis globally destructive — it replaces the game's own faction mood names for
every faction until the level reloads.restoreLevels()undoes it.