Files
gplan-2/game/core/damage_math.gd
T

48 lines
2.8 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## VERTICAL SLICE - NOT FOR PRODUCTION
## 战斗伤害公式族:零状态纯算术 static 函数(垂直切片验证:伤害公式单点可验算)。
## 只做算术不读任何状态——池值/表值/阈值全由调用方传入(池值须先 clamp);公式内零字面量调参。
class_name DamageMath
extends RefCounted
# F2 乘区(池值已由调用方 clamp 后传入):池内加算 → 池间乘算 → floor(单一取整规则)
static func pool_damage(d_raw: int, p_hero: int, p_enemy: int) -> int:
var v: int = int(floor(float(d_raw) * (100.0 + float(p_hero)) * (100.0 + float(p_enemy)) / 10000.0))
return maxi(0, v)
# 充能分量:充能点数(调用方已按奖励定义换算)+ 克制修正点数(加法核);
# 空桶(点数 ≤ 0)不吃修正恒 0——零充能分量无伤害可修正,不产生负贡献;
# 空桶不受 landed_floor 影响——没有伤害落地就没有下限可言。
# 类型化点数分量:点数 + 克制修正(加法核)——唯一消费方 = 奖励直伤道具(棋盘火力)
# landed_floor:落地伤害全局下限(读 settlement.damage_floor,调用方传入)——
# 「任何伤害落地取值域 [1,+∞)」:克制修正后触底也保底 1,调参降档不可能打出 0/负伤害
static func counter_component(points: int, counter_delta: int, landed_floor: int = 0) -> int:
if points <= 0:
return 0
return maxi(landed_floor, points + counter_delta)
# ---- 护甲等级掷点(判定式与档位参数全在 settlement.tres,本类只做算术)----
# 掷点折扣查档(纯函数):掷点 ≥ 阈值 → 100 全额;低掷按缺口(阈值 − 掷点)查升序边界落档,
# 返回档位值 percent(档数 = 边界数 + 1:缺口 ∈ [1, bounds[0]] → discounts[0],(bounds[i], bounds[i+1]] →
# discounts[i+1],> bounds 末值 → discounts 末位——档位不设零档,非归零)。nat 最大面的"恒全额"由调用方先行分支。
static func roll_discount_percent(roll: int, threshold: int, bounds: Array, discounts: Array) -> int:
if roll >= threshold:
return 100
var tier := 0
for i in bounds.size():
if threshold - roll > int(bounds[i]):
tier = i + 1
return int(discounts[tier])
# 吃掷点分量算术(纯函数):基线值 × 掷点折扣 ×(暴击时)暴击倍率 → floor 后 + 克制修正点数(加法核)(单一取整;
# 乘法交换——折扣/暴击次序无关,克制修正为整数点数加在 floor 之后,取整链保持现登记:每分量恰一次 floor)。暴击恒全额由 discount=100 承载。
static func rolled_component(base_value: float, discount_percent: int, crit: bool, crit_multiplier: int, counter_delta: int) -> int:
var v: float = base_value * float(discount_percent) / 100.0
if crit:
v *= float(crit_multiplier) / 100.0
return int(floor(v)) + counter_delta