红窗

创作者: DigitalVixen
已更新:2026-09-28 19:22:44
130KB

关于此 MOD

用于模组的窗口,以游戏自身的界面风格绘制。面向作者:一个ImGui风格的API。 \(^_^)/
- 简介 -

RedWindows在游戏自身的界面中提供游戏内窗口:真正的墨水控件、Raj字体、你早已熟悉的那些蓝色。它们意在看起来像是《赛博朋克2077》原生的东西——“ImGui风格”描述的是模组作者编写的代码,而不是你在屏幕上看到的东西。窗口存在于HUD上,所以不会有像弹窗或教程那样的暂停——例如,一个读数可以在你开车时停留在屏幕上。按下叠加键,一个指针就会出现,同时只会在叠加激活时显示的那些窗口也会出现。你可以选择暂停游戏,这个选项在停靠菜单中随时可用;一个简单的复选框。每个窗口都会变得可交互;再次按下叠加键,它们就会淡出,除非被设为属于你的游戏HUD的一部分。

对模组作者而言,这套 API 读起来就像 ImGui——Text、Button、Checkbox、SliderF、Combo、ListBox、选项卡、折叠标头、SameLine——但底层是保留模式,因此窗口常驻屏幕不耗性能,也不会每帧重建。

终于有一种更简单的方法,能为我们这些Redscript苦手构建真正的UI元素了!这一切当然都受到了CET及其布局和功能的启发——刻意在设计上保持接近,以便那些已经了解并使用过CET的人更容易上手。但它并非意在取代CET,也与LUA或LUA模组毫无关系:它是独立运作的。

太长不看——这些模组窗口看起来就像是游戏自带的。(⌐⊙_⊙)


- 玩家须知 -

按下 F7 (可重新绑定)进入覆盖模式。

  • 码头 位于顶部:控制台、设置、热键、窗口、照片、日志以及一个暂停游戏复选框,只有安装了对应的模组后才会显示。
  • 照片 (已安装 RedIMGRetriever 0.3.0 及以上版本)浏览你的
    图片\赛博朋克 2077
    截图文件夹就在HUD右侧——最新在前,按窗口大小适配,放入该文件夹的动态GIF会自动播放。如果你不需要完整分辨率,两个复选框可将纹理限制在1080p或2160p。
  • 日志 (安装RedLogger后)可在HUD上实时读取模组栈写入的每一条日志——RedScript模组、RED4ext、框架、CET。选择来源、模组和会话,按等级筛选或搜索,点击某行即可复制。你模组的当前会话会实时更新,离开覆盖层后窗口仍会固定显示,让你边玩边看日志。
  • 视窗系统 拖动它们的标题栏——如果没有标题栏,则拖动窗口任意位置。拖拽角落可以调整大小,滚轮可以滚动过高的内容——或者抓住它的滚动条,列表和文本框现在也有滚动条了——点击标题栏可以将窗口折叠到只剩标题栏。
  • 窗口管理器 (Windows 按钮)会列出所有模组注册过的窗口,每个窗口都带有一个复选框,用于管理其可见性。
  • 这 暂停游戏 复选框仅是在覆盖层打开时暂停游戏,因此你可以自行决定游戏是否继续。
  • 已固定或未固定 取决于模组:读数可以在你离开叠加层后仍保留在HUD上,而设置窗口则会随之消失。
  • 一切都被铭记 - 位置、大小、折叠状态,以及你关闭了哪些窗口——跨会话保存。
  • 文字大小 缩放窗口文本及其下方的行。
  • 原版皮肤 使用游戏自带的UI美术来绘制窗口和控件,而非扁平化外观——包括弹窗边框、复选框、滑块手柄、标签页形状。切换开关时,已打开的窗口会重新构建。
  • 配色方案 可以使用游戏自带的色盲调色板绘制 RedWindows——绿色盲、红色盲或蓝色盲。默认跟随游戏界面颜色,包含 HUD Painter 的更改;在此处选择的方案仅覆盖 RedWindows 窗口。
  • 小游戏 随它而来——参见下面的红破章节。如果某个模组在你面前放置了一个,小游戏音效设置会决定它是否发出声音。
  • 你的语言决定类型中文、日文、韩文、泰文、阿拉伯文和西里尔文界面使用游戏为该文字系统自有的字体。
  • Esc 离开叠加层。Dock 的设置按钮用于配置 RedWindows 本身:热键、指针速度、未选中窗口的变暗程度、窗口不透明度、文字大小、原版皮肤、配色方案以及小游戏音效。
  • 出什么问题了吗? 设置中有一个调试日志开关,默认关闭。打开它,重现问题,输出的日志就是错误报告所需要的内容。
  • 也可通过以下方式设置选项 红脚本配置框架,在“模组制作者资源”版块下的“RedWindows”中。

当覆盖界面打开时,它会独占你的键盘和鼠标,因此在文本框中输入不会触发其他模组的快捷键,点击按钮也不会触发你的武器。


- 致模组作者 -

获取一个窗口,把东西放进去。从你已经更新内容的地方调用它——行只创建一次,之后原地更新,所以每帧调用也没问题:
导入红窗。*

let w: ref<RWWindow> = RedWindowsAPI.Window(gi, n"MyMod.Stats", "我的属性");
w.Text(n"hp", s"HP: \(hp)");
if w.Button(n"reset", "重置") { this.Reset(); }
设音量:浮点数 = w.滑块浮点数(n"vol", "音量", 0.0, 1.0, 0.8);
如果 w.Changed(n"vol") { this.SetVolume(vol); }

控件组:
文本 / 彩色文本 / 标题 / 分隔线 / 间隔 / 项目符号文本 / 自动换行文本
按钮 / 复选框 / 单选按钮 / 可选择项 / 下拉框 / 列表框
滑块F / 滑块I / 进度条 / 输入框 / 文本域 / 图标 / 按键绑定
标签栏 / 折叠标题 / 同行 / 缩进 / 开始禁用 / 提示
形状

两个值得了解的可选参数。滑块需要一个 步 最后,这样值才能落在干净的地方。CollapsingHeader需要 开始闭合,它决定了一个版块在用户首次看到时的外观。
w.SliderF(n"posX", "X", 0.0, 1.0, 0.5, 0.05); // 21个档位,并非像素渐变
w.SliderI(n"count", "数量", 0, 100, 20, 5); // 以五为单位计数
如果 w.CollapsingHeader(n"adv", "高级", true) { } // 初始折叠

形状有点像绘画。它预留一个区域,你用多边形来填充——填充、描边、随时重新着色——因此一个读数就能表达身体地图、仪表、示意图等,这是任何一排小部件都做不到的。不涉及纹理、图集或存档。
w.Shapes(n"body", 9); // 一个9行高的区域
w.SetShape(n"body", n"head", headPoints); // 点是该区域的0到1之间
w.SetShapeBorder(n"body", n"head", edge, 2.0);
w.SetShapeColor(n"body", n"head", hitRed); // 随时重新着色
w.SetShapeOpacity(n"body", n"head", 0.4);

点是归一化的,因此一次绘制的图形会随窗口大小调整而缩放。绘制顺序就是你首次声明每个形状的顺序,并且 形状数量(id) 告诉你是否已经创作了它。

每个形状目前都会渲染为一个旋转后的矩形,贴合你传入的多边形——四点形状会变成沿其主轴、以平均宽度延伸的条形,其他形状则会变成其直立包围盒。因此,锥形形状最终会变成直的。你仍然描述的是真实多边形,而需要成为真实多边形的形状会自动变成真实多边形,无需你改动任何一行代码。

一个形状可以画出 精灵 从你自己的inkatlas中而不是从条栏中,这正是模组将真实美术呈现在屏幕上的方式。多边形此时只说明它放在哪里——美术自带轮廓和形状:
w.SetShapeImage(n"body", n"head", r"base\\mymod\\ui\\figure.inkatlas", n"head");

染色依然生效,因此以白色制作的图像会接受你设定的任何颜色,并像其他内容一样淡出。有两点需要注意:图集是一个 引用资源 ( “...” 字面形式),并且你的纹理宽度和高度都必须能被4整除,否则游戏将无法加载它——它会渲染成一个纯白色方块,且不会在任何地方报错。

读取状态:
变更(id)
用于编辑——它在你读取时会清空,所以如果你需要答案两次,请先将其读入一个变量,
悬停(id)
和
激活(id)
用于指针状态。按钮和可选中控件在点击本身时返回 true。

窗口控制:
设置显示标题(假)
对于无边框读数,
设置框架不可见(false)
同时放下背景和边框,
仅设置叠加层(true)
在覆盖层关闭时将其隐藏,
最小宽度
为你最合理的窄屏宽度,
设置行可见性(id, on)
折起一行,
设置跨度(id, 行数)
要在创建后调整区域(形状、文本区域、列表框)的大小——将其映射到窗口高度,你的区域就会随之增大,
显示/隐藏
并通过以下方式为任何部分添加颜色
设置部件颜色
&
设置控件颜色

模组拥有的菜单(1.3.0+):命令菜单或对话框想要独占指针——没有停靠栏,没有其他工具窗口——也没有X,因为模组决定它何时消失。那就是
设置窗口不可关闭
加
RedWindowsAPI.OpenFor(gi, win)
打开该窗口的覆盖层(固定读数会保留在屏幕上),以及
红窗口接口.关闭(gi)
当订单被点击时。Esc键仍然可以关闭它,就像任何覆盖层一样。

指针模式(1.3.0+):将覆盖层光标用作世界指针。在
RedWindowsAPI.PointerBegin(gi)
对空白的左键点击和任意右键点击都会为你锁定(
获取指针(gi)
返回 0/1/2 并清除),以及
指针标准化(gi)
给出光标在归一化屏幕空间中的坐标(X 向右,Y 向上,-1..1),供 CameraSystem.UnprojectPoint 使用。Windows 在此期间保持正常工作;以结束
指针结束(gi)
(关闭覆盖层也会结束它)。无人机同伴的“指向”命令是参考用法(松开时)。

提示(2.1.0+):在提示模式下,输入框逐行接收内容——按回车提交该行、清空输入框并保留键盘。上/下方向键可滚动浏览历史记录。RedConsole的窗口是参考用法。
w.Input(n"cmd", "", ""); // 空标签不会绘制“label:”前缀
w.SetInputPrompt(n"cmd", true);
w.SetInputMax(n"cmd", 500); // 默认为 200(文本区域为 2000)
如果 w.InputSubmitted(n"cmd") { this.Run(w.SubmittedText(n"cmd")); }
设为整数型变量 nav = w.InputNav(n"cmd"); // 自上次读取后,每次向上为-1,每次向下为+1
w.FocusInput(n"cmd"); // 将键盘焦点交给它(仅限覆盖层打开时)
如果 w.InputFocused(n"cmd") { } // 当用户输入时跳过你的热键

日志列表(2.1.0+): 设置列表跟随尾部(id, true) 当用户滚动到底部时,使列表框保持在最新项目上, 设置列表颜色(id, colors) 逐一为物品着色,并 将列表索引(id, -1)设为-1 当列表是点击目标而非选择器时,会移除高亮。

你自己的码头按钮(2.1.0+):子类 返回码头 (键、名称、提示、开关)并在Session/Ready处注册。RedWindows从不导入你的模组,因此双方都无需知晓对方的版本。
注册停靠应用

控件ID是永久的——相同的ID始终代表同一行,这正是保留模型开销低的原因。宽度由你决定:设置
最小宽度
所以要按你最长的标签来设计,因为标签会截断而不是溢出。但文字大小不行——那由玩家自己决定,而行、标签和截断都会围绕玩家选择的字号重新适配,所以不要指望某个特定字号。

从会话/就绪状态刷新,而不是从你打开的处理器刷新。RedWindows 会记住哪些窗口曾经打开,但它无法记住窗口里有什么——只有你的模组才能声明自己的行。因此,上次会话中打开的窗口会恢复其位置、大小和打开意图,并保持隐藏,直到你的模组在该会话中声明第一行。在会话开始时启动更新循环,窗口就会恢复并填充内容;只在用户打开某个东西时才启动,你的窗口就可能空着摆在那里。

会话切换也会终止任何待处理的DelayCallback,因此请同时清除你用来保护循环的“已在计时”标志,否则它将永远不会重新启动。

软依赖,如果你不想安装它也能运行:
@if(ModuleExists("RedWindows"))
import RedWindows.*

还在用2.1.0的东西?加个门控 红窗接口21 相反,旧版 RedWindows 会直接忽略你的窗口代码,而不会破坏所有人的脚本:
@if(ModuleExists("RedWindows.Api21"))
导入RedWindows.*

对着窗户说些什么。 报告结果的窗口与静止不动的窗口需求不同,因此2.0.0为其添加了控件:
win.SetTitle("成功"); // 标题是状态,不仅仅是构造函数参数
win.SetSkinStyle(RWSkinStyle.Confirmation); // 对话框外观
win.SetPartColor(RWPart.Frame, green); // 以该颜色绘制窗口,包括边框和所有部分
win.SetBgOpacity(1.0); // 不受玩家透明度滑块影响
win.SetOutlineOpacity(0.2); // 整个描边作为一个整体调节,用于闪烁效果
RedWindowsAPI.BringToFront(gi, win); // 墨水按子级顺序绘制;没有其他操作会将其置顶
RedWindowsAPI.SetFocusLock(gi, win); // 并且任何东西都不能再回到前台
RedWindowsAPI.SetPauseMode(gi, RWPause.Never); // 每个窗口可以单独决定是否暂停
玩家的配色方案设置(色盲调色板)只替换框架的默认调色板。模组自行设定的每一种颜色——SetPartColor、SetWidgetColor、TextColored、形状填充——都完全保留作者设定的原样。因此,如果某个读数仅靠颜色来传达信息,请同时用形状或标签来表达;配色方案无法修正作者设定的颜色。

按以下方式给窗口着色 绘制 它——SetPartColor。焦点锁定和暂停覆盖都属于同一个覆盖会话,会话结束时会一并解除,因此两者都不会让界面卡住。标签为空的ProgressBar会占满整行。

先读一本:
红破/红破开发.reds
是一个完整的窗口——包含列表、滑块、复选框、运行按钮和结果行——而且它是可供复制的最短完整 API 使用示例。


- 红破:小游戏 -

红视窗公司发布了一款名为“红破”的黑客小游戏框架。它并非一个独立的
下载它不花你一分钱,只要没有模组使用它——代码会一直闲置,直到有东西
请求开始一局游戏。

供玩家体验:八款小游戏,意在为突破网格带来节奏上的变化,而非
它的替代方案。按键序列、记忆后输入、反向控制回合、衰减
提示、一个开锁时机扫描条、一个靠听觉或视觉来扫描的信号调谐器、同心圆环,用来
对齐,还有一张网格,你引导数据包穿过脉动的ICE。你得到哪一个,有多难
是,以及世界是否暂停,全都由调用模组自行决定。设置页面有一个
小游戏音效开关,如果你希望它们静音的话。

致模组作者:一通电话。
let req: ref<RBRequest> = RBRequest.Preset(RBFlavor.Any, 3);
req.title = "黑入门禁";
req.timeLimit = 12.0;
req.successMessage = "锁开了。这门归你了。"
RedBreachAPI.Start(gi, req, this.m_listener);
标题
是你唯一需要设定的——用你自己的话来定义它是什么。其余一切都已就绪。
可选:无timeLimit表示没有倒计时,无traceOn表示没有追踪条,以及一个请求
仅凭头衔而无实权,就是一扇空窗。你的听众只听到一个结果。
(成功、失败、超时、已追踪、已中止)以及经过时间、错误次数和
追踪余量,这样你就可以按程度分级处理后果,而不只是简单地判定通过或失败。
任何RB风味
让RedBreach来选择,这通常是你想要的——多样性才是关键。注册
你自己带有
注册游戏
如果你心里有一款自己的游戏。


- 备注 -

覆盖模式目前仅在游戏内可用。在主菜单中,窗口会绘制但无法接受点击,因此我们将其禁用,而不是让它处于半工作状态,但我们很快就会解决这个问题。

一个外观上的小问题仍然存在:按住手机或载具呼叫这类长按按键时,即使覆盖层已打开且动作并未触发,屏幕上的指示器仍会被填满。这个问题已在待办列表中。


- 更新 -

1.0.0 - 首次发布。
1.0.1 - Windows 现在会根据你的分辨率缩放。
1.1.0 - Windows 可以绘制了。Shapes() 为 mod 提供了一片区域,可用多边形或来自其自身图集的美术资源来填充。窗口现在可以完全去掉边框。调整大小手柄会延伸到屏幕边缘,而不再停在固定尺寸。安装 RedLogger 后,Logs 会加入停靠栏。覆盖层对 CPU 的占用也大大降低了。
1.2.0 - 新增SetSpan功能。Dock栏中新增PHOTOS应用。
1.3.0 新增文字大小设置。字体现在跟随界面语言,中文、日文、韩文、泰文、阿拉伯文和西里尔文均可正常显示。面向模组作者:滑块支持可选的步进值,可折叠标题支持可选的默认收起状态;菜单模式和指针模式。
2.0.0 - 原版皮肤:窗口和控件可使用游戏自带的 UI 美术绘制。RedBreach - 任何模组都可调用的八款黑客小游戏。新增设置:原版皮肤、小游戏音效、小游戏演示快捷键、调试日志记录,以及包含游戏三套色盲调色板的配色方案。
2.0.1 - 步进滑块可能会停在比恰好位于步进值上的数值低一步的位置(1.0 会显示为 0.95)。已修复。步进值小于 0.01 的滑块现在会显示三位小数。
2.1.0 演示窗口和小游戏演示快捷键设置已移除。文本框不再溢出窗口。滚动条可以拖动:窗口、列表和文本框——抓住滑块,或点击轨道跳转。文本框会自动换行长行。对于模组作者:你自己的停靠按钮、提示样式文本框、日志样式列表,以及RedWindows.Api21门控。


- 需求 -

此模组需要你安装以下内容:
RED4ext
红脚本
代码组件
红脚本配置框架
红色函数 0.9.0或更高版本


- 安装 -

1) 安装所有依赖项。
2) 将下载的文件解压到你的游戏主目录中。


- 卸载 -

删除目录 \Cyberpunk 2077\r6\scripts\RedWindows

窗口位置存储在 \Cyberpunk 2077\r6\storages\RedWindows 中——如果你想彻底清除它们,也把这个文件夹删掉。这些数据不会写入你的存档,因此任何时候删除都是安全的。


- 制作人员 -

感谢RED4ext、Redscript、Codeware和CET社区提供的工具和文档,这里的一切都建立在这些基础之上。

DigitalVixen模组套件的一部分。
现在可以在Discord上找到我了 这里!

赛博朋克 2077 的热门 MOD

探索适用于 赛博朋克 2077 的最佳MOD,带来新功能、升级画面,以及令人兴奋的方式来改变您的游戏体验。

使用 Xmod 解锁 赛博朋克 2077 的全部潜力 — 今天就探索这些顶级 MOD!