summaryrefslogtreecommitdiffstats
path: root/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d
diff options
context:
space:
mode:
authorMittendrein Markus <maxmitti@gmx.net>2016-02-14 13:52:41 +0100
committerMittendrein Markus <maxmitti@gmx.net>2016-02-14 13:52:41 +0100
commit0a963831a8e4c58b0562c30b0afbe3ffaa889181 (patch)
tree7d63beccc38d08f3af976c4f8570f08ba425b9c0 /TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d
parentbe07292a4c758c23202d6f777677da2b6a688e05 (diff)
downloadtempelschubsen-0a963831a8e4c58b0562c30b0afbe3ffaa889181.tar.gz
tempelschubsen-0a963831a8e4c58b0562c30b0afbe3ffaa889181.zip
Improve reliability of Deflection and calculate a more realistic deflection angle
Diffstat (limited to 'TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d')
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Script.c162
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/IceNeedles.c4d/IceNeedles.c4d/Script.c13
2 files changed, 87 insertions, 88 deletions
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 b3e4179..e1740ff 100644
--- a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Script.c
+++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/Deflection.c4d/Script.c
@@ -4,104 +4,116 @@
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;
+ 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();
+ // Effekt geben
+ AddEffect("DeflectionPSpell",pTarget,250,1,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;
+ // 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;
+ return 1;
}
func FxDeflectionPSpellStart(pClonk, iEffectNumber, iTemp)
{
- if(iTemp) return;
- // Zeit setzen
- EffectVar(0,pClonk,iEffectNumber)+=450;
+ if(iTemp) return;
+ // Zeit setzen
+ EffectVar(0,pClonk,iEffectNumber)+=720;
}
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;
+ // Zeit um
+ if(!EffectVar(0,pClonk,iEffectNumber)--) return -1;
+ // Nicht in Gebäuden
+ if(Contained(pClonk)) return;
+ 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_OCF(OCF_HitSpeed1),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)))))
+ {
+ // Wenn das Objekt auf den Clonk zufliegt
+ if( (GetXDir(pObj)<GetXDir(pClonk)) == (GetX(pObj)>GetX(pClonk)) || (GetYDir(pObj)<GetYDir(pClonk)) == (GetY(pObj)>GetY(pClonk)))
+ {
+ var ox = GetX(pObj), oy = GetY(pObj), oxdir = GetXDir(pObj), oydir = GetYDir(pObj);
+ ox = ox + oxdir/10;
+ oy = oy + oydir/10;
+
+ if(ObjectDistance(pClonk, pObj) > 21 && Distance(x, y, ox, oy) > 21) continue;
+
+ // Eigenen Stab ignorieren
+ if(GetEffect("StaffFlight", pObj))
+ if(EffectVar(0, pObj, GetEffect("StaffFlight", pObj))==pClonk)
+ continue;
+
+ var objDirAngle = Angle180(Angle(0, 0, GetXDir(pObj), GetYDir(pObj)));
+ var objShieldAngle = Angle180(Angle(GetX(pClonk), GetY(pClonk), GetX(pObj), GetY(pObj)));
+ var diffAngle = Angle180((objShieldAngle - objDirAngle) - 180);
+ var exitAngle = objShieldAngle + diffAngle;
+ var diffSpeed = Distance(GetXDir(pClonk), GetYDir(pClonk), GetXDir(pObj), GetYDir(pObj));
+
+ if (Abs(diffAngle) > 90) continue;
+
+ SetSpeed(Sin(exitAngle, diffSpeed),-Cos(exitAngle, diffSpeed), 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)-80,0);
+ AddEffect("IntDeflected", pObj, 1, 20);
+ Sound("Rip", 0, pObj);
+ }
+ }
+ // Partikel Kreiseffekt
+ if(iEffectTime % 4) return;
+ 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);
+ 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;
- }
+ // Andere Effekte aufnehmen
+ if(szNewEffectName == "DeflectionPSpell")
+ {
+ 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;
+ // Effekt übernehmen
+ EffectVar(0,pTarget,iNumber) += 360;
}
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 7ec6855..803e754 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
@@ -24,19 +24,6 @@ public func Activate(pCaster, Angle)
Check();
}
-
-func Angle180(int angle)
-{
- if (angle > 180) angle -= 360;
- return angle;
-}
-
-func Angle360(int angle)
-{
- if (angle < 0) angle += 360;
- return angle;
-}
-
protected func Check()
{
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());