Skip to content

REDbridge 0.11.0

Latest

Choose a tag to compare

@github-actions github-actions released this 26 Oct 17:08

Windows x64 build of REDbridge 0.11.0. It is framework dependent, so it needs the .NET 10 runtime (winget install Microsoft.DotNet.Runtime.10).

Unzip it anywhere and point REDcode (redcode.bridgePath) or EDGEdeck (edgedeck.bridgePath) at REDbridge.exe, or let REDcode's Install REDbridge or EDGEdeck's Get REDbridge fetch it.

Changed

  • Reads game 2.5 (issue #10): built with WolvenKit 10.0.0-beta.1, WolvenKit's first build with support for game 2.5, instead of 9.1.0. All 3,041 quest streaming sectors of 2.5 read; 9.1.0 failed 262 of them because they hold node classes new in 2.5. The game's CR2W version did not change: 2.31's files are version 195 (0xC3) too. In other file types the JSON only gains the fields 2.5 added, such as boundingBoxLocalBoundsOverride on skinned mesh components and astcQuality in texture setups; no field was renamed or dropped in the types compared (30 file types, 5 files each).

  • Game 2.31's streaming sectors no longer read right. WolvenKit 10.0.0-beta.1 reads node data and instanced mesh transforms only in 2.5's form. On a 2.31 install, 383 of 3,054 quest sectors fail ("Non-zero padding bytes found"), the others come back with wrong nodeData entries, and worldInstancedMeshNode loses its transforms. Every other method still passes the probe and REDcode's smoke test on 2.31.

  • A streaming sector's nodeData has new field names in cr2w.* JSON. WolvenKit 10 reads each entry as the game's worldCompiledNodeInstanceSetupInfo, with one entry per node in node order:

    Was (WolvenKit 9.1) Now
    NodeIndex (wrong on 2.5) nodeIdx, a number as text
    Position, Orientation transform.position, transform.orientation
    Scale scale
    Pivot secondaryRefPointPosition
    Bounds.Min, Bounds.Max streamingRefPoint, preboostStreamingRefPoint: never bounds
    Id patchedNode
    QuestPrefabRefHash, resolved to the node path globalNodeId.hash, a number only. It is WolvenKit's NodeRef hash: FNV-1a 64 of the path with every # left out
    UkHash1 proxyMeshId.hash
    CookedPrefabData externalInplaceResourceHash
    MaxStreamingDistance, UkFloat1 secondaryRefPointDistance, streamingDistance
    Uk10 to Uk14 nodeFlags, streamingPriority, todvisMask, instanceIndex, dataGroup
  • sector.build writes game 2.5 sectors: version 68 and 2.5's node-data record, with the node flags, streaming priority and reference points of base-game 2.5 mesh, entity and light nodes. The scene format and the result are unchanged. Not yet tried in the game.

New

  • Spoken lines in loc.* (issue #9, for EDGEquest): the subtitles of the base game and Phantom Liberty, read offline from localization\<language>\subtitles\**\*.json, with their voice-over files and lengths. A scene line's locstringId.ruid is the line's stringId. The first call per language builds an index in about 3 s; searches after it take a few milliseconds.
    • loc.lines(stringIds, language, projectDir?): one result per stringId (decimal text), with both texts, the subtitle file and the row (index) in it, voice (the .wem paths from voiceovermap.json and voiceovermap_1.json), length (seconds, from stringidvariantlengthsreport.json) and otherVoices (the helmet, holocall and rewinded maps that have it).
    • loc.searchLines(query, language, limit, projectDir?): lines with every word of the query in either text, or the stringId given as a number, as { total, items }.
    • loc.projectLinesFiles(projectDir, language) and loc.newLinesFile(projectDir, modName, language): a project's subtitle files, and an empty one when it has none, written to source/archive/<mod>/localization/<language>/subtitles/<mod>.json and named in its .xl under localization: subtitles: without rewriting the rest of the file.
    • With a project folder, the project's own subtitle entries win over the game's, as for onscreens: the files its .xl files name under localization: subtitles:, and any under source/archive in a <language>\subtitles folder.
  • project.import takes a texture setup (issue #8, for EDGEmat) for the .xbm an image import writes. It is a preset, "color" (TEXG_Generic_Color, TCM_QualityColor, gamma on), "normal" (TEXG_Generic_Normal, TCM_Normalmap) or "grayscale" (TEXG_Generic_Grayscale, TCM_QualityR, TRF_Grayscale), or a texture group name, or an object { group, compression, rawFormat, isGamma, hasMipchain, isStreamable } whose missing fields come from the group's defaults in WolvenKit. Given, it wins over an existing texture's setup. Without it, imports work as before.
  • project.import reports the texture setup it wrote, read back from the .xbm, as texture: { group, compression, rawFormat, isGamma, hasMipchain, isStreamable }.
  • mesh.items(path, appearance?, language?), for REDcode's Find Items in the mesh viewer: the TweakDB item records whose look shows a mesh, found backwards along the chain from record to factory .csv to root .ent to .app look to mesh. Each item has its record, type, display name, appearanceName, the mesh appearance it shows, the .app and its look, and the root entity with its entries for that look (s1_casual_01_basic_01_&Male). looks lists every .app look that shows the mesh, also those no item reaches. With appearance, only the looks that show that mesh appearance. The first call builds an index from file headers in under a second after TweakDB loads; a call after it takes a fraction of a second. Covers items that pick their look by appearanceName (clothing: 2,375 records in game 2.5); weapons, which pick theirs by visual tags, are not found, nor a mesh that only a part entity holds.

Built with WolvenKit 10.0.0-beta.1 from its NuGet packages. WolvenKit's source is https://github.com/WolvenKit/WolvenKit/tree/10.0.0-beta.1 (GPL-3.0), and the bridge's source is this repository.