summaryrefslogtreecommitdiffstats
path: root/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Script.c
blob: 130af16ee6dfe914c1dc5ee75d58da3f2943feb4 (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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* Zurückwerfen */

#strict 2

func Activate(pCaster,pRealcaster)
{
	var pClonk=pRealcaster;
	if(!pClonk) pClonk=pCaster;

	// Auswählen wenn möglich
	var comDir = pClonk->GetComDir();
	var selector;
	if ((selector = pClonk->~DoSpellSelect(this,300,pCaster)) && selector->CountTargets() > 1) return 1;
	if (selector) RemoveObject(selector);
	pClonk->SetComDir(comDir);

	// Clonk kann nicht auswählen: Clonk bekommst selbst ein Schild
	if (SelectorTarget(pClonk))
		return ActivateTarget(pClonk, pClonk);

	// ansonsten geth nich
	RemoveObject();
	return 0;
}

public func ActivateTarget(object pCaller, object pTarget)
{
	// Effekt geben
	AddEffect("DeflectionPSpell",pTarget,250,1,0,GetID());
	// Objekt löschen
	return RemoveObject();
}

public func SelectorTarget(object pTarget)
{
	// nur außerhalb von Gebäuden
	if(Contained(pTarget)) return;
	// muss ein Mannschaftsmitglied sein
	if(!(GetOCF(pTarget)&OCF_CrewMember)) return;
	// muss verbündet sein oder NTMG muss aktiviert sein
	if(Hostile(GetOwner(),GetOwner(pTarget)) && !ObjectCount(NTMG)) return;
	// sichtbar
	if(!Visible(GetOwner(),pTarget)) return;
	return 1;
}

func FxDeflectionPSpellStart(pClonk, iEffectNumber, iTemp)
{
	if(iTemp) return;
	// Zeit setzen
	EffectVar(0,pClonk,iEffectNumber)+=720;
}

func FxDeflectionPSpellTimer(pClonk, iEffectNumber, iEffectTime)
{
	// Zeit um
	if(!EffectVar(0,pClonk,iEffectNumber)--) return -1;
	// Nicht in Gebäuden
	if(Contained(pClonk)) return;
	var x = GetX(pClonk), y = GetY(pClonk), xdir = GetXDir(pClonk), ydir = GetYDir(pClonk);
	x = x + xdir/10;
	y = y + ydir/10;
	//Funken an der benötigten Stelle
	for(var pObj in FindObjects(Find_OCF(OCF_HitSpeed1),Find_Layer(GetObjectLayer()), Find_NoContainer(), Find_Category(C4D_Object), Find_Distance(200, GetX(pClonk), GetY(pClonk)), Find_Not(Find_Distance(11, GetX(pClonk), GetY(pClonk)))))
	{
		// Wenn das Objekt auf den Clonk zufliegt
		if( (GetXDir(pObj)<GetXDir(pClonk)) == (GetX(pObj)>GetX(pClonk)) || (GetYDir(pObj)<GetYDir(pClonk)) == (GetY(pObj)>GetY(pClonk)))
		{
			var ox = GetX(pObj), oy = GetY(pObj), oxdir = GetXDir(pObj), oydir = GetYDir(pObj);
			ox = ox + oxdir/10;
			oy = oy + oydir/10;

			if(ObjectDistance(pClonk, pObj) > 21 && Distance(x, y, ox, oy) > 21) continue;

			// Eigenen Stab ignorieren
			if(GetEffect("StaffFlight", pObj))
				if(EffectVar(0, pObj, GetEffect("StaffFlight", pObj))==pClonk)
					continue;

			var objDirAngle = Angle180(Angle(0, 0, GetXDir(pObj), GetYDir(pObj)));
			var objShieldAngle = Angle180(Angle(GetX(pClonk), GetY(pClonk), GetX(pObj), GetY(pObj)));
			var diffAngle = Angle180((objShieldAngle - objDirAngle) - 180);
			var exitAngle = objShieldAngle + diffAngle;
			var diffSpeed = Distance(GetXDir(pClonk), GetYDir(pClonk), GetXDir(pObj), GetYDir(pObj));

			if (Abs(diffAngle) > 90) continue;

			SetSpeed(Sin(exitAngle, diffSpeed),-Cos(exitAngle, diffSpeed), pObj);

			CreateParticle("NoGravSpark", AbsX(GetX(pObj)), AbsY(GetY(pObj)), 0, 0, 80, RGB(80,50,50));
			if(!GetEffect("IntDeflected", pObj))
				EffectVar(0,pClonk,iEffectNumber) = Max(EffectVar(0,pClonk,iEffectNumber)-80,0);
			AddEffect("IntDeflected", pObj, 1, 20);
			Sound("Rip", 0, pObj);
		}
	}
	// Partikel Kreiseffekt
	if(iEffectTime % 4) return;
	var iAngle = (iEffectTime*10) % 360;
	var px= Sin(iAngle, 15);
	var py= Cos(iAngle, 15);
	CreateParticle("NoGravSpark", px+GetX(pClonk), py+GetY(pClonk), 0, 0, 50, RGB(50,80,50), pClonk);
	CreateParticle("NoGravSpark",-py+GetX(pClonk), px+GetY(pClonk), 0, 0, 50, RGB(50,50,80), pClonk);
	CreateParticle("NoGravSpark",-px+GetX(pClonk),-py+GetY(pClonk), 0, 0, 50, RGB(50,80,50), pClonk);
	CreateParticle("NoGravSpark", py+GetX(pClonk),-px+GetY(pClonk), 0, 0, 50, RGB(50,50,80), pClonk);
	return 1;
}

private func FxDeflectionPSpellEffect(string szNewEffectName, object pTarget, int iNumber) 
{ 
	// Andere Effekte aufnehmen
	if(szNewEffectName == "DeflectionPSpell")
	{
		return -2;
	}
}

private func FxDeflectionPSpellAdd(object pTarget, int iNumber, string szNewEffectName, int iNewEffectTimer, int iChange0, int iChange1, int iChange2, int iTime) {
	// Effekt übernehmen
	EffectVar(0,pTarget,iNumber) += 360;
}

protected func FxDeflectionPSpellInfo() { return "{{MDFL}} $SpellInfo$"; }

/* Zaubercombo */

public func GetSpellStaff() { return SMAR; }
public func GetSpellStaffCombo() { return ("56"); } // (1: Backward; 2: Down; 3: Forward; 4: Throw; 5: Jump; 6: Dig)