summaryrefslogtreecommitdiffstats
path: root/TemplePushing.c4s/System.c4g/Goblet.c
blob: a083d8c92fd0b497be2f35221a2d603b03ad980f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*-- Add unique Goblet mechanics --*/

#strict 2

#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)
		{
			// 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);
		return true;
	}

	// 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, "!CAHE->FxCurseIsActive")) 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 if there is no bad effect to remove
	return false;
}

private func RemoveAnyEffect(string name, object target, string checkCall)
{
	// Create an array of effect numbers matching name and target
	var effectNumbers = [];
	for (var i = 0; i < GetEffectCount(name, target); ++i)
	{
		var effectNumber = GetEffect(name, target, i);
		if (effectNumber == 0) break;
		if (checkCall && eval(Format("%s(Object(%d), %d)", checkCall, ObjectNumber(target), effectNumber))) continue;
		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, effectNumbers[Random(GetLength(effectNumbers))]);

	return true; // Success
}