private static bool DamageWasAlreadyCalculated(ShotMemoKey key, out float variantDamage) { if (!WeaponDamageMemo.ContainsKey(key)) { variantDamage = -1f; Logger.Debug($"key was not found: {key.weaponEffectId} / {key.hitIndex}"); return(false); } // compute once per shot arrggghghhh why didn't the game designers just do this? // computers are fast at math but it's already in memory. Logger.Debug($"variant damage key found: {key.weaponEffectId} / {key.hitIndex}"); variantDamage = WeaponDamageMemo[key]; return(true); }
private static ShotMemoKey ShotMemoKey(WeaponEffect weaponEffect) { var hitIndex = Traverse.Create(weaponEffect).Field("hitIndex").GetValue <int>(); var weaponEffectId = weaponEffect.GetInstanceID(); Logger.Debug($"shotmemokey weaponeffectid: {weaponEffectId}"); if (weaponEffect is BulletEffect bulletEffect) { weaponEffectId = Traverse.Create(bulletEffect).Field("parentLauncher").GetValue <BallisticEffect>() .GetInstanceID(); Logger.Debug($"shotmemokey bullet weaponeffectid: {weaponEffectId}"); } var key = new ShotMemoKey(weaponEffectId, hitIndex); return(key); }
private static bool IsNonVariantWeapon(ShotMemoKey key, Weapon weapon, out int damageVariance, out float normalDamage) { // we reach for weapondef because Weapon.DamageVariance always returns 0. Really. damageVariance = weapon.weaponDef.DamageVariance; if (damageVariance != 0) { Logger.Debug($"variance: {key.weaponEffectId} / {key.hitIndex}"); normalDamage = -1f; return(false); } WeaponDamageMemo[key] = weapon.DamagePerShotAdjusted(weapon.parent.occupiedDesignMask); Logger.Debug($"no variance: {key.weaponEffectId} / {key.hitIndex}"); { normalDamage = WeaponDamageMemo[key]; return(true); } }