207 Commits

Author SHA1 Message Date
Huangkaoya 898d891885 Revise LICENSE to reflect copyright holder's terms
Updated license information to clarify copyright and licensing terms for Chrono Divide-derived material.
2026-09-03 23:10:25 +08:00
Huangkaoya 8c07f1092b Merge pull request #51 from Hertaspace/fix/airborne-bridge-render-and-leftclick-move
修复飞行单位飞过高桥被遮挡 + 沙盒改回左键移动
2026-06-23 08:27:56 +08:00
Hertaspace f814bbfd60 修复飞行单位飞过高桥被遮挡 + 沙盒改回左键移动
- 飞行单位(jumpjet 火箭飞行兵、飞机等,airborne 时 zone=Air)飞过高桥时
  现在渲染在桥面之上,不再被桥面盖住(之前 renderOrder=0 排在高桥的 1 之下,
  看起来像钻到桥下面去了)。Infantry 与 Vehicle 同修。
- 场景沙盒改回 RA2 风格:左键移动、右键拖动卷动地图(之前被强制成右键移动)。
  放置模式下世界交互本就被禁用,左键放置不冲突。
2026-06-14 13:16:25 +08:00
Huangkaoya 1c620c1984 Merge pull request #50 from Hertaspace/feat/bridge-movement-and-scene-sandbox
新增场景沙盒 + 修复桥梁通行(陆/海/坦克)
2026-06-14 12:14:12 +08:00
Hertaspace e3d9bdac6d 新增场景沙盒(Scene Sandbox)测试工具
在真实官方地图上手动测试单位交互(含桥梁移动/登载)的开发工具。

- src/tools/SceneSandboxTester.ts:载入官方地图后可手动放置任意
  载具/船只/步兵/飞行器/建筑/超级武器,设置归属、老兵等级、血量、数量;
  支持进入放置模式、拆除建筑、触发超级武器、调节游戏速度、回到基地视角、
  快捷键下达停止/警戒/部署/散开等命令。
- Application.ts:注册 /scenesandbox 路由(优先载入 mp18s3,回退 mp03t4)。
- TestEntryScreen.ts:测试入口新增“场景沙盒”按钮。

依赖本 PR 的桥梁通行改动(Target.usesGroundLayerUnderBridge 等)。
2026-06-13 22:13:40 +08:00
Hertaspace b2f8353551 修复桥梁通行:陆军上桥、海军桥下、运输艇跨层登载
- 陆军/地面单位现在能正确移动到高桥与低桥的桥面。根因是 OrderUnitsAction
  重建移动目标时把桥对象当成了 target.obj,导致单位 tick 时 MoveOrder.isValid()
  把它当作“不可移动的覆盖物”而静默丢弃整条移动指令;改为只传位置、用
  TargetBridgeMode.Bridge 通过格子重新挂桥(move/scatter 两处)。
- 海军单位点击桥下时驶向桥“正下方”的水面:DefaultActionHandler 对走水层的
  单位改用桥面格自身坐标的地面层,而非抬高桥面在 z=0 的屏幕投影(后者会偏到
  岸边不可通行,导致船被推到桥两侧)。
- MovePositionHelper 让能钻桥洞的海军单位(!TooBigToFitUnderBridge)停在桥正
  下方;大型军舰仍走桥两侧(符合原版 TooBigToFitUnderBridge),且不再先钻进去
  再被弹出。
- 修复跨层登载:站在桥面上的单位不能直接登载正下方水里的运输艇
  (EnterTransportTask 的到位判定与 EnterTransportOrder.isAllowed 增加同层校验)。
- 高桥边缘/护栏一侧的桥面拾取:MapHoverHandler 拾取半径与按桥面高度的多档采样,
  消除点不到桥边的死区。
- 配套:Target 桥模式(Auto/Ground/Bridge)、桥上单位渲染层级、MoveTask 与
  寻路对水层/桥层的处理、桥相关攻击/守卫/散开/进入指令的目标推导。
2026-06-13 22:13:40 +08:00
Huangkaoya 05433ac810 Merge pull request #49 from igofreely/main
fix:修复Bot沙箱类型剥离正则误匹配三元表达式的问题
2026-04-15 20:54:20 +08:00
igofreely d4029e38d5 修复Bot沙箱类型剥离正则误匹配三元表达式的问题
BotSandbox.stripTypes() 中的返回类型注解正则 /\)\s*:\s*[...]+(?=\s*[{;])/ 会
错误地将三元表达式 fn() : { ... } 中的冒号识别为类型注解,导致代码被破坏,
上传的Bot无法加载(报 SyntaxError)。

修复方案:将返回类型正则锚定到 function 关键字和箭头函数签名,避免误匹配
普通的三元运算符表达式。

同时包含:Bot注册持久化、大厅界面及玩家工厂等相关改动。
2026-04-13 10:38:54 +08:00
Huangkaoya dcb381d97f Merge pull request #48 from igofreely/main
fix: 单位升级、间谍渗透、心灵探测、铁幕坦克效果 veteran XP, spy infiltration, psychic sensor, iron curtain effects
2026-04-12 21:12:20 +08:00
igofreely 924e97c027 fix: veteran XP, spy infiltration, psychic sensor, iron curtain effects
- VeteranTrait: use symbol-keyed [NotifyTargetDestroy.onDestroy]() and fix inverted condition for XP gain
- AgentTrait: fix spy stolen tech only granted when infiltrating battle labs
- PsychicDetectorTrait: check enemy unit position instead of attack target position for range
- PsychicDetectPlugin: support both BoxedVar and raw Player for localPlayer
- Aircraft/Vehicle: update iron curtain light continuously while invulnerable
- ExtraLightHelper: use multiplicative formula for VXL iron curtain darkening
2026-04-12 13:27:55 +08:00
huangkaoya f3c35c75e1 feat: 弹幕红警 2026-04-09 21:50:01 +08:00
huangkaoya e6a32f3e76 feat: 性能优化 2026-04-06 08:07:27 +08:00
Huangkaoya 4b4f012b7a Merge pull request #47 from igofreely/main
fix: resolve all TypeScript type-checking errors 修复类型错误,bun run typecheck:entry无报错
2026-04-02 13:00:14 +08:00
igofreely 81c90b43b5 fix: correct HTTPS cert loading, remove stale test import, fix replay timestamp overflow 2026-04-01 18:41:29 +08:00
igofreely a5e2226ee4 fix: resolve all TypeScript type-checking errors
- Add index signatures to dynamic-property classes (GameObject, Techno, World, Renderable, etc.)
- Create module stubs for missing type imports (FileSystem, Camera, Bridge, etc.)
- Fix constructor parameter optionality for 11 constructors/methods
- Add 'as any' casts for cross-module type mismatches
- Change access modifiers (private→public) where needed for trait access
- Fix Task subclass property declarations (remove private re-declarations)
- Widen API return types for bot compatibility
- Disable noFallthroughCasesInSwitch in tsconfig.build.json
- Replace deprecated PlaneBufferGeometry with PlaneGeometry

No game logic changes. No code deleted.
2026-04-01 17:00:42 +08:00
huangkaoya 4fb0d428d1 feat: mdns检测 2026-03-29 13:11:30 +08:00
huangkaoya 3a61622669 feat: 完善局域网联机 2026-03-29 12:50:40 +08:00
huangkaoya 5a0fd867bb feat: 局域网联机 2026-03-29 08:31:11 +08:00
Huangkaoya d8d3182424 Merge pull request #44 from igofreely/main
feat: 添加第三方AI机器人系统、自定义AI难度和观察者模式
2026-03-27 23:28:52 +08:00
igofreely 9802e277ef feat: 多项改进 - 观察者选队、AI界面风格、局域网HTTPS、移动端适配
- 将观察者选择放入队伍选择下拉框中
- AI机器人上传界面改为红底黄字游戏风格
- 开发服务器改为局域网IP(0.0.0.0)并启用HTTPS
- 修复移动端全屏时画面过大界面显示不完整的问题
- 修复移动端触摸坐标双重转换导致触摸无效的问题
- 添加移动端透明左键/右键切换按钮(桌面端隐藏)
2026-03-27 23:13:20 +08:00
igofreely 68c7db0273 refactor: rename supalosa to builtIn 2026-03-27 21:11:38 +08:00
igofreely 89918bd01a fix: 修复全屏分辨率不生效问题
- isMobileLayout() 仅使用 (pointer:coarse) 媒体查询,避免触屏笔记本误判为移动端
- computeViewportSize 全屏模式始终使用完整屏幕分辨率
- 新增 isNativeFullScreen() 检测 F11 浏览器原生全屏
- HudFactory 新增 setViewport() 确保 HUD 重建时使用最新视口尺寸
- GameScreen/ReplayScreen 视口变化时同步更新 WorldView
2026-03-27 20:35:56 +08:00
igofreely cbef0032bb feat: use localized names in replay stats overlay
Replace internal code names (e.g. HTNK, GAPOWR) with localized
display names in the ReplayStatsOverlay production queue section.
Uses strings.get(uiName) with fallback to rules.name.
2026-03-27 19:41:02 +08:00
igofreely bd4e3c8fa6 feat: 录像播放时显示玩家统计信息面板
在录像/观察者模式下,屏幕左上角显示半透明浮层,包含每位玩家的:
- 玩家名称(使用玩家颜色标识,带彩色下划线)
- 资源数量(金币 + 电力状态,低电力红色警告)
- 部队数量统计(建筑/步兵/载具/空军 + 总计)
- 建造队列(当前建造项目 + 进度条 + 暂停/就绪状态)
- 超级武器倒计时(充能进度条 + 就绪时闪烁警告)

设计要点:
- 半透明黑色背景,不遮挡游戏画面
- 多玩家自动分列显示,紧凑布局
- 仅在录像/观察者模式显示(localPlayer为空时)
- 5fps刷新率,低性能开销
- 跟随HUD侧边栏菜单同步显示/隐藏
2026-03-27 19:30:55 +08:00
igofreely df6e7eac11 fix: 修复AI建筑放置被挡住时重新寻找位置 + 让部队持续进攻
1. 建筑放置重试(queueController.ts):
   - 放置前先用canPlaceBuilding检查目标位置是否可用
   - 位置无效时不再盲目调用placeBuilding浪费tick
   - 失败3次后自动在基地车附近搜索替代位置(getDefaultPlacementLocation)
   - 失败10次后取消建筑以解除队列阻塞

2. 持续进攻(attackMission.ts):
   - 攻击冷却从120tick减至60tick(约4秒)
   - 基地攻击冷却从1800tick减至600tick(约40秒)
   - 编队集结等待从240tick减至120tick
   - 无目标重定向从450tick减至300tick
   - 无目标解散从900tick减至600tick
   - 允许同时准备2支进攻部队(之前只允许1支)

3. 编队最低人数降低(defaultStrategy.ts):
   - 步兵: 5→3  坦克: 4→2  火箭飞行兵: 3→2
   - 重型坦克: 3→2  火炮: 4→3
   - 让AI更早发起进攻,不再等太多单位
2026-03-27 19:17:48 +08:00
igofreely 4b160eb3d6 fix: 修复AI基地车被阻挡时无法重新寻找展开位置
问题:MCV部署失败(位置被挡住)时,AI会无限循环尝试在同一位置
DeploySelected,不会主动寻找新的可展开位置。

修复(三处):
1. ExpansionMission.moveMcvToDestination:
   - 添加deployAttempts计数器(最多8次)
   - 部署失败后用findDeployableLocations找附近可展开位置
   - 更新destination到新位置并移动MCV过去
   - 超过最大次数scatter后重置

2. SupalosaBotAdapter fail-safe:
   - 添加failSafeDeployAttempts计数(最多5次)
   - 超过后用canPlaceBuilding扫描周围10格找可展开位置
   - 找到后Move过去,找不到scatter重置

3. SupalosaBot.tryInitialMcvDeploy:
   - 添加deployAttemptCount计数(最多5次)
   - 超过后同样扫描找可展开位置并Move
   - conyard建立后重置计数
2026-03-27 18:57:58 +08:00
igofreely 47f2e7d0df fix: GatherOrder.isValid添加target空检查
bot调用orderUnits([id], OrderType.Gather)不传目标坐标时,
this.target为undefined导致读取.tile崩溃。添加空检查返回false。
2026-03-27 18:47:36 +08:00
igofreely 5ea75036ae chore: 添加_temp_supalosa到.gitignore 2026-03-27 18:41:37 +08:00
igofreely 8e4c8b1a04 feat: 优化AI建筑摆放间距,防止堵塞单位移动
建筑摆放更分散:
- minimumSpace默认值从1增加到2,建筑间保留更多空间
- BasicBuilding/PowerPlant/ResourceCollectionBuilding显式使用minSpace=2
- getDefaultPlacementLocation新增拥挤度评分: 不再只选最近距离的格子,
  而是综合考虑距离和周围建筑密度,避免密集摆放堵塞通道
- SupalosaBotAdapter失败安全扫描起始半径从2增到3、最大半径从12增到15
- 示例bot建筑放置起始半径从0增到2,扫描范围从15扩到18

拥挤度算法:对每个候选格子统计3格内的建筑数量,越密集罚分越高,
使建筑自然分散到更宽阔的位置,为单位和MCV留出通行空间
2026-03-27 18:41:23 +08:00
igofreely a327fe8f7b fix: MCV部署命令改用DeploySelected
Deploy(9)是targeted命令需要目标参数,DeploySelected(10)为untargeted无需目标。
所有能工作的bot(DummyBot/SupalosaBotAdapter/supalosa)都使用DeploySelected。
2026-03-27 18:31:14 +08:00
igofreely b8a65778a5 fix: 修复示例机器人API属性使用错误
- MCV检测: r.name === 'MCV' -> !!r.deploysInto (RA2中MCV名称为AMCV/SMCV)
- 战斗单位过滤: r.weapons不存在于rules对象 -> !!r.primary
- 采矿车检测: 硬编码名称 -> !!r.harvester

这些bug导致上传的示例机器人完全无法工作(MCV不部署→无建造场→无法建造/生产)
2026-03-27 18:22:04 +08:00
igofreely 01adf4c7ec feat: 添加第三方AI机器人系统、自定义AI难度和观察者模式
主要新增功能:

1. 第三方AI机器人系统 (src/game/ai/thirdpartbot/)
   - BotRegistry: 单例注册表,管理上传的自定义机器人
   - BotSandbox: TypeScript类型剥离、源码验证、沙盒化加载(new Function)
   - BotUploader: ZIP文件提取(中央目录解析)、入口点检测(.ts)
   - ThirdPartyBotAdapter: 将第三方接口适配为游戏Bot类
   - ThirdPartyBotInterface: 第三方机器人接口和元数据类型定义

2. 示例机器人 (src/game/ai/thirdpartbot/example/)
   - bot.ts: JavaScript兼容的TypeScript示例,包含建造顺序、单位生产、攻击逻辑
   - README.md: 开发文档

3. Supalosa机器人集成 (src/game/ai/thirdpartbot/supalosa/)
   - 完整的AI机器人实现,包含40+源文件
   - 支持区域感知、威胁评估、任务控制、战术编队等高级AI功能

4. 机器人上传UI (src/gui/component/BotUploadDialog.tsx)
   - React对话框组件,支持ZIP文件上传
   - 大厅界面集成上传按钮

5. 自定义AI难度 (Custom = 5)
   - GameOpts.ts: AiDifficulty枚举新增Custom值
   - BotFactory.ts: Custom难度映射到ThirdPartyBotAdapter
   - constants.ts: 添加Custom的UI显示名称和提示

6. 观察者模式支持
   - SkirmishScreen.ts: 观察者槽位逻辑(maxSlots+1)

修改的文件:

- BotManager.ts: 增强初始化日志和错误处理
- ActionsApi.ts: normalizeObjectArgs参数顺序兼容
- GameApi.ts: canPlaceBuilding支持双参数顺序、API重构
- MapApi.ts: 新增地图API方法
- Bot.ts: 添加setLogger、setDebugMode、logger属性
- GameObjectData/PlayerData/UnitData接口: 扩展属性
- main-legacy.css: 机器人上传对话框样式(+195行)
- en-US.json/zh-CN.json: 添加机器人上传和自定义AI相关本地化字符串
- .gitignore: 排除临时测试文件

Bug修复:
- 修复stripTypes正则破坏对象字面量和三元运算符的问题
- 修复ZIP提取因数据描述符导致文件大小为零的问题
- 修复startLocation格式不匹配(Vector2 x/y vs tile rx/ry)
- 修复power.output -> power.total API属性名不匹配
2026-03-27 16:06:05 +08:00
Huangkaoya 409960ff62 Merge pull request #42 from artshooter/fix/score-screen-time
fix: 修复结算页面时间显示不正确的问题
2026-03-26 15:07:48 +08:00
Artshooter 152de7b7ad fix: 修复结算页面时间显示不正确的问题
结算页面显示的时间是游戏逻辑时间(受游戏速度缩放),而非真实墙钟时间。
默认速度6对应4倍速,导致实际30秒的游戏显示为约2分钟。

修复方式:将游戏逻辑时间除以速度倍数还原为真实时间。
同时补上了缺失的 score-header(地图名 + 时间),CSS样式已存在。
修复 formatTimeDuration 中浮点数精度问题。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 22:10:16 +08:00
Huangkaoya 441208dad4 Merge pull request #37 from Hertaspace/fix/overlay-bridge-render-order
fix: 修复矿石/桥覆盖地面单位的渲染层级及桥面点击通行问题
2026-03-25 16:45:59 +08:00
Huangkaoya f5f42a991c Merge pull request #41 from igofreely/main
修复4个游戏机制的bug,附演示视频
2026-03-25 16:39:50 +08:00
igofreely 8f1d6e5fb6 移除路径循环的修改 2026-03-25 16:38:39 +08:00
Huangkaoya af4af84885 Merge pull request #40 from tpoisonooo/fix-name-upper-in-linux
fix(src): fix name upper problem in linux docker
2026-03-25 16:22:59 +08:00
igofreely fb5c59bed3 修复
光棱塔串联不应该有友军伤害,而是加强攻击力
工程师在执行占领任务时,再次命令工程师占领、停止或警戒,工程师就会停在原地无法移动
尤里心灵冲击波对载具不应有伤害 对狗应该有伤害
设置路径时,第4个路径点和初始路径点无法形成路径循环
2026-03-25 16:16:09 +08:00
tpoisonooo a4be824a1c fix(src): fix name upper problem in linux docker 2026-03-25 15:46:50 +08:00
Huangkaoya 6f323b4b90 Merge pull request #36 from igofreely/main
给游戏加了录像回放的功能,测试已通过
2026-03-25 13:37:53 +08:00
yaoling123 b86a539935 fix: 修复矿石/桥覆盖地面单位的渲染层级问题及桥面点击通行问题
1. 矿石/弹坑覆盖单位:通过分层渲染解决
   - 地形 tile 设置 renderOrder=-2 优先渲染并写入深度
   - overlay/smudge 批处理层设置 renderOrder=-1,禁用深度测试和写入
   - 单位保持 renderOrder=0,仅与地形做深度比较

2. 桥覆盖单位:桥的 sprite mesh 同样设置 renderOrder=-1
   并禁用深度测试/写入,确保单位始终显示在桥面上方

3. 桥面点击无法通行:当点击位置未命中桥实体时,
   检查 tile 的 onBridgeLandType 自动识别桥,
   确保移动命令使用桥层级而非水面层级
2026-03-24 10:52:43 +08:00
igofreely 65d1c6df24 修复游戏录像持久化问题 2026-03-24 10:49:08 +08:00
igofreely 72d1dad5d1 录像回放完成不走遭遇战结算页面而是停在画面最后一帧 2026-03-24 08:39:21 +08:00
igofreely 6ed0189763 录像回放功能添加的文件 2026-03-23 17:16:31 +08:00
igofreely 0714fbcb91 Merge branch 'main' of https://github.com/igofreely/redalert2 2026-03-23 17:13:38 +08:00
igofreely 3bcf41bd6f 给游戏加了录像回放的功能,测试已通过 2026-03-23 17:13:26 +08:00
Huangkaoya 11e58b3e89 Update README.md 2026-03-23 14:05:27 +08:00
Huangkaoya 2498c3c4ed Merge pull request #35 from igofreely/main
fix: 修复警犬和恐怖机器人对步兵单位不是秒杀的bug
2026-03-23 14:02:49 +08:00
igofreely e0aa48cfa7 修复警犬和恐怖机器人对步兵单位不是秒杀的bug 2026-03-23 13:51:57 +08:00