Line 381: |
Line 381: |
| uint32 version | | uint32 version |
| if version >= 5: | | if version >= 5: |
− | uint32 frames | + | uint32 frames // If version < 5 then frames = 1 |
| if version >= 2: | | if version >= 2: |
− | if version < 5: | + | for each frame: |
− | if version >= 4:
| |
− | uint32 size
| |
− | byte riff[size] // Avg lightmap webp file
| |
| uint32 size | | uint32 size |
− | byte jfif[size] // Intens/Avg lightmap jpeg file | + | byte image[size] // Image is JPEG/JFIF or WEBP/RIFF file format |
− | if version == 3: | + | if version >= 3: |
| uint32 size | | uint32 size |
− | byte jfif[size] // Intens lightmap jpeg file | + | byte image[size] |
− | if version >= 5:
| + | if version >= 6: |
− | for each frame:
| |
| uint32 size | | uint32 size |
− | byte riff[size] // Avg lightmap webp file | + | byte image[size] |
− | uint32 size
| |
− | byte jfif[size] // Intens lightmap jpeg file
| |
| if size != 0: | | if size != 0: |
| uint32 uncompressedSize | | uint32 uncompressedSize |
| uint32 compressedSize | | uint32 compressedSize |
| byte compressedData[compressedSize] // ZLIB compressed lightmap cache node | | byte compressedData[compressedSize] // ZLIB compressed lightmap cache node |
| + | |
| + | '''03043040''' (skippable) ''"items"'' |
| + | |
| + | ''Note:'' This chunk resets the lookback string state. |
| + | |
| + | uint32 version |
| + | if version != 0: |
| + | uint32 |
| + | uint32 size |
| + | uint32 (10) |
| + | uint32 numItems |
| + | for each item: |
| + | noderef item (CGameCtnAnchoredObject) |
| + | uint32 |
| | | |
| '''03043044''' (skippable) | | '''03043044''' (skippable) |
Line 493: |
Line 501: |
| EType_Iso4, | | EType_Iso4, |
| EType_Ident, | | EType_Ident, |
− | EType_Int2 | + | EType_Int2, |
| + | EType_Struct |
| }; | | }; |
| + | Maniaplanet 4.1 has changed the way script types and values are written. The code now does the following: |
| + | |
| + | * First write the list of all types (all types appear only once). |
| + | * For each value, write the index of the type in the list, and then write the value. |
| + | |
| + | Writing the types and values has not changed except for the addition of structures which are a plain list of members. |
| + | |
| + | Also note that the indices are written in the following form: |
| + | |
| + | * If the index is < 128, it is written directly into one byte (because this covers 99% of the cases). |
| + | * Otherwise, it is written in the first 7 bits of the first byte and in the following 2 bytes, a total of 23 bits (7+8+8). The 8th bit of the first byte is set to 1. |
| + | |
| + | Note that this scheme is also used to write string lengths. |
| | | |
| '''03043054''' (skippable) | | '''03043054''' (skippable) |
Line 501: |
Line 523: |
| uint32 chunkSize | | uint32 chunkSize |
| uint32 itemCount (number of embedded items) | | uint32 itemCount (number of embedded items) |
| + | meta items[itemCount] |
| uint32 zipSize (embedded items ZIP file size) | | uint32 zipSize (embedded items ZIP file size) |
| byte zipFile[zipSize] | | byte zipFile[zipSize] |
| + | uint32 textureCount |
| + | string textures[textureCount] |
| | | |
| '''21080001''' ''"VskDesc"'' | | '''21080001''' ''"VskDesc"'' |
Line 565: |
Line 590: |
| SCollectorStock archive[archiveCount] | | SCollectorStock archive[archiveCount] |
| meta (blockName, collection, author) | | meta (blockName, collection, author) |
− | uint32 | + | uint32 numPieces |
| | | |
| ===CGameCtnChallengeParameters (03 05B 000)=== | | ===CGameCtnChallengeParameters (03 05B 000)=== |
Line 654: |
Line 679: |
| | | |
| '''0305B00D''' | | '''0305B00D''' |
− | uint32 (-1?) | + | noderef raceValidateGhost (CGameCtnGhost) (usually -1) |
| | | |
− | '''0305B00E''' | + | '''0305B00E''' (skippable) |
− | (skippable) | + | string mapType |
− | uint32 | + | string mapStyle |
− | uint32 | |
| uint32 | | uint32 |
| | | |
Line 676: |
Line 700: |
| fileref packDesc | | fileref packDesc |
| fileref parentPackDesc | | fileref parentPackDesc |
| + | |
| + | '''03059003''' ''"TM2020"'' |
| + | uint32 version |
| + | fileref secondaryPackDesc |
| | | |
| ===CGameWaypointSpecialProperty (03 13B 000) === | | ===CGameWaypointSpecialProperty (03 13B 000) === |
Line 688: |
Line 716: |
| string tag | | string tag |
| uint32 order | | uint32 order |
| + | |
| + | ===CGameCtnAnchoredObject (03 101 000)=== |
| + | |
| + | '''03101002''' |
| + | uint32 version |
| + | meta (itemFile, collection, author) |
| + | vec3 pitchYawRoll |
| + | byte blockUnitX |
| + | byte blockUnitY |
| + | byte blockUnitZ |
| + | lookbackstring anchorTreeId |
| + | vec3 absolutePositionInMap |
| + | CGameWaypointSpecialProperty waypointSpecialProperty (-1 if not a waypoint, otherwise direct node) |
| + | if version >= 4: |
| + | uint16 flags |
| + | if version >= 5: |
| + | vec3 pivotPosition |
| + | if version >= 6: |
| + | float scale |
| + | if version >= 8: // TM 2020 |
| + | vec3 |
| + | vec3 |
| | | |
| ===CGameCtnReplayRecord (03 093 000)=== | | ===CGameCtnReplayRecord (03 093 000)=== |
Line 782: |
Line 832: |
| ===CGameCtnGhost (03 092 000)=== | | ===CGameCtnGhost (03 092 000)=== |
| CGameCtnGhost is a subclass of CGameGhost. If you encounter an unknown chunk ID while reading a CGameCtnGhost instance, delegate it to CGameGhost. | | CGameCtnGhost is a subclass of CGameGhost. If you encounter an unknown chunk ID while reading a CGameCtnGhost instance, delegate it to CGameGhost. |
| + | |
| + | '''03092000''' (skippable) |
| + | uint32 |
| + | meta playerModel |
| + | vec3 |
| + | |
| + | uint32 numSkinRef |
| + | fileref skinRef[numSkinRef] |
| + | |
| + | uint32 |
| + | string ghostNickname |
| + | string ghostAvatarFile |
| + | uint32 |
| | | |
| '''03092005''' (skippable) | | '''03092005''' (skippable) |
Line 796: |
Line 859: |
| | | |
| '''0309200B''' (skippable) | | '''0309200B''' (skippable) |
− | uint32 num | + | uint32 numCheckpoints |
− | uint64[num] | + | for each checkpoint: |
| + | uint32 time |
| + | uint32 stuntsScore (usually 0 in TM2) |
| | | |
| '''0309200C''' | | '''0309200C''' |
Line 835: |
Line 900: |
| | | |
| '''03092019''' | | '''03092019''' |
− | uint32 eventsDuration | + | uint32 eventsDuration (if 0 then stop reading this chunk) |
| uint32 ignored | | uint32 ignored |
| uint32 numControlNames | | uint32 numControlNames |
Line 868: |
Line 933: |
| lookbackstring | | lookbackstring |
| if version >= 3: | | if version >= 3: |
− | uint32 flags | + | struct SCollectorDescFlags |
| + | { |
| + | uint32 __unused2__ : 1; |
| + | uint32 IsInternal : 1; |
| + | uint32 IsAdvanced : 1; |
| + | uint32 IconDesc : 5; // 0 = Unknown, 1 = NoIcon, 2 = 64x64, 3 = 128x128 |
| + | uint32 __unused__ : 24; |
| + | }; |
| uint16 catalogPosition (order of the blocks within pageName) | | uint16 catalogPosition (order of the blocks within pageName) |
| if version >= 7: | | if version >= 7: |
Line 878: |
Line 950: |
| uint16 iconWidth | | uint16 iconWidth |
| uint16 iconHeight | | uint16 iconHeight |
− | byte iconData[4*iconWidth*iconHeight] // one RGBA uint32 per pixel | + | if (int16)iconWidth >= 0 && (int16)iconHeight >= 0: |
| + | byte iconData[4*iconWidth*iconHeight] // one RGBA uint32 per pixel |
| + | else: |
| + | uint16 version |
| + | if version >= 1: |
| + | uint32 size |
| + | byte iconData[size] // WebP image |
| | | |
| '''0301A006''' (header) | | '''0301A006''' (header) |
Line 890: |
Line 968: |
| uint32 | | uint32 |
| uint32 | | uint32 |
| + | |
| + | '''0301A008''' |
| + | byte |
| + | string skinFile |
| | | |
| '''0301A009''' | | '''0301A009''' |
Line 918: |
Line 1,000: |
| | | |
| '''0301C000''' (header) | | '''0301C000''' (header) |
− | uint32 itemType (0: Undefined, 1: Ornament (formerly: StaticObject), 2: PickUp (formerly: DynaObject), 3: Character, 4: Vehicle, 5: Spot, 6: Cannon, 7: Group (Dev build), 8: Decal (Dev build), 9: Turret (Dev build), 10: Wagon (Dev build), 11: Block (Dev build)) | + | uint32 itemType (0: Undefined, 1: Ornament (formerly: StaticObject), 2: PickUp (formerly: DynaObject), 3: Character, 4: Vehicle, 5: Spot, 6: Cannon, 7: Group, 8: Decal, 9: Turret, 10: Wagon, 11: Block, 12: EntitySpawner |
| | | |
| '''0301C001''' (header) | | '''0301C001''' (header) |
Line 1,064: |
Line 1,146: |
| string dirNameAlt | | string dirNameAlt |
| if version >= 5: | | if version >= 5: |
− | bool unknown | + | bool useDefaultSkin |
| | | |
| ===CGamePlayerProfile (03 08C 000)=== | | ===CGamePlayerProfile (03 08C 000)=== |
Line 1,070: |
Line 1,152: |
| string onlineLogin | | string onlineLogin |
| string onlineSupportKey | | string onlineSupportKey |
| + | |
| + | ===CGameCtnMediaClipGroup (03 07A 000)=== |
| + | '''0307A003''' |
| + | uint32 ignored (0xA) |
| + | uint32 numClips |
| + | for each clip: |
| + | noderef clip |
| + | uint32 numClips |
| + | for each clip: |
| + | vec3 referenceFramePosition (NaN if none) |
| + | uint32 referenceFrameRotation |
| + | uint32 triggerCondition (0: None, 1: Time < arg, 2: Time > arg, 3: Already triggered, 4: Speed < arg, 5: Speed > arg, 6: Not already triggered) |
| + | float triggerArgument |
| + | uint32 numTriggers |
| + | for each trigger: |
| + | vec3 position |
| + | |
| + | ===CGameCtnMediaClip (03 079 000)=== |
| + | '''03079002''' |
| + | uint32 |
| + | uint32 numTracks |
| + | for each track: |
| + | noderef mediaTrack |
| + | string clipName |
| + | uint32 |
| + | |
| + | '''03079003''' |
| + | uint32 |
| + | uint32 numTracks |
| + | for each track: |
| + | noderef mediaTrack |
| + | string clipName |
| + | |
| + | '''03079004''' (all fields are ignored) |
| + | uint32 |
| + | |
| + | '''03079005''' |
| + | uint32 ignored (0xA) |
| + | uint32 numTracks |
| + | for each track: |
| + | noderef mediaTrack |
| + | string clipName |
| + | |
| + | '''03079007''' |
| + | uint32 localPlayerClipEntIndex |
| + | |
| + | '''0307900A''' |
| + | bool stopWhenLeave |
| + | |
| + | '''0307900D''' |
| + | uint32 |
| + | uint32 version |
| + | uint32 numTracks |
| + | for each track: |
| + | noderef mediaTrack |
| + | string clipName |
| + | bool stopWhenLeave |
| + | bool |
| + | bool stopWhenRespawn |
| + | string |
| + | float |
| + | uint32 localPlayerClipEntIndex |
| + | |
| + | ===CGameCtnMediaTrack (03 078 000)=== |
| + | '''03078001''' |
| + | string trackName |
| + | uint32 ignored (0xA) |
| + | uint32 numTracks |
| + | for each track: |
| + | noderef mediaBlock |
| + | uint32 unknown |
| + | |
| + | '''03078004''' |
| + | bool keepPlaying |
| + | uint32 ignored (0) |
| + | |
| + | ===CControlEffectSimi (07 010 000)=== |
| + | '''07010003''' |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | vec2 position |
| + | float rotation (in rad) |
| + | float scaleX |
| + | float scaleY |
| + | float opacity |
| + | float depth |
| + | bool centered |
| + | |
| + | '''07010004''' |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | vec2 position |
| + | float rotation (in rad) |
| + | float scaleX |
| + | float scaleY |
| + | float opacity |
| + | float depth |
| + | float |
| + | float isContinousEffect |
| + | float |
| + | float |
| + | bool centered |
| + | uint32 colorBlendMode |
| + | bool isContinousEffect |
| + | |
| + | '''07010005''' |
| + | ReadChunk(0x07010004) |
| + | bool isInterpolated |
| + | |
| + | ===CGameCtnMediaBlock=== |
| + | |
| + | ====CGameCtnMediaBlockCameraPath (03 0A1 000)==== |
| + | '''030A1002''' |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | vec3 cameraPosition |
| + | float pitch (rad) |
| + | float yaw (rad) |
| + | float roll (rad) |
| + | float FOV |
| + | bool anchorRot |
| + | uint32 indexTargetPlayer (maxint: None, 0: Local player) |
| + | bool anchorVis |
| + | uint32 indexAnchorPlayer (maxint: None, 0: Local player) |
| + | vec3 targetPosition |
| + | float weight |
| + | float |
| + | float |
| + | float |
| + | float |
| + | |
| + | ====CGameCtnMediaBlockCameraCustom (03 0A2 000)==== |
| + | '''030A2005''' |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | uint32 interpolation (0: None, 1: Hermit, 2: Linear, 3: FixedTangent) |
| + | uint64 unused (0) |
| + | vec3 cameraPosition |
| + | float pitch (rad) |
| + | float yaw (rad) |
| + | float roll (rad) |
| + | float FOV |
| + | bool anchorRot |
| + | uint32 indexTargetPlayer (maxint: None, 0: Local player) |
| + | bool anchorVis |
| + | uint32 indexAnchorPlayer (maxint: None, 0: Local player) |
| + | vec3 targetPosition |
| + | float leftTangentX |
| + | float leftTangentY |
| + | float leftTangentZ |
| + | float rightTangentX |
| + | float rightTangentY |
| + | float rightTangentZ |
| + | |
| + | ====CGameCtnMediaBlockCameraEffectShake (03 0A4 000)==== |
| + | '''030A4000''' |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | float intensity |
| + | float speed |
| + | |
| + | ====CGameCtnMediaBlockImage (03 0A5 000)==== |
| + | '''030A5000''' |
| + | noderef CControlEffectSimi |
| + | fileref image |
| + | |
| + | ====CGameCtnMediaBlockMusicEffect (03 0A6 000)==== |
| + | '''030A6001''' |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | float musicVolume |
| + | float soundVolume |
| + | |
| + | ====CGameCtnMediaBlockSound (03 0A7 000)==== |
| + | '''030A7001''' |
| + | fileref sound |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | float volume |
| + | float pan |
| + | |
| + | '''030A7002''' |
| + | uint32 playCount |
| + | bool isLooping |
| + | |
| + | '''030A7003''' |
| + | uint32 version |
| + | uint32 playCount |
| + | bool isLooping |
| + | bool isMusic |
| + | if version >= 1: |
| + | bool stopWithClip |
| + | if version >= 2: |
| + | bool audioToSpeech |
| + | int audioToSpeechTarget |
| + | |
| + | '''030A7004''' |
| + | fileref sound |
| + | uint32 ignored (1) |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | float volume |
| + | float pan (unused) |
| + | vec3 soundTransmitorPosition |
| + | |
| + | ====CGameCtnMediaBlockText (03 0A8 000)==== |
| + | '''030A8001''' |
| + | string text |
| + | noderef CControlEffectSimi |
| + | |
| + | '''030A8002''' |
| + | color textColor (with in-game color selector format) |
| + | |
| + | ====CGameCtnMediaBlockTrails (03 0A9 000)==== |
| + | '''030A9000''' |
| + | float timeClipStart |
| + | float timeClipEnd |
| + | |
| + | ====CGameCtnMediaBlockTransitionFade (03 0AB 000)==== |
| + | '''030AB000''' |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | float opacity |
| + | color transitionColor (with in-game color selector format) |
| + | float ignored (1.0) |
| + | |
| + | ====CGameCtnMediaBlockFxColors (03 080 000)==== |
| + | '''03080003''' |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | float intensity |
| + | float blendZ (far) |
| + | float distance (near) |
| + | float distance (far) |
| + | additionnalParameters (near) |
| + | additionnalParameters (far) |
| + | |
| + | additionnalParameters format: |
| + | float inverse |
| + | float hue |
| + | float saturation |
| + | float brightness |
| + | float contrast |
| + | color |
| + | float ignored (1.0) |
| + | float ignored (1.0) |
| + | float ignored (1.0) |
| + | float ignored (0.0) |
| + | |
| + | ====CGameCtnMediaBlockFxBlurDepth (03 081 000)==== |
| + | '''03081001''' |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | float lensSize |
| + | bool forceFocus |
| + | float focusZ |
| + | |
| + | ====CGameCtnMediaBlockFxBlurMotion (03 082 000)==== |
| + | '''03082000''' |
| + | float timeClipStart |
| + | float timeClipEnd |
| + | |
| + | ====CGameCtnMediaBlockFxBloom (03 083 000)==== |
| + | '''03083001''' |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | float intensity |
| + | float sensitivity |
| + | |
| + | ====CGameControlCameraFree (03 084 000)==== |
| + | '''03084003''' |
| + | float timeClipStart |
| + | float timeClipEnd |
| + | lookbackstring cameraView |
| + | uint32 indexTargetPlayer (0: Local player) |
| + | |
| + | ====CGameCtnMediaBlockTime (03 085 000)==== |
| + | '''03085000''' |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | float timeValue |
| + | float tangent |
| + | |
| + | ====CGameCtnMediaBlock3dStereo (03 024 000)==== |
| + | '''03024000''' |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | float separation |
| + | float screenDist |
| + | |
| + | ====CGameCtnMediaBlockTriangles (03 029 000)==== |
| + | '''03029001''' |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | uint32 numKeys |
| + | uint32 numPoints |
| + | for each key: |
| + | for each point: |
| + | vec3 pointPosition |
| + | uint32 numPoints |
| + | for each point: |
| + | color pointColor (with in-game color selector format) |
| + | float opacity |
| + | uint32 numTriangles |
| + | for each triangle: (index of the 3 vertices forming the triangle) |
| + | uint32 vertex1 |
| + | uint32 vertex2 |
| + | uint32 vertex3 |
| + | uint32 ignored (1) |
| + | uint32 ignored (0) |
| + | uint32 ignored (0) |
| + | float ignored (1.0) |
| + | uint32 ignored (0) |
| + | uint64 ignored (0) |
| + | |
| + | ====CGameCtnMediaBlockGhost (03 0E5 000)==== |
| + | '''030E5001''' |
| + | float timeClipStart |
| + | float timeClipEnd |
| + | noderef ghostModel (CGameCtnGhost) |
| + | float startOffset |
| + | |
| + | '''030E5002''' |
| + | uint32 version |
| + | if version < 3: |
| + | float timeClipStart |
| + | float timeClipEnd |
| + | if version >= 3: |
| + | uint32 numKeys |
| + | for each key: |
| + | float timeStamp |
| + | float |
| + | noderef ghostModel (CGameCtnGhost) |
| + | float startOffset |
| + | bool noDamage |
| + | bool forceLight |
| + | bool forceHue |
| | | |
| ===CMwNod (01 001 000)=== | | ===CMwNod (01 001 000)=== |
Line 1,098: |
Line 1,532: |
| * [http://www.wolfgang-rolke.de/gbxdump/gbxlightmap.zip GbxLightMap download] - a Windows tool to extract the lightmaps from a given .Map.Gbx file (includes source code). | | * [http://www.wolfgang-rolke.de/gbxdump/gbxlightmap.zip GbxLightMap download] - a Windows tool to extract the lightmaps from a given .Map.Gbx file (includes source code). |
| * [http://www.wolfgang-rolke.de/gbxdump/gbxmetadata.zip GbxMetadata download] - a Windows tool that indicates the persistent attributes of a given .Map.Gbx file (includes source code). | | * [http://www.wolfgang-rolke.de/gbxdump/gbxmetadata.zip GbxMetadata download] - a Windows tool that indicates the persistent attributes of a given .Map.Gbx file (includes source code). |
| + | * [[File:Krzychor-campaign-maker.zip]] - a Windows tool that allows to create custom campaigns for TMNF/TMUF. Sources not included. |
| | | |
| [[Category:File formats]] | | [[Category:File formats]] |