summaryrefslogtreecommitdiffstats
path: root/TemplePushing.c4s/System.c4g/IceBall.c
blob: ba11967efc03a3f78f371d70d0259d8e26a7d0d3 (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
/*-- Iceball --*/

#strict 2

#appendto ICEB

public func ControlLeft() {}

public func ControlRight() {}

// Die restlichen Tasten mit Stop belegen, damit Klassisch auch gerade fliegen kann
public func ControlDig() {}

public func ControlUp() {}

public func ControlDown() {}

// Bei JnR wenn die Taste losgelassen wird auch keine Drehung mehr
public func ControlLeftReleased() {}

public func ControlRightReleased() {}

// Werfen löst den Eisschlag aus
public func ControlThrow() {}

func FxIceStrikeFlightTimer(pTarget, iEffectNumber, iEffectTime)
  {
  var iSize=EffectVar(0, pTarget, iEffectNumber);
  var iMaxSize=EffectVar(1, pTarget, iEffectNumber);
  var iAngle=EffectVar(2, pTarget, iEffectNumber)+=EffectVar(5, pTarget, iEffectNumber);
  var iLaunchFree=EffectVar(3, pTarget, iEffectNumber);
  var pCaster = EffectVar(4, pTarget, iEffectNumber);
  if(iSize<=0) return(RemoveObject());
  
  // Effekt
  for( var i=1; i>0; --i)
    {
    CreateParticle("NoGravSpark",RandomX(-iSize/50,iSize/50), RandomX(-iSize/50,iSize/50), +RandomX(-2,2), +RandomX(-2,2), iSize*60/100+Random(15), RGB(10,RandomX(40,140),RandomX(250, 100)));  
    CreateParticle("Freeze",RandomX(-iSize/50,iSize/50), RandomX(-iSize/50,iSize/50), +RandomX(-2,2), +RandomX(-2,2), iSize*60/100+Random(15), RGB(10,RandomX(250,100),RandomX(40,140)));  
    }
	
  // Ausrichtung nach Caster
  if (!iLaunchFree && pCaster)
    {
      if(iEffectTime > 180)
      {
        var aimer = LocalN("pAimer", pCaster) || LocalN("pAimer", LocalN("pAimingClonk", pCaster));
        if(aimer)
        {
          aimer->ControlThrow();
        }
        return Hit();
      }
      else
      {
        var x=GetX(pCaster)+Sin(iAngle, 25), y=GetY(pCaster)-Cos(iAngle, 25);
        if (GetX()!=x || GetY()!=y)
          {
          DrawParticleLine("Snow", x-GetX(), y-GetY(), 0, 0, 5, 40, 16777215, 16777215, 0);
          SetPosition(x, y);
        }
      }
    }
	
  // Noch nicht voll aufgeladen?
  if (iSize < iMaxSize)
    {
    for( var i=5; i>0; --i)
      {
      var iR, iD;
      var iX=Sin(iR=Random(360), iD=RandomX(iSize/10,iSize/5));
      var iY=Cos(iR, iD);
      CreateParticle("Snow", iX, iY, -iX/3, -iY/3, Random(25), RGBa(Random(255),0,0,90));
      CreateParticle("Snow", iX, iY, -iX/3, -iY/3, Random(35));
      }
	  
    // Vergrößern
    EffectVar(0, pTarget, iEffectNumber) = iSize+=10;
	
    // Nichts weiter während des Wachsens
    return(1);
    }
	
  // Abschuss noch nicht freigegeben?
  if (!iLaunchFree) return(1);
  
  // Maximale Laufzeit
  if(iEffectTime-iLaunchFree>550) return(RemoveObject());
  
  // Geschwindigkeit anpassen
  SetXDir(Sin(iAngle, ICEB_Speed));
  SetYDir(-Cos(iAngle, ICEB_Speed));
  
  // Suche nach Zielen
  var pObj;
  for(pObj in FindObjects(Find_AtPoint(0,1),Find_OCF(OCF_CrewMember),Find_NoContainer(),Find_Layer(GetObjectLayer())))
    {
    if(GetOCF(pObj) & OCF_CrewMember) if (GetAlive(pObj)) return(Hit());
    }
	
  // OK; weiter existieren
  return(1);
  }
 
func FxIceStrikeFlightStop(object pTarget, int iEffectNumber, int iReason, bool fTemp)
  {
  if (!fTemp) RemoveObject(pTarget);
  return(1);
  }