Skip to content

REDnode 0.32.1

Choose a tag to compare

@github-actions github-actions released this 23 Oct 08:57

For game version 2.31 only. Game version 2.5 is not supported yet: RED4ext will not load this REDnode on 2.5. REDnode moves to 2.5 as soon as RED4ext, redscript and Codeware support it.

New

  • The ink API (experimental, needs Codeware): Node mods build trees of the game's own UI widgets on the HUD (ink.mount, ink.column, ink.text and the rest), drawn by the game rather than the overlay. REDnode builds them again after a save load and removes them when the mod stops. The game look comes from the game's own style sheet: a text style (title, label, value and the rest) or a tone (normal, accent, danger and the rest) gives the game's exact sizes and colors with no styling by hand. Layout with gap, pad, align and grow; the game's icons by TweakDB record. Game values bound to texts and bars (bind: "player.health", ink.bar), read by the plugin every frame with no update code in the mod; lists from data (ink.list, mount.update) that send only what changed. See Native game UI. Text in the player's language: an ink text set to "LocKey#…" shows the game's own translation, and t() takes a package's own text from locales/<language>.json, with parameters, plurals and V's gender, and follows a language change. game.language() and the language event give the game's language. Samples: Ink Coords, Ink vitals, Ink styles, Ink list and Ink language.
  • Swapping an archive now shows the new version on the clothing V wears at once, without taking it off: archives.reload applies the worn items' appearance again after the swap, in the base game's slots and Equipment-EX's (with Equipment-EX in use only its slots, so items it hides stay hidden). { refresh: false } skips it; the answer's refreshed lists what was refreshed. The MCP tool archives_reload takes refresh too.
  • A package's requires can name rednode with a version, for app packs that need a REDnode new enough. The overlay host answers with its own version.
  • Each release on GitHub also carries the app packs' zips, such as REDnode Sound Tools, each as its own file.
  • The MCP tool api_read reads from the game without asking: it runs functions named like reads (Get, Is, Has, Can, Find) and a TweakDB record's methods, and refuses the rest. See the MCP server.
  • The Quest API, for testing a quest in the running game: quests.fact, quests.facts and quests.setFact read and set the game's quest facts, quests.watch hears each change of named facts as the game makes it (with no polling, kept across save loads), journal.entry, journal.setState, journal.track and journal.tracked read and change journal entries, and game.player.teleport moves V to a position or a world node. MCP tools for assistants: game_facts and game_journal read without asking; game_facts_set, game_journal_set and game_teleport ask first. See Quest API. Sample: Quest test.
  • New samples in the download, off until you switch them on: Ink Coords and Ink vitals (the game's own UI, need Codeware) and Quest test.
  • The Test timer is now a sample in the download, off until you switch it on: a stopwatch whose Mark writes the step and the time to the Mod log and red4ext/logs/rednode-mods.log, to match log lines to what you did while testing a mod.

Changed

  • Claude Code now asks you before every call of the MCP tools api_call and archives_reload, in every permission mode, auto mode included. Reads go through the new api_read, which never asks.

Fixed

  • The MCP tool api_read no longer refuses reads whose names hold a word like Equip, Start or Open as a noun, such as GetItemInEquipSlot or IsQuickHackPanelOpen, which then went through api_call and asked you first. It refuses only reads that also change something, such as GetOrCreate….
  • Sending many game calls at once (more than 256 in one frame) no longer leaves the extra ones unanswered until they time out after 5 seconds: the plugin runs 256 a frame and carries the rest to the next frames, and refuses past 4096 waiting with a message.
  • The game no longer crashes when quitting after a Node mod held objects made by another plugin, such as Codeware's: REDnode lets go of every object it holds when the game stops, while the other plugins are still loaded.
  • api.$new with properties on a class written in redscript no longer breaks the object it makes (and crashes the game at its next use): script fields are now set where the game keeps them, as $get and $set already did.
  • archives.reload and the MCP tool archives_reload refuse, with a message, a swap that the official RED Hot Tools would get wrong and end the game with: replacing an archive in a mod folder with both upper- and lowercase names. The Edgemodders build of RED Hot Tools fixes it, and with it REDnode swaps as before.

Other

  • REDnode's own native calls into the game remember the functions they find, so reading game values every frame costs less.
  • REDnode's scripts keep the root widgets of a few HUD and menu screens (REDnodeInk.reds), the first part of the coming ink API for the game's own UI. Nothing changes on screen.
  • During an archive swap, red4ext/logs/rednode-faults.log now also names whatever ends the game (TerminateProcess, ExitProcess or a fail-fast), with its status, its stack and the game engine's last error message, for crashes that leave no crash report.

Also attached: REDnode Sound Tools 0.1.0 (REDnode-Sound-Tools-0.1.0.zip). An optional app pack for sound modders: Sound Tracer, Sound Search and Hot swap. Hot swap needs RED Hot Tools 1.3 or later. Extract it into the game folder after REDnode; it needs REDnode 0.26.15 or later. Guide: https://edgemodders.github.io/REDnode/sound-tools.html (changelog: https://github.com/Edgemodders/REDnode/blob/main/packs/sound-tools/changelog.md)

Install: extract into the game folder, or add the zip to Vortex or EDGEdeck. Needs RED4ext and redscript. Packages that read the game's archives also need REDbridge: press Get REDbridge in the Mod Manager. Docs: https://edgemodders.github.io/REDnode/ (changelog: https://edgemodders.github.io/REDnode/changelog.html)

Full Changelog: v0.26.15...v0.32.1