summaryrefslogtreecommitdiffstats
path: root/TemplePushing.c4s/Misc.c4d
diff options
context:
space:
mode:
authorMittendrein Markus <maxmitti@gmx.net>2016-02-15 15:01:27 +0100
committerMittendrein Markus <maxmitti@gmx.net>2016-02-15 15:01:27 +0100
commit8df314aefcb3c539cd8176c9fe843942a2a9e259 (patch)
treed68d6699d97576c0364d2eeff1a2abc29b0a9ad6 /TemplePushing.c4s/Misc.c4d
parent6573021f13f21f11a981439bdf2dc8070f25b68c (diff)
downloadtempelschubsen-8df314aefcb3c539cd8176c9fe843942a2a9e259.tar.gz
tempelschubsen-8df314aefcb3c539cd8176c9fe843942a2a9e259.zip
Assault Teleport always teleports on the nearest platform of the target clonk
Diffstat (limited to 'TemplePushing.c4s/Misc.c4d')
-rw-r--r--TemplePushing.c4s/Misc.c4d/AdditionalSpells.c4d/AssaultTeleport.c4d/Script.c110
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();
}