XML:ONLV: Difference between revisions

From OniGalore
Jump to navigation Jump to search
m (→‎Level files hierarchy: um, what is AKEB? is it AKBA? =^_^=)
 
(98 intermediate revisions by 8 users not shown)
Line 1: Line 1:
{{XML_File_Header | type=ONLV | prev=ONLD | next=ONSK | name=Oni Game Level}}
{{XML_File_Header | prev=ONLD | type=ONLV | next=ONSK | name=Oni Game Level}}
{{finish}}
;Todo list
 
* tips with cutscene charas: sync pelvis OBAN and partner TRAM
* notes on camera and film import ?
 


__TOC__
__TOC__




==Level releases, forum threads and wiki pages==
ONLV and AKEV should not be extracted as XML unless it is for the purpose of trouble shooting or research. The extracted XMLs cannot be used for level creation.
;Custom levels that have been created so far
* [http://oni.bungie.org/community/forum/viewtopic.php?id=2656 Island Level] (7/9/13) uses level 29
* [http://oni.bungie.org/community/forum/viewtopic.php?id=2640 City Level Part 1] (12/7/13) uses level 28
* [http://oni.bungie.org/community/forum/viewtopic.php?id=2619 Fight Club] (1/6/13) uses level 25
* [http://oni.bungie.org/community/forum/viewtopic.php?id=2357 Old China] (12/5/12) uses level 24
* [http://oni.bungie.org/community/forum/viewtopic.php?id=2302 Boss Battle] (18/3/12) uses level 23
* [http://oni.bungie.org/community/forum/viewtopic.php?id=2271 De Dust Deluxe] (12/2/12) uses level 22
* [http://oni.bungie.org/community/forum/viewtopic.php?id=2242 Parkour Challenge 2] (23/1/12) uses level 21
* [http://oni.bungie.org/community/forum/viewtopic.php?id=2235 Parkour Challenge] (16/1/12) uses level 21
* [http://oni.bungie.org/community/forum/viewtopic.php?id=2001 Mini-Partenon] (25/7/11)uses level 5
* [http://oni.bungie.org/community/forum/viewtopic.php?id=1957 Hexagon] (3/7/11)level 16
* [http://oni.bungie.org/community/forum/viewtopic.php?id=1938 Junkyard] (23/6/11) uses level 15
* [http://oni.bungie.org/community/forum/viewtopic.php?id=1736 Arena] (8/11/10) uses level 7
* [http://oni.bungie.org/community/forum/viewtopic.php?id=1506 Maze] (15/2/10) uses level 5
* [http://oni.bungie.org/community/forum/viewtopic.php?id=2024 Muro's Lair - Preview] (3/10/11) uses level 20


;OCF threads about level creation
If you want to create a new level check out the '''[[Creating a level|corresponding tutorial]]'''.
* '''[http://oni.bungie.org/community/forum/viewtopic.php?id=2087 "Creating the Lair - A level tutorial"]'''
* [http://oni.bungie.org/community/forum/viewtopic.php?id=1515 "Creating new levels"]
* [http://oni.bungie.org/community/forum/viewtopic.php?pid=33838 "Create levels with pathfinding grids"]
* [http://oni.bungie.org/community/forum/viewtopic.php?id=2000 "More questions about levels"]
* [http://oni.bungie.org/community/forum/viewtopic.php?id=2003 "Sketchup tutorials for making levels"]
* [http://oni.bungie.org/community/forum/viewtopic.php?pid=37252#p37252 "Modding Existing levels - Beta" ("Moveable furniture" post)]


;Wiki pages about levels
==ONLV==
* [[New_levels]]
{| class="wikitable" width="100%"
* [[Lightmapping_levels]]
!width=150px| XML tag
* [[SketchUp_tutorials_and_tips|SketchUp tutorials and tips]]
!width=120px| Content type
! Description
|-
|valign="top"| <ONLV id="...">
|valign="top"| integer
| ONLV's instance number. Should be 0.
|-
|valign="top"| <Name>
|valign="top"| char[64]
| Name of BSL '''folder'''.
: Save game slot and level number are defined inside [[XML:ONLD|ONLD]].
|-
|valign="top"| <Environment>
|valign="top"| link
| Link to [[XML:AKEV|AKEV]] via '''file''' name (AKEV''name'', don't use file suffix .oni)
: Level geometry.
|-
|valign="top"| <Objects>
|valign="top"| link
| Link to [[#OBOA|OBOA]] via '''instance''' number (#''N'').
: The OBOA instance holds doors, animated objects (usually for cutscenes) and pushable objects (which are not used the original game due to unfinished physics code).
|-
|valign="top"| <SkyBox>
|valign="top"| link
| Link to [[XML:ONSK|ONSK]] via '''file''' name (ONSK''name'', don't use file suffix .oni)
: This is the skybox.
|-
|valign="top"| <Characters>
|valign="top"| link
| Link to [[XML:AISA|AISA]] via '''file''' name (AISA''name'', don't use file suffix .oni)
: This "AI Setup Array" is an alternative character list. [[XML:BINA/OBJC/CHAR|BINACHAR]] is more powerful.
|-
|valign="top"| <ObjectQuadMap>
|valign="top"| link
| Link to [[#ONOA|ONOA]] via '''instance''' number (#''N'').
: This "Object Array" holds functional objects – doors, furniture, turrets, triggers and consoles. In addition, it appears that the engine only searches for door-type objects.
|-
|valign="top"| <Particles>
|valign="top"| link
| Link to [[#ENVP|ENVP]] via '''instance''' number (#''N'').
: These "Environment Particle" are traditionally only used for door lock lights and particles used by [[XML:OFGA|OFGAs]].
|-
|valign="top"| <Corpses>
|valign="top"| link
| Link to [[#CRSA|CRSA]] via '''instance''' number (#''N'').
: This is a "Corpse Array". It's used to spawn dead characters such as Chung in Chapter 1.
|}


;Free texture resources
==OBOA==
* [http://vk.com/gameready various game meshes]
Used for movable/moving objects.
* [http://www.tutorialsforblender3d.com/Textures/Textures_index.html various game textures]
* [http://www.cgtextures.com/ various game textures]
* [http://forums.epicgames.com/threads/603122-Remus-high-resolution-skydome-texture-pack skies and objects of the solar system]
* [http://blenderartists.org/forum/showthread.php?224065-New-High-resolution-sky-pack-for-Blender skies] <!-- (http://www.wuala.com/Olson/Photos/Optikz_360_Skies/) -->
* [http://blenderartists.org/forum/showthread.php?24038-Free-high-res-skymaps-%28Massive-07-update!%29 skies]


==Concept phase==
{| class="wikitable" width="100%"
Be aware of limitation of level and engine.
!width=150px| XML tag
!width=120px| Content type
! Description
|-
| <OBOA id="...">
| integer
| Instance ID. Should be 1.
|-
| <Objects>
| -
| Array of <OBOAObject> tags.
|-
| <OBOAObject>
| -
| There are always 32 empty objects plus those that are actually used
|-
| <Geometry>
| "#" + integer
| Link to M3GA instance. Doors have two separate models: an animated and a static one. If this <Geometry> links to a door, it will be the animated model.
|-
| <Animation>
| link
| OBAN''name''.
|-
| <Particle>
| # + integer
| Link to ENVP instance. There can be multiple ENVP instances – one for a lock light and others for additional particles.
|-
|valign="top"| <Flags>
|valign="top"| flags
|
: None
: InUse
: NoCollision (any effect? no collision is default behavior)
: NoGravity
: FaceCollision (for doors)
|-
| <DoorGunkId>
| int32
| The index of the door frame GQ (only used for door objects)
|-
| <DoorId>
| int32
| Only used for doors; in the case of double doors, both doors have the same ID and they are flagged as "InUse FaceCollision"
|-
|valign="top"| <PhysicsType>
|valign="top"| flags
|
: None
: Static
: Linear (pushable object)
: Animated (animated via OBAN)
: Newton (same as Linear)
|-
| <ScriptId>
| int32
| Scripting ID; used by BSL function '''obj_create'''; "65535" means not used.
|-
| <Position>
| vector
| Float x3. Not used for animated objects.
|-
| <Rotation>
| quaternion
| Float x4. Not used for animated objects.
|-
| <Scale>
| float
| Not used for animated objects.
|-
| <Transform>
| matrix
| Float 3*3 + 3 more floats for the X Y Z position of the object. For more information on the matrix, see [[OBD:CRSA]]. Used for animated objects.
|-
| <Name>
| char[64]
| Name of the object; informational only.
|}


* triangle limit of a game level: ca. 520.000 (500.000 to be on save side)
==ONOA==
* {{ModTool}} can save dae files with max. 64.000 triangles per object
Used by static objects (imported by object list).
* when polygons are too tightly packed the cam will look at too many of them and glitches appear: the visible GQs (GunkQuads) limit is 8192 (2^13), higher numbers will cause render bugs and call BSL message "Exceeded max visible GQs ''number''"; limited solutions to this:
** decrease the gs_farclipplane_set value
** hide objects by [[#.3CModel.3E|env_show]]
** hide objects by ''level design''
*** for example departments in a building could be quite detailed because the view at the other departments/rooms is blocked by non-transparent walls
* The camera can look at 2049 transparent textures at once, one more and Oni crashes.
* characters are visible ''only'' within 4099|4099|4099 and -4099|-4099|-4099 world units
* geometry stops at ca. X=4228|Z=4228 and -4228|-4228 (height not tested)
* chr_debug_spheres = 1 visualizes collision spheres of characters, then you can check if they fit through a new entrance


{| class="wikitable" width="100%"
!width=150px| XML tag
!width=120px| Content type
! Description
|-
| <ONOA id="...">
| integer
| Instance ID.
|-
| <Elements>
| -
| This is an int32 array for the <ONOAElement> tags.
|-
| <ONOAElement>
| -
|
|-
|valign="top"| <ObjectId>
|valign="top"| integer
| Object ID and type to which this quad belongs (see AKEV's [[XML:AKEV#AGQG|AGQG]] for details).
: Actual object IDs can also be found in BINA/OBJC/####.
|-
| <QuadList>
| "#" + integer
| Link to IDXA instance. Each object has its own IDXA instance.
|}


==Notes on Mod Tool and Google Sketchup==
Where do the links go to again?
Re-saving a dae file - that was originally made in Sketchup - in Mod Tool can result in a surprising change in size within Oni.


That due to a difference in the length specification.
ONOA <ObjectId> -> AKEV AGQG -> BINA/OBJC/#### by type and ID
ONOA <QuadList> -> ONOA IDXA -> AKEV AGQG by order


: For example Sketchup dae file has: <unit meter="0.0254000" name="inch" />
==ENVP==
: Re-saved Mod Tool dae file has: <unit meter="0.1" name="decimetre"></unit>
{| class="wikitable" width="100%"
!width=150px| XML tag
!width=120px| Content type
! Description
|-
| <ENVP id="...">
| integer
| Instance ID.
|-
| <Particles>
| -
| This is an int16 array for the <ENVPParticle> tags. If there's not going to be any contents, you put <Particles /> here.
|-
| <ENVPParticle>
| -
|
|-
| <Class>
| char[64]
| <font color="#777777">BINA3RAP</font>file<font color="#777777">.oni</font> <font color="#777777">(don't use file prefix/suffix)</font>.
|-
| <Tag>
| char[48]
| Particle's scripting name for BSL commands; see [[XML:OFGA#XML_tags|OFGA]] for more information on name composition.
|-
| <Transform>
| matrix
| Float 3*3 + 3 more floats for the X Y Z position of the particle. For more information on the matrix, see [[OBD:CRSA]].
|-
| <DecalScale>
| int32, int32
| X Y
|-
|valign="top"| <Flags>
|valign="top"| flag
|
: None
: NotInitiallyCreated
|}


In that case you would need to open the new dae inside a text editor and change the length specification again.
==CRSA==
{| class="wikitable" width="100%"
!width=150px| XML tag
!width=120px| Content type
! Description
|-
| <CRSA id="...">
| integer
| Instance ID.
|-
|valign="top"| <FixedCount>
|valign="top"| integer
| The array capacity of <Corpses> is larger than the number of "fixed"/"used" corpses in order to allow the engine to store new corpses at runtime. "Fixed" means that those corpses are never overwritten/deleted at runtime – all new corpses are stored after the "fixed" ones. This means that "fixed" <= "used" <= "capacity".
|-
| <UsedCount>
| integer
|-
|valign="top"| <Corpses>
|valign="top"| -
| This is an int32 array for the <CRSACorpse> tags. By default, Oni wants 20 slots for corpses. Unused corpses have their matrix and bounding box filled with zeroes.
|-
|valign="top"| <CRSACorpse>
|valign="top"| -
| [[Authoring_custom_camera_animations|New corpses]] can be made with the BSL command '''make_corpse filename''' and some hex-editing. The pose of the corpse is taken from the player character. The contents of the files thus created can then be inserted as elements in a level's CRSA.
|-
| <CharacterClass>
| link
| [[XML:ONCC|ONCC]]''name''
|-
| <Transforms>
| -
| There are 19 <Matrix4x3> for each <Transforms> (which represents a body part).
|-
| <Matrix4x3>
| matrix
| Float 3x3 + float x3 for the last 3 values (X Y Z position). For more information about the matrix, see [[OBD:CRSA]].
|-
| <BoundingBox>
| -
| Bounding box of the whole corpse.
|-
| <Min>
| float x3
|
|-
| <Max>
| float x3
|
|}


==M3GA==
There can be one M3GA instance per animated object. Animated meshes of doors are embedded in ONLV. All other animated meshes are stored outside it as M3GM files.


==Level import with OniSplit [http://mods.oni2.net/node/38 v0.9.82.0+]==
{| class="wikitable" width="100%"
'''Demo files'''
!width=150px| XML tag
 
!width=120px| Content type
Demo files can be downloaded [http://dl.dropbox.com/u/1869/lab.zip here].
! Description
 
|-
First put the new "OniSplit.exe" into the second "lab" folder alongside the xml files.
| <M3GA id="...">
 
| integer
There's a "build.cmd" file. Those two are the important lines:
| Instance ID.
 
|-
OniSplit.exe -create:level out lab.xml
| <Geometries>
OniSplit.exe -import:pc out level3_Final.dat
| -
 
| This is an int32 array for the <Link> tags.
The first line create the *.oni files from a master.xml file, in this case "lab.xml". If final, the oni files can be put into a new AE package.
|-
 
|valign="top"| <Link>
The second line creates level archives which can be used '''for fast tests'''. They don't require you to install a package.
|valign="top"| link
 
|
Instead of "nosep" you can now also use "pc" for the import. Mac does still use "sep".
: #''N'' (instance number) (for non-door)
 
: M3GM''name'' (for door)
If the game crashes while loading (at ca. 90% progress), be sure that the texture's x and y (pixel) dimension are power of two: 512, 256, 128, 64, etc.
It can happen that you see here references to DAE files. This happens when the ONLV was created with some older OniSplit version (like 0.9.86.0) and if the ONLV was converted to xml in absence of the resources used by M3GA.
 
|}
If the game crashes while loading (at ca. 50-60% progress), be sure that the BINACJBOCharacters/AISA file has a player character.
 
If the game crashes while loading (at ca. 5-10% progress), check if all textures were inside the "out" folder.
 
: You can extract the AKEV file to xml, then search for the [[XML:AKEV#TXMA|TXMP array]].
 
: [https://dl.dropboxusercontent.com/u/139715/OniGalore/AKEV_texture_checker.vbs THIS] script checks which textures are missing by comparing the AKEV*.xml with its *.oni files folder. Adapt the two paths so that it works for you. Alt + 4, insert code, then F5.
 
"TXMP_marker_door" and "TXMP_marker_ghost" will be missing in the demo's "out" folder.
 
You can add this between the other two lines in the build.cmd to prevent a crash.
OniSplit.exe -create:txmp out env/markers/*.tga
 
 
===The master xml file===
File paths can be either absolute or relative.
 
The '''master xml file name''' determine the '''bsl folder name''' and the '''AKEV and ONLV file name''' in the output folder.
 
 
'''Mandatory files''' for level import:
* ''level_environment''.dae
* ''level_bnv''.dae
* ''level_textures.tga/jpg/png''
* Character.xml or AISA with player
* ONSK name in <Sky> (can be fake name)
* ONLD file (for new levels; read on [[Making_a_mod_package#Mod_Info.cfg|HERE]] about savegame unlocking)


==M3GM==
Read about them here [[XML:M3GM|HERE]]. Note that M3GMs have their own component instances: PNTA, VCRA (x2), TXCA, IDXA (x2). Doors store their animated model in ONLV, while the static model comes from BINACJBODOOR.oni, which also links to M3GM files.


==IDXA==
{| class="wikitable" width="100%"
{| class="wikitable" width="100%"
!width=150px| XML tag
!width=150px| XML tag
!width=120px| content type
!width=120px| Content type
! description
! Description
|-
|-
| <?xml version="1.0" encoding="utf-8"?>
| <IDXA id="...">
|valign="top"| float, flag
| integer
|valign="top"| Ignore this.
| Instance ID.
|-
|-
| <Oni>
| <Indices>
| -
| -
| This is an Int32 array for the <Int32> tags.
|-
|valign="top"| <Int32>
|valign="top"| int32
|
|
|-
; From ONOA to AGQG elements
|valign="top"| <Level SharedPath="...">
: Link to <AGQGQuad>s in [[XML:AKEV#AGQG|AGQG]] by order. (The array in AGQG starts with 0, so for example <Int32>6</Int32> would link to the 7th <AGQGQuad>.)
|valign="top"| link
; From M3GM to PNTA elements
| The master xml file can link to other xml files, most of them are [[OBD:BINA/OBJC#OBJC_types|BINACJBO]] files. The file type gets declared inside the file, so the file name itself doesn't have to contain the type. Ergo, "BINACJBOCharacter.xml" can be given a simpler name like "Character.xml".
: Read more [[XML:M3GM#PNTA|HERE]].
; From M3GM to VCRA elements
: Read more [[XML:M3GM#VCRA|HERE]].
|}


Some resources used by those xml files can be found in a "shared" folder. OniSplit copies textures and "physics" objects into the output folder; furniture objects will be integrate into the AKEV. Unused resources in the shared folder will be ignored. That way the final level archive / AE package contains only necessary files which saves the end-user space.
==Level files hierarchy==
{| width="100%" style="text-align:center; empty-cells: hide"
|width="20%" style="background-color:#CCFFCC;"| (un)colored cell = file
|width="20%" style="background-color:#CCFFCC; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| striped cell = embedded instance
|width="20%"|
|width="20%"|
|width="20%"|
|}


In the demo are various subfolders in shared folder: consoles, doors, furniture, triggers and turrets.
{|class="wikitable" width="100%" style="text-align:center"
Following file types comes there without their file prefixes: CONS, DOOR, TRIG, OFGA. OniSplit recognize them nonetheless.
|style="background-color:#DDDDDD;"| ONLV
|width="20%"|
|width="20%"|
|width="20%"|
|width="20%"|
|-
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF;"| AKEV
|
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| PNTA
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| PLEA
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| TXCA
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AGQG
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AGQR
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AGQC
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AGQC
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AGDB
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| TXMA
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart descend.gif]]
| [[Image:Chart turn right.gif]]
| TXMP
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AKVA
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AKBA
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| IDXA
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AKBP
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ABNA
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AKOT
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| OTIT
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"|OTLF
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| QTNA
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart descend.gif]]
| [[Image:Chart turn right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| IDXA
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AKAA
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart turn right.gif]]
|style="background-color:#CCCCFF; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| AKDA
|
|
|-
|-
| <Environment>
| [[Image:Chart fork right.gif]]
| -
|style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| OBOA
|
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
|style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| M3GA
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart descend.gif]]
| [[Image:Chart turn right.gif]]
|style="background-color:#FFCCCC;"| M3GM
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart descend.gif]]
|
| [[Image:Chart fork right.gif]]
|style="background-color:#FFCCCC; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| PNTA
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart descend.gif]]
|
| [[Image:Chart fork right.gif]]
|style="background-color:#FFCCCC; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| VCRA
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart descend.gif]]
|
| [[Image:Chart fork right.gif]]
|style="background-color:#FFCCCC; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| TXCA
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart descend.gif]]
|
| [[Image:Chart fork right.gif]]
|style="background-color:#FFCCCC; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| IDXA
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart descend.gif]]
|
| [[Image:Chart turn right.gif]]
| TXMP
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart fork right.gif]]
| OBAN
|
|
|-
| [[Image:Chart descend.gif]]
| [[Image:Chart turn right.gif]]
|style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ENVP
|
|
|-
| [[Image:Chart fork right.gif]]
|style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ONMA
|
|
|
|
|-
|-
| <Model>
| [[Image:Chart fork right.gif]]
| -
|style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ONFA
| Used to import level geometry and static objects. See [[#<Model>|HERE]] for detailed information.
|
|
|
|-
|-
| <Import Path="..."/>
| [[Image:Chart fork right.gif]]
| link
|style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ONTA
|
|
|
|
|-
|-
| <Node Id="...">
| [[Image:Chart turn right.gif]]
| string
| ONSK
| informative (space for notes so to say)
|
|
|
|-
|-
|valign="top"| <ScriptId>
| [[Image:Chart descend.gif]]
|valign="top"| integer
| [[Image:Chart fork right.gif]]
| Tested with BSL command ...
| TXMP
: [[#<Model>|env_show Id 1]] (use 0 to hide)
|
: [[#Breakable glass with BSL recognition|env_broken Id [Id]]] (if also second Id is used then objects in that range get counted e.g. 3001, 3018 = 18)
|
: [[#Texture exchange|env_texswap Id texture]] (no file prefix/suffix allowed)
: [[#env_shade|env_shade Id Id R G B]]
Static objects store their Id in [[XML:AKEV#IDXA_.28quad_group_id.29|one of AKEV's IDXA instances]].
|-
|-
|valign="top"| <GunkFlags>
| [[Image:Chart fork right.gif]]
|valign="top"| flag
| AISA
|
|
|
|
;AGQG (Gunk) flags (trimmed list)
see ''OniSplit -help enums'' for more flags
:None
:NoCollision
:NoObjectCollision
:NoCharacterCollision
:NoDecal
:TwoSided
:Invisible
|-
|-
|valign="top"| <Rooms>
| [[Image:Chart descend.gif]]
|valign="top"| -
| [[Image:Chart fork right.gif]]
| For detailed information see [[#<Rooms>|HERE]].
| ONCC
 
|
For Google Sketchup BNV tutorial see [http://oni.bungie.org/community/forum/viewtopic.php?pid=36760#p36760 HERE].
|
|-
|-
| <Import Path="..."/>
| [[Image:Chart descend.gif]]
| link
| [[Image:Chart turn right.gif]]
| File path to *.dae file. BNV data, used to create pathfinding.
| ONWC
|
|
|-
|-
| <Textures> {{Anchor|textures_tag}}
| [[Image:Chart fork right.gif]]
| -
| AITR
| With OniSplit v0.9.94.0+ you can use attributes to set the default import formats and max dimensions. For example:
|
 
|
: <Textures Format="BGR" AlphaFormat="RGBA" MaxSize="512">
|
 
Textures that aren't power of two (2^x) or bigger than 512 will be scaled to be that way. For example: 2003x2000 becomes 512x512.
|-
|-
| <Texture Name="...">
| [[Image:Chart fork right.gif]]
| string
| ONSA
| TXMP file name to generate.
|
|
|
|-
|-
| <Flags>
| [[Image:Chart fork right.gif]]
| flag
| OBDC
| Optional tag. For list of flags see [[XML:TXMP|HERE]].
|
|
|
|-
|-
|valign="top"| <Format>
| [[Image:Chart descend.gif]]
|valign="top"| flag
| [[Image:Chart turn right.gif]]
|style="background-color:#FFFFAA;"| M3GM
|
|
|
:DXT1
:BGR
:RGBA
:BGR555
:BGRA5551
:BGRA4444
|-
|-
|valign="top"| <GunkFlags>
| [[Image:Chart descend.gif]]
|valign="top"| flag
|
| [[Image:Chart fork right.gif]]
|style="background-color:#FFFFAA; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| PNTA
|
|
;AGQG (Gunk) flags (trimmed list)
see ''OniSplit -help enums'' for more flags
:None
:NoCollision
:NoObjectCollision
:NoCharacterCollision
:NoDecal
:TwoSided
:Invisible
|-
|-
| <Image>
| [[Image:Chart descend.gif]]
| link
|
| File path to *.tga/jpg file.
| [[Image:Chart fork right.gif]]
|style="background-color:#FFFFAA; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| VCRA
|
|-
|-
|valign="top"| <Sky>
| [[Image:Chart descend.gif]]
|valign="top"| string
|
| ONSKfile.oni (without file pre- and suffix)
| [[Image:Chart fork right.gif]]
 
|style="background-color:#FFFFAA; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| TXCA
The import doesn't work with an empty tag. <Sky>clear</Sky> helps here; any other fictional name will also do.
|
 
For detailed information see [[XML:ONSK|HERE]].
|-
|-
| <Objects>
| [[Image:Chart descend.gif]]
| -
|
| [[Image:Chart fork right.gif]]
|style="background-color:#FFFFAA; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| IDXA
|
|
|-
|-
|valign="top"| <Import>
| [[Image:Chart descend.gif]]
|valign="top"| link
|
| File path. Supported files:
| [[Image:Chart turn right.gif]]
: [[XML:BINA/OBJC/CHAR|Character.xml]] (has to contain player character if there's no AISA file with it)
| TXMP
: [[XML:BINA/OBJC/CONS|Console.xml]]
|
: [[XML:BINA/OBJC/DOOR|Door.xml]]
: [[XML:BINA/OBJC/FLAG|Flag.xml]]
: [[#Furniture.xml|Furniture.xml]]
: [[XML:BINA/OBJC/NEUT|Neutral.xml]]
: [[XML:BINA/OBJC/PART|Particle.xml]]
: [[XML:BINA/OBJC/PATR|PatrolPath.xml]]
: [[#Physics.xml|Physics.xml]]
: [[XML:BINA/OBJC/PWRU|PowerUp.xml]]
: [[XML:SNDD#BINACJBOSound.xml|Sound.xml]]
: [[XML:BINA/OBJC/TRIG|Trigger.xml]]
: [[XML:BINA/OBJC/TRGV|TriggerVolume.xml]]
: [[XML:BINA/OBJC/WEAP|Weapon.xml]]
|-
|-
| <Films>
| [[Image:Chart fork right.gif]]
| -
|style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ONOA
|
|
|
|
|-
|-
| <Import>
| [[Image:Chart descend.gif]]
| link
| [[Image:Chart turn right.gif]]
| File path to *.xml file. OniSplit creates a [[XML:FILM|FILM]] file from it. Used for characters in cutscenes.
|style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| IDXA
|
|
|-
|-
| <Cameras>
| [[Image:Chart fork right.gif]]
| -
|style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| ENVP
|
|
|
|
|-
|-
| <Camera Path="...">
| [[Image:Chart turn right.gif]]
| link
|style="background-color:#DDDDDD; background-image: repeating-linear-gradient(-45deg, transparent, transparent 10px, rgba(255,255,255,.5) 10px, rgba(255,255,255,.5) 20px);"| CRSA
| File path to *.dae file. OniSplit creates an OBAN file from it. Used for cutscenes.
|
|
|
|-
|-
| <Animation Name="..."/>
|
| string
| [[Image:Chart turn right.gif]]
| Name for the OBAN file.
| ONCC
|
|
|}
|}


 
{{XML}}
This is a '''trimmed''' version of the master file "lab.xml" from the demo. It's meant to give you a first impression. -- We might upload a smaller demo someday with all features nonetheless.
 
<?xml version="1.0" encoding="utf-8" ?>
<Oni>
    <Level SharedPath="../shared">
        <Environment>
            <Model>
                <Import Path="env/lab_env.dae"/>
                <Import Path="env/lab_bomber_window.dae"/>
                <Import Path="env/lab_motorcycle.dae">
                    <Node Id="motorcycle">
                        <ScriptId>9</ScriptId>
                        <GunkFlags>NoCollision</GunkFlags>
                    </Node>
                </Import>
            </Model>
            <Rooms>
                <Import Path="env/lab_bnv.dae"/>
            </Rooms>
            <Textures>
                <Texture Name="GOO">
                    <Format>bgra4444</Format>
                    <GunkFlags>NoCollision</GunkFlags>
                    <Image>env/images/GOO.tga</Image>
                </Texture>
            </Textures>
        </Environment>
        <Sky>sunset</Sky>
        <Objects>
            <Import>Character.xml</Import>
            <Import>Furniture.xml</Import>
            <Import>TriggerVolume.xml</Import>
            <Import>Physics.xml</Import>
        </Objects>
        <Films>
            <Import>films/BomberKonRun01.xml</Import>
            <Import>films/BomberKonRun02.xml</Import>
        </Films>
        <Cameras>
            <Camera Path="cameras/BomberCam01.dae">
                <Animation Name="BomberCam01"/>
            </Camera>
            <Camera Path="cameras/BomberCam02.dae">
                <Animation Name="BomberCam02"/>
            </Camera>
        </Cameras>
    </Level>
</Oni>
 
 
====<Model>====
This tag is mandatory (it must be present to avoid errors); the model section contains one import path to the AKEV (level) geometry (*.dae) and can contain additional import paths for exceptions (*.dae).
 
Data from the demo:
 
                <Import Path="env/lab_env.dae"/>
                <Import Path="env/lab_motorcycle.dae">
                    <Node Id="motorcycle">
                        <ScriptId>9</ScriptId>
                        <GunkFlags>NoCollision</GunkFlags>
                    </Node>
                </Import>
 
 
'''env_show'''
 
The motorcycle has here script id 9. You can show and hide the object with bsl command env_show whereby the second parameter means true or false. '''Never use 0 as id''' because it won't work.
 
env_show 9 1
env_show 9 0
 
EdT demonstrates [http://youtu.be/Em6wa5JTQNM here] env_show. The objects have collision.
 
 
The last original level (syndicate mountain compound) has a big satellite dish platform that can be made hidden. Obviously, such objects/areas can be made to have pathfinding too.
 
 
;More possible applications of env_show:
* ground/ceiling/objects for cutscenes that become partially destroyed
* destrucable walls [http://www.youtube.com/watch?v=qgJUbPWX5yE like in Deus Ex 3] (trigger volume, replacing punch anim with punch-through-wall anim)
* grids in front of ventilation shafts (a little door object could be an alternative)
** at the moment this can't be done because characters can't sneak under the top edge of the opening (the characters collision spheres are too big)
* managing object groups with trigger volumes (save multiple objects in one dae file)
 
<!-- atm, the effort is not worth the work
https://dl.dropboxusercontent.com/u/139715/OniGalore/TV_triggered_env_show.png
: edit: replace 0 by 25
 
If the objects appear to ''flash'' we could replace the hide_all_object_groups function with individual TV exit functions.
 
func hide_all_object_groups
{
# env_show id [1|0]
env_show 1 0
env_show 2 0
# ...
env_show 25 0
}
func show_object_group (int grpA, int grpB, int grpC, int grpD, int grpE, int grpF, int grpG, int grpH)
{
env_show (grpA, 1)
env_show (grpB, 1)
env_show (grpC, 1)
env_show (grpD, 1)
env_show (grpE, 1)
env_show (grpF, 1)
env_show (grpG, 1)
env_show (grpH, 1)
# missing arguments are taken to be 0
}
func TV_25_enter
{
hide_all_object_groups
# show object group of entered TV and of neighboring TVs
# (center, north, north east, east, east south, south, south west, west, west north)
# there's a limit of 8 arguments per function
show_object_group 25 1 2 3 4 5 6 7
show_object_group 8
}
# other examples
func TV_6_enter
{
hide_all_object_groups
show_object_group 6 7 25 5 18 19 20 21
show_object_group 22
}
func TV_20_enter
{
hide_all_object_groups
show_object_group 20 21 6 19
}
-->
 
=====Breakable glass with BSL recognition=====
Broken env objects can be recognized by bsl command ''env_broken (ID_1, ID_N)''. However, this whole thing requires additional code to work.
 
An example is the training level. Let's determine how we can set up such a thing.
 
First we need a [[XML:BINA/OBJC/TRGV|trigger volume]] like in level 1.
 
        <TRGV Id="11495">
            <Header>
                <Flags>Locked</Flags>
                <Position>-714.6615 -298 -555.2073</Position>
                <Rotation>0 0 0</Rotation>
            </Header>
            <OSD>
                <Name>tv75</Name>
                <Scripts>
                    <Entry></Entry>
                    <Inside>targets_gone</Inside>
                    <Exit></Exit>
                </Scripts>
                <Teams>255</Teams>
                <Size>400 31 270</Size>
                <TriggerVolumeId>75</TriggerVolumeId>
                <ParentId>0</ParentId>
                <Notes></Notes>
                <Flags>PlayerOnly</Flags>
            </OSD>
        </TRGV>
 
Now we need some BSL code.
 
var int inside_target_function;
func void enter_target_function(void)
{
    dprint enter_target_function
    inside_target_function = 1;
}
func void exit_target_function(void)
{
    dprint exit_target_function
    inside_target_function = 0;
}
func void targets_are_not_gone(void)
{
# CB: turn off the trigger volume and sleep for a second
# so as not to cause hideous performance loss
trigvolume_enable tv75 0
sleep 60
trigvolume_enable tv75 1
}
func void targets_gone(string ai_name)
{
if(inside_target_function eq 0)
{
enter_target_function() # catch other "targets_gone" functions to let them do nothing
var int num_broken = env_broken(3001, 3018);
# if you only one target use scheme: env_broke(3001, 3001)
if (num_broken eq 18)
{
targets_are_gone();
}
if (num_broken < 18)
{
targets_are_not_gone(); # to set check interval to one second
}
exit_target_function
}
}
func targets_are_gone
{
trigvolume_enable tv75 0
# [...]
}
 
;Explanation:
 
Player enters the TV, "targets_gone" gets

Latest revision as of 18:07, 9 December 2023

ONLV : Oni Game Level
XML modding tips
  • See HERE to start learning about XML modding.
  • See HERE if you are searching for information on how to handle object coordinates.
  • See HERE for some typical modding errors and their causes.
XML.png
XML

ONLD << Other file types >> ONSK

switch to OBD page


ONLV and AKEV should not be extracted as XML unless it is for the purpose of trouble shooting or research. The extracted XMLs cannot be used for level creation.

If you want to create a new level check out the corresponding tutorial.

ONLV

XML tag Content type Description
<ONLV id="..."> integer ONLV's instance number. Should be 0.
<Name> char[64] Name of BSL folder.
Save game slot and level number are defined inside ONLD.
<Environment> link Link to AKEV via file name (AKEVname, don't use file suffix .oni)
Level geometry.
<Objects> link Link to OBOA via instance number (#N).
The OBOA instance holds doors, animated objects (usually for cutscenes) and pushable objects (which are not used the original game due to unfinished physics code).
<SkyBox> link Link to ONSK via file name (ONSKname, don't use file suffix .oni)
This is the skybox.
<Characters> link Link to AISA via file name (AISAname, don't use file suffix .oni)
This "AI Setup Array" is an alternative character list. BINACHAR is more powerful.
<ObjectQuadMap> link Link to ONOA via instance number (#N).
This "Object Array" holds functional objects – doors, furniture, turrets, triggers and consoles. In addition, it appears that the engine only searches for door-type objects.
<Particles> link Link to ENVP via instance number (#N).
These "Environment Particle" are traditionally only used for door lock lights and particles used by OFGAs.
<Corpses> link Link to CRSA via instance number (#N).
This is a "Corpse Array". It's used to spawn dead characters such as Chung in Chapter 1.

OBOA

Used for movable/moving objects.

XML tag Content type Description
<OBOA id="..."> integer Instance ID. Should be 1.
<Objects> - Array of <OBOAObject> tags.
<OBOAObject> - There are always 32 empty objects plus those that are actually used
<Geometry> "#" + integer Link to M3GA instance. Doors have two separate models: an animated and a static one. If this <Geometry> links to a door, it will be the animated model.
<Animation> link OBANname.
<Particle> # + integer Link to ENVP instance. There can be multiple ENVP instances – one for a lock light and others for additional particles.
<Flags> flags
None
InUse
NoCollision (any effect? no collision is default behavior)
NoGravity
FaceCollision (for doors)
<DoorGunkId> int32 The index of the door frame GQ (only used for door objects)
<DoorId> int32 Only used for doors; in the case of double doors, both doors have the same ID and they are flagged as "InUse FaceCollision"
<PhysicsType> flags
None
Static
Linear (pushable object)
Animated (animated via OBAN)
Newton (same as Linear)
<ScriptId> int32 Scripting ID; used by BSL function obj_create; "65535" means not used.
<Position> vector Float x3. Not used for animated objects.
<Rotation> quaternion Float x4. Not used for animated objects.
<Scale> float Not used for animated objects.
<Transform> matrix Float 3*3 + 3 more floats for the X Y Z position of the object. For more information on the matrix, see OBD:CRSA. Used for animated objects.
<Name> char[64] Name of the object; informational only.

ONOA

Used by static objects (imported by object list).

XML tag Content type Description
<ONOA id="..."> integer Instance ID.
<Elements> - This is an int32 array for the <ONOAElement> tags.
<ONOAElement> -
<ObjectId> integer Object ID and type to which this quad belongs (see AKEV's AGQG for details).
Actual object IDs can also be found in BINA/OBJC/####.
<QuadList> "#" + integer Link to IDXA instance. Each object has its own IDXA instance.

Where do the links go to again?

ONOA <ObjectId> -> AKEV AGQG -> BINA/OBJC/#### by type and ID
ONOA <QuadList> -> ONOA IDXA -> AKEV AGQG by order

ENVP

XML tag Content type Description
<ENVP id="..."> integer Instance ID.
<Particles> - This is an int16 array for the <ENVPParticle> tags. If there's not going to be any contents, you put <Particles /> here.
<ENVPParticle> -
<Class> char[64] BINA3RAPfile.oni (don't use file prefix/suffix).
<Tag> char[48] Particle's scripting name for BSL commands; see OFGA for more information on name composition.
<Transform> matrix Float 3*3 + 3 more floats for the X Y Z position of the particle. For more information on the matrix, see OBD:CRSA.
<DecalScale> int32, int32 X Y
<Flags> flag
None
NotInitiallyCreated

CRSA

XML tag Content type Description
<CRSA id="..."> integer Instance ID.
<FixedCount> integer The array capacity of <Corpses> is larger than the number of "fixed"/"used" corpses in order to allow the engine to store new corpses at runtime. "Fixed" means that those corpses are never overwritten/deleted at runtime – all new corpses are stored after the "fixed" ones. This means that "fixed" <= "used" <= "capacity".
<UsedCount> integer
<Corpses> - This is an int32 array for the <CRSACorpse> tags. By default, Oni wants 20 slots for corpses. Unused corpses have their matrix and bounding box filled with zeroes.
<CRSACorpse> - New corpses can be made with the BSL command make_corpse filename and some hex-editing. The pose of the corpse is taken from the player character. The contents of the files thus created can then be inserted as elements in a level's CRSA.
<CharacterClass> link ONCCname
<Transforms> - There are 19 <Matrix4x3> for each <Transforms> (which represents a body part).
<Matrix4x3> matrix Float 3x3 + float x3 for the last 3 values (X Y Z position). For more information about the matrix, see OBD:CRSA.
<BoundingBox> - Bounding box of the whole corpse.
<Min> float x3
<Max> float x3

M3GA

There can be one M3GA instance per animated object. Animated meshes of doors are embedded in ONLV. All other animated meshes are stored outside it as M3GM files.

XML tag Content type Description
<M3GA id="..."> integer Instance ID.
<Geometries> - This is an int32 array for the <Link> tags.
<Link> link
#N (instance number) (for non-door)
M3GMname (for door)

It can happen that you see here references to DAE files. This happens when the ONLV was created with some older OniSplit version (like 0.9.86.0) and if the ONLV was converted to xml in absence of the resources used by M3GA.

M3GM

Read about them here HERE. Note that M3GMs have their own component instances: PNTA, VCRA (x2), TXCA, IDXA (x2). Doors store their animated model in ONLV, while the static model comes from BINACJBODOOR.oni, which also links to M3GM files.

IDXA

XML tag Content type Description
<IDXA id="..."> integer Instance ID.
<Indices> - This is an Int32 array for the <Int32> tags.
<Int32> int32
From ONOA to AGQG elements
Link to <AGQGQuad>s in AGQG by order. (The array in AGQG starts with 0, so for example <Int32>6</Int32> would link to the 7th <AGQGQuad>.)
From M3GM to PNTA elements
Read more HERE.
From M3GM to VCRA elements
Read more HERE.

Level files hierarchy

(un)colored cell = file striped cell = embedded instance
ONLV
Chart fork right.gif AKEV
Chart descend.gif Chart fork right.gif PNTA
Chart descend.gif Chart fork right.gif PLEA
Chart descend.gif Chart fork right.gif TXCA
Chart descend.gif Chart fork right.gif AGQG
Chart descend.gif Chart fork right.gif AGQR
Chart descend.gif Chart fork right.gif AGQC
Chart descend.gif Chart fork right.gif AGQC
Chart descend.gif Chart fork right.gif AGDB
Chart descend.gif Chart fork right.gif TXMA
Chart descend.gif Chart descend.gif Chart turn right.gif TXMP
Chart descend.gif Chart fork right.gif AKVA
Chart descend.gif Chart fork right.gif AKBA
Chart descend.gif Chart fork right.gif IDXA
Chart descend.gif Chart fork right.gif AKBP
Chart descend.gif Chart fork right.gif ABNA
Chart descend.gif Chart fork right.gif AKOT
Chart descend.gif Chart descend.gif Chart fork right.gif OTIT
Chart descend.gif Chart descend.gif Chart fork right.gif OTLF
Chart descend.gif Chart descend.gif Chart fork right.gif QTNA
Chart descend.gif Chart descend.gif Chart turn right.gif IDXA
Chart descend.gif Chart fork right.gif AKAA
Chart descend.gif Chart turn right.gif AKDA
Chart fork right.gif OBOA
Chart descend.gif Chart fork right.gif M3GA
Chart descend.gif Chart descend.gif Chart turn right.gif M3GM
Chart descend.gif Chart descend.gif Chart fork right.gif PNTA
Chart descend.gif Chart descend.gif Chart fork right.gif VCRA
Chart descend.gif Chart descend.gif Chart fork right.gif TXCA
Chart descend.gif Chart descend.gif Chart fork right.gif IDXA
Chart descend.gif Chart descend.gif Chart turn right.gif TXMP
Chart descend.gif Chart fork right.gif OBAN
Chart descend.gif Chart turn right.gif ENVP
Chart fork right.gif ONMA
Chart fork right.gif ONFA
Chart fork right.gif ONTA
Chart turn right.gif ONSK
Chart descend.gif Chart fork right.gif TXMP
Chart fork right.gif AISA
Chart descend.gif Chart fork right.gif ONCC
Chart descend.gif Chart turn right.gif ONWC
Chart fork right.gif AITR
Chart fork right.gif ONSA
Chart fork right.gif OBDC
Chart descend.gif Chart turn right.gif M3GM
Chart descend.gif Chart fork right.gif PNTA
Chart descend.gif Chart fork right.gif VCRA
Chart descend.gif Chart fork right.gif TXCA
Chart descend.gif Chart fork right.gif IDXA
Chart descend.gif Chart turn right.gif TXMP
Chart fork right.gif ONOA
Chart descend.gif Chart turn right.gif IDXA
Chart fork right.gif ENVP
Chart turn right.gif CRSA
Chart turn right.gif ONCC