因为孙悟空看到了牛魔王!
牛魔王的日子太自在了,一妻一妾,儿子法力高强。独霸一方,朋友遍天下,到处都有人请吃饭。家资富足,日子逍遥。
牛魔王的状态给孙悟空提供了另外一种可能性。如果满天神佛容得下牛魔王,那么孙悟空是不是也可以这样呢?
所以牛魔王属于是灰色地带的黑社会,平日里过得跟神仙一样甚至比神仙还滋润,说不准还时不时跟哪个神仙喝喝酒,扯扯淡。但是他是没编制的,是不被体制承认的。体制有什么大计划也不会跟牛魔王说。譬如取经吧!沙和尚吃了九个取经人,牛魔王得罪一下唐僧按理说真心不算啥事儿。不就是取经人嘛,谁没吃过几个?
可问题是他不知道这个取经人是上面真的要保的!他更不知道,玉帝和佛祖为了防止找麻烦的猴子半路跑回花果山逍遥去,一定要收服老牛。只有这样才能杀鸡儆猴,告诉孙悟空,如果你想逃,就算你逃得了500年逍遥,早晚还是会被收的。儿子,老婆,手下,朋友,通通化为乌有。而且只能做个底层奴隶,苟延残喘。
很多时候无关于你犯错犯了多大,只有关于你在什么情况下犯错!
把buff机制做成一个图(graph)。
每个buff是一个节点,每个状态也是一个节点。
现在无敌状态受两种状态影响(A、C),那么A、C各有一条边指向无敌状态。
无敌状态判定时,遍历所有输入节点(也就是A、C),有一个buff生效就生效。A、C如果也有自己的状态依赖,那就进行深度遍历依次判定。
如果存在“覆盖”,比如例子中b buff覆盖a buff,那么B有一条边指向A,判定时B的优先级比A高。A取消了,B还在生效。
整个graph必须是个有向无圈图(DAG),有圈说明循环依赖,判定时会宕机(halting)。
DAG可以进行拓扑排序,排完序后就是个一维数组,每帧可以按照这个优先级进行判定,省去了深度遍历的消耗,实现更简单。
不建议手动给状态排优先级,维护起来费劲。