XML:ONLV: Difference between revisions
Paradox-01 (talk | contribs) mNo edit summary |
m (→Level files hierarchy: um, what is AKEB? is it AKBA? =^_^=) |
||
(235 intermediate revisions by 8 users not shown) | |||
Line 1: | Line 1: | ||
{{ | {{XML_File_Header | prev=ONLD | type=ONLV | next=ONSK | name=Oni Game Level}} | ||
__TOC__ | |||
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 '''[[Creating a level|corresponding tutorial]]'''. | |||
==ONLV== | |||
{| class="wikitable" width="100%" | |||
!width=150px| XML tag | |||
!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. | |||
|} | |||
==OBOA== | |||
Used for movable/moving objects. | |||
{| class="wikitable" width="100%" | |||
!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. | |||
|} | |||
== | ==ONOA== | ||
( | Used by static objects (imported by object list). | ||
{| 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. | |||
| | |||
|} | |} | ||
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== | |||
{| class="wikitable" width="100%" | |||
!width=150px| XML tag | |||
!width=120px| Content type | |||
! Description | |||
|- | |||
| <ENVP id="..."> | |||
| integer | |||
| Instance ID. | |||
<Transform> | |- | ||
| <Particles> | |||
<Flags> | | - | ||
: | | 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 | : NotInitiallyCreated | ||
|} | |||
==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. | |||
{| class="wikitable" width="100%" | |||
!width=150px| XML tag | |||
!width=120px| Content type | |||
! Description | |||
|- | |||
| <M3GA id="..."> | |||
| integer | |||
| Instance ID. | |||
|- | |||
| <Geometries> | |||
| - | |||
| This is an int32 array for the <Link> tags. | |||
|- | |||
|valign="top"| <Link> | |||
|valign="top"| link | |||
| | |||
: #''N'' (instance number) (for non-door) | |||
: M3GM''name'' (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 [[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%" | |||
!width=150px| XML tag | |||
!width=120px| Content type | |||
! Description | |||
|- | |||
| <IDXA id="..."> | |||
| integer | |||
| Instance ID. | |||
|- | |||
| <Indices> | |||
| - | |||
| This is an Int32 array for the <Int32> tags. | |||
|- | |||
|valign="top"| <Int32> | |||
|valign="top"| int32 | |||
| | |||
; From ONOA to AGQG elements | |||
: 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>.) | |||
; From M3GM to PNTA elements | |||
: Read more [[XML:M3GM#PNTA|HERE]]. | |||
; From M3GM to VCRA elements | |||
: Read more [[XML:M3GM#VCRA|HERE]]. | |||
< | |||
; | |||
: | |||
; | |||
: | |||
: | |||
|} | |} | ||
==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%"| | |||
= | |||
| | |||
| | |||
|} | |} | ||
{|class="wikitable" width="100%" style="text-align:center" | |||
|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 | |||
| | |||
| | |||
|- | |||
| [[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 | |||
| | |||
| | |||
| | |||
|- | |||
| [[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 | |||
| | |||
| | |||
| | |||
|- | |||
| [[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);"| ONTA | |||
| | |||
| | |||
| | |||
|- | |||
| [[Image:Chart turn right.gif]] | |||
| ONSK | |||
| | |||
| | |||
| | |||
|- | |||
| [[Image:Chart descend.gif]] | |||
| [[Image:Chart fork right.gif]] | |||
| TXMP | |||
| | |||
| | |||
|- | |||
| [[Image:Chart fork right.gif]] | |||
| AISA | |||
| | |||
| | |||
| | |||
|- | |||
| [[Image:Chart descend.gif]] | |||
| [[Image:Chart fork right.gif]] | |||
| ONCC | |||
| | |||
| | |||
|- | |||
| [[Image:Chart descend.gif]] | |||
| [[Image:Chart turn right.gif]] | |||
| ONWC | |||
| | |||
| | |||
|- | |||
| [[Image:Chart fork right.gif]] | |||
| AITR | |||
| | |||
| | |||
| | |||
|- | |||
| [[Image:Chart fork right.gif]] | |||
| ONSA | |||
| | |||
| | |||
| | |||
|- | |||
| [[Image:Chart fork right.gif]] | |||
| OBDC | |||
| | |||
| | |||
| | |||
|- | |||
| [[Image:Chart descend.gif]] | |||
| [[Image:Chart turn right.gif]] | |||
|style="background-color:#FFFFAA;"| M3GM | |||
| | |||
| | |||
|- | |||
| [[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);"| PNTA | |||
| | |||
|- | |||
| [[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);"| VCRA | |||
| | |||
|- | |||
| [[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);"| TXCA | |||
| | |||
|- | |||
| [[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 | |||
| | |||
|- | |||
| [[Image:Chart descend.gif]] | |||
| | |||
| [[Image:Chart turn right.gif]] | |||
| TXMP | |||
| | |||
|- | |||
| [[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 | |||
| | |||
| | |||
| | |||
|- | |||
| [[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);"| IDXA | |||
| | |||
| | |||
|- | |||
| [[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 | |||
| | |||
| | |||
| | |||
|- | |||
| [[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);"| CRSA | |||
| | |||
| | |||
| | |||
|- | |||
| | |||
| [[Image:Chart turn right.gif]] | |||
| ONCC | |||
| | |||
| | |||
|} | |} | ||
{{XML}} | |||
Latest revision as of 18:07, 9 December 2023
ONLV : Oni Game Level | ||
---|---|---|
XML
ONLD << Other file types >> ONSK |
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.
|
<Environment> | link | Link to AKEV via file name (AKEVname, don't use file suffix .oni)
|
<Objects> | link | Link to OBOA via instance number (#N).
|
<SkyBox> | link | Link to ONSK via file name (ONSKname, don't use file suffix .oni)
|
<Characters> | link | Link to AISA via file name (AISAname, don't use file suffix .oni)
|
<ObjectQuadMap> | link | Link to ONOA via instance number (#N).
|
<Particles> | link | Link to ENVP via instance number (#N).
|
<Corpses> | link | Link to CRSA via instance number (#N).
|
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 |
|
<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 |
|
<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).
|
<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 |
|
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 |
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 |
Level files hierarchy
(un)colored cell = file | striped cell = embedded instance |