summaryrefslogtreecommitdiffstats
path: root/TemplePushing.c4s
diff options
context:
space:
mode:
Diffstat (limited to 'TemplePushing.c4s')
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/ActMap.txt7
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/DefCore.txt10
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/Script.c241
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/Script.c89
-rw-r--r--TemplePushing.c4s/System.c4g/Find_Angle.c33
5 files changed, 156 insertions, 224 deletions
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/ActMap.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/ActMap.txt
deleted file mode 100644
index 7dec40a..0000000
--- a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/ActMap.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-[Action]
-Name=Fly
-Procedure=FLOAT
-Length=1
-Delay=1
-NextAction=Fly
-FacetBase=1
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/DefCore.txt b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/DefCore.txt
index 13db5ff..aab9433 100644
--- a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/DefCore.txt
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/DefCore.txt
@@ -5,16 +5,18 @@ Version=4,9,5
Category=4
MaxUserSelect=10
Width=12
-Height=3
+Height=2
Offset=-6,-1
Value=10
Mass=10
-Timer=2
+Timer=1
TimerCall=Check
Vertices=1
-VertexX=1
+VertexX=0
VertexFriction=20
Rotate=1
+ContactCalls=1
+VertexCNAT=1
[Physical]
-Float=500 \ No newline at end of file
+Float=500
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/Script.c b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/Script.c
index f433017..1d800b6 100644
--- a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/Script.c
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/Script.c
@@ -1,176 +1,119 @@
-/*-- Ice Needle --*/
-
-#strict
-static const ICNA_Speed=50;
+#strict 2
+static const ICNA_Speed = 50,
+ ICNA_AutoAimAngle = 30,
+ ICNA_TurnSpeed = 1,
+ ICNA_AutoAimDistance = 300,
+ ICNA_Lifetime = 200;
local timer;
local iOldX, iOldY;
-local Gift;
local iAngle;
local Caster;
-local Randi;
+local contacts;
-func Initialize() {
-Gift=0;
- timer=0;
- return(1);
+func Initialize()
+{
+ iOldX = -1;
+ iOldY = -1;
}
-public func Activate(pCaster,Angle)
+public func Activate(pCaster, Angle)
{
- SetAction("Fly");
- var xDir,yDir;
-// SetR(Angle-100+RandomX(0,20));
- iAngle = Angle-10+RandomX(0,20);
- SetR(iAngle-90);
- Caster = pCaster;
-// xDir=Cos(iAngle-90,ICNA_Speed);
-// yDir=Sin(iAngle-90,ICNA_Speed);
-// SetXDir(xDir+RandomX(-10,10));
-// SetYDir(yDir+RandomX(-10,10));
-// iOldX = GetX(); iOldY = GetY();
+ iAngle = Angle;
+ Caster = pCaster;
+ Check();
}
-protected func Hit()
+
+func Angle180(int angle)
{
- if(CheckHit()) return();
- CastParticles("MaterialParticle",20,50,0,0,20,60,RGB(50,120,255),RGB(00,120,255));
- if(!Random(3)) RemoveObject();
- if(GetR() > 180) iAngle = iAngle-iAngle*2;
- if(GetR() < 180) iAngle = iAngle+iAngle*2;
- var iMinAngleDiff = 360, iTargetAngle = iAngle;
- var pObj;
- while (pObj = FindObject(0, Sin(iAngle, 200)-200/2, -Cos(iAngle, 200)-200/2, 200, 200, OCF_CrewMember, 0,0, NoContainer(), pObj))
- {
- if (!GetAlive(pObj)) continue;
- if(pObj == Caster) continue;
- if(!PathFree(GetX(),GetY(),GetX(pObj),GetY(pObj))) continue;
- var iThisTargetAngle = Angle(GetX(), GetY(), GetX(pObj), GetY(pObj));
- if (iThisTargetAngle > 180) iThisTargetAngle -= 360;
- if (Abs(iThisTargetAngle - iAngle) < iMinAngleDiff)
- {
- iMinAngleDiff = Abs(iThisTargetAngle - iAngle);
- iTargetAngle = iThisTargetAngle;
- }
- }
- iAngle = BoundBy(iTargetAngle, iAngle-Randi, iAngle+Randi);
+ if (angle > 180) angle -= 360;
+ return angle;
}
-protected func Check()
+func Angle360(int angle)
{
-//CheckCrash(this());
-// SetXDir(Cos(GetR(), 245000) * 2, 0, 100000);
-// SetYDir(Sin(GetR(), 245000) * 2, 0, 100000);
- Randi = RandomX(0,20);
- SetR(iAngle);
- SetXDir(Sin(iAngle, 50));
- SetYDir(-Cos(iAngle, 50));
-
- // SetXDir(Sin(iAngle, 80));
- // SetYDir(-Cos(iAngle, 80));
-
- var iMinAngleDiff = 360, iTargetAngle = iAngle;
- var pObj;
- while (pObj = FindObject(0, Sin(iAngle, 200)-200/2, -Cos(iAngle, 200)-200/2, 200, 200, OCF_CrewMember, 0,0, NoContainer(), pObj))
- {
- if (!GetAlive(pObj)) continue;
- if(pObj == Caster) continue;
- if(!PathFree(GetX(),GetY(),GetX(pObj),GetY(pObj))) continue;
- var iThisTargetAngle = Angle(GetX(), GetY(), GetX(pObj), GetY(pObj));
- if (iThisTargetAngle > 180) iThisTargetAngle -= 360;
- if (Abs(iThisTargetAngle - iAngle) < iMinAngleDiff)
- {
- iMinAngleDiff = Abs(iThisTargetAngle - iAngle);
- iTargetAngle = iThisTargetAngle;
- }
- }
- iAngle = BoundBy(iTargetAngle, iAngle-Randi, iAngle+Randi);
-
- if(++timer > 100)RemoveObject();
- //if(!GetR() == iAngle-90){
- //if(GetR() < iAngle-90) SetRDir(1);
- //if(GetR() > iAngle-90) SetRDir(-1);
- //}
- //if(GetR() == iAngle-80+RandomX(0,20)) SetRDir(0);
- if(ObjectDistance(this(),pObj) < 40) SetR(iAngle-90);
-
-if(!Gift==1)
- {
- // CreateParticle("PSpark",0,0,0,0,20,RGBa(0,RandomX(100,120),RandomX(160,255),90));
- CreateParticle("PSpark",0,0,0,0,180,RGBa(0,RandomX(100,120),RandomX(160,255),120));
- CreateParticle("FSSpark",0,0,0,0,150,RGB(0,RandomX(100,120),RandomX(160,255)));
- //CreateParticle("PSpark",-GetXDir()/5,-GetYDir()/5,0,0,40,RGB(0,RandomX(100,120),RandomX(160,255)));
- //CreateParticle("PSpark",-GetXDir()/2,-GetYDir()/2,0,0,40,RGB(0,RandomX(100,120),RandomX(160,255)));
- CreateParticle("MaterialParticle2",0,0,RandomX(2,-2)-GetXDir()/2,RandomX(2,-2)-GetYDir()/2,250,RGB(0,RandomX(100,120),RandomX(160,255)));
- }
-else
+ if (angle < 0) angle += 360;
+ return angle;
+}
+
+protected func Check()
{
- CreateParticle("FSSpark",0,0,0,0,150,RGB(100,255,0));
- CreateParticle("PSpark",0,0,0,0,180,RGBa(100,255,0,120));
- CreateParticle("MaterialParticle2",0,0,RandomX(2,-2)-GetXDir()/2,RandomX(2,-2)-GetYDir()/2,250,RGB(100,255,0));
- }
- // Auf Treffer prüfen
- CheckHit();
- iOldX = GetX(); iOldY = GetY();
-/* var pClonk=0;
- while(pClonk=FindObject(0,0,-1,0,0,OCF_Alive(),0,0,NoContainer(),pClonk))
- {
- if(!ObjectCount(NTMG))if(Hostile(GetOwner(),GetOwner(pClonk)))continue;
- Punch(pClonk,4);
- RemoveObject();
- }*/
+ var target = FindObject2(Find_Distance(ICNA_AutoAimDistance), Find_OCF(OCF_Alive), Find_OCF(OCF_CrewMember), Find_Hostile(GetOwner(Caster)), Find_NoContainer(), Find_Angle(iAngle - ICNA_AutoAimAngle, iAngle + ICNA_AutoAimAngle), Find_Exclude(Caster), Find_PathFree(this), Sort_Distance());
+
+ if(target)
+ {
+ var angle = Angle(GetX(), GetY(), target->GetX(), target->GetY());
+ var range1 = Angle360(iAngle) - ICNA_TurnSpeed;
+ var range2 = Angle360(iAngle) + ICNA_TurnSpeed;
+ iAngle = Angle180(BoundBy(angle, range1, range2));
+ }
+
+ SetR(iAngle);
+ SetXDir(Sin(iAngle, ICNA_Speed));
+ SetYDir(-Cos(iAngle, ICNA_Speed * 100) - 2 * GetGravity(), this, 1000);
+
+
+ if (++timer > ICNA_Lifetime) RemoveObject();
+ if (timer % 2)
+ {
+ CreateParticle("PSpark", 0, 0, 0, 0, 180, RGBa(0, RandomX(100, 120), RandomX(160, 255), 120));
+ CreateParticle("FSSpark", 0, 0, 0, 0, 150, RGB(0, RandomX(100, 120), RandomX(160, 255)));
+ CreateParticle("MaterialParticle2", 0, 0, RandomX(2, -2)-GetXDir()/2, RandomX(2, -2)-GetYDir()/2, 250, RGB(0, RandomX(100, 120), RandomX(160, 255)));
+ }
+
+ CheckHit();
+ iOldX = GetX(); iOldY = GetY();
}
private func CheckHit()
{
- // Nur wenn schon passende Werte da sind
- if(!iOldX && !iOldY) return();
- // Distance zur letzten Position berechnen
- var iXDist = GetX()-iOldX;
- var iYDist = GetY()-iOldY;
- // Treffer-Überprüfung
- var iSteps = Abs(iXDist/4);
- if(Abs(GetXDir())<Abs(GetYDir())) iSteps = Abs(iYDist/4);
- var iX, iY, pObj;
- // Mit Schleife alle Zwischenpunkte abklappern
- for(var i = iSteps; i; i--)
- {
- iX = -iXDist*i/iSteps; iY = -iYDist*i/iSteps;
- if(!iY) iY = 1;
-// CreateParticle("NoGravSpark", iX, iY, 0, 0, 30, RGB(i*255/iSteps, (iSteps-i)*255/iSteps));
- var pFObj;
- if(pFObj = FindObject(0, iX, iY, 0, 0, OCF_OnFire(), 0, 0, NoContainer())) {
- if(!Random(3)) RemoveObject(this());
- }
- if(pObj = FindObject(0, iX, iY, 0, 0, OCF_Alive(), 0, 0, NoContainer())) return(HitLiving(pObj));
- }
+ if (iOldX == -1 && iOldY == -1) return;
+ var targets = FindObjects(Find_OnLine(AbsX(iOldX), AbsY(iOldY), 0, 0), Find_OCF(OCF_Alive), Find_OCF(OCF_CrewMember), Find_Hostile(GetOwner(Caster)), Find_NoContainer());
+ if (FindObject2(Find_OnLine(AbsX(iOldX), AbsY(iOldY), 0, 0), Find_OCF(OCF_OnFire), Find_NoContainer())) return RemoveObject();
+ if (GetLength(targets) > 0) return HitObject(targets[Random(GetLength(targets))]);
}
-private func HitLiving (living,pObj)
+private func HitObject(living, pObj)
{
-if(living == Caster) return(0);
-CastParticles("MaterialParticle",20,50,0,0,20,60,RGB(50,120,255),RGB(00,120,255));
-Sound("Crystal2", this());
-if(!Gift==1)
- {
- Sound("Hited", living);
- // Schaden machen
- Punch(living, RandomX(7, 12));
- if(!Frozen(living)) Freeze(living, EffectVar(4));
- return(RemoveObject());
- }
-if(Gift==1)
-{
- Sound("Hited", living);
- // Schaden machen
- Punch(living, RandomX(5, 10));
- return(RemoveObject());
- }
- }
+ if (living == Caster) return 0;
+ CastParticles("MaterialParticle", 20, 50, 0, 0, 20, 60, RGB(50, 120, 255), RGB(0, 120, 255));
+ Sound("Crystal2", this);
+ // Schaden machen
+ if(Caster)
+ {
+ Caster->Punch(living, RandomX(7, 12));
+ }
+ else
+ {
+ Punch(living, RandomX(7, 12));
+ }
+ if (!Frozen(living)) Freeze(living, Caster);
+ return RemoveObject();
+}
protected func Destruction()
{
- CreateParticle("PSpark", RandomX(-1,2), RandomX(-2,1), RandomX(-3,2), RandomX(-2,1), RandomX(150,90), RGB(010,035,94));
- CreateParticle("PSpark", RandomX(-2,1), RandomX(-1,2), RandomX(-2,3), RandomX(-1,2), RandomX(150,90), RGB(012,040,94));
-} \ No newline at end of file
+ CreateParticle("PSpark", RandomX(-1, 2), RandomX(-2, 1), RandomX(-3, 2), RandomX(-2, 1), RandomX(150, 90), RGB(10, 35, 94));
+ CreateParticle("PSpark", RandomX(-2, 1), RandomX(-1, 2), RandomX(-2, 3), RandomX(-1, 2), RandomX(150, 90), RGB(12, 40, 94));
+}
+
+func ContactLeft()
+{
+ CastParticles("MaterialParticle", 20, 50, 0, 0, 20, 60, RGB(50, 120, 255), RGB(0, 120, 255));
+ if (Stuck(this) || ++contacts > 2)
+ {
+ return RemoveObject();
+ }
+ var contact = GetContact(this, 0, CNAT_Left | CNAT_Right | CNAT_Bottom | CNAT_Top);
+ if (contact & (CNAT_Bottom | CNAT_Top))
+ {
+ iAngle = 180 - iAngle;
+ }
+ else if (contact & (CNAT_Left | CNAT_Right))
+ {
+ iAngle = -iAngle;
+ }
+ Sound("Boing", 0, this);
+}
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/Script.c b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/Script.c
index eba7696..71ba257 100644
--- a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/Script.c
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/Script.c
@@ -1,80 +1,41 @@
-/* Ice Needles */
+#strict 2
-#strict
-
-
-func Activate(pCaster,pRealcaster)
+func Activate(object pCaster, object pRealcaster)
{
-Sound("Magic",0,pCaster);
- var pClonk;
- if(pRealcaster) pClonk=pRealcaster;
- else pClonk=pCaster;
+ if(!pRealcaster)
+ {
+ pRealcaster = pCaster;
+ }
- // Zielen wenn möglich
- if (pClonk->~DoSpellAim(this(), pCaster)) return(1);
-
- var angle=-90;
- if(GetDir(pClonk) == DIR_Right()) angle=90;
- ActivateAngle(pClonk,angle);
- RemoveObject();
- return(1);
+ if(pRealcaster->~DoSpellAim(this, pCaster))
+ {
+ return 1;
+ }
+
+ var angle = 90 * (GetDir(pRealcaster)* 2 - 1);
+ ActivateAngle(pRealcaster, angle);
+ Sound("Magic", 0, pCaster);
+ RemoveObject();
+ return 1;
}
-// Aktivierung nach Zielen (iAngle: -90=links; 0=oben; +90=rechts)
public func ActivateAngle(object pCaller, int iAngle)
{
- for(var cnt=0;cnt<3;cnt++)
+ for(var i = 0; i < 3; ++i)
{
- var f=CreateObject(ICNA,AbsX(GetX(pCaller))+Cos(iAngle-90,13),AbsY(GetY(pCaller))+Sin(iAngle-90,13),GetOwner(pCaller));
- f->Activate(pCaller,iAngle);
- }
-
- AddEffect("RecallMFCSAiming",pCaller,20,1,0,GetID(),iAngle);
-
- // Objekt löschen
- RemoveObject();
- return(1);
+ CreateObject(ICNA, AbsX(GetX(pCaller) + Sin(iAngle, 13)), AbsY(GetY(pCaller) - Cos(iAngle, 13)), GetOwner(pCaller))->Activate(pCaller, iAngle + (i - 1) * 5);
+ }
+
+ RemoveObject();
+ return 1;
}
public func HoldAimer(pCaller)
{
- return(true);
-}
-
-protected func FxRecallICNAAimingStart(pTarget,iEffectNumber,bTemp,par1){
-EffectVar(0,pTarget,iEffectNumber)=par1;
-EffectVar(1,pTarget,iEffectNumber)=0;
-EffectVar(2,pTarget,iEffectNumber)=0;
-return(1);}
-
-protected func FxRecallICNAAimingTimer(pTarget,iEffectNumber)
-{
- if(GetAction(pTarget) eq "Magic")return(0);
-
- if(!EffectVar(1,pTarget,iEffectNumber))
- {
- pTarget->~DoMagic(ICNA);
- EffectVar(1,pTarget,iEffectNumber)=1;
- }
-
- if(!EffectVar(2,pTarget,iEffectNumber) && GetAction(pTarget) eq "AimMagic")
- {
- var pAimer=FindObject(AIMR,0,0,0,0,0,0,pTarget,NoContainer());
- if(pAimer)
- {
- LocalN("iAngle",pAimer)=EffectVar(0,pTarget,iEffectNumber);
- LocalN("pArrow",pAimer)->~UpdateAngle(EffectVar(0,pTarget,iEffectNumber));
- pAimer->~UpdateAngle(EffectVar(0,pTarget,iEffectNumber));
- pTarget->~AimingAngle(EffectVar(0,pTarget,iEffectNumber));
- EffectVar(2,pTarget,iEffectNumber)=1;
- }
- }
- if(!WildcardMatch(GetAction(pTarget),"*Magic*") && !WildcardMatch(GetAction(pTarget),"*Aim*"))return(-1);
-
- if(EffectVar(2,pTarget,iEffectNumber) && EffectVar(1,pTarget,iEffectNumber))return(-1);
+ return true;
}
/* Zaubercombo */
-public func GetSpellClass(object pMage) { return(WATR); }
-public func GetSpellCombo(pMage) { return ("444"); } // (1: Backward; 2: Down; 3: Forward; 4: Throw; 5: Jump; 6: Dig)
+public func GetSpellClass(object pMage) { return WATR; }
+public func GetSpellCombo(pMage) { return "444"; }
diff --git a/TemplePushing.c4s/System.c4g/Find_Angle.c b/TemplePushing.c4s/System.c4g/Find_Angle.c
new file mode 100644
index 0000000..4d403d6
--- /dev/null
+++ b/TemplePushing.c4s/System.c4g/Find_Angle.c
@@ -0,0 +1,33 @@
+/*-- FindObjects search criteria for a certain angle-range --*/
+#strict 2
+
+global func SwapIfBigger(&smaller, &bigger)
+{
+ if (bigger < smaller)
+ {
+ var swap = smaller;
+ smaller = bigger;
+ bigger = swap;
+ }
+}
+
+global func Find_Angle(int angleStart, int angleEnd, bool biggerPart, int x, int y)
+{
+ while (angleStart < 0) angleStart += 360;
+ while (angleEnd < 0) angleEnd += 360;
+ angleStart %= 360;
+ angleEnd %= 360;
+ SwapIfBigger(angleStart, angleEnd);
+ if (angleEnd - angleStart > 180) biggerPart = !biggerPart;
+ return [C4FO_Func, "Find_AngleCheck", angleStart, angleEnd, biggerPart, GetX() + x, GetY() + y];
+}
+
+global func Find_AngleCheck(int angleStart, int angleEnd, bool biggerPart, int x, int y)
+{
+ var angle = Angle(x, y, GetX(), GetY());
+ var inside = Inside(angle, angleStart, angleEnd);
+ var ret;
+ if (biggerPart) ret = !inside;
+ else ret = inside;
+ return ret;
+}