外观
D14 · 神话石直购货币由点券改为福利点券
本轮来源:2026-09-22 策划报障「点券直购神话石买不了」。核对结论是设定问题(点券无获取途径), 非扣减/发货逻辑缺陷;按策划指示「改成福利点券,商城其他道具也是消耗福利点券」落地为 docs/65。
1. 差异现象
- 现象:商城「打金兑换」页的「点券直购神话石」入口,点击购买恒失败,前端弹「点券不足」,重复点击同样失败。
- 线上实例(
y0520=player 10):2026-09-22 02:50–02:51 连续 4 次POST /api/shop/mythic-stone/buy(02:50:50 / 02:50:52 / 02:51:01 / 02:51:05),全部落到BusinessException(7023, "点券不足"), 零成功、零发石。 - 设定站旧口径:
settings/monetization/shop.md货币表写「点券 | 充值货币 | 充值获得 | 点券直购神话石(200/颗,不限购)」—— 货币来源写的是「充值获得」,而充值通道不存在,与代码实际可达状态矛盾。
2. 代码事实(文件:行号 + 数值)
数据库侧(生产库 emberfall,2026-09-23 实测)
sql
SELECT COUNT(*), SUM(credit), MIN(credit), MAX(credit) FROM player;
-- 27 | 0 | 0 | 0 ← 27 个角色点券全为 0
SELECT COUNT(DISTINCT player_id), SUM(quantity) FROM inventory_item WHERE item_id = 4001;
-- 8 | 685908 ← 福利点券有大量存量(对照)1
2
3
4
2
3
4
代码侧(点券无生产者)
emberfall-server/src/main/java/com/emberfall/domain/Player.java:27private int credit;- 同文件
:43this.credit = 0;(新建角色) - 同文件
:67this.credit = credit;(Player(Row)建库读入) - 同文件
:109getCredit()(只读) - 同文件
:132setCredit(int)—— 全库零调用(改造前唯一的外部写入方是下面这个方法,且它只扣不加) emberfall-server/src/main/java/com/emberfall/repository/GameRepository.java(改造前)deductCreditIfEnough—— 点券的唯一扣减入口,本次已删除
改造前购买链路(service/ShopService.java:336 buyMythicStoneWithPoints)
- 余额:
gameRepository.getItemQuantity(playerId, ...)之外另走点券校验 - 扣减:
deductCreditIfEnough返回 false →BusinessException(7023, "点券不足") - 数额恒为 0 → 该分支必然触发,逻辑正确但永远走不到发货
设定侧依据
docs/64_氪金礼包体系重设计_冠名满档3000.md§0:「本项目没有线上充值功能,全部付费走『运营线下收款 → 后台发放 → 玩家游戏内使用道具』」, 后台发放的是 VIP 充值券 / 卡类 / 基金 / 补偿道具,不含点券。
三层证据闭合:不能加(代码无生产者)→ 没人有(DB 全 0)→ 也不该有(无充值通道)。
3. 旧文档说法
emberfall-docs/docs/settings/monetization/shop.md§2/§3.3/§3.4/§6:200 点券/颗,不限购、货币表「点券 → 点券直购神话石」。emberfall-docs/docs/settings/codex/economy.md:点券「花在哪:月卡/终身卡/冠名卡;神话石(200 点券/颗)」、「每日上限:点券直购神话石不限购」;兑换关系图DQ[点券] -->|"200/颗 · 不限购"| SHS。emberfall-docs/docs/settings/codex/items.md/limits.md/settings/guide/money-overview.md/settings/dungeon/gold-dungeon.md:同口径的「200 点券/颗」「点券直购不限购」「点券神话石」。emberfall-docs/docs/tech/implementations/monetonization/shop.md§3/§5:MYTHIC_STONE_POINT_PRICE、buyMythicStoneWithPoints、d08的「200 点券/颗」。docs/50§7、docs/51§4.3/§5、docs/64§2.3/附录 A:同口径。
4. 影响范围
- 玩家影响:零——该出口历史成交量为 0,不存在「原本能买、现在不能买」的回退;修复后所有持有福利点券的玩家立即可用 (线上最高单人持有 451,954 福利点券 ≈ 2,259 颗)。
- 经济影响:神话石新增一条免费货币通道。200 福利点券/颗 ≈ 每日签到 1,000 的 1/5(约 5 颗/天), 不限购意味着满勤可稳定换石。总量由 docs/51 §3 双曲渐近兜底(免费满勤 300 日 ≈ +406%,远低于 +1000% 上限)。 价格 200/颗与不限购本次未改(最小改动,仅换货币);若策划要求保持稀缺度需另行调价或恢复日限(docs/65 §4.2/§9 已标注待确认)。
- 契约影响:
POST /api/shop/mythic-stone/buyURL 与MythicStoneBuyRequest不变,仅内部方法名与两个 DTO 字段名变更; 前端已同步(gameApi.buyMythicStoneWithWelfareTicket)。
5. 处理结论
GoldExchangeRules.MYTHIC_STONE_POINT_PRICE→MYTHIC_STONE_WELFARE_TICKET_PRICE = 200(价格不变); 随 docs/50 §7 取消限购而已废弃的POINT_MYTHIC_STONE_DAILY_LIMIT*三常量一并删除。ShopService.buyMythicStoneWithPoints→buyMythicStoneWithWelfareTicket:余额与扣减改consumeItem(playerId, ShopBalanceRules.WELFARE_TICKET_ID, totalCost)(与打金兑换/福利点券货架同一范式), 失败抛BusinessException(7023, "福利点券不足");goldExchangeList()展示余额同步换口径。- 删除死方法
GameRepository.deductCreditIfEnough。 - DTO:
creditBalance→welfareTicketBalance、pointMythicStoneInfo→mythicStoneInfo; Controller 方法改名,URL 不变。 - 回归测试:
ShopServiceGoldExchangeTest新增「成功扣券发石」与「余额不足 7023 不发石」两例;GoldExchangeRulesRebalanceTest价格断言 200 维持。 - 文档同步:
docs/65(新建)+docs/50 §7/docs/51/docs/64加取代提示, 设定站 6 个页面按「福利点券」口径修订并挂<DiffNote id="d14" />。 - 遗留:点券货币整体待裁决——本项目无充值通道,
player.credit长期挂空; 建议后续要么走 docs/64 的运营发放模式接入,要么从设定中下线该货币。Player.credit字段保留(不动表结构)。