GIT Format (Game Instance Template)
A .git file says where everything in an area is. Creatures, doors,
placeables, triggers, sound emitters, stores, encounters, waypoints, item piles
and cameras all get their position and orientation here.
If the .are file is the stage, the .git is the blueprint for its
actors. It does not describe what a creature is, only where one stands: for
the creature itself you want UTC, and the .git entry points at it.
GIT is built on GFF (Generic File Format), the engine’s labelled key/value tree. If you have not read the GFF page, start there.
This page documents GIT’s dual role, the same schema serving a static module’s sparse template-referencing placements and a savegame’s full inline snapshots, and each dispatcher’s absent-field defaults. Evidence is drawn from Ghidra decompilation of
swkotor.exe(K1 GOG build), cross-checked against a full K1 install’s vanilla.gitcorpus and a corpus of real save games. The tables below are lookup surfaces, meant to be searched rather than read start to end.
At a Glance
| Property | Value |
|---|---|
| Extension(s) | .git |
| Magic Signature | GIT / V3.2 |
| Type | Instance Blueprint |
| Rust Reference | View rakata_generics::Git in Rustdocs |
One schema, two jobs
This is the idea the whole page hangs off, and almost every oddity below is a consequence of it.
A GIT is written twice in a KOTOR install, by two different producers, for two different purposes:
- A module’s static
.gitplaces objects sparsely. Each element carries aTemplateResRefnaming a blueprint, plus the handful of fields that differ per placement: position, orientation, an id. The engine loads the blueprint and overlays those few fields on top. - A savegame’s GIT, bundled inside
SAVEGAME.sav, stores each object as a full self-contained snapshot, read field by field. NoTemplateResRef, no blueprint load. A field missing from one of these resolves to the engine’s hardcoded default, not to a blueprint value.
UseTemplates is the discriminator. A static file sets it to 1; a save omits
it entirely, and the loader’s default of 0 selects the snapshot path.
Two things follow. The same reader function often serves both paths, so a field documented as save-only is frequently live on a static placement too. And “absent” means different things on each side: on a static placement it usually means “the blueprint supplies this”, while on a snapshot it means “the engine’s constructor supplies this”.
Static .git files ship inside module archives, one per area, produced by the
Aurora toolset. Saved GITs live inside SAVEGAME.sav, one per module the
player has visited, written by the engine itself. See the
Save Game Deep Dive for how a save bundles
them.
One object type is effectively savegame-only. Area-of-effect objects
(AreaEffectList) are runtime spell and ability effects with no template at
all, so they appear in saved GITs rather than in static module layouts.
Field Schema
The format’s field families, as an orientation before the full list.
| Family | Covers | Representative fields |
|---|---|---|
| Root behaviour | Template-versus-inline mode and live weather state | UseTemplates, CurrentWeather, WeatherStarted |
| Object instance lists | One list per entity class | Creature List, Door List, TriggerList, SoundList |
| Per-instance placement | Template reference, position, orientation; naming varies by class | TemplateResRef, XPosition, Bearing, ObjectId |
| Saved snapshots | The full inline object each list holds when UseTemplates = 0 | SavedCreature, SavedDoor, SavedPlaceable, SavedTrigger |
| Area singletons | Stealth and ambient-audio state, plus the save-only minimap blob | AreaProperties, AreaMap |
Engine Audits & Decompilation
Read from CSWSArea::LoadGIT at 0x0050dd80 in swkotor.exe.
(Provenance: derived, not attested. These rows have not been separately re-derived, so they sit on the reverse-engineering queue. Individual claims say so inline where they rest on less than the rest.)
Reading an area
LoadGIT is a dispatcher. It reads a few root scalars, then hands each object
list to its own loader.
| Field | Type | Engine evaluation |
|---|---|---|
UseTemplates | BYTE | Selects whether object lists read TemplateResRef or read inline data. |
CurrentWeather | BYTE | Forced to 0xFF on interior areas. The absent-field default, applied before that override, is a fresh literal 0, unconditional: it overwrites whatever the object held rather than carrying over. |
WeatherStarted | BYTE | Forced to 0 on interior areas. Same mechanism as CurrentWeather. |
The engine validates the weather fields against the .are properties during
load.
An absent UseTemplates resolves to 0, the inline branch
SaveGIT never emits this field. It is present in every static .git file
from a retail install and absent from every saved GIT struct across a corpus of
real saves, so every save relies on the loader’s own default.
LoadGIT passes a literal 0 as the default at the read site itself, not a
value carried from a constructed field and not a local seeded earlier.
CResGFF::ReadFieldBYTE returns the caller’s default verbatim for an absent,
wrongly-typed or otherwise unresolvable field.
That 0 is widened and forwarded into the list loaders that take it: creatures,
items, doors, triggers, encounters, waypoints, sounds, placeables, stores and
area effects. Properties, maps and placeable cameras do not take it, being
always inline.
Every dispatch site branches on == 0, selecting the inline snapshot path,
with the else taking the template path. Any nonzero byte takes the template
branch, not specifically 1.
The value is not interchangeable. Because the test is == 0 rather than != 1,
any nonzero default would have landed on the template branch, and 0 is what
this loader uses for every other absent BYTE in the same function.
Each object list has its own struct id
An element’s kind is not carried by a field. It is the GFF
struct_id on the element record itself, and each list uses exactly
one value, with no list mixing ids and no id shared between lists.
| List | struct_id |
|---|---|
TriggerList | 1 |
Creature List | 4 |
WaypointList | 5 |
SoundList | 6 |
Encounter List | 7 |
Door List | 8 |
Placeable List | 9 |
StoreList | 11 |
AreaEffectList | 13 |
CameraList | 14, and nothing reads it |
List (item instances) | 0 |
Except where the table says otherwise, each value is the constant that list’s
loader tests against, so it says what the engine demands rather than what
vanilla happens to write. A trigger’s nested Geometry sub-list is gated the
same way, on 3.
The consequence of a wrong id is a silent skip, not a wrong load. Every gated loader has the same shape: compare the element’s id against the constant, and where it differs move to the next index without loading anything. No default, no diagnostic, no failure. The object is simply not in the area, and nothing says why.
A writer that leaves these at a default emits a file the container reads
without complaint and the engine does not load as intended. Note that item
instances legitimately use 0, so “unset” and “an item” are the same value.
Two nested lists are unchecked, and their writers disagree.
LoadEncounterGeometry and LoadEncounterSpawnPoints are reached by two
routes, through ReadEncounterFromGff and again through LoadEncounters’ own
override branch, and neither route asks an element for its type. Both walk by
list position and take every field by label, so it is one reader arrived at
twice rather than two to reconcile.
That leaves the id free, and the two writers spend it differently. A module’s
static .git puts 1 on every Geometry vertex and 2 on every
SpawnPointList entry. A savegame, written by CSWSEncounter::SaveEncounter,
puts each element’s own position there instead. Neither is wrong and neither has
an effect: an encounter restored from a save keeps its geometry.
LoadPlaceableCameras never reads an element’s struct id either. It walks
CameraList by position and takes each field by label, so 14 is what every
vanilla file writes and nothing enforces it. Keep writing it, since there is no
reason to write anything else. What that loader does check is the list’s
total length.
An absent list is a skip, not a clear
Confirmed uniformly across the CSWSArea::Load* dispatchers on this page
(LoadCreatures, LoadDoors, LoadPlaceables, LoadTriggers, LoadSounds,
LoadWaypoints, LoadStores, LoadItems, LoadEncounters,
LoadAreaEffects): each gates its whole per-entry body on the list actually
being found. When the list is absent that block never runs, and no call
anywhere clears, deallocates or resets the area’s existing object collection
first.
LoadPlaceableCameras is the sole exception; see CameraList.
| List | Loader | Engine triggers and fallbacks |
|---|---|---|
Creature List | LoadCreatures | Positions are validated defensively through ComputeSafeLocation bounds. |
Door List | LoadDoors | Save states trigger LoadObjectState. External templates route to LoadDoorExternal. |
WaypointList | LoadWaypoints | Ignores UseTemplates entirely and reads inline data only. Z-height is shifted via ComputeHeight. |
TriggerList | LoadTriggers | Geometry reuses the UTT layout. Carries the linkage arrays LinkedToModule, TransitionDestination, LinkedTo. |
LoadSounds (0x00505560) | Translates GeneratedType as a DWORD, then truncates it to a byte on save, discarding the upper 24 bits. | |
LoadEncounters (0x00505060) | Nested arrays reusing the Geometry and SpawnPointList layouts built for UTE boundaries. | |
LoadPlaceableCameras (0x00505eb0) | Client-side struct reading composite GFF spatial types. Rejects a list of 51 or more entries. | |
List (items) (0x00504de0) | The generically-named parent list carries item instances specifically. |
The saved-form fallbacks a corpus actually caught
Across the saved-GIT corpus, every reader fallback fires uniformly except for a
small set: the only saved-form paths where a scan caught the absent case in the
wild. UseTemplates above is the highest-stakes of
them. The rest are traced and settled on their own format pages, listed here so
the full set is visible from one place.
| Path | Behaviour | Traced on |
|---|---|---|
WaypointList.MapNote / MapNoteEnabled | An absent MapNote silently discards the whole HasMapNote/MapNoteEnabled/MapNote trio, leaving the waypoint at its constructed defaults | UTW |
Creature List.ClassList.KnownList0 | Absent or empty leaves that class with zero known powers, no abort. Within a present list, a power resolving to the 0xFFFF sentinel is dropped rather than stored as a zero power | UTC |
Creature List.ClassList.SpellsPerDayList | An absent list is a soft no-op, and only the first entry of a present list is ever applied | UTC |
Creature List.FeatList | An absent Feat on a present entry contributes nothing: a presence-chain abort scoped to that list position, not a defaulted 0 feat | UTC |
TriggerList.PortraitId | An unconditional literal 0xFFFF, routing to the string-Portrait branch | UTT |
Placeable List.PortraitId | The identical 0xFFFF literal, same branch, same conclusion as Trigger | UTP |
Encounter List.SpawnPointList | Only reloaded if present and non-empty; an absent list leaves spawn points as already built | UTE |
Placement fields
Position and orientation are named differently per class
The labels are hardcoded per entity class in swkotor.exe.
| Lists | Position | Orientation |
|---|---|---|
| Creatures, triggers, items, waypoints, stores | XPosition, YPosition, ZPosition | XOrientation, YOrientation, ZOrientation (vector) |
| Doors, placeables | X, Y, Z | Bearing (single float angle) |
| Area effects | PositionX, PositionY, PositionZ | OrientationX, OrientationY, OrientationZ (vector) |
| Sounds, encounters | XPosition, YPosition, ZPosition | none at the object level |
On several lists a static element carries two orientation components and a
saved one carries three. Across a full install, every Creature List,
WaypointList, StoreList and area List element carries XOrientation and
YOrientation and none carries ZOrientation; across a corpus of savegames,
every element of those same lists carries all three. TriggerList is the
exception and carries all three in both. A writer emitting the full vector onto
a static placement produces a label no shipped module file has.
Bearing does not mean the same thing for the two classes that use it. A door
stores its scalar bearing verbatim, while a placeable derives Bearing from the
yaw of its orientation at save time, which is lossy.
Encounter spawn points inside SpawnPointList carry a single-float
Orientation per point, distinct from both the Bearing scalar and the
orientation vector. Sounds have no orientation at all and use Positional and
RandomPosition flags plus RandomRangeX and RandomRangeY instead.
Warning
Orientation normalization Where a normalised orientation vector resolves to all zeroes, as it can in
StoreListorAreaEffectList, the engine catches the division and falls back to(0, 1, 0).
ObjectId has one default across every list, static or saved
ObjectId is not read by any per-type field loader (LoadDoor,
LoadPlaceable, LoadTrigger, the sound, store, encounter and item loaders,
LoadWaypoint). It is read exactly once per element by the area-level list
dispatcher, before that dispatcher branches into the static or the full-instance
path.
Every one of those dispatchers uses the identical default, 0x7F000000
(OBJECT_INVALID). Since the read happens once, ahead of the branch, and both
branches receive the same already-assigned id, there is no static-versus-saved
distinction for this field anywhere in the engine.
The field-level default documented for AreaEffectList below is not a special
case, it is this general rule.
module.ifo’s Mod_Area_list
follows it too: its ObjectId read, gated behind the save-game flag, also
defaults to 0x7F000000.
Creatures are the exception, and there the field is dead rather than
defaulted. CSWSArea::LoadCreatures branches on UseTemplates before
touching the field rather than after, and the two branches differ in kind. The
save branch reads it like every other type, with
CResGFF::ReadFieldDWORD(..., "ObjectId", ..., 0x7F000000), so an absent field
genuinely defaults. The static branch issues no ReadField* call against
"ObjectId" anywhere: 0x7F000000 reaches the CSWSCreature constructor as a
bare literal.
Both branches land on the same number and only one of them is defaulting an
absent field. So whatever a static .git creature entry carries there has no
effect, the same never-looked-up status as UTC’s Tail and Wings.
On the write side every area-level list writer (CSWSArea::SaveCreatures,
SaveDoors, SavePlaceables, SaveTriggers, SaveSounds, SaveStores,
SaveItems, SaveWaypoints, SaveEncounters, SaveAreaEffects) adds the
list element, writes ObjectId straight off the live object’s id, and only then
delegates the rest to the per-type save function. The per-type function never
touches the label, just as the per-type loader never reads it.
Creatures are the one list whose two sides disagree. SaveCreatures writes
ObjectId with no branch around it, while the static-placement branch of
LoadCreatures never looks for it. Nothing the engine writes meets both, since
a save carries no UseTemplates and so always takes the branch that does read.
The mismatch is there for a hand-authored static .git.
The base-object fields come from one shared read
Commandable is not a per-type field, and neither are its neighbours.
CSWSObject::LoadObjectState reads them, and every GIT object loader calls it:
creatures, doors, placeables, waypoints, encounters, triggers, stores, items and
area effects, along with the path that restores the party. An absent
Commandable resolves to a literal 1.
That read happens only on the save-instance branch. It is gated the same way
as the effect list and the script variable tables loaded alongside it, so a
static placement’s load path never reaches the function. Which is why a module’s
.git carries none of these labels and a savegame carries all of them:
CSWSObject::SaveObjectState writes them unconditionally whenever anything is
saved, and nothing on the static side ever looks.
LoadSounds is the exception. It is the only dispatcher that never calls
LoadObjectState, so a sound object’s base state is not read back on either
branch. Why it differs has not been traced.
Fields that look like overrides and are not
Three labels on a placed instance invite the same wrong assumption, that the value there overrides the blueprint’s. Only one of them does.
Appearance is a real override on doors and placeables
Both CSWSDoor::LoadDoor and CSWSPlaceable::LoadPlaceable read a field
literally named Appearance as a DWORD and truncate it to a single byte, the
same truncation already documented for the .utd and .utp blueprint reads.
For doors the resolved byte immediately keys doortypes.2da’s Model and
VisibleModel columns to pick the door’s mesh, so this is a genuine “which
visual model represents this object” field. It defaults to 0 when absent: a
hardcoded literal on the placeable path, the door struct’s own zero-initialized
member on the door path.
LoadDoor and LoadPlaceable are the same shared readers regardless of which
path calls them. So a sparse, template-referencing door or placeable placement
carrying its own Appearance has that value read as an override on top of the
blueprint’s. Appearance is live on the static form, not exclusive to the
snapshot form, even though a static placement only sparsely carries Bearing,
position and ObjectId by convention.
Compare UTE’s Appearance, which shares
the label and is never read at all. A placed WaypointList[].Appearance
follows UTE’s dead pattern rather than this one: LoadWaypoint’s fully
decompiled field list has no room for it, confirmed directly (see
UTW). A waypoint has no rendered model to
select, so that is the expected outcome rather than a surprising one.
Description is toolset residue
Description is a real blueprint-level field on both UTD and
UTP, which the area loader never reads out of a placed instance’s own
GIT entry.
Traced through CSWSDoor::LoadDoorExternal and CSWSArea::LoadPlaceables. The
GIT-instance path resolves Description, and every other non-instance field,
from the referenced blueprint through LoadFromTemplate, and the four-field
door overlay (see UTD) does not
include it.
So a Description in a GIT door or placeable entry is written by the toolset
and never consulted, consistent with the corpus finding that almost every file
carries the field and only one holds a non-empty value.
It is not area-level metadata either: CSWSArea::LoadProperties, which reads
the GIT’s own AreaProperties, has no Description field at all.
This was confirmed for door and placeable entries specifically. Creature, item,
store, trigger, encounter, sound and camera entries were not individually
checked, so treat the same conclusion as likely but unproven for those.
Waypoints are a related but distinct case: a placed waypoint’s Description is
not residue with a source that goes unread, it has no source at all, because
waypoints never resolve a TemplateResRef (see
UTW).
The blueprint’s Tag always wins
UTD documents that a templated door’s
Tag comes from its .utd blueprint with no per-instance overlay, so two doors
sharing one blueprint share one tag. That is general engine behaviour rather
than a door-specific gap.
Confirmed directly for placeable, trigger, sound, store and encounter, and for creature and item as time allowed:
- Placeable, sound, encounter, creature, item. The shared field-reading
routine (
LoadPlaceable,CSWSSoundObject::Load,ReadEncounterFromGff, theLoadCreature/LoadFromTemplatepair viaReadStatsFromGff,LoadDataFromGff) readsTagunconditionally from whichever struct it is handed: the placed instance’s own struct on a direct load, the blueprint’s top-level struct on a template load. The area-level dispatcher’s post-template overlay, where one exists at all, only ever covers position, orientation and geometry. - Trigger. Same pattern.
CSWSArea::LoadTriggersoverlaysTransitionDestination,LinkedTo,LinkedToModuleandLinkedToFlagsplus position and geometry back from the GIT instance after a template load, andTagis conspicuously not among them. - Store. Uses
ResRefrather thanTemplateResReffor templating, but does carry a genuine separateTag, read unconditionally byLoadStorethe same way.LoadStores’ post-template overlay covers only orientation and position.
The dead copy is not a rarity a reader can dismiss: every door placement in a
full install carries a Tag holding a real, non-empty value. It is a field
the toolset writes on every placement and the engine reads on none of them,
which is what makes it a trap rather than clutter.
Keep writing it anyway. A placement’s own Tag is dead exactly when the
placement is templated and live when it is not, so this is a conditional rather
than a field a writer may drop. Even where it is dead it is the only
per-placement identifier anything outside the engine has, which is why
fields the engine never reads
records it as the highest-cost drop on that page.
There is no engine-side protection anywhere against two placements sharing one
blueprint ending up with the same Tag, for any templated object type. Vanilla
avoids the collision purely by authoring convention, effectively one blueprint
per placed instance. A lint rule for this should be written generically across
every templating GIT object type rather than scoped to doors.
AreaProperties.EnvAudio has no consumer at all
The GIT’s AreaProperties struct carries an EnvAudio INT in most vanilla
files, and it is a different field from
ARE’s per-room EnvAudio: same name, different
struct, no engine consumer.
Neither CSWSArea::LoadProperties, which reads AreaProperties, nor its
ambient-sound delegate CSWSAmbientSound::Load, which reads MusicDelay,
MusicDay, MusicNight, MusicBattle, AmbientSndDay, AmbientSndNight,
AmbientSndDayVol and AmbientSndNitVol off that same struct, reads a field by
that name.
A binary-wide check rules out a missed function. The "EnvAudio" string
exists exactly once in the executable, with exactly one cross-reference, and
that reference is the ARE per-room reader.
It is plausibly a toolset habit, the area’s default or primary room EnvAudio
duplicated onto AreaProperties by the editor UI and never kept in sync, but
that is the strongest claim the evidence supports rather than a confirmed
mechanism. There is no absent-field default to report, since nothing looks for
the field.
Per-list findings
An encounter reads its whole field set either way
CSWSArea::LoadEncounters branches on UseTemplates the way the other
dispatchers do, into either CSWSEncounter::LoadEncounter or
LoadFromTemplate. Both arms then call ReadEncounterFromGff, the function
that actually reads an element, and it reads the same fields whichever one
called it. Those are its only two callers, neither narrows the field list, and
no branch inside it skips anything.
That field list runs well past the placement set. Alongside TemplateResRef,
position, orientation, Geometry and SpawnPointList, one pass also reads the
activation and difficulty scalars, LocalizedName and Tag, a CreatureList
whose elements carry a resref, a CR and a single-spawn flag, and a long run of
session state: spawn counts, heartbeat and last-spawn timestamps, entered and
left markers, started and exhausted flags, an AreaList and a SpawnList.
The generated table names each one.
So the difference between a module’s encounter and a save’s is not which code
runs over it. It is which labels the file carries. A static .git never has the
session-state labels written into it, so each takes its absent-field default
silently. A save’s GIT has them because the engine’s own writer put them there,
and they load back as live state.
Area-of-effect objects
AreaEffectList holds runtime spell and ability effect objects
(CSWSAreaOfEffectObject). These have no blueprint file: no loader anywhere in
the binary opens a template for one, so every field is read straight off the GIT
struct. Elements must carry struct id 13 or the loader skips them.
| Field | Type | Default | Engine evaluation |
|---|---|---|---|
Tag | CExoString | "" | |
AreaEffectId | INT | 0 | A freshly constructed object leaves this member uninitialized; the constant load default masks that gap. |
SpellId | DWORD | 0 | A fresh object uses an internal 0xFFFFFFFF sentinel, and the writer emits the value through an accessor rather than the raw member. A field genuinely missing from a save still resolves to 0 on load. |
Shape | BYTE | 0 | 0 is a circle, 1 a rectangle. Any other value skips both dimension fields, so the effect gets no shape geometry at all. |
MetaMagicType | BYTE | 0 | |
SpellSaveDC | INT | 0 | Fresh objects start at 14; the 0 applies only when a save genuinely omits the field. |
SpellLevel | INT | 0 | |
Radius | FLOAT | 0.0 | Read and written only when Shape == 0. |
Length / Width | FLOAT | 0.0 each | Read and written only when Shape == 1. The pair round-trips symmetrically. |
CreatorId / LinkedToObject / LastEntered / LastLeft | DWORD | 0 each | Fresh objects use the 0x7F000000 placeholder; 0 is only the fallback for a field genuinely absent from the save. |
Duration | DWORD | 0 | |
DurationType | BYTE | 0 | Fresh objects start at 2. |
LastHrtbtDay / LastHrtbtTime | DWORD | 0 each | |
PositionX / PositionY / PositionZ | FLOAT | 0.0 each | Read last, by the area-effect list loader, and passed straight into placement. |
OrientationX / OrientationY / OrientationZ | FLOAT | 0.0 each | Normalized on load. Where the vector’s squared magnitude is negligibly small (<= 0.0001) it falls back to (0, 1, 0). |
Note
Write-only script fields, confirmed dead on restore.
OnHeartbeat,OnUserDefined,OnObjEnterandOnObjExitare written by the save writer and never read back by any loader in the binary. A restored area-of-effect object never fires these events again, and nothing re-derives them fromAreaEffectIdorSpellIdon the load path.That 2DA-driven derivation does exist (
vfx_persistent.2da, keyed byAreaEffectId, supplyingOnHeartbeat,OnObjEnterandOnObjExitscript resrefs plus shape and size defaults), but it is wired exclusively into the fresh spell-cast creation path. The GIT loader has no equivalent step.OnUserDefinedgoes further: it is never populated by any path, fresh creation included, so it is dead in this engine build regardless.A restored effect does not go inert. Duration countdown, position tracking and collision-based area membership all keep working after a reload, since those run off the object’s own stored data rather than off scripts. It is specifically the scripted event hooks that go silent.
AreaProperties
Tracks stealth behaviour state and dynamic audio state. It reads
AmbientSndDayVol and AmbientSndNitVol and truncates their INT declarations
into a single runtime byte.
The loader and the save writer disagree on where several fields live. The
writer nests RestrictMode, StealthXPMax, StealthXPCurrent, StealthXPLoss,
StealthXPEnabled and SunFogColor inside the AreaProperties struct, but the
reader pulls those from the GIT’s top level instead. Only Unescapable is
genuinely read from inside AreaProperties.
Those fields are permanently dead in every save this engine’s own writer produces. They are always written to a location the reader never checks, so they always resolve to whatever value the object already held in memory.
TransPending, TransPendNextID and TransPendCurrID are written in both
places, the GIT top level and a redundant copy inside AreaProperties, but only
the top-level copy is consulted, so the AreaProperties copy is a harmless
duplicate. This is grounded in decompiled code with reasonably high confidence,
though inferred from variable-usage patterns rather than a byte-level
disassembly proof.
The ambient-sound fields read by CSWSAmbientSound::Load each carry over their
constructor’s pre-armed value when absent. This is a genuine carry-over with no
divergence between the constructed value and the read’s own fallback, unlike the
constructor-versus-literal mismatches found elsewhere in these audits.
| Field | Absent default |
|---|---|
MusicDelay | 5000 |
MusicDay | 2 |
MusicNight | 3 |
MusicBattle | 1 |
AmbientSndDay | 1 |
AmbientSndNight | 2 |
AmbientSndDayVol / AmbientSndNitVol | 0 each |
CameraList
Modelled as GitCamera entries, read by LoadPlaceableCameras. Position
defaults to the literal zero vector (0, 0, 0) and Orientation to the literal
identity quaternion (w=1, x=0, y=0, z=0; see
Vector4’s on-disk component order for which array slot w occupies),
both unconditional. The read helpers always populate the field from either the
GFF data or the supplied default, and the loader never branches on which one it
got.
An absent field does not drop the camera entry. It is always kept and registered, each field defaulting independently at its own read site with no carry-over and no derivation from a sibling.
| Field | Absent value |
|---|---|
CameraID | -1 |
FieldOfView | 55.0 |
Pitch, Height, MicRange | 0.0 |
CameraID and FieldOfView are confirmed directly against the read call. An
entry left at CameraID = -1 is not treated as a sentinel by any comparison. It
is simply unreachable by the script-side camera-id lookup, which matches only
real positive ids.
The 51-entry cap costs the whole list, not the entries past it. The count
is checked once before anything is read, and a list of 51 or more makes the
function return having loaded nothing. So an area with 51 cameras has none
rather than fifty. It is the only whole-list validation among the placement
loaders; every other one gates per element and lets the rest through.
Warning
LoadPlaceableCamerasresets state on an absent list where every other dispatcher skips. The others gate their whole per-entry body on the list being found, so an absent list is a no-op. Confirmed independently for each.
LoadPlaceableCamerasnever checks that flag. It passes the resolved entry count,0whenCameraListis absent, intoCGuiInGame::InitializePlaceableCameras, which overwrites the client-side camera counter unconditionally on every call.The blast radius is narrow. That counter is transient session-scoped UI state on the
CGuiInGamesingleton rather than a persistent per-object list, and no per-camera data is touched, since the per-entrySetPlaceableCameracalls do not run at a count of0.The mechanism is still different from every other loader here, which matters if you are reasoning about what an absent list means across GIT generally. It is not uniform.
A placed store’s inventory
This reduces to the blueprint case by identity rather than analogy.
StoreList’s per-instance field reader is CSWSStore::LoadStore, the same
function UTM’s own load path confirms treats
an absent ItemList as a pure skip. There is no separate GIT-side ItemList
read or clear layered on top for a placed store instance.
The AreaMap exploration bitmap
The minimap’s explored-so-far state, bypassed entirely on a fresh load and read only from a save. It is the one struct here a save editor has to author rather than carry across, so the layout is given in full.
The measurements below come from the AreaMap structs in a save corpus of the
committed fixture folders plus a local backup set, read with a GFF navigator
written for the purpose. The install is modded, so nothing here describes
BioWare’s own content, but every result is structural or arithmetic and
transfers regardless.
Size
AreaMapDataSize carries no information the other two fields do not:
size_in_bytes = 4 * ceil( (ResX + 1) * (ResY + 1) / 32 )
That reproduces the declared size in every instance across every resolution pair present, and the declared size equals the blob’s actual length in each one.
The nearest alternative formulas were run on the same data as controls. Of the ten distinct resolution pairs, they matched five, three, one and one respectively, against this formula’s ten. So it is not a formula that fits because many would.
Grid
The cells are (ResX + 1) by (ResY + 1), one bit each. The two fields are
not the cell counts, and a reader sizing from ResX * ResY is short by a full
row and a full column and mis-indexes everything after the first row.
Three independent things say so: the size formula above; the fact that many
partly-explored blobs carry set bits past index ResX * ResY while none
carries one past (ResX+1) * (ResY+1); and the degenerate 1x1 areas, where
four declared cells sit in thirty-two bits of storage and every non-saturated
value puts all its set bits inside the low four positions.
Bit order and axis
Bit n is blob[n >> 3] >> (n & 7) & 1, and cell (col, row) is bit
row * (ResX + 1) + col. Byte-sequential, least significant bit first,
row-major.
That is settled by geometry rather than by arithmetic. Reshaping a partly-explored map row-major produces a single connected region, a corridor opening into a chamber; column-major produces noise with no connected structure. The strongest single case is a one-bit difference between two consecutive saves of the same area, which lands exactly on the ragged edge of the already-explored region and fills a one-cell notch. Under any other reading that bit falls in open space away from the frontier. Most-significant-bit-first was tested and is worse rather than better, pushing more blobs past the cell count.
Growth
Exploration is append-only. No consecutive pair of saves in the same area anywhere in the corpus loses a set bit, and the pairs that differ at all only ever gain them.
Note
Bits past the last cell are saturation, not layout The padding at the end of the allocation is the thing most likely to make a reader doubt the layout above. Some blobs do carry a set bit at or past the cell count. Every one of those is fully saturated, every bit in the allocation set, padding included, and no blob that is not saturated carries a single bit out there.
So a fully explored map is written as an all-ones fill across the whole allocation, which necessarily runs past the last cell. Nothing sits selectively in the padding.
A reader should mask to
(ResX+1) * (ResY+1)and ignore the tail. A writer filling a map may set the padding or not; the engine’s own output sets it.
How rakata models the two forms
Each dispatching list is a GitObjects<Static, Saved>: Static for
UseTemplates = 1 placements, Saved for UseTemplates = 0 snapshots. The
flag is not kept as a separate field on Git, because the enum already records
the choice and storing both would let them disagree.
| List | Static form | Saved form |
|---|---|---|
Creature List | GitCreature | SavedCreature |
Door List | GitDoor | SavedDoor |
Placeable List | GitPlaceable | SavedPlaceable |
TriggerList | GitTrigger | SavedTrigger |
StoreList | GitStore | SavedStore |
SoundList | GitSound | SavedSound |
List (items) | GitItem | SavedItem |
Three lists sit outside that shape:
WaypointListis a plainVec<GitWaypoint>, becauseLoadWaypointsignores the flag entirely and there is only ever one form to read.AreaEffectListis a plainVec<GitAreaEffect>, because these objects have no blueprint, so the saved form is the only form.Encounter Listis a plainVec<GitEncounter>, because the loader reads the same field set on both sides of the flag, so there are not two forms to tell apart. Its session state is declared and not modelled: the schema names those labels so a file carrying them does not read as unrecognised, and stops there, since the committed fixture saves hold no encounter for a model of the fields to check against.
Saved snapshots are checked against the fixture save corpus rather than
synthetic fixtures. Every object of every modelled type is parsed, written back,
and compared field by field against what the engine originally wrote.
AreaEffectList is the exception, since no fixture save has one; its field set
comes from the load and save behaviour documented above, and a test asserts the
list is still empty so a corpus that grows one does not go unchecked.
Implemented Linter Rules (Rakata-Lint)
Intra-resource rules needing no context, under rakata_lint::rules::git:
| Rule | Level | Fires when |
|---|---|---|
| GIT-001 Weather zeroing | Info | CurrentWeather != 0xFF or WeatherStarted is true; the engine forcibly zeros these on an interior area. |
| GIT-002 Camera array bounds | Error | CameraList holds 51 or more entries; immediate engine-level loader failure. |
| GIT-003 Stealth clamping | Warn | StealthXPCurrent > StealthXPMax; the engine clamps on evaluation. |
| GIT-004 Ambient volume truncation | Warn | AmbientSndDayVol or AmbientSndNitVol falls outside 0..=255; the engine truncates to a byte. |
GIT-005 Sound GeneratedType truncation | Warn | A sound’s GeneratedType exceeds 255; the engine truncates to a byte on save. Both forms of SoundList carry the field, so this applies to savegame content too. |
| GIT-007 Placement struct id | Error | A placement element’s struct_id is not the constant its list’s loader tests against. Covers the gated lists plus a trigger’s nested Geometry points on 3. CameraList is excluded because its loader never reads the value. Reads the raw GFF rather than the typed view, since a struct id belongs to the element record and does not survive from_gff. Weakest on the item List, whose constant 0 is also what an unset id holds. |
Resource-existence rules requiring a LintContext, under
rakata_lint::rules::git_range:
| Rule | Level | Fires when |
|---|---|---|
| GIT-006 Template resref existence | Warn | A per-instance TemplateResRef does not resolve to its expected typed template file. |
GIT-006 covers Creature List[].TemplateResRef (.utc), List[].TemplateResRef
(.uti), Door List[].TemplateResRef (.utd),
Placeable List[].TemplateResRef (.utp), SoundList[].TemplateResRef
(.uts), TriggerList[].TemplateResRef (.utt), StoreList[].ResRef (.utm)
and Encounter List[].TemplateResRef (.ute).
Waypoints have no template at all, since LoadWaypoint never reads a field
of that name under any circumstance. Doors do: a static door placement
resolves TemplateResRef against a .utd exactly as a creature or placeable
does (see UTD), so GitDoor carries
the field and the rule checks it.
Trigger LinkedToModule is deferred. The rule looks only at the static form of
each list, since a UseTemplates = 0 snapshot has no resref to resolve.
Open questions
-
The
AreaMaporigin corner. Which corner of the in-game minimap holds bit0, and whether the row index grows toward the top or the bottom of the player’s map. Everything measured above is invariant under reflection in either axis, so the saves cannot tell the four possibilities apart however many are read. That bounds what this corpus can settle; it does not bound the question. Tracked on #85.Two routes outside the bitmaps bear on it and neither has been tried. The game’s own minimap art ships in the GUI texture pack,
swpc_tex_gui.erf, as onelbl_map<area>texture per area, so a rendered blob can be laid against the picture the player sees. And the area’s ownMapsub-struct carriesNorthAxis,MapPt1X/MapPt2X,WorldPt1X/WorldPt2XandMapResX, which between them are the world-to-map transform this question is asking about. The art is not indexed bychitin.key, so searching the KEY file and the module archives comes back empty and reads as an absence; the texture packs are the family that search walks past.A save pair closes it outright if those routes fall short. Load an area with a large, mostly unexplored map and save. Walk into one identifiable region only, something describable as “the corridor along the west wall”, without fighting or looting. Save to a different slot. Diff the two, reshape the newly set bits row-major, and compare where the patch sits against where the region appeared on the minimap. That fixes the origin and both axis directions at once, and a second pair is needed only if the first region turns out symmetric in one axis.
What a tool can already do without it: author a map rather than merely preserve one. Size it, set arbitrary cells, and produce a blob the engine accepts and renders as a coherent region. What it cannot guarantee is that the region lands where the author intended rather than mirrored, flipped, or both. For “reveal the whole map”, the common editor feature, the origin does not matter at all, since saturation is what the engine itself writes and the corpus confirms it round-trips.
-
Why
LoadSoundsnever callsLoadObjectState. It is the only dispatcher that skips the shared base-object read, so a sound’sCommandableand its neighbours are not restored on either branch. The behaviour is confirmed; the reason is not traced. -
Descriptionon the unchecked list types. Confirmed toolset residue for doors and placeables. Creature, item, store, trigger, encounter, sound and camera entries were not individually checked. -
AreaPropertiesfield placement rests on variable-usage patterns. The loader-versus-writer disagreement is grounded in decompiled code with reasonably high confidence, but inferred rather than proven at byte level.
Every label the schema declares
Generated from the schema, so no label can be quietly left out. How to read these tables.
What the engine does with each field
| Field | Type | Engine | When absent |
|---|---|---|---|
WaypointList[].Appearance | BYTE | never reads it: a waypoint has no rendered model to select, and no waypoint load path reads the field | NOT EXAMINED; we substitute 0 |
WaypointList[].Description | CExoLocString | never reads it: a waypoint resolves no template, so this value has no source anywhere rather than one that goes unread | NOT EXAMINED; we substitute empty |
WaypointList[].LinkedTo | CExoString | never reads it: a waypoint has no transition capability, so there is nothing for a destination tag to name | NOT EXAMINED; we substitute "" |
WaypointList[].TemplateResRef | CResRef | never reads it: no waypoint load path reads it, including the script-spawn fallback, where the resref comes from the script call | NOT EXAMINED; we substitute "" |
Encounter List[].Active | BYTE | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].AreaListMaxSize | INT | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].AreaPoints | FLOAT | reads it | NOT EXAMINED; we substitute 0.0 |
Encounter List[].CurrentSpawns | INT | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].CustomScriptId | INT | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].Difficulty | INT | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].DifficultyIndex | INT | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].Exhausted | BYTE | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].Faction | DWORD | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].HeartbeatDay | DWORD | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].HeartbeatTime | DWORD | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].LastEntered | DWORD | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].LastLeft | DWORD | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].LastSpawnDay | DWORD | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].LastSpawnTime | DWORD | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].LocalizedName | CExoLocString | reads it | NOT EXAMINED; we substitute empty |
Encounter List[].MaxCreatures | INT | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].NumberSpawned | INT | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].OnEntered | CResRef | reads it | NOT EXAMINED; we substitute "" |
Encounter List[].OnExhausted | CResRef | reads it | NOT EXAMINED; we substitute "" |
Encounter List[].OnExit | CResRef | reads it | NOT EXAMINED; we substitute "" |
Encounter List[].OnHeartbeat | CResRef | reads it | NOT EXAMINED; we substitute "" |
Encounter List[].OnUserDefined | CResRef | reads it | NOT EXAMINED; we substitute "" |
Encounter List[].PlayerOnly | BYTE | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].RecCreatures | INT | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].Reset | BYTE | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].ResetTime | INT | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].Respawns | INT | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].SpawnOption | INT | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].SpawnPoolActive | FLOAT | reads it | NOT EXAMINED; we substitute 0.0 |
Encounter List[].Started | BYTE | reads it | NOT EXAMINED; we substitute 0 |
Encounter List[].Tag | CExoString | reads it | NOT EXAMINED; we substitute "" |
Encounter List[].AreaList | List | reads it | NOT EXAMINED; we substitute container |
Encounter List[].CreatureList | List | reads it | NOT EXAMINED; we substitute container |
Encounter List[].SpawnList | List | reads it | NOT EXAMINED; we substitute container |
Encounter List[].SpawnList[].SpawnResRef | CResRef | reads it | NOT EXAMINED; we substitute "" |
Encounter List[].SpawnList[].SpawnCR | FLOAT | reads it | NOT EXAMINED; we substitute 0.0 |
AreaEffectList[].OnHeartbeat | CResRef | writes it, never reads it back: the save writer emits it and no loader reads it back, so a restored effect never fires this hook again; the 2DA-driven re-derivation exists only on the fresh spell-cast path | not one constant; we substitute "" |
AreaEffectList[].OnUserDefined | CResRef | writes it, never reads it back: no path populates it, fresh creation included, so it is dead in this build regardless of load versus save | not one constant; we substitute "" |
AreaEffectList[].OnObjEnter | CResRef | writes it, never reads it back: the save writer emits it and no loader reads it back, so a restored effect never fires this hook again; the 2DA-driven re-derivation exists only on the fresh spell-cast path | not one constant; we substitute "" |
AreaEffectList[].OnObjExit | CResRef | writes it, never reads it back: the save writer emits it and no loader reads it back, so a restored effect never fires this hook again; the 2DA-driven re-derivation exists only on the fresh spell-cast path | not one constant; we substitute "" |
AreaProperties.StealthXPMax | DWORD | never reads it: the save writer nests it here but the reader pulls it from the GIT’s top level instead, so it always resolves to whatever the object already held | not one constant; we substitute 0 |
AreaProperties.StealthXPCurrent | DWORD | never reads it: the save writer nests it here but the reader pulls it from the GIT’s top level instead, so it always resolves to whatever the object already held | not one constant; we substitute 0 |
AreaProperties.StealthXPLoss | DWORD | never reads it: the save writer nests it here but the reader pulls it from the GIT’s top level instead, so it always resolves to whatever the object already held | not one constant; we substitute 0 |
AreaProperties.StealthXPEnabled | BYTE | never reads it: the save writer nests it here but the reader pulls it from the GIT’s top level instead, so it always resolves to whatever the object already held | not one constant; we substitute 0 |
AreaProperties.TransPending | BYTE | never reads it: written both here and at the GIT’s top level, and only the top-level copy is ever consulted | not one constant; we substitute 0 |
AreaProperties.TransPendNextID | BYTE | never reads it: written both here and at the GIT’s top level, and only the top-level copy is ever consulted | not one constant; we substitute 0 |
AreaProperties.TransPendCurrID | BYTE | never reads it: written both here and at the GIT’s top level, and only the top-level copy is ever consulted | not one constant; we substitute 0 |
AreaProperties.SunFogColor | DWORD | never reads it: the save writer nests it here but the reader pulls it from the GIT’s top level instead, so it always resolves to whatever the object already held | not one constant; we substitute 0 |
AreaProperties.EnvAudio | INT | never reads it: the only EnvAudio the engine reads is the ARE per-room field, a different field sharing the label | NOT EXAMINED; we substitute 0 |
Creature List | List | reads it | not one constant; we substitute container |
Door List[].Appearance | DWORD | reads it | keeps 0 |
Door List[].Tag | CExoString | never reads it: a templated placement takes its tag from the blueprint, which the placement cannot override | NOT EXAMINED; we substitute "" |
Placeable List[].Appearance | DWORD | reads it | stamps 0 |
SoundList[].Commandable | BYTE | writes it, never reads it back: CSWSObject::LoadObjectState is what reads this label and LoadSounds is the only area-level dispatcher that never calls it, so neither branch of a sound’s load reaches the read; the save writer emits it on every saved sound regardless | NOT EXAMINED; we substitute 0 |
TriggerList[].Tag | CExoString | never reads it: a templated placement takes its tag from the blueprint, which the placement cannot override | NOT EXAMINED; we substitute "" |
Fields nobody has examined
Whether the engine reads these has not been established, which is not the same as establishing that it does not. Where When absent carries an answer, that half is settled.
| Field | Type | When absent |
|---|---|---|
AreaMap | Struct | NOT EXAMINED; the field holds the absence |
AreaMap.AreaMapResX | INT | NOT EXAMINED; we substitute 0 |
AreaMap.AreaMapResY | INT | NOT EXAMINED; we substitute 0 |
AreaMap.AreaMapDataSize | DWORD | NOT EXAMINED; we substitute 0 |
AreaMap.AreaMapData | VOID | NOT EXAMINED; we substitute ```` |
CurrentWeather | BYTE | NOT EXAMINED; we substitute 0 |
WeatherStarted | BYTE | NOT EXAMINED; we substitute 0 |
WaypointList | List | not one constant; we substitute container |
WaypointList[].Tag | CExoString | stamps "" |
WaypointList[].LocalizedName | CExoLocString | stamps empty |
WaypointList[].Commandable | BYTE | NOT EXAMINED; the field holds the absence |
WaypointList[].XOrientation | FLOAT | not one constant; we substitute 0.0 |
WaypointList[].YOrientation | FLOAT | not one constant; we substitute 0.0 |
WaypointList[].ZOrientation | FLOAT | not one constant; the field holds the absence |
WaypointList[].ObjectId | DWORD | stamps 2130706432; we keep the absence instead |
WaypointList[].XPosition | FLOAT | stamps 0.0 |
WaypointList[].YPosition | FLOAT | stamps 0.0 |
WaypointList[].ZPosition | FLOAT | stamps 0.0 |
WaypointList[].HasMapNote | BYTE | keeps 0 |
WaypointList[].MapNote | CExoLocString | keeps empty |
WaypointList[].MapNoteEnabled | BYTE | stamps 0 |
Encounter List | List | not one constant; we substitute container |
Encounter List[].Geometry | List | not one constant; we substitute container |
Encounter List[].Geometry[].X | FLOAT | NOT EXAMINED; we substitute 0.0 |
Encounter List[].Geometry[].Y | FLOAT | NOT EXAMINED; we substitute 0.0 |
Encounter List[].Geometry[].Z | FLOAT | NOT EXAMINED; we substitute 0.0 |
Encounter List[].SpawnPointList | List | not one constant; we substitute container |
Encounter List[].SpawnPointList[].X | FLOAT | NOT EXAMINED; we substitute 0.0 |
Encounter List[].SpawnPointList[].Y | FLOAT | NOT EXAMINED; we substitute 0.0 |
Encounter List[].SpawnPointList[].Z | FLOAT | NOT EXAMINED; we substitute 0.0 |
Encounter List[].SpawnPointList[].Orientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
Encounter List[].ObjectId | DWORD | stamps 2130706432; we keep the absence instead |
Encounter List[].TemplateResRef | CResRef | NOT EXAMINED; the field holds the absence |
Encounter List[].XPosition | FLOAT | keeps 0.0 |
Encounter List[].YPosition | FLOAT | keeps 0.0 |
Encounter List[].ZPosition | FLOAT | keeps 0.0 |
Encounter List[].AreaListSize | INT | NOT EXAMINED; we substitute 0 |
Encounter List[].Commandable | BYTE | NOT EXAMINED; we substitute 0 |
Encounter List[].ActionList | List | NOT EXAMINED; we substitute container |
Encounter List[].VarTable | List | NOT EXAMINED; we substitute container |
Encounter List[].SWVarTable | Struct | NOT EXAMINED; we substitute container |
AreaEffectList | List | not one constant; we substitute container |
AreaEffectList[].Tag | CExoString | stamps "" |
AreaEffectList[].AreaEffectId | INT | stamps 0 |
AreaEffectList[].SpellId | DWORD | stamps 0 |
AreaEffectList[].SpellSaveDC | INT | stamps 0 |
AreaEffectList[].SpellLevel | INT | stamps 0 |
AreaEffectList[].MetaMagicType | BYTE | stamps 0 |
AreaEffectList[].CreatorId | DWORD | stamps 0 |
AreaEffectList[].LinkedToObject | DWORD | stamps 0 |
AreaEffectList[].LastEntered | DWORD | stamps 0 |
AreaEffectList[].LastLeft | DWORD | stamps 0 |
AreaEffectList[].Duration | DWORD | stamps 0 |
AreaEffectList[].DurationType | BYTE | stamps 0 |
AreaEffectList[].LastHrtbtDay | DWORD | stamps 0 |
AreaEffectList[].LastHrtbtTime | DWORD | stamps 0 |
AreaEffectList[].ObjectId | DWORD | stamps 2130706432 |
AreaEffectList[].OrientationX | FLOAT | not one constant; we substitute 0.0 |
AreaEffectList[].OrientationY | FLOAT | not one constant; we substitute 0.0 |
AreaEffectList[].OrientationZ | FLOAT | not one constant; we substitute 0.0 |
AreaEffectList[].PositionX | FLOAT | stamps 0.0 |
AreaEffectList[].PositionY | FLOAT | stamps 0.0 |
AreaEffectList[].PositionZ | FLOAT | stamps 0.0 |
AreaEffectList[].Shape | BYTE | stamps 0 |
AreaEffectList[].Radius | FLOAT | not one constant; we substitute 0.0 |
AreaEffectList[].Length | FLOAT | not one constant; we substitute 0.0 |
AreaEffectList[].Width | FLOAT | not one constant; we substitute 0.0 |
AreaProperties | Struct | NOT EXAMINED; the field holds the absence |
AreaProperties.Unescapable | BYTE | NOT EXAMINED; we substitute 0 |
AreaProperties.MusicDelay | INT | keeps 5000 |
AreaProperties.MusicDay | INT | keeps 2 |
AreaProperties.MusicNight | INT | keeps 3 |
AreaProperties.MusicBattle | INT | keeps 1 |
AreaProperties.AmbientSndDay | INT | keeps 1 |
AreaProperties.AmbientSndNight | INT | keeps 2 |
AreaProperties.AmbientSndDayVol | INT | keeps 0 |
AreaProperties.AmbientSndNitVol | INT | keeps 0 |
CameraList | List | not one constant; we substitute container |
CameraList[].CameraID | INT | stamps -1 |
CameraList[].Position | Vector3 | stamps (0.0, 0.0, 0.0) |
CameraList[].Orientation | Vector4 | stamps (1.0, 0.0, 0.0, 0.0) |
CameraList[].Pitch | FLOAT | stamps 0.0 |
CameraList[].Height | FLOAT | stamps 0.0 |
CameraList[].FieldOfView | FLOAT | stamps 55.0 |
CameraList[].MicRange | FLOAT | stamps 0.0 |
Creature List[].XPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].YPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].ZPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].XOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].YOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].ZOrientation | FLOAT | NOT EXAMINED; the field holds the absence |
Creature List[].TemplateResRef | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ObjectId | DWORD | stamps 2130706432 |
Creature List[].AIState | INT | NOT EXAMINED; we substitute 0 |
Creature List[].Age | INT | NOT EXAMINED; we substitute 0 |
Creature List[].AmbientAnimState | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Animation | INT | NOT EXAMINED; we substitute 0 |
Creature List[].Appearance_Head | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Appearance_Type | WORD | NOT EXAMINED; we substitute 0 |
Creature List[].AreaId | DWORD | NOT EXAMINED; we substitute 0 |
Creature List[].ArmorClass | SHORT | NOT EXAMINED; we substitute 0 |
Creature List[].BodyBag | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Cha | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].ChallengeRating | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].ClassList | List | NOT EXAMINED; we substitute container |
Creature List[].ClassList[].Class | INT | NOT EXAMINED; we substitute 0 |
Creature List[].ClassList[].ClassLevel | SHORT | NOT EXAMINED; we substitute 0 |
Creature List[].ClassList[].KnownList0 | List | not one constant; we substitute container |
Creature List[].ClassList[].KnownList0[].Spell | WORD | NOT EXAMINED; we substitute 0 |
Creature List[].ClassList[].SpellsPerDayList | List | not one constant; we substitute container |
Creature List[].ClassList[].SpellsPerDayList[].NumSpellsLeft | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Color_Hair | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Color_Skin | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Color_Tattoo1 | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Color_Tattoo2 | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Commandable | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Con | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Conversation | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].CreatnScrptFird | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].CreatureSize | INT | NOT EXAMINED; we substitute 0 |
Creature List[].CurrentForce | SHORT | NOT EXAMINED; we substitute 0 |
Creature List[].CurrentHitPoints | SHORT | NOT EXAMINED; we substitute 0 |
Creature List[].DeadSelectable | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Deity | CExoString | NOT EXAMINED; we substitute "" |
Creature List[].Description | CExoLocString | NOT EXAMINED; we substitute empty |
Creature List[].DetectMode | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Dex | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Disarmable | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].DuplicatingHead | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Equip_ItemList | List | NOT EXAMINED; we substitute container |
Creature List[].Equip_ItemList[].TemplateResRef | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].Equip_ItemList[].BodyVariation | BYTE | not one constant; the field holds the absence |
Creature List[].Equip_ItemList[].TextureVar | BYTE | not one constant; the field holds the absence |
Creature List[].Equip_ItemList[].Infinite | BYTE | not one constant; the field holds the absence |
Creature List[].Equip_ItemList[].AddCost | DWORD | keeps 0 |
Creature List[].Equip_ItemList[].BaseItem | INT | keeps 30 |
Creature List[].Equip_ItemList[].Charges | BYTE | stamps 50 |
Creature List[].Equip_ItemList[].Cost | DWORD | NOT EXAMINED; we substitute 0 |
Creature List[].Equip_ItemList[].DELETING | BYTE | keeps 0 |
Creature List[].Equip_ItemList[].DescIdentified | CExoLocString | keeps empty |
Creature List[].Equip_ItemList[].Description | CExoLocString | keeps empty |
Creature List[].Equip_ItemList[].Dropable | BYTE | stamps 0 |
Creature List[].Equip_ItemList[].Identified | BYTE | stamps 1 |
Creature List[].Equip_ItemList[].LocalizedName | CExoLocString | keeps empty |
Creature List[].Equip_ItemList[].MaxCharges | BYTE | not one constant; we substitute 0 |
Creature List[].Equip_ItemList[].ModelVariation | BYTE | not one constant; we substitute 0 |
Creature List[].Equip_ItemList[].NewItem | BYTE | keeps 0 |
Creature List[].Equip_ItemList[].NonEquippable | BYTE | keeps 0 |
Creature List[].Equip_ItemList[].Pickpocketable | BYTE | stamps 0 |
Creature List[].Equip_ItemList[].Plot | BYTE | keeps 0 |
Creature List[].Equip_ItemList[].PropertiesList | List | not one constant; we substitute container |
Creature List[].Equip_ItemList[].PropertiesList[].CostTable (required) | BYTE | whatever the memory held; we substitute 0 |
Creature List[].Equip_ItemList[].PropertiesList[].CostValue (required) | WORD | whatever the memory held; we substitute 0 |
Creature List[].Equip_ItemList[].PropertiesList[].Param1 (required) | BYTE | whatever the memory held; we substitute 0 |
Creature List[].Equip_ItemList[].PropertiesList[].Param1Value (required) | BYTE | whatever the memory held; we substitute 0 |
Creature List[].Equip_ItemList[].PropertiesList[].PropertyName (required) | WORD | whatever the memory held; we substitute 0 |
Creature List[].Equip_ItemList[].PropertiesList[].Subtype (required) | WORD | whatever the memory held; we substitute 0 |
Creature List[].Equip_ItemList[].PropertiesList[].ChanceAppear (required) | BYTE | whatever the memory held; we substitute 100 |
Creature List[].Equip_ItemList[].PropertiesList[].Useable | BYTE | not one constant; the field holds the absence |
Creature List[].Equip_ItemList[].PropertiesList[].UsesPerDay | BYTE | stamps 0 |
Creature List[].Equip_ItemList[].PropertiesList[].UpgradeType | BYTE | stamps 0; we keep the absence instead |
Creature List[].Equip_ItemList[].StackSize | WORD | keeps 1 |
Creature List[].Equip_ItemList[].Stolen | BYTE | keeps 0 |
Creature List[].Equip_ItemList[].Tag | CExoString | keeps "" |
Creature List[].Equip_ItemList[].Upgrades | DWORD | keeps 0 |
Creature List[].Equip_ItemList[].ObjectId | DWORD | stamps 2130706432; we keep the absence instead |
Creature List[].Equip_ItemList[].XPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].Equip_ItemList[].YPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].Equip_ItemList[].ZPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].Equip_ItemList[].XOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].Equip_ItemList[].YOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].Equip_ItemList[].ZOrientation | FLOAT | NOT EXAMINED; the field holds the absence |
Creature List[].Experience | DWORD | NOT EXAMINED; we substitute 0 |
Creature List[].FactionID | WORD | NOT EXAMINED; we substitute 0 |
Creature List[].FeatList | List | not one constant; we substitute container |
Creature List[].FeatList[].Feat | WORD | NOT EXAMINED; we substitute 0 |
Creature List[].FirstName | CExoLocString | NOT EXAMINED; we substitute empty |
Creature List[].ForcePoints | SHORT | NOT EXAMINED; we substitute 0 |
Creature List[].FortSaveThrow | CHAR | NOT EXAMINED; we substitute 0 |
Creature List[].Gender | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Gold | DWORD | NOT EXAMINED; we substitute 0 |
Creature List[].GoodEvil | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].HitPoints | SHORT | NOT EXAMINED; we substitute 0 |
Creature List[].Int | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Interruptable | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].IsDestroyable | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].IsPC | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].IsRaiseable | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].ItemList | List | NOT EXAMINED; we substitute container |
Creature List[].ItemList[].TemplateResRef | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ItemList[].BodyVariation | BYTE | not one constant; the field holds the absence |
Creature List[].ItemList[].TextureVar | BYTE | not one constant; the field holds the absence |
Creature List[].ItemList[].Infinite | BYTE | not one constant; the field holds the absence |
Creature List[].ItemList[].AddCost | DWORD | keeps 0 |
Creature List[].ItemList[].BaseItem | INT | keeps 30 |
Creature List[].ItemList[].Charges | BYTE | stamps 50 |
Creature List[].ItemList[].Cost | DWORD | NOT EXAMINED; we substitute 0 |
Creature List[].ItemList[].DELETING | BYTE | keeps 0 |
Creature List[].ItemList[].DescIdentified | CExoLocString | keeps empty |
Creature List[].ItemList[].Description | CExoLocString | keeps empty |
Creature List[].ItemList[].Dropable | BYTE | stamps 0 |
Creature List[].ItemList[].Identified | BYTE | stamps 1 |
Creature List[].ItemList[].LocalizedName | CExoLocString | keeps empty |
Creature List[].ItemList[].MaxCharges | BYTE | not one constant; we substitute 0 |
Creature List[].ItemList[].ModelVariation | BYTE | not one constant; we substitute 0 |
Creature List[].ItemList[].NewItem | BYTE | keeps 0 |
Creature List[].ItemList[].NonEquippable | BYTE | keeps 0 |
Creature List[].ItemList[].Pickpocketable | BYTE | stamps 0 |
Creature List[].ItemList[].Plot | BYTE | keeps 0 |
Creature List[].ItemList[].PropertiesList | List | not one constant; we substitute container |
Creature List[].ItemList[].PropertiesList[].CostTable (required) | BYTE | whatever the memory held; we substitute 0 |
Creature List[].ItemList[].PropertiesList[].CostValue (required) | WORD | whatever the memory held; we substitute 0 |
Creature List[].ItemList[].PropertiesList[].Param1 (required) | BYTE | whatever the memory held; we substitute 0 |
Creature List[].ItemList[].PropertiesList[].Param1Value (required) | BYTE | whatever the memory held; we substitute 0 |
Creature List[].ItemList[].PropertiesList[].PropertyName (required) | WORD | whatever the memory held; we substitute 0 |
Creature List[].ItemList[].PropertiesList[].Subtype (required) | WORD | whatever the memory held; we substitute 0 |
Creature List[].ItemList[].PropertiesList[].ChanceAppear (required) | BYTE | whatever the memory held; we substitute 100 |
Creature List[].ItemList[].PropertiesList[].Useable | BYTE | not one constant; the field holds the absence |
Creature List[].ItemList[].PropertiesList[].UsesPerDay | BYTE | stamps 0 |
Creature List[].ItemList[].PropertiesList[].UpgradeType | BYTE | stamps 0; we keep the absence instead |
Creature List[].ItemList[].StackSize | WORD | keeps 1 |
Creature List[].ItemList[].Stolen | BYTE | keeps 0 |
Creature List[].ItemList[].Tag | CExoString | keeps "" |
Creature List[].ItemList[].Upgrades | DWORD | keeps 0 |
Creature List[].ItemList[].ObjectId | DWORD | stamps 2130706432; we keep the absence instead |
Creature List[].ItemList[].XPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].ItemList[].YPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].ItemList[].ZPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].ItemList[].XOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].ItemList[].YOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
Creature List[].ItemList[].ZOrientation | FLOAT | NOT EXAMINED; the field holds the absence |
Creature List[].JoiningXP | INT | NOT EXAMINED; we substitute 0 |
Creature List[].LastName | CExoLocString | NOT EXAMINED; we substitute empty |
Creature List[].Listening | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].MClassLevUpIn | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].MaxForcePoints | SHORT | NOT EXAMINED; we substitute 0 |
Creature List[].MaxHitPoints | SHORT | NOT EXAMINED; we substitute 0 |
Creature List[].Min1HP | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].MovementRate | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].NaturalAC | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].NotReorienting | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].PM_IsDisguised | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].PartyInteract | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Phenotype | INT | NOT EXAMINED; we substitute 0 |
Creature List[].Plot | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].PortraitId | WORD | stamps 65535 |
Creature List[].PregameCurrent | SHORT | NOT EXAMINED; we substitute 0 |
Creature List[].Race | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].RefSaveThrow | CHAR | NOT EXAMINED; we substitute 0 |
Creature List[].ScriptAttacked | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ScriptDamaged | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ScriptDeath | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ScriptDialogue | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ScriptDisturbed | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ScriptEndDialogu | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ScriptEndRound | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ScriptHeartbeat | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ScriptOnBlocked | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ScriptOnNotice | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ScriptRested | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ScriptSpawn | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ScriptSpellAt | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].ScriptUserDefine | CResRef | NOT EXAMINED; we substitute "" |
Creature List[].SkillList | List | NOT EXAMINED; we substitute container |
Creature List[].SkillList[].Rank | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].SkillPoints | WORD | NOT EXAMINED; we substitute 0 |
Creature List[].SoundSetFile | WORD | NOT EXAMINED; we substitute 0 |
Creature List[].StartingPackage | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].StealthMode | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Str | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Subrace | CExoString | NOT EXAMINED; we substitute "" |
Creature List[].SubraceIndex | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Tag | CExoString | NOT EXAMINED; we substitute "" |
Creature List[].Tail | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].UseBackupHead | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].WillSaveThrow | CHAR | NOT EXAMINED; we substitute 0 |
Creature List[].Wings | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].Wis | BYTE | NOT EXAMINED; we substitute 0 |
Creature List[].fortbonus | SHORT | NOT EXAMINED; we substitute 0 |
Creature List[].refbonus | SHORT | NOT EXAMINED; we substitute 0 |
Creature List[].willbonus | SHORT | NOT EXAMINED; we substitute 0 |
List | List | not one constant; we substitute container |
List[].ObjectId | DWORD | stamps 2130706432; we keep the absence instead |
List[].XPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
List[].YPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
List[].ZPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
List[].XOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
List[].YOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
List[].ZOrientation | FLOAT | NOT EXAMINED; the field holds the absence |
List[].TemplateResRef | CResRef | NOT EXAMINED; we substitute "" |
List[].TemplateResRef | CResRef | NOT EXAMINED; we substitute "" |
List[].BodyVariation | BYTE | not one constant; the field holds the absence |
List[].TextureVar | BYTE | not one constant; the field holds the absence |
List[].Infinite | BYTE | not one constant; the field holds the absence |
List[].AddCost | DWORD | keeps 0 |
List[].BaseItem | INT | keeps 30 |
List[].Charges | BYTE | stamps 50 |
List[].Cost | DWORD | NOT EXAMINED; we substitute 0 |
List[].DELETING | BYTE | keeps 0 |
List[].DescIdentified | CExoLocString | keeps empty |
List[].Description | CExoLocString | keeps empty |
List[].Dropable | BYTE | stamps 0 |
List[].Identified | BYTE | stamps 1 |
List[].LocalizedName | CExoLocString | keeps empty |
List[].MaxCharges | BYTE | not one constant; we substitute 0 |
List[].ModelVariation | BYTE | not one constant; we substitute 0 |
List[].NewItem | BYTE | keeps 0 |
List[].NonEquippable | BYTE | keeps 0 |
List[].Pickpocketable | BYTE | stamps 0 |
List[].Plot | BYTE | keeps 0 |
List[].PropertiesList | List | not one constant; we substitute container |
List[].PropertiesList[].CostTable (required) | BYTE | whatever the memory held; we substitute 0 |
List[].PropertiesList[].CostValue (required) | WORD | whatever the memory held; we substitute 0 |
List[].PropertiesList[].Param1 (required) | BYTE | whatever the memory held; we substitute 0 |
List[].PropertiesList[].Param1Value (required) | BYTE | whatever the memory held; we substitute 0 |
List[].PropertiesList[].PropertyName (required) | WORD | whatever the memory held; we substitute 0 |
List[].PropertiesList[].Subtype (required) | WORD | whatever the memory held; we substitute 0 |
List[].PropertiesList[].ChanceAppear (required) | BYTE | whatever the memory held; we substitute 100 |
List[].PropertiesList[].Useable | BYTE | not one constant; the field holds the absence |
List[].PropertiesList[].UsesPerDay | BYTE | stamps 0 |
List[].PropertiesList[].UpgradeType | BYTE | stamps 0; we keep the absence instead |
List[].StackSize | WORD | keeps 1 |
List[].Stolen | BYTE | keeps 0 |
List[].Tag | CExoString | keeps "" |
List[].Upgrades | DWORD | keeps 0 |
Door List | List | not one constant; we substitute container |
Door List[].LinkedTo | CExoString | not one constant; we substitute "" |
Door List[].LinkedToFlags | BYTE | not one constant; we substitute 0 |
Door List[].LinkedToModule | CResRef | not one constant; we substitute "" |
Door List[].ObjectId | DWORD | stamps 2130706432; we keep the absence instead |
Door List[].TransitionDestin | CExoLocString | keeps empty |
Door List[].TemplateResRef | CResRef | NOT EXAMINED; we substitute "" |
Door List[].X | FLOAT | NOT EXAMINED; we substitute 0.0 |
Door List[].Y | FLOAT | NOT EXAMINED; we substitute 0.0 |
Door List[].Z | FLOAT | NOT EXAMINED; we substitute 0.0 |
Door List[].Bearing | FLOAT | NOT EXAMINED; we substitute 0.0 |
Door List[].TrapDetectable | BYTE | keeps 1 |
Door List[].TrapDisarmable | BYTE | keeps 1 |
Door List[].TrapOneShot | BYTE | keeps 1 |
Door List[].TrapType | BYTE | keeps 255 |
Door List[].TrapDetectDC | BYTE | keeps 0 |
Door List[].DisarmDC | BYTE | keeps 0 |
Door List[].TrapFlag | BYTE | keeps 0 |
Door List[].OnClosed | CResRef | keeps "default" |
Door List[].OnDamaged | CResRef | keeps "default" |
Door List[].OnDeath | CResRef | keeps "default" |
Door List[].OnDisarm | CResRef | keeps "default" |
Door List[].OnHeartbeat | CResRef | keeps "default" |
Door List[].OnLock | CResRef | keeps "default" |
Door List[].OnMeleeAttacked | CResRef | keeps "default" |
Door List[].OnOpen | CResRef | keeps "default" |
Door List[].OnSpellCastAt | CResRef | keeps "default" |
Door List[].OnTrapTriggered | CResRef | keeps "default" |
Door List[].OnUnlock | CResRef | keeps "default" |
Door List[].OnUserDefined | CResRef | keeps "default" |
Door List[].Commandable | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].Conversation | CResRef | NOT EXAMINED; we substitute "" |
Door List[].CurrentHP | SHORT | NOT EXAMINED; we substitute 0 |
Door List[].Description | CExoLocString | NOT EXAMINED; we substitute empty |
Door List[].Faction | DWORD | NOT EXAMINED; we substitute 0 |
Door List[].GenericType | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].HP | SHORT | NOT EXAMINED; we substitute 0 |
Door List[].Hardness | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].LoadScreenID | WORD | NOT EXAMINED; we substitute 0 |
Door List[].LocName | CExoLocString | NOT EXAMINED; we substitute empty |
Door List[].Min1HP | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].OnClick | CResRef | keeps "default" |
Door List[].OnDialog | CResRef | keeps "default" |
Door List[].OnFailToOpen | CResRef | keeps "default" |
Door List[].OpenState | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].Plot | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].SecretDoorDC | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].Static | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].X | FLOAT | NOT EXAMINED; we substitute 0.0 |
Door List[].Y | FLOAT | NOT EXAMINED; we substitute 0.0 |
Door List[].Z | FLOAT | NOT EXAMINED; we substitute 0.0 |
Door List[].Bearing | FLOAT | NOT EXAMINED; we substitute 0.0 |
Door List[].Fort | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].Ref | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].Will | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].Locked | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].Lockable | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].KeyRequired | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].KeyName | CExoString | NOT EXAMINED; we substitute "" |
Door List[].AutoRemoveKey | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].OpenLockDC | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].CloseLockDC | BYTE | NOT EXAMINED; we substitute 0 |
Door List[].Portrait | CResRef | NOT EXAMINED; we substitute "" |
Door List[].PortraitId | WORD | stamps 65535 |
Placeable List | List | not one constant; we substitute container |
Placeable List[].ObjectId | DWORD | stamps 2130706432; we keep the absence instead |
Placeable List[].TemplateResRef | CResRef | NOT EXAMINED; we substitute "" |
Placeable List[].X | FLOAT | NOT EXAMINED; we substitute 0.0 |
Placeable List[].Y | FLOAT | NOT EXAMINED; we substitute 0.0 |
Placeable List[].Z | FLOAT | NOT EXAMINED; we substitute 0.0 |
Placeable List[].Bearing | FLOAT | NOT EXAMINED; we substitute 0.0 |
Placeable List[].ItemList | List | not one constant; we substitute container |
Placeable List[].ItemList[].TemplateResRef | CResRef | NOT EXAMINED; we substitute "" |
Placeable List[].ItemList[].BodyVariation | BYTE | not one constant; the field holds the absence |
Placeable List[].ItemList[].TextureVar | BYTE | not one constant; the field holds the absence |
Placeable List[].ItemList[].Infinite | BYTE | not one constant; the field holds the absence |
Placeable List[].ItemList[].AddCost | DWORD | keeps 0 |
Placeable List[].ItemList[].BaseItem | INT | keeps 30 |
Placeable List[].ItemList[].Charges | BYTE | stamps 50 |
Placeable List[].ItemList[].Cost | DWORD | NOT EXAMINED; we substitute 0 |
Placeable List[].ItemList[].DELETING | BYTE | keeps 0 |
Placeable List[].ItemList[].DescIdentified | CExoLocString | keeps empty |
Placeable List[].ItemList[].Description | CExoLocString | keeps empty |
Placeable List[].ItemList[].Dropable | BYTE | stamps 0 |
Placeable List[].ItemList[].Identified | BYTE | stamps 1 |
Placeable List[].ItemList[].LocalizedName | CExoLocString | keeps empty |
Placeable List[].ItemList[].MaxCharges | BYTE | not one constant; we substitute 0 |
Placeable List[].ItemList[].ModelVariation | BYTE | not one constant; we substitute 0 |
Placeable List[].ItemList[].NewItem | BYTE | keeps 0 |
Placeable List[].ItemList[].NonEquippable | BYTE | keeps 0 |
Placeable List[].ItemList[].Pickpocketable | BYTE | stamps 0 |
Placeable List[].ItemList[].Plot | BYTE | keeps 0 |
Placeable List[].ItemList[].PropertiesList | List | not one constant; we substitute container |
Placeable List[].ItemList[].PropertiesList[].CostTable (required) | BYTE | whatever the memory held; we substitute 0 |
Placeable List[].ItemList[].PropertiesList[].CostValue (required) | WORD | whatever the memory held; we substitute 0 |
Placeable List[].ItemList[].PropertiesList[].Param1 (required) | BYTE | whatever the memory held; we substitute 0 |
Placeable List[].ItemList[].PropertiesList[].Param1Value (required) | BYTE | whatever the memory held; we substitute 0 |
Placeable List[].ItemList[].PropertiesList[].PropertyName (required) | WORD | whatever the memory held; we substitute 0 |
Placeable List[].ItemList[].PropertiesList[].Subtype (required) | WORD | whatever the memory held; we substitute 0 |
Placeable List[].ItemList[].PropertiesList[].ChanceAppear (required) | BYTE | whatever the memory held; we substitute 100 |
Placeable List[].ItemList[].PropertiesList[].Useable | BYTE | not one constant; the field holds the absence |
Placeable List[].ItemList[].PropertiesList[].UsesPerDay | BYTE | stamps 0 |
Placeable List[].ItemList[].PropertiesList[].UpgradeType | BYTE | stamps 0; we keep the absence instead |
Placeable List[].ItemList[].StackSize | WORD | keeps 1 |
Placeable List[].ItemList[].Stolen | BYTE | keeps 0 |
Placeable List[].ItemList[].Tag | CExoString | keeps "" |
Placeable List[].ItemList[].Upgrades | DWORD | keeps 0 |
Placeable List[].ItemList[].ObjectId | DWORD | stamps 2130706432; we keep the absence instead |
Placeable List[].ItemList[].XPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
Placeable List[].ItemList[].YPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
Placeable List[].ItemList[].ZPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
Placeable List[].ItemList[].XOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
Placeable List[].ItemList[].YOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
Placeable List[].ItemList[].ZOrientation | FLOAT | NOT EXAMINED; the field holds the absence |
Placeable List[].TrapDetectable | BYTE | stamps 0 |
Placeable List[].TrapDisarmable | BYTE | stamps 0 |
Placeable List[].TrapOneShot | BYTE | stamps 0 |
Placeable List[].TrapType | BYTE | keeps 255 |
Placeable List[].TrapDetectDC | BYTE | stamps 0 |
Placeable List[].DisarmDC | BYTE | stamps 0 |
Placeable List[].TrapFlag | BYTE | stamps 0 |
Placeable List[].OnClosed | CResRef | stamps "" |
Placeable List[].OnDamaged | CResRef | stamps "" |
Placeable List[].OnDeath | CResRef | stamps "" |
Placeable List[].OnDisarm | CResRef | stamps "" |
Placeable List[].OnHeartbeat | CResRef | stamps "" |
Placeable List[].OnLock | CResRef | stamps "" |
Placeable List[].OnMeleeAttacked | CResRef | stamps "" |
Placeable List[].OnOpen | CResRef | stamps "" |
Placeable List[].OnSpellCastAt | CResRef | stamps "" |
Placeable List[].OnTrapTriggered | CResRef | stamps "" |
Placeable List[].OnUnlock | CResRef | stamps "" |
Placeable List[].OnUserDefined | CResRef | stamps "" |
Placeable List[].Animation | INT | NOT EXAMINED; we substitute 0 |
Placeable List[].BodyBag | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].Commandable | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].Conversation | CResRef | NOT EXAMINED; we substitute "" |
Placeable List[].CurrentHP | SHORT | NOT EXAMINED; we substitute 0 |
Placeable List[].Description | CExoLocString | NOT EXAMINED; we substitute empty |
Placeable List[].DieWhenEmpty | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].Faction | DWORD | NOT EXAMINED; we substitute 0 |
Placeable List[].GroundPile | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].HP | SHORT | NOT EXAMINED; we substitute 0 |
Placeable List[].Hardness | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].HasInventory | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].IsBodyBag | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].IsBodyBagVisible | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].IsCorpse | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].LightState | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].LocName | CExoLocString | NOT EXAMINED; we substitute empty |
Placeable List[].Min1HP | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].OnDialog | CResRef | stamps "" |
Placeable List[].OnEndDialogue | CResRef | stamps "" |
Placeable List[].OnInvDisturbed | CResRef | stamps "" |
Placeable List[].OnUsed | CResRef | stamps "" |
Placeable List[].Open | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].PartyInteract | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].Plot | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].Static | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].Tag | CExoString | NOT EXAMINED; we substitute "" |
Placeable List[].Useable | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].X | FLOAT | NOT EXAMINED; we substitute 0.0 |
Placeable List[].Y | FLOAT | NOT EXAMINED; we substitute 0.0 |
Placeable List[].Z | FLOAT | NOT EXAMINED; we substitute 0.0 |
Placeable List[].Bearing | FLOAT | NOT EXAMINED; we substitute 0.0 |
Placeable List[].Fort | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].Ref | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].Will | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].Locked | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].Lockable | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].KeyRequired | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].KeyName | CExoString | NOT EXAMINED; we substitute "" |
Placeable List[].AutoRemoveKey | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].OpenLockDC | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].CloseLockDC | BYTE | NOT EXAMINED; we substitute 0 |
Placeable List[].Portrait | CResRef | stamps "" |
Placeable List[].PortraitId | WORD | stamps 65535 |
SoundList | List | not one constant; we substitute container |
SoundList[].GeneratedType | DWORD | NOT EXAMINED; we substitute 0 |
SoundList[].ObjectId | DWORD | stamps 2130706432; we keep the absence instead |
SoundList[].XPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
SoundList[].YPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
SoundList[].ZPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
SoundList[].TemplateResRef | CResRef | NOT EXAMINED; we substitute "" |
SoundList[].Active | BYTE | NOT EXAMINED; we substitute 0 |
SoundList[].Continuous | BYTE | NOT EXAMINED; we substitute 0 |
SoundList[].FixedVariance | FLOAT | NOT EXAMINED; we substitute 0.0 |
SoundList[].Hours | DWORD | NOT EXAMINED; we substitute 0 |
SoundList[].Interval | DWORD | NOT EXAMINED; we substitute 0 |
SoundList[].IntervalVrtn | DWORD | NOT EXAMINED; we substitute 0 |
SoundList[].Looping | BYTE | NOT EXAMINED; we substitute 0 |
SoundList[].MaxDistance | FLOAT | NOT EXAMINED; we substitute 0.0 |
SoundList[].MinDistance | FLOAT | NOT EXAMINED; we substitute 0.0 |
SoundList[].PitchVariation | FLOAT | NOT EXAMINED; we substitute 0.0 |
SoundList[].Positional | BYTE | NOT EXAMINED; we substitute 0 |
SoundList[].Random | BYTE | NOT EXAMINED; we substitute 0 |
SoundList[].RandomPosition | BYTE | NOT EXAMINED; we substitute 0 |
SoundList[].RandomRangeX | FLOAT | NOT EXAMINED; we substitute 0.0 |
SoundList[].RandomRangeY | FLOAT | NOT EXAMINED; we substitute 0.0 |
SoundList[].Sounds | List | NOT EXAMINED; we substitute container |
SoundList[].Sounds[].Sound | CResRef | NOT EXAMINED; we substitute "" |
SoundList[].Tag | CExoString | NOT EXAMINED; we substitute "" |
SoundList[].Times | BYTE | NOT EXAMINED; we substitute 0 |
SoundList[].Volume | BYTE | NOT EXAMINED; we substitute 0 |
SoundList[].VolumeVrtn | BYTE | NOT EXAMINED; we substitute 0 |
TriggerList | List | not one constant; we substitute container |
TriggerList[].LinkedTo | CExoString | not one constant; we substitute "" |
TriggerList[].LinkedToFlags | BYTE | not one constant; we substitute 0 |
TriggerList[].LinkedToModule | CResRef | not one constant; we substitute "" |
TriggerList[].ObjectId | DWORD | stamps 2130706432; we keep the absence instead |
TriggerList[].TransitionDestin | CExoLocString | keeps empty |
TriggerList[].XPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
TriggerList[].YPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
TriggerList[].ZPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
TriggerList[].XOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
TriggerList[].YOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
TriggerList[].ZOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
TriggerList[].Geometry | List | not one constant; we substitute container |
TriggerList[].Geometry[].PointX | FLOAT | NOT EXAMINED; we substitute 0.0 |
TriggerList[].Geometry[].PointY | FLOAT | NOT EXAMINED; we substitute 0.0 |
TriggerList[].Geometry[].PointZ | FLOAT | NOT EXAMINED; we substitute 0.0 |
TriggerList[].TemplateResRef | CResRef | NOT EXAMINED; we substitute "" |
TriggerList[].TrapDetectable | BYTE | stamps 0 |
TriggerList[].TrapDisarmable | BYTE | stamps 0 |
TriggerList[].TrapOneShot | BYTE | keeps 1 |
TriggerList[].TrapType | BYTE | keeps 255 |
TriggerList[].Geometry | List | not one constant; we substitute container |
TriggerList[].Geometry[].PointX | FLOAT | NOT EXAMINED; we substitute 0.0 |
TriggerList[].Geometry[].PointY | FLOAT | NOT EXAMINED; we substitute 0.0 |
TriggerList[].Geometry[].PointZ | FLOAT | NOT EXAMINED; we substitute 0.0 |
TriggerList[].AutoRemoveKey | BYTE | NOT EXAMINED; we substitute 0 |
TriggerList[].Commandable | BYTE | NOT EXAMINED; we substitute 0 |
TriggerList[].CreatorId | DWORD | NOT EXAMINED; we substitute 0 |
TriggerList[].Cursor | BYTE | NOT EXAMINED; we substitute 0 |
TriggerList[].Faction | DWORD | NOT EXAMINED; we substitute 0 |
TriggerList[].HighlightHeight | FLOAT | NOT EXAMINED; we substitute 0.0 |
TriggerList[].KeyName | CExoString | NOT EXAMINED; we substitute "" |
TriggerList[].LoadScreenID | WORD | NOT EXAMINED; we substitute 0 |
TriggerList[].LocalizedName | CExoLocString | NOT EXAMINED; we substitute empty |
TriggerList[].OnClick | CResRef | keeps "default" |
TriggerList[].OnDisarm | CResRef | keeps "default" |
TriggerList[].OnTrapTriggered | CResRef | keeps "default" |
TriggerList[].ScriptHeartbeat | CResRef | keeps "default" |
TriggerList[].ScriptOnEnter | CResRef | keeps "default" |
TriggerList[].ScriptOnExit | CResRef | keeps "default" |
TriggerList[].ScriptUserDefine | CResRef | keeps "default" |
TriggerList[].SetByPlayerParty | BYTE | NOT EXAMINED; we substitute 0 |
TriggerList[].Type | INT | NOT EXAMINED; we substitute 0 |
TriggerList[].Portrait | CResRef | stamps "" |
TriggerList[].PortraitId | WORD | stamps 65535 |
StoreList | List | not one constant; we substitute container |
StoreList[].ObjectId | DWORD | stamps 2130706432; we keep the absence instead |
StoreList[].XPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
StoreList[].YPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
StoreList[].ZPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
StoreList[].XOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
StoreList[].YOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
StoreList[].ZOrientation | FLOAT | NOT EXAMINED; the field holds the absence |
StoreList[].ResRef | CResRef | NOT EXAMINED; we substitute "" |
StoreList[].BuySellFlag | BYTE | keeps 3 |
StoreList[].Commandable | BYTE | NOT EXAMINED; we substitute 0 |
StoreList[].ItemList | List | not one constant; we substitute container |
StoreList[].ItemList[].TemplateResRef | CResRef | NOT EXAMINED; we substitute "" |
StoreList[].ItemList[].BodyVariation | BYTE | not one constant; the field holds the absence |
StoreList[].ItemList[].TextureVar | BYTE | not one constant; the field holds the absence |
StoreList[].ItemList[].Infinite | BYTE | not one constant; the field holds the absence |
StoreList[].ItemList[].AddCost | DWORD | keeps 0 |
StoreList[].ItemList[].BaseItem | INT | keeps 30 |
StoreList[].ItemList[].Charges | BYTE | stamps 50 |
StoreList[].ItemList[].Cost | DWORD | NOT EXAMINED; we substitute 0 |
StoreList[].ItemList[].DELETING | BYTE | keeps 0 |
StoreList[].ItemList[].DescIdentified | CExoLocString | keeps empty |
StoreList[].ItemList[].Description | CExoLocString | keeps empty |
StoreList[].ItemList[].Dropable | BYTE | stamps 0 |
StoreList[].ItemList[].Identified | BYTE | stamps 1 |
StoreList[].ItemList[].LocalizedName | CExoLocString | keeps empty |
StoreList[].ItemList[].MaxCharges | BYTE | not one constant; we substitute 0 |
StoreList[].ItemList[].ModelVariation | BYTE | not one constant; we substitute 0 |
StoreList[].ItemList[].NewItem | BYTE | keeps 0 |
StoreList[].ItemList[].NonEquippable | BYTE | keeps 0 |
StoreList[].ItemList[].Pickpocketable | BYTE | stamps 0 |
StoreList[].ItemList[].Plot | BYTE | keeps 0 |
StoreList[].ItemList[].PropertiesList | List | not one constant; we substitute container |
StoreList[].ItemList[].PropertiesList[].CostTable (required) | BYTE | whatever the memory held; we substitute 0 |
StoreList[].ItemList[].PropertiesList[].CostValue (required) | WORD | whatever the memory held; we substitute 0 |
StoreList[].ItemList[].PropertiesList[].Param1 (required) | BYTE | whatever the memory held; we substitute 0 |
StoreList[].ItemList[].PropertiesList[].Param1Value (required) | BYTE | whatever the memory held; we substitute 0 |
StoreList[].ItemList[].PropertiesList[].PropertyName (required) | WORD | whatever the memory held; we substitute 0 |
StoreList[].ItemList[].PropertiesList[].Subtype (required) | WORD | whatever the memory held; we substitute 0 |
StoreList[].ItemList[].PropertiesList[].ChanceAppear (required) | BYTE | whatever the memory held; we substitute 100 |
StoreList[].ItemList[].PropertiesList[].Useable | BYTE | not one constant; the field holds the absence |
StoreList[].ItemList[].PropertiesList[].UsesPerDay | BYTE | stamps 0 |
StoreList[].ItemList[].PropertiesList[].UpgradeType | BYTE | stamps 0; we keep the absence instead |
StoreList[].ItemList[].StackSize | WORD | keeps 1 |
StoreList[].ItemList[].Stolen | BYTE | keeps 0 |
StoreList[].ItemList[].Tag | CExoString | keeps "" |
StoreList[].ItemList[].Upgrades | DWORD | keeps 0 |
StoreList[].ItemList[].ObjectId | DWORD | stamps 2130706432; we keep the absence instead |
StoreList[].ItemList[].XPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
StoreList[].ItemList[].YPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
StoreList[].ItemList[].ZPosition | FLOAT | NOT EXAMINED; we substitute 0.0 |
StoreList[].ItemList[].XOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
StoreList[].ItemList[].YOrientation | FLOAT | NOT EXAMINED; we substitute 0.0 |
StoreList[].ItemList[].ZOrientation | FLOAT | NOT EXAMINED; the field holds the absence |
StoreList[].LocName | CExoLocString | stamps empty |
StoreList[].MarkDown | INT | stamps 0 |
StoreList[].MarkUp | INT | stamps 0 |
StoreList[].OnOpenStore | CResRef | stamps "" |
StoreList[].Tag | CExoString | stamps "" |
UseTemplates | BYTE | stamps 0 |
VarTable | List | NOT EXAMINED; we substitute container |