summaryrefslogtreecommitdiffstats
path: root/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Script.c
blob: a0e965c3e228f3ad2a0aece8b6925cc2538ec812 (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
/*-- Teleport --*/

#strict 2

func Range() { return 225; }

protected func Activate(object pCaster, object pRealCaster)
{
	// Effekt erzeugen
	if (!pRealCaster) pRealCaster = pCaster;

	var target = FindObject2(Find_Distance(Range()), Find_OCF(OCF_CrewMember), Find_Hostile(GetOwner(pRealCaster)), Sort_Distance());
	if (!target) return 0;

	var preferredDir = (GetXDir(target) / Abs(GetXDir(target))) || -1 * (GetDir(target) || -1);

	var solid = false;
	var deltax;
	var deltay;
	for (deltax = 8; (GetX(target) + deltax < LandscapeWidth() || GetX(target) - deltax > 0) && !solid; deltax += 10)
	{
		for (deltay = 10; GetY(target) + deltay < LandscapeHeight() && deltay < Range() && !solid; deltay += 10)
		{
			if (target->GBackSolid(preferredDir * deltax + 1, deltay) && target->GBackSolid(preferredDir * deltax - 1, deltay)) solid = preferredDir;
			else if (target->GBackSolid(-preferredDir * deltax + 1, deltay) && target->GBackSolid(-preferredDir * deltax - 1, deltay)) solid = -preferredDir;
			if (solid) break;
		}
		if (solid) break;
	}

	if (!solid) return 0;

	var oldx = GetX(pRealCaster);
	var oldy = GetY(pRealCaster);

	var dir = -1;
	if (GetDir(target) == DIR_Left) dir = 1;

	if (GetProcedure(pRealCaster) == "SCALE") pRealCaster->SetAction("Jump");

	SetSpeed(0, 0, pRealCaster);
	SetPosition(GetX(target) + deltax * solid, GetY(target) + deltay, pRealCaster);
	while (pRealCaster->Stuck()) SetPosition(GetX(pRealCaster), GetY(pRealCaster) - 1, pRealCaster);
	pRealCaster->SetDir(GetX(target) > GetX(pRealCaster));
	pRealCaster->SetComDir(COMD_Up);

	for (var cnt = 0; cnt < 5; cnt++)
	{
		CreateParticle("PSpark", AbsX(oldx + RandomX(-5, 5)), AbsY(oldy + RandomX(-10, 10)), 0, 0, 150, GetColorDw(pRealCaster));
		CreateParticle("PSpark", AbsX(GetX(pRealCaster) + RandomX(-5, 5)), AbsY(GetY(pRealCaster) + RandomX(-10, 10)), 0, 0, 150, GetColorDw(pRealCaster));
	}

	Sound("Scream");
	return RemoveObject();
}


func FxScheduledRemoveStop(target, effect, reason, temp)
{
	if (temp) return;
	if (!target) return;
	target->RemoveObject();
}

/* Zaubercombo */

public func GetSpellClass(object pMage) { return(AIR1); }
public func GetSpellCombo(pMage) { return ("222"); } // (1: Backward; 2: Down; 3: Forward; 4: Throw; 5: Jump; 6: Dig)