diff options
| -rw-r--r-- | TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Script.c | 110 |
1 files changed, 44 insertions, 66 deletions
diff --git a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Script.c b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Script.c index 60dc5f2..a69248f 100644 --- a/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Script.c +++ b/TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Script.c @@ -1,84 +1,62 @@ /*-- Teleport --*/ -#strict +#strict 2 -func Range() +func Range() { return 225; } + +protected func Activate(object pCaster, object pRealCaster) { - var range=225; - return range; -} + // Effekt erzeugen + if (!pRealCaster) pRealCaster = pCaster; + var target = FindObject2(Find_Distance(Range()), Find_OCF(OCF_CrewMember), Find_Hostile(GetOwner(pRealCaster)), Sort_Distance()); + if (!target) return 0; + var preferredDir = (GetXDir(target) / Abs(GetXDir(target))) || -1 * (GetDir(target) || -1); -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) + var solid = false; + var deltax; + var deltay; + for (deltax = 8; (GetX(target) + deltax < LandscapeWidth() || GetX(target) - deltax > 0) && !solid; deltax += 10) + { + for (deltay = 10; GetY(target) + deltay < LandscapeHeight() && deltay < Range() && !solid; deltay += 10) + { + if (target->GBackSolid(preferredDir * deltax + 1, deltay) && target->GBackSolid(preferredDir * deltax - 1, deltay)) solid = preferredDir; + else if (target->GBackSolid(-preferredDir * deltax + 1, deltay) && target->GBackSolid(-preferredDir * deltax - 1, deltay)) solid = -preferredDir; + if (solid) break; + } + if (solid) break; + } + + if (!solid) return 0; + + var oldx = GetX(pRealCaster); + var oldy = GetY(pRealCaster); + + var dir = -1; + if (GetDir(target) == DIR_Left) dir = 1; + + SetSpeed(0, 0, pRealCaster); + SetPosition(GetX(target) + deltax * solid, GetY(target) + deltay, pRealCaster); + while (pRealCaster->Stuck()) SetPosition(GetX(pRealCaster), GetY(pRealCaster) - 1, pRealCaster); + pRealCaster->SetDir(GetX(target) > GetX(pRealCaster)); + pRealCaster->SetComDir(COMD_Up); + + for (var cnt = 0; cnt < 5; cnt++) { - if(pt[1] >= currentLowest) continue; - currentLowest = pt[1]; - found = pt[0]; + CreateParticle("PSpark", AbsX(oldx + RandomX(-5, 5)), AbsY(oldy + RandomX(-10, 10)), 0, 0, 150, GetColorDw(pRealCaster)); + CreateParticle("PSpark", AbsX(GetX(pRealCaster) + RandomX(-5, 5)), AbsY(GetY(pRealCaster) + RandomX(-10, 10)), 0, 0, 150, GetColorDw(pRealCaster)); } - 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()); + Sound("Scream"); + return RemoveObject(); } func FxScheduledRemoveStop(target, effect, reason, temp) { - if(temp) return; - if(!target) return; + if (temp) return; + if (!target) return; target->RemoveObject(); } |
