Skip to content

Commit d937859

Browse files
committed
Add legacy ActiveX and Borland recipes
1 parent bc0789f commit d937859

4 files changed

Lines changed: 145 additions & 0 deletions

File tree

data/error-recipes.json

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,5 +328,50 @@
328328
"检查游戏包是否自带视频组件安装器",
329329
"补齐后从推荐入口重试"
330330
]
331+
},
332+
{
333+
"id": "activex-flash-runtime",
334+
"title": "Flash/ActiveX 旧组件",
335+
"category": "runtime",
336+
"level": "warning",
337+
"patterns": [
338+
"flash\\d*\\.ocx",
339+
"swflash\\.ocx",
340+
"shockwave flash",
341+
"active.?x.*(cannot create object|component|class not registered)",
342+
"class not registered.*active.?x",
343+
"activex component can't create object"
344+
],
345+
"cause": "部分 WinXP 时代启动器、菜单或小游戏组件依赖 Flash ActiveX/OCX。新系统通常不会再默认提供这些旧组件。",
346+
"action": "如果主游戏入口可绕过启动器,先直接运行主程序;如果报错来自菜单或配置工具,再按游戏包说明处理对应旧 ActiveX 组件。",
347+
"checklist": [
348+
"确认报错是否点名 flash.ocx、swflash.ocx 或 Shockwave Flash",
349+
"优先尝试绕过菜单直接运行主游戏 exe",
350+
"如果必须使用该启动器,再处理游戏包自带或说明要求的旧组件"
351+
]
352+
},
353+
{
354+
"id": "borland-delphi-runtime",
355+
"title": "Borland/Delphi 旧运行库",
356+
"category": "runtime",
357+
"level": "warning",
358+
"patterns": [
359+
"borlndmm\\.dll",
360+
"cc3260mt\\.dll",
361+
"\\brtl\\d+\\.bpl",
362+
"\\bvcl\\d+\\.bpl",
363+
"\\bvclx\\d+\\.bpl",
364+
"\\bvcldb\\d+\\.bpl",
365+
"\\bvcljpg\\d+\\.bpl",
366+
"borland runtime",
367+
"delphi runtime"
368+
],
369+
"cause": "部分旧启动器、配置工具或自研引擎用 Borland C++ Builder / Delphi 编写,缺少随包 DLL 或 BPL 时会启动失败。",
370+
"action": "先确认这些 DLL/BPL 是否和启动器在同一目录或完整解压;如果报错来自配置工具,可尝试直接运行主游戏入口。",
371+
"checklist": [
372+
"确认报错是否点名 Borland/Delphi DLL 或 BPL",
373+
"重新完整解压并保持原目录结构",
374+
"尝试从 GalAid 推荐的主游戏入口启动"
375+
]
331376
}
332377
]

docs/ERROR_RECIPES.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,26 @@ Keep DirectPlay separate from the DirectX 9-era runtime route because the beginn
9292

9393
The recommended action should point to Windows Features: enable `Legacy Components / DirectPlay`, then retry from GalAid's recommended launcher.
9494

95+
## Flash And Borland Legacy Evidence
96+
97+
Keep Flash/ActiveX and Borland/Delphi rules narrow. They should explain old launcher/config-tool failures without implying every game needs these components.
98+
99+
Good Flash/ActiveX clues:
100+
101+
- `flash.ocx`
102+
- `flash9.ocx`
103+
- `swflash.ocx`
104+
- `Shockwave Flash`
105+
- `ActiveX component can't create object`
106+
107+
Good Borland/Delphi clues:
108+
109+
- `borlndmm.dll`
110+
- `cc3260mt.dll`
111+
- `rtl60.bpl`
112+
- `vcl60.bpl`
113+
- `vcljpg70.bpl`
114+
95115
## Contribution Checklist
96116

97117
- Keep the rule narrow enough to avoid noisy matches.

src/error-recipes.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,5 +330,50 @@ window.GALAID_ERROR_RECIPES = [
330330
"检查游戏包是否自带视频组件安装器",
331331
"补齐后从推荐入口重试"
332332
]
333+
},
334+
{
335+
"id": "activex-flash-runtime",
336+
"title": "Flash/ActiveX 旧组件",
337+
"category": "runtime",
338+
"level": "warning",
339+
"patterns": [
340+
"flash\\d*\\.ocx",
341+
"swflash\\.ocx",
342+
"shockwave flash",
343+
"active.?x.*(cannot create object|component|class not registered)",
344+
"class not registered.*active.?x",
345+
"activex component can't create object"
346+
],
347+
"cause": "部分 WinXP 时代启动器、菜单或小游戏组件依赖 Flash ActiveX/OCX。新系统通常不会再默认提供这些旧组件。",
348+
"action": "如果主游戏入口可绕过启动器,先直接运行主程序;如果报错来自菜单或配置工具,再按游戏包说明处理对应旧 ActiveX 组件。",
349+
"checklist": [
350+
"确认报错是否点名 flash.ocx、swflash.ocx 或 Shockwave Flash",
351+
"优先尝试绕过菜单直接运行主游戏 exe",
352+
"如果必须使用该启动器,再处理游戏包自带或说明要求的旧组件"
353+
]
354+
},
355+
{
356+
"id": "borland-delphi-runtime",
357+
"title": "Borland/Delphi 旧运行库",
358+
"category": "runtime",
359+
"level": "warning",
360+
"patterns": [
361+
"borlndmm\\.dll",
362+
"cc3260mt\\.dll",
363+
"\\brtl\\d+\\.bpl",
364+
"\\bvcl\\d+\\.bpl",
365+
"\\bvclx\\d+\\.bpl",
366+
"\\bvcldb\\d+\\.bpl",
367+
"\\bvcljpg\\d+\\.bpl",
368+
"borland runtime",
369+
"delphi runtime"
370+
],
371+
"cause": "部分旧启动器、配置工具或自研引擎用 Borland C++ Builder / Delphi 编写,缺少随包 DLL 或 BPL 时会启动失败。",
372+
"action": "先确认这些 DLL/BPL 是否和启动器在同一目录或完整解压;如果报错来自配置工具,可尝试直接运行主游戏入口。",
373+
"checklist": [
374+
"确认报错是否点名 Borland/Delphi DLL 或 BPL",
375+
"重新完整解压并保持原目录结构",
376+
"尝试从 GalAid 推荐的主游戏入口启动"
377+
]
333378
}
334379
];

tests/galaid-smoke.spec.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,41 @@ test("old video component recipe covers DirectShow, MCI, and codec clues", async
209209
}
210210
});
211211

212+
test("Flash ActiveX and Borland runtime recipes stay narrow", async ({ page }) => {
213+
await page.goto("/");
214+
215+
const result = await page.evaluate(() => {
216+
const flashExamples = [
217+
"flash.ocx failed to load.",
218+
"Flash9.ocx is missing.",
219+
"Shockwave Flash object could not be created.",
220+
"ActiveX component can't create object.",
221+
];
222+
const borlandExamples = [
223+
"borlndmm.dll was not found.",
224+
"cc3260mt.dll failed to load.",
225+
"rtl60.bpl is missing.",
226+
"vcljpg70.bpl could not be found.",
227+
];
228+
229+
return {
230+
flash: flashExamples.map((text) => buildErrorDiagnostics(text).matches.map((match) => match.id)),
231+
borland: borlandExamples.map((text) => buildErrorDiagnostics(text).matches.map((match) => match.id)),
232+
genericFlash: buildErrorDiagnostics("The intro movie flashes and then closes.").matches.map((match) => match.id),
233+
genericDelphi: buildErrorDiagnostics("This post mentions Delphi as trivia.").matches.map((match) => match.id),
234+
};
235+
});
236+
237+
for (const matches of result.flash) {
238+
expect(matches).toContain("activex-flash-runtime");
239+
}
240+
for (const matches of result.borland) {
241+
expect(matches).toContain("borland-delphi-runtime");
242+
}
243+
expect(result.genericFlash).not.toContain("activex-flash-runtime");
244+
expect(result.genericDelphi).not.toContain("borland-delphi-runtime");
245+
});
246+
212247
test("package sample shows archive and image preflight without treating it as runnable", async ({ page }) => {
213248
await page.goto("/");
214249

0 commit comments

Comments
 (0)