summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan <>2015-11-10 00:13:23 +0100
committerJan <>2015-11-10 00:13:23 +0100
commit378a033d2d2b12b20670764335476786ad8532f8 (patch)
tree9bf453689aa0f820eece59dfc60729de7374b491
parentf0c0ccb928064679c3752d847bc547b6db87f229 (diff)
downloadtempelschubsen-378a033d2d2b12b20670764335476786ad8532f8.tar.gz
tempelschubsen-378a033d2d2b12b20670764335476786ad8532f8.zip
Heal the clonk or remove a negative effect when holding a goblet
-rw-r--r--TemplePushing.c4s/System.c4g/Goblet.c74
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
+}