modwright 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +35 -0
- package/README.md +212 -0
- package/assets/claude/agents/mw-explore.md +46 -0
- package/assets/claude/agents/mw-fixture.md +33 -0
- package/assets/claude/agents/mw-rule-author.md +51 -0
- package/assets/claude/agents/mw-scaffold-author.md +48 -0
- package/assets/claude/skills/mw-author.md +59 -0
- package/assets/claude/skills/mw-new-item.md +51 -0
- package/assets/claude/skills/mw-new-spell.md +50 -0
- package/assets/claude/skills/mw-scaffold.md +59 -0
- package/assets/claude/skills/mw-ship.md +57 -0
- package/assets/claude/skills/mw-validate.md +51 -0
- package/assets/claude/skills/mw-verify.md +59 -0
- package/assets/nivalisnights/extract_resources.py +177 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Config.json +5 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapClient.lua +55 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/BootstrapServer.lua +81 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Log.lua +96 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Probes.lua +1038 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/ProbesClient.lua +74 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Protocol.lua +985 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/ScriptExtender/Lua/ModWrightBridge/Watch.lua +175 -0
- package/bridges/bg3-se/Mods/ModWrightBridge/meta.lsx +45 -0
- package/bridges/bg3-se/README.md +99 -0
- package/bridges/bg3-se/bridge.json +68 -0
- package/bridges/cp2077-cet/ModWrightBridge/init.lua +375 -0
- package/bridges/cp2077-cet/ModWrightBridge/probes.lua +1104 -0
- package/bridges/cp2077-cet/ModWrightBridge/protocol.lua +1306 -0
- package/bridges/cp2077-cet/README.md +165 -0
- package/bridges/cp2077-cet/bridge.json +53 -0
- package/dist/core/bridge/arm.js +175 -0
- package/dist/core/bridge/cet-console.js +26 -0
- package/dist/core/bridge/cet-log.js +362 -0
- package/dist/core/bridge/index.js +11 -0
- package/dist/core/bridge/locate.js +35 -0
- package/dist/core/bridge/paths.js +34 -0
- package/dist/core/bridge/pending.js +89 -0
- package/dist/core/bridge/poll.js +155 -0
- package/dist/core/bridge/stage.js +100 -0
- package/dist/core/bridge/status.js +97 -0
- package/dist/core/bridge/types.js +145 -0
- package/dist/core/bridge/validate.js +107 -0
- package/dist/core/build/index.js +6 -0
- package/dist/core/build/manifest.js +47 -0
- package/dist/core/build/paths.js +32 -0
- package/dist/core/build/run.js +342 -0
- package/dist/core/build/stage.js +265 -0
- package/dist/core/build/steps/bg3.js +129 -0
- package/dist/core/build/steps/core.js +195 -0
- package/dist/core/build/steps/cyberpunk.js +95 -0
- package/dist/core/build/steps/listing.js +35 -0
- package/dist/core/build/types.js +13 -0
- package/dist/core/build/zip.js +148 -0
- package/dist/core/compat/check.js +113 -0
- package/dist/core/compat/pe.js +220 -0
- package/dist/core/compat/types.js +1 -0
- package/dist/core/compat/version.js +70 -0
- package/dist/core/deploy/guards.js +292 -0
- package/dist/core/deploy/index.js +5 -0
- package/dist/core/deploy/plan.js +696 -0
- package/dist/core/deploy/reload-apply.js +361 -0
- package/dist/core/deploy/reload.js +358 -0
- package/dist/core/deploy/sources.js +169 -0
- package/dist/core/deploy/types.js +1 -0
- package/dist/core/epic.js +54 -0
- package/dist/core/fsutil.js +191 -0
- package/dist/core/home.js +70 -0
- package/dist/core/knowledge/facts.js +229 -0
- package/dist/core/knowledge/index.js +4 -0
- package/dist/core/knowledge/search.js +112 -0
- package/dist/core/knowledge/store.js +123 -0
- package/dist/core/knowledge/types.js +1 -0
- package/dist/core/ledger/check.js +42 -0
- package/dist/core/ledger/hooks.js +80 -0
- package/dist/core/ledger/index.js +7 -0
- package/dist/core/ledger/query.js +17 -0
- package/dist/core/ledger/record.js +84 -0
- package/dist/core/ledger/status.js +53 -0
- package/dist/core/ledger/store.js +98 -0
- package/dist/core/ledger/types.js +108 -0
- package/dist/core/logs/index.js +4 -0
- package/dist/core/logs/registry.js +50 -0
- package/dist/core/logs/scan.js +195 -0
- package/dist/core/logs/triage.js +160 -0
- package/dist/core/logs/types.js +1 -0
- package/dist/core/lsx.js +10 -0
- package/dist/core/lz4.js +66 -0
- package/dist/core/mods.js +229 -0
- package/dist/core/process.js +49 -0
- package/dist/core/project/build-steps.js +83 -0
- package/dist/core/project/describe.js +74 -0
- package/dist/core/project/index.js +5 -0
- package/dist/core/project/load.js +146 -0
- package/dist/core/project/schema.js +264 -0
- package/dist/core/project/types.js +3 -0
- package/dist/core/prompts.js +72 -0
- package/dist/core/registry.js +35 -0
- package/dist/core/safety/backup.js +206 -0
- package/dist/core/safety/execute.js +188 -0
- package/dist/core/safety/index.js +5 -0
- package/dist/core/safety/plan.js +122 -0
- package/dist/core/safety/restore.js +172 -0
- package/dist/core/safety/types.js +1 -0
- package/dist/core/scaffold/bootstrap.js +7 -0
- package/dist/core/scaffold/catalog.js +28 -0
- package/dist/core/scaffold/claude-assets.js +271 -0
- package/dist/core/scaffold/collisions.js +64 -0
- package/dist/core/scaffold/emit.js +356 -0
- package/dist/core/scaffold/engine.js +680 -0
- package/dist/core/scaffold/ids.js +78 -0
- package/dist/core/scaffold/index.js +10 -0
- package/dist/core/scaffold/jsonpath.js +121 -0
- package/dist/core/scaffold/load.js +81 -0
- package/dist/core/scaffold/render.js +85 -0
- package/dist/core/scaffold/sequence.js +396 -0
- package/dist/core/scaffold/types.js +309 -0
- package/dist/core/steam.js +63 -0
- package/dist/core/surfaceutil.js +36 -0
- package/dist/core/testplan/check.js +67 -0
- package/dist/core/testplan/index.js +5 -0
- package/dist/core/testplan/load.js +100 -0
- package/dist/core/testplan/registry.js +317 -0
- package/dist/core/testplan/run.js +389 -0
- package/dist/core/testplan/types.js +82 -0
- package/dist/core/text/converters/bg3.js +50 -0
- package/dist/core/text/converters/cyberpunk.js +36 -0
- package/dist/core/text/converters/index.js +261 -0
- package/dist/core/text/diff/cr2w.js +180 -0
- package/dist/core/text/diff/index.js +16 -0
- package/dist/core/text/diff/loca.js +43 -0
- package/dist/core/text/diff/lsx.js +126 -0
- package/dist/core/text/handles.js +86 -0
- package/dist/core/text/index.js +6 -0
- package/dist/core/text/json.js +46 -0
- package/dist/core/text/templates/cache.js +71 -0
- package/dist/core/text/templates/index.js +3 -0
- package/dist/core/text/templates/library.js +245 -0
- package/dist/core/text/templates/types.js +51 -0
- package/dist/core/text/toolchain.js +16 -0
- package/dist/core/text/types.js +1 -0
- package/dist/core/text/validate.js +149 -0
- package/dist/core/text/xml.js +58 -0
- package/dist/core/toolchain/datafetch.js +151 -0
- package/dist/core/toolchain/env.js +63 -0
- package/dist/core/toolchain/features.js +170 -0
- package/dist/core/toolchain/index.js +8 -0
- package/dist/core/toolchain/install.js +191 -0
- package/dist/core/toolchain/locate.js +275 -0
- package/dist/core/toolchain/remember.js +84 -0
- package/dist/core/toolchain/run.js +318 -0
- package/dist/core/toolchain/specs.js +351 -0
- package/dist/core/toolchain/types.js +1 -0
- package/dist/core/types.js +1 -0
- package/dist/core/userconfig.js +66 -0
- package/dist/core/validate/context.js +139 -0
- package/dist/core/validate/index.js +5 -0
- package/dist/core/validate/registry.js +58 -0
- package/dist/core/validate/run.js +131 -0
- package/dist/core/validate/suppressions.js +91 -0
- package/dist/core/validate/types.js +2 -0
- package/dist/core/yamledit.js +51 -0
- package/dist/index.js +389 -0
- package/dist/server.js +1914 -0
- package/dist/surfaces/baldursgate3/compat.js +164 -0
- package/dist/surfaces/baldursgate3/identity.js +110 -0
- package/dist/surfaces/baldursgate3/index/build.js +331 -0
- package/dist/surfaces/baldursgate3/index/index.js +17 -0
- package/dist/surfaces/baldursgate3/index/info.js +40 -0
- package/dist/surfaces/baldursgate3/index/parsers/loca.js +41 -0
- package/dist/surfaces/baldursgate3/index/parsers/lsx.js +137 -0
- package/dist/surfaces/baldursgate3/index/parsers/stats.js +45 -0
- package/dist/surfaces/baldursgate3/index/parsers/treasuretable.js +57 -0
- package/dist/surfaces/baldursgate3/index/parsers/xmlutil.js +142 -0
- package/dist/surfaces/baldursgate3/index/queries.js +327 -0
- package/dist/surfaces/baldursgate3/index/schema.js +62 -0
- package/dist/surfaces/baldursgate3/index.js +3 -0
- package/dist/surfaces/baldursgate3/logs.js +278 -0
- package/dist/surfaces/baldursgate3/modsettings.js +115 -0
- package/dist/surfaces/baldursgate3/pak.js +153 -0
- package/dist/surfaces/baldursgate3/settings.js +49 -0
- package/dist/surfaces/baldursgate3/surface.js +232 -0
- package/dist/surfaces/baldursgate3/validators/bridge.js +7 -0
- package/dist/surfaces/baldursgate3/validators/files.js +476 -0
- package/dist/surfaces/baldursgate3/validators/items.js +1001 -0
- package/dist/surfaces/baldursgate3/validators/progression.js +734 -0
- package/dist/surfaces/baldursgate3/validators/stats.js +1076 -0
- package/dist/surfaces/baldursgate3/validators/story.js +790 -0
- package/dist/surfaces/baldursgate3/validators/templates.js +7 -0
- package/dist/surfaces/cyberpunk2077/compat.js +223 -0
- package/dist/surfaces/cyberpunk2077/index/build.js +231 -0
- package/dist/surfaces/cyberpunk2077/index/index.js +17 -0
- package/dist/surfaces/cyberpunk2077/index/info.js +51 -0
- package/dist/surfaces/cyberpunk2077/index/model.js +52 -0
- package/dist/surfaces/cyberpunk2077/index/parsers/tweak.js +483 -0
- package/dist/surfaces/cyberpunk2077/index/parsers/tweakxl-yaml.js +183 -0
- package/dist/surfaces/cyberpunk2077/index/queries.js +504 -0
- package/dist/surfaces/cyberpunk2077/index/resource.js +135 -0
- package/dist/surfaces/cyberpunk2077/index/schema.js +90 -0
- package/dist/surfaces/cyberpunk2077/index.js +3 -0
- package/dist/surfaces/cyberpunk2077/logs.js +742 -0
- package/dist/surfaces/cyberpunk2077/paths.js +12 -0
- package/dist/surfaces/cyberpunk2077/surface.js +218 -0
- package/dist/surfaces/cyberpunk2077/validators/bridge.js +7 -0
- package/dist/surfaces/cyberpunk2077/validators/cr2w.js +349 -0
- package/dist/surfaces/cyberpunk2077/validators/garments.js +1181 -0
- package/dist/surfaces/cyberpunk2077/validators/mesh.js +338 -0
- package/dist/surfaces/cyberpunk2077/validators/modsettings.js +120 -0
- package/dist/surfaces/cyberpunk2077/validators/packaging.js +463 -0
- package/dist/surfaces/cyberpunk2077/validators/red4ext.js +318 -0
- package/dist/surfaces/cyberpunk2077/validators/redscript.js +193 -0
- package/dist/surfaces/cyberpunk2077/validators/templates.js +7 -0
- package/dist/surfaces/cyberpunk2077/validators/tweaks.js +768 -0
- package/dist/surfaces/cyberpunk2077/validators/vehicles.js +531 -0
- package/dist/surfaces/cyberpunk2077/validators/xl.js +308 -0
- package/dist/surfaces/eldenring/binders.js +111 -0
- package/dist/surfaces/eldenring/compat.js +166 -0
- package/dist/surfaces/eldenring/dcx.js +49 -0
- package/dist/surfaces/eldenring/index.js +13 -0
- package/dist/surfaces/eldenring/loaders.js +132 -0
- package/dist/surfaces/eldenring/logs.js +67 -0
- package/dist/surfaces/eldenring/paramdef.js +256 -0
- package/dist/surfaces/eldenring/params.js +129 -0
- package/dist/surfaces/eldenring/surface.js +121 -0
- package/dist/surfaces/eldenring/tools.js +52 -0
- package/dist/surfaces/eldenring/validators/binders.js +193 -0
- package/dist/surfaces/eldenring/validators/packages.js +159 -0
- package/dist/surfaces/eldenring/validators/params.js +334 -0
- package/dist/surfaces/eldenring/validators/profiles.js +287 -0
- package/dist/surfaces/index.js +34 -0
- package/dist/surfaces/nivalisnights/compat.js +229 -0
- package/dist/surfaces/nivalisnights/index/build.js +310 -0
- package/dist/surfaces/nivalisnights/index/index.js +5 -0
- package/dist/surfaces/nivalisnights/index/queries.js +231 -0
- package/dist/surfaces/nivalisnights/index.js +4 -0
- package/dist/surfaces/nivalisnights/logs.js +473 -0
- package/dist/surfaces/nivalisnights/surface.js +195 -0
- package/dist/surfaces/skyrimse/archives.js +229 -0
- package/dist/surfaces/skyrimse/compat.js +163 -0
- package/dist/surfaces/skyrimse/index.js +12 -0
- package/dist/surfaces/skyrimse/loadorder.js +174 -0
- package/dist/surfaces/skyrimse/logs.js +241 -0
- package/dist/surfaces/skyrimse/plugins.js +149 -0
- package/dist/surfaces/skyrimse/records.js +94 -0
- package/dist/surfaces/skyrimse/surface.js +240 -0
- package/dist/surfaces/skyrimse/validators/archive-records.js +165 -0
- package/dist/surfaces/skyrimse/validators/archives.js +110 -0
- package/dist/surfaces/skyrimse/validators/plugins.js +374 -0
- package/dist/surfaces/skyrimse/validators/records.js +117 -0
- package/dist/surfaces/stardewvalley/compat.js +190 -0
- package/dist/surfaces/stardewvalley/config.js +42 -0
- package/dist/surfaces/stardewvalley/contentpatcher.js +203 -0
- package/dist/surfaces/stardewvalley/index/index.js +229 -0
- package/dist/surfaces/stardewvalley/index/wiki.js +190 -0
- package/dist/surfaces/stardewvalley/index.js +12 -0
- package/dist/surfaces/stardewvalley/logs.js +307 -0
- package/dist/surfaces/stardewvalley/mods.js +182 -0
- package/dist/surfaces/stardewvalley/surface.js +244 -0
- package/dist/surfaces/stardewvalley/validators/content.js +321 -0
- package/dist/surfaces/stardewvalley/validators/fields.js +147 -0
- package/dist/surfaces/stardewvalley/validators/loadorder.js +69 -0
- package/dist/surfaces/stardewvalley/validators/manifest.js +221 -0
- package/dist/surfaces/subnautica2/compat.js +138 -0
- package/dist/surfaces/subnautica2/index.js +5 -0
- package/dist/surfaces/subnautica2/logs.js +129 -0
- package/dist/surfaces/subnautica2/paks.js +173 -0
- package/dist/surfaces/subnautica2/surface.js +151 -0
- package/dist/surfaces/subnautica2/validators/packaging.js +298 -0
- package/dist/surfaces/valheim/compat.js +171 -0
- package/dist/surfaces/valheim/index/index.js +301 -0
- package/dist/surfaces/valheim/index/tables.js +103 -0
- package/dist/surfaces/valheim/index.js +11 -0
- package/dist/surfaces/valheim/logs.js +197 -0
- package/dist/surfaces/valheim/packaging.js +131 -0
- package/dist/surfaces/valheim/plugins.js +270 -0
- package/dist/surfaces/valheim/references.js +121 -0
- package/dist/surfaces/valheim/surface.js +223 -0
- package/dist/surfaces/valheim/validators/packaging.js +218 -0
- package/dist/surfaces/valheim/validators/plugins.js +287 -0
- package/dist/surfaces/valheim/validators/references.js +169 -0
- package/knowledge/baldursgate3/animations.gr2.yaml +166 -0
- package/knowledge/baldursgate3/audio.voice.yaml +182 -0
- package/knowledge/baldursgate3/audio.wwise.yaml +104 -0
- package/knowledge/baldursgate3/charactercreation.heads-hair.yaml +193 -0
- package/knowledge/baldursgate3/communitylibrary.shared-content.yaml +129 -0
- package/knowledge/baldursgate3/compatibilityframework.api.yaml +176 -0
- package/knowledge/baldursgate3/crash.causes.yaml +90 -0
- package/knowledge/baldursgate3/dialogue.dialogbank.yaml +120 -0
- package/knowledge/baldursgate3/dialogue.files.yaml +236 -0
- package/knowledge/baldursgate3/dialogue.osiris-goals.yaml +386 -0
- package/knowledge/baldursgate3/dialogue.yaml +122 -0
- package/knowledge/baldursgate3/feats.classes.yaml +164 -0
- package/knowledge/baldursgate3/items.cloth-physics.yaml +167 -0
- package/knowledge/baldursgate3/items.roottemplates.yaml +320 -0
- package/knowledge/baldursgate3/items.visualbank.yaml +628 -0
- package/knowledge/baldursgate3/journal.quests.yaml +214 -0
- package/knowledge/baldursgate3/loadorder.modsettings.yaml +128 -0
- package/knowledge/baldursgate3/localization.handles.yaml +92 -0
- package/knowledge/baldursgate3/misc.encoding-and-practice.yaml +111 -0
- package/knowledge/baldursgate3/origins.companions.yaml +144 -0
- package/knowledge/baldursgate3/osiris.signatures.yaml +211 -0
- package/knowledge/baldursgate3/packaging.meta.yaml +155 -0
- package/knowledge/baldursgate3/packaging.paks.yaml +79 -0
- package/knowledge/baldursgate3/process.launch.yaml +34 -0
- package/knowledge/baldursgate3/progressions.yaml +92 -0
- package/knowledge/baldursgate3/publishing.modio-nexus.yaml +170 -0
- package/knowledge/baldursgate3/publishing.toolkit-modio.yaml +135 -0
- package/knowledge/baldursgate3/races.progression.yaml +228 -0
- package/knowledge/baldursgate3/scriptextender.console.yaml +257 -0
- package/knowledge/baldursgate3/scriptextender.yaml +252 -0
- package/knowledge/baldursgate3/stats.boosts.yaml +293 -0
- package/knowledge/baldursgate3/stats.equipment-kits.yaml +69 -0
- package/knowledge/baldursgate3/stats.interrupts.yaml +45 -0
- package/knowledge/baldursgate3/stats.itemcombos.yaml +65 -0
- package/knowledge/baldursgate3/stats.spells.yaml +293 -0
- package/knowledge/baldursgate3/stats.weapons.yaml +210 -0
- package/knowledge/baldursgate3/toolchain.divine.yaml +179 -0
- package/knowledge/baldursgate3/toolchain.lslib-formats.yaml +242 -0
- package/knowledge/baldursgate3/toolkit.levels.yaml +177 -0
- package/knowledge/baldursgate3/ui.icons-atlas.yaml +78 -0
- package/knowledge/baldursgate3/ui.icons.yaml +412 -0
- package/knowledge/baldursgate3/ui.mcm.yaml +161 -0
- package/knowledge/baldursgate3/vfx.materials.yaml +174 -0
- package/knowledge/baldursgate3/visuals.characterfix.yaml +73 -0
- package/knowledge/cyberpunk2077/animations.anims.yaml +118 -0
- package/knowledge/cyberpunk2077/anims.archivexl.yaml +163 -0
- package/knowledge/cyberpunk2077/anims.authoring.yaml +579 -0
- package/knowledge/cyberpunk2077/anims.encoder.yaml +156 -0
- package/knowledge/cyberpunk2077/anims.graph.yaml +629 -0
- package/knowledge/cyberpunk2077/anims.method.yaml +360 -0
- package/knowledge/cyberpunk2077/anims.pipeline.yaml +352 -0
- package/knowledge/cyberpunk2077/anims.roundtrip.yaml +222 -0
- package/knowledge/cyberpunk2077/anims.sets.yaml +176 -0
- package/knowledge/cyberpunk2077/archivexl.bodytypes.yaml +149 -0
- package/knowledge/cyberpunk2077/archivexl.dynamic-appearances.yaml +218 -0
- package/knowledge/cyberpunk2077/archivexl.manifest.yaml +214 -0
- package/knowledge/cyberpunk2077/audio.events.yaml +168 -0
- package/knowledge/cyberpunk2077/audio.sounds.yaml +164 -0
- package/knowledge/cyberpunk2077/audio.voicesets.yaml +146 -0
- package/knowledge/cyberpunk2077/cet.sandbox.yaml +219 -0
- package/knowledge/cyberpunk2077/clothing.garments.yaml +283 -0
- package/knowledge/cyberpunk2077/clothing.refits.yaml +215 -0
- package/knowledge/cyberpunk2077/codeware.overview.yaml +111 -0
- package/knowledge/cyberpunk2077/codeware.systems.yaml +192 -0
- package/knowledge/cyberpunk2077/drones.combat.yaml +416 -0
- package/knowledge/cyberpunk2077/drones.control.yaml +552 -0
- package/knowledge/cyberpunk2077/entities.appearance.yaml +166 -0
- package/knowledge/cyberpunk2077/equipmentex.slots.yaml +151 -0
- package/knowledge/cyberpunk2077/fx.effects.yaml +246 -0
- package/knowledge/cyberpunk2077/fx.lights.yaml +171 -0
- package/knowledge/cyberpunk2077/hair.modding.yaml +145 -0
- package/knowledge/cyberpunk2077/items.wiring.yaml +246 -0
- package/knowledge/cyberpunk2077/loadorder.archives.yaml +71 -0
- package/knowledge/cyberpunk2077/mesh.blender.yaml +209 -0
- package/knowledge/cyberpunk2077/nativedb.dump.yaml +98 -0
- package/knowledge/cyberpunk2077/npc.appearance.yaml +275 -0
- package/knowledge/cyberpunk2077/npc.behaviour.yaml +128 -0
- package/knowledge/cyberpunk2077/npc.locomotion.yaml +490 -0
- package/knowledge/cyberpunk2077/packaging.deploy.yaml +175 -0
- package/knowledge/cyberpunk2077/packaging.variants.yaml +176 -0
- package/knowledge/cyberpunk2077/player.control.yaml +918 -0
- package/knowledge/cyberpunk2077/process.assetbuild.yaml +154 -0
- package/knowledge/cyberpunk2077/process.lessons.yaml +276 -0
- package/knowledge/cyberpunk2077/quests.minor.yaml +46 -0
- package/knowledge/cyberpunk2077/quests.scenes.yaml +282 -0
- package/knowledge/cyberpunk2077/quickhacks.tiers.yaml +41 -0
- package/knowledge/cyberpunk2077/red4ext.api.yaml +645 -0
- package/knowledge/cyberpunk2077/red4ext.plugins.yaml +124 -0
- package/knowledge/cyberpunk2077/redhottools.hotreload.yaml +245 -0
- package/knowledge/cyberpunk2077/redscript.compile-log.yaml +76 -0
- package/knowledge/cyberpunk2077/redscript.modules.yaml +118 -0
- package/knowledge/cyberpunk2077/toolchain.wolvenkit.yaml +163 -0
- package/knowledge/cyberpunk2077/tweakdb.loot-recipes.yaml +184 -0
- package/knowledge/cyberpunk2077/tweakdb.melee.yaml +352 -0
- package/knowledge/cyberpunk2077/tweakdb.weapons.yaml +325 -0
- package/knowledge/cyberpunk2077/tweakxl.hotreload.yaml +151 -0
- package/knowledge/cyberpunk2077/tweakxl.yaml-syntax.yaml +208 -0
- package/knowledge/cyberpunk2077/ui.icons.yaml +259 -0
- package/knowledge/cyberpunk2077/ui.inkatlas.yaml +81 -0
- package/knowledge/cyberpunk2077/ui.modsettings.yaml +204 -0
- package/knowledge/cyberpunk2077/vehicles.control.yaml +475 -0
- package/knowledge/cyberpunk2077/vehicles.dashboard-ui.yaml +203 -0
- package/knowledge/cyberpunk2077/vehicles.entities.yaml +195 -0
- package/knowledge/cyberpunk2077/vehicles.wiring.yaml +137 -0
- package/knowledge/cyberpunk2077/wolvenkit.cli.yaml +167 -0
- package/knowledge/cyberpunk2077/workspot.system.yaml +55 -0
- package/knowledge/cyberpunk2077/world.interactions.yaml +41 -0
- package/knowledge/cyberpunk2077/world.loot-container.yaml +167 -0
- package/knowledge/cyberpunk2077/world.sectors.yaml +233 -0
- package/knowledge/eldenring/formats.binders.yaml +237 -0
- package/knowledge/eldenring/launcher.me3.yaml +230 -0
- package/knowledge/eldenring/launcher.modengine2.yaml +119 -0
- package/knowledge/eldenring/params.paramdef.yaml +149 -0
- package/knowledge/eldenring/params.regulation.yaml +142 -0
- package/knowledge/eldenring/saves.online.yaml +118 -0
- package/knowledge/eldenring/toolchain.cli.yaml +256 -0
- package/knowledge/nivalisnights/modding.runtime.yaml +157 -0
- package/knowledge/skyrimse/archives.bsa.yaml +212 -0
- package/knowledge/skyrimse/install.detection.yaml +41 -0
- package/knowledge/skyrimse/loadorder.files.yaml +242 -0
- package/knowledge/skyrimse/plugins.esl.yaml +189 -0
- package/knowledge/skyrimse/plugins.format.yaml +224 -0
- package/knowledge/skyrimse/skse.runtime.yaml +283 -0
- package/knowledge/skyrimse/toolchain.xedit-spriggit.yaml +336 -0
- package/knowledge/stardewvalley/contentpatcher.format.yaml +338 -0
- package/knowledge/stardewvalley/distribution.channels.yaml +236 -0
- package/knowledge/stardewvalley/game.versions.yaml +202 -0
- package/knowledge/stardewvalley/install.layout.yaml +277 -0
- package/knowledge/stardewvalley/smapi.loader.yaml +284 -0
- package/knowledge/stardewvalley/smapi.logs.yaml +329 -0
- package/knowledge/stardewvalley/smapi.manifest.yaml +293 -0
- package/knowledge/stardewvalley/toolchain.build.yaml +261 -0
- package/knowledge/stardewvalley/wiki.dataformat.yaml +130 -0
- package/knowledge/subnautica2/game.build.yaml +331 -0
- package/knowledge/subnautica2/modding.state.yaml +210 -0
- package/knowledge/subnautica2/ue5.containers.yaml +72 -0
- package/knowledge/subnautica2/ue5.paks.yaml +203 -0
- package/knowledge/subnautica2/ue5.tooling.yaml +175 -0
- package/knowledge/subnautica2/ue5.ue4ss.yaml +203 -0
- package/knowledge/valheim/bepinex.loader.yaml +247 -0
- package/knowledge/valheim/bepinex.plugins.yaml +251 -0
- package/knowledge/valheim/game.versions.yaml +321 -0
- package/knowledge/valheim/install.layout.yaml +216 -0
- package/knowledge/valheim/jotunn.library.yaml +334 -0
- package/knowledge/valheim/thunderstore.packaging.yaml +217 -0
- package/knowledge/valheim/toolchain.build.yaml +111 -0
- package/package.json +29 -0
- package/scaffolds/baldursgate3/new-class-injection.yaml +148 -0
- package/scaffolds/baldursgate3/new-item.yaml +264 -0
- package/scaffolds/baldursgate3/new-mod.yaml +174 -0
- package/scaffolds/baldursgate3/new-passive.yaml +100 -0
- package/scaffolds/baldursgate3/new-project.yaml +118 -0
- package/scaffolds/baldursgate3/new-quest-stub.yaml +159 -0
- package/scaffolds/baldursgate3/new-spell.yaml +102 -0
- package/scaffolds/baldursgate3/new-status.yaml +119 -0
- package/scaffolds/baldursgate3/sequences/subclass-kit.yaml +50 -0
- package/scaffolds/cyberpunk2077/edit-tweak.yaml +70 -0
- package/scaffolds/cyberpunk2077/mesh-export-preset.yaml +170 -0
- package/scaffolds/cyberpunk2077/new-entity-patch.yaml +255 -0
- package/scaffolds/cyberpunk2077/new-garment-refit.yaml +279 -0
- package/scaffolds/cyberpunk2077/new-item-chain.yaml +548 -0
- package/scaffolds/cyberpunk2077/new-localization.yaml +130 -0
- package/scaffolds/cyberpunk2077/new-mod-settings.yaml +133 -0
- package/scaffolds/cyberpunk2077/new-player-replacer.yaml +1003 -0
- package/scaffolds/cyberpunk2077/new-project.yaml +157 -0
- package/scaffolds/cyberpunk2077/new-sector-node.yaml +156 -0
- package/scaffolds/cyberpunk2077/new-tweak.yaml +121 -0
- package/scaffolds/cyberpunk2077/new-vehicle-livery.yaml +148 -0
- package/scaffolds/cyberpunk2077/new-workspot-entity.yaml +177 -0
- package/scaffolds/cyberpunk2077/sequences/iconic-weapon.yaml +72 -0
- package/scaffolds/cyberpunk2077/sequences/quickhack-takeover.yaml +213 -0
- package/scaffolds/stardewvalley/new-cp-patch.yaml +106 -0
- package/scaffolds/stardewvalley/new-csharp-mod.yaml +195 -0
- package/scaffolds/stardewvalley/new-project.yaml +184 -0
- package/scaffolds/stardewvalley/sequences/content-pack.yaml +31 -0
- package/scripts/mw-tool.mjs +184 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: tweakxl.hotreload
|
|
3
|
+
title: TweakXL's Reload() hot-reload entry point and what it does under the hood
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.tweakxl.hotreload.reload-scripted-entry-point
|
|
6
|
+
claim: TweakXL exposes a scripted static class whose RTTI name is `App::Project::Name` = "TweakXL"
|
|
7
|
+
and whose native implementation is `App::Facade`; `App::Facade::Reload()` is the
|
|
8
|
+
RTTI-registered method backing a scripted `TweakXL.Reload()` call, and that call resolves from
|
|
9
|
+
the CET console and runs a full load, usage-report and issue-check cycle.
|
|
10
|
+
status: verified
|
|
11
|
+
verified_on: "2.31"
|
|
12
|
+
source: psiberx/cp2077-tweak-xl@f8da6be src/App/Facade.hpp:7-23 (class declaration, `Reload()` at
|
|
13
|
+
:18) and :26-39 (`RTTI_DEFINE_CLASS(App::Facade, App::Project::Name, ...)` with
|
|
14
|
+
`RTTI_METHOD(Reload)` at :36); config/Project.hpp.in:12 (`constexpr auto Name = "${NAME}"`);
|
|
15
|
+
xmake.lua:50 (`set_configvar("NAME", "TweakXL")`)
|
|
16
|
+
tags:
|
|
17
|
+
- tweakxl
|
|
18
|
+
- hot-reload
|
|
19
|
+
- reload
|
|
20
|
+
- redscript
|
|
21
|
+
- rtti
|
|
22
|
+
detail: "Checked against the source (2026-09-08): an earlier wording also said \"there is no
|
|
23
|
+
separate console command — it is invoked as a scripted static function call, e.g. from the CET
|
|
24
|
+
console\". Neither the header, the xmake file nor the Facade implementation says anything
|
|
25
|
+
about a console, CET or otherwise; that was the drafter's own illustration and is removed
|
|
26
|
+
here. What the source does show is only that `Reload` is registered as an RTTI method on a
|
|
27
|
+
scripted class, i.e. callable from any scripting surface that can reach RTTI statics. The CET
|
|
28
|
+
console is one such surface, confirmed live 2026-09-09 with TweakXL 1.11.4: `TweakXL.Reload()`
|
|
29
|
+
typed in the console resolved without error."
|
|
30
|
+
- id: cp2077.tweakxl.hotreload.reload-does-three-things
|
|
31
|
+
claim: "`App::Facade::Reload()` calls, in order, `TweakService::LoadTweaks()`,
|
|
32
|
+
`TweakService::ReportUsage()` and `TweakService::CheckForIssues()` — hot reload re-runs the
|
|
33
|
+
full tweak load pipeline and a changelog-based issue check every time it is called, not just
|
|
34
|
+
the file(s) that changed."
|
|
35
|
+
status: inferred
|
|
36
|
+
source: psiberx/cp2077-tweak-xl@f8da6be src/App/Facade.cpp:47-55 (`App::Facade::Reload` body)
|
|
37
|
+
tags:
|
|
38
|
+
- tweakxl
|
|
39
|
+
- hot-reload
|
|
40
|
+
- reload
|
|
41
|
+
- pipeline
|
|
42
|
+
detail: "`CheckForIssues()` in turn calls `m_changelog->CheckForIssues(m_manager)`
|
|
43
|
+
(src/App/Tweaks/TweakService.cpp:103-109), i.e. the same changelog mechanism that flags
|
|
44
|
+
renamed/removed vanilla records runs again on every Reload(), not only at initial game load."
|
|
45
|
+
- id: cp2077.tweakxl.hotreload.importdir-importtweak-removed
|
|
46
|
+
claim: The older `TweakXL.ImportDir()` and `TweakXL.Import()` (internally `ImportTweak`) scripted
|
|
47
|
+
methods are still RTTI-registered but their bodies do nothing except log a debug message
|
|
48
|
+
telling the caller to use `TweakXL.Reload()` instead; they no longer import anything.
|
|
49
|
+
status: verified
|
|
50
|
+
source: psiberx/cp2077-tweak-xl@f8da6be src/App/Facade.cpp:22-30 (both bodies log "[TweakXL] The
|
|
51
|
+
method TweakXL.ImportDir() is no longer supported. Use TweakXL.Reload() instead." and return
|
|
52
|
+
without doing anything else); src/App/Facade.hpp:30-32 (`RTTI_METHOD(ImportDir)`,
|
|
53
|
+
`RTTI_METHOD(ImportTweak, "Import")` still registered)
|
|
54
|
+
tags:
|
|
55
|
+
- tweakxl
|
|
56
|
+
- hot-reload
|
|
57
|
+
- deprecated
|
|
58
|
+
- importdir
|
|
59
|
+
detail: A mod script or bridge that still calls `TweakXL.ImportDir()` or `TweakXL.Import()`
|
|
60
|
+
expecting a load to happen will no-op; the debug log line is the only effect the source shows.
|
|
61
|
+
Note both bodies log the *ImportDir* wording, so an `Import()` call logs a message naming
|
|
62
|
+
`ImportDir()` — do not use the message text to tell the two apart.
|
|
63
|
+
- id: cp2077.tweakxl.hotreload.require-version-gate
|
|
64
|
+
claim: "TweakXL exposes `TweakXL.Require(version: String) -> Bool`, which parses `version` as a
|
|
65
|
+
semver string and returns whether the installed TweakXL's own `Project::Version` is greater
|
|
66
|
+
than or equal to it; an unparsable version string returns false rather than throwing."
|
|
67
|
+
status: verified
|
|
68
|
+
verified_on: "2.31"
|
|
69
|
+
source: psiberx/cp2077-tweak-xl@f8da6be src/App/Facade.cpp:57-61 (`App::Facade::Require`, using
|
|
70
|
+
`semver::from_string_noexcept(aVersion.c_str())` and `requirement.has_value() &&
|
|
71
|
+
Project::Version >= requirement.value()`)
|
|
72
|
+
tags:
|
|
73
|
+
- tweakxl
|
|
74
|
+
- version-check
|
|
75
|
+
- require
|
|
76
|
+
- compatibility
|
|
77
|
+
detail: This is the mechanism a mod's own redscript can use to gate functionality on a minimum
|
|
78
|
+
installed TweakXL version at runtime, distinct from the RED4ext-level version floor recorded
|
|
79
|
+
in cp2077.tweakxl.yaml-syntax.version-floors.
|
|
80
|
+
- id: cp2077.tweakxl.hotreload.getversion-method
|
|
81
|
+
claim: TweakXL exposes `TweakXL.Version() -> String` (native method `GetVersion`, registered under
|
|
82
|
+
the RTTI alias `Version`), returning the installed TweakXL build's own semver as a string.
|
|
83
|
+
status: verified
|
|
84
|
+
verified_on: "2.31"
|
|
85
|
+
source: psiberx/cp2077-tweak-xl@f8da6be src/App/Facade.cpp:63-66 (`App::Facade::GetVersion` returns
|
|
86
|
+
`Project::Version.to_string().c_str()`); src/App/Facade.hpp:38 (`RTTI_METHOD(GetVersion,
|
|
87
|
+
"Version")`)
|
|
88
|
+
tags:
|
|
89
|
+
- tweakxl
|
|
90
|
+
- version-check
|
|
91
|
+
- redscript-api
|
|
92
|
+
- id: cp2077.tweakxl.hotreload.reload-does-not-unload-removed-records
|
|
93
|
+
claim: "`TweakXL.Reload()` adds and updates records from the tweak files present on disk but does
|
|
94
|
+
not remove a record whose source file has been deleted since the last load; the record stays
|
|
95
|
+
in TweakDB for the rest of the game session and only a process restart clears it."
|
|
96
|
+
status: verified
|
|
97
|
+
verified_on: "2.31"
|
|
98
|
+
source: ModWright field verification
|
|
99
|
+
tags:
|
|
100
|
+
- tweakxl
|
|
101
|
+
- hot-reload
|
|
102
|
+
- reload
|
|
103
|
+
- remove
|
|
104
|
+
- asymmetric
|
|
105
|
+
related:
|
|
106
|
+
- cp2077.tweakxl.hotreload.reload-does-three-things
|
|
107
|
+
detail: "Consistent with `reload-does-three-things`: LoadTweaks() re-imports what is on disk into
|
|
108
|
+
the live TweakDB, and nothing in the pipeline diffs against the previous load to retract
|
|
109
|
+
records. Hot reload is therefore asymmetric for the deploy/reload recommendation: adding or
|
|
110
|
+
editing a tweak file is hot, removing one needs a restart. A later probe in the same session
|
|
111
|
+
can misread a removed record as still shipped."
|
|
112
|
+
- id: cp2077.tweakxl.hotreload.reload-applies-changed-flat-on-existing-record
|
|
113
|
+
claim: "TweakXL.Reload() re-applies a CHANGED flat on an already-existing record, not just newly
|
|
114
|
+
added records: editing a flat in a deployed tweak file and calling TweakXL.Reload() updates
|
|
115
|
+
the live TweakDB flat. This is the positive half of the asymmetry in
|
|
116
|
+
reload-does-not-unload-removed-records (edits/additions are hot; only removals need a
|
|
117
|
+
restart)."
|
|
118
|
+
status: verified
|
|
119
|
+
verified_on: "2.31"
|
|
120
|
+
source: ModWright field verification
|
|
121
|
+
tags:
|
|
122
|
+
- tweakxl
|
|
123
|
+
- hot-reload
|
|
124
|
+
- reload
|
|
125
|
+
- flat
|
|
126
|
+
- verified
|
|
127
|
+
related:
|
|
128
|
+
- cp2077.tweakxl.hotreload.reload-does-not-unload-removed-records
|
|
129
|
+
- cp2077.redhottools.hotreload.hot-tweaks-consumed-without-reload-1.3.0
|
|
130
|
+
detail: Because TweakXL.Reload() works but RHT 1.3.0.33690's `.hot-tweaks` sentinel does not drive
|
|
131
|
+
it (hot-tweaks-consumed-without-reload-1.3.0), the reliable tweak hot-reload is
|
|
132
|
+
TweakXL.Reload() via cp2077.lua.eval — which is what the reload table's tweaks `via` should
|
|
133
|
+
lead with, and what deploy --reload apply should call for a tweaks target.
|
|
134
|
+
- id: cp2077.tweakxl.hotreload.parse-error-still-ends-in-import-completed
|
|
135
|
+
claim: 'TweakXL 1.11.4 writes each session to red4ext/plugins/TweakXL/TweakXL-<date>-<time>.log and
|
|
136
|
+
leaves TweakXL.log empty. A reload that cannot parse a tweak file logs `Reading "<path under
|
|
137
|
+
r6/tweaks>"...` followed by an `[error] yaml-cpp: ...` line and still ends with "Import
|
|
138
|
+
completed.", so that line alone does not show that a given file loaded.'
|
|
139
|
+
status: verified
|
|
140
|
+
verified_on: "2.31"
|
|
141
|
+
source: ModWright field verification
|
|
142
|
+
tags:
|
|
143
|
+
- tweakxl
|
|
144
|
+
- log
|
|
145
|
+
- hot-reload
|
|
146
|
+
- read-back
|
|
147
|
+
- silent-failure
|
|
148
|
+
related:
|
|
149
|
+
- cp2077.tweakxl.yaml-syntax.log-file-location
|
|
150
|
+
detail: deploy --reload apply now reads the newest TweakXL*.log and turns a read-back into `error`
|
|
151
|
+
when an [error] line follows the Reading line of a deployed file (commit 1f95118).
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: tweakxl.yaml-syntax
|
|
3
|
+
title: TweakXL YAML tweak file placement, structure and record/inline semantics
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.tweakxl.yaml-syntax.version-floors
|
|
6
|
+
claim: TweakXL's README lists its compatibility as Cyberpunk 2077 2.3 and redscript 0.5.27+, and its
|
|
7
|
+
installation step 1 requires RED4ext 1.28.0+ before extracting `TweakXL-x.x.x.zip` into the
|
|
8
|
+
Cyberpunk 2077 directory.
|
|
9
|
+
status: community
|
|
10
|
+
source: psiberx/cp2077-tweak-xl/README.md, sections "Getting Started > Compatibility" (game,
|
|
11
|
+
redscript) and "Getting Started > Installation" (RED4ext)
|
|
12
|
+
tags:
|
|
13
|
+
- tweakxl
|
|
14
|
+
- version-floor
|
|
15
|
+
- redscript
|
|
16
|
+
- red4ext
|
|
17
|
+
- id: cp2077.tweakxl.yaml-syntax.file-placement
|
|
18
|
+
claim: TweakXL loads tweak definitions from `.yaml` or `.tweak` files placed in `Cyberpunk
|
|
19
|
+
2077/r6/tweaks`, or from `.xl` files placed in `Cyberpunk 2077/archive/pc/mod`; regardless of
|
|
20
|
+
which of the three extensions is used, the file's contents must be written in YAML or JSON
|
|
21
|
+
syntax.
|
|
22
|
+
status: community
|
|
23
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
24
|
+
for-mod-creators-theory/core-mods-explained/tweakxl/README.md, section "How do I use it?"
|
|
25
|
+
tags:
|
|
26
|
+
- tweakxl
|
|
27
|
+
- file-placement
|
|
28
|
+
- r6-tweaks
|
|
29
|
+
- archive-xl-manifest
|
|
30
|
+
detail: "The page's exact wording for the second half: \"No matter the file extension, the file
|
|
31
|
+
`contents` must be in `.yaml` or `.json` syntax.\""
|
|
32
|
+
- id: cp2077.tweakxl.yaml-syntax.log-file-location
|
|
33
|
+
claim: TweakXL writes its own log to `<game_directory>/red4ext/plugins/TweakXL/TweakXL.log`; a YAML
|
|
34
|
+
syntax or load error for a tweak file is reported there.
|
|
35
|
+
status: community
|
|
36
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
37
|
+
for-mod-creators-theory/core-mods-explained/tweakxl/tweakxl-changing-game-records/how-to-yaml-tweak-modding-basics.md,
|
|
38
|
+
section "The log file"
|
|
39
|
+
tags:
|
|
40
|
+
- tweakxl
|
|
41
|
+
- log-file
|
|
42
|
+
- troubleshooting
|
|
43
|
+
- id: cp2077.tweakxl.yaml-syntax.indentation-spaces-only
|
|
44
|
+
claim: TweakXL yaml tweak files must be indented with spaces, never tabs; a tab character in the
|
|
45
|
+
indentation breaks the file's structure and, in the page's words, "your mod won't work".
|
|
46
|
+
status: community
|
|
47
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
48
|
+
for-mod-creators-theory/core-mods-explained/tweakxl/tweakxl-changing-game-records/how-to-yaml-tweak-modding-basics.md,
|
|
49
|
+
section "Indentation"
|
|
50
|
+
tags:
|
|
51
|
+
- tweakxl
|
|
52
|
+
- yaml
|
|
53
|
+
- indentation
|
|
54
|
+
- validator
|
|
55
|
+
detail: 'A validator or linter should flag literal tab characters found in the leading whitespace of
|
|
56
|
+
a `.yaml`/`.tweak` file before it is packed. Checked against the source (2026-09-08): the page
|
|
57
|
+
does not say the failure is silent — it says the opposite elsewhere ("If there are any issues
|
|
58
|
+
with your yaml file, the TweakXL log will tell you about it", see
|
|
59
|
+
cp2077.tweakxl.yaml-syntax.log-file-location), so do not assume a tab failure is invisible.'
|
|
60
|
+
- id: cp2077.tweakxl.yaml-syntax.duplicate-keys-break-file
|
|
61
|
+
claim: A duplicate key at the same nesting level in a TweakXL yaml file breaks the whole file's
|
|
62
|
+
parse; the community-recommended check is to run the file through yamllint.com before packing.
|
|
63
|
+
status: community
|
|
64
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
65
|
+
for-mod-creators-theory/core-mods-explained/tweakxl/tweakxl-changing-game-records/how-to-yaml-tweak-modding-basics.md,
|
|
66
|
+
section "Key Uniqueness"
|
|
67
|
+
tags:
|
|
68
|
+
- tweakxl
|
|
69
|
+
- yaml
|
|
70
|
+
- duplicate-key
|
|
71
|
+
- validator
|
|
72
|
+
- id: cp2077.tweakxl.yaml-syntax.record-names-must-be-unique
|
|
73
|
+
claim: Every TweakXL record (a named container grouping properties, which may themselves be other
|
|
74
|
+
records or flats) must have a globally unique name; two records sharing a name overwrite each
|
|
75
|
+
other.
|
|
76
|
+
status: community
|
|
77
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
78
|
+
for-mod-creators-theory/core-mods-explained/tweakxl/tweakxl-changing-game-records/how-to-yaml-tweak-modding-basics.md,
|
|
79
|
+
section "Records"
|
|
80
|
+
tags:
|
|
81
|
+
- tweakxl
|
|
82
|
+
- record
|
|
83
|
+
- naming
|
|
84
|
+
- silent-failure
|
|
85
|
+
detail: 'Checked against the source (2026-09-08): the page states only that colliding records
|
|
86
|
+
"overwrite each other" — whether the overwrite is reported anywhere (e.g. in TweakXL.log) is
|
|
87
|
+
not stated by this source and should not be assumed either way.'
|
|
88
|
+
- id: cp2077.tweakxl.yaml-syntax.inline-record-autonaming
|
|
89
|
+
claim: An inline record (one written nested directly inside another record's property instead of
|
|
90
|
+
being given its own top-level name) is assigned an automatic name of the form
|
|
91
|
+
`<ParentRecordName>_inlineN`, where N depends on the inline's position inside the parent; that
|
|
92
|
+
position, and therefore the generated name, can change on any game update with no warning.
|
|
93
|
+
status: community
|
|
94
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
95
|
+
for-mod-creators-theory/core-mods-explained/tweakxl/tweakxl-changing-game-records/how-to-yaml-tweak-modding-basics.md,
|
|
96
|
+
section "Inlines"
|
|
97
|
+
tags:
|
|
98
|
+
- tweakxl
|
|
99
|
+
- inline
|
|
100
|
+
- record
|
|
101
|
+
- naming
|
|
102
|
+
- versioning
|
|
103
|
+
- id: cp2077.tweakxl.yaml-syntax.vanilla-inline-records-numbered-per-root
|
|
104
|
+
claim: The game numbers the inline records of a vanilla (.tweak) top-level record with one counter
|
|
105
|
+
per top-level record, in source order, a parent before its children, and names every one of
|
|
106
|
+
them flat `<TopLevelRecord>_inline<N>`, never `<parent inline>_inline<N>`. The Basilisk's
|
|
107
|
+
drive model is the sixth inline record under Vehicle.v_militech_basilisk counting the nested
|
|
108
|
+
ones, and the game calls it Vehicle.v_militech_basilisk_inline5. A weapon blueprint's root
|
|
109
|
+
inline and its three inline children are Items.Base_Tech_Handgun_NoMuzzle_Blueprint_inline0
|
|
110
|
+
and _inline1/2/3.
|
|
111
|
+
status: verified
|
|
112
|
+
verified_on: "2.31"
|
|
113
|
+
source: ModWright field verification
|
|
114
|
+
tags:
|
|
115
|
+
- tweakdb
|
|
116
|
+
- inline
|
|
117
|
+
- record
|
|
118
|
+
- naming
|
|
119
|
+
- index
|
|
120
|
+
related:
|
|
121
|
+
- cp2077.tweakxl.yaml-syntax.inline-record-autonaming
|
|
122
|
+
- cp2077.tweakxl.yaml-syntax.inline-record-as-base-is-bad-practice
|
|
123
|
+
detail: "ModWright's vanilla index numbers them the same way since 2026-09-25 (TWEAKDB_PARSE_VERSION
|
|
124
|
+
2). Before that it named nested inlines `<parent>_inline<N>` with a counter per parent, so its
|
|
125
|
+
Vehicle.v_militech_basilisk_inline5 was the procedural camera parameters, and
|
|
126
|
+
cp2077.tweaks.base-exists accepted a $base against the wrong record. How TweakXL names nested
|
|
127
|
+
inlines in a mod's own YAML is not read. The rule is not universal: the Archer Quartz player
|
|
128
|
+
variant's package is _inline0 in game where source order gives _inline1 (see
|
|
129
|
+
cp2077.tweakdb.index-inline-names-can-differ-from-the-game)."
|
|
130
|
+
- id: cp2077.tweakdb.index-inline-names-can-differ-from-the-game
|
|
131
|
+
claim: The redmod tweak sources do not always give the game's inline record names. The Archer
|
|
132
|
+
Quartz's player-variant data package is Vehicle.v_standard2_archer_quartz_inline0 in game,
|
|
133
|
+
where the source writes the statModifiers inline first (source order gives _inline1), and in
|
|
134
|
+
game _inline1 is a ConstantStatModifier. The Quartz Nomad, written the same way (a
|
|
135
|
+
statModifiers += inline, then the vehDataPackage inline), has its package at _nomad_inline1 in
|
|
136
|
+
game, as source order gives. So an inline name taken from the index (built from those sources)
|
|
137
|
+
is unverified until read live.
|
|
138
|
+
status: verified
|
|
139
|
+
verified_on: "2.31"
|
|
140
|
+
source: ModWright field verification
|
|
141
|
+
tags:
|
|
142
|
+
- tweakdb
|
|
143
|
+
- inline
|
|
144
|
+
- record
|
|
145
|
+
- naming
|
|
146
|
+
- index
|
|
147
|
+
- gotcha
|
|
148
|
+
related:
|
|
149
|
+
- cp2077.tweakxl.yaml-syntax.vanilla-inline-records-numbered-per-root
|
|
150
|
+
- cp2077.tweakxl.yaml-syntax.inline-record-as-base-is-bad-practice
|
|
151
|
+
detail: Why the Quartz differs is not known (a compiled TweakDB newer than the sources is one
|
|
152
|
+
possibility). validate's cp2077.tweaks.inline-reference warns on any $base or value naming a
|
|
153
|
+
vanilla _inline<N> record.
|
|
154
|
+
- id: cp2077.tweakxl.yaml-syntax.files-read-in-name-order
|
|
155
|
+
claim: "TweakXL reads a tweaks folder's files in name order and clones a record's $base when its
|
|
156
|
+
file is read, so a $base defined in a file that sorts later does not exist yet: TweakXL logs
|
|
157
|
+
\"Cannot clone <base>, the record doesn't exist\" and drops the record (and anything based on
|
|
158
|
+
it)."
|
|
159
|
+
status: verified
|
|
160
|
+
verified_on: 2.31 (TweakXL 1.x)
|
|
161
|
+
source: ModWright field verification
|
|
162
|
+
tags:
|
|
163
|
+
- tweakxl
|
|
164
|
+
- load-order
|
|
165
|
+
- base
|
|
166
|
+
- gotcha
|
|
167
|
+
detail: validate's cp2077.tweaks.base-defined-before-use blocks it. One mod fixed it by renaming the
|
|
168
|
+
dependent file to <mod>_tiers.yaml ('.' sorts before '_').
|
|
169
|
+
- id: cp2077.tweakxl.yaml-syntax.inline-record-as-base-is-bad-practice
|
|
170
|
+
claim: Using an auto-generated `_inlineN` record name as the `$base` of a mod's own record is
|
|
171
|
+
documented as bad practice, because a future game update can silently change which vanilla
|
|
172
|
+
record that inline name now points to (see
|
|
173
|
+
cp2077.tweakxl.yaml-syntax.inline-record-autonaming), breaking the mod without any load error.
|
|
174
|
+
status: community
|
|
175
|
+
source: CDPR-Modding-Documentation/Cyberpunk-Modding-Docs
|
|
176
|
+
for-mod-creators-theory/core-mods-explained/tweakxl/tweakxl-changing-game-records/how-to-yaml-tweak-modding-basics.md,
|
|
177
|
+
section "Inlines"
|
|
178
|
+
tags:
|
|
179
|
+
- tweakxl
|
|
180
|
+
- inline
|
|
181
|
+
- base
|
|
182
|
+
- gotcha
|
|
183
|
+
- versioning
|
|
184
|
+
detail: "Direct quote of the warning: \"NEVER use `inlineX` records as base in your items\".
|
|
185
|
+
RELATED: sharpens cp2077.tweakxl.yaml-syntax.inline-record-autonaming with the concrete
|
|
186
|
+
failure mode a scaffold/validator should check for: a mod's own record whose `$base` matches
|
|
187
|
+
`.*_inline\\d+$`."
|
|
188
|
+
related:
|
|
189
|
+
- id: cp2077.tweakxl.yaml-syntax.inline-record-autonaming
|
|
190
|
+
detail: "Sharpens that fact: the auto-generated name it describes must never be used as a `$base`,
|
|
191
|
+
because the update-to-update instability is exactly what breaks the dependent record."
|
|
192
|
+
- id: cp2077.tweakxl.record-description-property-is-localizeddescription
|
|
193
|
+
claim: An item record's description flat is `localizedDescription`, not `description`; TweakXL logs
|
|
194
|
+
`Unknown property description.` for the latter and still creates the record, so the item
|
|
195
|
+
exists but shows no description text.
|
|
196
|
+
status: verified
|
|
197
|
+
verified_on: "2.31"
|
|
198
|
+
source: ModWright field verification
|
|
199
|
+
tags:
|
|
200
|
+
- tweakxl
|
|
201
|
+
- yaml
|
|
202
|
+
- record
|
|
203
|
+
- property
|
|
204
|
+
- description
|
|
205
|
+
- localizeddescription
|
|
206
|
+
detail: "`displayName` is the display-name flat; `gameplayDescription` is the separate gameplay line
|
|
207
|
+
(a weapon mod can override an inherited LocKey there). TweakXL drops an unknown property
|
|
208
|
+
rather than rejecting the record, so the mistake is invisible unless TweakXL.log is read."
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
game: cyberpunk2077
|
|
2
|
+
topic: ui.icons
|
|
3
|
+
title: Icon rendering, gamma correction, and atlas declaration
|
|
4
|
+
facts:
|
|
5
|
+
- id: cp2077.ui.icon-import-gamma-lift
|
|
6
|
+
claim: png-to-xbm import applies automatic gamma lift; icon renders appear brighter in-game than
|
|
7
|
+
authored. Author dark with power-curve pixels (e.g., ^3.0) and keep speculars via curve
|
|
8
|
+
multiplication rather than multiply blend.
|
|
9
|
+
status: verified
|
|
10
|
+
verified_on: "2.31"
|
|
11
|
+
source: ModWright field verification
|
|
12
|
+
tags:
|
|
13
|
+
- icon
|
|
14
|
+
- gamma
|
|
15
|
+
- import
|
|
16
|
+
- xbm
|
|
17
|
+
- brightness
|
|
18
|
+
detail: "The lift is observed in game, not in the png: the same render looks correct on disk and
|
|
19
|
+
washed out in the inventory. The workaround is to power-curve the pixels before import (^3.0
|
|
20
|
+
is the example given) rather than multiplying the image down, which would kill the speculars."
|
|
21
|
+
- id: cp2077.ui.hud-icon-stroke-width
|
|
22
|
+
claim: HUD icons are freestyle line art at native resolution with thin strokes (~1.15px);
|
|
23
|
+
supersampling+downscale causes thin strokes to merge into blobs. Author at target resolution
|
|
24
|
+
with native pixel dimensions.
|
|
25
|
+
status: verified
|
|
26
|
+
verified_on: "2.31"
|
|
27
|
+
source: ModWright field verification
|
|
28
|
+
tags:
|
|
29
|
+
- hud-icon
|
|
30
|
+
- line-art
|
|
31
|
+
- stroke
|
|
32
|
+
- resolution
|
|
33
|
+
- supersampling
|
|
34
|
+
detail: Vanilla style is white lines on transparency with the muzzle pointing right; the widget
|
|
35
|
+
applies the tint (per a comment in the mod's tweak yaml). Rendering large and downscaling
|
|
36
|
+
merged the lines, so the art is rendered at the final size.
|
|
37
|
+
- id: cp2077.ui.icon-atlas-texture-resolution
|
|
38
|
+
claim: Icon atlases have a declared textureResolution enum (HD_1280_720, FullHD_1920_1080,
|
|
39
|
+
UltraHD_3840_2160); displayed icon size is calculated as uv fraction × textureResolution in
|
|
40
|
+
pixels.
|
|
41
|
+
status: verified
|
|
42
|
+
verified_on: "2.31"
|
|
43
|
+
source: ModWright field verification
|
|
44
|
+
tags:
|
|
45
|
+
- atlas
|
|
46
|
+
- texture-resolution
|
|
47
|
+
- enum
|
|
48
|
+
- icon-size
|
|
49
|
+
- uv
|
|
50
|
+
detail: Enum spellings corrected — they are HD_1280_720, FullHD_1920_1080 and UltraHD_3840_2160, not
|
|
51
|
+
lowercase-hyphenated. One weapon mod's icons.inkatlas declares HD_1280_720 and its part spans
|
|
52
|
+
0.2656..0.7344 x 0.3555..0.6445, i.e. 600x208 effective pixels.
|
|
53
|
+
- id: cp2077.ui.icon-atlas-part-declaration
|
|
54
|
+
claim: An icon atlas declaration (atlasResourcePath + atlasPartName) references an .inkatlas file
|
|
55
|
+
and a named part within it; the part definition includes uv bounds and controls the displayed
|
|
56
|
+
icon crop and size.
|
|
57
|
+
status: inferred
|
|
58
|
+
source: ModWright research
|
|
59
|
+
tags:
|
|
60
|
+
- atlas
|
|
61
|
+
- atlas-part-name
|
|
62
|
+
- atlas-resource-path
|
|
63
|
+
- uv
|
|
64
|
+
- part
|
|
65
|
+
detail: UIIcon.<ModWeapon>Icon sets $type UIIcon, atlasResourcePath mod\<modname>\icons.inkatlas and
|
|
66
|
+
atlasPartName <mod>_icon. Field and record names corrected from the lowercase forms
|
|
67
|
+
("uiicon.", "atlasresourcepath") used earlier in this file. That the part's uv bounds control
|
|
68
|
+
the crop follows from the size formula in cp2077.ui.icon-atlas-texture-resolution rather than
|
|
69
|
+
from a direct statement.
|
|
70
|
+
- id: cp2077.ui.hud-icon-record
|
|
71
|
+
claim: HUD icons for weapons are registered via a separate UIIcon record with the same structure as
|
|
72
|
+
inventory icons; weapons can have both inventory and HUD icons declared separately.
|
|
73
|
+
status: verified
|
|
74
|
+
verified_on: "2.31"
|
|
75
|
+
source: ModWright field verification
|
|
76
|
+
tags:
|
|
77
|
+
- hud-icon
|
|
78
|
+
- weapon
|
|
79
|
+
- uiicon
|
|
80
|
+
- record
|
|
81
|
+
detail: "UIIcon.<ModWeapon>HudIcon (atlasResourcePath mod\\<modname>\\hud_icons.inkatlas,
|
|
82
|
+
atlasPartName <mod>_hud) is a second record; Items.Preset_<ModWeapon> references it as
|
|
83
|
+
`hudIcon: UIIcon.<ModWeapon>HudIcon` while the inventory icon goes in `iconPath:
|
|
84
|
+
<ModWeapon>Icon`."
|
|
85
|
+
- id: cp2077.ui.icon-path-record-name
|
|
86
|
+
claim: A weapon's iconPath field takes a tweakdb UIIcon record name (e.g., <ModWeapon>Icon), not a
|
|
87
|
+
path string; the tweakdb record contains the atlas reference.
|
|
88
|
+
status: verified
|
|
89
|
+
verified_on: "2.31"
|
|
90
|
+
source: ModWright field verification
|
|
91
|
+
tags:
|
|
92
|
+
- icon-path
|
|
93
|
+
- record-name
|
|
94
|
+
- tweakdb
|
|
95
|
+
- uiicon
|
|
96
|
+
detail: iconPath carries the bare record name with no "UIIcon." prefix, while hudIcon carries the
|
|
97
|
+
fully qualified UIIcon.<ModWeapon>HudIcon — the two fields are written differently in the same
|
|
98
|
+
working record.
|
|
99
|
+
- id: cp2077.ui.inkatlas-file-format
|
|
100
|
+
claim: Icon atlases are .inkatlas files (binary cr2w format) containing texture atlas definitions
|
|
101
|
+
with part uv mappings; they are generated from asset build tools or created via wolvenkit.
|
|
102
|
+
status: inferred
|
|
103
|
+
source: ModWright research
|
|
104
|
+
tags:
|
|
105
|
+
- inkatlas
|
|
106
|
+
- atlas
|
|
107
|
+
- file-format
|
|
108
|
+
- binary
|
|
109
|
+
detail: A build script authors the atlas json, which is then deserialized to the binary .inkatlas
|
|
110
|
+
like every other CR2W asset in the mod. The schema itself is not documented in the sources.
|
|
111
|
+
- id: cp2077.ui.xbm-file-format
|
|
112
|
+
claim: Icon images are stored as .xbm files (binary texture format); png images must be imported via
|
|
113
|
+
wolvenkit cli to convert to .xbm, applying gamma lift in the process.
|
|
114
|
+
status: verified
|
|
115
|
+
verified_on: "2.31"
|
|
116
|
+
source: ModWright field verification
|
|
117
|
+
tags:
|
|
118
|
+
- xbm
|
|
119
|
+
- texture
|
|
120
|
+
- import
|
|
121
|
+
- png
|
|
122
|
+
- gamma
|
|
123
|
+
detail: Shipped files are mod\<modname>\icons\<mod>_icon.xbm and <mod>_hud.xbm. The gamma lift is a
|
|
124
|
+
property of the png->xbm import step, which is why the render is authored dark.
|
|
125
|
+
- id: cp2077.ui.inventory-icon-size-recommendation
|
|
126
|
+
claim: Inventory icons should be sized to display clearly at ~600×208 effective pixels (the typical
|
|
127
|
+
in-game icon display size); larger assets are downscaled and smaller ones appear pixelated.
|
|
128
|
+
status: inferred
|
|
129
|
+
source: ModWright research
|
|
130
|
+
tags:
|
|
131
|
+
- inventory-icon
|
|
132
|
+
- size
|
|
133
|
+
- display
|
|
134
|
+
- pixels
|
|
135
|
+
detail: "600x208 is what one weapon mod's atlas part works out to under the displayed-size formula
|
|
136
|
+
(uv fraction x textureResolution), not a game-wide standard: change the declared
|
|
137
|
+
textureResolution or the part's uv bounds and the effective size changes. The
|
|
138
|
+
downscaling/pixelation consequences are not recorded in any source."
|
|
139
|
+
- id: cp2077.ui.icon-atlas-rendering-pipeline
|
|
140
|
+
claim: "Icon creation pipeline: render source image → apply gamma correction (power curve) → export
|
|
141
|
+
png → wolvenkit cli import to xbm → build the atlas with a script → register part in UIIcon
|
|
142
|
+
tweakdb record → reference in weapon."
|
|
143
|
+
status: inferred
|
|
144
|
+
source: ModWright research
|
|
145
|
+
tags:
|
|
146
|
+
- icon
|
|
147
|
+
- pipeline
|
|
148
|
+
- rendering
|
|
149
|
+
- atlas
|
|
150
|
+
- tweakdb
|
|
151
|
+
detail: A render script (moody top-lit pass + gamma curve) makes the inventory icon and a Freestyle
|
|
152
|
+
line-art pass makes the HUD icon. The end of the chain is UIIcon.<ModWeapon>Icon /
|
|
153
|
+
UIIcon.<ModWeapon>HudIcon referenced from Items.Preset_<ModWeapon>. No single source states
|
|
154
|
+
this pipeline end to end, hence inferred.
|
|
155
|
+
- id: cp2077.ui.icons.quickhack-program-icon-part-size
|
|
156
|
+
claim: "Every vanilla quickhack program icon is an atlas part displayed at 188 x 136 px: in
|
|
157
|
+
base\\gameplay\\gui\\common\\icons\\items\\item_icons21.inkatlas (textureResolution
|
|
158
|
+
UltraHD_3840_2160) each quickhack_* part spans UV 0.0489 x 0.0627. A custom program icon
|
|
159
|
+
should span the same box (its texels portrait, as vanilla's: see the detail); a part covering
|
|
160
|
+
a whole texture at a large declared resolution displays enormous."
|
|
161
|
+
status: verified
|
|
162
|
+
verified_on: "2.31"
|
|
163
|
+
source: base\gameplay\gui\common\icons\items\item_icons21.inkatlas
|
|
164
|
+
(archive\pc\content\basegame_4_gamedata.archive); UIIcon.quickhack_optics_malfunction and
|
|
165
|
+
UIIcon.quickhack_cw_malfunction name item_icons21 / item_icons19
|
|
166
|
+
tags:
|
|
167
|
+
- icon
|
|
168
|
+
- quickhack
|
|
169
|
+
- program
|
|
170
|
+
- inkatlas
|
|
171
|
+
- size
|
|
172
|
+
related:
|
|
173
|
+
- cp2077.ui.icon-atlas-texture-resolution
|
|
174
|
+
- cp2077.ui.icons.a-part-keeps-its-texel-proportions
|
|
175
|
+
detail: "The 188 x 136 is UV x the declared resolution, the box the part is fitted into. In texels
|
|
176
|
+
the parts are portrait: item_icons21.xbm is 2024 x 2040, so each quickhack_* part is 99 x 128
|
|
177
|
+
texels (w/h 0.773); see cp2077.ui.icons.a-part-keeps-its-texel-proportions. A quickhack mod's
|
|
178
|
+
icon since 2026-09-28: a 1024x1024 texture declared HD_1280_720 with a 150x194-texel part
|
|
179
|
+
(texel shape 0.773, UV x resolution 187.5 x 136.4), the art laid out unsquashed on the part's
|
|
180
|
+
own proportions."
|
|
181
|
+
- id: cp2077.ui.icons.wolvenkit-import-keep-onto-a-base-xbm
|
|
182
|
+
claim: "A PNG becomes an .xbm with the settings of an existing one by WolvenKit CLI `import <raw
|
|
183
|
+
dir> -o <out dir> -k`: the raw dir holds the png at the depot path, the out dir a copy of the
|
|
184
|
+
base xbm renamed to match. The result takes the png's pixels and size (a 1024x1024 base gave
|
|
185
|
+
256x256 and later 1024x1024 xbms) and keeps the base's setup. The CLI exits 3 and prints \"No
|
|
186
|
+
buffers found to rebuild\" while also printing \"Imported 1/1 file(s)\": the import did
|
|
187
|
+
happen."
|
|
188
|
+
status: verified
|
|
189
|
+
verified_on: 2.31 (WolvenKit CLI 8.20.0)
|
|
190
|
+
source: ModWright field verification
|
|
191
|
+
tags:
|
|
192
|
+
- wolvenkit
|
|
193
|
+
- import
|
|
194
|
+
- xbm
|
|
195
|
+
- texture
|
|
196
|
+
- icon
|
|
197
|
+
- id: cp2077.ui.icons.xbm-format-comes-from-the-setup
|
|
198
|
+
claim: "An .xbm's pixel format is not stored in its blob header (rendRenderTextureBlobHeader holds
|
|
199
|
+
only size, mip and slice layout); it follows from the setup's rawFormat, compression and
|
|
200
|
+
isGamma. So isGamma can be flipped in the serialized JSON and deserialized without touching
|
|
201
|
+
the pixels: the same 8-bit data is read as sRGB (1) or linear (0)."
|
|
202
|
+
status: verified
|
|
203
|
+
verified_on: 2.31 (WolvenKit CLI 8.20.0)
|
|
204
|
+
source: ModWright field verification
|
|
205
|
+
tags:
|
|
206
|
+
- xbm
|
|
207
|
+
- texture
|
|
208
|
+
- gamma
|
|
209
|
+
- format
|
|
210
|
+
- id: cp2077.ui.icons.lift-may-be-isgamma-0
|
|
211
|
+
claim: "The gamma lift of cp2077.ui.icon-import-gamma-lift is likely the xbm's isGamma 0: a weapon
|
|
212
|
+
mod's icon xbm, whose render looked lifted in game, has isGamma 0 (the png's sRGB pixels read
|
|
213
|
+
as linear). A quickhack mod's program icon, imported undarkened with isGamma 1, matches the
|
|
214
|
+
vanilla program chips' brightness in the cyberdeck. That isGamma 0 caused the weapon icon's
|
|
215
|
+
lift is inferred (not re-imported to compare)."
|
|
216
|
+
status: verified
|
|
217
|
+
verified_on: "2.31"
|
|
218
|
+
source: ModWright field verification
|
|
219
|
+
tags:
|
|
220
|
+
- icon
|
|
221
|
+
- gamma
|
|
222
|
+
- xbm
|
|
223
|
+
- isgamma
|
|
224
|
+
related:
|
|
225
|
+
- cp2077.ui.icon-import-gamma-lift
|
|
226
|
+
- cp2077.ui.icons.xbm-format-comes-from-the-setup
|
|
227
|
+
- id: cp2077.ui.icons.a-part-keeps-its-texel-proportions
|
|
228
|
+
claim: "The cyberdeck's program tile draws an atlas part in its texel proportions, scaled to fit,
|
|
229
|
+
and the vanilla program parts are portrait in texels: item_icons21.xbm is 2024 x 2040 (not its
|
|
230
|
+
declared UltraHD_3840_2160), so a quickhack_* part (UV 0.048913 x 0.062745) is 99 x 128
|
|
231
|
+
texels, w/h 0.773. A custom program icon should match that texel shape. A 188x136-texel part
|
|
232
|
+
(texture size equal to its declared HD_1280_720) showed squat, \"square\" beside the vanilla
|
|
233
|
+
chips; a 150x193-texel part showed stretched tall only because its art had been squeezed from
|
|
234
|
+
a 188:136 canvas into it."
|
|
235
|
+
status: verified
|
|
236
|
+
verified_on: "2.31"
|
|
237
|
+
source: ModWright field verification
|
|
238
|
+
tags:
|
|
239
|
+
- icon
|
|
240
|
+
- inkatlas
|
|
241
|
+
- aspect
|
|
242
|
+
- texel
|
|
243
|
+
- program
|
|
244
|
+
related:
|
|
245
|
+
- cp2077.ui.icon-atlas-texture-resolution
|
|
246
|
+
- cp2077.ui.icons.quickhack-program-icon-part-size
|
|
247
|
+
- id: cp2077.ui.icons.program-tooltip-bullets
|
|
248
|
+
claim: "A quickhack program's tooltip bullets are its localizedDescription (the first) and one per
|
|
249
|
+
OnAttach GameplayLogicPackage's UIData.localizedDescription: Items.BlindLvl1Program's second
|
|
250
|
+
bullet (\"Extends the base effect's duration\") is EquipmentGLP.BlindLvl1Program's UIData.
|
|
251
|
+
Vanilla lines are short and do not list the targets that are immune."
|
|
252
|
+
status: inferred
|
|
253
|
+
verified_on: "2.31"
|
|
254
|
+
source: ModWright research
|
|
255
|
+
tags:
|
|
256
|
+
- quickhack
|
|
257
|
+
- tooltip
|
|
258
|
+
- localization
|
|
259
|
+
- uidata
|