@iscript
class ZoomRotGrain{
var window,name,triggername;
var isbase,islayer,isnew;
var cx,cy;
var sx,sy,sr,sw,sh;
var dx,dy,dr,dw,dh;
var sp,dp;
var accel;
var time;
var templayer;
var targetlayer;
var storage;
var a00,a01,a10,a11,ax,ay;
var starttick;
var moving;
var newlayer;
function ZoomRotGrain(window){
this.window=window;
}
function setOption(elm){
moving=false;
newlayer=false;
isbase=islayer=isnew=false;
storage=elm.storage if elm.storage!==void;
templayer=new Layer(window,window.primaryLayer);
templayer.loadImages(storage);
if(elm.cx!==void)
cx=+elm.cx;
else
cx=templayer.imageWidth/2;
if(elm.cy!==void)
cy=+elm.cy;
else
cy=templayer.imageHeight/2;
if(elm.sx!==void)
sx=+elm.sx;
else
sx=0;
if(elm.sy!==void)
sy=+elm.sy;
else
sy=0;
if(elm.sr!==void)
sr=+elm.sr;
else
sr=0;
if(elm.sw!==void)
sw=+elm.sw;
else
sw=1;
if(elm.sh!==void)
sh=+elm.sh;
else
sh=1;
if(elm.sp!==void)
sp=+elm.sp;
else
sp=255;
if(elm.dx!==void)
dx=+elm.dx;
else
dx=window.primaryLayer.width;
if(elm.dy!==void)
dy=+elm.dy;
else
dy=window.primaryLayer.height;
if(elm.dr!==void)
dr=+elm.dr;
else
dr=0;
if(elm.dw!==void)
dw=+elm.dw;
else
dw=1;
if(elm.dh!==void)
dh=+elm.dh;
else
dh=1;
if(elm.dp!==void)
dp=+elm.dp;
else
dp=255;
if(elm.accel!==void)
accel=+elm.accel;
else
accel=1;
if(elm.time!==void)
time=+elm.time;
else
time=1000;
if(elm.stretch){
if(elm.sx==void)
sx=window.primaryLayer.width/2;
if(elm.sy==void)
sy=window.primaryLayer.height-templayer.imageHeight/2;
dx=sx;
dy=sy;
if(elm.dw==void)
dw=25;
if(elm.dh==void)
dh=0.00001;
if(elm.dp==void)
dp=1;
if(elm.time==void)
time=300;
}
if(elm.rotate){
if(elm.sx==void)
sx=window.primaryLayer.width/2;
if(elm.sy==void)
sy=window.primaryLayer.height-templayer.imageHeight/2;
dx=sx;
dy=sy;
if(elm.dr==void)
dr=15;
if(elm.dw==void)
dw=0.0001;
dh=dw;
if(elm.dp==void)
dp=1;
if(elm.accel==void)
accel=3;
if(elm.time==void)
time=700;
}
if(elm.move){
if(elm.sx==void)
sx=window.primaryLayer.width/2;
if(elm.sy==void)
sy=window.primaryLayer.height-templayer.imageHeight/2;
if(elm.dp==void)
dp=1;
switch(elm.direction){
case "east":
dx=window.primaryLayer.width+cx;
dy=sy;
break;
case "west":
dx=-cx;
dy=sy;
break;
case "south":
dx=sx;
dy=window.primaryLayer.height+cy;
break;
case "north":
dx=sx;
dy=-cy;
break;
default:
dx=window.primaryLayer.width+cx;
dy=sy;
break;
}
if(elm.accel==void)
accel=3;
if(elm.time==void)
time=300;
}
if(elm.layer=="base"){
targetlayer=window.fore.base;
name=triggername="base";
isbase=true;
}
else if(elm.layer!==void){
targetlayer=window.fore.layers[+elm.layer];
name="layer"+elm.layer;
triggername=""+elm.layer;
islayer=true;
}
else{
name=triggername=elm.name;
targetlayer=new Layer(window,window.primaryLayer);
targetlayer.absolute=2000000-2;
newlayer=true;
isnew=true;
}
if(elm.index!==void || newlayer)
targetlayer.absolute=elm.index;
else
targetlayer.absolute=2000000-1;
targetlayer.setPos(0,0,window.primaryLayer.width,window.primaryLayer.height);
targetlayer.face = dfAlpha;
targetlayer.type = ltAlpha;
}
function startZoomRot(elm){
setOption(elm);
targetlayer.visible=true;
moving=true;
starttick=System.getTickCount();
System.addContinuousHandler(loopevent);
}
function setPosition(scale){
var x=sx+(dx-sx)*scale;
var y=sy+(dy-sy)*scale;
var r=sr+Math.PI*2*(dr-sr)*scale;
var w=sw+(dw-sw)*scale;
var h=sh+(dh-sw)*scale;
a00=w*Math.cos(r);
a01=w*Math.sin(r);
a10=-h*Math.sin(r);
a11=h*Math.cos(r);
ax=a00*-cx+a01*-cy+x;
ay=a10*-cx+a11*-cy+y;
targetlayer.fillRect(0,0,targetlayer.imageWidth,targetlayer.imageHeight,0);
targetlayer.affineCopy(templayer,0,0,templayer.imageWidth,templayer.imageHeight,true,a00,a10,a01,a11,ax,ay,stNearest);
}
function setOpacity(scale){
var p=sp+(dp-sp)*scale;
targetlayer.opacity=p;
}
function loopevent(tick){
var scale=(tick-starttick)/time;
if(scale>=1){
stopLoop();
}
else{
if(accel<0){
scale=1.0-scale;
scale=Math.pow(scale,-accel);
scale=1.0-scale;
}
if(accel>0)
scale=Math.pow(scale,accel);
setPosition(scale);
setOpacity(scale);
}
}
function stopLoop(){
if(moving){
setPosition(1.0);
invalidate templayer if templayer!==void;
window.trigger("zoomrot");
window.trigger(triggername);
System.removeContinuousHandler(loopevent);
templayer=void;
moving=false;
}
}
function clearPic(){
if(moving){
System.removeContinuousHandler(loopevent);
}
targetlayer.fillRect(0,0,targetlayer.imageWidth,targetlayer.imageHeight,0);
if(newlayer)
invalidate targetlayer if targetlayer!==void;
invalidate templayer if templayer!==void;
templayer=void;
targetlayer=void;
moving=false;
delete f[name];
}
function finalize(){
invalidate templayer if templayer!==void;
invalidate targetlayer if targetlayer!==void;
templayer=void;
targetlayer=void;
}
function onStore(f,elm){
f.zoomrotpic=%[];
f.zoomrotpic.cx=cx;
f.zoomrotpic.cy=cy;
f.zoomrotpic.sx=sx;
f.zoomrotpic.sy=sy;
f.zoomrotpic.sr=sr;
f.zoomrotpic.sw=sw;
f.zoomrotpic.sh=sh;
f.zoomrotpic.sp=sp;
f.zoomrotpic.dx=dx;
f.zoomrotpic.dy=dy;
f.zoomrotpic.dr=dr;
f.zoomrotpic.dw=dw;
f.zoomrotpic.dh=dh;
f.zoomrotpic.dp=dp;
f.zoomrotpic.accel=accel;
f.zoomrotpic.time=time;
f.zoomrotpic.storage=storage;
if(isbase)
f.zoomrotpic.layer="base";
if(islayer)
f.zoomrotpic.layer=triggername;
if(isnew)
f.zoomrotpic.name=name;
clearPic();
}
function onRestore(f,clear,elm){
startZoomRot(f.zoomrotpic);
delete f.zoomrotpic;
}
}
@endscript
@macro name=zr
@if exp="mp.layer=='base'"
@eval exp="f['base']=new ZoomRotGrain(kag)"
@eval exp="f['base'].startZoomRot(mp)"
@elsif exp="mp.layer!==void"
@eval exp="f['layer'+mp.layer]=new ZoomRotGrain(kag)"
@eval exp="f['layer'+mp.layer].startZoomRot(mp)"
@elsif exp="mp.name!==void"
@eval exp="f[mp.name]=new ZoomRotGrain(kag)"
@eval exp="f[mp.name].startZoomRot(mp)"
@endif
@endmacro
@macro name=wzr
@if exp="mp.layer=='base'"
@waittrig name=base
@elsif exp="mp.layer!==void"
@waittrig name=%layer
@elsif exp="mp.name!==void"
@waittrig name=%name
@endif
@endmacro
@macro name=wallzr
@waittrig name=zoomrot
@endmacro
@macro name=clzrpic
@if exp="mp.layer=='base'"
@eval exp="f['base'].clearPic()"
@elsif exp="mp.layer!==void"
@eval exp="f['layer'+mp.layer].clearPic()"
@elsif exp="mp.name!==void"
@eval exp="f[mp.name].clearPic()"
@endif
@endmacro
@macro name=savezr
@if exp="mp.layer=='base'"
@eval exp="f['base'].onStore(f,'save')"
@elsif exp="mp.layer!==void"
@eval exp="f['layer'+mp.layer].onStore(f,'save')"
@elsif exp="mp.name!==void"
@eval exp="f[mp.name].onStore(f,'save')"
@endif
@endmacro
@macro name=loadzr
@if exp="mp.layer=='base'"
@eval exp="f['base']=new ZoomRotGrain(kag)"
@eval exp="f['base'].onRestore(f,false,'load')"
@elsif exp="mp.layer!==void"
@eval exp="f['layer'+mp.layer]=new ZoomRotGrain(kag)"
@eval exp="f['layer'+mp.layer].onRestore(f,false,'load')"
@elsif exp="mp.name!==void"
@eval exp="f[mp.name]=new ZoomRotGrain(kag)"
@eval exp="f[mp.name].onRestore(f,false,'load')"
@endif
@endmacro
@macro name=stretchvanish
@zr storage=%storage layer=%layer name=%name sx=%x sy=%y dw=%w dh=%h dp=%p time=%time stretch=true index=%index
@endmacro
@macro name=rotatevanish
@zr storage=%storage layer=%layer name=%name sx=%x sy=%y dw=%s dr=%r dp=%p accel=%accel time=%time rotate=true index=%index
@endmacro
@macro name=movevanish
@zr storage=%storage layer=%layer name=%name sx=%x sy=%y dp=%p accel=%accel time=%time direction=%direction move=true index=%index
@endmacro
@return