global func Explode(int iLevel, object pObj, id idEffect, string szEffect) { if(!pObj) if(!(pObj=this)) return; var x = AbsX(pObj->GetX()), y = AbsY(pObj->GetY()); var boom = FindObject(BOOM); if(!boom) boom = CreateObject(BOOM,0,0,-1); var xdir = GetXDir(pObj) + GetWind(GetX(pObj),GetY(pObj))/20; var ydir = GetYDir(pObj); var opt_angle = Angle(xdir,ydir); var speed = BoundBy(Distance(xdir,ydir),0,60); ///Feuer-, Funken- und Dirt-Effekte... var i=0, count = 3+iLevel/8, angle = Random(360); while((count > 0) && (++i < count*10)) { angle += RandomX(40,80); angle = Interpolate4K(angle,opt_angle,0,60,speed); angle -= 180; //Rauch var smokex = +Sin(angle,RandomX(iLevel/4,iLevel/2)); var smokey = -Cos(angle,RandomX(iLevel/4,iLevel/2)); if(GBackSolid(x+smokex,y+smokey)) continue; var level = iLevel + Random(iLevel/5); var a = angle+RandomX(-15,+15); for(var i = 7; i > 0; i--) CreateParticle("BlastSpark1", smokex, smokey, +Sin(a,level+RandomX(-5,+5)), -Cos(a,level+RandomX(-5,+5)), 25+Random(50)); CreateParticle("BlastFlame", smokex, smokey, +Sin(angle,level/2), -Cos(angle,level/2), level*5); for(var i = Random(3)+1; i > 0; i--) { a = angle+RandomX(-30,+30); CreateParticle("BlastDirt", smokex, smokey, +Sin(a,level+RandomX(-20,+20)), -Cos(a,level+RandomX(-20,+20)), level*RandomX(7,12)); } //CreateSmokeTrail(level,angle,smokex,smokey,pObj); count--; } ///Brandspuren... // Wir haben keine Effekteinstellungen oä., daher immer an //if(EffectLevel() > EM4K_Low) CreateBurnMark(x,y,iLevel,20+iLevel/2); ///Lichteffekte bei Dunkelheit... if(IsDark()) { var iSize = iLevel*100; if(iLevel < 20) iSize /= 2; AddLightFlash(iSize/3, x, y, RGBa(255,220,64,15)); } ///Feuer-Effekt.. /*angle = Interpolate4K(0,opt_angle,0,120,speed); angle -= 180; CreateParticle("BlastBg",0,0,+Sin(angle,100),-Cos(angle,100),iLevel*20); //CreateParticle("BlastBg",0,0,0,-1,iLevel*20); */ ///Der eigentliche Blast-Partikel... CreateParticle("Blast",x,y,0,0,iLevel*11); ///Standart-Verhalten... return inherited(iLevel, pObj, idEffect, szEffect); }
global func Interpolate(y1,y2,x1,x2,x3) { return(Interpolate4K(y1,y2,x1,x2,x3)); }