summaryrefslogtreecommitdiffstats
path: root/TemplePushing.c4s/System.c4g/Frostwave.c
blob: dbf3c2b1ab84f3f7fb9fead7d61ab7d0a1bb8809 (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
/*-- Allow custom radius for Frostwave spells --*/
 
#strict 2
 
#appendto MFWV
 
local maxRadius;
 
protected func Initialize()
{
        maxRadius = 90;
}
 
func Activate(object caster, object realcaster)
{
        if (realcaster) caster = realcaster;
 
        if (AddEffect("FrostwaveNSpell", this, 130, 1, this, 0, caster, maxRadius) <= 0)
        {
                RemoveObject();
                return 1;
        }
 
        Sound("MgWind*");
        return 1;
}
 
func FxFrostwaveNSpellStart(object target, int number, int temp, object caster, int maxRadius)
{
        if (temp) return;
 
        // Initial radius
        EffectVar(1, target, number) = 20;
 
        // Position
        EffectVar(2, target, number) = caster->GetX();
        EffectVar(3, target, number) = caster->GetY();
 
        // Caster
        EffectVar(4, target, number) = caster;
        EffectVar(6, target, number) = caster->GetController();
 
        // Maximum radius
        EffectVar(7, target, number) = maxRadius;
 
        // Combo
        var combo = caster->FindContents(ICE1);
        if (combo)
        {
                EffectVar(5, target, number) = true;
                combo->RemoveObject();
        }
 
        return 1;
}
 
func FxFrostwaveNSpellTimer(object target, int number, int time)
{
        var radius = EffectVar(1, target, number);
 
        // Remove if maximum radius is reached
        if (radius >= EffectVar(7, target, number)) return -1;
 
        // Position
        var absX = EffectVar(2, target, number), relX = AbsX(absX);
        var absY = EffectVar(3, target, number), relY = AbsY(absY);
 
        // Combo?
        var searchOCF = OCF_Alive;
        if (EffectVar(5, target, number)) searchOCF |= OCF_Collectible;
 
        // Effects!
        CreateParticle("FrostWave", relX, relY, RandomX(-1, 1), RandomX(-1, 1), 400 + 10 * radius, RGB(255, 255, 255));
 
        // Fling enemies
        var caster = EffectVar(4, target, number);
        for (var obj in FindObjects(
                Find_Distance(radius + 5, relX, relY), Find_Not(Find_Distance(radius - 5)),
                Find_OCF(searchOCF), Find_NoContainer(), Find_Not(caster)))
        {
                var angle = Angle(absX, absY, obj->GetX(), obj->GetY());
                obj->SetKiller(EffectVar(6, target, number));
                Fling(obj, Sin(angle, 80) / 9, -Cos(angle, 80) / 9);
                if (!Frozen(obj)) Freeze(obj, caster);
        }
 
        // Increase radius
        EffectVar(1, target, number) += 8;
 
        return 1;
}
 
/* Zaubercombo */
 
public func GetSpellClass() { return WATR; }
public func GetSpellCombo() { return "335"; } // (1: Backward; 2: Down; 3: Forward; 4: Throw; 5: Jump; 6: Dig)
 
/* Custom radius */
public func SetMaxRadius(int radius) { maxRadius = radius; }