XP 接收、等级修正与主从转发

后续:声望接收与FameGate升阶规则已补声望接收核;正式余额和死亡事务仍继续。

本批完成可执行接收核及原版对照;正式角色余额/声望接收器和完整死亡事务仍未绑定,不代表全部武器已经完成。

入账之前

52F970先检查+0x7D6阻止标志;状态5/6只拒绝正金额,0和负金额不因此被拒绝。

未设bypass时:

text
bonus = clamp(stat68, -100, 100),按原float存储
amount = int32(amount + ftol2(ceil(f64(bonus * 0.01f * amount))))

之后才考虑分享、统计和父子路由。−100%的负加成使用ceil,小额正奖励仍可能剩1,不可硬改成0。

victim存在且floor(HP)<=0、接收者为本地权威PLAYER时递增统计6;冠军再递增7。0 XP也会到达这一段,甚至HP=0.5也满足floor条件。

子单位先收到金额(bypass=true、share=true);有master且不是bypass时,金额转给master(bypass=false、share=true),不写自己的余额。

自己入账

有victim时计算:

text
difference = f32(int32(victimLevel - receiverLevel))
applied = ftol2(LEVEL_VERSUS_LEVEL_EXPERIENCE_MODIFIER(difference) * 0.01f * amount)

等级差用的是victim减receiver。该步在本单位加成和转发之后;不能把已经做过本单位等级差修正的值再传给子单位。

余额+0x594按原32位加法累加,正增量回绕时饱和int.MaxValue;普通路径日志之后才把负余额夹到0。饱和路径跳过日志。

玩家包装层

5B4350调用基础接收器后,仍使用原始金额:负值可写保存记录+0xB4;victim存在且本地权威、保存记录存在时,6BD4E0接收victim、原始金额及当时victim的fame池。

基础接收器拒绝/缩放/分享/转发,并不意味着包装层也跳过,或应改传最终入账增量。因此零金额奖励调用不能随意删除。

分享与验证边界

分享先用XPSHARING(附近人数+1)修改金额,再按玩家列表检查;距离要求严格小于分配范围。本地分享调用传victim=null、bypass=false、share=false;远程发送前可能进行等级差修正。

本批保留这些路径的代码和受控单元测试,但机器码oracle把分享会话门设为false,不宣称完整联机/几何分支已验证

原完整52F970/5B4350及84A7F0 SSE2路径共960组(三精度),余额、保存记录、统计、日志分支、主从调用参数一致。图表、关系和虚函数等是明确边界。

1549条核心断言、321项相关Python回归及Godot C#构建通过。正式持久余额、声望/等级推进、奖励池和死亡事务的接线仍待完成,TYPE52准入未开放。