SL操作

游戏中的概率事件与Save/Load操作的原理

游戏中的概率事件与 Save/Load 操作的原理

战斗场景中的概率事件是通过伪随机数产生器(C# System.Random)产生的。
每次进入战斗时,服务端会下发一个 seed,客户端会用该 seed 来初始化随机数产生器。
这样,从 Random 中取到的随机数就是一个固定的序列了。
关掉游戏重新打开后,Random 仍然会用该 seed 和产生次数来恢复现场,所以随机事件仍然不会被改变。

想要改变随机事件,则必须改变触发随机数的事件的次数。这样的事件有:

AI的随机行为(AI从某些策略中按权重随机选择、从对面随机选择目标、随机选择技能等)
Buff生效判定(大部分 Buff 有生效概率)
洗牌(玩家指令卡洗牌、战斗中的从者洗牌等)
攻击时,暴击星掉落数随机
攻击时,是否暴击
使用技能时,成功概率判定(例如强化成功率、XX抗性等)
即死判定
其他需要随机性判定的事件

结论:
想要"改变世界线",就必须执行和之前不一样的操作,增加或减少随机数产生的次数。
例如,保持和之前相同的操作,但多释放一个需要概率判定的技能或宝具;


注1:

绝大多数宝具和技能的Buff都会进行概率判定,比如概率性的眩晕,而加攻加防、减攻减防等等没有说明概率的都是默认成功率100%,同样需要进行概率判定。
不进行判定的只有宝具的攻击部分、直接回复HP、直接获得NP、直接获得星星、解除弱体和强化等等。
一言以蔽之,只要会在目标身上留下效果图标(如加攻图标、技能封印图标等),就都经过了概率判定。
注1:
这里有个特例,即概率性的战斗续行(例如某些 Buff 会让从者死亡后有 50% 概率重生)。
这个判定用的是一个单独的 Random,与上面的那些操作相互独立。
即:如果我的一个从者有概率性的战斗续行 Buff,这次死亡后 Buff 判定失败;
如果我想通过 Save/Load 改变这个事件,只有增加一个新的战斗续行 Buff 判定,这种操作很难达成。

注2:
抽卡、物品掉落、抽奖池这些事件是在服务端生成的,与客户端无关。

注3:
进入战斗时,服务端也会下发一个 flag,允许客户端开启战斗日志功能。
开启后,战斗过程中玩家的各种操作都会被记录,并在战斗结束时发回服务端。
由于最初的 seed 也是服务端下发的,所以对于服务端来说,所有事件都是已知的,
这样服务端就可以通过 seed 和 log 来追溯玩家的全部行为,以此来完成反作弊等工作。
通常这个 flag 是关闭的。


    • 最新评论
    • 热门评论

用户评论 (0)


  • 沙发空缺

热门排行

  • 伤害计算

  • 抽卡展示

  • NP获取

  • SL操作

  • 星星分配

  • 技能与BUFF

  • 宝具效果

  • 星星发生

  • Overkill判定