private void AddEffectToBlock(MyCubeBlock block) { foreach (var upgrade in m_upgrades) { float valFloat; double val; if (block.UpgradeValues.TryGetValue(upgrade.UpgradeType, out valFloat)) { val = valFloat; if (upgrade.ModifierType == MyUpgradeModifierType.Additive) { val += upgrade.Modifier; } else { val *= upgrade.Modifier; } block.UpgradeValues[upgrade.UpgradeType] = (float)val; } } block.CommitUpgradeValues(); }
private void RemoveEffectFromBlock(MyCubeBlock block) { foreach (var upgrade in m_upgrades) { float valFloat; double val; if (block.UpgradeValues.TryGetValue(upgrade.UpgradeType, out valFloat)) { val = valFloat; if (upgrade.ModifierType == MyUpgradeModifierType.Additive) { val -= upgrade.Modifier; if (val < 0f) { val = 0f; Debug.Fail("Additive modifier cannot be negative!"); } } else { val /= upgrade.Modifier; if (val < 1f) { //GR: this is caused due to numerical overflow of floats (max 7 digits for float) //Did the multiplications of val with double and then save to float //Still there are numerical incosistencies because of storing to float so compare within very small threshold if( (val + 1e-7) < 1f) Debug.Fail("Multiplicative modifier cannot be < 1.0f!"); val = 1f; } } block.UpgradeValues[upgrade.UpgradeType] = (float)val; } } block.CommitUpgradeValues(); }