summaryrefslogtreecommitdiffstats
path: root/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d
diff options
context:
space:
mode:
authorJan <>2015-07-10 18:11:22 +0200
committerJan <_>2015-07-10 18:47:01 +0200
commitf1ece16c08d8c01e1d49a25f0314a96c021e73cb (patch)
tree9bc9f547f2524dee8e62f168f317df465a6cbcdd /TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d
parent80b15646d73587f4e15a2897314692b58aa1a47f (diff)
downloadtempelschubsen-f1ece16c08d8c01e1d49a25f0314a96c021e73cb.tar.gz
tempelschubsen-f1ece16c08d8c01e1d49a25f0314a96c021e73cb.zip
r0.921
Diffstat (limited to 'TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d')
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/ActMap.txt41
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/DefCore.txt17
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/DescDE.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/DescUS.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/Graphics.pngbin0 -> 41178 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/Names.txt2
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/Script.c79
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/DefCore.txt10
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/DescDE.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/DescUS.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Graphics.pngbin0 -> 7225 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Names.txt2
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Script.c46
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/StringTblDE.txt2
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/StringTblUS.txt2
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/DefCore.txt8
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/DescDE.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/DescUS.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Graphics.pngbin0 -> 10192 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Names.txt2
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Script.c88
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/DefCore.txt9
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/DescDE.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/DescUS.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Graphics.pngbin0 -> 9129 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/ActMap.txt29
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/DefCore.txt18
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/DescDE.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/DescUS.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Graphics.pngbin0 -> 6637 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsA.pngbin0 -> 6637 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsB.pngbin0 -> 6637 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsC.pngbin0 -> 6637 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsD.pngbin0 -> 6637 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsMetl.pngbin0 -> 10340 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Names.txt2
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Overlay.pngbin0 -> 4284 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayA.pngbin0 -> 10404 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayB.pngbin0 -> 10707 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayC.pngbin0 -> 11362 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayD.pngbin0 -> 11638 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayMetl.pngbin0 -> 4493 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Script.c109
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Names.txt2
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Script.c105
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/DefCore.txt8
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/DescDE.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/DescUS.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Graphics.pngbin0 -> 8232 bytes
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Names.txt2
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Script.c112
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/StringTblDE.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/StringTblUS.txt1
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Eisnadeln.c4d/Eisnadeln.c4d/Script.c6
54 files changed, 712 insertions, 3 deletions
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/ActMap.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/ActMap.txt
new file mode 100644
index 0000000..c7d7b36
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/ActMap.txt
@@ -0,0 +1,41 @@
+[Action]
+Name=Fly
+Procedure=FLOAT
+Length=1
+Delay=0
+Directions=2
+FlipDir=1
+NextAction=Fly
+Facet=0,0,45,45
+
+[Action]
+Name=Fly2
+Procedure=FLOAT
+Length=1
+Delay=0
+Directions=2
+FlipDir=1
+NextAction=Fly2
+Facet=855,0,45,45
+
+
+[Action]
+Name=Open
+Procedure=FLOAT
+Length=20
+Delay=1
+Directions=2
+FlipDir=1
+NextAction=Fly2
+Facet=0,0,45,45
+
+[Action]
+Name=Close
+Procedure=FLOAT
+Length=20
+Delay=1
+Directions=2
+FlipDir=1
+Reverse=1
+NextAction=Fly
+Facet=0,0,45,45 \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/DefCore.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/DefCore.txt
new file mode 100644
index 0000000..39f04a6
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/DefCore.txt
@@ -0,0 +1,17 @@
+[DefCore]
+id=AFTF
+Name=Claw
+Version=4,9,5
+Category=4
+MaxUserSelect=10
+Width=45
+Height=45
+Offset=-27,-27
+Value=10
+Mass=50
+Timer=2
+TimerCall=Check
+Rotate=1
+
+[Physical]
+Float=500 \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/DescDE.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/DescDE.txt
new file mode 100644
index 0000000..cfb916a
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/DescDE.txt
@@ -0,0 +1 @@
+Die Klaue an sich. \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/DescUS.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/DescUS.txt
new file mode 100644
index 0000000..46f7abe
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/DescUS.txt
@@ -0,0 +1 @@
+The claw itself. \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/Graphics.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/Graphics.png
new file mode 100644
index 0000000..5f2fe9f
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/Graphics.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/Names.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/Names.txt
new file mode 100644
index 0000000..aad1c68
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/Names.txt
@@ -0,0 +1,2 @@
+DE:Faust
+US:Fist \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/Script.c b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/Script.c
new file mode 100644
index 0000000..f8a20b7
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Claw.c4d/Script.c
@@ -0,0 +1,79 @@
+/*-- Klaue --*/
+
+#strict 2
+
+static const AFTF_Speed=45;
+
+local pClonk;
+local pTimer, iSpeed, iAngle;
+local iDamage;
+
+protected func Initialize()
+{
+ // Geschwindigkeit setzen
+ iSpeed=AFTF_Speed;
+ iDamage = 30;
+ return 1;
+}
+
+public func Activate(pCaster,iNewAngle)
+{
+ // Clonk und Winkel speichern
+ pClonk=pCaster;
+ iAngle=iNewAngle;
+
+ // Geschwindigkeit passend setzen
+ var iAdd=0;
+ if(iAngle >= 0) iAdd=180;
+ SetAction("Open");
+ SetR(iAngle+90+iAdd);
+ SetXDir(Cos(iAngle-90,AFTF_Speed));
+ SetYDir(Sin(iAngle-90,AFTF_Speed));
+
+ // Richtung anpassen
+ if(iAngle < 0) { SetDir(DIR_Right); }
+ else { SetDir(DIR_Left); }
+}
+
+protected func Check()
+{
+ // Die Zeit vorbei oder stehen geblieben
+ if(++pTimer > 45 || iSpeed<=0)
+ {
+ // Ein letzer Effekt
+ CastParticles("PSpark",10,10,0,0,60,160,RGB(150,150,240),RGB(210,210,255));
+ RemoveObject();
+ }
+
+ // In Materie wird die Klaue langsamer
+ if(GBackSolid())
+ {
+ iSpeed-=6;
+ SetXDir(Cos(iAngle-90,iSpeed));
+ SetYDir(Sin(iAngle-90,iSpeed));
+ }
+
+ if(!iDamage) return;
+
+ // Clonks suchen
+ for(var pClnk in FindObjects(Find_OCF(OCF_Alive),Find_Distance(23,0,0),Find_NoContainer()))
+ {
+ // Nur Feine, außer die Regel ist aktiviert
+// if(!ObjectCount(NTMG) && !Hostile(GetOwner(),GetOwner(pClnk))) continue;
+
+ // Nicht in den ersten Frames den Zauberer selber treffen
+ if(pClnk == pClonk && pTimer < 5) continue;
+
+ // Clonk wegschleudern
+ pClnk->SetAction("Tumble");
+ SetPosition(GetX(pClnk),GetY(pClnk)-2,pClnk);
+ SetXDir(GetXDir(pClnk)+RandomX(-10,10),pClnk);
+ SetYDir(-20,pClnk);
+
+ var iDmg = iSpeed/5;
+ if(iDmg>iDamage) iDmg = iDamage;
+ iDamage-=iDmg;
+ // Und wehtun
+ DoEnergy(-iDmg,pClnk);
+ }
+}
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/DefCore.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/DefCore.txt
new file mode 100644
index 0000000..4cb701b
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/DefCore.txt
@@ -0,0 +1,10 @@
+[DefCore]
+id=AFST
+Name=MagicAirClaw
+Version=4,9,5,4
+Category=1
+Width=1
+Height=1
+Picture=0,0,64,64
+Value=30
+Components=IASH=3; \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/DescDE.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/DescDE.txt
new file mode 100644
index 0000000..4fcfb73
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/DescDE.txt
@@ -0,0 +1 @@
+Erzeugt eine Klaue aus Luft, die Gegner etwas wegschleudert und verletzt. \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/DescUS.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/DescUS.txt
new file mode 100644
index 0000000..ba0ca61
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/DescUS.txt
@@ -0,0 +1 @@
+A claw of air which hurts enemies. \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Graphics.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Graphics.png
new file mode 100644
index 0000000..54db3c5
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Graphics.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Names.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Names.txt
new file mode 100644
index 0000000..d21bef2
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Names.txt
@@ -0,0 +1,2 @@
+DE:Luftklaue
+US:Air claw \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Script.c b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Script.c
new file mode 100644
index 0000000..d4008c2
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/Script.c
@@ -0,0 +1,46 @@
+/* Luftklaue */
+
+#strict 2
+
+func Activate(pCaster,pRealcaster) {
+ var pClonk;
+ if(pRealcaster) pClonk=pRealcaster;
+ else pClonk=pCaster;
+
+ // Nicht im Gebäude zaubern
+ if(Contained(pClonk))
+ {
+ Sound("Error");
+ PlayerMessage(GetOwner(pClonk), "$must_be_in_free$", pClonk);
+ RemoveObject();
+ return 0;
+ }
+
+ // Zielen wenn möglich
+ if (pClonk->~DoSpellAim(this(), pCaster)) return 1;
+
+ // Sonst einfach ungezielt loslassen
+ var angle=-90;
+ if(GetDir(pClonk) == DIR_Right) angle=90;
+ ActivateAngle(pClonk,angle);
+
+ return;
+}
+
+// Aktivierung nach Zielen (iAngle: -90=links; 0=oben; +90=rechts)
+public func ActivateAngle(object pCaller, int iAngle)
+{
+ // Klaue erzeugen und losschicken
+ CreateObject(AFTF,AbsX(GetX(pCaller))+Cos(iAngle-90,10),AbsY(GetY(pCaller))+Sin(iAngle-90,10)+19,GetOwner(pCaller))->Activate(pCaller,iAngle);
+
+ // Objekt löschen
+ RemoveObject();
+ return 1;
+}
+
+public func IsBattlemageSpell() { return true; }
+
+/* Zaubercombo */
+
+public func GetSpellStaff(object pMage) { return SMAR; }
+public func GetSpellStaffCombo(pMage) { return ("44"); } // (1: Backward; 2: Down; 3: Forward; 4: Throw; 5: Jump; 6: Dig)
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/StringTblDE.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/StringTblDE.txt
new file mode 100644
index 0000000..04eec3b
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/StringTblDE.txt
@@ -0,0 +1,2 @@
+must_be_in_free=Für diesen Zauber muss|sich der Clonk im|Freien befinden!
+StillDelay=Das Zauberdelay ist noch nicht abgelaufen! \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/StringTblUS.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/StringTblUS.txt
new file mode 100644
index 0000000..3c01382
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Airclaw.c4d/StringTblUS.txt
@@ -0,0 +1,2 @@
+must_be_in_free=Magician must be outside|to cast this spell!
+StillDelay=The spelldelay isn't over.
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/DefCore.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/DefCore.txt
new file mode 100644
index 0000000..07ffdaf
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/DefCore.txt
@@ -0,0 +1,8 @@
+[DefCore]
+id=MATT
+Version=4,9,8
+Name=Teleport
+Category=C4D_StaticBack|C4D_Magic
+Value=12
+Components=IMUS=1;IASH=1
+Picture=0,0,64,64
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/DescDE.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/DescDE.txt
new file mode 100644
index 0000000..bd7a8be
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/DescDE.txt
@@ -0,0 +1 @@
+Teleportiert hinter einen Gegner. \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/DescUS.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/DescUS.txt
new file mode 100644
index 0000000..62914d6
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/DescUS.txt
@@ -0,0 +1 @@
+Teleports behind an enemy. \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Graphics.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Graphics.png
new file mode 100644
index 0000000..cd389c0
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Graphics.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Names.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Names.txt
new file mode 100644
index 0000000..9ed60b8
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Names.txt
@@ -0,0 +1,2 @@
+DE:Angriffsteleport
+US:Assault Teleport
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Script.c b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Script.c
new file mode 100644
index 0000000..60dc5f2
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Script.c
@@ -0,0 +1,88 @@
+/*-- Teleport --*/
+
+#strict
+
+func Range()
+{
+ var range=225;
+ return range;
+}
+
+
+
+protected func Activate(object pCaster, object pRealCaster)
+{
+ // Effekt erzeugen
+ if(!pRealCaster) pRealCaster = pCaster;
+
+ var possibleTargets = [];
+ var found=0;
+ var range=Range();
+ for(var obj in FindObjects(Find_Distance(range),Find_OCF(OCF_CrewMember),Find_Hostile(GetOwner(pRealCaster)),Sort_Distance()))
+ {
+ var dir=-1;
+ if(GetDir(obj) == DIR_Left)dir=1;
+
+ if(GBackSolid(AbsX(GetX(obj)+15*dir),AbsY(GetY(obj)))
+ || GBackSolid(AbsX(GetX(obj)+15*dir),AbsY(GetY(obj)+5))
+ || GBackSolid(AbsX(GetX(obj)+15*dir),AbsY(GetY(obj)-9)))continue;
+ if(!PathFree(GetX(obj),GetY(obj),GetX(obj)+15*dir,GetY(obj) + 5))continue;
+
+ var priority = 20 + ObjectDistance(pRealCaster, obj);
+ if(GBackSemiSolid(AbsX(obj->GetX()), AbsY(obj->GetY())))
+ priority += 100;
+
+ possibleTargets[GetLength(possibleTargets)] = [obj, priority];
+
+ }
+
+ if(!GetLength(possibleTargets))
+ {
+ var x = AbsX(GetX(pRealCaster));
+ var y = AbsY(GetY(pRealCaster));
+ var tim = CreateObject(TIM1, x, y, pRealCaster->GetOwner());
+ tim->SetVisibility(VIS_Owner);
+ AddEffect("ScheduledRemove", tim, 1, 35 * 5, 0, MATT);
+ CreateParticle("RangeSpark", 0, 0, 0, 0,((range)*1000/200)*2, RGB(200, 200, 100), tim, true);
+ Sound("Error",0,0,0,GetOwner(pRealCaster));
+ RemoveObject();
+ return;
+ }
+
+
+ // find lowest prio target from list
+ var currentLowest = 0xffffff;
+ for(var pt in possibleTargets)
+ {
+ if(pt[1] >= currentLowest) continue;
+ currentLowest = pt[1];
+ found = pt[0];
+ }
+
+ var dir=-1;
+ if(GetDir(found) == DIR_Left)dir=1;
+
+ for(var cnt=0;cnt<5;cnt++)
+ {
+ CreateParticle("PSpark",AbsX(GetX(pRealCaster)+RandomX(-5,5)),AbsY(GetY(pRealCaster)+RandomX(-10,10)),0,0,150,GetColorDw(pRealCaster));
+ CreateParticle("PSpark",AbsX(GetX(found)+15*dir+RandomX(-5,5)),AbsY(GetY(found)+RandomX(-10,10)),0,0,150,GetColorDw(pRealCaster));
+ }
+ SetSpeed(GetXDir(found),GetYDir(found),pRealCaster);
+ SetPosition(GetX(found)+7*dir,GetY(found),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)
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/DefCore.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/DefCore.txt
new file mode 100644
index 0000000..8545ace
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/DefCore.txt
@@ -0,0 +1,9 @@
+[DefCore]
+id=MGCY
+Version=4,9,8
+Name=MagicCrystalSpikes
+Category=C4D_Magic
+Width=1
+Height=1
+Value=25
+Picture=0,0,64,64
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/DescDE.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/DescDE.txt
new file mode 100644
index 0000000..138b9b2
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/DescDE.txt
@@ -0,0 +1 @@
+Aus dem Boden vor dem Zauberer stoßen Kristallstacheln und schädigen Lebewesen, welche sich über einem Kristall befinden. Außerdem erhalten Lebewesen kontinuierlich schaden, wenn sie neben einem solchen Kristall verweilen.
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/DescUS.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/DescUS.txt
new file mode 100644
index 0000000..a37ddff
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/DescUS.txt
@@ -0,0 +1 @@
+Summons numerous crystal spikes which damage entities on impact, while also dealing damage to any living clonks or animals standing next to them.
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Graphics.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Graphics.png
new file mode 100644
index 0000000..de7ae74
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Graphics.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/ActMap.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/ActMap.txt
new file mode 100644
index 0000000..5611746
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/ActMap.txt
@@ -0,0 +1,29 @@
+[Action]
+Name=Bohr
+Procedure=NONE
+Length=10
+Delay=2
+Facet=0,0,24,58
+NextAction=Exist
+PhaseCall=StossEffect
+Sound=Earthquake
+EndCall=SoundBamm
+
+[Action]
+Name=Exist
+Procedure=NONE
+Length=1
+Delay=1
+Facet=216,0,24,58
+NextAction=Exist
+EndCall=ExistTimer
+Sound=VolcanoCast
+
+[Action]
+Name=Remove
+Procedure=NONE
+Length=10
+Delay=4
+Facet=0,0,24,58
+EndCall=RemoveMe
+Reverse=1
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/DefCore.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/DefCore.txt
new file mode 100644
index 0000000..024172a
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/DefCore.txt
@@ -0,0 +1,18 @@
+[DefCore]
+id=QBCY
+Name=BigCrystall
+Version=4,9,5
+Category=4
+Width=24
+Height=56
+Offset=-12,-28
+Mass=100
+Components=CRYS=4;
+Picture=0,56,64,64
+Vertices=3
+VertexY=-28,28,28
+VertexX=0,6,-6
+VertexFriction=50,100,100
+ColorByOwner=1
+StretchGrowth=1
+IncompleteActivity=1 \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/DescDE.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/DescDE.txt
new file mode 100644
index 0000000..34ab750
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/DescDE.txt
@@ -0,0 +1 @@
+Wertvoll doch auch äußerst Spitz. \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/DescUS.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/DescUS.txt
new file mode 100644
index 0000000..1dfbcf7
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/DescUS.txt
@@ -0,0 +1 @@
+A new object definition. \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Graphics.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Graphics.png
new file mode 100644
index 0000000..f490a20
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Graphics.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsA.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsA.png
new file mode 100644
index 0000000..f490a20
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsA.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsB.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsB.png
new file mode 100644
index 0000000..f490a20
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsB.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsC.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsC.png
new file mode 100644
index 0000000..f490a20
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsC.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsD.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsD.png
new file mode 100644
index 0000000..f490a20
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsD.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsMetl.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsMetl.png
new file mode 100644
index 0000000..14a097b
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/GraphicsMetl.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Names.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Names.txt
new file mode 100644
index 0000000..09888b0
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Names.txt
@@ -0,0 +1,2 @@
+DE:Kristallstachel
+US:Crystal Spike
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Overlay.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Overlay.png
new file mode 100644
index 0000000..a7abc6d
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Overlay.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayA.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayA.png
new file mode 100644
index 0000000..8358372
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayA.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayB.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayB.png
new file mode 100644
index 0000000..57755c3
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayB.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayC.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayC.png
new file mode 100644
index 0000000..1aa4791
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayC.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayD.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayD.png
new file mode 100644
index 0000000..3afb2bf
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayD.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayMetl.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayMetl.png
new file mode 100644
index 0000000..5a3e193
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/OverlayMetl.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Script.c b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Script.c
new file mode 100644
index 0000000..1d25b23
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Kristall.c4d/Script.c
@@ -0,0 +1,109 @@
+/*-- Crystal Spike --*/
+
+#strict
+
+local iMaxTime;
+
+local iExtra;
+
+public func IsBigCrystal(){ return(1); }
+
+func Initialize() {
+ var Randi = RandomX(1,4);
+ if(Randi == 1) SetGraphics("A",this(), GetID(), 1,GFXOV_MODE_ExtraGraphics);
+ if(Randi == 2) SetGraphics("B",this(), GetID(), 1,GFXOV_MODE_ExtraGraphics);
+ if(Randi == 3) SetGraphics("C",this(), GetID(), 1,GFXOV_MODE_ExtraGraphics);
+ if(Randi == 4) SetGraphics("D",this(), GetID(), 1,GFXOV_MODE_ExtraGraphics);
+ SetAction("Bohr");
+ return(1);
+}
+public func Set(inMaxTime, int iMetl){
+ iMaxTime = inMaxTime;
+ if(iMetl){ iExtra = iMetl;
+ SetGraphics("Metl",this(), GetID(), 1,GFXOV_MODE_ExtraGraphics);
+ }
+ return(1);
+}
+
+func StossEffect() {
+for(var pClonk in FindObjects(Find_Distance(20), Find_OCF(OCF_Living), Find_NoContainer ())){
+ if(GetAlive(pClonk)) {
+ if(!GetEffect("NoCrystallAttack",pClonk))
+ HitObject(pClonk);
+ }
+ }
+for(var pDing in FindObjects(Find_Distance(30), Find_Category(C4D_Object), Find_NoContainer ())){
+ HitDing(pDing);
+ }
+
+if(!Random(1)) {CreateParticle("Smoke",0,+21,RandomX(-4,4),-5,80,RGB(120,120,120)); }
+if(!Random(2)) {
+var ebk = CreateObject(1EBK,0,+21,GetOwner());
+if(ebk) SetSpeed(RandomX(-5,5),RandomX(-40,-80),ebk);
+ }
+}
+
+func ExistTimer() {
+if(!Random(20)) Sound("Sparkle");
+if(!Random(4)) {
+CreateParticle("NoGravSpark",RandomX(-8,8),RandomX(-28,26),0,-5,RandomX(10,30),GetTeamColor(GetPlayerTeam(GetOwner())));
+ }
+
+for(var pClonk in FindObjects(Find_Distance(40), Find_OCF(OCF_Living), Find_NoContainer ())){
+ if(GetAlive(pClonk)) if(!Random(20)) EffectObject(pClonk);
+ }
+
+if(iMaxTime > 0){
+if(GetActTime() > iMaxTime) SetAction("Remove");
+ }
+}
+
+global func CreateBigCrystal(int iX,int iY, int iCon, int iMTime, int iOwner) { // Erstell an der Position ein großen Kristall
+var pCrys = CreateObject(QBCY,iX,iY,iOwner);
+pCrys->Set(iMTime);
+SetCon(iCon,pCrys);
+return(pCrys);
+}
+func HitObject(object pClonk) {
+if(!pClonk) return(0);
+Sound("Crystal2",0,pClonk);
+if(!FindObject(NTMG)){
+ if(!Hostile(GetOwner(),GetOwner(pClonk))) return(0);
+ }
+if(GetAction(pClonk) ne "Tumble"){
+DoEnergy(RandomX(-10,-20)+iExtra,pClonk);
+Fling(pClonk, RandomX(-4,4), RandomX(-5,-9));
+ AddEffect("NoCrystallAttack",pClonk,100,1,pClonk);
+ }
+}
+func HitDing(object pDing) {
+if(GetID(pDing) == QBCY) return(0);
+if(pDing){ SetSpeed(RandomX(-4,4),RandomX(-20,-40),pDing);
+pDing->~Hit(); }
+}
+
+func EffectObject(object pClonk) {
+if(!FindObject(NTMG)){
+ if(!Hostile(GetOwner(),GetOwner(pClonk))) return(0);
+ }
+CreateParticle("NoGravSpark",GetX()-GetX(pClonk)+RandomX(-8,8),GetY()-GetY()+RandomX(-12,12),0,-5,RandomX(10,20),GetColorDw (this()));
+if(!Random(2))
+DoEnergy(-7,pClonk);
+}
+func RemoveMe(){
+RemoveObject(this());
+}
+func SoundBamm(){
+ Sound("RockBreak*");
+ Sound("Blast2",0,0,50);
+for(var i = 0; i < 5; i++){
+var ebk = CreateObject(1EBK,0,+21,GetOwner());
+if(ebk) SetSpeed(RandomX(-5,5),RandomX(-40,-80),ebk);
+ }
+}
+global func FxNoCrystallAttackTimer(object pTarget, int iIndex, int iTime)
+{
+ if(!pTarget) return (false);
+ if(iTime >= 20) return (-1);
+ return (true);
+} \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Names.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Names.txt
new file mode 100644
index 0000000..10f34d9
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Names.txt
@@ -0,0 +1,2 @@
+DE:Kristallstachel
+US:Crystal Spikes
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Script.c b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Script.c
new file mode 100644
index 0000000..1da9bb2
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/CrystalSpikes.c4d/Script.c
@@ -0,0 +1,105 @@
+/* Crystal Spikes */
+
+#strict 2
+
+public func Activate(pCaster, pRealCaster)
+{
+ if(pRealCaster) pCaster = pRealCaster;
+ Sound("Magic1");
+
+ // Effekt prüfen
+ var iResult;
+ if (iResult = CheckEffect("CrystallSpikesNSpell", 0, 75)) return(iResult!=-1 && RemoveObject());
+
+ // Dinger erzeugen
+ var iCount = RandomX(4,7);
+ var sum = 0;
+
+ for(var i = 0; i < iCount; i++)
+ {
+ sum += PlaceCrystal(5 * (i - i/2), -5, pCaster);
+ }
+ if(!sum) return 0;
+
+ // Fertig; Zauber entfernen
+ RemoveObject();
+ return 1;
+}
+
+protected func PlaceCrystal(int startx, int starty, object pCaster)
+{
+ var dir = 2 * GetDir(pCaster) - 1;
+ startx += dir * (!!Random(3) * 50 + RandomX(0, 125));
+
+ var solid = false;
+ var deltax;
+ for (deltax = 0; deltax < 100 && !solid; deltax += (10 * RandomX(1, 3)))
+ {
+ for (var y = 0; GetY() + y < LandscapeHeight() && !solid; y += 10)
+ {
+ if (GBackSolid(startx + dir * deltax, y)) solid = true;
+ }
+ }
+ var x = startx + dir * deltax;
+ if (!solid || GetX() + startx >= LandscapeWidth() || GetX() + startx + LandscapeWidth() < 0) return;
+
+ var y;
+ solid = false;
+ var free = false;
+ var upy, downy;
+ for (y = starty; GetY() + y > 0 && !free; --y)
+ {
+ if (!solid)
+ {
+ if (GBackSolid(x, y)) solid = true;
+ }
+ else
+ {
+ if (!GBackSolid(x, y))
+ {
+ free = true;
+ upy = ++y;
+ }
+ }
+ }
+ var down = Random(2);
+ if (!free || down)
+ {
+ solid = false;
+ free = false;
+ for (y = starty; GetY() + y < LandscapeWidth() && !solid; ++y)
+ {
+ if (!free)
+ {
+ if (!GBackSolid(x, y)) free = true;
+ }
+ else
+ {
+ if (GBackSolid(x, y))
+ {
+ solid = true;
+ }
+ }
+ }
+ if (!solid)
+ {
+ if (!upy)
+ {
+ return;
+ }
+ else y = upy;
+ }
+ else
+ {
+ downy = y;
+ }
+ }
+ if (upy && downy && down) y = downy;
+
+ CreateBigCrystal(x, y + 3, RandomX(50, 100), RandomX(100, 200), GetOwner());
+ return 1;
+}
+
+public func GetSpellClass(object pMage) { return(EART); }
+public func GetSpellCombo(pMage) { return ("444"); } // (1: Backward; 2: Down; 3: Forward; 4: Throw; 5: Jump; 6: Dig)
+
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/DefCore.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/DefCore.txt
new file mode 100644
index 0000000..0b8f6bd
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/DefCore.txt
@@ -0,0 +1,8 @@
+[DefCore]
+id=MDFL
+Name=MagicDeflection
+Category=1
+Picture=0,0,64,64
+Version=4,9,5,4
+Value=32
+Components=IROC=5;IMUS=1; \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/DescDE.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/DescDE.txt
new file mode 100644
index 0000000..e0d86c7
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/DescDE.txt
@@ -0,0 +1 @@
+Wirft Objekte zurück, die den Clonk treffen würden. \ No newline at end of file
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/DescUS.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/DescUS.txt
new file mode 100644
index 0000000..c07f55a
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/DescUS.txt
@@ -0,0 +1 @@
+Throws objects back, which would hit the clonk.
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Graphics.png b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Graphics.png
new file mode 100644
index 0000000..bb77e89
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Graphics.png
Binary files differ
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Names.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Names.txt
new file mode 100644
index 0000000..35a510e
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Names.txt
@@ -0,0 +1,2 @@
+DE:Zurückwerfen
+US:Deflection
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Script.c b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Script.c
new file mode 100644
index 0000000..b3e4179
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Script.c
@@ -0,0 +1,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)
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/StringTblDE.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/StringTblDE.txt
new file mode 100644
index 0000000..4491f18
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/StringTblDE.txt
@@ -0,0 +1 @@
+SpellInfo=Objekte werden zurückgeworfen.
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/StringTblUS.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/StringTblUS.txt
new file mode 100644
index 0000000..211193a
--- /dev/null
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/StringTblUS.txt
@@ -0,0 +1 @@
+SpellInfo=Objects will be reflected.
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Eisnadeln.c4d/Eisnadeln.c4d/Script.c b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Eisnadeln.c4d/Eisnadeln.c4d/Script.c
index 98f3eaf..f433017 100644
--- a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Eisnadeln.c4d/Eisnadeln.c4d/Script.c
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Eisnadeln.c4d/Eisnadeln.c4d/Script.c
@@ -1,4 +1,4 @@
-/*-- Eislanze --*/
+/*-- Ice Needle --*/
#strict
static const ICNA_Speed=50;
@@ -155,7 +155,7 @@ if(!Gift==1)
{
Sound("Hited", living);
// Schaden machen
- Punch(living, 12);
+ Punch(living, RandomX(7, 12));
if(!Frozen(living)) Freeze(living, EffectVar(4));
return(RemoveObject());
}
@@ -163,7 +163,7 @@ if(Gift==1)
{
Sound("Hited", living);
// Schaden machen
- Punch(living, (10));
+ Punch(living, RandomX(5, 10));
return(RemoveObject());
}
}