User:SIMU-NOVA/Sandbox training7

Jump to: navigation, search


October 5, 2009

GM Notes, show plan

Two people working on area. No specific limit on how many can work on one, but 10-15 is not uncommon. Show texture brush and polygons being highlighted.

Clean Demo, edit instance, HE Training: he-training1-12/engine

Create road

Carve riverbed, place river

Dirt along edges, grass (clean up on banks) "Dynamic details are camera-facing billboards"

Dynamic sky, time of day

Add log to end of river

Add gate over road. Add other objects relative to selection, on snap grid

Add walls to abut into hills

Smart objects, chomper gate "behaviors associated with it"

Add lever, wire to gate. "All under script control". Show States Editor

Can particle effects be added to animated asset? Yes.

Add clouds

Add fire

Ukar Campfire asset. Add fire effect. Red dots marking centroid of each sprite. "campfire1"

Can particles be scaled with tools. No, it will scale emitter, not particles, which need to be modified via properties panel.

Better to have uniform scale

Cut holes in terrain, add "hobbit hole", dungeon_transition

Occlusion representation updates real-time

Local space snap grid created by artists. Tutorial in wiki.

Add tunnels from transition. "Don't want to scale items connecting in local space.

Dirt around transition, some color (Dark grey-yellow)

Add boulder_limestone

Vertex coloring only works on heightmap, not on models.

Scaling can be done non-uniformly, but this is difficult to make things work together.

Show that collision works automatically when items are scaled.

Be careful with scaling. If asset is updated later to something else, scaling may not look right anymore.

Character features

Hotspot, CCS, Demo, Character Manager or "Launch HJ CCS"

Show different races, different skin textures, body shape (skeletal morphing)

How are ages handled, one "young" texture, one "old" texture, and it interpolates. Does it include specular? Yes, all texture channels.

Add facial tattoos, hair.

Static characters v. dynamic characters

Hair is "character parts". Parts have rules, so they can substitute with other parts, handle tinting.

Are rules like properties? Kind of. Helmet rule: "hide ponytails", or substitute with something else.


Technology: FaceGen: "60 billion sliders", expose, or expose subset of. We expose many, but clamp to values appropriate for HJ. Can work for facial expressions, too. FaceGen good for volume, but not good for dynamic dialogue, it's "pretty intense".

Sliders are altering polygons, or changing them? Topology identical, works with standard morphing rules.

Add Sunok soldier. "Ukar necromancer" Small blue triangles are particle emitters (because visualization was on).

Move character.

Add Sunok1 (static)

Right-click, npc utils, possess, walk around.

Go into character manager, adjust sunok armor, skin color. All character parts modeled by artist. But no FaceGen associated with this character.

Pick and choose "a la carte" for each character specification. We wanted characters to be lightweight, reduced set of animations. Very efficient because everything on his body uses only 1 texture, 15 parts. This reduces draw calls.

Draw separate textures for weaopns, then delete models off of them?

Open HJ_ACCControllerClassMethods script (client)

Change gravity constant for characters. (var Gravity = .9 (not .98)

Most of game development will be done in HeroScript. Full "HeroSense" on typing, anticipates what you're typing. HSL has virtually complete access to Engine. Character controller, area spinup/spindown. No real need to ever write C++, except for things like physics, client changes, direct mods to engine. For pure gameplay, there's almost no reason to ever need C++. We routinely move things from C++ into HeroScript to make them more accessible. Allows iterative development.

Incredibuild builds quickly, but still takes 5-10 minutes to build client. In HeroScript, compiling takes 50 milliseconds or less. "Beautiful way to program the game"

Bioware concern: Using Java VM, problems would crash server, but HSL can't do that, except for a couple functions used for bug-catching. Crashing calls a Script Error routine. Worst case: A gives B a sword, error causes A to keep the sword. Item is not duplicated. We gave this a lot of thought, and have 20 years of experience in ways that items can be duplicated or abused. Diablo: Drop item, click on belt?

Management features

GM Notes

Floating trees. QA says "there's a tree that's floating". How do you find it? GM Notes good for pointing out the floating tree.

Add note: TheTree

Open DreamManager. Add task. Hierarchical team-based task-based system. Add task: "Fix this tree". Assign to Cwiss. "Fix the tree". Bug, crash, urgency: Blocked

Can create "ad hoc" teams on the fly.

Click "links" tab, and link GM note to Task. Notification pops up to Cwiss.

Open link, "Go to", moves view there, and opens note.

Can augment Microsoft Project.

Possible to make scripted interface for tasks.

Scene Analysis panel.

Look for large textures, display them.

Sometimes artists make oddly-sized or overly large textures. (textures must be multiples of 4)

Search filter: Tree. Select all, to see where these textures are used in the world. Cycle through each one. Particularly useful to see if any textures are only being used once, maybe they can be replaced with a texture that's already used (rock01, rock03). Best to go to max file, fix, and re-export with proper material.

Everything that the editor does, a script can do too. Editor is just UI. Heightmaps are a bit different, in binary format, so terrain brushes need different handling.

Scene analysis: Per frame display of which textures are being used in a particular view.

Histogram of views, to be used in conjunction with concept art to compare color composition.

Histogram can have a hit on frame rate, as do other things in the development tools, scene analysis panel.

Statistics panel

Raw numbers, draw calls, primitives, buckets, etc.

Memory Report generates full memory dump to find out where every piece has memory has gone. Not particularly useful unless you have source code access to make changes.

HeroBlade Logs/MemoryReport01.htm

How to invert mouse?

Texture compressions are supported.

Path planning

Nav mesh, path planning data not completely real-time, but very fast. Dynamic, regenerates subsections on the fly. Efficiency configurable by lead on Path Planning Panel. Tighter meshes have higher memory overhead. Tweak depending on game. String Pulling, path merging.


Same physics representation, server, and client. colors all mean something. Collision meshes can also be generated by artist. Switch to convex hull, but this can get in the way with doors. Change decomposition depth. Build and Publish changes all instances.

Box representation for a building is probably most appropriate.

Instance-level overrides possible between specific PhysicsShapes.

Artists can make specific collision representation if desired.

Using Agaea Physics. Server-side physics: Deterministic physics that all clients see simultaneously is a complex (unsolved) problem. Stone avalanche may have rocks in different positions on different clients.

Path finding nav mesh done automatically.

Check "Visualize Raycast paths", drag mouse. Our slope setting is that 45-degrees is non-walkable. Possible future development: Multiple nav meshes.

Flying not currently supported for flying.

Art pipeline

classic pipeline very cumbersome in comparison to HeroEngine.

Model in Max/Maya, export, drop into Repository Browser, and it's immediately available.

Updated versions placed on Repository Browser stack, and updates simultaneously. Possible to revert to older version.

Aron in 3DS max, showing mushroom. Export to hard-drive, granny Open Repository Browser, move from hard-drive to repository.

Cwiss finds "sneaky.gr2 asset, adds to area, then creates instance. Aron updates his mushroom, and when he drops into repository, live objects update as well. Physics representation created automatically. Double-click on object to see history of versions. Non-destructive updates. Keeps at least 10, for at least 30 days. Can keep all(?). Not for raw source max files though.

Particle effects

Go to Agonar_fxland

Matrix effect: One particle effect, with scrolling UVs.

Will spend half day on particle effects.

Performance panel

Impacts framerate, depending on quantity of probes being used

Organizer panel


Create new (use first name) "CwissTooToo", OK

Area is added to bottom or organizer

Drag and drop, or Control-Drag, creates shortcut

Remove, does not remove from organizer, just removes reference. To get back, right-click and "add existing area".

Double-click on area name

Discuss play v. edit instances (use whiteboard)

Everything goes through edit script, so behavior can be changed, but conflicts must be considered.

Edit instance written out at .dat file to repository. New area is read in from current version of .dat file. Edit queue sends changes beyond what is in the dat file.

Changes made to edit instance after play instance is running, do not show up unless new play instance is spun up.

"How efficient is updating?" Changes coalesce as best they can whenever possible.

Monsters are not persisted as part of an area, ditto with player movement. That's handled via the replication system.

Go to edit instance.

Can a group of assets be copy/pasted from one area to another? Group them and paste them into the asset library as a pre-fab, then load into another area.

Bug: "Edit instance" indicator in bottom right does not show up in different color.

Heightmap editing

Open terrain panel, via button or panel

Select heightmap.

Select edit height, hover over heightmap, get polygons

Tips, size, strength, different falloffs, round v. square brush, make six combinations.

Circular brush. If need to expand heightmap, use bounds tool.

Question about heightmaps. 32x32, 64x64 is "roughly sweet spot-ish". Can depend on area/world design.

Heightmap data subpanel has Merge/Re-grid option.

Heightmaps are natural occluders.

Click Raise/Lower tool. Click and drag to "paint", or shift-drag.

Holding down Ctrl-key temporarily suspends action.

Level tool. Selects point you're at. Holding down CTRL key bypasses, to make mesas.

Shift-key and mouse-wheel, modifies angle, to make ramps. Ctrl-Shift to rotate around.

Tool tip on level tool.

Shift-click resets to flat plane.

Ctrl-click, match slope under mouse.

How come sometimes it's just circle, and sometimes screen-wide blue grid?

Alt-click to affect all heightmaps (like a flood-fill). (limiters can override this).

Use Raise-lower to create hilly area.

Soften tool. Similar to erosion (see subpanel). Shift does the opposite, creates spikes.

Select unspike, to take off the worst of the points. Select Soften afterwards.

Ctrl will bypass the soften.

Level tool. Select flat spot, alt-left-click to flatten heightmap.

Edit Height Tool.

Brush pattern selector. click to cycle to gaussian

Big brush, show gaussian pattern. Shift-wheel changes scale of pattern. Ctrl-wheel: strength, Ctrl-shift rotates.

Gaussian is a quick way to roughen terrain, then soften it to make it more walkable.

Choose texture pattern. In Brush subpanel, choose HeroEngine logo.

Level area with level tool and alt-click.

Move viewpoint off heightmap, click "heightmap button". Red lines show up when heightmaps overlap. Stitch tool blends them together.


Create hilly terrain.

Click "Selected node", and flatten all. Only flattens one heightmap.


Turned on with Directional Shadows checkbox in Renderer Panel. But only really works if directional light is turned on.

Environment panel

Environment schemes, dynamic sky v. skydome/skybox

Lighting, clouds, bloom, fog, wind, precipitation

Select "Use Dynamic Sky" checkbox, "Time of Day" slider. Manually adjust, or set to move automatically, like 1 day/30 seconds.

Lighting models, Three-point, Ambient-Diffuse, create a sphere, show how different colors of light reflect off it, depending on angle.

Timeline starts at 6 a.m., not midnight.

Set colors on timelines, simulating sunrise/sunset, stars (may need to turn off clouds or adjust their timelines as well).

Wind effects.

Add building. Add wall "at selection". CTRL-move to keep in local space.

Select both objects, open Asset Library "Grab selected".

Go through various ways of creating Library icon: Snapshot, create icon, load from elsewhere, upload.

Parenting. How to parent multiple objects, how to break parenting.

Using Asset Library in conjunction with scripted systems. (tomorrow)


Purposes: Culling, or environment schemes.

Open terrain panel, create heightmap, duplicate it, have three in an L-shape. Select one. Go to vertex coloring, and paint it red. Use "selected node" to limit color to each node.

Blue Green: Red

Click red room, add "Red" roomname. Select visibility menu and check it.

Use room-visibility menu.

Use room-visibility box.

Walk between rooms.

Add assets that are assigned to one room, but located in another.

Show how to reassign room, either via Area panel, or MovSel.

Assign different environment schemes to different rooms.


Add door, pivot point at lower corner.

"Can you specify another pivot point"? It's based on the origin.

If door is parented, it still rotates based on its own origin. Child rotates in local space. If parent rotates, children rotate with it.

Clean Demo / Smart Objects / Chomper Demo

Hover, see tool tip. Four things:

Three objects: 1, 2, 3. FQN location in repository.

Creates in order:

Executes command.

Right-click on library object: Edit Command. String is in "Enter Commands" window. (zoom)

Token replacement. $GUIDS, IDs of objects created. #spec, #openrotationaloffset, #openpositionaloffset, #closesound, #opensound

Figuring out command can be tricky. Walk through process.

Create new area state. Hotspot menu, tools, Area / Area States Editor

Click Add

50% will have problems adding

Property Sheet tab

State: MyDoor

Description: bob (will display in States List, but no gameplay meaning)

Switch to different tab (Values, Action Lists, Transitions)

Area states

Current state: Closed, or unintialized

Values: Opened, closed, Notset, * (wildcard)


Action List: Opening (actions) ... Closing (actions

Click Values tab, add two values:

Value: Opened, click OK

Add: Closed, click OK

Click Action Lists tab. Add two lists: OPENING, CLOSING

Lists have to exist before you can define transitions for them.

Click Transitions Tab.

Add two transitions. From Closed, To Opened, use Action List OPENING

From Opened, to Closed, use Action List CLOSING

Start with Opening Action List. Doubleclick, or select and click open

Add actions: Select State Action Type. Extensible system, so other actions can be added, but not always needed.


Select TRANSFORM, opens another menu.

Target Node: Click green arrow for "Grab Selected" to get ID

Are Area States persisted? (only in edit instance)

ID# is reference to that object, permanently, even if area spins down and then back up, even in all play instances. Unique ID, 64-bit per object, permanent.

Transform Interval: 0:00:03.000 (3 seconds)

Interpolation Type: Linear is fine

Can curves be adjusted? No.

Positional Offset: 0,0,0

Rotational Offset: 0,90,0 (can be tested in properties panel first)

Scale Offset: 0,0,0

Reverse at End: (reverse when it's done?) FALSE

Delay Action By: 0:00:00:000

Each state can have only one value at time. Set for how it should handle conflicts: Delay, immediate

Abort behavior: CANCEL

In Actions list, shows values.

Edit CLOSING action list, add new TRANSFORM action. Click arrow to Grab ID. Interval: 3 seconds, Keep all offsets at 0 to restore to current position.

Back to Property Sheet tab.

Value: (current value): CLOSED

Default: CLOSED (when area spins up)

Click > to Apply current value to set default.

Re-select door, click LINK button, to link state to door, so it "belongs" to door.

Would states ever not be linked? Yes. Monster spawner, other abstract concepts.

What object would you take as ID in those situations? ID is part of spawner system. Probably instantiates a spawner node, abstract node floating in area that doesn't have visualization or "exist" per editor's perspective.

After linking, if Door is deleted, Area State goes with it (otherwise it would script error because door doesn't exist anymore)

Set Value to OPENED, click ">", door should open.

Can State System be applied to multiple objects, like double doors? Yes.

If one of the doors is deleted, does it delete state? Double doors would probably be parented.

"Ignore For Wiring". This is what happens when you right-click a stateful object: States, Wire.

If TRUE, the Wiring submenu doesn't show up.

So you don't have to do this each time: Asset Library can add stateful object spec.

HotSpot, Tools Panel, _StatefulObjectSpecOracle Editor. How to create an entire area state for a door.

Double-click on _DOOR. Differences: All values are strings. Has "Tokens" tab. Token name "?name" and "#name". "#" means replace token literally with string inside single quotes. #statetype='_areaStates'

"?" find the ID of the unique object that corresponds to <something>


For all things created, find that ID, and replace.

Doesn't work for multiple instances.

Hover over object, see: 1, 2, 3. Each number is a library index. So can use "1" instead of asset name, and it will work on "first item created".

How to make one of these? Click "add": "Requesting New Spec" (server creating new prototype)

StatefulObjectCategory (arbitrary): Door

displayName: SneakyDoor

DefaultValue: CLOSED

(skip tokens for the moment)

Add two more values: OPENED, CLOSED

Add Transitions: OPENING (closed to open), CLOSING (open to closed). On this editor, okay to create these now, even before creating Action Lists.

Create Action Lists: OPENING, CLOSING

TRANSFORM. Then it gets "interesting".

TargetNode already "?statefulobject" or could be a different token

All fields are string.

Rotational Offset: #rotationaloffset (token still needs to be created)

Transform Interval By #tranformduration (token still needs to be created)

Create Tokens:

TokenName: #transformduration

TokenHint: #transformduration='0:00:05.000' (string equivalent of a time interval)

"Is there autoconversion, for "5.00"? Not sure.

TokenName: #rotationaloffset

Hint: #rotationaloffset='(0,0,0)' (this is just an initialization, not actually specifying rotation)

Most of these need to be created by technical person. Programmer, or technical artist. Not many people will be creating these.

(F12 = full screen in HeroBlade)

Need one more action: CLOSING, TRANSFORM (all default values are fine, so it goes back to what it was). No duration needed, because it's going to "snap".

On token page, Lib CMD. Uses token hints to create Library Command. Copy into buffer.

Duplicate door. Right-click in library, add to library. Add command, paste in command.

Fixup needed: Rotationaloffset: 0,-90,0.

?statefulobject='1' (could also use name of gr2)


Save Library

Delete duplicated door.

Create new Door from library.

(fixing errors)

Check if Area State was actually created. "SneakyDoor" didn't show up.

Right-click on door, change to "open" state, slowly opens. Right-click on door, change to "closed" state, snaps closed.

Because it uses tokens, it can be used on other objects as well, just use "Edit command".

Creates unique name for each.

Particle effects

Create emitter, tweak properties. TextureNumber under "Texture". Particles tab: Buoyancy, choose Type of Gaussian.

"Is curve over lifespan?" Curve is over lifespan of particle.

Miscellaneous / LifeSpan: 5, or Gaussian type, 3.000 to 5, median 4, variation .5.

"Does it default to regular median?" Not at the moment, has to be manually entered. In earlier versions, did some auto-averaging.

Tweak color: DiffuseColor, click option box. Default is black. Pick Timeline.

Click at left of timeline, choose any color.

Click at right, choose darker. Generally want to start with "hot" and then diminish.

Click checkbox: "Link to particle spec". Before it was on .55 second loop.

Why use default? Artists can find ways to use things.

Click dark at right, drag to left.

Tweak alpha, so fades in, then fades out.

Right-click on box to get different types of interpolations.

Color: SourceBlend. Just have to experiment with different types. D3DBLEND_BOTHSRCALPHA looks good.

Click on "_.prt" tab.

EmitFrequency: 0 will do as many as it can. Try to emit as few as possible but still get a good look. Start with high, then tweak down. .01 --> .025

Back to particle. Diffuse Color, adjust keys.

Too much repeating in texture: particle tab.

Visuals: DeltaRotation2D, Gaussian, -2 to 2, 0 median, .5 variation. Spin particle within life of itself. Don't spin too fast because it looks bad.

Click "A-Z" tab to sort properties alphabetically.

Make smoke clouds bigger.

Size2D: click option box, Timeline. Click blue circle, drag up slightly. Use mouse wheel to zoom.

Link to particle spec.

Change Maximum scale to adjust graph.

Right-click (?) change curves for falloff.

Fix variance where particles are born.

prt tab, EmitterRadius, option box, defaults to timeline, switch to Vector.

Miscellaneous, motion: Lifespan.

Have particles interact with environment. Wind multiplier. Does not support options though.

Trajectory is initial impulse of particle. .5, decrease buoyance to 0 (maybe negative). Arcing lava. Impouse on z-axis. Motion is continuing movement. Motion/buoyancy/trajectory can be combined for many different effects.

Orientation axis: How billboards are related to camera (camera-facing).

Collision: Lengthen lifespan so things impact with ground. Types of collision: Die, bounce, "ignore" is usually best. The more particles that are colliding, the more processing that is being taken up.

Sometimes cheaper to use another particle emitter rater than a bounce.

Create secondary particle emitter that generates very few particles to handle collisions, since not everything needs to collide.

Particle trails

DoTrails (won't see anything until properties are set).

Trail creates ribbon of quads behind it.

Decay: How long the trail sticks around before it dies.

Experiment, experiment, experiment. Texture can be added, like lightning zap.

UV animation will make more sense with HeroMaterial. Textures can help to decrease necessary number of particles to "sell the effect".

Trail vector only needed on one axis.

"All of your options are different, why?" Because options (properties) are sorted differently.

To get trails to "trail", drop alpha for vertices 1 and 2 (which are emitted first).

Vector timeline on trail vertices (broken?)

How do trail vertices end in world space? They are local to particle.

Where are they placed? Related to pivot point / centroid of particle.

How do I make trail bigger in relation to particle? How is that quad oriented? How do I manipulate that? Is that with those trail vertices? Particle is on x-axis. Typically only one axis is needed. To offset trail from particle, use a different axis (z?)

EmitAtDeath spec. Use carefully, since if it emits "at death" specs, can rapidly multiply.

Particle tab for "emit" particle, grab spec name (copy). Go to emitter you want it to die on, particle tab, and paste.

How efficient is this? Could we do a fireworks show? How many would it take to kill the server? Server's fine, this is a client problem. Server knows nothing about particle collision. Technically it's possible to tell the server when a particle dies though.

Emit an actual object.

Create another emitter. Give type of "granny". Instead of choosing texture, choose mesh (ferns).

Make a fern explosion. Level buoyancy at 1. Trajectory: Gaussian on Y, .25 - 1, .75

Trajectory, outward: Same on X and Z axis.


Drop buoyancy, give lifespan, move to ground.

Add arrows to emit at death.

Tweak diffuse color on a timeline. Copy diffuse color to other

Emitters can also emit emitters.

Fx System

All done in HeroScript. Effect-based editor. Animation notes, triggers.

Choose object (rock)

Spawn an effect off of rock.

HotSpot Menu: Tools, Fx. Hundreds already in Hero's Journey.

Add. Spec: Sneaky

Default group, rename to MasterGroup

Access to different types of HeroEngine nodes: Zap (lightning), model, etc.

Tools: Transform, and one that calculates trajectory to arrive in a designated amount of time.

Clapboard: Animations.

Add particle node (click and drag).

3D sound

non-3D sound: Generic sounds like on level up.

Granny particle, copy spec name, paste into resource on Fx

No target needed.

Start at same time as Master group starts.

Stop when main group stops.

Start location: Caster

AttachTo point: Does Fx stay at stop, or move with character?

Override object's material class, so Fx can be seen, and doesn't explode invisibly inside the object?

Preview panel, toggles from menu.

Target is selection (store)

Preview: Nada

Debug. Particle was broken before pasting.

More complex Fxs

Create a few characters. Live Content/Creatures


(checkbox to keep Library from closing)

Open existing Fx

Fx: Second group gives animations.

caster: self. Select targets.


choose "Fire from sky"

Moving UV textures: Wait for art training. :)

Drawing a mesh is cheaper than drawing a lot of particles. So one technique is to use a mesh and drag the UV.

Vortex nodes

Spiral/vortex particle effect (in dome)

Randomly spinning emitter on all 3 axes. Trails off of particles. To get distortion, added vortex node, and parented the particle to it.

Flare used with vortex node as well.

Attach vortex to root bone of character, with trails behind. Flare is on chest, as well.

Agonar Fxland

Outside: Vortex + 1 expanding particle right behind it. Custom texture on it.

Properties on vortex

Inner color and outer color. Intensity, distortion, custom normal maps.

Put vortex node in front of grid heightmap, set to "square" to see effect.

Vortex is under the Game UI.

Change so doesn't necessarily face camera, like to use it as a portal. Default: No physics collision on it. Not "expensive" in CPU resources.

Lightning nodes

Deformation on X and Y

Change scale over its width.

Alpha blending

Helix mode:

Do zap nodes have trails? No.

BoneName, to always target a certain part of the character.

Can bone location be randomized? Yes, via script or Fx System.



fnOverridePosture (falling, jumping)

Priority of animations

Set "force"

Blending animation, to interpolate between two different animations.

Blend 0.3: Blending 30% into animation

Hold 0.1: Animation must be held for at least .1 second. To keep things from interrupting it. Example: Death animation start.

FreezeLastSequence: Usually for testing animation so you can hold the last pose so you can see it more easily.

Non-transitional actions: Fn prefix

AAS doesn't do anything until inputs are set.

Inputs can be set via Animation panel

HJ: Two main modes: Normal and combat

HSL: Advanced customizeable character control. AAS: Animation Agent, ASQ sequence. C++: Mixer (?)

anim "Stand_Ledge"

See Animation Sequence page

Editing a sequence

Select Animation Data Set, ukar/animations_vda/ANIMATIONSET.DAT

holds all data for ...


List of sequences in panel that are used by ukar (crash bug in HE Training)

(HJDev, log into clean area)

Select character, lock

animations/biped_vda/ANIMATIONSET.DAT (takes time to load)

animation sequence: walkrun (relatively complex)

Speed Blend, between walk and run

Click on walk sequence. Multiplex animation depending on whether weapon is being held or not

Rotate Bone on neck, spine, 1 and 2

Simpler: Walk_male

apply animation, choose name, browse to cleric_pose ...

Checkboxes: Initial loop, whether should be preloaded.

"Do you normally want preload". A time you wouldn't want to, would be if you specify fallback. Depends on game. In HJ, wanted to base on mood, with many variations of "Wave". Don't want to load all 50 each time. Preload would be for standard wave. Excited wave has fallback: "If not loaded, fallback to standard wave". Then next time "excited wave" is called, it'll be loaded into memory. This helps keep memory usage down to what's actually needed.

"What about players doing emotes and not getting it right the first time?" Depends what you want from the gameplay experience. Matter of design.

"Next" button. Have one animation play, and then another one follow on immediately.

Delete ability.

Multiplex: Open-ended sequence, then "next" to finish sword swing.

"Are these mo-capped". No, we are a "hand-keyed shop". (discussion of whether mo-cap technology is good enough to integrate yet). Some things very difficult to do with mo-cap.

AA plays sequences. Under that is mixer. "I want this sequence, here are the blend rules. Here's what I want next."

Above is character controller: Navigation. Did I collide with something? Bounce off wall? Wall-sliding? Am I in water? Should I be swimming?

Engine comes with default controller: _HeroEngine_ACCControllerClassMethods (complex code, 3000 lines) Good for starting, but ultimately each team needs to design its own controller. Script is extensively commented.


Input system ultimately says something like "Move Forward":

else if t == "forward"
. NavMode, state, MoveDirection, Side Direction...

Analyzed during callback each frame to determine how it's going to navigate.

Figures out heading based on camera position. Sets rotation. Applys torso twist. me._HE_ACCC_ApplyTorsoTwist

ResolveNavigation. ... AnimInputs ... Animation Agent

Agent needs to be in agreement with Character Controller. Intertwined.

Map fields on the controller. MapAnimFloatKnob

Tools exist to create and place files for artists, to make this all easier.


Programmer breakout session.

DOM, GOM, Assocations

"Is there a way to see the editing history on an article?"

CLI, DOM definitions. Generally not making definitions in the local client DOM. But talking to the client GOM is done frequently.

CLI prefixes: "-" Talk to the World Server GOM (and technically, DOM, but since that's the same on all the area servers, it's not really needed).

Not possible to login to World Server, only to login to it remotely.

Most common command: "SN" (show node), to display node and field information.

Possible to store area settings into a node, to move it to another area.


CLI understands/needs C++

Chat understands HSL stuff

/HEINFO command can display node information too. Click on noderefs to explore. Texture lists, colors

Real-time monitoring while character walks around (server and client)

Get info on node in any GOM, even someone else's remote client. Need the ID.


Glorified versions of Println in one version or another.

Code samples. General considerations for Debugging

Edit script checks boolean per area as to whether to send debugging information or not.

HSL Debug System, runs in Debug System Area, supports a number of capabilities

Client: Println goes to console panel. On Server, goes to everyone in chat. So using it on server is not encouraged.

Asserts. Not like C++ asserts where debug runs them and production doesn't.


Script Errors Panel.

Green: Client error

Blue: Server error.

Click on error to go to script and line.

Assert, ScriptError and ScriptError Continue all do the same thing, and dump to ScriptError panel.

Script Error Continue: Dump, but don't halt execution.


Debug System works all areas, especially because it's already working in another area.

Also possible to get debug messages from client.

"Is Debug information stored?"

Stored in debug area, but not persisted. Only keeps about the last 500.

Programmer switches in the Renderer Panel. Additional switches can be added from HSL.

External functions

External functions script


"Shake the player"

HeroScript can reflect through the GOM (DOM?), get all the classes, etc.

HeroScript Editor

HeroScript Editor

Opening via Tools Menu, or Ctrl-H

Options menu, in each world, set checkbox to see Engine scripts. Most coders (not all) will need to see them.

P4 Merge, but other merge apps possible. Not all merge apps were accepting results file.

Open a new script, via menu, or CTRL-SHIFT-S (server), CTRL-SHIFT-C (client)

Can also open GUI XML scripts.

Other graphical editors possible. Can be done all in XML rather via GUI Editor.

Can take a bit to load all scripts, first time. (Populating organizer)

Functions menu does not display XML sections

Server Scripts: HJ Inventory Script (because it's a long one)

CTRL-SHIFT-F for function pane, or open via Windows page.

CTRL-H in editor will display history of submissions

Can diff against any previous version. Possible to only show ones with comments.

HeroScript supports rapid iterative development, so comments may not be necessary for every single submission (100 compiles could be needed in one session).

Syntax errors show up on compile. Cascading errors, so first one is probably most relevant.

We support HeroSense (Intellisense-like behavior), auto-completion. CTRL-SHIFT-SPACE pulls up ... (auto-complete?)

Blue: Member fields

?: Methods

Generic noderefs have huge list that might not be helpful. Properly typed objects will have more useful list.

Example: "QuestItem cast"

Will display up to 4 lines before and after method in Help. So right before method signature, say what you're doing, and then parameter help

Hover over method for help. Four lines, signature, four lines. (comments)

Will always display signature for you. Will also prompt you.

... Callback node, walk you through ... lost it... Ctrl-shift-space

CTRL-SPACE to auto-complete, CTRL-SHIFT-SPACE to redisplay (mumble)

Aware of updates as they occur, if multiple people are working on same script, aware when compile occurs.

If new field is added to DOM, it shows up automatically.

When both submit at the same time, the last person in has to do a resolved.

Red line appears at bottom: You're in version 26, server is at 28. Forces you to resolve before compiling.

Abandon button.

Compiling saves a local copy, which could be really old, so when you try to open it again later, in one day or 5 months, it'll still pull up your old cache (you could have version 26, but server is version 90). Clicking "Abandon" forces update.

"How do you revert to an old version?" Via copy/paste

Care and feeding of your HeroBlade

Searching through scripts. Can do a Find in all scripts.

Example: BaseHardAssociation generates long list.

Scripts are stored in a tokenized format.

Click on search line to open found script.

Salmon-colored line at top of script means it's an Engine script (it'll still issue a warning). There are valid reasons to modify an Engine script, like fixing a problem. If done, email Simutronics (Cwiss). Other possibles: Toggle debugging, insert debugging lines to figure out logic flow.

Problem though, is when we (Simutronics) update HeroEngine, we over-write all Engine scripts. It's a full un-dump of the Engine. Package up scripts, executables, everything.

Ditto with DOM definitions marked as "Required", are "Required" scripts.

Anything in "Game" package is your game. We won't touch it. All other packages, we may step all over it.

If Game uses a leading underscore in a name, if there's no collision, no problem. If there's a collision in a later update, we won't be able to update until we rename your field.

Non-source: We will deploy executables to you, but can be dependent on type of contract. Many shops don't have technical expertise to handle a large update.

Point of release, with multiple servers.

Data storage options

Spec oracle

Spec oracle

Area spin down, one of the less complex ones


Hierarchies of arbitrarily complex concepts

Treasure lists, lists of abilities, all work very well in specs.

Spec systems, like good database design, try to avoid copying things. Instead, store references to other things.

Open Repository Requests panel to see why it may be taking a long time to login.

Prop class

Decorator class

Derived object will probably never be exactly what was expected ...

Do classes have to be called "decorator"? No.

Does a script have to be called "ClassMethods"? Yes. <class>ClassMethods

Other Data Storage options:

Spec system serializes spec to repository, storing it like a file. This can be done with non-spec things as well, just writing an arbitrary file to the repository.

On the client, things can be stored in the LRC, but are then only available to that particular local client. Might be useful for User Preferences, and/or encode in a checksum.

First, load in preferences, then send checksum to server to see if further update is needed.

(tricks to reduce bandwidth costs)

System nodes

Singleton instantiations of prototype, non-persistent, easily accessible from script, because they have a special syntax: $<name>. HeroEngine first tries to find prototype from that name, and then instantiate a singleton in memory, if it doesn't exist. This provides a convenient way for scripts to access information. For example, $GLOM wraps the external functions.

No constructors/destructors in HeroScript, or info on glomming/unglomming, but $GLOM wraps the functions to provide the additional functionality.

Singleton also means it's not necessary to use the ID, which would be different on every server anyway.

Things can also be associated to the System Nodes.

Travel System is a System Node, that uses a System Area. Call $TRAVEL.GoToBermuda $TRAVEL._ChangeAreaRequest()

Try to have class names the same as System Node names.

MODERN world demo

Prop System created in about 6 hours, and then stuff added since then. Not currently included in basic engine.

Need objects that are kind of part of the area, but aren't really part of the area, and may or may not exist at any point in time, depending on different things, such as which quest is active, what items have been gathered, etc.

(update HE Dev "HotSpot Menu" name)

"How hard would it be to have something to alpha in and then uploaded?" It can be done via alpha. When the node is instanced via replication, it comes in via a prop bucket, and it is not instanced until you tell it to. Could definitely be faded in.


State Extension Trigger

Things seen on the screen are instantiated from area. Prop buckets let you instantiate any object you want, dynamically from script.

World creation exercise


How do you link a camera to a waypoint path? There are two ways:

How to link above to a trigger

How to randomize Splash screens

How to link above to a trigger. Pop up a full screen Gui control, and then just put a texture on it.

Create a node with a timer field on it. Node should have a script associated with it. And then whenever the timer fires, call the script.

Passing user data via a trigger. UserData

When the script callback references the node that is the trigger, that's the Me node, which may not be typed. Use a Where statement to cast it. The properties in the property panel all accessible via script. me["UserData"] <nodename>[<property>] (client scripts)

if (me["UserData"] - "London")

$Travel._ChangeAreaRequest(triggeredBy.GetMyAccount(),LondonAreaID, "new")




On server side, cast "me" as

where me is kindof TriggerInstance
  if (me.UserData="London")
    $Travel._ChangeAreaRequest(triggeredBy.GetMyAccount(),LondonAreaID, "new")
  $Travel._ChangeAreaRequest(triggeredBy.GetMyAccount(),EchoverseCityAreaID, "new")
$ALERT._BasicAlert(triggeredBy.GetMyAccount(), "fail")

How to fix a flashing texture. (re-check)

Audio System page, Sound Class Methods, example of a server-side script, There is no toscript SoundClassMethods" sndPath, sndFilename, higher example includes world\livecontent\audio\boom.sgt. Is it a difference between client and server?

sndResource parameter exists, but not sndPath.

How to break up an area into rooms

How to set up assets as occlusion assets, or troubleshoot when they are not working as such.

Linking a camera to a waypoint path

If you delete a room, do the assets go with it?


"heavy" day

Debugging Arrival paths

Create application of code (hands-on), of Prop Bucket Spec Oracle, usable in game (may need decorators)


Create proximity detector

1.5-2 hours on GUI stuff. Make a basic GUI window, review GUI Editor

Setup to create (something?) from the Library

GUIDemoClassMethods, user interface implemented using HeroEngine user interface system

"HeroEngine GUI Demo"


Docking / Fill

Mouse Events, with and without "SkipTextureAlphaTest"

Alphamask, Alphamap, masked off section of mask. Stretch map to fit shape.

Minimap similar, but with textures being dynamically generated by HeroBlade

GUI Animation, drag slider add stars, GUIA_Sparkler. Each spark is a separate GUI Control. Few hundred controls. Tie sounds to mouse events

Additive Blending. Right-click in top menu bar to add spinning HeroEngine logo, see how they look when overlapping.

Label Markup. Text either embedding in texture, okay, but can't be changed at runtime. Or, use labels, allow specifying font, color, background color, links, underlining. This is a {f:#1,0,0,1)foreground{/} color.

Links can get mouse events. OnMouseEnterLink, OnMouseLeaveLink

Weird GUI!

Attach GUIs to billboards in 3D space. Glue, Unglue, opacity. Should glue GUI above character's head.

Demo works in training or HJ Reference: call GUIDemoClassMethods startGUIDemo in Console panel

Scaleform: Needs to be licensed separately. Hotspot, tools, Scaleform example, Flash UI game. Scaleform control running inside our own GUI Control system. Embedded Scaleform. MFG have many ScaleForm games. Cwiss likes fishing game. They bought package of 7000(?) all-time best Flash games.

Creating a GUI Control

(if possible, do in your own world)

Don't technically need a class for every Control you create, but does help frequently.

Many pre-built controls exist.

Using DOM Editor, create GUI Class. Turn off "Read Only". Select Client/Class, New Class "CwissGUI", Archetype is important. Choose guicontrol

No new fields needed. Inherit from parent GUIPanel, standard parent for GUI controls. Confirm.

Find class via filter, "Open Script". Make empty script (no template).

Close DOM Editor. Keep Organizer panel open.

Now create GUI Prototype.

In Organizer Panel, go to GUI XML tab.

Note: Cannot handle everyone simultaneously clicking "Create New": Prototype Name: CwissWindow, description, inherit from nothing. Class, inherit from previously created class: CwissGUI

Plain empty panel. Add additional controls to create window.

Add resizers to panel. In Organizer, filter "resize", _resizeTop, select, double-click to add to control. In Properties panel, show that adding _resizeTop also added topLeft and topRight.

When box turns green, it means it's selected.

Add _resizeLeft, re-select Window, double-click _resizeRight

If adding it in the wrong place, drag it to the right spot in the Properties window

Add _resizeBottom

(rewind, do Top Bottom first, then Left/Right)

Leading underscore means it's a HeroEngine control. When adding your own, the leading underscore is not necessary.

Search _titlebar and double-click. It is a complex control with multiple sub controls already included. Select "title", look at its properties and change Misc/Text to "MyWindow".

To delete a control, select it and press Delete key

Add _scrollableParent to Window (also show subpanels). One of these is "clientarea".

Select "Clientarea". Seach for "_button". Double-click to add, drag around. Other controls were using docking. Could be auto-centered with autoCenter true true.

Expand button, click on "text", go to Misc/Text, set to "Push Me!"

Add texture to ClientArea. Select ClientArea.

Visualization controlled via State Presentations. Many presentations. Simplest: DefaultStatePresentation, color, change.

defaultstatepresentation: click ... button, opens "Texture Viewer" control, "Select a texture" (or icon)

Texture Viewer allows changing all the presentations.

Click and drag around compass to add it to control (UV job)

Close viewer.

Check GUI Editor Toolbar. Click "to XML" button to send XML to Repository.

Close Editor

Create via scripting.

(Programmers have already created their own classes at this point)

new function in CwissGUIClassMethods

function open()
  g as noderef of Class GUIControl = CreateNodeFromPrototype("CwissWindow") = true
  g.centerControlOver( NONE )  // Centers in middle of screen

Compile, submit

"How do you look up the window name?" XML is listed in the Organizer Panel

In Console Window, type call cwissguiclassmethods open

Tah Dah!

Button doesn't do anything yet.

Window resizes, but is not draggable. Close button works though.

(checking _GUIBaseWindow class)

Not moveable because we used GUIPanel instead of GUIMovePanel

"Can XML be edited straight, to change name of panel?" Yes.

Script editor, open cwisswindow.xml

Panel type can be switched out in DOM Editor

rp : removeparent

ap: add parent

Back to button...

GUI Events hit the control, and if that doesn't implement something, it bubbles up the chain of events to the top window

Look at guibutton class

(taxis, airport)

Personal tools