diff options
Diffstat (limited to 'TemplePushing.c4s/Misc.c4d')
4 files changed, 123 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"; } |
