球纪元h5 更新日志
本文档记录各版本的功能变更、改进与修复。
新增 挂机成就
ball_era_070「划水大师」:首次成功 /afk start 即解锁
ball_era_071「钉子户」:单次连续未暂停挂机时长 ≥ 10 分钟,按指标 afk_continuous_seconds(秒)记录最高时间;暂停 / 自动停止 / 角色不可操作 / game_reset 都视为中断
- 由 usercenter
V14__afk_achievements.sql 注册;服务端 AfkManager 跟踪连续时长,GameLoop 在 resetGame 前调用 flushAfkBeforeGameReset 兜底上报
新增 公测福利
- 已注册账号一次性补发 10000 充值积分(
recharge_score 桶 +10000,同步累加 total_score / remaining_score,不动 ball_era_score),由 usercenter V15__beta_score_gift.sql 在部署时执行
- 公测期内新注册账号在
UserService.register 中自动发放 10000 积分;通过 BETA_REGISTRATION_BONUS_ENABLED / BETA_REGISTRATION_BONUS_AMOUNT 环境变量控制开关与金额
- 新增 tip:「公测期间已注册账号和新注册账号赠送10000积分!」(
tips 表 seq=5,由 farming-server V15__update_beta_score_gift_tip.sql 在 V0.9.2 起将文案从"内测"修正为"公测")
文档 版本号同步
- 项目根与 Farming 子项目上下文、机制参考、版本规划、页面标题、左侧版本信息、操作说明、游戏说明、服务端启动横幅和 Maven 项目版本统一升级为
V0.9.2-beta
平衡 多主城建造
B9、B9C 建造距离规则:与他人主城需保持 2 格距离(即 5×5 范围内不可建);自己已有的多座主城之间不限距离」
修复 首次进入历史事件重放
- 修复无人在线期间增量事件积压导致首次进入时重放大量白球转向蓝色特效的问题
- 无开放连接时清理瞬时表现队列,覆盖白球转向、范围动画、白球碰撞波纹和空投增量特效
改进 空投交互
- 空投落地 / 开启阶段的箱体现在会阻挡主白球、冲刺白球和小白球移动,前端预判同步处理
- 空投开出的金币保持为散落金币实体,并增加短暂拾取 / 吸引延迟,避免开启瞬间被附近玩家直接收入
改进 AFK 状态反馈
- 单独输入
/afk 不再显示用法帮助,只显示已设置脚本、运行 / 暂停状态、已用时间、剩余时间、暂停时间和已扣分次数
/afk set、/afk start、/afk stop 回显脚本与计时信息,方便确认当前挂机状态
改进 同账号 AFK 互通
- 挂机脚本、运行状态、计时、扣分和回放改为由服务端按
userId 统一管理,同账号两个 session 的 /afk set/start/stop 互通
- 暂停后重新
/afk start 不带数字会沿用上次总时长继续剩余时间;带数字则重设本轮挂机时长和计时
- 刷新单个页面不会丢失账号级挂机配置;最后一个同账号连接断开时会暂停挂机,重连后可继续
改进 主城距离限制
B9 建主城与 B9C 移动主城的 5×5 距离限制只针对他人主城;同一玩家的多个主城之间不再限制距离
- 前端本地预判与服务端权威校验同步更新,避免自有主城相邻时误提示无法放置
文档 版本号同步
- 项目根与 Farming 子项目上下文、机制参考、版本规划、页面标题、左侧版本信息、操作说明、游戏说明、服务端启动横幅和 Maven 项目版本统一升级为
V0.9.1-beta
改进 空投指令扩展为 D+数字 1~50
D1 / D10 改造为统一的 D+数字(1~50):d1~d50 任一数量都接受,扣分按 2 × 数量 同步校验,扣分失败不会创建空投
- 多个空投(n ≥ 2)由服务端排队按 0.2 秒间隔依次落下,与原
D10 行为一致
- 成就
ball_era_066「天动万象」对 d1~d50 任一数量均触发
- 新增 tip:「d+数字 可以发起空投雨,数字为空投个数,范围为1~50」(
tips 表 seq=4,由 V13__add_d_airdrop_tip.sql 写入)
- 右侧操作手册移除
/afk 区块,把面板让给空投相关说明
改进 空投落点 / 落地交互
- 空投落点禁用范围减半:距地图边界
1.3 → 0.65 格,距黑球圆心 2 → 1 格;同波雨内空投相互间距 1 格不变
- 落地切换前先尝试把与阻挡正方形重叠的主白球 / 小白球沿"短轴 → 长轴 → 对角"挤到合法位置;候选位置必须严格满足"圆边缘不出地图"且"不与黑球重叠"
- 任意一个白球找不到合法位置:空投跳过落地阶段直接开奖消失,立即掉落奖励,避免白球被困或卡死
- 已落地空投在
LANDED 期间若主白球 / 小白球持续与阻挡正方形重叠 ≥ 1 秒,空投自动开奖移除
改进 空投奖励拾取保护时间
- 空投开奖掉落的金币不可拾取时间由 1 秒缩短为 0.5 秒
- 空投开奖掉落的技能物品对白球的拾取保护新增独立字段
SkillItemData.pickupAvailableTick,空投奖励统一为 0.5 秒;非空投生成的技能物品保持原有 1 秒保护时间不变
修复 白球与空投反射震动
- 白球与空投阻挡正方形的反射改为与石墙完全一致的「先角后面」机制:
AirdropSystem.computePoints / computeLines 按横墙模板提供四角四边的 reboundAngle / reboundRange
- 主移动与冲刺两条路径都通过
pointInCircle + angleInRange(角点)与 lineInCircle + angleInRange(边线)判定命中,reboundRange 过滤掉反方向擦角的误触发
- 修复擦角时按"圆心连线"反弹导致方向偏向圆心、循环重撞产生的震动;改为统一的墙式反射后,擦边 / 擦角都会按真实接触法线一次性弹离
新增 空投系统
- 新增
D1(消耗 2 积分发起 1 个空投)和 D10(消耗 20 积分发起 10 个空投,间隔 0.2 秒)指令;扣分由服务端同步校验,扣分失败不会创建空投
- 空投生命周期:5 秒预告闪烁 → 落地(持续 60 秒,作为 0.8 格正方形障碍阻挡玩家移动 / 寻路 / 建造)→ 玩家中心进入 0.9 格触发区即开启(1 秒后开奖移除);60 秒无人开启则爆炸移除
- 落地冲击:以落点为中心、边长 0.8 格的正方形,摧毁范围内石墙和木墙并击杀玩家
- 爆炸:以空投中心为圆心、半径 1.3 格的圆形,摧毁范围内石墙和木墙并击杀玩家;护盾抵挡一次后玩家进入 10 秒无敌
- 开启奖励(合计 100%):30% 散落 2~4 个小金币 / 30% 散落 1~2 个大金币 / 各 10% 出现冲刺、速射、散射、爆炸技能物品(方向从现有 8 方向中随机)
- 新增 4 个空投成就:
ball_era_066「天动万象」(成功发起一次 D10)、ball_era_067「舔包」(打开一个空投)、ball_era_068「天降正义」(被空投落地冲击击杀)、ball_era_069「瞬间爆炸」(被空投爆炸击杀)
- 挂机
/afk 不允许设置 D1 / D10,避免挂机自动消耗积分
新增 AFK 挂机系统
- 新增
/afk set、/afk start、/afk stop 本地挂机指令,可配置最多 10 条人类玩家指令并循环回放
/afk set 支持为每条回放指令配置 500~5000ms 的间隔;未写间隔时默认 500ms
/afk start [分钟数] 默认 10 分钟,范围 1~9999 分钟;每分钟扣 2 积分,启动时立即扣除第一分钟,积分不足、扣分过频或积分服务异常时自动停止
/afk stop 暂停挂机并保留已用时与扣分进度,再次 start 会继续本次剩余时长;本局重置会清空挂机配置
- 挂机回放出的普通指令仍走全局指令延迟、指令展示和服务端校验;纪元过渡期间会等待过渡结束后再继续执行
文档 说明同步
- 操作说明、游戏详细说明和右侧操作手册补充
/afk 语法、费用、限制、示例和注意事项
- 项目根与 Farming 子项目上下文、机制参考、版本规划、页面标题、左侧版本信息和服务端启动横幅统一升级为
V0.8.1-alpha
新增 白球控制系统
- 登录账号可输入
Q 控制白球;Q+ 消耗 10 积分并携带 500 白球初始金币
- 人类加入和白球加入互斥,只能在未加入任何一方时选择
A/A+ 或 Q/Q+;已在人类或白球中游玩时再次输入会被忽略
- 同一时间只有一个账号可以控制白球;控制期间白球自动放技能物品和自动转向暂停
- 新增白球控制指令:
R 随机转向,R4 指定方向转向(使用转向冷却,不消耗技能能量),Z/X/C/V 放下冲刺/散射/速射/爆炸技能物品,Z0、X3 等字母+方向写法消耗 100 白球金币,W 消耗 500 白球金币隐身 60 秒,G 可提前结算
- 隐身期间控制账号可见 0.5 透明度白球和小白球,其他人不可见;碰撞特效和白球技能物品所有人仍可见
- 白球进入隐身状态时,会发送系统提示
- 修正白球定向控制方向:
Z4 等指令现在与建墙方向一致,4 为下方
- 白球开始自动扣钱,以及每 10 秒扣钱金额变化时,会发送系统提示
- 60 秒无控制指令、主动输入
G 或 60 秒后的白球金币耗尽会触发结算;每 1000 总财富增加 1 积分
- 首次加入白球时立即获得“2 不做人啦”成就(描述“首次加入白球”),结算时更新最高财富记录与白球财富榜
修复 寻路归中尝试与航点吸附回归
- 修复 V0.6.1-alpha 引入的"目标格中心被任意采样点占住即不追加归中尝试",导致沿航点走完后不再朝目标格中心径直推进的问题;现在仅在中心点本身完全无法站立时才放弃归中尝试,否则始终追加,由
finishBlockedCenterAttempt 兜底处理顶墙挤压的情况
- 修复中间航点的下一个航点为归中尝试时不再吸附,导致航点位于格边缘时玩家被挤进相邻格、归中尝试因
isInsideCellOfCenter 失败而触发"无法移动"的问题;现已恢复始终吸附到中间航点精确位置
- 移动卡死与寻路调试日志加强:寻路完成时输出航点坐标列表(中心尝试航点用
* 标记),tick 卡住检测和 cancelIntent 推出失败时输出位置、当前格、距目标距离、剩余航点路径与碰撞情况,便于定位窄通道与墙阵接缝处的卡死
- 角度滑行
tryProgressSlideAt 与 A* 子模拟、单玩家步进保持一致:合力方向不可靠时按意图方向做扇形试探,主区允许 ±90° 内的非后退候选,兜底允许 ±135° 内的回退脱困,避免凹角接缝里被首切向卡死
优化 A* 节点格归位与中心可达判定
- 邻格扩展模拟落点不再使用预期邻格
(nx,ny) 作为节点 px/py,而是按落点真实坐标重新归位(cellIndexAt),让墙阵附近"模拟最终落点偏离预期格"的节点也能正确去重和向终点收敛
- 归中尝试航点采用更严格的"按点到达"判定(距中心 ≤ 0.5px),普通航点保留 1/3 格到达矩形;归中阶段无法精确到达时由
finishBlockedCenterAttempt 在玩家位于目标格内且无碰撞时静默完成,不弹"无法移动"
- 同步更新各类项目文档与游戏机制说明:移动系统补充归中尝试航点、航点吸附与扇形角度滑行兜底的说明
优化 各类物体半径与建造检测尺寸调整
- 黑球(障碍物)半径由
unitLength * 0.5 = 20px 调整为 unitLength * 0.435 = 17.4px:略微缩小障碍物,配合新版墙宽放宽相邻通道
- 白球半径由固定 15px 调整为
unitLength * 0.4 = 16px:略微放大并改为按 UNIT 比例
- 墙宽 WALL_WIDTH由
unitLength * 0.75 = 30px 调整为 unitLength * 0.8 = 32px;墙高 16px 不变。三连墙间距同步:石墙距玩家 1.25 → 1.3 UNIT,木墙距玩家 0.75 → 0.8 UNIT
- 建墙检测半径从矩形改为圆形小圆判定:单墙 / 三连主墙
0.15 UNIT(原 8px),三连石墙侧墙 0.08 UNIT(原 4px),三连木墙侧墙 0.1 UNIT。墙与墙重叠以圆-墙体精确判定(含斜墙),与黑球 / 主城 / 技能物品也用圆形判定
- 三连石墙补修逻辑:两侧墙建造失败时,仅以
0.08 UNIT 小圆查找已有受损石墙补满 HP(findStoneWallInSideCheck);三连木墙不再做侧墙补修
- 主城建造判定边长由
UNIT = 40px 改为 UNIT * 0.8 = 32px 的方框,与石墙/木墙/黑球/技能物品按"墙体-方框"或"圆-方框"精确判定;新增对白球技能物品的碰撞拦截
- 传送目标格判定由
unitLength * 0.35 = 14px 收紧到 unitLength * 0.2 = 8px 的格心小圆,并扩展为同时检查石墙、木墙、黑球、技能物品和玩家自身:玩家身体覆盖到格心小圆即视为障碍,因此站在格心传自身格会失败、偏离格心较远则可传送;同步取消斜向木墙豁免、目标点对黑球的安全外推、以及"目标格有玩家"的独立检查
- 客户端、服务端、寻路与碰撞推出系统中的所有相关数值已同步对齐
新增 统一成就与排行榜系统
- usercenter 新增成就图鉴、个人成就、全局记录、通用排行和球纪元专属排行数据结构,并提供登录用户查询接口
- homepage 新增「成就」与「排行榜」页面,可查看个人完成状态、首达记录、最高记录、积分榜、游戏时间榜、成就榜、人类财富榜和人类现金榜
- farming-server 新增成就与排行事件上报链路,按批次向 usercenter 上报解锁、最佳值、游戏时间和排行记录
新增 球纪元成就触发与全局记录广播
- 接入击杀、生存、财富、现金、满级、特殊击杀、主城/农田状态、纪元 buff 和投票选择等成就触发点
- 玩家加入时会同步拉取个人历史成就状态,避免跨局重复广播或重复上报弱于历史最佳的数值
- 达成成就和打破全局最高记录时在游戏内发送系统消息,并附带指向首页成就页的链接
优化 排行参与规则与开发文档同步
- 用户可被标记为不参与排行与全局记录竞争,但仍保留个人成就和个人最佳值,便于测试账号自查
- 成就与排行榜开发计划、Farming 子项目上下文、游戏说明和操作说明同步更新到当前版本
- 服务端、启动脚本、页面标题和左侧版本信息统一升级为
V0.6.1-alpha
优化 寻路系统重写为 A*,节点改用格内真实停点
- 之前 Dijkstra 距离优先 + ±4 格暴力扩展,节点固定为格中心;半格通道、墙缝、贴墙目标格经常被"中心点不可达"误判为整格不可达,要么走不到、要么强行直达后顶墙抖死
- 改为 A*:节点不再是格中心,而是物理模拟后落到的"真实可达停点";扩展邻居每格做 3×3 共 9 个采样点(外侧带
PATH_SAMPLE_CLEARANCE=2 安全边距),优先选择内侧采样点
- 邻格扩展半径从 ±4 收紧到 ±1(
PATH_EXPANSION_RADIUS=1),同时新增"终点直跳":与终点切比雪夫距离 1 < d ≤ 3 时尝试一步直达,远距离则跳过几乎必失败的 9 次模拟
- 启发式估价采用矩形 Chebyshev 距离 / 速度,配合
PriorityQueue<PathNode> + bestCost 散列去重;pathKey 量化 20px(约半格)避免墙阵附近落点波动撑爆 open list
- 航点到达判定改为"进入 1/3 格边长矩形 + 当前位置可站";中间航点到达后吸附到已验证停点,最终航点若被墙占住则不强行钻入
- 寻路完成后追加一个"中心尝试"航点:能站就吸附到格中心,不能站就由 50 tick 卡住检测自然取消,避免被墙边缘卡在偏离格中心的位置
优化 移动碰撞新增轴向滑行 + 切向滑行后重新瞄准
- 墙缝/半格通道场景下两侧合力近乎抵消,老的切向滑行容易抖死;新增
tryAxisSlide 优先尝试可行轴向移动完整步长,保留贴墙满速度
- 切向滑行成功后下一帧按当前位置重新瞄准目标(之前是保留原方向继续),更贴近实际玩家观感
- 服务端
PlayerMovement.singlePlayerStep / 客户端 Player.move 与寻路模拟 simulateDirectMoveToPoint 同步实现,保持两端预判一致
优化 寻路调试可视化重写
- 服务端
debugPath 改为"寻路完成时一次性下发",写入 JSON 后立即清空 p.debugPath,避免每个 tick 都重复携带几百个探索格/航点撑爆带宽
- 客户端本地 5 秒计时(300 帧 @60fps),头 1 秒淡入、末 1 秒淡出;不再依赖服务端持续推送
- 新增
exploredSamples 真实采样点散点图,可以直接看出 9 个采样里哪些被取用
- 覆盖层(探索格 / 路径 / 航点)拆到地图格之上、实体之下,整体透明度压低(0.04~0.45)以免遮挡农田/玩家;信息框单独留在最顶层并显示"探索格 / 采样点"两项
修复 移动中刷新页面不再被迫停下
- 表现:角色正在
M 移动或被动滑行中,刷新浏览器后重连回来,移动被强制取消,必须重新发指令
- 根因:
GameServer.onClose 在最后一个连接断开时会调 PlayerMovement.cancelAllMovement,直接清空 commandMoving / waypoints / passiveMoving。刷新页面会触发一次瞬时断连,于是移动状态被当场清掉,重连以后没得恢复
- 修复:
onClose 保留玩家的移动状态,不再主动停人;M 航点到达检测、被动速度 * 0.85 衰减以及 50 tick 卡住检测已经覆盖了"不应无限走动"的兜底
优化 本地开发与生产共用同一份前端代码
- 主页新增
homepage/src/config.ts,按 window.location.hostname 自动选择 AUTH_SERVER 与 FARMING_URL;本地开发回落到当前域名 + :3002 / :3003,生产保留 auth.junwanghechu.com / farming.junwanghechu.online
- farming 前端
auth.js / config.js 同样改为按 hostname 动态决定 AUTH_SERVER 与 GAME_SERVER_URL,并支持 window.FARMING_AUTH_SERVER / FARMING_GAME_SERVER_URL 覆盖
- usercenter
SecurityConfig 登录/登出跳转地址改读 HOMEPAGE_URL 环境变量(默认 http://www.junwanghechu.com/)
- OAuth2 客户端注册补充
http://127.0.0.1:3001/callback、http://localhost:3003/callback、http://127.0.0.1:3003/callback 本地回调,本机直接开发免改 hosts
优化 Docker 与 Maven 构建提速
- 新增
deploy/docker/init-databases.sql,MySQL 容器首次启动时自动建 auth_db 与 farming 库(utf8mb4 / utf8mb4_general_ci)
docker-compose.yml 日志卷由绝对路径 /app/logs/ 改为相对 ./logs/,便于在任意主机目录部署
- MySQL 宿主端口改
${MYSQL_HOST_PORT:-3307},避开本机已有 3306
farming-server 增加 mysql.condition: service_healthy 依赖,并通过 FARMING_DB_URL / FARMING_DB_USER / FARMING_DB_PASSWORD 注入连接信息
farming-web 构建上下文从 ./farming 收紧到 ./farming/web,避免把服务端源码塞进前端镜像
usercenter/Dockerfile 与 farming/server/Dockerfile 拷贝新增的 maven-settings.xml(阿里云 Maven 镜像)到 /root/.m2/settings.xml,离线/弱网构建拉依赖大幅提速;产物 jar 路径固定为 usercenter.jar / farming-server.jar
优化 调试开关与初始金币改由环境变量控制
GameState.debugMode / GameState.debugFastYear 不再硬编码,分别由 FARMING_DEBUG_MODE(默认 false)与 FARMING_DEBUG_FAST_YEAR(默认 false)控制;布尔取值 true / 1 / yes / on 视为开启
- 新增
GameState.INITIAL_MONEY,由 FARMING_INITIAL_MONEY(默认 0)控制玩家加入时基础金币;addPlayer 中 p.money = 10000 + superManNewPlayerBonus + ... 改为读该常量;superMan buff 加成与 a+ 额外金币仍叠加在此基数上;玩家普通 A 加入金币为 0、A+ 加入金币为 500、叠加 superMan buff 后为 1000 / 1500
- 注入位置:根
docker-compose.yml 与 deploy/docker-compose.yml 的 farming-server.environment;改值无需重新打包,重启 farming-server 容器即可生效
- 新增项目根
.env 模板(已加入 .gitignore,不会进版本库),含全部 7 个变量的注释示例;deploy/.env 也补上调试三件套示例。本地直接 IDE/命令行跑 farming-server 时,则在 IDEA Run Configuration 或 shell 中注入这些环境变量
- 玩家面向文档同步:
guide.html 玩家属性表「初始金币」改为「0(默认)」并注明由 FARMING_INITIAL_MONEY 控制;controls.html 「加入游戏」段落同步改为「初始金币默认 0(A+ 加入额外 +500,可叠加我是超人 buff)」
清理 移除过时的寻路设计文档
- 删除
farming/寻路代码优化方案.md(已被本次 A* 重写覆盖)与 farming/20260331claude自查.txt(一次性自检稿)
优化 出局积分改按"本局累计获得金币"计,每 5000 金币 1 积分
- 之前出局按"出局瞬间剩余金币"折算积分(每 1 万金币 5 分),被白球/小白球扣掉 20% 的那部分金币无法计入,且被人拆家/花钱升级后都会压低积分
- 现在改按"本局累计获得金币"计分,公式为
totalEarnedMoney / 5000(向下取整);花费、死亡掉落、被白球扣钱、被拆家扣钱等金币减少均不影响累计值
PlayerData 新增 totalEarnedMoney 字段,加入时带上初始金币(含 superMan / a+ 加成),后续在每一处金币增加处同步累加:农田产金/主城吸金/金币拾取、理财大师利息、普天同庆/均富/jackpot buff、拆家满级折算金币
- 出局广播消息由"剩余 X 金币"改为"本局累计获得 X 金币",与新口径一致
ScoreService.submitEliminationScore 参数改名为 totalEarnedMoney;六个出局调用点(白球 ×3、小白球、手动杀玩家、复活倒计时超时)均改传 player.totalEarnedMoney
优化 擦墙场景改切向滑行,寻路代价改用实际模拟帧数
- 玩家指令移动(
M)碰撞后先尝试沿墙切向走完整步长,贴墙时不再顿挫;切向失败才回落老合力推出法做兜底
- 服务端
simulateDirectMove / singlePlayerStep / PBD resolveComponent 4b、客户端 simulateDirectMove 同步改造,保持两端预判一致
- Dijkstra 边权由"格心直线距离"改为"实际模拟帧数 × baseSpeed",擦墙路径被正确标记为更慢,优先队列能选出真正最短耗时
- 寻路回溯后追加相邻 1–2 航点平滑(受限 string pulling):每个锚点尝试跨过接下来 2/1 个中间航点,能直达则丢弃,减少冗余中转
修复 多账号并发加入时 playerId 复用导致的 session 串号
- 表现:两账号在不同浏览器几乎同时发
a,加入/退出反复后,某账号加入成功但左侧昵称显示成另一账号的昵称
- 根因:
handleJoinSync 补发分支只看 existCheck.live,未校验 userId;当 allocatePlayerId 把刚释放的 id 分给新主人时,老连接上残留的 session 会命中补发分支,把别人的 joined 发回给本连接
- 补发分支改为三方 userId 一致(本次 join / 老 session / gameState 中该 id 的角色)才允许幂等补发;不一致则清掉老 session 走新建(绝不
removePlayer 别人的活角色)
allocatePlayerId 后新增残留 session 清理:扫一遍 sessions,把其他 conn 里 playerId 相同但 userId 不同的老记录丢掉
- 客户端
joined 分支加一致性断言:服务端返回的昵称与本地 OAuth 昵称不一致时控制台 warn,便于第一时间发现类似串号
新增 积分系统与纪元积分排行
- 纪元变更淡入结束瞬间结算:剩余金币前 5 名依次获得 20 / 16 / 12 / 8 / 4 积分
- 玩家出局时按「每 1 万金币 = 5 积分」折算(不足 1 万不结算)
- 积分异步上报至用户中心,支持指数退避重试 5 次与死信文件持久化;重启后自动重放
- 用户中心新增
user_score 表(总获得 / 球纪元 / 充值 / 剩余)与 user_score_request 幂等表
- 内部接口
POST /internal/score/add / query / deduct 共享 X-Score-Token 鉴权
- 新增
J 指令查询球纪元积分与剩余可用积分,未加入玩家也可使用
- 新增
A+ 加入方式:同步扣减 10 积分,成功后额外获得 500 初始金币;余额不足或积分服务不可用时保留普通加入逻辑
新增 纪元积分展示阶段(10 秒动画)
- 纪元过渡总时长由 34 秒 → 44 秒:2s 淡入 → 10s 积分展示 → 30s 投票 → 2s 揭晓
- 5 行排名从中心逐行弹入 → 居中保持 → 整体滑向左上角,投票期间持续展示,揭晓 2s 淡出
- 每行显示名次、玩家小球(玩家色)、昵称(玩家色)与「+X 积分」治愈绿文字
- 积分展示阶段冻结指令输入(沿用原有纪元过渡冻结逻辑)
重构 玩家碰撞系统升级为 PBD 连通分量解算
- 使用并查集将碰撞玩家分组为连通分量,分量内批量求解位置约束
- 支持任意数量玩家的链式推动(A推B→B撞C→C撞D 全部正确处理)
- 修复「玩家被推进他人身体内」和「被挤出地图边界」的 bug
- 基于权重的碰撞分配:主动移动玩家不易被推开,静止玩家更容易让步
清理 移除键盘移动等早期死代码
- 移除 Space 暂停键、KeyR 白球转向键、Numpad/Arrow 键盘操控
- 移除 player2 本地第二玩家(单机时代遗留)
- 移除 startMove 方向移动方法,统一使用 M 指令寻路
- 合并冗余字段 moving 和 commandMoving 为单一的 commandMoving
新增 开局 4 角落初始地形
- 每局开始时,地图 4 个角落各预置 4 块无主农田 + 6 面木墙
- 以左上角为例:农田 (0,0)(0,1)(1,0)(1,1);竖向 3 面木墙(x=150)与横向 3 面木墙(y=150)围成"L"形防御
- 其余 3 个角落按中轴镜像生成;初始农田 ownerId=-1,任意主城均可收金
调整 游戏结束判定扩展到所有非初始纪元
- 此前仅终末纪元、杀戮纪元会在无存活玩家且无主城时判负并 5 秒后重开
- 现在初始纪元之外的所有纪元(渐盈 / 破晓 / 悬日 / 长歌 / 终末 / 杀戮)都会触发游戏结束
- 初始纪元不记录也不判断"曾有玩家"标记,避免开局无人时误判
调整 三个说明页标题格式统一
- 游戏说明 / 更新日志 / 操作说明三页的浏览器页签标题与页内 H1 统一为「球纪元h5 <文档名称>」
- 三页统一展示「版本:V0.4.5-alpha」与一行文档用途描述
新增 主城移动指令 B9C
- 格式
B9C<原主城坐标>,例:原主城在 (2,2)、玩家站在 (1,1) 输入 B9C22 即可移动主城到 (1,1)
- 固定花费 300g;新位置可以是地图上任意满足建主城条件的格子(当前 5×5 冲突检测仅限制他人主城)
- 移动不触发拆除 / 被撞坏逻辑(不扣除归属者金币、不掉落金币、不触发杀戮纪元);原
castleBuildOrder 保留
- 逃亡年代 buff 仅禁用 B9 建主城,不影响 B9C 移动主城
新增 Buff 投票系统
- 每次纪元切换触发 34 秒过渡流程:2s 淡入 + 30s 投票 + 2s 结算揭晓(初始纪元进入游戏时不触发)
- 投票期间画面展示 3 张 buff 候选卡(不同品质以颜色区分:白/蓝/紫/金/红),已加入玩家在指令栏输入
1/2/3 即可投票,可随时改票
- 卡片下方以彩色圆点实时展示投票者分布;投票阶段命令延迟不生效,投票立即上传
- 最高票数获胜;平票时在最大票数候选中随机选取
- 候选通过「中文名分组 + 组权重无放回抽 3 组 + 组内颜色权重抽具体 buff」产生
- 杀戮纪元触发时复用终末纪元(第 5 纪元)的 buff 池
新增 22 个初始 buff
- 白球速度弱化 / 技能弱化:抑制本次纪元切换的白球阶跃升级
- 我全都要(蓝/紫/金):按概率同时获得另外两张候选的 buff 效果
- x 指令增强(金,3 纪元起,本局唯一):x 指令可消除修理范围内的白球技能物品(原效果为随机转向)
- 普天同庆(蓝/紫/金):所有在线玩家增加 10000 / 20000 / 30000 金币
- 我是超人(紫,本局持续且唯一):新加入玩家初始金币 +1000
- 均富卡 / 均贫卡(紫,3 纪元起):所有玩家金币对齐到场上最高 / 最低
- 石墙升级(紫/金):石墙血量与冲刺抵抗增强
- 农耕时代(蓝/紫/金):农田产出金币 +5 / +10 / ×2(可叠加)
- 木墙升级(金):木墙冲刺抵抗 +20(白球冲刺撞木墙额外消耗 +20)
- 和平年代(金,仅渐盈纪元,本局唯一):本局中 C9 指令不再生效
- 逃亡年代(金,仅渐盈纪元,本局唯一):本局中 B9 指令不再生效
- 天使卡 / 恶魔卡(金/紫):所有玩家 U1~U5 技能等级 +1 / -1(越界自动截断)
- jackpot(红,权重极低):所有玩家技能升级满级 + 护盾 + 金币 +30000,主城全护盾
- 信号满格(蓝,本局唯一):本局游戏指令延迟固定为 0ms(不再每 60 秒随机刷新)
- 理财大师(金,本局唯一):每 10 年(11、21、31…)发放现金 10% 的利息
- 零元购(蓝/紫/金):本局所有金币消耗降低 20% / 30% / 50%,可叠加累乘
- 人为财死(紫,1~2 纪元,本局唯一):玩家死亡 / 主城被破坏时减少的金币 100% 掉出(原为 25% / 10%)
调整 白球速度与技能等级改为纪元阶跃
- 原按时间线性提升的白球速度等级(0 → 15)改为每次纪元切换 +3(初始纪元进入后共 5 次跳变,上限仍为 15)
- 白球技能等级(冲刺值、速射散射数、爆炸弹数)改为 eraSkillLevel(0 → 5),每次纪元切换 +1
- 若该纪元生效了「白球速度/技能弱化」buff,则本次对应阶跃被取消
新增 左栏历史 buff 展示
- 本局已生效的 buff 以图标+名称列表展示在左栏(转向冷却条下方)
- 鼠标悬停或点击可查看 buff 详情浮层(描述、备注、品质颜色)
- 超过 3 行时支持滚轮 / 触摸拖动滚动
修复 纪元过渡期冷却显示跳动
- 纪元过渡期间白球转向冷却倒计时以
eraTransitionStart 为基准冻结显示,避免本地时钟继续走 + slow_tick 回弹导致冷却条反复跳动
调整 石墙裂痕效果
- 石墙最大血量由固定 3 改为
3 + 石墙升级加成,裂痕显示改为按血量占比判断(≤2/3 浅裂痕,≤1/3 深裂痕)
新增 debug 模式:墙属性叠加显示
- debug 模式下在地图上每堵墙叠加显示血量(当前/最大)和冲刺抗性值
新增 拆家偷取技能系统
- 拆除敌方主城后随机偷取对方已升级的技能,掷骰子决定偷取总级数(55%→1级, 30%→2级, 15%→3级)
- 每轮不放回抽取:U5(城堡范围)固定10%概率,其余已升级技能均分剩余90%
- 拆除方技能未满级时直接+1级,已满级则折算为等额金币
- 拆除者头顶显示偷取结果气泡(如"拆除主城,偷取 移速1级 金币收益1级")
新增 白球击杀掉级机制
- 白球击杀玩家时,50%概率随机扣减1级已升级技能(选取概率与拆家偷取相同)
- 死亡瞬间玩家头顶显示掉级提示气泡(如"白球击杀:移速-1")
- 技能激活期间(白球静止在技能物品位置),玩家站上去也会被判定碰撞并触发掉级
新增 G 指令(退出结算)
- 输入
G 指令退出游戏:销毁该玩家所有主城(不掉落金币、不计入拆城次数),标记为出局
- 出局后可重新输入
A 指令加入新一轮游戏
新增 游戏结束结算画面
- 游戏结束时显示全屏遮罩(红色"游戏结束"标题 + 倒计时提示),5秒后自动重置
- 重置后所有连接回到观众状态,需重新输入
A 加入
新增 Ping/Pong 延迟探测
- 客户端定期发送
ping 消息,服务端原样回传时间戳,用于测量网络延迟
修复 同账号多 session 未拦截
- 同一账号开启第 3 个 session 时未被拦截:原逻辑在
join(输入 A 指令)后才计入会话数,未 join 的 tab 不占名额,导致可绕过限制
- 改为在
check_session 阶段就建立 WebSocket → userId 绑定,未 join 的连接也占用名额
check_session 与 join 加同步锁,防止并发导致计数不准
修复 白球击杀玩家时技能掉级提示气泡未显示
- 白球击杀玩家触发技能掉级时,玩家先死亡导致客户端
draw() 早退,say() 内容无法渲染
- 抽离
drawSayingBubble() 辅助函数,本地玩家与远程玩家的死亡分支也调用气泡绘制
修复 玩家死亡后无法重新加入
- 原逻辑仅允许"出局"状态的连接重新 join,死亡但未出局的玩家无法重新加入
- 改为死亡/出局后均可清理旧角色并重新加入
修复 ID 重复释放导致分配冲突
releaseId() 增加防御性去重,避免 WS 线程与 GameLoop 竞态导致同一 ID 被分配给多个玩家
removePlayer() 改为幂等操作,仅当玩家确实存在时才释放 ID
优化 右上角在线数显示口径
- 在线数 = 游戏中的玩家数(含离线挂机)+ 已建立连接但未 join 游戏的不同账号数
- 同一账号双开(2 个连接)只算 1,已 join 玩家所在账号不重复计入大厅
优化 白球物理引擎
- 白球正常移动改为分步移动(每步不超过半径长度),防止高速时抖动或穿墙
- 散射技能角度从±60°(120°扇形)缩小为±40°(80°扇形),弹幕更集中
- 边界碰撞后立即刷新
speedX/speedY,避免后续步骤用旧速度计算
优化 三连墙建造逻辑
- 三连墙两侧建造失败时(该位置已有墙),自动修复该位置已有的同类受损墙至满血
平衡 杀戮纪元触发条件
- 初始纪元期间拆除他人主城触发杀戮纪元的次数阈值:20次 → 5次
- 白球碰撞摧毁主城不再计入拆城次数,仅玩家主动拆除才触发
新增 客户端预判系统
- 白球本地碰撞预判(
predictMove()):每帧在客户端运行与服务端相同的碰撞逻辑(边界→障碍物→石墙→木墙→城堡),碰撞反弹和涟漪动画即时响应,无需等待服务端回包
- 小白球本地碰撞预判:分步移动防穿墙,碰撞时即时标记消失并播放涟漪动画
- 预判仅处理轨迹和碰撞视觉效果,不修改游戏状态(能量、墙血量、金钱等),服务端仍为权威端
新增 游戏结束与重开机制
- 终末纪元或杀戮纪元下,所有玩家被杀且主城清零时判定游戏结束
- 游戏结束后5秒延迟自动重置:清空所有玩家、地图、白球、金币等状态,开始新一局
- 重置后广播
game_reset,所有客户端回到观众状态,需重新输入 A 加入
新增 昵称敏感词校验与指令过滤
- 新增
ContentFilter 模块:从 sensitive-words.txt 加载敏感词库,不区分大小写匹配
- 昵称校验:仅允许中文、字母、数字、下划线和短横线,包含敏感词时拒绝加入
- 指令过滤:聊天气泡中的敏感词自动替换为等长星号
新增 指令历史记录同步
- 服务端缓存最近20条指令历史,新连接加入时一次性下发,使新玩家能看到之前的指令记录
新增 Docker 部署架构
- 新增根目录
docker-compose.yml(本地开发)和 deploy/docker-compose.yml(生产部署)
- 各服务独立 Dockerfile:homepage(nginx)、usercenter(Spring Boot)、farming-web(nginx)、farming-server(Java)
优化 小白球同步频率提升
- 小白球同步从独立的
sb_sync(2Hz)合并到高频 tick 帧(10Hz),与白球同频
- 移除独立的小球校正广播,减少消息类型
优化 白球移动流畅性
- 服务端修正改为阈值策略:偏差小于15px平滑LERP(0.2),偏差大时快速拉回(0.6)
- 收到服务端 tick 时同步更新本地
speed 和 angle,避免预判碰撞后用旧速度计算
- 白球转向事件(
wb_rd)即时通知客户端,避免转向后预判方向延迟
- 冲刺/速射期间保持速度外推(60fps流畅),仅跳过碰撞预判
- 碰撞涟漪动画改为本地预判即时生成,不再重复接收服务端碰撞特效
优化 多账号登录管理
- 断线后角色不再立即移除,存活角色保留在游戏中(断线挂机),停止移动避免持续走动
- 同账号多设备共享角色:第2个连接关闭时,若还有其他连接在线则不移除角色
- 角色已死亡时连接断开才真正移除玩家
优化 全局指令延迟统一
- 指令延迟改为服务端全局管理,所有玩家共享同一延迟值,每60秒刷新(500~5000ms随机)
- 通过
slow_tick(2Hz)下发 cmdDelay 字段,客户端实时展示
优化 金币生成规则
- 随机金币生成位置增加避让:避开农田、主城、石墙和木墙(与墙中心至少1格距离)
- 农田产金去重:每块农田最多只能有一个它自己产出的金币存在于地图上
- 金币向目标移动时持续追踪玩家当前位置(玩家可能在移动),而非固定吸收点
修复 断线重连
- 重连时统一通过
check_session 查询服务端角色状态,而非凭本地标记盲目加入
- 修复服务端重启或游戏重开后,未关闭的客户端自动创建角色的问题
修复 传送失败无反馈
- 传送目标有墙壁阻挡时,在目标位置显示1秒红色闪烁动画提示判定范围
界面 前端目录重构与备案信息
- 前端文件从根目录迁移至
web/ 子目录,删除旧部署脚本
- 页面底部增加备案信息展示
新增 多人联机系统
- 基于 WebSocket 的实时多人联机
- 支持最多20名玩家同时在线游戏,输入
A 指令加入
- 服务器为权威端(Server-Authoritative):所有游戏状态(墙、农田、白球、金币、玩家属性)由服务器统一管理
- 服务器自动分配不重复的玩家颜色(20种预设配色)
- 高频状态同步:位置/白球 10Hz(tick),玩家属性 2Hz(slow_tick)
- 客户端插值平滑:玩家位置线性插值(0.3),避免画面跳变
- 自动重连:断线后指数退避重连(500ms → 10s),最多8次尝试
- 加入游戏后完整同步服务器状态(地图、白球、所有玩家、纪元等)
新增 账号登录系统
- 访问游戏页面自动检测登录状态,未登录跳转至统一认证中心(OAuth2 PKCE 流程)
- 登录后自动使用账号昵称作为游戏昵称,无需手动输入
- 可在首页
www.junwanghechu.com 修改昵称
优化 联机架构适配
- 从本地双人模式改为多人联机模式:玩家2键盘操作移除,所有玩家统一使用指令系统
- 指令执行改为服务器路由:客户端发送指令 → 服务器验证执行 → 广播结果
- 纪元过场由服务器统一控制,客户端同步显示过场动画
- 白球碰撞由服务器权威计算,客户端本地预判提供即时反馈
- 金币生成/收取改为服务器管理,防止多客户端重复收取
新增 联机服务端(Java)
- 基于 Java WebSocket 的独立游戏服务器
- 完整的游戏状态管理:玩家加入/退出、指令执行、白球物理、金币系统
- 防刷屏禁言同步:服务端判定禁言状态并广播给所有客户端
优化 坐标字符集调整
- 指令坐标字符集由
0123456789ABCDEFGHIJ 改为 0123456789ABCDEFHILP
- 跳过 G、J,后四位改为 H=16、I=17、L=18、P=19,避免与常用指令字母混淆
- 坐标示例:原 JJ=(19,19) 改为 PP=(19,19)
平衡 费用调整
- 主城建造费用调整:第1座300g不变,第2座起改为 n×30000g(第2座=30000g、第3座=60000g、第4座=90000g…)
- U9(个人护盾)费用:20000g → 10000g
- Y(城堡护盾,含Y+坐标)费用:20000g → 10000g
- U3(收获范围)费用公式:
2000+lv*2000 → 1000+lv*1000(1000~5000g)
- U4(修理范围)费用公式:同U3调整(1000~5000g)
- 复活费用:主城数×500g → 主城数×1000g
新功能 U5升级额外提升F范围
- U5升级后,F指令(含F+坐标)范围由3×3扩为5×5,费用由400g → 3000g
- B8指令范围固定为3×3,不受U5影响
平衡 机制调整
- 指令延迟范围:300~3000ms → 500~5000ms(随机,每分钟刷新)
- 随机大金币刷新间隔:30秒 → 60秒
- T传送新增 2秒冷却时间(传送完成后计算)
新功能 刷屏禁言
- 1秒内连续输入3条完全相同的指令:第3条正常执行并记录,之后触发禁言3秒
- 3秒内输入超过10条任意指令:当前条被拦截,触发禁言10秒
- 连续相同触发时显示"刷屏禁言3秒"气泡,频率过高触发时显示"刷屏禁言10秒"气泡
- 禁言期间所有指令无效,不执行、不显示在历史记录
新功能 移动端适配
- 新增自适应布局系统:根据窗口宽高比自动切换横版/竖版布局
- 横版布局:三栏(左侧信息栏+主画布+右侧操作栏)等比缩放适配窗口
- 竖版布局:隐藏左右栏,主画布全宽显示,下方显示信息面板和指令输入区
- 竖版信息面板:显示纪元信息、玩家排名(金币排序)、白球能量和转向状态
- 竖版指令区:指令延迟显示、历史记录滚动区、输入框,自动填满剩余空间
- 新增横竖版切换按钮(右上角),支持 Screen Orientation API 请求旋转屏幕
- 设备物理旋转时自动恢复按宽高比适配
新功能 自动开始游戏
- 进入页面后游戏自动开始运行,无需按空格键启动
- 空格键保留暂停/恢复功能
新功能 操作说明页面
- 新增操作说明.html:面向玩家的详细操作手册,包含快速上手指南、指令表、建造指南、升级系统、防御技巧、实战技巧、费用速查表等
- 横版右侧导航栏和竖版底部导航均可跳转
优化 竖版移动端体验
- 竖版布局顺序调整(从上到下):游戏画面 → 指令输入框 → 指令历史 → 指令延迟 → 玩家信息 → 白球信息 → 年份 → 文档链接
- 文档导航链接移至游戏画面下方(年份上方),确保单行展示
- 竖版最小宽度限制为 320px,屏幕宽度不足时出现横向滚动条
- 输入法弹出时布局不再崩溃:新增 interactive-widget=resizes-visual viewport 属性 + 键盘开启期间跳过布局重算
- 输入框聚焦时阻止页面自动滚动至输入框:touchend 拦截 + focus({ preventScroll: true }) + rAF 循环滚动纠正,兼容 iOS 和 Android
- 竖版指令区最少保证展示 1 行历史记录(原为 3 行),为游戏画面腾出更多空间
修复 Bug 修复
- 修复三连石墙修理逻辑:从查找重合石墙改为查找最近石墙,避免遗漏
- 修复三连石墙建造:中间墙不可放置时整体失败,不再仅建两侧墙
界面 城堡护盾光效优化
- 内层发光贴合城堡主体(线宽4),外层紧贴城堡边缘(线宽2),视觉更紧凑
改进 文档更新
- 更新游戏详细说明文档(游戏说明.html):22章完整游戏机制说明
新增 年代/纪元系统
- 引入"球元XX年"计时,初始为球元1年,每分钟+1年
- 6个纪元划分:初始纪元(1~30年)、渐盈纪元(31~60年)、破晓纪元(61~90年)、悬日纪元(91~120年)、长歌纪元(121~150年)、终末纪元(151年后)
- 纪元变化时暂停游戏5秒,全屏半透明幕布+纪元名称提示语
- 过场期间所有游戏逻辑暂停(白球/玩家移动冻结),过场后补偿所有计时器
- 过场期间屏蔽玩家指令输入
- 彩蛋:初始纪元内全部玩家拆除他人主城总计达20次,进入杀戮纪元(白球速度 unitLength × 0.5)
新增 白球速度升级系统
- 白球初始速度改为
unitLength × 0.05(2px/帧),每过10年提升 unitLength × 0.01
- 第11年开始首次升级,第151年最后一次升级,最高
unitLength × 0.2(共15级)
新增 白球技能系统
- 白球新增能量槽(最大10点),每次碰撞+1能量,满能量2秒后自动放下随机技能物品
- 白球技能物品:圆形(半径10),有朝向,一次性消耗品,白球距物品圆心<25时吸引并激活
- 技能物品阻挡建墙、建城堡和传送(T指令),不阻挡玩家移动
- 新出现的技能物品需1秒后才能被触发
- 白球同一时间只执行一个技能
新增 4种白球技能
- 冲刺(W):白球2倍速冲刺,破坏墙壁/主城/玩家,冲刺值按纪元递增(5/10/15/20/25/30/50)
- 散射(E):白球朝向方向正负60°扇形内均匀发射小白球,数量按纪元递增(2/4/6/8/10/12/20)
- 速射(T):白球停止移动,1.5秒内向朝向方向正负5°内依次发射小白球,0.5秒后恢复移动
- 爆炸(Y):360°全方向均匀发射小白球,数量按纪元递增(6/8/10/12/14/16/32)
新增 小白球
- 半径5的小白球,速度等于白球,碰撞效果等同白球
- 碰撞玩家不消失,碰撞石墙/木墙/黑球/边界/主城后消失
- 分步移动机制(每步不超过半径),防止高速穿墙
新增 白球转向技能(R)
- 白球随机转向任意方向,10秒冷却时间,不通过技能物品触发
界面 左侧边栏美化
- 顶部显示"球元XX年"和当前纪元名称,替代原有秒数显示
- 人类列表(最大20人):排名、颜色球、昵称、持有金币
- 白球状态区:能量槽进度条、转向技能冷却条
- 底部显示版本号和"原作者:@谜之老六"
- 加入游戏的人类球下方显示半透明底色昵称
- 20种预设配色,加入的玩家随机分配不重复颜色
界面 技能物品图标
- 所有技能物品使用黑色边框、白底、黑色图标风格
- 图标设计可直观识别技能类型和朝向
- 爆炸技能图标中白球偏向朝向方向
改进 费用与数值调整
- 第一座主城费用从 500g 降至 300g
- X 指令(修复石墙)新增费用 200g
- P 指令(驱赶)新增独立 2秒冷却
- X 指令新增效果:将覆盖范围内白球技能物品随机转向
- 小金币场上上限从 80 提高至 120
- 随机金币不再出现在墙和主城2倍体积内
改进 传送系统
- 传送目标检测改为圆形检测(半径
unitLength × 0.4),替代原有格中心检测
- 传送障碍检测新增白球技能物品(仅T传送,R回城不受影响)
- 传送失败时显示1秒红色闪烁动画提示判定范围
- 纪元过场期间传送延迟自动等待过场结束
改进 玩家碰撞
- 双方同时主动移动时改为互推(各推开重叠距离的一半),替代原有单方推飞
- 主动移动可覆盖被推滑行状态
- 玩家死亡时清理所有运动/传送状态
- 在当前格发起移动指令时,尝试移动到格子中心
修复 Bug 修复
- 修复拆除他人主城时金钱减半惩罚错误地应用于发起者而非城主
- 修复主城被拆除后碰撞判定残留(白球仍可碰撞已消失的主城)
- 修复小白球高速穿墙问题(分步移动 + 角度归一化)
- 修复
lineInCircle() 角度回绕误判(改用向量点积)
- 修复
getSimpleAngle() 和 angleInRange() 边界条件(> 改为 >=)
- 修复复活读秒期间重复触发加入游戏指令
改进 寻路系统重写
- 将 A* 网格寻路替换为 BFS + 物理模拟验证寻路(Dijkstra 风格距离优先搜索)
- 新增
simulateDirectMove():模拟直线移动验证可达性,包含碰撞推出和卡住检测
- 新增
findPathBFS():先尝试直达,失败后搜索周围 9×9 范围格子,逐层扩展
- 新增
hasCollisionAt() / calculatePushForceAt():独立位置碰撞检测和推力计算,用于寻路模拟
- 寻路失败时改为强行直线移动(让实际碰撞系统自然处理),不再直接提示"无法到达"
改进 移动系统
- 中间航点到达判定改为"进入目标格范围"(与寻路模拟一致),不再吸附航点坐标
- 新增卡住检测:50 帧内位移 ≤ 5px 自动停止移动并提示"无法移动"
改进 调试系统
- 碰撞调试改为非阻塞模式:不再冻结游戏,力箭头叠加显示在碰撞点位置并自动淡出
- 新增寻路调试可视化:已探索格子(蓝色)、跳过格子(红色)、最终路径(绿色虚线 + 航点)、信息面板
- 移除空格键暂停调试的逻辑
界面 主城外观调整
- 移除 U5 升级的金边效果
- 城堡护盾发光颜色从蓝色改为金色
改进 代码架构重构
- 将 index.html 单文件(~5600行)拆分为 12 个独立 JS 模块文件
- 按功能划分:config / obstacle / drawing / player / command / whiteball / wall / land / gold / gamer / animation / input
- 通过多
<script> 标签按依赖顺序加载,保持全局作用域,无需构建工具
- index.html 精简为纯 HTML 结构 + CSS 样式(约95行)
- 所有游戏逻辑、变量名、注释保持不变,功能零改动
改进 项目文档更新
- CLAUDE.md 更新文件结构说明和 JS 加载顺序
新增 玩家1指令系统
- 完整的文字指令解析系统,玩家1通过输入框操作游戏
- A* 寻路移动(M 指令):8 方向寻路,避开障碍物/墙/主城
- 传送(T 指令):1 秒延迟传送到目标格,费用 100g
- 回城(R 指令):传送回主城,支持指定主城坐标
- 建造指令(B0/B1-B4/B8/B9):农田、木墙、石墙、主城的完整建造
- 拆除指令(C/C9):拆墙、拆农田/主城,可拆除他人主城
- 修复指令(X):修复附近石墙至满血
- 农田快捷指令(F):一键在主城周围建造农田
- 指令延迟机制:每条指令 300-3000ms 随机延迟,每分钟重新随机
新增 升级系统
- U1 移速升级(10 级):每级 +20% 基础速度
- U2 金币收益升级(10 级):每级 +10% 拾取/收取量
- U3 收获范围升级(5 级):每级 +0.2 格吸引范围
- U4 修理范围升级(5 级):每级 +0.2 格修复范围
- U5 城堡范围升级(1 级):主城收金范围 2.5→3 格,外观升级
- U9 护盾(1 次性):免疫一次白球致死
- 等级外观系统:每 5 级一档,逐层叠加光环(浅蓝→绿→黄→橙→粉→金)
新增 防御系统
- 城堡护盾(Y 指令):为主城提供一次白球撞击保护
- 驱赶(P/P0 指令):将主城附近敌人传送回出生区
- 范围闪烁动画:修复/驱赶时显示作用范围
新增 主城系统增强
- 多主城建造:费用递增(500g → 5W → 10W → ...)
- 主城外观:城垛、门洞、旗帜(仅第一座)、U5 金边效果
- 城堡护盾光效:蓝色脉冲发光边框
- 主城自动收取金币:农田产金 1 秒后按建造顺序收取
改进 碰撞系统
- 玩家推玩家:碰到其他玩家可将对方推飞,被动滑行含反弹衰减
- 新增
collectIndividualForces() 精确收集碰撞力向量
- 新增
hasCollisionExcludePlayers() 排除玩家碰撞检测
- 建墙碰撞推出改进:三连墙建造时的碰撞检测和修复逻辑
- 白球碰撞冲击波动画效果
改进 金币系统
- 玩家死亡金币掉落(20% 金钱,25% 掉落)
- 主城被毁金币掉落(城主金钱减半,10% 掉落)
- U2 金币收益加成影响所有拾取和收取
界面 UI 改进
- 右侧边栏:玩家1操作手册速查表
- 右侧边栏:指令终端(显示区 + 输入框)
- 指令输入历史:上下键浏览最近 5 条输入
- 指令显示区限制最近 100 条记录
- 指令延迟实时显示
- 绘制函数重构:drawBackGround → drawGridBase + drawBorderAndObstacles 分离
- 农田/主城独立绘制函数(drawFarmlands / drawCastles)
- 左画布玩家状态显示(金币、复活倒计时、出局状态)
- 调试模式:碰撞力可视化(drawDebugForces)
- 说话气泡功能:未匹配的指令文字显示为头顶气泡(2 秒)
新增 项目文档
- 游戏说明页面(游戏说明.html):20 章完整游戏机制文档
- 右侧边栏链接:点击跳转游戏说明
- 更新日志(更新日志.html):版本变更记录
新增 初步完成游戏机制
- 墙阻挡移动
- 建墙障碍物识别
- 农田产出机制(20 秒周期)
- 主城金币收取
- 金币系统:小金币(10g)、大金币(500g)、自动生成
- 碰撞推出系统:移动碰撞(合力法,10 次迭代)和建墙碰撞(1px 步进,10,000 次)
- 死亡与复活机制:10 秒倒计时,主城复活
- 出生区(中心 6×6)建造限制
- 指令输入框 UI(解析尚未实现)
新增 完成核心框架
- 20×20 网格地图,棋盘状深绿/浅绿底色
- 双人玩家系统:玩家1(红色)、玩家2(橙色)
- 玩家2小键盘操作:8 方向移动 + 修饰键建造/拆除
- 石墙(3HP,4 种朝向)、木墙(1HP,4 种朝向)
- 单墙和三连墙建造
- 金币吸引收取机制
- 农田建造和产出机制(20 秒周期)
- 主城建造
- 白球弹跳系统:边界/障碍物/墙/主城/农田/玩家碰撞
- 出生区(中心 6×6)
- 三画布布局:左画布信息 + 主画布地图 + 右画布预留
- 60fps 游戏循环(requestAnimationFrame)
回到顶部