summaryrefslogtreecommitdiffstats
path: root/TemplePushing.c4s/System.c4g/Airblast.c
blob: 473263b05c601e2650ba746b9e9bf5acf765e01e (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
/* Airblast kill tracking */

#strict

#appendto ABLA

func FxAirblastNSpellTimer(object pTarget, int iNumber, int iTime) {
  var iPos, pObj, iX, iY, iSpeed, iRandom, iAngle, iSize, iStep;

  var iPos = EffectVar(1,pTarget,iNumber);
  // löschen falls schon zu weit alles weggeblasen
  if(iPos >= EffectCall(pTarget,iNumber,"MaxRange")) return(-1);

  iStep = -iPos/18+EffectCall(pTarget,iNumber,"MaxRange")/17;

  iX = EffectVar(2,pTarget,iNumber);
  iY = EffectVar(3,pTarget,iNumber);

  iAngle = EffectVar(0,pTarget,iNumber);
  iSize = iStep+iPos/5;
  
  iX += Sin(iAngle, iPos);
  iY -= Cos(iAngle, iPos);

  //Log("%d,%d",iSize,iStep);


  //  Log("%d,%d,%d,%d",iX+Sin(iAngle,iPos)-iSize,iY-Cos(iAngle,iPos)-iSize,iSize*2,iSize*2);

  // Objekte wegblasen
  while(pObj=FindObject(0,iX-iSize,iY-iSize,iSize*2,iSize*2,OCF_Collectible()|OCF_Alive(),0,0,NoContainer(),pObj))
    {
    if(Stuck(pObj)) continue;
    if (GetProcedure(pObj) eq "ATTACH") continue; // Keine getragenen Schilde, Alchemiebeutel, etc.
    iSpeed=iStep*6;
    if(iSpeed<0) iSpeed=0;
   
    // Sound fürs Wegblasen
    Sound("MgWndB", false, pObj);

    //Log("%s: %d; %d,%d",GetName(pObj),iSpeed,Sin(iAngle,iSpeed+20),-iSpeed);

    if(GetAlive(pObj))
      {
      iRandom=Random(3);
      //DoEnergy(-1-iRandom,pObj);
      //pObj->~CatchBlow(-1-iRandom,this());
      pObj->SetKiller(EffectVar(6,pTarget,iNumber));
      Fling(pObj,Sin(iAngle,iSpeed+20)/9,-iSpeed/2/9);
      }
    else
      {
       SetSpeed(Sin(iAngle,iSpeed+20),-iSpeed/2,pObj);
       
       // Richtigen Controller setzen
       SetController(EffectVar(6,pTarget,iNumber),pObj);
      }
    }
    
  // Explosionen bei Kombo
  var iMat;
  if (EffectVar(4, pTarget, iNumber))
    if (GBackSolid(iX, iY))
      {
      iMat = GetMaterial(iX,iY);
      if (iMat >= 0 && iMat != Material("Vehicle"))
        {
        Explode(17, CreateObject(ROCK, iX,iY,EffectVar(5, pTarget, iNumber)));
        return(-1);
        }
      }

  var clr = iPos*255/EffectCall(pTarget,iNumber,"MaxRange");
  CreateParticle("PSpark",iX,iY,0,0,iSize*15,RGBa(200,200,255,clr*127/255));

  // alle 20 Pixel wird nach Objekten gesucht
  EffectVar(1,pTarget,iNumber)+=iStep;
  while(pObj=FindObject(0,iX-iSize,iY-iSize,iSize*2,iSize*2,OCF_Alive(),0,0,NoContainer(),pObj)) {
  	if(GetKiller(pObj)!=EffectVar(6,pTarget,iNumber)) {
  		DoEnergy(-1,pObj, 1,,EffectVar(6,pTarget,iNumber)+1);
  		DoEnergy(+1,pObj, 1,,EffectVar(6,pTarget,iNumber));
  	}
	}
}