Definitions

This page attempts to document the various acronyms and terminology used throughout the Diablo III codebase.

Overview
Dungeon Random Level Generator. This is a server side process for generating random dungeons. The world SNO files contain DRLG parameters. These parameters define the ruleset for generating a dungeon: how many entrances/exits must be placed, how tiles can attach to other tiles, etc. Although this process happens on the server, it appears the client also contains DRLG-specific code.

Referencing Strings
"Failed filling scene labels for placed SNO (%s) because it is not a scene! Is your DRLG set up correctly?" "%s DRLG FAILED picking sub scenes on Try #%d!!!" "%s DRLG FAILED spawning instances on Try #%d!!!" "%s DRLG FAILED Applying Label Rules on Try #%d!!!" "%s DRLG FAILED!!" "Took %d tries to get %s DRLG to work"

Overview
Game asset files. Groups of SNO files are organized into folders and stored in MPQ container files. SNO files each have unique integer IDs that allow SNO files to reference each other. The file format is unique to each type of SNO file, although it appears to always be a binary format.

File Types
public enum SNOGroup : int {   Code = -2, None = -1, Actor = 1, Adventure = 2, AiBehavior = 3, AiState = 4, AmbientSound = 5, Anim = 6, Anim2D = 7, AnimSet = 8, Appearance = 9, Hero = 10, Cloth = 11, Conversation = 12, ConversationList = 13, EffectGroup = 14, Encounter = 15, Explosion = 17, FlagSet = 18, Font = 19, GameBalance = 20, Globals = 21, LevelArea = 22, Light = 23, MarkerSet = 24, Monster = 25, Observer = 26, Particle = 27, Physics = 28, Power = 29, Quest = 31, Rope = 32, Scene = 33, SceneGroup = 34, Script = 35, ShaderMap = 36, Shaders = 37, Shakes = 38, SkillKit = 39, Sound = 40, SoundBank = 41, StringList = 42, Surface = 43, Textures = 44, Trail = 45, UI = 46, Weather = 47, Worlds = 48, Recipe = 49, Condition = 51, TreasureClass = 52, Account = 53, Conductor = 54, TimedEvent = 55, Act = 56, Material = 57, QuestRange = 58, Lore = 59, Reverb = 60, PhysMesh = 61, Music = 62, Tutorial = 63, BossEncounter = 64, }

Referencing Strings
"Warning: No SNO Files Found!" " Sno file count: %d" "tEntry.snoGroup: %d" "eSNOPackDestination: %d" "sGetSNOCoreDataHash - Could not read CoreData.mpq.hash!" "sGetSNOCoreDataHash - Could not open CoreData.mpq.hash!" "Read error of a NULL lazy data SNO." "SNO file has bad SNO header!" "Could not read SNO file header! : %s" "SNOFileOpen: SNOFileLookup failed for SNO %s:0x%08X" "Failed to resolve or compile %s SNO file %s" "%s (%s) has a bad link to %s sno: %s. %s" "%s has a bad link to %s sno: %s. %s" "XML locale doesn't match locale for SNO file for %s" "SNOFileGetName(%d.%d, "%s") failed!" "SNOFileGetName(%d.%d) failed!" "Ignoring a duplicate instance of SNO '%s'" "SNOFileOpen: SNOFileLookup failed for SNO %s:0x%08X" "Opened SNOPack %s" "SNOFilesInitialize('%s', %s)" "SNOFilesDispose" "GameBalanceGetActorSNO is unable to evaluate an actor SNO for gamebalance type %s! Expected either Scenery or Item." "Couldn't find stringlist sno for %s" "Encounter %s could not resolve to a valid actor sno because all items have weight of 0" "Encounter %s could not resolve to a valid actor sno because it doesn't have any items added to it" "Failed to precache %s SNO '%s' 0x%x!" "Marker '%s' in marker set '%s' is referring to an invalid sno (%s). %s" "Bad Markerset SNO in scene (%s)!" "Failed filling scene labels for placed SNO (%s) because it is not a scene! Is your DRLG set up correctly?" "Tried to use Bad Tutorial SNO" "World '%s' references an invalid sno name: 0x%08X. %s" "SNOFilesAsyncInitialize" "SNOFilesAsyncInitialize" "No context available to evaluate attribute (%s) when processing power SNO %d (%s)" "Could not find Sound SNO named '%s'" "Sound SNO '%s' missing sound for conversation '%s' line %u" "Could not find Sound SNO named '%s'" "Marker '%s' in marker set '%s' is referring to an invalid sno (%s). %s" "Tried to add light with SNO_NONE" "Tried to add particle system with SNO_NONE from parent: %s" "Tried to play animation NONE on actor %s (sno %s)" "%s has no physics SNO and cannot ragdoll!" "Server SNOPackHash: 0x%X (client hash = 0x%X)" "SnoPackHash Mismatch between client and server!" "Updating inventory actor SNO for unknown ACD [ANN:%d]"

Overview
MPQ, or MoPaQ, is an archive format developed by Blizzard Entertainment, purposed for storing data files, images, sounds, music and videos for their games. This is a generic container similar to a tarball but with support for patch sets (adding/removing/modifying files by loading a base MPQ file followed by a series of MPQ patch files) and per-file compression.

You can browse MPQs, extract individual SNO files, or add MPQ programmatic access to your own code with the CrystalMPQ library (http://code.google.com/p/crystalmpq/).

Overview
Actor Common Data. Represents all "in-game" actors, which includes in-world actors plus inventory items, equipped items, item drops, and more.

Referencing Strings
"Common ACD %s couldn't add a sphere node because it is out of bounds! [%f, %f %f]" "***** ACDCreate FAILED! *****" "********** ACD Dump: **********" "Tried to get spell socket location for ACD (%s) which is not a hero" "Tried to get spell from socket location for ACD (%s) which is not a hero" "sGetSquare: Inventory square is invalid: point:(%d,%d) slot size:(%d,%d), slot: %d, acd:%s" "sACDAddToInventory: Container %s unable to get slot #%d, [%d, %d]" "ACDInventoryGetItemCount exceeded int32 with %llu!" "ACDInventoryGetItem exceeded int32 with %llu!" "ACDInventoryGetGoldACD: ACD %s attempted to get gold but it has no inventory!" "ACDInventoryGetGoldACD: ACD %s attempted to get gold but it isn't a player or a merchant!" "ACDInventoryModifyGold: ACD %s tried to subtract %llu gold, but he only has %llu gold!" "ACDInventoryModifyGold: ACD %s tried to subtract %llu gold, but he only has %llu gold!" "ACDDirtyListGetGenerator item {high: %llu low: %llu} has no generator seed" "ACDInventoryAddToLocation tried to restore an item (%s) to a slot inside a container (%s) that cannot have that slot (%d)" "ACDInventoryAddToLocation tried to restore an item (%s) to a slot (%d) in which it is not allowed" "ACDInventorySocketSpell failed because rune (%s) cannot be socketed into power %s" "ACDInventorySocketSpell failed because power %s couldn't get it's spell socket location" "Server ACD %s couldn't add a sphere node because it is out of bounds! [%f, %f %f]" "MoveWithArc trying to travel to a distance that is way too far. ACD = %s CurrPos = [%.2f %.2f %.2f, DestPos = [%.2f %.2f %.2f]" "Attempted to cancel a look on a RActor with no ACD. The ACD is required since that's where the original look is stored." "RActorACDEnterKnown unable to create ACD!" "Setting world position for unknown ACD [ANN:%d]" "Setting inventory pos for unknown ACD [ANN:%d]" "Updating inventory actor SNO for unknown ACD [ANN:%d]" "Received affix msg for unknown ACD [ANN:%d]" "Client received portal specifier for ANN %d but couldn't convert it to an ACD!" "!!!ERROR!!! Setting attribute for unknown ACD [ANN:%d] [Attribute:%s]" "!!!ERROR!!! Setting attributes for unknown ACD [ANN:%d]"

Overview
Unknown

Referencing Strings
Setting world position for unknown ACD [ANN:%d] Setting inventory pos for unknown ACD [ANN:%d] Updating inventory actor SNO for unknown ACD [ANN:%d] Received affix msg for unknown ACD [ANN:%d] Client received portal specifier for ANN %d but couldn't convert it to an ACD! !!!ERROR!!! Setting attribute for unknown ACD [ANN:%d] [Attribute:%s] !!!ERROR!!! Setting attributes for unknown ACD [ANN:%d]

Overview
Appears to be a compiled language, possibly for unique power/item effects.

Referencing Strings
"BBEFunctionTable: Invalid table index [%d] or value index [%d]" "Error evaluating BBE formula for power %s from owner %s" "Error evaluating BBE formula for item %s from owner %s" "BBE parsing: stack overflow" "BBE parsing: stack underflow" "Found more than one decimal point in a BBE float constant - ignoring" "Error processing BBE" "BBE parsing: stack overflow" "BBE parsing: not enough operands" "BBE parsing: buffer overflow" "BBE parsing: function index goes off the end of the function evaluator table" "BBE parsing: stack underflow" "BBE parsing: function takes a weird number of operands" "BBE parsing: division by zero" "BBE parsing: stack overflow" "BBE parsing: BBE unrecognized op" "BBE parsing: evaluated BBE past end" "BBE parsing: need an identifier evalution function to handle identifiers" "BBE parsing: parsed BBE past end" "BBE parsing: strange to see a close paren here" "BBE parsing: too few arguments passed to function" "BBE parsing: BBE byteswap unrecognized op" "BBE parsing: BBE byteswap unrecognized op" "Unknown BBE Identifier %d!"

Overview
Game Balance ID. A 32-bit integer created by hashing a string with the following function:

uint HashLowerCase(string input) {   input = input.ToLowerInvariant; uint hash = 0; for (int i = 0; i < input.Length; i++) hash = (hash << 5) + hash + input[i]; return hash; }

ActorCommonData objects have a GBID field which can be used to resolve in-world items to GameBalance SNO structures, and determine attributes such as item type, quality, etc.

Referencing Strings
"Could not find affix GBID=%u" "Failed to find item GBID=%u" "Could not find affix GBID=%u" "Item [%s] has bad Affix GBID=%u" "Bad item GBID=%u" "Bad Affix GBID=%u" "Failed to find item GBID=%u" "Could not find affix GBID=%u" "Could not restore item GBID=%u" "Item [%s] has bad Affix GBID=%u" "Could not find affix GBID=%u" "Game Balance Data missing %s, gbid=%d (%x)" "Could not find Hero GBID=%u" "Could not find Item GBID=%u (%s)" "Unable to initialize GBID value for "%s"" "Could not find affix GBID=%u" "No context available to evaluate attribute (%s) when processing item GBID %d (%s)" "Couldn't find Item GBID = %u" "Item [%s] has bad Affix GBID=%u" "Failed to find item GBID=%u for description text" "Failed to find item GBID=%u for flavor text" "Could not find affix GBID=%u"

Overview
An actor in a scene. Appears to be anything from a UI element to a treasure chest to a monster. RActors almost always reference an ActorCommonData structure, although there are a few cases where that is not the case (TODO: what are the rules for when an RActor does not have an associated ACD?).

Referencing Strings
"Local player RActor in invalid Scene: 0x%08X, Position: %.2f %.2f %.2f" "******* List of all %d ractors *******" "*********** End of ractor list (count: %d) ***********" "Attempted to cancel a look on a RActor with no ACD. The ACD is required since that's where the original look is stored." "RActor %s scale pinned from %f to %f!" "RActorACDEnterKnown unable to create ACD!" "Unable to resolve team effect group index for RActor: %s" "%s (%d ractor particles)" "Tried to set fade time on RActor %s with a time that is too small (%f seconds)!" "Tried to set fade time on RActor %s with a time unreasonably large (%f seconds)!" "Couldn't find the correct ractor attachment to remove!" "-- RActor %s" "Unable to allocate movement data for Client RActor %s!" "Tried to use hardware skinning on something which isn't a RActor!" "Tried to use hardware skinning on invalid RActor!" "Animated ractor isn't using a shader with skinning!" "Cannot create cloth on non-cloth sub-object %s (Ractor name = %s)." "Unable to allocate cloth for RActor: %s" "RActor %s couldn't add an initial collision sphere node because it is out of bounds! [%f, %f %f] radius = %f" "RActor %s couldn't add collision capsule %d sphere node because it is out of bounds! [%f, %f %f]" "Critter RActor %s tried to move, but has no movement structure!"

Overview
Both a SNO file type and an in-world concept, a world contains multiple scenes, NPCs, monsters, quests, random dungeon generation parameters, and more. Each world also has a unique coordinate space, making it impossible to walk from one world into another.

Referencing Strings
"Scene '%s', marker %s has an invalid world destination" "World '%s' references an invalid sno name: 0x%08X. %s" "World '%s' using scene group '%s' which doesn't have any scenes." "World %s had invalid nav mesh tile size (%d by %d) when stitching scene!" "World %s had invalid nav mesh tile size (%d by %d) when stitching scene!" "World %s has invalid nav mesh tile size (%d by %d)!" "Label Rule in world %s has %d entries, which exceeds the maximum (%d)" " %d) Path [%s] in world %s" "WorldPlaceSnapToNavMesh: Place not on nav mesh" "Scene %s in world %s is not aligned to the grid!  (%d, %d) when the tile size is (%d, %d)" "World (%s) contains a scenegroup (%s) at the world level.  This is no longer supported.  You must place scenegroups using markers instead." "World %s has an invalid world size! FeetPerTile = (%d, %d), TileSize = (%d, %d)." "Couldn't convert point World: (%.3f, %.3f) Local: [%.3f, %.3f] Square: [%d, %d] to a valid nav cell for scene %s" "Unable to finalize collision result @ [%.4f %.4f] World %s ZoneInstance Scene (0x%x) [%s]" "Actual point in invalid scene (NavCellHandleFromWorldPlace failed)" "Unable to resolve a navmeshhandle from place (%.2f, %.2f) in World %s!  NavMeshCell scene = %s  Please check the navmesh in this area!" "NavCellPathFinder::GetSharedLineSegment: No shared edge found between scene %s and scene %s; Are scenes overlapping in this world?" "Disposing UI for World" "Initializing client world %s..." "Client Disposed world." "placeNew.idSWorld = 0x%x" "placeCurr.idSWorld = 0x%x" "Setting world position for unknown ACD [ANN:%d]" "Client received flippy message but didn't have a valid world ID!"

Overview
A small square of space inside a world. Each scene has a series of navmesh/navcells attached to it defining the collision geometry and walkable areas inside the scene.

Referencing Strings
"Scene '%s', marker %s has an invalid world destination" "Scene '%s', marker %s has an invalid destination entrance GUID (%d)." "Scene '%s', marker %s has an invalid level area destination" "Bad Markerset SNO in scene (%s)!" "Failed filling scene labels for placed SNO (%s) because it is not a scene! Is your DRLG set up correctly?" "World '%s' using scene group '%s' which doesn't have any scenes." "Subscene (%s) has navmesh that extends past the boundaries of its parent scene (%s)!!" "Child scene 0x%08X (%s) activated on client, but parent (0x%08X) is still unknown!" "Scene %s isn't aligned to stitching grid." "World %s had invalid nav mesh tile size (%d by %d) when stitching scene!" "World (%s) has an invalid navmesh tile size! (%d, %d) Unable to initialize navmesh for scene (%s)!" "Failed trying to use the -subscenes cheat to apply subscenes with index %d. This index is past the number of possible scenes!" "Failed trying to apply subscene %s with -subscenes cheat index %d." "Cluster %s failed trying to apply subscene %s! There's no subscenes locations left!" "No default subscenes are specified in cluster %s, but we have %d subscenes left to fill!" "Label [%s] was applied to scene: %s" "Label [%s] tried to apply to scene: %s, but it was already applied!" "Scene %s not aligned to 10 foot grid!" "Cached values invalid for scene '%s'" "Scene '%s' is too small (%d x %d) - scenes must be at least 4x4 navmesh nodes (10'x10')!" "Scene '%s' not a multiple of 10 feet; navmesh size: (%d x %d)!" "Scene %s in world %s is not aligned to the grid! (%d, %d) when the tile size is (%d, %d)" "scene not aligned %s" "World (%s) contains a scenegroup (%s) at the world level. This is no longer supported.  You must place scenegroups using markers instead." "%s DRLG FAILED picking sub scenes on Try #%d!!!" "Couldn't convert point World: (%.3f, %.3f) Local: [%.3f, %.3f] Square: [%d, %d] to a valid nav cell for scene %s" "Unable to finalize collision result @ [%.4f %.4f] World %s ZoneInstance Scene (0x%x) [%s]" "ZoneMin = [%.4f, %.4f] ZoneMax = [%.4f, %.4f] Check the border of this scene and see if the data is set up properly! Something may be overlapping." "Actual point in scene 0x%08X has invalid nav zone instance" "Actual point in invalid scene (NavCellHandleFromWorldPlace failed)" "Unable to resolve a navmeshhandle from place (%.2f, %.2f) in World %s! NavMeshCell scene = %s  Please check the navmesh in this area!" "Warning! Marker [%s] in MarkerSet [%s] is offset past the maximum bounds!  (Offset: %.2f, %.2f, %.2f)!  This will force the scene it's in to also be large.  Please check the data associated with this marker!" "Warning! Marker [%s] in MarkerSet [%s] is incredibly large!  (%.2f by %.2f by %.2f)!  This will force the scene it's in to also be large.  Please check the data associated with this marker!" "Warning! Marker [%s] in MarkerSet [%s] is too far outside of the scene bounds!  (Center: %.2f, %.2f, %.2f) (Scene Bounds Min: %.2f, %.2f) (Scene Bounds Max: %.2f, %.2f)!  This will force the scene it's in to also be large.  Please check the data associat" "NavCellPathFinder::GetSharedLineSegment: No shared edge found between scene %s and scene %s; Are scenes overlapping in this world?" "Local player RActor in invalid Scene: 0x%08X, Position: %.2f %.2f %.2f" "Client Scenes:" "Server Scenes:" "Scene '%s' has old fade group data!" "%d: Client received scene reveal message for <%s> but we already know about that scene <%s>" "Unable to resolve camera hardpoint %s from scene %s!" "hNavCell.idSScene = %d" "SScene = %s" "Cannot resolve hNavCell.idSScene!" "hCurrentNavCell.idSScene = %d" "SScene (curr) = %s" "Cannot resolve hCurrentNavCell.idSScene!" "Collision Impulse: %s hit scene and felt %g lb-sec" "Unsupported scene attachment event type : %d"

Overview
Unknown

Referencing Strings
"Unable to finalize collision result @ [%.4f %.4f] World %s ZoneInstance Scene (0x%x) [%s]" "ZoneMin = [%.4f, %.4f] ZoneMax = [%.4f, %.4f] Check the border of this scene and see if the data is set up properly! Something may be overlapping." "Nav Zone Instance: 0x%08X (%s)" "Actual Nav Zone Instance: 0x%08X (%s)" "Actual point in scene 0x%08X has invalid nav zone instance" "Cannot resolve ptZoneInstance for hNavCell!" "Cannot resolve ptCurrZoneInstance for hCurrentNavCell!"

Overview
Unknown

Referencing Strings
"Subscene (%s) has navmesh that extends past the boundaries of its parent scene (%s)!!" "Target Not On Navmesh: %s, source %s" "Nav mesh overlapped: %s (preset %s) and %s (preset %s)" "World %s had invalid nav mesh tile size (%d by %d) when stitching scene!" "World (%s) has an invalid navmesh tile size! (%d, %d) Unable to initialize navmesh for scene (%s)!" "Performance Warning: using %d tiles in nav mesh stitch array (tile size: %d x %d, grid size: %d x %d)" "World %s has invalid nav mesh tile size (%d by %d)!" "WorldPlaceSnapToNavMesh: Place not on nav mesh" "Scene '%s' is too small (%d x %d) - scenes must be at least 4x4 navmesh nodes (10'x10')!" "Scene '%s' not a multiple of 10 feet; navmesh size: (%d x %d)!" "Unable to resolve a navmeshhandle from place (%.2f, %.2f) in World %s! NavMeshCell scene = %s  Please check the navmesh in this area!" "Warning: Can't find path to portal - maybe it's off walkable navmesh?" " 0x%08X : %s (%s) NavMesh: %s" " 0x%08X : %s (%s) NavMesh: %s" "Waypoint is not on nav mesh"

Overview
Unknown

Referencing Strings
"Nav Zone Instance: 0x%08X (%s)" "Actual Nav Zone Instance: 0x%08X (%s)" "Actual point in scene 0x%08X has invalid nav zone instance"

Overview
A scene-relative bounding box that has a series of flags attached to it. By traversing the navcells for a scene and looking at the flags for each cell, you can determine what areas are walkable/unwalkable.

Flags
[Flags] public enum NavCellFlags : int {   AllowWalk = 0x1, AllowFlier = 0x2, AllowSpider = 0x4, LevelAreaBit0 = 0x8, LevelAreaBit1 = 0x10, NoNavMeshIntersected = 0x20, NoSpawn = 0x40, Special0 = 0x80, Special1 = 0x100, SymbolNotFound = 0x200, AllowProjectile = 0x400, AllowGhost = 0x800, RoundedCorner0 = 0x1000, RoundedCorner1 = 0x2000, RoundedCorner2 = 0x4000, RoundedCorner3 = 0x8000 }

Referencing Strings
"Couldn't convert point World: (%.3f, %.3f) Local: [%.3f, %.3f] Square: [%d, %d] to a valid nav cell for scene %s" "NavCell: %.3f, %.3f -> %.3f, %.3f" "Actual NavCell: %.3f, %.3f -> %.3f, %.3f" "Actual point in invalid scene (NavCellHandleFromWorldPlace failed)" "Unable to resolve a navmeshhandle from place (%.2f, %.2f) in World %s! NavMeshCell scene = %s  Please check the navmesh in this area!" "NavCellPathFinder::GetSharedLineSegment: No shared edge found between scene %s and scene %s; Are scenes overlapping in this world?" "hNavCell.idSScene = %d" "hNavCell.uCellIndex = 0x%x" "Cannot resolve hNavCell.idSScene!" "Cannot resolve ptZoneInstance for hNavCell!" "hCurrentNavCell.idSScene = %d" "hCurrentNavCell.uCellIndex = 0x%x" "Cannot resolve hCurrentNavCell.idSScene!" "Cannot resolve ptCurrZoneInstance for hCurrentNavCell!"