summaryrefslogtreecommitdiffstats
path: root/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Script.c
blob: b3e4179d599fb4bef233e0f4a9e5a63b9573cee5 (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
/* Zurückwerfen */

#strict 2

func Activate(pCaster,pRealcaster)
{
  var pClonk=pRealcaster;
  if(!pClonk) pClonk=pCaster;
  
  // Auswählen wenn möglich
  if (pCaster->~DoSpellSelect(this,300)) return 1;

  // 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,2,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;
  // darf noch keinen Effekt haben
  if(GetEffect("DeflectionPSpell", pTarget)) return;
  return 1;
}

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

func FxDeflectionPSpellTimer(pClonk, iEffectNumber, iEffectTime)
{
  // Zeit um
  if(!EffectVar(0,pClonk,iEffectNumber)--) return -1;
  // Nicht in Gebäuden
  if(Contained(pClonk)) return;
  //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(21, GetX(pClonk), GetY(pClonk)), Find_Not(Find_Distance(11, GetX(pClonk), GetY(pClonk)))))
  {
    // Wenn das Objekt auf den Clonk zufliegt
    if( (GetXDir(pObj)<0) == (GetX(pObj)>GetX(pClonk)) || (GetYDir(pObj)<0) == (GetY(pObj)>GetY(pClonk)))
    {
      // Eigenen Stab ignorieren
      if(GetEffect("StaffFlight", pObj))
        if(EffectVar(0, pObj, GetEffect("StaffFlight", pObj))==pClonk)
          continue;
      if(Abs(GetXDir(pObj))<5) SetXDir(GetXDir(pObj)+RandomX(-10,10), pObj);
      if(Abs(GetYDir(pObj))<5) SetYDir(3, pObj);
      SetSpeed(-GetXDir(pObj),-GetYDir(pObj), 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)-50,0);
      AddEffect("IntDeflected", pObj, 1, 20);
      Sound("Rip", 0, pObj);
    }
  }
  // Partikel Kreiseffekt
  if(Mod(iEffectTime,4)) return;
  var iAngle = iEffectTime*10;
  while(iAngle>=360) iAngle -= 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")
  {
    if(EffectVar(0,pTarget,iNumber)>50) return -1;
    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) += 300;
  if(EffectVar(0,pTarget,iNumber)> 600) EffectVar(0,pTarget,iNumber)=600;
}

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)