Line 398: |
Line 398: |
| | | |
| '''03043040''' (skippable) ''"items"'' | | '''03043040''' (skippable) ''"items"'' |
| + | |
| + | ''Note:'' This chunk resets the lookback string state. |
| + | |
| uint32 version | | uint32 version |
| if version != 0: | | if version != 0: |
Line 520: |
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 673: |
Line 679: |
| | | |
| '''0305B00D''' | | '''0305B00D''' |
− | uint32 (-1?) | + | noderef raceValidateGhost (CGameCtnGhost) (usually -1) |
| | | |
− | '''0305B00E''' | + | '''0305B00E''' (skippable) |
− | (skippable) | + | string mapType |
− | uint32 | + | string mapStyle |
− | uint32 | |
| uint32 | | uint32 |
| | | |
Line 695: |
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 707: |
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 828: |
Line 859: |
| | | |
| '''0309200B''' (skippable) | | '''0309200B''' (skippable) |
− | uint32 cpNum | + | uint32 numCheckpoints |
− | uint64 cpTimeMs[cpNum] | + | for each checkpoint: |
| + | uint32 time |
| + | uint32 stuntsScore (usually 0 in TM2) |
| | | |
| '''0309200C''' | | '''0309200C''' |
Line 867: |
Line 900: |
| | | |
| '''03092019''' | | '''03092019''' |
− | uint32 eventsDuration | + | uint32 eventsDuration (if 0 then stop reading this chunk) |
| uint32 ignored | | uint32 ignored |
| uint32 numControlNames | | uint32 numControlNames |
Line 905: |
Line 938: |
| uint32 IsInternal : 1; | | uint32 IsInternal : 1; |
| uint32 IsAdvanced : 1; | | uint32 IsAdvanced : 1; |
− | uint32 IconDesc : 5; // 0 = Unknown, 1 = NoIcon, 2 = BGRA_64x64, 3 = BGRA_128x128 | + | uint32 IconDesc : 5; // 0 = Unknown, 1 = NoIcon, 2 = 64x64, 3 = 128x128 |
| uint32 __unused__ : 24; | | uint32 __unused__ : 24; |
| }; | | }; |
Line 917: |
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 1,113: |
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)=== |