diff options
| -rw-r--r-- | TemplePushing.c4s/System.c4g/Goblet.c | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/TemplePushing.c4s/System.c4g/Goblet.c b/TemplePushing.c4s/System.c4g/Goblet.c index 0f9506f..b665574 100644 --- a/TemplePushing.c4s/System.c4g/Goblet.c +++ b/TemplePushing.c4s/System.c4g/Goblet.c @@ -4,14 +4,86 @@ #appendto GBLT +local energyLeft; + +public func Initialize() +{ + energyLeft = 100; + return _inherited(); +} + +/* If a clonk holds the goblet and it has more than 50% energy left, a bad effect is removed (if present). + * If less than 50% energy is left or no negative effects are present, the clonk gets healed. */ private func FillCheck() { var ret = _inherited(); + if (iTimer >= 5) { var clonk = Contained(); - if (clonk && clonk->GetOCF() & OCF_CrewMember) clonk->DoEnergy(10); + if (clonk && clonk->GetOCF() & OCF_CrewMember) + { + // Remove bad effect if present + if (energyLeft >= 50 && RemoveBadEffect(clonk)) + { + energyLeft -= 50; + } + else // Transfer 10 energy points from goblet to clonk + { + var maxEnergy = clonk->GetPhysical("Energy") / 1000; + var doEnergy = Min(maxEnergy - clonk->GetEnergy(), Min(10, energyLeft)); + clonk->DoEnergy(doEnergy); + energyLeft -= doEnergy; + } + + if (energyLeft == 0) SetEmpty(); + } iTimer = 0; } return ret; } + +private func RemoveBadEffect(object clonk) +{ + // Unfreeze clonk if frozen + if (Frozen(clonk)) Unfreeze(clonk); + + // Extinguish clonk if on fire + if (clonk->OnFire()) + { + clonk->Extinguish(); + return true; + } + + // Remove a curse if at least one is present + if (RemoveAnyEffect("*Curse*", clonk)) return true; + + // Remove plague effect if present + if (RemoveAnyEffect("Poison", clonk)) return true; + + // Remove a negative spell if at least one is present + if (RemoveAnyEffect("*NSpell", clonk)) return true; + + // Fail there is no bad effect to remove + return false; +} + +private func RemoveAnyEffect(string name, object target) +{ + // Create an array of effect numbers matching name and target + var effectNumbers = []; + for (var i = 0; i < GetEffectCount(); ++i) + { + var effectNumber = GetEffect(name, target, i); + if (effectNumber == 0) break; + effectNumbers[GetLength(effectNumbers)] = effectNumber; + } + + // Fail if no effects were found + if (GetLength(effectNumbers) == 0) return false; + + // Randomly select an effect to remove + RemoveEffect(0, target, Random(effectNumbers)); + + return true; // Success +} |
