From 376c20e8d9d0379ceffa28f459a3475e939cc6eb Mon Sep 17 00:00:00 2001 From: Markus Mittendrein Date: Sat, 6 Apr 2019 19:44:42 +0200 Subject: Add hyper mode to deflection, enabled by stacking them, that can deflect ice needles and fire balls --- .../AdditionalSpells.c4d/Deflection.c4d/Script.c | 47 +++++++++++++++++----- .../IceNeedles.c4d/IceNeedles.c4d/Script.c | 9 +++++ TemplePushing.c4s/System.c4g/FireBall.c | 13 ++++++ 3 files changed, 58 insertions(+), 11 deletions(-) (limited to 'TemplePushing.c4s') diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Script.c b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Script.c index 31f1b0e..44319f8 100644 --- a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Script.c +++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Script.c @@ -57,6 +57,7 @@ func FxDeflectionPSpellStart(pClonk, iEffectNumber, iTemp) func FxDeflectionPSpellTimer(pClonk, iEffectNumber, iEffectTime) { + var hyper = EffectVar(1, pClonk, iEffectNumber); // Zeit um if(!EffectVar(0,pClonk,iEffectNumber)--) return -1; // Nicht in Gebäuden @@ -64,11 +65,15 @@ func FxDeflectionPSpellTimer(pClonk, iEffectNumber, iEffectTime) var x = GetX(pClonk), y = GetY(pClonk), xdir = GetXDir(pClonk), ydir = GetYDir(pClonk); x = x + xdir/10; y = y + ydir/10; - //Funken an der benötigten Stelle - for(var pObj in FindObjects(Find_Not(Find_And(Find_Func("GetContact", 0, -1, CNAT_Bottom)), Find_Not(Find_Func("GetSpeed"))), Find_Layer(GetObjectLayer()), Find_NoContainer(), Find_Category(C4D_Object), Find_Distance(200, GetX(pClonk), GetY(pClonk)), Find_Not(Find_Distance(11, GetX(pClonk), GetY(pClonk))))) + var categoryCondition = Find_Category(C4D_Object); + if(hyper) + { + categoryCondition = Find_Or(categoryCondition, Find_Func("HyperDeflectable", pClonk)); + } + for(var pObj in FindObjects(Find_Not(Find_And(Find_Func("GetContact", 0, -1, CNAT_Bottom))), Find_Layer(GetObjectLayer()), Find_NoContainer(), categoryCondition, Find_Distance(200, GetX(pClonk), GetY(pClonk)), Find_Not(Find_Distance(11, GetX(pClonk), GetY(pClonk))))) { // Wenn das Objekt auf den Clonk zufliegt - if( (GetXDir(pObj)GetX(pClonk)) || (GetYDir(pObj)GetY(pClonk))) + if((GetXDir(pObj)GetX(pClonk)) || (GetYDir(pObj)GetY(pClonk))) { var ox = GetX(pObj), oy = GetY(pObj), oxdir = GetXDir(pObj), oydir = GetYDir(pObj); ox = ox + oxdir/10; @@ -92,10 +97,16 @@ func FxDeflectionPSpellTimer(pClonk, iEffectNumber, iEffectTime) SetSpeed(Sin(exitAngle, exitSpeed),-Cos(exitAngle, exitSpeed), pObj); - CreateParticle("NoGravSpark", AbsX(GetX(pObj)), AbsY(GetY(pObj)), 0, 0, 80, RGB(80,50,50)); + if(hyper) + { + pObj->~HyperDeflection(exitAngle, exitSpeed, pClonk); + } + + //Funken an der benötigten Stelle + CreateParticle("NoGravSpark", AbsX(GetX(pObj)), AbsY(GetY(pObj)), 0, 0, 80, [RGB(80,50,50), GetColorDw(pClonk)][hyper]); if(!GetEffect("IntDeflected", pObj)) EffectVar(0,pClonk,iEffectNumber) = Max(EffectVar(0,pClonk,iEffectNumber)-80,0); - AddEffect("IntDeflected", pObj, 1, 20); + AddEffect("IntDeflected", pObj, 1, 1); Sound("Rip", 0, pObj); } } @@ -104,15 +115,28 @@ func FxDeflectionPSpellTimer(pClonk, iEffectNumber, iEffectTime) var iAngle = (iEffectTime*10) % 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); + if(hyper) + { + var color = GetColorDw(pClonk); + var h, s, l, a; + SplitRGBaValue(RGB2HSL(color), h, s, l, a); + CreateParticle("NoGravSpark", px+GetX(pClonk), py+GetY(pClonk), 0, 0, 50, HSL(h, s, Max(0, l - 30)), pClonk); + CreateParticle("NoGravSpark",-py+GetX(pClonk), px+GetY(pClonk), 0, 0, 50, color, pClonk); + CreateParticle("NoGravSpark",-px+GetX(pClonk),-py+GetY(pClonk), 0, 0, 50, HSL(h, s, Max(0, l - 30)), pClonk); + CreateParticle("NoGravSpark", py+GetX(pClonk),-px+GetY(pClonk), 0, 0, 50, color, pClonk); + } + else + { + 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) -{ +private func FxDeflectionPSpellEffect(string szNewEffectName, object pTarget, int iNumber) +{ // Andere Effekte aufnehmen if(szNewEffectName == "DeflectionPSpell") { @@ -123,6 +147,7 @@ private func FxDeflectionPSpellEffect(string szNewEffectName, object pTarget, in 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) += 360; + EffectVar(1,pTarget,iNumber) += true; // hyper deflection } protected func FxDeflectionPSpellInfo() { return "{{MDFL}} $SpellInfo$"; } 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 12a9863..6adf673 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 @@ -107,3 +107,12 @@ func ContactLeft() } Sound("Crystal*", 0, this); } + +func HyperDeflectable(object by) { return Hostile(GetOwner(), GetOwner(by)); } + +func HyperDeflection(int newAngle, int newSpeed, object by) +{ + Caster = by; + SetOwner(GetOwner(by)); + iAngle = newAngle; +} \ No newline at end of file diff --git a/TemplePushing.c4s/System.c4g/FireBall.c b/TemplePushing.c4s/System.c4g/FireBall.c index 8578ebc..669ffc9 100644 --- a/TemplePushing.c4s/System.c4g/FireBall.c +++ b/TemplePushing.c4s/System.c4g/FireBall.c @@ -90,3 +90,16 @@ func FxFireballFlightTimer(pTarget, iEffectNumber, iEffectTime) // OK; weiter existieren return(1); } + +func HyperDeflectable() { return true; } + +func HyperDeflection(int newAngle, int newSpeed, object by) +{ + var effect = GetEffect("FireballFlight", this); + if(!effect) + { + return; + } + EffectVar(2, this, effect) = newAngle; + SetOwner(GetOwner(by)); +} \ No newline at end of file -- cgit v1.2.3-54-g00ecf